diff --git a/API.txt b/API.txt index 5bf38c85..e62c9c2e 100644 --- a/API.txt +++ b/API.txt @@ -194,7 +194,14 @@ DETAILS_TOTALS_ONLYGROUP = true total = combat:GetTotal ( attribute, subAttribute [, onlyGroup] ) returns the total of the requested attribute. +mythictInfo = combat:GetMythicDungeonInfo() +returns a table with information about the mythic dungeon encounter. +isMythicDungeonSegment = combat:IsMythicDungeon() +returns if the segment is from a mythic dungeon. + +isMythicDungeonOverallSegment = combat:IsMythicDungeonOverall() +returns if the segment is an overall mythic dungeon segment. -------------------------------------------------------------------- @@ -220,6 +227,9 @@ break a death table returning the data from it: playername, playerclass, deathtime, deathcombattime, deathtimestring, playermaxhealth, deathevents, lastcooldown = Details:UnpackDeathTable (deathTable) +isMythicOverallSegment, segmentID, mythicLevel, EJID, mapID, zoneName, encounterID, encounterName, startedAt, endedAt, runID = Details:UnpackMythicDungeonInfo (combat:GetMythicDungeonInfo()) +extract information from the mythic dungeon table for the combat. + Container Object: ======================================= diff --git a/Details.toc b/Details.toc index f49c9a81..2acf8d92 100644 --- a/Details.toc +++ b/Details.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details ## Notes: Computes detailed infos about combats. ## SavedVariables: _detalhes_global diff --git a/Libs/AceComm-3.0/AceComm-3.0.lua b/Libs/AceComm-3.0/AceComm-3.0.lua index 17411ba4..54dadfa3 100644 --- a/Libs/AceComm-3.0/AceComm-3.0.lua +++ b/Libs/AceComm-3.0/AceComm-3.0.lua @@ -9,7 +9,7 @@ -- make into AceComm. -- @class file -- @name AceComm-3.0 --- @release $Id: AceComm-3.0.lua 1107 2014-02-19 16:40:32Z nevcairiel $ +-- @release $Id: AceComm-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $ --[[ AceComm-3.0 @@ -17,15 +17,14 @@ TODO: Time out old data rotting around from dead senders? Not a HUGE deal since ]] -local MAJOR, MINOR = "AceComm-3.0", 9 +local CallbackHandler = LibStub("CallbackHandler-1.0") +local CTL = assert(ChatThrottleLib, "AceComm-3.0 requires ChatThrottleLib") +local MAJOR, MINOR = "AceComm-3.0", 10 local AceComm,oldminor = LibStub:NewLibrary(MAJOR, MINOR) if not AceComm then return end -local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0") -local CTL = assert(ChatThrottleLib, "AceComm-3.0 requires ChatThrottleLib") - -- Lua APIs local type, next, pairs, tostring = type, next, pairs, tostring local strsub, strfind = string.sub, string.find diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua index c7da8abf..7ba82815 100644 --- a/Libs/DF/fw.lua +++ b/Libs/DF/fw.lua @@ -1,5 +1,5 @@ -local dversion = 54 +local dversion = 55 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 c41dbea7..dfd2709a 100644 --- a/Libs/DF/panel.lua +++ b/Libs/DF/panel.lua @@ -1223,13 +1223,27 @@ function DF:IconPick (callback, close_when_select, param1, param2) DF.IconPickFrame:SetHeight (227) DF.IconPickFrame:EnableMouse (true) DF.IconPickFrame:SetMovable (true) - DF.IconPickFrame:SetBackdrop ({bgFile = DF.folder .. "background", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", - tile = true, tileSize = 32, edgeSize = 32, insets = {left = 5, right = 5, top = 5, bottom = 5}}) - DF.IconPickFrame:SetBackdropBorderColor (170/255, 170/255, 170/255) + DF.IconPickFrame:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) + + DF.IconPickFrame:SetBackdropBorderColor (0, 0, 0) DF.IconPickFrame:SetBackdropColor (24/255, 24/255, 24/255, .8) DF.IconPickFrame:SetFrameLevel (1) + DF.IconPickFrame:SetScript ("OnMouseDown", function (self) + if (not self.isMoving) then + DF.IconPickFrame:StartMoving() + self.isMoving = true + end + end) + + DF.IconPickFrame:SetScript ("OnMouseUp", function (self) + if (self.isMoving) then + DF.IconPickFrame:StopMovingOrSizing() + self.isMoving = nil + end + end) + DF.IconPickFrame.emptyFunction = function() end DF.IconPickFrame.callback = DF.IconPickFrame.emptyFunction @@ -1267,37 +1281,37 @@ function DF:IconPick (callback, close_when_select, param1, param2) close_button:SetFrameLevel (close_button:GetFrameLevel()+2) local MACRO_ICON_FILENAMES = {} - DF.IconPickFrame:SetScript ("OnShow", function() + local SPELLNAMES_CACHE = {} - MACRO_ICON_FILENAMES = {}; - MACRO_ICON_FILENAMES[1] = "INV_MISC_QUESTIONMARK"; + DF.IconPickFrame:SetScript ("OnShow", function() + + MACRO_ICON_FILENAMES [1] = "INV_MISC_QUESTIONMARK"; local index = 2; for i = 1, GetNumSpellTabs() do - local tab, tabTex, offset, numSpells, _ = GetSpellTabInfo(i); - offset = offset + 1; - local tabEnd = offset + numSpells; + local tab, tabTex, offset, numSpells, _ = GetSpellTabInfo (i) + offset = offset + 1 + local tabEnd = offset + numSpells + for j = offset, tabEnd - 1 do --to get spell info by slot, you have to pass in a pet argument - local spellType, ID = GetSpellBookItemInfo(j, "player"); + local spellType, ID = GetSpellBookItemInfo (j, "player") if (spellType ~= "FUTURESPELL") then - local spellTexture = strupper(GetSpellBookItemTexture(j, "player")); - if ( not string.match( spellTexture, "INTERFACE\\BUTTONS\\") ) then - MACRO_ICON_FILENAMES[index] = gsub( spellTexture, "INTERFACE\\ICONS\\", ""); - index = index + 1; - end - end - if (spellType == "FLYOUT") then - local _, _, numSlots, isKnown = GetFlyoutInfo(ID); + MACRO_ICON_FILENAMES [index] = GetSpellBookItemTexture (j, "player") or 0 + index = index + 1; + + elseif (spellType == "FLYOUT") then + local _, _, numSlots, isKnown = GetFlyoutInfo (ID) if (isKnown and numSlots > 0) then for k = 1, numSlots do - local spellID, overrideSpellID, isKnown = GetFlyoutSlotInfo(ID, k) + local spellID, overrideSpellID, isKnown = GetFlyoutSlotInfo (ID, k) if (isKnown) then - MACRO_ICON_FILENAMES[index] = gsub( strupper(GetSpellTexture(spellID)), "INTERFACE\\ICONS\\", ""); + MACRO_ICON_FILENAMES [index] = GetSpellTexture (spellID) or 0 index = index + 1; end end end + end end end @@ -1305,12 +1319,12 @@ function DF:IconPick (callback, close_when_select, param1, param2) GetLooseMacroItemIcons (MACRO_ICON_FILENAMES) GetLooseMacroIcons (MACRO_ICON_FILENAMES) GetMacroIcons (MACRO_ICON_FILENAMES) - GetMacroItemIcons (MACRO_ICON_FILENAMES ) - + GetMacroItemIcons (MACRO_ICON_FILENAMES) + end) DF.IconPickFrame:SetScript ("OnHide", function() - MACRO_ICON_FILENAMES = nil; + wipe (MACRO_ICON_FILENAMES) collectgarbage() end) @@ -1454,77 +1468,61 @@ function DF:IconPick (callback, close_when_select, param1, param2) if (DF.IconPickFrame.searching) then filter = string_lower (DF.IconPickFrame.searching) end + + local pool + local shown = 0 if (filter and filter ~= "") then - - local ignored = 0 - local tryed = 0 - local found = 0 - local type = type - local buttons = DF.IconPickFrame.buttons - index = 1 - - for i = 1, 60 do - - macroPopupIcon = buttons[i].icon - macroPopupButton = buttons[i] - - for o = index, numMacroIcons do - - tryed = tryed + 1 - - texture = MACRO_ICON_FILENAMES [o] - if (type (texture) == "number") then - macroPopupIcon:SetToFileData (texture) - texture = macroPopupIcon:GetTexture() - macroPopupIcon:SetTexture (nil) - else - texture = "INTERFACE\\ICONS\\" .. texture - end - - if (texture and texture:find (filter)) then - macroPopupIcon:SetTexture (texture) - macroPopupButton:Show() - found = found + 1 - DF.IconPickFrame.last_filter_index = o - index = o+1 - break - else - ignored = ignored + 1 - end - + if (#SPELLNAMES_CACHE == 0) then + --build name cache + local GetSpellInfo = GetSpellInfo + for i = 1, #MACRO_ICON_FILENAMES do + local spellName = GetSpellInfo (MACRO_ICON_FILENAMES [i]) + SPELLNAMES_CACHE [i] = spellName or "NULL" end end - - for o = found+1, 60 do - macroPopupButton = _G ["DetailsFrameworkIconPickFrameButton"..o] - macroPopupButton:Hide() + + --do the filter + pool = {} + for i = 1, #SPELLNAMES_CACHE do + if (SPELLNAMES_CACHE [i]:find (filter)) then + pool [#pool+1] = MACRO_ICON_FILENAMES [i] + shown = shown + 1 + end end else - for i = 1, 60 do - macroPopupIcon = _G ["DetailsFrameworkIconPickFrameButton"..i.."Icon"] - macroPopupButton = _G ["DetailsFrameworkIconPickFrameButton"..i] - index = (macroPopupOffset * 10) + i - texture = MACRO_ICON_FILENAMES [index] - if ( index <= numMacroIcons and texture ) then - - if (type (texture) == "number") then - macroPopupIcon:SetToFileData (texture) - else - macroPopupIcon:SetTexture ("INTERFACE\\ICONS\\" .. texture) - end - - macroPopupIcon:SetTexCoord (4/64, 60/64, 4/64, 60/64) - macroPopupButton.IconID = index - macroPopupButton:Show() - else - macroPopupButton:Hide() - end - end + shown = nil end + if (not pool) then + pool = MACRO_ICON_FILENAMES + end + + for i = 1, 60 do + macroPopupIcon = _G ["DetailsFrameworkIconPickFrameButton"..i.."Icon"] + macroPopupButton = _G ["DetailsFrameworkIconPickFrameButton"..i] + index = (macroPopupOffset * 10) + i + texture = pool [index] + if ( index <= numMacroIcons and texture ) then + + if (type (texture) == "number") then + macroPopupIcon:SetTexture (texture) + else + macroPopupIcon:SetTexture ("INTERFACE\\ICONS\\" .. texture) + end + + macroPopupIcon:SetTexCoord (4/64, 60/64, 4/64, 60/64) + macroPopupButton.IconID = index + macroPopupButton:Show() + else + macroPopupButton:Hide() + end + end + + pool = nil + -- Scrollbar stuff - FauxScrollFrame_Update (scroll, ceil (numMacroIcons / 10) , 5, 20 ) + FauxScrollFrame_Update (scroll, ceil ((shown or numMacroIcons) / 10) , 5, 20 ) end DF.IconPickFrame.updateFunc = ChecksFrame_Update @@ -3124,6 +3122,16 @@ local gframe_create_line = function (self) spellicon:SetSize (16, 16) f.spellicon = spellicon + local text = f:CreateFontString (nil, "overlay", "GameFontNormal") + local textBackground = f:CreateTexture (nil, "artwork") + textBackground:SetSize (30, 16) + textBackground:SetColorTexture (0, 0, 0, 0.5) + textBackground:SetPoint ("bottom", f.ball, "top", 0, -6) + text:SetPoint ("center", textBackground, "center") + DF:SetFontSize (text, 10) + f.text = text + f.textBackground = textBackground + local timeline = f:CreateFontString (nil, "overlay", "GameFontNormal") timeline:SetPoint ("bottomright", f, "bottomright", -2, 0) DF:SetFontSize (timeline, 8) @@ -3195,6 +3203,15 @@ local gframe_update = function (self, lines) line.timeline:SetText (data.text) line.timeline:Show() + if (data.utext) then + line.text:Show() + line.textBackground:Show() + line.text:SetText (data.utext) + else + line.text:Hide() + line.textBackground:Hide() + end + line.data = data o = o + 1 diff --git a/boot.lua b/boot.lua index 32d6613d..bf272f17 100644 --- a/boot.lua +++ b/boot.lua @@ -3,9 +3,9 @@ _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0") - _detalhes.build_counter = 4349 - _detalhes.userversion = "v7.2.5." .. _detalhes.build_counter - _detalhes.realversion = 124 --core version + _detalhes.build_counter = 4690 + _detalhes.userversion = "v7.3.0." .. _detalhes.build_counter + _detalhes.realversion = 126 --core version _detalhes.version = _detalhes.userversion .. " (core " .. _detalhes.realversion .. ")" Details = _detalhes @@ -21,17 +21,12 @@ do local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) --[[ -|cFFFFFF00v7.2.5.4349.123 (|cFFFFCC00July 24th, 2017|r|cFFFFFF00)|r:\n\n -|cFFFFFF00-|r Details! can now track debuff applications 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.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.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.4245.122 (|cFFFFCC00July 12th, 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 - - - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v7.2.5.4349.124 (|cFFFFCC00July 24th, 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.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 " @@ -182,6 +177,11 @@ do function _detalhes:GetAttributeIcon (attribute) return _detalhes.attribute_icons, 0.125 * (attribute - 1), 0.125 * attribute, 0, 1 end + + --> colors + _detalhes.default_backdropcolor = {.094117, .094117, .094117, .8} + _detalhes.default_backdropbordercolor = {0, 0, 0, 1} + --> Plugins _detalhes.PluginsGlobalNames = {} @@ -356,7 +356,8 @@ do --> Info Window _detalhes.janela_info = _CreateFrame ("Frame", "DetailsPlayerDetailsWindow", _UIParent) - + _detalhes.PlayerDetailsWindow = _detalhes.janela_info + --> Event Frame _detalhes.listener = _CreateFrame ("Frame", nil, _UIParent) _detalhes.listener:RegisterEvent ("ADDON_LOADED") diff --git a/classes/classe_combate.lua b/classes/classe_combate.lua index abfe2fa4..b5e10a4c 100644 --- a/classes/classe_combate.lua +++ b/classes/classe_combate.lua @@ -53,6 +53,16 @@ return self.data_inicio, self.data_fim end + --set the combat date + function combate:SetDate (started, ended) + if (started and type (started) == "string") then + self.data_inicio = started + end + if (ended and type (ended) == "string") then + self.data_fim = ended + end + end + --return data for charts function combate:GetTimeData (name) return self.TimeData [name] @@ -90,6 +100,24 @@ return self.is_pvp end + function combate:GetMythicDungeonInfo() + return self.is_mythic_dungeon + end + + function combate:GetMythicDungeonTrashInfo() + return self.is_mythic_dungeon_trash + end + + function combate:IsMythicDungeon() + local is_segment = self.is_mythic_dungeon_segment + local run_id = self.is_mythic_dungeon_run_id + return is_segment, run_id + end + + function combate:IsMythicDungeonOverall() + return self.is_mythic_dungeon and self.is_mythic_dungeon.OverallSegment + end + function combate:GetArenaInfo() return self.is_arena end @@ -500,19 +528,23 @@ combate.__add = function (combate1, combate2) local all_containers = {combate2 [class_type_dano]._ActorTable, combate2 [class_type_cura]._ActorTable, combate2 [class_type_e_energy]._ActorTable, combate2 [class_type_misc]._ActorTable} + local custom_combat + if (combate1 ~= _detalhes.tabela_overall) then + custom_combat = combate1 + end for class_type, actor_container in ipairs (all_containers) do for _, actor in ipairs (actor_container) do local shadow if (class_type == class_type_dano) then - shadow = _detalhes.atributo_damage:r_connect_shadow (actor, true) + shadow = _detalhes.atributo_damage:r_connect_shadow (actor, true, custom_combat) elseif (class_type == class_type_cura) then - shadow = _detalhes.atributo_heal:r_connect_shadow (actor, true) + shadow = _detalhes.atributo_heal:r_connect_shadow (actor, true, custom_combat) elseif (class_type == class_type_e_energy) then - shadow = _detalhes.atributo_energy:r_connect_shadow (actor, true) + shadow = _detalhes.atributo_energy:r_connect_shadow (actor, true, custom_combat) elseif (class_type == class_type_misc) then - shadow = _detalhes.atributo_misc:r_connect_shadow (actor, true) + shadow = _detalhes.atributo_misc:r_connect_shadow (actor, true, custom_combat) end shadow.boss_fight_component = actor.boss_fight_component diff --git a/classes/classe_damage.lua b/classes/classe_damage.lua index 84a6c9a7..879c0ada 100644 --- a/classes/classe_damage.lua +++ b/classes/classe_damage.lua @@ -1553,11 +1553,19 @@ function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, exportar, refresh_needed) - + local showing = tabela_do_combate [class_type] --> o que esta sendo mostrado -> [1] - dano [2] - cura --> pega o container com ._NameIndexTable ._ActorTable --> não há barras para mostrar -- not have something to show if (#showing._ActorTable < 1) then + if (_detalhes.debug) then + _detalhes.showing_ActorTable_Timer = _detalhes.showing_ActorTable_Timer or 0 + if (time() > _detalhes.showing_ActorTable_Timer) then + _detalhes:Msg ("(debug) nothing to show -> #showing._ActorTable < 1") + _detalhes.showing_ActorTable_Timer = time()+5 + end + end + --> colocado isso recentemente para fazer as barras de dano sumirem na troca de atributo return _detalhes:EsconderBarrasNaoUsadas (instancia, showing), "", 0, 0 end @@ -2002,6 +2010,14 @@ function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, ex end if (#conteudo < 1) then + if (_detalhes.debug) then + _detalhes.showing_ActorTable_Timer2 = _detalhes.showing_ActorTable_Timer2 or 0 + if (time() > _detalhes.showing_ActorTable_Timer2) then + _detalhes:Msg ("(debug) nothing to show -> #conteudo < 1 (using cache)") + _detalhes.showing_ActorTable_Timer2 = time()+5 + end + end + return _detalhes:EsconderBarrasNaoUsadas (instancia, showing), "", 0, 0 end @@ -2065,6 +2081,15 @@ function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, ex end end instancia:EsconderScrollBar() --> precisaria esconder a scroll bar + + if (_detalhes.debug) then + _detalhes.showing_ActorTable_Timer2 = _detalhes.showing_ActorTable_Timer2 or 0 + if (time() > _detalhes.showing_ActorTable_Timer2) then + _detalhes:Msg ("(debug) nothing to show -> amount < 1") + _detalhes.showing_ActorTable_Timer2 = time()+5 + end + end + return _detalhes:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh end @@ -2278,6 +2303,8 @@ function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, ex end end + _detalhes.LastFullDamageUpdate = _detalhes._tempo + return _detalhes:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh end @@ -2714,19 +2741,23 @@ end elseif (classe == "UNGROUPPLAYER") then if (self.enemy) then if (_detalhes.faction_against == "Horde") then - texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Orc_Male") - texture:SetTexCoord (0, 1, 0, 1) + --texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Orc_Male") + texture:SetTexture ("Interface\\ICONS\\PVPCurrency-Honor-Horde.blp") + texture:SetTexCoord (0.05, 0.95, 0.05, 0.95) else - texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Human_Male") - texture:SetTexCoord (0, 1, 0, 1) + --texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Human_Male") + texture:SetTexture ("Interface\\ICONS\\PVPCurrency-Honor-Alliance.blp") + texture:SetTexCoord (0.05, 0.95, 0.05, 0.95) end else if (_detalhes.faction_against == "Horde") then - texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Human_Male") - texture:SetTexCoord (0, 1, 0, 1) + --texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Human_Male") + texture:SetTexture ("Interface\\ICONS\\PVPCurrency-Honor-Alliance.blp") + texture:SetTexCoord (0.05, 0.95, 0.05, 0.95) else - texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Orc_Male") - texture:SetTexCoord (0, 1, 0, 1) + --texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Orc_Male") + texture:SetTexture ("Interface\\ICONS\\PVPCurrency-Honor-Horde.blp") + texture:SetTexCoord (0.05, 0.95, 0.05, 0.95) end end texture:SetVertexColor (1, 1, 1) @@ -3903,7 +3934,7 @@ end ------ Damage Done & Dps function atributo_damage:MontaInfoDamageDone() - + local barras = info.barras1 local instancia = info.instancia local total = self.total_without_pet --> total de dano aplicado por este jogador @@ -3924,6 +3955,36 @@ function atributo_damage:MontaInfoDamageDone() local nome, _, icone = _GetSpellInfo (_spellid) _table_insert (ActorSkillsSortTable, {_spellid, _skill.total, _skill.total/ActorTotalDamage*100, nome, icone, nil, _skill.spellschool}) end + + --damage rank + --este_gump:SetTopRightTexts (text1, text2, size, color, font) + local combat = instancia:GetShowingCombat() + local diff = combat:GetDifficulty() + local attribute, subattribute = instancia:GetDisplay() + + --> check if is a raid encounter and if is heroic or mythic + if (diff and (diff == 15 or diff == 16)) then + local db = _detalhes.OpenStorage() + if (db) then + local bestRank, encounterTable = _detalhes.storage:GetBestFromPlayer (diff, combat:GetBossInfo().id, "damage", self.nome, true) + if (bestRank) then + --> discover which are the player position in the guild rank + local playerTable, onEncounter, rankPosition = _detalhes.storage:GetPlayerGuildRank (diff, combat:GetBossInfo().id, "damage", self.nome, true) + + local text1 = self.nome .. " on " .. combat:GetBossInfo().name .. ":" + local text2 = "Guild Rank: " .. (rankPosition or "x") .. " Best Dps: " .. _detalhes:ToK2 ((bestRank[1] or 0) / encounterTable.elapsed) .. " (" .. encounterTable.date:gsub (".*%s", "") .. ")" + + info:SetTopRightTexts (text1, text2, 9, "gray", font) + else + info:SetTopRightTexts() + end + else + info:SetTopRightTexts() + end + else + info:SetTopRightTexts() + end + --> add pets local ActorPets = self.pets @@ -3976,10 +4037,10 @@ function atributo_damage:MontaInfoDamageDone() if (info.sub_atributo == 2) then local formated_value = SelectedToKFunction (_, _math_floor (tabela[2]/meu_tempo)) - self:UpdadeInfoBar (barra, index-1, tabela[1], name, tabela[2], formated_value, max_, tabela[3], tabela[5], true, nil, tabela [7]) + self:UpdadeInfoBar (barra, index, tabela[1], name, tabela[2], formated_value, max_, tabela[3], tabela[5], true, nil, tabela [7]) else local formated_value = SelectedToKFunction (_, _math_floor (tabela[2])) - self:UpdadeInfoBar (barra, index-1, tabela[1], name, tabela[2], formated_value, max_, tabela[3], tabela[5], true, nil, tabela [7]) + self:UpdadeInfoBar (barra, index, tabela[1], name, tabela[2], formated_value, max_, tabela[3], tabela[5], true, nil, tabela [7]) end self:FocusLock (barra, tabela[1]) @@ -4926,10 +4987,12 @@ end return shadow end - function atributo_damage:r_connect_shadow (actor, no_refresh) + function atributo_damage:r_connect_shadow (actor, no_refresh, combat_object) + local host_combat = combat_object or _detalhes.tabela_overall + --> criar uma shadow desse ator se ainda não tiver uma - local overall_dano = _detalhes.tabela_overall [1] + local overall_dano = host_combat [1] local shadow = overall_dano._ActorTable [overall_dano._NameIndexTable [actor.nome]] if (not shadow) then @@ -4973,9 +5036,9 @@ end shadow.friendlyfire_total = shadow.friendlyfire_total + actor.friendlyfire_total --> total no combate overall (captura de dados) - _detalhes.tabela_overall.totals[1] = _detalhes.tabela_overall.totals[1] + actor.total + host_combat.totals[1] = host_combat.totals[1] + actor.total if (actor.grupo) then - _detalhes.tabela_overall.totals_grupo[1] = _detalhes.tabela_overall.totals_grupo[1] + actor.total + host_combat.totals_grupo[1] = host_combat.totals_grupo[1] + actor.total end --> copia o damage_from (captura de dados) diff --git a/classes/classe_energy.lua b/classes/classe_energy.lua index 4f1f0788..d5c0319d 100644 --- a/classes/classe_energy.lua +++ b/classes/classe_energy.lua @@ -1395,10 +1395,12 @@ end return shadow end - function atributo_energy:r_connect_shadow (actor, no_refresh) + function atributo_energy:r_connect_shadow (actor, no_refresh, combat_object) + + local host_combat = combat_object or _detalhes.tabela_overall --> criar uma shadow desse ator se ainda não tiver uma - local overall_energy = _detalhes.tabela_overall [3] + local overall_energy = host_combat [3] local shadow = overall_energy._ActorTable [overall_energy._NameIndexTable [actor.nome]] if (not shadow) then @@ -1438,10 +1440,10 @@ end end --> total no combate overall (captura de dados) - _detalhes.tabela_overall.totals[3] [actor.powertype] = _detalhes.tabela_overall.totals[3] [actor.powertype] + actor.total + host_combat.totals[3] [actor.powertype] = host_combat.totals[3] [actor.powertype] + actor.total if (actor.grupo) then - _detalhes.tabela_overall.totals_grupo[3][actor.powertype] = _detalhes.tabela_overall.totals_grupo[3][actor.powertype] + actor.total + host_combat.totals_grupo[3][actor.powertype] = host_combat.totals_grupo[3][actor.powertype] + actor.total end --> targets diff --git a/classes/classe_heal.lua b/classes/classe_heal.lua index 5314b609..a69140e4 100644 --- a/classes/classe_heal.lua +++ b/classes/classe_heal.lua @@ -2404,10 +2404,12 @@ end return shadow end - function atributo_heal:r_connect_shadow (actor, no_refresh) + function atributo_heal:r_connect_shadow (actor, no_refresh, combat_object) + + local host_combat = combat_object or _detalhes.tabela_overall --> criar uma shadow desse ator se ainda não tiver uma - local overall_cura = _detalhes.tabela_overall [2] + local overall_cura = host_combat [2] local shadow = overall_cura._ActorTable [overall_cura._NameIndexTable [actor.nome]] if (not shadow) then @@ -2457,9 +2459,9 @@ end shadow.healing_taken = shadow.healing_taken + actor.healing_taken --> total no combate overall (captura de dados) - _detalhes.tabela_overall.totals[2] = _detalhes.tabela_overall.totals[2] + actor.total + host_combat.totals[2] = host_combat.totals[2] + actor.total if (actor.grupo) then - _detalhes.tabela_overall.totals_grupo[2] = _detalhes.tabela_overall.totals_grupo[2] + actor.total + host_combat.totals_grupo[2] = host_combat.totals_grupo[2] + actor.total end --> copia o healing_from (captura de dados) diff --git a/classes/classe_instancia.lua b/classes/classe_instancia.lua index f3c216c7..523ee647 100644 --- a/classes/classe_instancia.lua +++ b/classes/classe_instancia.lua @@ -2825,7 +2825,10 @@ local function GetDpsHps (_thisActor, key) end end --- report_table: table sent to report func / data: numeric table {{value1, value2}} / f1: format value1 / f2: format value2 +-- table sent to report func / f1: format value1 / f2: format value2 +-- report_table = a table header: {"report results for:"} +-- data = table with {{value1 (string), value2 ( the value)} , {value1 (string), value2 ( the value)}} + local default_format_value1 = function (v) return v end local default_format_value2 = function (v) return v end local default_format_value3 = function (i, v1, v2) @@ -3179,6 +3182,26 @@ function _detalhes:envia_relatorio (linhas, custom) end end + local isMythicDungeon = _detalhes.tabela_vigente:IsMythicDungeon() + if (isMythicDungeon) then + local mythicDungeonInfo = _detalhes.tabela_vigente:GetMythicDungeonInfo() + if (mythicDungeonInfo) then + local isMythicOverallSegment, segmentID, mythicLevel, EJID, mapID, zoneName, encounterID, encounterName, startedAt, endedAt, runID = _detalhes:UnpackMythicDungeonInfo (mythicDungeonInfo) + + if (isMythicOverallSegment) then + luta = zoneName .. " +" .. mythicLevel .. " (" .. Loc ["STRING_SEGMENTS_LIST_OVERALL"] .. ")" + else + if (segmentID == "trashoverall") then + luta = encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_TRASH"] .. ")" + else + luta = encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_BOSS"] .. ")" + end + end + else + luta = Loc ["STRING_SEGMENTS_LIST_TRASH"] + end + end + if (not luta) then if (_detalhes.tabela_vigente.enemy) then luta = _detalhes.tabela_vigente.enemy @@ -3207,6 +3230,27 @@ function _detalhes:envia_relatorio (linhas, custom) end end + local thisSegment = _detalhes.tabela_historico.tabelas[1] + local isMythicDungeon = thisSegment:IsMythicDungeon() + if (isMythicDungeon) then + local mythicDungeonInfo = thisSegment:GetMythicDungeonInfo() + if (mythicDungeonInfo) then + local isMythicOverallSegment, segmentID, mythicLevel, EJID, mapID, zoneName, encounterID, encounterName, startedAt, endedAt, runID = _detalhes:UnpackMythicDungeonInfo (mythicDungeonInfo) + + if (isMythicOverallSegment) then + luta = zoneName .. " +" .. mythicLevel .. " (" .. Loc ["STRING_SEGMENTS_LIST_OVERALL"] .. ")" + else + if (segmentID == "trashoverall") then + luta = encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_TRASH"] .. ")" + else + luta = encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_BOSS"] .. ")" + end + end + else + luta = Loc ["STRING_SEGMENTS_LIST_TRASH"] + end + end + if (not luta) then if (_detalhes.tabela_historico.tabelas[1].enemy) then luta = _detalhes.tabela_historico.tabelas[1].enemy .. " (" .. Loc ["STRING_REPORT_LASTFIGHT"] .. ")" @@ -3234,6 +3278,27 @@ function _detalhes:envia_relatorio (linhas, custom) end end + local thisSegment = _detalhes.tabela_historico.tabelas [segmento] + local isMythicDungeon = thisSegment:IsMythicDungeon() + if (isMythicDungeon) then + local mythicDungeonInfo = thisSegment:GetMythicDungeonInfo() + if (mythicDungeonInfo) then + local isMythicOverallSegment, segmentID, mythicLevel, EJID, mapID, zoneName, encounterID, encounterName, startedAt, endedAt, runID = _detalhes:UnpackMythicDungeonInfo (mythicDungeonInfo) + + if (isMythicOverallSegment) then + luta = zoneName .. " +" .. mythicLevel .. " (" .. Loc ["STRING_SEGMENTS_LIST_OVERALL"] .. ")" + else + if (segmentID == "trashoverall") then + luta = encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_TRASH"] .. ")" + else + luta = encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_BOSS"] .. ")" + end + end + else + luta = Loc ["STRING_SEGMENTS_LIST_TRASH"] + end + end + if (not luta) then if (_detalhes.tabela_historico.tabelas[segmento].enemy) then luta = _detalhes.tabela_historico.tabelas[segmento].enemy .. " (" .. segmento .. " " .. Loc ["STRING_REPORT_PREVIOUSFIGHTS"] .. ")" diff --git a/classes/classe_others.lua b/classes/classe_others.lua index 3c29d7ac..4b75e3f6 100644 --- a/classes/classe_others.lua +++ b/classes/classe_others.lua @@ -230,10 +230,11 @@ function _detalhes:ToolTipDead (instancia, morte, esta_barra, keydown) end else --> heal - GameCooltip:AddLine ("" .. _cstr ("%.1f", time - hora_da_morte) .. "s " .. spellname .. " (|cFFC6B0D9" .. source .. "|r)", "+" .. _detalhes:ToK (amount) .. " (" .. hp .. "%)", 1, "white", "white") - GameCooltip:AddIcon (spellicon) - GameCooltip:AddStatusBar (hp, 1, "green", true) --, backgroud_bar_heal - + if (amount > _detalhes.deathlog_healingdone_min) then + GameCooltip:AddLine ("" .. _cstr ("%.1f", time - hora_da_morte) .. "s " .. spellname .. " (|cFFC6B0D9" .. source .. "|r)", "+" .. _detalhes:ToK (amount) .. " (" .. hp .. "%)", 1, "white", "white") + GameCooltip:AddIcon (spellicon) + GameCooltip:AddStatusBar (hp, 1, "green", true) --, backgroud_bar_heal + end end elseif (type (evtype) == "number") then @@ -391,20 +392,25 @@ function atributo_misc:ReportSingleDeadLine (morte, instancia) end elseif (not evento [1] and type (evento [1]) == "boolean") then --> heal - local elapsed = _cstr ("%.1f", evento [4] - time_of_death) .."s" - local spelllink = GetSpellLink (evento [2]) - local source = _detalhes:GetOnlyName (evento [6]) - local spellname, _, spellicon = _GetSpellInfo (evento [2]) + local amount = evento [3] - local hp = _math_floor (evento [5] / max_health * 100) - if (hp > 100) then - hp = 100 - end + + if (amount > _detalhes.deathlog_healingdone_min) then + local elapsed = _cstr ("%.1f", evento [4] - time_of_death) .."s" + local spelllink = GetSpellLink (evento [2]) + local source = _detalhes:GetOnlyName (evento [6]) + local spellname, _, spellicon = _GetSpellInfo (evento [2]) + + local hp = _math_floor (evento [5] / max_health * 100) + if (hp > 100) then + hp = 100 + end - if (_detalhes.report_heal_links) then - tinsert (report_array, {elapsed .. " ", spelllink, " (" .. source .. ")", "+" .. _detalhes:ToK (amount) .. " (" .. hp .. "%) "}) - else - tinsert (report_array, {elapsed .. " ", spellname, " (" .. source .. ")", "+" .. _detalhes:ToK (amount) .. " (" .. hp .. "%) "}) + if (_detalhes.report_heal_links) then + tinsert (report_array, {elapsed .. " ", spelllink, " (" .. source .. ")", "+" .. _detalhes:ToK (amount) .. " (" .. hp .. "%) "}) + else + tinsert (report_array, {elapsed .. " ", spellname, " (" .. source .. ")", "+" .. _detalhes:ToK (amount) .. " (" .. hp .. "%) "}) + end end elseif (type (evento [1]) == "number" and evento [1] == 4) then --> debuff @@ -2407,10 +2413,12 @@ local somar_habilidades = function (container1, container2) end end -function atributo_misc:r_connect_shadow (actor, no_refresh) +function atributo_misc:r_connect_shadow (actor, no_refresh, combat_object) + + local host_combat = combat_object or _detalhes.tabela_overall --> criar uma shadow desse ator se ainda não tiver uma - local overall_misc = _detalhes.tabela_overall [4] + local overall_misc = host_combat [4] local shadow = overall_misc._ActorTable [overall_misc._NameIndexTable [actor.nome]] if (not actor.nome) then @@ -2467,9 +2475,9 @@ function atributo_misc:r_connect_shadow (actor, no_refresh) end shadow.cooldowns_defensive = shadow.cooldowns_defensive + actor.cooldowns_defensive - _detalhes.tabela_overall.totals[4].cooldowns_defensive = _detalhes.tabela_overall.totals[4].cooldowns_defensive + actor.cooldowns_defensive + host_combat.totals[4].cooldowns_defensive = host_combat.totals[4].cooldowns_defensive + actor.cooldowns_defensive if (actor.grupo) then - _detalhes.tabela_overall.totals_grupo[4].cooldowns_defensive = _detalhes.tabela_overall.totals_grupo[4].cooldowns_defensive + actor.cooldowns_defensive + host_combat.totals_grupo[4].cooldowns_defensive = host_combat.totals_grupo[4].cooldowns_defensive + actor.cooldowns_defensive end somar_alvos (shadow.cooldowns_defensive_targets, actor.cooldowns_defensive_targets) @@ -2536,9 +2544,9 @@ function atributo_misc:r_connect_shadow (actor, no_refresh) end shadow.interrupt = shadow.interrupt + actor.interrupt - _detalhes.tabela_overall.totals[4].interrupt = _detalhes.tabela_overall.totals[4].interrupt + actor.interrupt + host_combat.totals[4].interrupt = host_combat.totals[4].interrupt + actor.interrupt if (actor.grupo) then - _detalhes.tabela_overall.totals_grupo[4].interrupt = _detalhes.tabela_overall.totals_grupo[4].interrupt + actor.interrupt + host_combat.totals_grupo[4].interrupt = host_combat.totals_grupo[4].interrupt + actor.interrupt end somar_alvos (shadow.interrupt_targets, actor.interrupt_targets) @@ -2567,9 +2575,9 @@ function atributo_misc:r_connect_shadow (actor, no_refresh) end shadow.ress = shadow.ress + actor.ress - _detalhes.tabela_overall.totals[4].ress = _detalhes.tabela_overall.totals[4].ress + actor.ress + host_combat.totals[4].ress = host_combat.totals[4].ress + actor.ress if (actor.grupo) then - _detalhes.tabela_overall.totals_grupo[4].ress = _detalhes.tabela_overall.totals_grupo[4].ress + actor.ress + host_combat.totals_grupo[4].ress = host_combat.totals_grupo[4].ress + actor.ress end somar_alvos (shadow.ress_targets, actor.ress_targets) @@ -2586,9 +2594,9 @@ function atributo_misc:r_connect_shadow (actor, no_refresh) end shadow.dispell = shadow.dispell + actor.dispell - _detalhes.tabela_overall.totals[4].dispell = _detalhes.tabela_overall.totals[4].dispell + actor.dispell + host_combat.totals[4].dispell = host_combat.totals[4].dispell + actor.dispell if (actor.grupo) then - _detalhes.tabela_overall.totals_grupo[4].dispell = _detalhes.tabela_overall.totals_grupo[4].dispell + actor.dispell + host_combat.totals_grupo[4].dispell = host_combat.totals_grupo[4].dispell + actor.dispell end somar_alvos (shadow.dispell_targets, actor.dispell_targets) @@ -2616,9 +2624,9 @@ function atributo_misc:r_connect_shadow (actor, no_refresh) end shadow.cc_break = shadow.cc_break + actor.cc_break - _detalhes.tabela_overall.totals[4].cc_break = _detalhes.tabela_overall.totals[4].cc_break + actor.cc_break + host_combat.totals[4].cc_break = host_combat.totals[4].cc_break + actor.cc_break if (actor.grupo) then - _detalhes.tabela_overall.totals_grupo[4].cc_break = _detalhes.tabela_overall.totals_grupo[4].cc_break + actor.cc_break + host_combat.totals_grupo[4].cc_break = host_combat.totals_grupo[4].cc_break + actor.cc_break end somar_alvos (shadow.cc_break_targets, actor.cc_break_targets) diff --git a/classes/container_combatentes.lua b/classes/container_combatentes.lua index ec0a4c6c..949865dd 100644 --- a/classes/container_combatentes.lua +++ b/classes/container_combatentes.lua @@ -184,8 +184,9 @@ return end end + novo_objeto.classe = "UNKNOW" - return + return true end end @@ -201,6 +202,12 @@ novo_objeto.displayName = _detalhes:GetNickname (serial, false, true) --> serial, default, silent end if (not novo_objeto.displayName) then + if (_detalhes.remove_realm_from_name) then + novo_objeto.displayName = nome:gsub (("%-.*"), "") + else + novo_objeto.displayName = nome + end + --[=[ if (_IsInInstance() and _detalhes.remove_realm_from_name) then novo_objeto.displayName = nome:gsub (("%-.*"), "") @@ -211,6 +218,11 @@ else novo_objeto.displayName = nome end + --]=] + end + + if (_detalhes.all_players_are_group or _detalhes.immersion_enabled) then + novo_objeto.grupo = true end if ((_bit_band (flag, IS_GROUP_OBJECT) ~= 0 and novo_objeto.classe ~= "UNKNOW" and novo_objeto.classe ~= "UNGROUPPLAYER") or _detalhes:IsInCache (serial)) then @@ -486,7 +498,8 @@ if (self.tipo == container_damage) then --> CONTAINER DAMAGE - get_actor_class (novo_objeto, nome, flag, serial) + local shouldScanOnce = get_actor_class (novo_objeto, nome, flag, serial) + read_actor_flag (novo_objeto, dono_do_pet, serial, flag, nome, "damage") if (dono_do_pet) then @@ -508,6 +521,10 @@ if (self.shadow) then --> não executar 2x _detalhes:ScheduleTimer ("GuessClass", 1, {novo_objeto, self, 1}) end + + elseif (shouldScanOnce) then + + end if (novo_objeto.isTank) then @@ -516,7 +533,7 @@ elseif (self.tipo == container_heal) then --> CONTAINER HEALING - get_actor_class (novo_objeto, nome, flag, serial) + local shouldScanOnce = get_actor_class (novo_objeto, nome, flag, serial) read_actor_flag (novo_objeto, dono_do_pet, serial, flag, nome, "heal") if (dono_do_pet) then @@ -543,7 +560,7 @@ elseif (self.tipo == container_energy) then --> CONTAINER ENERGY - get_actor_class (novo_objeto, nome, flag, serial) + local shouldScanOnce = get_actor_class (novo_objeto, nome, flag, serial) read_actor_flag (novo_objeto, dono_do_pet, serial, flag, nome, "energy") if (dono_do_pet) then @@ -563,7 +580,7 @@ elseif (self.tipo == container_misc) then --> CONTAINER MISC - get_actor_class (novo_objeto, nome, flag, serial) + local shouldScanOnce = get_actor_class (novo_objeto, nome, flag, serial) read_actor_flag (novo_objeto, dono_do_pet, serial, flag, nome, "misc") --local teste_classe = @@ -603,7 +620,7 @@ elseif (self.tipo == container_friendlyfire) then --> CONTAINER FRIENDLY FIRE - get_actor_class (novo_objeto, nome, serial) + local shouldScanOnce = get_actor_class (novo_objeto, nome, serial) end diff --git a/classes/container_historico.lua b/classes/container_historico.lua index 8a96275f..9e38f379 100644 --- a/classes/container_historico.lua +++ b/classes/container_historico.lua @@ -435,7 +435,14 @@ function historico:resetar() _detalhes:UpdateParserGears() if (not InCombatLockdown() and not UnitAffectingCombat ("player")) then - collectgarbage() + --> workarround for the "script run too long" issue while outside the combat lockdown + local cleargarbage = function() + collectgarbage() + end + local successful, errortext = pcall (cleargarbage) + if (not successful) then + _detalhes:Msg ("couldn't call collectgarbage()") + end else _detalhes.schedule_hard_garbage_collect = true end diff --git a/core/control.lua b/core/control.lua index d2b797e9..6231c268 100644 --- a/core/control.lua +++ b/core/control.lua @@ -146,7 +146,7 @@ end end end - + _detalhes.tabela_vigente.is_boss = boss_table if (_detalhes.in_combat and not _detalhes.leaving_combat) then @@ -239,7 +239,7 @@ end --try to get the encounter name after the encounter (can be called during the combat as well) - function _detalhes:FindBoss() + function _detalhes:FindBoss (noJournalSearch) if (_detalhes.encounter_table.name) then local encounter_table = _detalhes.encounter_table @@ -269,24 +269,27 @@ end end - local in_instance = IsInInstance() --> garrison returns party as instance type. - if ((InstanceType == "party" or InstanceType == "raid") and in_instance) then - local boss_list = _detalhes:GetCurrentDungeonBossListFromEJ() - if (boss_list) then - local ActorsContainer = _detalhes.tabela_vigente [class_type_dano]._ActorTable - if (ActorsContainer) then - for index, Actor in _ipairs (ActorsContainer) do - if (not Actor.grupo) then - if (boss_list [Actor.nome]) then - Actor.boss = true - return boss_found_not_registered (boss_list [Actor.nome], ZoneName, ZoneMapID, DifficultyID) + noJournalSearch = true --> disabling the scan on encounter journal + + if (not noJournalSearch) then + local in_instance = IsInInstance() --> garrison returns party as instance type. + if ((InstanceType == "party" or InstanceType == "raid") and in_instance) then + local boss_list = _detalhes:GetCurrentDungeonBossListFromEJ() + if (boss_list) then + local ActorsContainer = _detalhes.tabela_vigente [class_type_dano]._ActorTable + if (ActorsContainer) then + for index, Actor in _ipairs (ActorsContainer) do + if (not Actor.grupo) then + if (boss_list [Actor.nome]) then + Actor.boss = true + return boss_found_not_registered (boss_list [Actor.nome], ZoneName, ZoneMapID, DifficultyID) + end end end end end end end - return false end @@ -460,12 +463,13 @@ _detalhes:CatchRaidDebuffUptime ("DEBUFF_UPTIME_OUT") _detalhes:CloseEnemyDebuffsUptime() - --> pega a zona do jogador e vê se foi uma luta contra um Boss -- identifica se a luta foi com um boss + --> check if this isn't a boss and try to find a boss in the segment if (not _detalhes.tabela_vigente.is_boss) then - - --> function which runs after a boss encounter to try recognize a encounter + + --> if this is a mythic+ dungeon, do not scan for encounter journal boss names in the actor list _detalhes:FindBoss() + --> still didn't find the boss if (not _detalhes.tabela_vigente.is_boss) then local ZoneName, _, DifficultyID, _, _, _, _, ZoneMapID = _GetInstanceInfo() local findboss = _detalhes:GetRaidBossFindFunction (ZoneMapID) @@ -512,6 +516,7 @@ local encounterID, encounterName, difficultyID, raidSize, endStatus = unpack (from_encounter_end) if (encounterID) then + local ZoneName, InstanceType, DifficultyID, DifficultyName, _, _, _, ZoneMapID = GetInstanceInfo() local ejid = EJ_GetCurrentInstance() if (ejid == 0) then @@ -531,8 +536,14 @@ id = encounterID, } end - end - + end + + --> tag as a mythic dungeon segment, can be any type of segment, this tag also avoid the segment to be tagged as trash + if (_detalhes.MythicPlus.Started) then + _detalhes.tabela_vigente.is_mythic_dungeon_segment = true + _detalhes.tabela_vigente.is_mythic_dungeon_run_id = _detalhes.mythic_dungeon_id + end + if (not _detalhes.tabela_vigente.is_boss) then if (_detalhes.tabela_vigente.is_pvp or _detalhes.tabela_vigente.is_arena) then @@ -542,16 +553,22 @@ if (_detalhes.tabela_vigente.is_arena) then _detalhes.tabela_vigente.enemy = "[" .. ARENA .. "] " .. _detalhes.tabela_vigente.is_arena.name end - + local in_instance = IsInInstance() --> garrison returns party as instance type. if ((InstanceType == "party" or InstanceType == "raid") and in_instance) then if (InstanceType == "party") then - --if (_detalhes:GetBossNames (_detalhes.zone_id)) then - -- _detalhes.tabela_vigente.is_trash = true - --end - - --> is new dungeon? - _detalhes.tabela_vigente.is_trash = true + if (not _detalhes.tabela_vigente.is_mythic_dungeon_segment) then + --> tag the combat as trash clean up + _detalhes.tabela_vigente.is_trash = true + else + local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() + _detalhes.tabela_vigente.is_mythic_dungeon_trash = { + ZoneName = zoneName, + MapID = instanceMapID, + Level = _detalhes.MythicPlus.Level, + EJID = _detalhes.MythicPlus.ejID, + } + end else _detalhes.tabela_vigente.is_trash = true end @@ -636,7 +653,7 @@ end if (from_encounter_end) then - _detalhes.tabela_vigente:SetEndTime (_detalhes.encounter_table ["end"]) + _detalhes.tabela_vigente:SetEndTime (_detalhes.encounter_table ["end"] or GetTime()) end --> encounter boss function @@ -1614,6 +1631,10 @@ instancia = self end + if (not forcar) then + _detalhes.LastUpdateTick = _detalhes._tempo + end + if (instancia == -1) then --> update diff --git a/core/gears.lua b/core/gears.lua index ce2cf82a..76ac105e 100644 --- a/core/gears.lua +++ b/core/gears.lua @@ -689,12 +689,59 @@ function _detalhes.storage:OpenRaidStorage() return db end -function _detalhes.storage:GetBestFromGuild (diff, encounter_id, role) +function _detalhes.storage:HaveDataForEncounter (diff, encounter_id, guild_name) local db = _detalhes.storage:OpenRaidStorage() + if (not db) then + return + end + + if (guild_name and type (guild_name) == "boolean") then + guild_name = GetGuildInfo ("player") + end + + local table = db [diff] + if (table) then + local encounters = table [encounter_id] + if (encounters) then + --> didn't requested a guild name, so just return 'we have data for this encounter' + if (not guild_name) then + return true + end + + --> data for a specific guild is requested, check if there is data for the guild + for index, encounter in ipairs (encounters) do + if (encounter.guild == guild_name) then + return true + end + end + end + end +end + +function _detalhes.storage:GetBestFromGuild (diff, encounter_id, role, dps, guild_name) + local db = _detalhes.storage:OpenRaidStorage() + + if (not db) then + return + end + + if (not guild_name) then + guild_name = GetGuildInfo ("player") + end + + if (not guild_name) then + if (_detalhes.debug) then + _detalhes:Msg ("(debug) GetBestFromGuild() guild name invalid.") + end + return + end + local best = 0 + local bestdps = 0 local bestplayername local onencounter + local bestactor if (not role) then role = "damage" @@ -711,14 +758,26 @@ function _detalhes.storage:GetBestFromGuild (diff, encounter_id, role) local encounters = table [encounter_id] if (encounters) then for index, encounter in ipairs (encounters) do - - local players = encounter [role] - if (players) then - for playername, t in pairs (players) do - if (t[1] > best) then - best = t [1] - bestplayername = playername - onencounter = encounter + if (encounter.guild == guild_name) then + local players = encounter [role] + if (players) then + for playername, t in pairs (players) do + if (dps) then + if (t[1]/encounter.elapsed > bestdps) then + bestdps = t[1]/encounter.elapsed + bestplayername = playername + onencounter = encounter + bestactor = t + end + else + if (t[1] > best) then + best = t [1] + bestplayername = playername + onencounter = encounter + bestactor = t + end + + end end end end @@ -726,14 +785,107 @@ function _detalhes.storage:GetBestFromGuild (diff, encounter_id, role) end end - return best, bestplayername, onencounter + return t, onencounter end -function _detalhes.storage:GetBestFromPlayer (diff, encounter_id, role, playername) +function _detalhes.storage:GetPlayerGuildRank (diff, encounter_id, role, playername, dps, guild_name) + local db = _detalhes.storage:OpenRaidStorage() + if (not db) then + return + end + + if (not guild_name) then + guild_name = GetGuildInfo ("player") + end + + if (not guild_name) then + if (_detalhes.debug) then + _detalhes:Msg ("(debug) GetBestFromGuild() guild name invalid.") + end + return + end + + if (not role) then + role = "damage" + end + role = string.lower (role) + if (role == "damager") then + role = "damage" + elseif (role == "healer") then + role = "healing" + end + + local playerScore = {} + + local _table = db [diff] + if (_table) then + local encounters = _table [encounter_id] + if (encounters) then + for index, encounter in ipairs (encounters) do + if (encounter.guild == guild_name) then + local roleTable = encounter [role] + for playerName, playerTable in pairs (roleTable) do + + if (not playerScore [playerName]) then + playerScore [playerName] = {0, 0, {}} + end + + local total = playerTable[1] + local persecond = total / encounter.elapsed + + if (dps) then + if (persecond > playerScore [playerName][2]) then + playerScore [playerName][1] = total + playerScore [playerName][2] = total / encounter.elapsed + playerScore [playerName][3] = playerTable + playerScore [playerName][4] = encounter + end + else + if (total > playerScore [playerName][1]) then + playerScore [playerName][1] = total + playerScore [playerName][2] = total / encounter.elapsed + playerScore [playerName][3] = playerTable + playerScore [playerName][4] = encounter + end + end + end + end + end + + if (not playerScore [playername]) then + return + end + + local t = {} + for playerName, playerTable in pairs (playerScore) do + playerTable [5] = playerName + tinsert (t, playerTable) + end + + table.sort (t, dps and _detalhes.Sort2 or _detalhes.Sort1) + + for i = 1, #t do + if (t[i][5] == playername) then + return t[i][3], t[i][4], i + end + end + end + end + +end + +function _detalhes.storage:GetBestFromPlayer (diff, encounter_id, role, playername, dps) + local db = _detalhes.storage:OpenRaidStorage() + + if (not db) then + return + end + local best local onencounter + local topdps if (not role) then role = "damage" @@ -753,13 +905,22 @@ function _detalhes.storage:GetBestFromPlayer (diff, encounter_id, role, playerna local player = encounter [role] and encounter [role] [playername] if (player) then if (best) then - if (player[1] > best[1]) then - onencounter = encounter - best = player + if (dps) then + if (player[1]/encounter.elapsed > topdps) then + onencounter = encounter + best = player + topdps = player[1]/encounter.elapsed + end + else + if (player[1] > best[1]) then + onencounter = encounter + best = player + end end else onencounter = encounter best = player + topdps = player[1]/encounter.elapsed end end end @@ -1133,6 +1294,94 @@ function _detalhes.storage:GetEncounterData (diff, encounter_id, guild) return t end +local create_storage_tables = function() + --> get the storage table + local db = DetailsDataStorage + + if (not db and _detalhes.CreateStorageDB) then + db = _detalhes:CreateStorageDB() + if (not db) then + return + end + elseif (not db) then + return + end + + return db +end + +function _detalhes.ScheduleLoadStorage() + if (InCombatLockdown() or UnitAffectingCombat ("player")) then + if (_detalhes.debug) then + print ("|cFFFFFF00Details! storage scheduled to load (player in combat).") + end + _detalhes.schedule_storage_load = true + return + else + if (not IsAddOnLoaded ("Details_DataStorage")) then + local loaded, reason = LoadAddOn ("Details_DataStorage") + if (not loaded) then + if (_detalhes.debug) then + print ("|cFFFFFF00Details! Storage|r: can't load storage, may be the addon is disabled.") + end + return + end + + create_storage_tables() + end + end + + if (IsAddOnLoaded ("Details_DataStorage")) then + _detalhes.schedule_storage_load = nil + _detalhes.StorageLoaded = true + if (_detalhes.debug) then + print ("|cFFFFFF00Details! storage loaded.") + end + else + if (_detalhes.debug) then + print ("|cFFFFFF00Details! fail to load storage, scheduled once again.") + end + _detalhes.schedule_storage_load = true + end +end + +function _detalhes.GetStorage() + return DetailsDataStorage +end + +function _detalhes.OpenStorage() + --if the player is in combat, this function return false, if failed to load by other reason it returns nil + + --> check if the storage is already loaded + if (not IsAddOnLoaded ("Details_DataStorage")) then + --> can't open it during combat + if (InCombatLockdown() or UnitAffectingCombat ("player")) then + if (_detalhes.debug) then + print ("|cFFFFFF00Details! Storage|r: can't load storage due to combat.") + end + return false + end + + local loaded, reason = LoadAddOn ("Details_DataStorage") + if (not loaded) then + if (_detalhes.debug) then + print ("|cFFFFFF00Details! Storage|r: can't load storage, may be the addon is disabled.") + end + return + end + + local db = create_storage_tables() + + if (db and IsAddOnLoaded ("Details_DataStorage")) then + _detalhes.StorageLoaded = true + end + + return DetailsDataStorage + else + return DetailsDataStorage + end +end + function _detalhes:StoreEncounter (combat) combat = combat or _detalhes.tabela_vigente @@ -1238,7 +1487,7 @@ function _detalhes:StoreEncounter (combat) elapsed = combat:GetCombatTime(), guild = guildName, } - + local damage_container_hash = combat [1]._NameIndexTable local damage_container_pool = combat [1]._ActorTable @@ -1282,35 +1531,29 @@ function _detalhes:StoreEncounter (combat) tinsert (encounter_database, this_combat_data) - print ("|cFFFFFF00Details! Storage|r: encounter saved!") + --print ("|cFFFFFF00Details! Storage|r: encounter saved!") local myrole = UnitGroupRolesAssigned ("player") - local mybest, onencounter = _detalhes.storage:GetBestFromPlayer (diff, encounter_id, myrole, _detalhes.playername) + local mybest, onencounter = _detalhes.storage:GetBestFromPlayer (diff, encounter_id, myrole, _detalhes.playername, true) --> get dps or hps + local myBestDps = mybest [1] / onencounter.elapsed --print (myrole, mybest and mybest[1], mybest and mybest[2], mybest and mybest[3], onencounter and onencounter.date) if (mybest) then local d_one = 0 if (myrole == "DAMAGER" or myrole == "TANK") then - d_one = combat (1, _detalhes.playername) and combat (1, _detalhes.playername).total + d_one = combat (1, _detalhes.playername) and combat (1, _detalhes.playername).total / combat:GetCombatTime() elseif (myrole == "HEALER") then - d_one = combat (2, _detalhes.playername) and combat (2, _detalhes.playername).total + d_one = combat (2, _detalhes.playername) and combat (2, _detalhes.playername).total / combat:GetCombatTime() end - if (mybest[1] > d_one) then - print (Loc ["STRING_DETAILS1"] .. format (Loc ["STRING_SCORE_NOTBEST"], _detalhes:comma_value (d_one), _detalhes:comma_value (mybest[1]), onencounter.date, mybest[2])) + if (myBestDps > d_one) then + print (Loc ["STRING_DETAILS1"] .. format (Loc ["STRING_SCORE_NOTBEST"], _detalhes:ToK2 (d_one), _detalhes:ToK2 (myBestDps), onencounter.date, mybest[2])) else - print (Loc ["STRING_DETAILS1"] .. format (Loc ["STRING_SCORE_BEST"], _detalhes:comma_value (d_one))) + print (Loc ["STRING_DETAILS1"] .. format (Loc ["STRING_SCORE_BEST"], _detalhes:ToK2 (d_one))) end end - --guild best - local amount, playerName, encounterObject = _detalhes.storage:GetBestFromGuild (diff, encounter_id, myrole) - if (amount > 0) then - --> player got the high score on his guild - - end - local lower_instance = _detalhes:GetLowerInstanceNumber() if (lower_instance) then local instance = _detalhes:GetInstance (lower_instance) @@ -1323,7 +1566,7 @@ function _detalhes:StoreEncounter (combat) local func = {_detalhes.OpenRaidHistoryWindow, _detalhes, raid_name, encounter_id, diff, my_role, guildName} --, 2, UnitName ("player") --local icon = {[[Interface\AddOns\Details\images\icons]], 16, 16, false, 434/512, 466/512, 243/512, 273/512} local icon = {[[Interface\PvPRankBadges\PvPRank08]], 16, 16, false, 0, 1, 0, 1} - instance:InstanceAlert (Loc ["STRING_GUILDDAMAGERANK_WINDOWALERT"], icon, 10, func, true) + instance:InstanceAlert (Loc ["STRING_GUILDDAMAGERANK_WINDOWALERT"], icon, _detalhes.update_warning_timeout, func, true) end end else diff --git a/core/parser.lua b/core/parser.lua index b9690491..e1f93cc7 100644 --- a/core/parser.lua +++ b/core/parser.lua @@ -228,7 +228,7 @@ _detalhes.LastPullMsg = time() --local hitLine = self.HitBy or "|cFFFFFF00First Hit|r: *?* from *?* " - local hitLine = self.HitBy or "|cFFFFFF00First Hit|r: *?*" + local hitLine = self.HitBy or "|cFFFFBB00First Hit|r: *?*" local targetLine = "" for i = 1, 5 do @@ -236,7 +236,7 @@ if (boss) then local target = UnitName ("boss" .. i .. "target") if (target and type (target) == "string") then - targetLine = " |cFFFFFF00Boss First Target|r: " .. target + targetLine = " |cFFFFBB00Boss First Target|r: " .. target break end end @@ -246,6 +246,63 @@ _detalhes.WhoAggroTimer = nil end + local lastRecordFound = {id = 0, diff = 0, combatTime = 0} + + _detalhes.PrintEncounterRecord = function (self) + --> this block won't execute if the storage isn't loaded + --> self is a timer reference from C_Timer + + local encounterID = self.Boss + local diff = self.Diff + + if (diff == 15 or diff == 16) then + + local value, rank, combatTime = 0, 0, 0 + + if (encounterID == lastRecordFound.id and diff == lastRecordFound.diff) then + --> is the same encounter, no need to find the value again. + value, rank, combatTime = lastRecordFound.value, lastRecordFound.rank, lastRecordFound.combatTime + else + local db = _detalhes.GetStorage() + + local role = UnitGroupRolesAssigned ("player") + local isDamage = (role == "DAMAGER") or (role == "TANK") --or true + local bestRank, encounterTable = _detalhes.storage:GetBestFromPlayer (diff, encounterID, isDamage and "damage" or "healing", _detalhes.playername, true) + + if (bestRank) then + local playerTable, onEncounter, rankPosition = _detalhes.storage:GetPlayerGuildRank (diff, encounterID, isDamage and "damage" or "healing", _detalhes.playername, true) + + value = bestRank[1] or 0 + rank = rankPosition or 0 + combatTime = encounterTable.elapsed + + --> if found the result, cache the values so no need to search again next pull + lastRecordFound.value = value + lastRecordFound.rank = rank + lastRecordFound.id = encounterID + lastRecordFound.diff = diff + lastRecordFound.combatTime = combatTime + else + --> if didn't found, no reason to search again on next pull + lastRecordFound.value = 0 + lastRecordFound.rank = 0 + lastRecordFound.combatTime = 0 + lastRecordFound.id = encounterID + lastRecordFound.diff = diff + end + end + + _detalhes:Msg ("|cFFFFBB00Your Best Score|r:", _detalhes:ToK2 ((value) / combatTime) .. " [|cFFFFFF00Guild Rank: " .. rank .. "|r]") + + if ((not combatTime or combatTime == 0) and not _detalhes.SyncWarning) then + _detalhes:Msg ("|cFFFF3300you may need sync the rank within the guild, type '|cFFFFFF00/details rank|r'|r") + _detalhes.SyncWarning = true + end + end + + end + + function parser:spell_dmg (token, time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, alvo_flags2, spellid, spellname, spelltype, amount, overkill, school, resisted, blocked, absorbed, critical, glacing, crushing, isoffhand) ------------------------------------------------------------------------------------------------ @@ -4007,8 +4064,16 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 _detalhes:EnteredInArena() else - if ((zoneType == "raid" or zoneType == "party") and select (1, IsInInstance())) then + local inInstance = IsInInstance() + if ((zoneType == "raid" or zoneType == "party") and inInstance) then _detalhes:CheckForAutoErase (zoneMapID) + + --> if the current raid is current tier raid, pre-load the storage database + if (zoneType == "raid") then + if (_detalhes.InstancesToStoreData [zoneMapID]) then + _detalhes.ScheduleLoadStorage() + end + end end if (_detalhes:IsInInstance()) then @@ -4046,28 +4111,31 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 if (_detalhes.debug) then _detalhes:Msg ("(debug) |cFFFFFF00ENCOUNTER_START|r event triggered.") end - + _detalhes.latest_ENCOUNTER_END = _detalhes.latest_ENCOUNTER_END or 0 if (_detalhes.latest_ENCOUNTER_END + 10 > _GetTime()) then return end + + --> leave the current combat when the encounter start, if is doing a mythic plus dungeons, check if the options alows to create a dedicated segment for the boss fight + if ((_in_combat and not _detalhes.tabela_vigente.is_boss) and (not _detalhes.MythicPlus.Started or _detalhes.mythic_plus.boss_dedicated_segment)) then + _detalhes:SairDoCombate() + end + + local encounterID, encounterName, difficultyID, raidSize = _select (1, ...) if (not _detalhes.WhoAggroTimer and _detalhes.announce_firsthit.enabled) then _detalhes.WhoAggroTimer = C_Timer.NewTimer (0.5, who_aggro) end - - local encounterID, encounterName, difficultyID, raidSize = _select (1, ...) - --print ("START", encounterID, encounterName, difficultyID, raidSize) - _current_encounter_id = encounterID - - if (_in_combat and not _detalhes.tabela_vigente.is_boss) then - _detalhes:SairDoCombate() - --_detalhes:Msg ("encounter against|cFFFFFF00", encounterName, "|rbegan, GL HF!") - else - --_detalhes:Msg ("encounter against|cFFFFC000", encounterName, "|rbegan, GL HF!") + if (IsInGuild() and IsInRaid() and _detalhes.announce_damagerecord.enabled and _detalhes.StorageLoaded) then + _detalhes.TellDamageRecord = C_Timer.NewTimer (0.6, _detalhes.PrintEncounterRecord) + _detalhes.TellDamageRecord.Boss = encounterID + _detalhes.TellDamageRecord.Diff = difficultyID end - + + _current_encounter_id = encounterID + local dbm_mod, dbm_time = _detalhes.encounter_table.DBM_Mod, _detalhes.encounter_table.DBM_ModTime _table_wipe (_detalhes.encounter_table) @@ -4116,7 +4184,10 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 _detalhes.encounter_table.index = boss_index end - parser:Handle3rdPartyBuffs_OnEncounterStart() + if (not _detalhes.MythicPlus.Started or (_detalhes.MythicPlus.Started and not _in_combat)) then + parser:Handle3rdPartyBuffs_OnEncounterStart() + end + end function _detalhes.parser_functions:ENCOUNTER_END (...) @@ -4127,7 +4198,8 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 _current_encounter_id = nil - if (_detalhes.zone_type == "party") then + local _, instanceType = GetInstanceInfo() --> let's make sure it isn't a dungeon + if (_detalhes.zone_type == "party" or instanceType == "party") then if (_detalhes.debug) then _detalhes:Msg ("(debug) the zone type is 'party', ignoring ENCOUNTER_END.") end @@ -4210,6 +4282,21 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 _detalhes:SairDoCombate() end + if (_detalhes.schedule_mythicdungeon_trash_merge) then + _detalhes.schedule_mythicdungeon_trash_merge = nil + DetailsMythicPlusFrame.MergeTrashCleanup() + end + + if (_detalhes.schedule_mythicdungeon_endtrash_merge) then + _detalhes.schedule_mythicdungeon_endtrash_merge = nil + DetailsMythicPlusFrame.MergeRemainingTrashAfterAllBossesDone() + end + + if (_detalhes.schedule_mythicdungeon_overallrun_merge) then + _detalhes.schedule_mythicdungeon_overallrun_merge = nil + DetailsMythicPlusFrame.MergeSegmentsOnEnd() + end + --> aqui, tentativa de fazer o timer da janela do Solo funcionar corretamente: if (_detalhes.solo and _detalhes.PluginCount.SOLO > 0) then if (_detalhes.SoloTables.Plugins [_detalhes.SoloTables.Mode].Stop) then @@ -4217,6 +4304,11 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 end end + if (_detalhes.schedule_storage_load) then + _detalhes.schedule_storage_load = nil + _detalhes.ScheduleLoadStorage() + end + if (_detalhes.schedule_flag_boss_components) then _detalhes.schedule_flag_boss_components = false _detalhes:FlagActorsOnBossFight() @@ -4350,14 +4442,6 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 _detalhes:Msg ("(debug) found a timer.") end - local name, groupType, _, difficult = GetInstanceInfo() - if (groupType == "party" and difficult == "Mythic Keystone" and _detalhes.overall_clear_newchallenge) then - _detalhes.historico:resetar_overall() - if (_detalhes.debug) then - _detalhes:Msg ("(debug) timer is for a mythic+ dungeon, overall has been reseted.") - end - end - --if (C_Scenario.IsChallengeMode() and _detalhes.overall_clear_newchallenge) then -- if (_detalhes.overall_clear_newchallenge) then --C_Scenario.IsChallengeMode() and parece que não existe mais -- _detalhes.historico:resetar_overall() diff --git a/core/util.lua b/core/util.lua index 09bb2b86..20117099 100644 --- a/core/util.lua +++ b/core/util.lua @@ -803,6 +803,11 @@ end end end end + + --mythic dungeon test + if (_detalhes.MythicPlus.Started and _detalhes.mythic_plus.always_in_combat) then + return true + end _detalhes:SairDoCombate() end diff --git a/core/windows.lua b/core/windows.lua index a3da4314..4596f6c8 100644 --- a/core/windows.lua +++ b/core/windows.lua @@ -1090,7 +1090,7 @@ end --> raid history window ~history - function _detalhes:OpenRaidHistoryWindow (_raid, _boss, _difficulty, _role, _guild, _player_base, _player_name) + function _detalhes:OpenRaidHistoryWindow (_raid, _boss, _difficulty, _role, _guild, _player_base, _player_name, _history_type) if (not _G.DetailsRaidHistoryWindow) then @@ -1195,7 +1195,7 @@ local guild_sync = function() _detalhes.storage:DBGuildSync() f.GuildSyncButton:Disable() - + if (not f.SyncTexture) then local workingFrame = CreateFrame ("frame", nil, f) f.WorkingFrame = workingFrame @@ -1220,7 +1220,7 @@ local rotation = _detalhes.gump:CreateAnimation (animationHub, "ROTATION", 1, 3, -360) rotation:SetTarget (f.SyncTextureCircle) --_detalhes.gump:CreateAnimation (animationHub, "ALPHA", 1, 0.5, 0, 1) - + f.SyncText = workingFrame:CreateFontString (nil, "border", "GameFontNormal") f.SyncText:SetPoint ("right", f.SyncTextureBackground, "left", 0, 0) f.SyncText:SetText ("working") @@ -1250,24 +1250,29 @@ GuildSyncButton:SetPoint ("topright", f, "topright", -20, -34) GuildSyncButton:SetIcon ([[Interface\GLUES\CharacterSelect\RestoreButton]], 12, 12, "overlay", {0.2, .8, 0.2, .8}, nil, 4) - function f.BuildReport() if (f.LatestResourceTable) then local reportFunc = function (IsCurrent, IsReverse, AmtLines) + + local bossName = f.select_boss.label:GetText() + local bossDiff = f.select_diff.label:GetText() + local reportTable = {"Details!: DPS Rank for: " .. (bossDiff or "") .. " " .. (bossName or "--x--x--")} local result = {} - local bossName = f.select_boss.label:GetText() - - tinsert (result, "Details!: Damage Rank for: " .. (bossName or "--x--x--")) for i = 1, AmtLines do if (f.LatestResourceTable[i]) then - tinsert (result, f.LatestResourceTable[i][1] .. ": " .. f.LatestResourceTable[i][2]) + local playerName = f.LatestResourceTable[i][1] + playerName = playerName:gsub ("%|c%x%x%x%x%x%x%x%x", "") + playerName = playerName:gsub ("%|r", "") + playerName = playerName:gsub (".*%s", "") + tinsert (result, {playerName, f.LatestResourceTable[i][2]}) else break end end - Details:SendReportLines (result) + _detalhes:FormatReportLines (reportTable, result) + Details:SendReportLines (reportTable) end Details:SendReportWindow (reportFunc, nil, nil, true) @@ -1306,6 +1311,18 @@ end end) + f:SetScript ("OnHide", function() + --> save latest shown state + f.LatestSelection = f.LatestSelection or {} + f.LatestSelection.Raid = DetailsRaidHistoryWindow.select_raid.value + f.LatestSelection.Boss = DetailsRaidHistoryWindow.select_boss.value + f.LatestSelection.Diff = DetailsRaidHistoryWindow.select_diff.value + f.LatestSelection.Role = DetailsRaidHistoryWindow.select_role.value + f.LatestSelection.Guild = DetailsRaidHistoryWindow.select_guild.value + f.LatestSelection.PlayerBase = DetailsRaidHistoryWindow.select_player.value + f.LatestSelection.PlayerName = DetailsRaidHistoryWindow.select_player2.value + end) + f.TitleText:SetText ("Details! Raid Ranking") --f.portrait:SetTexture ([[Interface\AddOns\Details\images\icons2]]) f.portrait:SetTexture ([[Interface\PVPFrame\PvPPrestigeIcons]]) @@ -1429,6 +1446,8 @@ function f:UpdateDropdowns (DoNotSelectRaid) + local currentGuild = guild_dropdown.value + --difficulty wipe (diff_list) wipe (boss_list) @@ -1473,7 +1492,6 @@ if (not boss_repeated [encounterId]) then local encounter, instance = _detalhes:GetBossEncounterDetailsFromEncounterId (_, encounterId) if (encounter) then - local InstanceID = _detalhes:GetInstanceIdFromEncounterId (encounterId) if (raidSelected == InstanceID) then tinsert (boss_list, {value = encounterId, label = encounter.boss, icon = icon, onclick = on_boss_select}) @@ -1491,7 +1509,7 @@ for index, encounter in ipairs (encounterTable) do local guild = encounter.guild if (not guild_repeated [guild]) then - tinsert (guild_list, {value = guild, label = guild, icon = icon, onclick = on_raid_select}) + tinsert (guild_list, {value = guild, label = guild, icon = icon, onclick = on_guild_select}) guild_repeated [guild] = true end end @@ -1510,9 +1528,13 @@ raid_dropdown:Refresh() raid_dropdown:Select (1, true) end - guild_dropdown:Refresh() - guild_dropdown:Select (1, true) + guild_dropdown:Refresh() + if (currentGuild) then + guild_dropdown:Select (currentGuild) + else + guild_dropdown:Select (1, true) + end end function f.UpdateBossDropdown() @@ -1611,40 +1633,26 @@ local player = roleTable [playerName] if (player) then - tinsert (data, {text = date, value = player[1], data = player, fulldate = encounter.date, elapsed = encounter.elapsed}) + + --tinsert (data, {text = date, value = player[1], data = player, fulldate = encounter.date, elapsed = encounter.elapsed}) + tinsert (data, {text = date, value = player[1]/encounter.elapsed, utext = _detalhes:ToK2 (player[1]/encounter.elapsed), data = player, fulldate = encounter.date, elapsed = encounter.elapsed}) end end end --> update graphic if (not f.gframe) then - - local cooltip_block_bg = {0, 0, 0, 1} - local menu_wallpaper_tex = {.6, 0.1, 0, 0.64453125} - local menu_wallpaper_color = {1, 1, 1, 0.1} local onenter = function (self) GameCooltip:Reset() GameCooltip:SetType ("tooltip") - - GameCooltip:SetOption ("TextSize", _detalhes.tooltip.fontsize) - GameCooltip:SetOption ("TextFont", _detalhes.tooltip.fontface) - GameCooltip:SetOption ("TextColor", _detalhes.tooltip.fontcolor) - GameCooltip:SetOption ("TextColorRight", _detalhes.tooltip.fontcolor_right) - GameCooltip:SetOption ("TextShadow", _detalhes.tooltip.fontshadow and "OUTLINE") - - GameCooltip:SetOption ("LeftBorderSize", -5) - GameCooltip:SetOption ("RightBorderSize", 5) - GameCooltip:SetOption ("MinWidth", 175) - GameCooltip:SetOption ("StatusBarTexture", [[Interface\AddOns\Details\images\bar_background]]) - - GameCooltip:AddLine ("Total Done:", _detalhes:ToK2 (self.data.value)) - GameCooltip:AddLine ("Dps:", _detalhes:ToK2 (self.data.value / self.data.elapsed)) - GameCooltip:AddLine ("Item Level:", floor (self.data.data [2])) - GameCooltip:AddLine ("Date:", self.data.fulldate:gsub (".*%s", "")) - - GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], menu_wallpaper_tex, menu_wallpaper_color, true) - GameCooltip:SetBackdrop (1, _detalhes.tooltip_backdrop, cooltip_block_bg, _detalhes.tooltip_border_color) + GameCooltip:Preset (2) + + GameCooltip:AddLine ("Total Done:", _detalhes:ToK2 (self.data.value), 1, "white") + GameCooltip:AddLine ("Dps:", _detalhes:ToK2 (self.data.value / self.data.elapsed), 1, "white") + GameCooltip:AddLine ("Item Level:", floor (self.data.data [2]), 1, "white") + GameCooltip:AddLine ("Date:", self.data.fulldate:gsub (".*%s", ""), 1, "white") + GameCooltip:SetOwner (self.ball.tooltip_anchor) GameCooltip:Show() end @@ -1729,8 +1737,15 @@ t.ps, }) end + table.sort (sortTable, function(a, b) return a[8] > b[8] end) + --> add the number before the player name + for i = 1, #sortTable do + local t = sortTable [i] + t [1] = i .. ". " .. t [1] + end + fillpanel:SetFillFunction (function (index) return sortTable [index] end) fillpanel:SetTotalFunction (function() return #sortTable end) fillpanel:UpdateRows (header) @@ -1790,6 +1805,9 @@ end end + --> sort alphabetical + table.sort (players, function(a, b) return a[1] < b[1] end) + for index, playerTable in ipairs (players) do for i = #playerTable, amt_encounters do tinsert (playerTable, "") @@ -1882,12 +1900,40 @@ end + + --> table means some button send the request - nil for other ways + if (type (_raid) == "table" or (not _raid and not _boss and not _difficulty and not _role and not _guild and not _player_base and not _player_name)) then + local f = _G.DetailsRaidHistoryWindow + if (f.LatestSelection) then + _raid = f.LatestSelection.Raid + _boss = f.LatestSelection.Boss + _difficulty = f.LatestSelection.Diff + _role = f.LatestSelection.Role + _guild = f.LatestSelection.Guild + _player_base = f.LatestSelection.PlayerBase + _player_name = f.LatestSelection.PlayerBase + end + end + _G.DetailsRaidHistoryWindow:UpdateDropdowns() _G.DetailsRaidHistoryWindow:UpdateDropdowns() _G.DetailsRaidHistoryWindow:Refresh() _G.DetailsRaidHistoryWindow:Show() + if (_history_type == 1 or _history_type == 2) then + DetailsRaidHistoryWindow.Mode = _history_type + if (DetailsRaidHistoryWindow.Mode == 1) then + --overall + DetailsRaidHistoryWindow.HistoryCheckBox:SetValue (true) + DetailsRaidHistoryWindow.GuildRankCheckBox:SetValue (false) + elseif (DetailsRaidHistoryWindow.Mode == 2) then + --guild rank + DetailsRaidHistoryWindow.GuildRankCheckBox:SetValue (true) + DetailsRaidHistoryWindow.HistoryCheckBox:SetValue (false) + end + end + if (_raid) then DetailsRaidHistoryWindow.select_raid:Select (_raid) _G.DetailsRaidHistoryWindow:Refresh() @@ -1906,6 +1952,9 @@ _G.DetailsRaidHistoryWindow:Refresh() end if (_guild) then + if (type (_guild) == "boolean") then + _guild = GetGuildInfo ("player") + end DetailsRaidHistoryWindow.select_guild:Select (_guild) _G.DetailsRaidHistoryWindow:Refresh() end diff --git a/functions/boss.lua b/functions/boss.lua index 7c4b47b2..91853564 100644 --- a/functions/boss.lua +++ b/functions/boss.lua @@ -18,6 +18,28 @@ do end end + --> return the full table with all data for the instance + function _detalhes:GetRaidInfoFromEncounterID (encounterID, encounterEJID) + for id, raidTable in pairs (_detalhes.EncounterInformation) do + if (encounterID) then + local ids = raidTable.encounter_ids2 --combatlog + if (ids) then + if (ids [encounterID]) then + return raidTable + end + end + end + if (encounterEJID) then + local ejids = raidTable.encounter_ids --encounter journal + if (ejids) then + if (ejids [encounterEJID]) then + return raidTable + end + end + end + end + end + --> return the ids of trash mobs in the instance function _detalhes:GetInstanceTrashInfo (mapid) return _detalhes.EncounterInformation [mapid] and _detalhes.EncounterInformation [mapid].trash_ids @@ -213,8 +235,24 @@ do end end --> return the icon for the raid instance - function _detalhes:GetRaidIcon (mapid) - return _detalhes.EncounterInformation [mapid] and _detalhes.EncounterInformation [mapid].icon + function _detalhes:GetRaidIcon (mapid, ejID, instanceType) + local raidIcon = _detalhes.EncounterInformation [mapid] and _detalhes.EncounterInformation [mapid].icon + if (raidIcon) then + return raidIcon + end + + if (ejID and ejID ~= 0) then + local name, description, bgImage, buttonImage, loreImage, dungeonAreaMapID, link = EJ_GetInstanceInfo (ejID) + if (name) then + if (instanceType == "party") then + return loreImage --bgImage + elseif (instanceType == "raid") then + return loreImage + end + end + end + + return nil end --> return the boss icon @@ -227,15 +265,25 @@ do end --> return the boss portrit - function _detalhes:GetBossPortrait (mapid, bossindex) + function _detalhes:GetBossPortrait (mapid, bossindex, encounterName, ejID) if (mapid and bossindex) then - --print (_detalhes.EncounterInformation [mapid]) - --print (_detalhes.EncounterInformation [mapid] and _detalhes.EncounterInformation [mapid].encounters) - --print (_detalhes.EncounterInformation [mapid] and _detalhes.EncounterInformation [mapid].encounters and _detalhes.EncounterInformation [mapid].encounters [bossindex]) - return _detalhes.EncounterInformation [mapid] and _detalhes.EncounterInformation [mapid].encounters [bossindex] and _detalhes.EncounterInformation [mapid].encounters [bossindex].portrait - else - return false + local haveIcon = _detalhes.EncounterInformation [mapid] and _detalhes.EncounterInformation [mapid].encounters [bossindex] and _detalhes.EncounterInformation [mapid].encounters [bossindex].portrait + if (haveIcon) then + return haveIcon + end end + + if (encounterName and ejID and ejID ~= 0) then + local index, name, description, encounterID, rootSectionID, link = _detalhes:GetEncounterInfoFromEncounterName (ejID, encounterName) + if (index and name and encounterID) then + local id, name, description, displayInfo, iconImage = EJ_GetCreatureInfo (1, encounterID) + if (iconImage) then + return iconImage + end + end + end + + return nil end --> return a list with names of adds and bosses diff --git a/functions/link.lua b/functions/link.lua index 39469323..5c4ec7f4 100644 --- a/functions/link.lua +++ b/functions/link.lua @@ -683,7 +683,7 @@ ["custom"] = "aura_env.reimaningTime = 5", }, }, - ["cooldown"] = true, + ["cooldown"] = false, ["stacksContainment"] = "OUTSIDE", ["zoom"] = 0.3, ["auto"] = true, @@ -1252,7 +1252,7 @@ }, } - function _detalhes:CreateWeakAura (aura_type, spellid, use_spellid, spellname, name, icon_texture, target, stacksize, sound, chat, icon_text, icon_glow, encounter_id, group, icon_size, other_values) + function _detalhes:CreateWeakAura (aura_type, spellid, use_spellid, spellname, name, icon_texture, target, stacksize, sound, chat, icon_text, icon_glow, encounter_id, group, icon_size, other_values, in_combat, cooldown_animation) --print (aura_type, spellid, use_spellid, spellname, name, icon_texture, target, stacksize, sound, chat, icon_text, icon_glow, encounter_id, group, icon_size, other_values) @@ -1314,6 +1314,13 @@ --> size new_aura.fontSize = min (icon_size, 24) + --> combat only + if (in_combat) then + new_aura.load.use_combat = true + else + new_aura.load.use_combat = nil + end + elseif (target == 42) then -- dispell chat = nil @@ -1353,7 +1360,14 @@ --> size new_aura.fontSize = min (icon_size, 24) - elseif (other_values.dbm_timer_id or other_values.bw_timer_id) then + --> combat only + if (in_combat) then + new_aura.load.use_combat = true + else + new_aura.load.use_combat = nil + end + + elseif (other_values.dbm_timer_id or other_values.bw_timer_id) then --boss mods --> create the default aura table if (aura_type == "icon") then @@ -1529,6 +1543,13 @@ end _detalhes.table.overwrite (new_aura, add) end + + --> combat only + if (in_combat) then + new_aura.load.use_combat = true + else + new_aura.load.use_combat = nil + end else new_aura.trigger.spellId = tostring (spellid) new_aura.trigger.name = spellname @@ -1620,9 +1641,37 @@ _detalhes.table.overwrite (new_aura, add) end + if (cooldown_animation) then + new_aura.cooldown = true + new_aura.cooldownTextEnabled = true + end + --> add the aura on a group if (group) then new_aura.parent = group + + if (new_aura.regionType == "icon") then + --> adjust the width and height of the new aura following the existing auras on the group + local normalWidth, normalHeight, amount = 0, 0, 0 + local allAurasInTheGroup = WeakAurasSaved.displays [group].controlledChildren + + for index, auraname in ipairs (allAurasInTheGroup) do + local auraObject = WeakAurasSaved.displays [auraname] + if (auraObject and auraObject.regionType == "icon") then + amount = amount + 1 + normalWidth = normalWidth + auraObject.width + normalHeight = normalHeight + auraObject.height + end + end + + if (normalWidth > 0) then + normalWidth = normalWidth / amount + normalHeight = normalHeight / amount + new_aura.width = normalWidth + new_aura.height = normalHeight + end + end + tinsert (WeakAurasSaved.displays [group].controlledChildren, new_aura.id) else new_aura.parent = nil @@ -1679,41 +1728,64 @@ end end - local f = CreateFrame ("frame", "DetailsAuraPanel", UIParent, "ButtonFrameTemplate") - f:SetSize (600, 488) + local f = CreateFrame ("frame", "DetailsAuraPanel", UIParent) + f:SetSize (800, 600) f:SetPoint ("center", UIParent, "center", 0, 150) f:SetFrameStrata ("HIGH") - f:SetToplevel (true) + f:EnableMouse (true) f:SetMovable (true) + f:SetToplevel (true) + f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) + f:SetBackdropColor (24/255, 24/255, 24/255, .8) + f:SetBackdropBorderColor (0, 0, 0, 1) - tinsert (UISpecialFrames, "DetailsAuraPanel") + --register to libwindow + local LibWindow = LibStub ("LibWindow-1.1") + LibWindow.RegisterConfig (f, _detalhes.createauraframe) + LibWindow.RestorePosition (f) + LibWindow.MakeDraggable (f) + LibWindow.SavePosition (f) - f:SetScript ("OnMouseDown", function(self, button) - if (self.isMoving) then - return - end - if (button == "RightButton") then - self:Hide() - else - self:StartMoving() - self.isMoving = true - end - end) - f:SetScript ("OnMouseUp", function(self, button) - if (self.isMoving and button == "LeftButton") then - self:StopMovingOrSizing() - self.isMoving = nil - end - end) + --titlebar + f.TitleBar = CreateFrame ("frame", "$parentTitleBar", f) + f.TitleBar:SetPoint ("topleft", f, "topleft", 2, -3) + f.TitleBar:SetPoint ("topright", f, "topright", -2, -3) + f.TitleBar:SetHeight (20) + f.TitleBar:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) + f.TitleBar:SetBackdropColor (.2, .2, .2, 1) + f.TitleBar:SetBackdropBorderColor (0, 0, 0, 1) - f.TitleText:SetText ("Create Aura") - f.portrait:SetTexture ([[Interface\CHARACTERFRAME\TEMPORARYPORTRAIT-FEMALE-BLOODELF]]) + --close button + f.Close = CreateFrame ("button", "$parentCloseButton", f) + f.Close:SetPoint ("right", f.TitleBar, "right", -2, 0) + f.Close:SetSize (16, 16) + f.Close:SetNormalTexture (_detalhes.gump.folder .. "icons") + f.Close:SetHighlightTexture (_detalhes.gump.folder .. "icons") + f.Close:SetPushedTexture (_detalhes.gump.folder .. "icons") + f.Close:GetNormalTexture():SetTexCoord (0, 16/128, 0, 1) + f.Close:GetHighlightTexture():SetTexCoord (0, 16/128, 0, 1) + f.Close:GetPushedTexture():SetTexCoord (0, 16/128, 0, 1) + f.Close:SetAlpha (0.7) + f.Close:SetScript ("OnClick", function() f:Hide() end) + --title + f.Title = f.TitleBar:CreateFontString ("$parentTitle", "overlay", "GameFontNormal") + f.Title:SetPoint ("center", f.TitleBar, "center") + f.Title:SetTextColor (.8, .8, .8, 1) + f.Title:SetText ("Details! Create Aura") + local fw = _detalhes:GetFramework() + local text_template = fw:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE") + local dropdown_template = fw:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") + local switch_template = fw:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE") + local slider_template = fw:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE") + local button_template = fw:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") + --aura name local name_label = fw:CreateLabel (f, "Aura Name: ", nil, nil, "GameFontNormal") local name_textentry = fw:CreateTextEntry (f, _detalhes.empty_function, 150, 20, "AuraName", "$parentAuraName") + name_textentry:SetTemplate (slider_template) name_textentry:SetPoint ("left", name_label, "right", 2, 0) f.name = name_textentry @@ -1734,40 +1806,86 @@ local aura_type = fw:CreateDropDown (f, aura_type_options, 1, 150, 20, "AuraTypeDropdown", "$parentAuraTypeDropdown") local aura_type_label = fw:CreateLabel (f, "Aura Type: ", nil, nil, "GameFontNormal") aura_type:SetPoint ("left", aura_type_label, "right", 2, 0) + aura_type:Hide() - --spellname - local spellname_label = fw:CreateLabel (f, "Spell Name: ", nil, nil, "GameFontNormal") - local spellname_textentry = fw:CreateTextEntry (f, _detalhes.empty_function, 150, 20, "SpellName", "$parentSpellName") - spellname_textentry:SetPoint ("left", spellname_label, "right", 2, 0) - f.spellname = spellname_textentry - spellname_textentry.tooltip = "Spell/Debuff/Buff to be tracked." + local Icon_IconAuraType = fw:CreateImage (f, [[Interface\AddOns\Details\images\icons2]], 32, 32, "overlay", {119/512, 151/512, 176/512, 208/512}, nil, nil) + Icon_IconAuraType:SetPoint ("topleft", aura_type_label, "bottomleft", 10, -16) - --spellid - local auraid_label = fw:CreateLabel (f, "Spell Id: ", nil, nil, "GameFontNormal") - local auraid_textentry = fw:CreateTextEntry (f, _detalhes.empty_function, 150, 20, "AuraSpellId", "$parentAuraSpellId") - auraid_textentry:Disable() - auraid_textentry:SetPoint ("left", auraid_label, "right", 2, 0) + local Icon_StatusbarAuraType = fw:CreateImage (f, [[Interface\AddOns\Details\images\icons2]], 92, 12, "overlay", {154/512, 246/512, 176/512, 188/512}, nil, nil) + Icon_StatusbarAuraType:SetPoint ("topleft", aura_type_label, "bottomleft", 60, -26) + + local Icon_TextOnlyAuraType = fw:CreateImage (f, [[Interface\AddOns\Details\images\icons2]], 57, 8, "overlay", {169/512, 225/512, 200/512, 207/512}, nil, nil) + Icon_TextOnlyAuraType:SetPoint ("topleft", aura_type_label, "bottomleft", 170, -28) - --use spellid - local usespellid_label = fw:CreateLabel (f, "Use SpellId: ", nil, nil, "GameFontNormal") - local aura_use_spellid = fw:CreateSwitch (f, function(_, _, state) if (state) then auraid_textentry:Enable() else auraid_textentry:Disable() end end, false, nil, nil, nil, nil, "UseSpellId") - aura_use_spellid:SetPoint ("left", usespellid_label, "right", 2, 0) - aura_use_spellid.tooltip = "Use the spell id instead of the spell name, for advanced users." + local AuraTypeSelectedColor = {1, 1, 1, 0.3} + local AuraTypeBorderColor = {.3, .3, .3, 0.5} + local AuraTypeBorderSelectedColor = {1, 1, 1, 0.4} - --aura icon - local icon_label = fw:CreateLabel (f, "Icon: ", nil, nil, "GameFontNormal") - local icon_button_func = function (texture) - f.IconButton.icon.texture = texture + local OnSelectAuraType = function (self, fixedParam, auraType, noUpdate) + + if (type (auraType) == "number") then + if (auraType == 1) then + auraType = "icon" + elseif (auraType == 2) then + auraType = "text" + elseif (auraType == 3) then + auraType = "aurabar" + end + end + + f.IconAuraTypeButton:SetBackdropColor (0, 0, 0, 0.05) + f.StatusbarAuraTypeButton:SetBackdropColor (0, 0, 0, 0.05) + f.TextOnlyAuraTypeButton:SetBackdropColor (0, 0, 0, 0.05) + + f.IconAuraTypeButton:SetBackdropBorderColor (unpack (AuraTypeBorderColor)) + f.StatusbarAuraTypeButton:SetBackdropBorderColor (unpack (AuraTypeBorderColor)) + f.TextOnlyAuraTypeButton:SetBackdropBorderColor (unpack (AuraTypeBorderColor)) + + if (auraType == "icon") then + f.IconAuraTypeButton:SetBackdropColor (unpack (AuraTypeSelectedColor)) + f.IconAuraTypeButton:SetBackdropBorderColor (unpack (AuraTypeBorderSelectedColor)) + elseif (auraType == "aurabar") then + f.StatusbarAuraTypeButton:SetBackdropColor (unpack (AuraTypeSelectedColor)) + f.StatusbarAuraTypeButton:SetBackdropBorderColor (unpack (AuraTypeBorderSelectedColor)) + elseif (auraType == "text") then + f.TextOnlyAuraTypeButton:SetBackdropColor (unpack (AuraTypeSelectedColor)) + f.TextOnlyAuraTypeButton:SetBackdropBorderColor (unpack (AuraTypeBorderSelectedColor)) + end + + aura_type:SetValue (auraType) + if (f.UpdateLabels and not noUpdate) then + f:UpdateLabels() + end end - local icon_pick_button = fw:NewButton (f, nil, "$parentIconButton", "IconButton", 20, 20, function() fw:IconPick (icon_button_func, true) end) - local icon_button_icon = fw:NewImage (icon_pick_button, [[Interface\ICONS\TEMP]], 19, 19, "background", nil, "icon", "$parentIcon") - icon_pick_button:InstallCustomTexture() + f.OnSelectAuraType = OnSelectAuraType - icon_pick_button:SetPoint ("left", icon_label, "right", 2, 0) - icon_button_icon:SetPoint ("left", icon_label, "right", 2, 0) + local AuraTypeBackground = f:CreateTexture (nil, "border") + AuraTypeBackground:SetColorTexture (.4, .4, .4, .1) + AuraTypeBackground:SetHeight (64) + AuraTypeBackground:SetPoint ("topleft", f, "topleft", 10, -79) + AuraTypeBackground:SetPoint ("topright", f, "topright", -10, -79) - f.icon = icon_button_icon + local Icon_IconAuraTypeButton = fw:CreateButton (f, OnSelectAuraType, 46, 46, "", "icon", nil, nil, "IconAuraTypeButton") + local Icon_StatusbarAuraTypeButton = fw:CreateButton (f, OnSelectAuraType, 100, 46, "", "aurabar", nil, nil, "StatusbarAuraTypeButton") + local Icon_TextOnlyAuraTypeButton = fw:CreateButton (f, OnSelectAuraType, 69, 46, "", "text", nil, nil, "TextOnlyAuraTypeButton") + Icon_IconAuraTypeButton:SetPoint ("center", Icon_IconAuraType, "center") + Icon_StatusbarAuraTypeButton:SetPoint ("center", Icon_StatusbarAuraType, "center") + Icon_TextOnlyAuraTypeButton:SetPoint ("center", Icon_TextOnlyAuraType, "center") + + Icon_IconAuraTypeButton:SetBackdrop ({edgeFile = [[Interface\AddOns\Details\images\dotted]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) + Icon_IconAuraTypeButton:SetBackdropColor (unpack (AuraTypeSelectedColor)) + Icon_IconAuraTypeButton:SetBackdropBorderColor (unpack (AuraTypeBorderColor)) + + Icon_StatusbarAuraTypeButton:SetBackdrop ({edgeFile = [[Interface\AddOns\Details\images\dotted]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) + Icon_StatusbarAuraTypeButton:SetBackdropColor (0, 0, 0, 0.05) + Icon_StatusbarAuraTypeButton:SetBackdropBorderColor (unpack (AuraTypeBorderColor)) + + Icon_TextOnlyAuraTypeButton:SetBackdrop ({edgeFile = [[Interface\AddOns\Details\images\dotted]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) + Icon_TextOnlyAuraTypeButton:SetBackdropColor (0, 0, 0, 0.05) + Icon_TextOnlyAuraTypeButton:SetBackdropBorderColor (unpack (AuraTypeBorderColor)) + + --trigger list --target local on_select_aura_trigger = function (_, _, aura_trigger) if (f.UpdateLabels) then @@ -1798,13 +1916,122 @@ return aura_on_table end local aura_on = fw:CreateDropDown (f, aura_on_options, 1, 150, 20, "AuraOnDropdown", "$parentAuraOnDropdown") - local aura_on_label = fw:CreateLabel (f, "Trigger: ", nil, nil, "GameFontNormal") + local aura_on_label = fw:CreateLabel (f, "Trigger On: ", nil, nil, "GameFontNormal") aura_on:SetPoint ("left", aura_on_label, "right", 2, 0) + aura_on:Hide() + + local triggerList = { + {name = "Debuff on You", value = 1}, + {name = "Debuff on Target", value = 2}, --2 + {name = "Debuff on Focus", value = 3}, + {name = "Buff on You", value = 11}, --4 + {name = "Buff on Target", value = 12}, + {name = "Buff on Focus", value = 13}, + {name = "Spell Cast Started", value = 21}, + {name = "Spell Cast Successful", value = 22}, + {name = "DBM Time Bar", value = 31}, + {name = "BigWigs Time Bar", value = 32}, + {name = "Spell Interrupt", value = 41}, + {name = "Spell Dispell", value = 42}, + } + + local SetTriggerState = function (triggerID) + for i = 1, #triggerList do + triggerList[i].checkBox:SetValue (false) + if (triggerList[i].value == triggerID) then + triggerList[i].checkBox:SetValue (true) + end + end + end + + f.SetTriggerState = SetTriggerState + f.TriggerList = triggerList + + local OnChangeTriggerState = function (self, triggerID, state) + SetTriggerState (triggerID) + aura_on:SetValue (triggerID) + + if (f.UpdateLabels) then + f:UpdateLabels() + end + end + + for i = 1, #triggerList do + local checkBox = fw:CreateSwitch (f, OnChangeTriggerState, i == 1) + checkBox:SetTemplate (fw:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE")) + checkBox:SetAsCheckBox() + checkBox:SetFixedParameter (triggerList [i].value) + + checkBox:SetSize (20, 20) + checkBox:SetPoint ("topleft", aura_on_label, "bottomleft", 0, 12 + (-i*20)) + local label = fw:CreateLabel (f, triggerList [i].name) + label:SetPoint ("left", checkBox, "right", 2, 0) + + triggerList [i].checkBox = checkBox + end + + + + + --spellname + local spellname_label = fw:CreateLabel (f, "Spell Name: ", nil, nil, "GameFontNormal") + local spellname_textentry = fw:CreateTextEntry (f, _detalhes.empty_function, 150, 20, "SpellName", "$parentSpellName") + spellname_textentry:SetTemplate (slider_template) + spellname_textentry:SetPoint ("left", spellname_label, "right", 2, 0) + f.spellname = spellname_textentry + spellname_textentry.tooltip = "Spell/Debuff/Buff to be tracked." + + --spellid + local auraid_label = fw:CreateLabel (f, "Spell Id: ", nil, nil, "GameFontNormal") + local auraid_textentry = fw:CreateTextEntry (f, _detalhes.empty_function, 150, 20, "AuraSpellId", "$parentAuraSpellId") + auraid_textentry:SetTemplate (slider_template) + auraid_textentry:Disable() + auraid_textentry:SetPoint ("left", auraid_label, "right", 2, 0) + + --use spellid + local usespellid_label = fw:CreateLabel (f, "Use SpellId: ", nil, nil, "GameFontNormal") + local aura_use_spellid = fw:CreateSwitch (f, function(_, _, state) if (state) then auraid_textentry:Enable() else auraid_textentry:Disable() end end, false, nil, nil, nil, nil, "UseSpellId") + aura_use_spellid:SetTemplate (fw:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE")) + aura_use_spellid:SetAsCheckBox() + + aura_use_spellid:SetPoint ("left", usespellid_label, "right", 2, 0) + aura_use_spellid.tooltip = "Use the spell id instead of the spell name, for advanced users." + + --in combat only + local incombat_label = fw:CreateLabel (f, "Only in Combat: ", nil, nil, "GameFontNormal") + local aura_incombat = fw:CreateSwitch (f, function(_, _, state) end, true, nil, nil, nil, nil, "UseInCombat") + aura_incombat:SetTemplate (fw:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE")) + aura_incombat:SetAsCheckBox() + aura_incombat:SetPoint ("left", incombat_label, "right", 2, 0) + aura_incombat.tooltip = "Only active when in combat." + + --aura icon + local icon_label = fw:CreateLabel (f, "Icon: ", nil, nil, "GameFontNormal") + local icon_button_func = function (texture) + f.IconButton.icon.texture = texture + end + local icon_pick_button = fw:NewButton (f, nil, "$parentIconButton", "IconButton", 20, 20, function() fw:IconPick (icon_button_func, true) end) + local icon_button_icon = fw:NewImage (icon_pick_button, [[Interface\ICONS\TEMP]], 19, 19, "background", nil, "icon", "$parentIcon") + icon_pick_button:InstallCustomTexture() + + icon_pick_button:SetPoint ("left", icon_label, "right", 2, 0) + icon_button_icon:SetPoint ("left", icon_label, "right", 2, 0) + + f.icon = icon_button_icon + + --is cooldown + local iscooldown_label = fw:CreateLabel (f, "Cooldown Animation: ", nil, nil, "GameFontNormal") + local aura_iscooldown = fw:CreateSwitch (f, function(_, _, state) end, true, nil, nil, nil, nil, "IsCooldown") + aura_iscooldown:SetTemplate (fw:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE")) + aura_iscooldown:SetAsCheckBox() + aura_iscooldown:SetPoint ("left", iscooldown_label, "right", 2, 0) + aura_iscooldown.tooltip = "Only active when in combat." --stack local stack_slider = fw:NewSlider (f, f, "$parentStackSlider", "StackSlider", 150, 20, 0, 30, 1, 0, true) stack_slider.useDecimals = true - local stack_label = fw:CreateLabel (f, "Stack Size: ", nil, nil, "GameFontNormal") + stack_slider:SetTemplate (slider_template) + local stack_label = fw:CreateLabel (f, "Trigger Stack Size: ", nil, nil, "GameFontNormal") stack_slider:SetPoint ("left", stack_label, "right", 2, 0) stack_slider.tooltip = "Minimum amount of stacks to trigger the aura." @@ -1898,19 +2125,22 @@ return t end local sound_effect = fw:CreateDropDown (f, sound_options, 1, 150, 20, "SoundEffectDropdown", "$parentSoundEffectDropdown") + sound_effect:SetTemplate (slider_template) local sound_effect_label = fw:CreateLabel (f, "Play Sound: ", nil, nil, "GameFontNormal") sound_effect:SetPoint ("left", sound_effect_label, "right", 2, 0) sound_effect.tooltip = "Sound played when the aura triggers." --say something - local say_something_label = fw:CreateLabel (f, "/Say: ", nil, nil, "GameFontNormal") + local say_something_label = fw:CreateLabel (f, "/Say on Trigger: ", nil, nil, "GameFontNormal") local say_something = fw:CreateTextEntry (f, _detalhes.empty_function, 150, 20, "SaySomething", "$parentSaySomething") + say_something:SetTemplate (slider_template) say_something:SetPoint ("left", say_something_label, "right", 2, 0) say_something.tooltip = "Your character /say this phrase when the aura triggers." --aura text local aura_text_label = fw:CreateLabel (f, "Aura Text: ", nil, nil, "GameFontNormal") local aura_text = fw:CreateTextEntry (f, _detalhes.empty_function, 150, 20, "AuraText", "$parentAuraText") + aura_text:SetTemplate (slider_template) aura_text:SetPoint ("left", aura_text_label, "right", 2, 0) aura_text.tooltip = "Text shown at aura's icon right side." @@ -1926,6 +2156,10 @@ self.glow_test.animOut:Play() end end, false, nil, nil, nil, nil, "UseGlow") + + useglow:SetTemplate (fw:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE")) + useglow:SetAsCheckBox() + useglow:SetPoint ("left", useglow_label, "right", 2, 0) useglow.tooltip = "Do not rename the aura on WeakAuras options panel or the glow effect may not work." @@ -1937,12 +2171,14 @@ --encounter id local encounterid_label = fw:CreateLabel (f, "Encounter ID: ", nil, nil, "GameFontNormal") local encounterid = fw:CreateTextEntry (f, _detalhes.empty_function, 150, 20, "EncounterIdText", "$parentEncounterIdText") + encounterid:SetTemplate (slider_template) encounterid:SetPoint ("left", encounterid_label, "right", 2, 0) encounterid.tooltip = "Only load this aura for this raid encounter." --size local icon_size_slider = fw:NewSlider (f, f, "$parentIconSizeSlider", "IconSizeSlider", 150, 20, 8, 256, 1, 64) local icon_size_label = fw:CreateLabel (f, "Size: ", nil, nil, "GameFontNormal") + icon_size_slider:SetTemplate (slider_template) icon_size_slider:SetPoint ("left", icon_size_label, "right", 2, 0) icon_size_slider.tooltip = "Icon size, width and height." @@ -1955,6 +2191,7 @@ return t end local aura_addon = fw:CreateDropDown (f, addon_options, 1, 150, 20, "AuraAddonDropdown", "$parentAuraAddonDropdown") + aura_addon:SetTemplate (slider_template) local aura_addon_label = fw:CreateLabel (f, "Addon: ", nil, nil, "GameFontNormal") aura_addon:SetPoint ("left", aura_addon_label, "right", 2, 0) @@ -1982,6 +2219,7 @@ local weakauras_folder_label = fw:CreateLabel (f, "Weak Auras Group: ", nil, nil, "GameFontNormal") local weakauras_folder = fw:CreateDropDown (f, weakauras_folder_options, 1, 150, 20, "WeakaurasFolderDropdown", "$parentWeakaurasFolder") + weakauras_folder:SetTemplate (slider_template) weakauras_folder:SetPoint ("left", weakauras_folder_label, "right", 2, 0) --create @@ -2000,6 +2238,8 @@ local addon = f.AuraAddonDropdown.value local folder = f.WeakaurasFolderDropdown.value local iconsize = f.IconSizeSlider.value + local incombat = f.UseInCombat.value + local iscooldown = f.IsCooldown.value local icon_text = f.AuraText.text local icon_glow = f.UseGlow.value @@ -2010,7 +2250,7 @@ end if (addon == "WA") then - _detalhes:CreateWeakAura (aura_type_value, spellid, use_spellId, spellname, name, icon, target, stacksize, sound, chat, icon_text, icon_glow, eid, folder, iconsize, f.other_values) + _detalhes:CreateWeakAura (aura_type_value, spellid, use_spellId, spellname, name, icon, target, stacksize, sound, chat, icon_text, icon_glow, eid, folder, iconsize, f.other_values, incombat, iscooldown) else _detalhes:Msg ("No Aura Addon selected. Addons currently supported: WeakAuras 2.") end @@ -2018,46 +2258,48 @@ f:Hide() end - local create_button = fw:CreateButton (f, create_func, 106, 16, "Create Aura") - create_button:InstallCustomTexture() + local create_button = fw:CreateButton (f, create_func, 106, 20, "Create Aura") + create_button:SetTemplate (slider_template) - local cancel_button = fw:CreateButton (f, function() name_textentry:ClearFocus(); f:Hide() end, 106, 16, "Cancel") - cancel_button:InstallCustomTexture() + local cancel_button = fw:CreateButton (f, function() name_textentry:ClearFocus(); f:Hide() end, 106, 20, "Cancel") + cancel_button:SetTemplate (slider_template) create_button:SetIcon ([[Interface\Buttons\UI-CheckBox-Check]], nil, nil, nil, {0.125, 0.875, 0.125, 0.875}, nil, 4, 2) cancel_button:SetIcon ([[Interface\Buttons\UI-GroupLoot-Pass-Down]], nil, nil, nil, {0.125, 0.875, 0.125, 0.875}, nil, 4, 2) local x_start = 20 - local x2_start = 320 + local x2_start = 420 local y_start = 21 - + --aura name and the type - name_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*1) + (50)) * -1) - aura_type_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*2) + (50)) * -1) + name_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*1) + (25)) * -1) + aura_type_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*2) + (25)) * -1) --triggers - aura_on_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*4) + (45)) * -1) - stack_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*5) + (45)) * -1) - encounterid_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*6) + (45)) * -1) + aura_on_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*4) + (65)) * -1) + stack_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*17) + (65)) * -1) + encounterid_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*18) + (65)) * -1) --about the spell - spellname_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*8) + (45)) * -1) - auraid_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*9) + (45)) * -1) - usespellid_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*10) + (45)) * -1) - - --configuration - icon_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*1) + (50)) * -1) - sound_effect_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*2) + (50)) * -1) - say_something_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*3) + (50)) * -1) - aura_text_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*4) + (50)) * -1) - useglow_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*5) + (50)) * -1) - icon_size_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*6) + (50)) * -1) - - aura_addon_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*15) + (60)) * -1) - weakauras_folder_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*16) + (60)) * -1) + spellname_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*20) + (45)) * -1) + usespellid_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*21) + (45)) * -1) + auraid_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*22) + (45)) * -1) + incombat_label:SetPoint ("topleft", f, "topleft", x_start, ((y_start*23) + (45)) * -1) - create_button:SetPoint ("topleft", f, "topleft", x_start, ((y_start*18) + (60)) * -1) - cancel_button:SetPoint ("topright", f, "topright", x_start*-1, ((y_start*18) + (60)) * -1) + --configuration + icon_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*6) + (47)) * -1) + sound_effect_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*7) + (47)) * -1) + say_something_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*8) + (47)) * -1) + aura_text_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*9) + (47)) * -1) + useglow_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*10) + (47)) * -1) + iscooldown_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*11) + (47)) * -1) + icon_size_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*12) + (47)) * -1) + + aura_addon_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*20) + (60)) * -1) + weakauras_folder_label:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*21) + (60)) * -1) + + create_button:SetPoint ("topleft", f, "topleft", x2_start, ((y_start*23) + (60)) * -1) + cancel_button:SetPoint ("left", create_button, "right", 20, 0) function f:UpdateLabels() @@ -2081,6 +2323,7 @@ f.AuraText:SetText ("") aura_text_label.text = "Aura Text: " f.UseGlow:Enable() + f.IsCooldown:Enable() if (aura_type == "icon") then aura_text_label:SetText ("Icon Text: ") @@ -2091,22 +2334,24 @@ aura_text_label:SetText ("Text: ") icon_size_label:SetText ("Font Size: ") f.IconSizeSlider:SetValue (12) + f.IsCooldown:Disable() elseif (aura_type == "aurabar") then aura_text_label:SetText ("Left Text: ") icon_size_label:SetText ("Bar Width: ") f.IconSizeSlider:SetValue (250) + f.IsCooldown:Disable() end if (trigger >= 1 and trigger <= 19) then --buff and debuff - stack_label:SetText ("Stack Size: ") + stack_label:SetText ("Trigger Stack Size: ") elseif (trigger >= 20 and trigger <= 29) then --cast end cast start - stack_label:SetText ("Duration: ") + stack_label:SetText ("Cast Duration: ") f.StackSlider:SetValue (2) elseif (trigger >= 30 and trigger <= 39) then --boss mods - stack_label:SetText ("Remaining Time:") + stack_label:SetText ("Trigger Remaining Time:") f.StackSlider:SetValue (4) f.StackSlider.tooltip = "Will trigger when the bar remaining time reach this value." f.SpellName:Disable() @@ -2117,6 +2362,9 @@ f.SpellName:Disable() f.UseSpellId:Disable() DetailsAuraPanel.AuraTypeDropdown:Select (2, true) + DetailsAuraPanel.OnSelectAuraType (nil, nil, 2, true) + f.IsCooldown:Disable() + f.SoundEffectDropdown:Disable() f.SaySomething:Disable() f.IconButton:Disable() @@ -2179,14 +2427,18 @@ if (triggertype and type (triggertype) == "number") then DetailsAuraPanel.AuraOnDropdown:Select (triggertype, true) + DetailsAuraPanel.SetTriggerState (DetailsAuraPanel.TriggerList [triggertype].value) --passed by index not by the trigger ID else DetailsAuraPanel.AuraOnDropdown:Select (1, true) + DetailsAuraPanel.SetTriggerState (1) end if (auratype and type (auratype) == "number") then DetailsAuraPanel.AuraTypeDropdown:Select (auratype, true) + DetailsAuraPanel.OnSelectAuraType (nil, nil, auratype) else DetailsAuraPanel.AuraTypeDropdown:Select (1, true) + DetailsAuraPanel.OnSelectAuraType (nil, nil, "icon") end DetailsAuraPanel:UpdateLabels() @@ -2591,6 +2843,8 @@ f:SetToplevel (true) f:SetMovable (true) f.Title:SetTextColor (1, .8, .2) + + f:SetBackdropColor (unpack (_detalhes.default_backdropcolor)) local have_plugins_enabled diff --git a/functions/playerclass.lua b/functions/playerclass.lua index e7a02238..648ac9e9 100644 --- a/functions/playerclass.lua +++ b/functions/playerclass.lua @@ -149,7 +149,7 @@ do end local class = _detalhes:GetClass (Actor.nome) - if (class) then + if (class and class ~= "UNKNOW") then Actor.classe = class Actor.need_refresh = true Actor.guessing_class = nil @@ -212,6 +212,7 @@ do _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec + Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.guessing_spec = nil if (container) then @@ -236,6 +237,7 @@ do _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec + Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe if (container) then container.need_refresh = true @@ -267,6 +269,7 @@ do _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec + Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe if (container) then container.need_refresh = true @@ -307,6 +310,8 @@ do local spec = _detalhes.cached_specs [Actor.serial] if (spec) then Actor.spec = spec + Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe + Actor.guessing_spec = nil if (container) then @@ -332,6 +337,8 @@ do _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec + Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe + Actor.guessing_spec = nil if (container) then @@ -354,6 +361,7 @@ do _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec + Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.guessing_spec = nil if (container) then @@ -379,6 +387,7 @@ do _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec + Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.guessing_spec = nil if (container) then @@ -410,6 +419,7 @@ do _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec + Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.guessing_spec = nil if (container) then @@ -434,6 +444,7 @@ do _detalhes.cached_specs [Actor.serial] = spec Actor.spec = spec + Actor.classe = _detalhes.SpecIDToClass [spec] or Actor.classe Actor.need_refresh = true Actor.guessing_spec = nil diff --git a/functions/profiles.lua b/functions/profiles.lua index a3065db0..2c497334 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -1000,6 +1000,7 @@ local default_profile = { force_activity_time_pvp = true, death_tooltip_width = 300, override_spellids = true, + all_players_are_group = false, --> skins standard_skin = false, @@ -1073,6 +1074,7 @@ local default_player_data = { combat_counter = 0, last_instance_id = 0, last_instance_time = 0, + mythic_dungeon_id = 0, --> nicktag cache nick_tag_cache = {}, ignore_nicktag = false, @@ -1121,6 +1123,10 @@ local default_player_data = { enabled = true, channel = "SELF", }, + announce_damagerecord = { + enabled = true, + channel = "SELF", + }, --> benchmark benchmark_db = { frame = {}, @@ -1143,7 +1149,7 @@ local default_global_data = { savedCustomSpells = {}, savedTimeCaptures = {}, lastUpdateWarning = 0, - update_warning_timeout = 30, + update_warning_timeout = 10, report_where = "SAY", realm_sync = true, spell_school_cache = {}, @@ -1195,6 +1201,21 @@ local default_global_data = { }, spell_pool = {}, encounter_spell_pool = {}, + --> aura creation frame libwindow + createauraframe = {}, + --> min health done on the death report + deathlog_healingdone_min = 1, + + --> mythic plus config + mythic_plus = { + always_in_combat = false, -- + merge_boss_trash = true, -- + delete_trash_after_merge = true, -- + --merge_boss_with_trash = false, --this won't be used + boss_dedicated_segment = true, -- + make_overall_when_done = true, -- + make_overall_boss_only = false, -- + }, -- important auras --[=[ diff --git a/functions/skins.lua b/functions/skins.lua index c9f197e2..8654fc59 100644 --- a/functions/skins.lua +++ b/functions/skins.lua @@ -66,7 +66,7 @@ local _ micro_frames = {left = "DETAILS_STATUSBAR_PLUGIN_THREAT"}, instance_cprops = { - ["menu_icons_size"] = 1, + ["menu_icons_size"] = 0.85, ["color"] = { 1, -- [1] 1, -- [2] @@ -75,7 +75,7 @@ local _ }, ["menu_anchor"] = { 13, -- [1] - 2, -- [2] + 1, -- [2] ["side"] = 2, }, ["bg_r"] = 0.0941, @@ -142,7 +142,7 @@ local _ ["bars_grow_direction"] = 1, ["row_info"] = { ["textR_outline"] = true, - ["spec_file"] = "Interface\\AddOns\\Details\\images\\spec_icons_normal_alpha", + ["spec_file"] = "Interface\\AddOns\\Details\\images\\spec_icons_normal", ["textL_outline"] = true, ["texture_highlight"] = "Interface\\FriendsFrame\\UI-FriendsList-Highlight", ["textR_show_data"] = { @@ -162,7 +162,7 @@ local _ ["between"] = 1, }, ["texture_background_class_color"] = false, - ["start_after_icon"] = false, + ["start_after_icon"] = true, ["font_face_file"] = "Fonts\\ARIALN.TTF", ["textL_custom_text"] = "{data1}. {data3}{data2}", ["font_size"] = 10, @@ -217,7 +217,7 @@ local _ ["textR_separator"] = ",", ["textL_class_colors"] = false, }, - ["show_statusbar"] = true, + ["show_statusbar"] = false, ["bg_alpha"] = 0.699999988079071, ["wallpaper"] = { ["enabled"] = false, @@ -425,7 +425,7 @@ local _ ["between"] = 0, }, ["texture_background_class_color"] = false, - ["start_after_icon"] = false, + ["start_after_icon"] = true, ["font_face_file"] = "Interface\\Addons\\Details\\fonts\\Accidental Presidency.ttf", ["textL_custom_text"] = "{data1}. {data3}{data2}", ["font_size"] = 10, @@ -571,7 +571,7 @@ local _ ["between"] = 1, }, ["texture_background_class_color"] = false, - ["start_after_icon"] = false, + ["start_after_icon"] = true, ["font_face_file"] = "Fonts\\ARIALN.TTF", ["textL_custom_text"] = "{data1}. {data3}{data2}", ["font_size"] = 10, @@ -848,7 +848,7 @@ local _ ["between"] = 0, }, ["texture_background_class_color"] = false, - ["start_after_icon"] = false, + ["start_after_icon"] = true, ["font_face_file"] = "Interface\\Addons\\Details\\fonts\\Accidental Presidency.ttf", ["textL_custom_text"] = "{data1}. {data3}{data2}", ["font_size"] = 10, @@ -1517,7 +1517,7 @@ local _ ["between"] = 1, }, ["texture_background_class_color"] = false, - ["start_after_icon"] = false, + ["start_after_icon"] = true, ["font_face_file"] = "Interface\\Addons\\Details\\fonts\\FORCED SQUARE.ttf", ["textL_custom_text"] = "{data1}. {data3}{data2}", ["font_size"] = 10, @@ -1706,7 +1706,7 @@ local _ ["textL_enable_custom_text"] = false, ["icon_file"] = "Interface\\AddOns\\Details\\images\\spec_icons_normal", ["texture_background_file"] = "Interface\\AddOns\\Details\\images\\BantoBar", - ["start_after_icon"] = false, + ["start_after_icon"] = true, ["texture_highlight"] = "Interface\\FriendsFrame\\UI-FriendsList-Highlight", ["textR_enable_custom_text"] = false, ["textR_custom_text"] = "{data1} ({data2}, {data3}%)", @@ -2207,7 +2207,7 @@ local _ ["between"] = 0, }, ["texture_background_class_color"] = false, - ["start_after_icon"] = false, + ["start_after_icon"] = true, ["font_face_file"] = "Interface\\Addons\\Details\\fonts\\Accidental Presidency.ttf", ["backdrop"] = { ["enabled"] = false, diff --git a/functions/slash.lua b/functions/slash.lua index 141471b5..af2873a2 100644 --- a/functions/slash.lua +++ b/functions/slash.lua @@ -907,6 +907,95 @@ function SlashCmdList.DETAILS (msg, editbox) print (Loc ["STRING_DETAILS1"] .. "diagnostic for character " .. rest .. " turned on.") return end + + local current_combat = _detalhes.tabela_vigente + + if (not _detalhes.DebugWindow) then + _detalhes.DebugWindow = _detalhes.gump:CreateSimplePanel (UIParent, 800, 600, "Details! Debug", "DetailsDebugPanel") + local TextBox = _detalhes.gump:NewSpecialLuaEditorEntry (_detalhes.DebugWindow, 760, 560, "text", "$parentTextEntry", true) + TextBox:SetPoint ("center", _detalhes.DebugWindow, "center", 0, -10) + TextBox:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) + TextBox:SetBackdropColor (0, 0, 0, 0.9) + TextBox:SetBackdropBorderColor (0, 0, 0, 1) + _detalhes.DebugWindow.TextBox = TextBox + end + + local text = [[ +Hello World! +Details! Damage Meter Debug +Release Version: @VERSION Core Version: @CORE + +Update Thread Status: +Tick Rate: @TICKRATE +Threat Health: @TICKHEALTH +Last Tick: @TICKLAST +Next Tick In: @TICKNEXT + +Current Combat Status: +ID: @COMBATID +Container Status: @COMBATCONTAINERS +Damage Container Actors: @COMBATDAMAGEACTORS actors found + +Parser Status: +Parser Health: @PARSERHEALTH +Parser Capture Status: @PARSERCAPTURE + +Lower Instance Status (window 1): +Is Shown: @INSTANCESHOWN +Segment Status: @INSTANCESEGMENT +Damage Update Status: @INSTANCEDAMAGESTATUS + +]] + + text = text:gsub ([[@VERSION]], _detalhes.userversion) + text = text:gsub ([[@CORE]], _detalhes.realversion) + + text = text:gsub ([[@TICKRATE]], _detalhes.update_speed) + text = text:gsub ([[@TICKHEALTH]], _detalhes:TimeLeft (_detalhes.atualizador) ~= 0 and "|cFF22FF22good|r" or "|cFFFF2222bad|r") + text = text:gsub ([[@TICKLAST]], _detalhes.LastUpdateTick .. " (" .. _detalhes._tempo - _detalhes.LastUpdateTick .. " seconds ago)") + text = text:gsub ([[@TICKNEXT]], _detalhes:TimeLeft (_detalhes.atualizador)) + + text = text:gsub ([[@COMBATID]], _detalhes.combat_id) + text = text:gsub ([[@COMBATCONTAINERS]], _detalhes.tabela_vigente[1] and _detalhes.tabela_vigente[2] and _detalhes.tabela_vigente[3] and _detalhes.tabela_vigente[4] and "|cFF22FF22good|r" or "|cFFFF2222bad|r") + text = text:gsub ([[@COMBATDAMAGEACTORS]], #_detalhes.tabela_vigente[1] and _detalhes.tabela_vigente[1]._ActorTable and #_detalhes.tabela_vigente[1]._ActorTable) + + text = text:gsub ([[@PARSERHEALTH]], _detalhes.parser_frame:GetScript ("OnEvent") == _detalhes.OnParserEvent and "|cFF22FF22good|r" or "|cFFFF2222bad|r") + + local captureStr = "" + for _ , captureName in ipairs (_detalhes.capture_types) do + if (_detalhes.capture_current [captureName]) then + captureStr = captureStr .. " " .. captureName .. ": |cFF22FF22okay|r" + else + captureStr = captureStr .. " " .. captureName .. ": |cFFFF2222X|r" + end + end + text = text:gsub ([[@PARSERCAPTURE]], captureStr) + + local instance = _detalhes:GetLowerInstanceNumber() + if (instance) then + instance = _detalhes:GetInstance (instance) + end + + if (instance) then + if (instance:IsEnabled()) then + text = text:gsub ([[@INSTANCESHOWN]], "|cFF22FF22good|r") + else + text = text:gsub ([[@INSTANCESHOWN]], "|cFFFFFF22not visible|r") + end + + text = text:gsub ([[@INSTANCESEGMENT]], (instance.showing == _detalhes.tabela_vigente and "|cFF22FF22good|r" or "|cFFFFFF22isn't the current combat object|r") .. (" window segment: " .. instance:GetSegment())) + + text = text:gsub ([[@INSTANCEDAMAGESTATUS]], (_detalhes._tempo - (_detalhes.LastFullDamageUpdate or 0)) < 3 and "|cFF22FF22good|r" or "|cFFFF2222last update registered is > than 3 seconds, is there actors to show?|r") + else + text = text:gsub ([[@INSTANCESHOWN]], "|cFFFFFF22not found|r") + text = text:gsub ([[@INSTANCESEGMENT]], "|cFFFFFF22not found|r") + text = text:gsub ([[@INSTANCEDAMAGESTATUS]], "|cFFFFFF22not found|r") + + end + + _detalhes.DebugWindow.TextBox:SetText (text) + + _detalhes.DebugWindow:Show() end --> debug combat log @@ -1302,6 +1391,96 @@ function SlashCmdList.DETAILS (msg, editbox) instance:InstanceAlert ("Boss Defeated! Show Ranking", icon, 10, func, true) + elseif (msg == "merge") then + + --> at this point, details! should not be in combat + if (_detalhes.in_combat) then + _detalhes:Msg ("already in combat, closing current segment.") + _detalhes:SairDoCombate() + end + + --> create a new combat to be the overall for the mythic run + _detalhes:EntrarEmCombate() + + --> get the current combat just created and the table with all past segments + local newCombat = _detalhes:GetCurrentCombat() + local segmentHistory = _detalhes:GetCombatSegments() + local totalTime = 0 + local startDate, endDate = "", "" + local lastSegment + local segmentsAdded = 0 + + --> add all boss segments from this run to this new segment + for i = 1, 25 do + local pastCombat = segmentHistory [i] + if (pastCombat and pastCombat ~= newCombat) then + newCombat = newCombat + pastCombat + totalTime = totalTime + pastCombat:GetCombatTime() + if (i == 1) then + local _, endedDate = pastCombat:GetDate() + endDate = endedDate + end + lastSegment = pastCombat + segmentsAdded = segmentsAdded + 1 + end + end + + if (lastSegment) then + startDate = lastSegment:GetDate() + end + + _detalhes:Msg ("done merging " .. segmentsAdded .. " segments.") + + --[[ --mythic+ debug + --> tag the segment as mythic overall segment + newCombat.is_mythic_dungeon = { + MapID = _detalhes.MythicPlus.Dungeon, + StartedAt = _detalhes.MythicPlus.StartedAt, --the start of the run + EndedAt = _detalhes.MythicPlus.EndedAt, --the end of the run + SegmentID = "overall", --segment number within the dungeon + --EncounterID = encounterID, + --EncounterName = encounterName, + RunID = _detalhes.MythicPlus.RunID, + OverallSegment = true, + } + --]] + + --> set some data + newCombat:SetStartTime (GetTime() - totalTime) + newCombat:SetEndTime (GetTime()) + + newCombat.data_inicio = startDate + newCombat.data_fim = endDate + + --> immediatly finishes the segment just started + _detalhes:SairDoCombate() + + --> cleanup the past segments table + for i = 25, 1, -1 do + local pastCombat = segmentHistory [i] + if (pastCombat and pastCombat ~= newCombat) then + wipe (pastCombat) + segmentHistory [i] = nil + end + end + + --> clear memory + collectgarbage() + + _detalhes:InstanciaCallFunction (_detalhes.gump.Fade, "in", nil, "barras") + _detalhes:InstanciaCallFunction (_detalhes.AtualizaSegmentos) + _detalhes:InstanciaCallFunction (_detalhes.AtualizaSoloMode_AfertReset) + _detalhes:InstanciaCallFunction (_detalhes.ResetaGump) + _detalhes:AtualizaGumpPrincipal (-1, true) + + elseif (msg == "record") then + + + _detalhes.ScheduleLoadStorage() + _detalhes.TellDamageRecord = C_Timer.NewTimer (0.6, _detalhes.PrintEncounterRecord) + _detalhes.TellDamageRecord.Boss = 2032 + _detalhes.TellDamageRecord.Diff = 16 + elseif (msg == "recordtest") then local f = DetailsRecordFrameAnimation diff --git a/functions/spells.lua b/functions/spells.lua index daea4eb0..6f5afd2e 100644 --- a/functions/spells.lua +++ b/functions/spells.lua @@ -502,6 +502,56 @@ do } + _detalhes.SpecIDToClass = { + [577] = "DEMONHUNTER", -- Havoc Demon Hunter + [581] = "DEMONHUNTER", -- Vengeance Demon Hunter + + [252] = "DEATHKNIGHT", -- Unholy Death Knight + [251] = "DEATHKNIGHT", -- Frost Death Knight + [250] = "DEATHKNIGHT", -- Blood Death Knight + + [102] = "DRUID", -- Balance Druid + [103] = "DRUID", -- Feral Druid + [104] = "DRUID", -- Guardian Druid + [105] = "DRUID", -- Restoration Druid + + [253] = "HUNTER", -- Beast Mastery Hunter + [254] = "HUNTER", -- Marksmanship Hunter + [255] = "HUNTER", -- Survival Hunter + + [62] = "MAGE", -- Arcane Mage + [63] = "MAGE", -- Fire Mage + [64] = "MAGE", -- Frost Mage + + [268] = "MONK", -- Brewmaster Monk + [269] = "MONK", -- Windwalker Monk + [270] = "MONK", -- Mistweaver Monk + + [65] = "PALADIN", -- Holy Paladin + [66] = "PALADIN", -- Protection Paladin + [70] = "PALADIN", -- Retribution Paladin + + [256] = "PRIEST", -- Discipline Priest + [257] = "PRIEST", -- Holy Priest + [258] = "PRIEST", -- Shadow Priest + + [259] = "ROGUE", -- Assassination Rogue + [260] = "ROGUE", -- Outlaw Rogue + [261] = "ROGUE", -- Subtlety Rogue + + [262] = "SHAMAN", -- Elemental Shaman + [263] = "SHAMAN", -- Enhancement Shaman + [264] = "SHAMAN", -- Restoration Shaman + + [265] = "WARLOCK", -- Affliction Warlock + [266] = "WARLOCK", -- Demonology Warlock + [267] = "WARLOCK", -- Destruction Warlock + + [71] = "WARRIOR", -- Arms Warrior + [72] = "WARRIOR", -- Fury Warrior + [73] = "WARRIOR", -- Protection Warrior + } + _detalhes.ClassSpellList = { --death knight diff --git a/gumps/janela_info.lua b/gumps/janela_info.lua index e73102fe..cc0f0c9d 100644 --- a/gumps/janela_info.lua +++ b/gumps/janela_info.lua @@ -1504,6 +1504,42 @@ function gump:CriaJanelaInfo() este_gump.apoio_icone_direito:SetHeight (13) + este_gump.topright_text1 = este_gump:CreateFontString (nil, "overlay", "GameFontNormal") + este_gump.topright_text1:SetPoint ("bottomright", este_gump, "topright", -18 - (94 * (1-1)), -36) + este_gump.topright_text1:SetJustifyH ("right") + _detalhes.gump:SetFontSize (este_gump.topright_text1, 10) + + este_gump.topright_text2 = este_gump:CreateFontString (nil, "overlay", "GameFontNormal") + este_gump.topright_text2:SetPoint ("bottomright", este_gump, "topright", -18 - (94 * (1-1)), -48) + este_gump.topright_text2:SetJustifyH ("right") + _detalhes.gump:SetFontSize (este_gump.topright_text2, 10) + + function este_gump:SetTopRightTexts (text1, text2, size, color, font) + if (text1) then + este_gump.topright_text1:SetText (text1) + else + este_gump.topright_text1:SetText ("") + end + if (text2) then + este_gump.topright_text2:SetText (text2) + else + este_gump.topright_text2:SetText ("") + end + + if (size and type (size) == "number") then + _detalhes.gump:SetFontSize (este_gump.topright_text1, size) + _detalhes.gump:SetFontSize (este_gump.topright_text2, size) + end + if (color) then + _detalhes.gump:SetFontColor (este_gump.topright_text1, color) + _detalhes.gump:SetFontColor (este_gump.topright_text2, color) + end + if (font) then + _detalhes.gump:SetFontFace (este_gump.topright_text1, font) + _detalhes.gump:SetFontFace (este_gump.topright_text2, font) + end + end + ------------------------------------------------- @@ -2365,6 +2401,11 @@ function gump:CriaJanelaInfo() --icon - name - applications - refreshes - uptime -- + local wa_button = function (self, mouseButton, spellID, auraType) + local spellName, _, spellIcon = GetSpellInfo (spellID) + _detalhes:OpenAuraPanel (spellID, spellName, spellIcon, nil, auraType == "BUFF" and 4 or 2, 1) + end + local scroll_createline = function (self, index) local line = CreateFrame ("button", "$parentLine" .. index, self) line:SetPoint ("topleft", self, "topleft", 0, -((index-1)*(scroll_line_height+1))) @@ -2382,6 +2423,10 @@ function gump:CriaJanelaInfo() local uptime = line:CreateFontString ("$parentName", "overlay", "GameFontNormal") local apply = line:CreateFontString ("$parentName", "overlay", "GameFontNormal") local refresh = line:CreateFontString ("$parentName", "overlay", "GameFontNormal") + + local waButton = DF:CreateButton (line, wa_button, 18, 18) + waButton:SetIcon ([[Interface\AddOns\WeakAuras\Media\Textures\icon]]) + DF:SetFontSize (name, text_size) DF:SetFontSize (uptime, text_size) DF:SetFontSize (apply, text_size) @@ -2391,18 +2436,23 @@ function gump:CriaJanelaInfo() name:SetPoint ("left", icon, "right", 2, 0) uptime:SetPoint ("left", line, "left", 186, 0) apply:SetPoint ("left", line, "left", 260, 0) - refresh:SetPoint ("left", line, "left", 310, 0) - + refresh:SetPoint ("left", line, "left", 290, 0) + waButton:SetPoint ("left", line, "left", 322, 0) + line.Icon = icon line.Name = name line.Uptime = uptime line.Apply = apply line.Refresh = refresh + line.WaButton = waButton name:SetJustifyH ("left") uptime:SetJustifyH ("left") - apply:SetJustifyH ("left") - refresh:SetJustifyH ("left") + + apply:SetJustifyH ("center") + refresh:SetJustifyH ("center") + apply:SetWidth (20) + refresh:SetWidth (20) return line end @@ -2410,6 +2460,9 @@ function gump:CriaJanelaInfo() local line_bg_color = {{1, 1, 1, .1}, {1, 1, 1, 0}} local scroll_buff_refresh = function (self, data, offset, total_lines) + + local haveWA = _G.WeakAuras + for i = 1, total_lines do local index = i + offset local aura = data [index] @@ -2423,6 +2476,12 @@ function gump:CriaJanelaInfo() line.Apply:SetText (aura [4]) line.Refresh:SetText (aura [5]) + if (haveWA) then + line.WaButton:SetClickFunction (wa_button, aura.spellID, line.AuraType) + else + line.WaButton:Disable() + end + if (i%2 == 0) then line:SetBackdropColor (unpack (line_bg_color [1])) line.BackgroundColor = line_bg_color [1] @@ -2434,19 +2493,43 @@ function gump:CriaJanelaInfo() end end + local create_titledesc_frame = function (anchorWidget, desc) + local f = CreateFrame ("frame", nil, frame) + f:SetSize (40, 20) + f:SetPoint ("center", anchorWidget, "center") + f:SetScript ("OnEnter", function() + GameTooltip:SetOwner (f, "ANCHOR_TOPRIGHT") + GameTooltip:AddLine (desc) + GameTooltip:Show() + end) + f:SetScript ("OnLeave", function() + GameTooltip:Hide() + end) + return f + end + local buffLabel = DF:CreateLabel (frame, "Buff Name") buffLabel:SetPoint (6, -10) local uptimeLabel = DF:CreateLabel (frame, "Uptime") uptimeLabel:SetPoint (200, -10) - local appliedLabel = DF:CreateLabel (frame, "Applied") - appliedLabel:SetPoint (250, -10) - local refreshedLabel = DF:CreateLabel (frame, "Refreshed") - refreshedLabel:SetPoint (300, -10) + + local appliedLabel = DF:CreateLabel (frame, "A") + appliedLabel:SetPoint (270, -10) + create_titledesc_frame (appliedLabel.widget, "applications") + + local refreshedLabel = DF:CreateLabel (frame, "R") + refreshedLabel:SetPoint (301, -10) + create_titledesc_frame (refreshedLabel.widget, "refreshes") + + local waLabel = DF:CreateLabel (frame, "WA") + waLabel:SetPoint (330, -10) + create_titledesc_frame (waLabel.widget, "create weak aura") local buffScroll = DF:CreateScrollBox (frame, "$parentBuffUptimeScroll", scroll_buff_refresh, {}, scroll_width, 340, scroll_line_amount, scroll_line_height) buffScroll:SetPoint ("topleft", frame, "topleft", 5, -30) for i = 1, scroll_line_amount do - buffScroll:CreateLine (scroll_createline) + local line = buffScroll:CreateLine (scroll_createline) + line.AuraType = "BUFF" end buffScroll:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16}) buffScroll:SetBackdropColor (0, 0, 0, .4) @@ -2460,15 +2543,25 @@ function gump:CriaJanelaInfo() debuffLabel:SetPoint (406, -10) local uptimeLabel2 = DF:CreateLabel (frame, "Uptime") uptimeLabel2:SetPoint (600, -10) - local appliedLabel2 = DF:CreateLabel (frame, "Applied") - appliedLabel2:SetPoint (650, -10) - local refreshedLabel2 = DF:CreateLabel (frame, "Refreshed") - refreshedLabel2:SetPoint (700, -10) + + local appliedLabel2 = DF:CreateLabel (frame, "A") + appliedLabel2:SetPoint (668, -10) + create_titledesc_frame (appliedLabel2.widget, "applications") + + local refreshedLabel2 = DF:CreateLabel (frame, "R") + refreshedLabel2:SetPoint (699, -10) + create_titledesc_frame (refreshedLabel2.widget, "refreshes") + + local waLabel2 = DF:CreateLabel (frame, "WA") + waLabel2:SetPoint (728, -10) + create_titledesc_frame (waLabel2.widget, "create weak aura") + local debuffScroll = DF:CreateScrollBox (frame, "$parentDebuffUptimeScroll", scroll_buff_refresh, {}, scroll_width, 340, scroll_line_amount, scroll_line_height) debuffScroll:SetPoint ("topleft", frame, "topleft", 405, -30) for i = 1, scroll_line_amount do - debuffScroll:CreateLine (scroll_createline) + local line = debuffScroll:CreateLine (scroll_createline) + line.AuraType = "DEBUFF" end debuffScroll:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16}) debuffScroll:SetBackdropColor (0, 0, 0, .4) @@ -4502,7 +4595,11 @@ function gump:CriaJanelaInfo() tab:Show() amt_positive = amt_positive + 1 - tab:SetPoint ("BOTTOMLEFT", info.container_barras, "TOPLEFT", 490 - (94 * (amt_positive-1)), 1) + + --tab:SetPoint ("BOTTOMLEFT", info.container_barras, "TOPLEFT", 490 - (94 * (amt_positive-1)), 1) --left to right + tab:ClearAllPoints() + tab:SetPoint ("bottomright", info, "topright", -17 - (94 * (amt_positive-1)), -74) --right to left + tab:SetAlpha (0.8) else tab.frame:Hide() @@ -4551,6 +4648,8 @@ function _detalhes:CreatePlayerDetailsTab (tabname, localized_name, condition, f newtab:SetWidth (100) newtab.middleTexture:SetWidth (70) + + newtab:SetText (localized_name) _G ["DetailsInfoWindowTab" .. index .. "Text"]:SetWidth (70) @@ -4606,7 +4705,7 @@ function _detalhes:CreatePlayerDetailsTab (tabname, localized_name, condition, f --f:Set - newtab.frame:SetPoint ("TOPLEFT", info.container_barras, "TOPLEFT", 0, 0) + newtab.frame:SetPoint ("TOPLEFT", info.container_barras, "TOPLEFT", 0, 2) newtab.frame:SetPoint ("bottomright", info, "bottomright", -3, 3) --newtab.frame:SetPoint ("TOPLEFT", info, "TOPLEFT", 19, -76) newtab.frame:SetSize (569, 274) diff --git a/gumps/janela_options.lua b/gumps/janela_options.lua index 7e25763e..a07ae5d1 100644 --- a/gumps/janela_options.lua +++ b/gumps/janela_options.lua @@ -4,7 +4,7 @@ search for "~number" without the quotes to quick access the page: 1 - general - 2 - combat + 2 - combat / pvp pve 3 - skin 4 - row settings 5 - row texts @@ -4306,10 +4306,49 @@ function window:CreateFrame2() window:CreateLineBackground2 (frame2, "DeathLogLimitDropdown", "DeathLogLimitLabel", Loc ["STRING_OPTIONS_DEATHLIMIT_DESC"]) + --> damage taken always on everything + g:NewLabel (frame2, _, "$parentDamageTakenEverythingLabel", "DamageTakenEverythingLabel", Loc ["STRING_OPTIONS_DTAKEN_EVERYTHING"], "GameFontHighlightLeft") + g:NewSwitch (frame2, _, "$parentDamageTakenEverythingSlider", "DamageTakenEverythingSlider", 60, 20, _, _, _detalhes.damage_taken_everything, nil, nil, nil, nil, options_switch_template) + + frame2.DamageTakenEverythingSlider:SetPoint ("left", frame2.DamageTakenEverythingLabel, "right", 2) + frame2.DamageTakenEverythingSlider:SetAsCheckBox() + frame2.DamageTakenEverythingSlider.OnSwitch = function (_, _, value) + _detalhes.damage_taken_everything = value + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame2, "DamageTakenEverythingSlider", "DamageTakenEverythingLabel", Loc ["STRING_OPTIONS_DTAKEN_EVERYTHING_DESC"]) + + --> deathlog healing done threshold + g:NewLabel (frame2, _, "$parentDeathLogHealingThresholdLabel", "DeathLogHealingThresholdLabel", Loc ["STRING_OPTIONS_DEATHLOG_MINHEALING"], "GameFontHighlightLeft") + + local s = g:NewSlider (frame2, _, "$parentDeathLogHealingThresholdSlider", "DeathLogHealingThresholdSlider", SLIDER_WIDTH, SLIDER_HEIGHT, 0, 100000, 1, _detalhes.deathlog_healingdone_min, nil, nil, nil, options_slider_template) + + frame2.DeathLogHealingThresholdSlider:SetPoint ("left", frame2.DeathLogHealingThresholdLabel, "right", 2, -1) + frame2.DeathLogHealingThresholdSlider:SetHook ("OnValueChange", function (self, _, amount) --> slider, fixedValue, sliderValue + _detalhes.deathlog_healingdone_min = amount + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end) + + window:CreateLineBackground2 (frame2, "DeathLogHealingThresholdSlider", "DeathLogHealingThresholdLabel", Loc ["STRING_OPTIONS_DEATHLOG_MINHEALING_DESC"]) + + --> always show players + g:NewLabel (frame2, _, "$parentAlwaysShowPlayersLabel", "AlwaysShowPlayersLabel", Loc ["STRING_OPTIONS_ALWAYSSHOWPLAYERS"], "GameFontHighlightLeft") + -- + g:NewSwitch (frame2, _, "$parentAlwaysShowPlayersSlider", "AlwaysShowPlayersSlider", 60, 20, _, _, _detalhes.all_players_are_group, nil, nil, nil, nil, options_switch_template) + frame2.AlwaysShowPlayersSlider:SetPoint ("left", frame2.AlwaysShowPlayersLabel, "right", 2, 0) + frame2.AlwaysShowPlayersSlider:SetAsCheckBox() + frame2.AlwaysShowPlayersSlider.OnSwitch = function (self, _, amount) --> slider, fixedValue, sliderValue + _detalhes.all_players_are_group = amount + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end + + window:CreateLineBackground2 (frame2, "AlwaysShowPlayersSlider", "AlwaysShowPlayersLabel", Loc ["STRING_OPTIONS_ALWAYSSHOWPLAYERS_DESC"]) + --> Overall Data g:NewLabel (frame2, _, "$parentOverallDataAnchor", "OverallDataLabel", Loc ["STRING_OPTIONS_OVERALL_ANCHOR"], "GameFontNormal") - --raid boss + --raid boss g:NewLabel (frame2, _, "$parentOverallDataRaidBossLabel", "OverallDataRaidBossLabel", Loc ["STRING_OPTIONS_OVERALL_RAIDBOSS"], "GameFontHighlightLeft") -- g:NewSwitch (frame2, _, "$parentOverallDataRaidBossSlider", "OverallDataRaidBossSlider", 60, 20, _, _, false, nil, nil, nil, nil, options_switch_template) @@ -4327,7 +4366,7 @@ function window:CreateFrame2() -- window:CreateLineBackground2 (frame2, "OverallDataRaidBossSlider", "OverallDataRaidBossLabel", Loc ["STRING_OPTIONS_OVERALL_RAIDBOSS_DESC"]) - --raid cleanup + --raid cleanup g:NewLabel (frame2, _, "$parentOverallDataRaidCleaupLabel", "OverallDataRaidCleaupLabel", Loc ["STRING_OPTIONS_OVERALL_RAIDCLEAN"], "GameFontHighlightLeft") -- local raid_cleanup = g:NewSwitch (frame2, _, "$parentOverallDataRaidCleaupSlider", "OverallDataRaidCleaupSlider", 60, 20, _, _, false, nil, nil, nil, nil, options_switch_template) @@ -4345,7 +4384,7 @@ function window:CreateFrame2() -- window:CreateLineBackground2 (frame2, "OverallDataRaidCleaupSlider", "OverallDataRaidCleaupLabel", Loc ["STRING_OPTIONS_OVERALL_RAIDCLEAN_DESC"]) - --dungeon boss + --dungeon boss g:NewLabel (frame2, _, "$parentOverallDataDungeonBossLabel", "OverallDataDungeonBossLabel", Loc ["STRING_OPTIONS_OVERALL_DUNGEONBOSS"], "GameFontHighlightLeft") -- g:NewSwitch (frame2, _, "$parentOverallDataDungeonBossSlider", "OverallDataDungeonBossSlider", 60, 20, _, _, false, nil, nil, nil, nil, options_switch_template) @@ -4363,7 +4402,7 @@ function window:CreateFrame2() -- window:CreateLineBackground2 (frame2, "OverallDataDungeonBossSlider", "OverallDataDungeonBossLabel", Loc ["STRING_OPTIONS_OVERALL_DUNGEONBOSS_DESC"]) - --dungeon cleanup + --dungeon cleanup g:NewLabel (frame2, _, "$parentOverallDataDungeonCleaupLabel", "OverallDataDungeonCleaupLabel", Loc ["STRING_OPTIONS_OVERALL_DUNGEONCLEAN"], "GameFontHighlightLeft") -- g:NewSwitch (frame2, _, "$parentOverallDataDungeonCleaupSlider", "OverallDataDungeonCleaupSlider", 60, 20, _, _, false, nil, nil, nil, nil, options_switch_template) @@ -4381,7 +4420,7 @@ function window:CreateFrame2() -- window:CreateLineBackground2 (frame2, "OverallDataDungeonCleaupSlider", "OverallDataDungeonCleaupLabel", Loc ["STRING_OPTIONS_OVERALL_DUNGEONCLEAN_DESC"]) - --everything + --everything g:NewLabel (frame2, _, "$parentOverallDataAllLabel", "OverallDataAllLabel", Loc ["STRING_OPTIONS_OVERALL_ALL"], "GameFontHighlightLeft") -- g:NewSwitch (frame2, _, "$parentOverallDataAllSlider", "OverallDataAllSlider", 60, 20, _, _, false, nil, nil, nil, nil, options_switch_template) @@ -4420,7 +4459,7 @@ function window:CreateFrame2() -- window:CreateLineBackground2 (frame2, "OverallDataAllSlider", "OverallDataAllLabel", Loc ["STRING_OPTIONS_OVERALL_ALL_DESC"]) - --erase on new boss + --erase on new boss g:NewLabel (frame2, _, "$parentOverallNewBossLabel", "OverallNewBossLabel", Loc ["STRING_OPTIONS_OVERALL_NEWBOSS"], "GameFontHighlightLeft") -- g:NewSwitch (frame2, _, "$parentOverallNewBossSlider", "OverallNewBossSlider", 60, 20, _, _, false, nil, nil, nil, nil, options_switch_template) @@ -4434,8 +4473,8 @@ function window:CreateFrame2() -- window:CreateLineBackground2 (frame2, "OverallNewBossSlider", "OverallNewBossLabel", Loc ["STRING_OPTIONS_OVERALL_NEWBOSS_DESC"]) - --erase on challenge mode - g:NewLabel (frame2, _, "$parentOverallNewChallengeLabel", "OverallNewChallengeLabel", Loc ["STRING_OPTIONS_OVERALL_CHALLENGE"], "GameFontHighlightLeft") + --erase on new mythic+ dungeon + g:NewLabel (frame2, _, "$parentOverallNewChallengeLabel", "OverallNewChallengeLabel", Loc ["STRING_OPTIONS_OVERALL_MYTHICPLUS"], "GameFontHighlightLeft") -- g:NewSwitch (frame2, _, "$parentOverallNewChallengeSlider", "OverallNewChallengeSlider", 60, 20, _, _, false, nil, nil, nil, nil, options_switch_template) frame2.OverallNewChallengeSlider:SetPoint ("left", frame2.OverallNewChallengeLabel, "right", 2, 0) @@ -4446,9 +4485,9 @@ function window:CreateFrame2() _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) end -- - window:CreateLineBackground2 (frame2, "OverallNewChallengeSlider", "OverallNewChallengeLabel", Loc ["STRING_OPTIONS_OVERALL_CHALLENGE_DESC"]) + window:CreateLineBackground2 (frame2, "OverallNewChallengeSlider", "OverallNewChallengeLabel", Loc ["STRING_OPTIONS_OVERALL_MYTHICPLUS_DESC"]) - --erase on logout overall_clear_logout + --erase on logout overall_clear_logout g:NewLabel (frame2, _, "$parentOverallOnLogoutLabel", "OverallOnLogoutLabel", Loc ["STRING_OPTIONS_OVERALL_LOGOFF"], "GameFontHighlightLeft") -- g:NewSwitch (frame2, _, "$parentOverallOnLogoutSlider", "OverallOnLogoutSlider", 60, 20, _, _, false, nil, nil, nil, nil, options_switch_template) @@ -4474,7 +4513,7 @@ function window:CreateFrame2() end window:CreateLineBackground2 (frame2, "RemoteParserSlider", "RemoteParserLabel", Loc ["STRING_OPTIONS_BG_REMOTE_PARSER_DESC"]) - --> show all + --> show all g:NewLabel (frame2, _, "$parentShowAllLabel", "ShowAllLabel", Loc ["STRING_OPTIONS_BG_ALL_ALLY"], "GameFontHighlightLeft") g:NewSwitch (frame2, _, "$parentShowAllSlider", "ShowAllSlider", 60, 20, _, _, _detalhes.pvp_as_group, nil, nil, nil, nil, options_switch_template) frame2.ShowAllSlider:SetPoint ("left", frame2.ShowAllLabel, "right", 2) @@ -4486,18 +4525,7 @@ function window:CreateFrame2() ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - --> damage taken always on everything - g:NewLabel (frame2, _, "$parentDamageTakenEverythingLabel", "DamageTakenEverythingLabel", Loc ["STRING_OPTIONS_DTAKEN_EVERYTHING"], "GameFontHighlightLeft") - g:NewSwitch (frame2, _, "$parentDamageTakenEverythingSlider", "DamageTakenEverythingSlider", 60, 20, _, _, _detalhes.damage_taken_everything, nil, nil, nil, nil, options_switch_template) - frame2.DamageTakenEverythingSlider:SetPoint ("left", frame2.DamageTakenEverythingLabel, "right", 2) - frame2.DamageTakenEverythingSlider:SetAsCheckBox() - frame2.DamageTakenEverythingSlider.OnSwitch = function (_, _, value) - _detalhes.damage_taken_everything = value - _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) - end - - window:CreateLineBackground2 (frame2, "DamageTakenEverythingSlider", "DamageTakenEverythingLabel", Loc ["STRING_OPTIONS_DTAKEN_EVERYTHING_DESC"]) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ @@ -4516,11 +4544,11 @@ function window:CreateFrame2() local left_side = { {"GeneralAnchorLabel", 1, true}, - {"fragsPvpLabel", 2}, - --{"EraseChartDataLabel", 3}, - --{"timetypeLabel", 4, true}, - {"DeathLogLimitLabel", 5, }, - {"DamageTakenEverythingLabel", 6, true}, + {"fragsPvpLabel"}, + {"DeathLogLimitLabel"}, + {"DeathLogHealingThresholdLabel"}, + {"DamageTakenEverythingLabel"}, + {"AlwaysShowPlayersLabel"}, {"BattlegroundAnchorLabel", 10, true}, {"RemoteParserLabel", 11}, @@ -10989,6 +11017,12 @@ end --> if not window --damage taken advanced _G.DetailsOptionsWindow2DamageTakenEverythingSlider.MyObject:SetValue (_detalhes.damage_taken_everything) + --healing done mim on death log + _G.DetailsOptionsWindow2DeathLogHealingThresholdSlider.MyObject:SetValue (_detalhes.deathlog_healingdone_min) + + --always show all players (consider they as in group) + _G.DetailsOptionsWindow2AlwaysShowPlayersSlider.MyObject:SetValue (_detalhes.all_players_are_group) + --> window 3 local skin = editing_instance.skin diff --git a/gumps/janela_principal.lua b/gumps/janela_principal.lua index 787f83ea..48c322de 100644 --- a/gumps/janela_principal.lua +++ b/gumps/janela_principal.lua @@ -2121,6 +2121,7 @@ local set_bar_value = function (self, value) end end +-- ~talent ~icon local icon_frame_on_enter = function (self) local actor = self.row.minha_tabela @@ -2145,6 +2146,8 @@ local icon_frame_on_enter = function (self) else + --> is a normal actor + local serial = actor.serial local name = actor:name() local class = actor:class() @@ -2178,7 +2181,7 @@ local icon_frame_on_enter = function (self) else GameCooltip:AddIcon ([[Interface\GossipFrame\IncompleteQuestIcon]], 1, 2, icon_size, icon_size) end - _detalhes:AddTooltipHeaderStatusbar (r, g, b, 0.6) + _detalhes:AddTooltipHeaderStatusbar() local talent_string = "" if (talents) then @@ -2200,40 +2203,55 @@ local icon_frame_on_enter = function (self) _detalhes:AddTooltipBackgroundStatusbar() got_info = true elseif (got_info) then - GameCooltip:AddLine (TALENTS .. ":", Loc ["STRING_QUERY_INSPECT_TALENTS"]) --> Loc from GlobalStrings.lua + GameCooltip:AddLine (TALENTS .. ":", Loc ["STRING_QUERY_INSPECT_REFRESH"]) --> Loc from GlobalStrings.lua + _detalhes:AddTooltipBackgroundStatusbar() end GameCooltip:SetOption ("StatusBarTexture", [[Interface\AddOns\Details\images\bar_skyline]]) GameCooltip:SetOption ("MinButtonHeight", 15) GameCooltip:SetOption ("IgnoreButtonAutoHeight", false) + local height = 52 if (not got_info) then - --GameCooltip:AddLine (" ") - --GameCooltip:AddLine ("Click to retrive item level and talents.", nil, 1, "orange") GameCooltip:AddLine (Loc ["STRING_QUERY_INSPECT"], nil, 1, "orange") GameCooltip:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 12, icon_size, 8/512, 70/512, 224/512, 306/512) - GameCooltip:SetOption ("FixedHeight", 42) - else - GameCooltip:SetOption ("FixedHeight", 52) + height = 42 + end + + local combat = instance:GetShowingCombat() + local diff = combat:GetDifficulty() + local attribute, subattribute = instance:GetDisplay() + + --> check if is a raid encounter and if is heroic or mythic + if (diff and (diff == 15 or diff == 16) and (attribute == 1 or attribute == 2)) then + local db = _detalhes.OpenStorage() + if (db) then + local bestRank, encounterTable = _detalhes.storage:GetBestFromPlayer (diff, combat:GetBossInfo().id, attribute == 1 and "damage" or "healing", name, true) + if (bestRank) then + --GameCooltip:AddLine ("") + + --> discover which are the player position in the guild rank + local playerTable, onEncounter, rankPosition = _detalhes.storage:GetPlayerGuildRank (diff, combat:GetBossInfo().id, attribute == 1 and "damage" or "healing", name, true) + + --" .. floor (bestRank[2] or 0) .. " ilvl" .. " | + GameCooltip:AddLine ("Best Score:", _detalhes:ToK2 ((bestRank[1] or 0) / encounterTable.elapsed) .. " [|cFFFFFF00Rank: " .. (rankPosition or "#") .. "|r]", 1, "white") + _detalhes:AddTooltipBackgroundStatusbar() + + GameCooltip:AddLine ("|TInterface\\TUTORIALFRAME\\UI-TUTORIAL-FRAME:14:12:0:1:512:512:8:70:224:306|t Open Rank", "|TInterface\\TUTORIALFRAME\\UI-TUTORIAL-FRAME:14:12:0:1:512:512:8:70:328:409|t Refresh Talents", 1, "white", "white") + _detalhes:AddTooltipBackgroundStatusbar() + + --GameCooltip:AddLine ("On: " .. (encounterTable.date:gsub (".*%s", "")), , 1, "orange") + --_detalhes:AddTooltipHeaderStatusbar() + if (not got_info) then + height = height + 25 + else + height = height + 31 + end + end + end end - --GameCooltip:AddLine ("Class:", LOCALIZED_CLASS_NAMES_MALE [class]) - --_detalhes:AddTooltipBackgroundStatusbar() - - local damage = instance.showing (1, name) - local healing = instance.showing (2, name) - --GameCooltip:AddLine ("Damage:", _detalhes:ToK2 (damage and damage.total or 0)) - --_detalhes:AddTooltipBackgroundStatusbar() - --GameCooltip:AddLine ("Healing:", _detalhes:ToK2 (healing and healing.total or 0)) - --_detalhes:AddTooltipBackgroundStatusbar() - - -- - --GameCooltip:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 12, icon_size, 8/512, 70/512, 224/512, 306/512) - --_detalhes:AddTooltipBackgroundStatusbar() - - - --GameCooltip:SetOption ("FixedHeight", 114) - + GameCooltip:SetOption ("FixedHeight", height) GameCooltip:ShowCooltip() @@ -2345,10 +2363,32 @@ local icon_frame_on_click_down = function (self) self:GetParent():GetParent().icone_classe:SetPoint ("left", self:GetParent():GetParent(), "left", 1, -1) end -local icon_frame_on_click_up = function (self) +local icon_frame_on_click_up = function (self, button) self:GetParent():GetParent().icone_classe:SetPoint ("left", self:GetParent():GetParent(), "left") + if (button == "LeftButton") then + --> open the rank panel + local instance = _detalhes:GetInstance (self.row.instance_id) + if (instance) then + local attribute, subattribute = instance:GetDisplay() + local combat = instance:GetShowingCombat() + local diff = combat:GetDifficulty() + local bossInfo = combat:GetBossInfo() + + if (attribute == 1 or attribute == 2 and bossInfo) then --if bossInfo is nil, means the combat isn't a boss + local db = _detalhes.OpenStorage() + if (db and bossInfo.id) then + local haveData = _detalhes.storage:HaveDataForEncounter (diff, bossInfo.id, true) --attempt to index local 'bossInfo' (a nil value) + if (haveData) then + _detalhes:OpenRaidHistoryWindow (bossInfo.zone, bossInfo.id, diff, attribute == 1 and "damage" or "healing", true, 1, false, 2) + end + end + end + end + return + end + if (_detalhes.in_combat) then _detalhes:Msg (Loc ["STRING_QUERY_INSPECT_FAIL1"]) return @@ -4446,11 +4486,11 @@ end -- search key: ~row function _detalhes:InstanceRefreshRows (instancia) - + if (instancia) then self = instancia end - + if (not self.barras or not self.barras[1]) then return end @@ -4651,7 +4691,7 @@ function _detalhes:InstanceRefreshRows (instancia) if (is_mirror) then row.right_to_left_texture:Show() - else + else row.right_to_left_texture:Hide() end @@ -4660,8 +4700,10 @@ function _detalhes:InstanceRefreshRows (instancia) row.textura:SetVertexColor (texture_r, texture_g, texture_b, alpha) row.right_to_left_texture:SetVertexColor (texture_r, texture_g, texture_b, alpha) else + --automatically color the bar by the actor class + --forcing alpha 1 instead of use the alpha from the fixed color local r, g, b = row.textura:GetVertexColor() - row.textura:SetVertexColor (r, g, b, alpha) + row.textura:SetVertexColor (r, g, b, 1) --alpha end --> text class color: if true color changes on the fly through class refresh @@ -5832,6 +5874,10 @@ local segments_common_tex, segments_common_color = {0.5078125, 0.1171875, 0.0175 local unknown_boss_tex, unknown_boss_color = {0.14453125, 0.9296875, 0.2625, 0.6546875}, {1, 1, 1, 0.5} local party_line_color = {170/255, 167/255, 255/255, 1} +local party_line_color_trash = {130/255, 130/255, 155/255, 1} +local party_line_color2 = {210/255, 200/255, 255/255, 1} +local party_line_color2_trash = {110/255, 110/255, 155/255, 1} + local party_wallpaper_tex, party_wallpaper_color, raid_wallpaper_tex = {0.09, 0.698125, 0, 0.833984375}, {1, 1, 1, 0.5}, {33/512, 361/512, 45/512, 295/512} local segments_wallpaper_color = {1, 1, 1, 0.5} @@ -5925,6 +5971,10 @@ function _detalhes:GetSegmentInfo (index) end +function _detalhes:UnpackMythicDungeonInfo (t) + return t.OverallSegment, t.SegmentID, t.Level, t.EJID, t.MapID, t.ZoneName, t.EncounterID, t.EncounterName, t.StartedAt, t.EndedAt, t.RunID +end + local segments_used = 0 local segments_filled = 0 @@ -5946,7 +5996,7 @@ local build_segment_list = function (self, elapsed) CoolTip:SetFixedParameter (instancia) CoolTip:SetColor ("main", "transparent") - CoolTip:SetOption ("FixedWidthSub", 175) + CoolTip:SetOption ("FixedWidthSub", 195) CoolTip:SetOption ("RightTextWidth", 105) CoolTip:SetOption ("RightTextHeight", 12) @@ -5970,6 +6020,11 @@ local build_segment_list = function (self, elapsed) segments_used = 0 segments_filled = fill + local dungeon_color = party_line_color + local dungeon_color_trash = party_line_color_trash + local dungeon_run_id = false + + --> history table (segments container) for i = _detalhes.segments_amount, 1, -1 do if (i <= fill) then @@ -5977,17 +6032,122 @@ local build_segment_list = function (self, elapsed) local thisCombat = _detalhes.tabela_historico.tabelas [i] if (thisCombat) then local enemy = thisCombat.is_boss and thisCombat.is_boss.name + local segment_info_added = false + segments_used = segments_used + 1 --print (thisCombat.is_boss.name, thisCombat.instance_type, _detalhes:GetRaidIcon (thisCombat.is_boss.mapid), thisCombat.is_boss.ej_instance_id) + + if (thisCombat.is_mythic_dungeon_segment) then - if (thisCombat.is_boss and thisCombat.is_boss.name) then + local mythicDungeonInfo = thisCombat:GetMythicDungeonInfo() + + if (mythicDungeonInfo) then + --> is a boss, trash overall or run overall segment + + local bossInfo = thisCombat.is_boss + + local isMythicOverallSegment, segmentID, mythicLevel, EJID, mapID, zoneName, encounterID, encounterName, startedAt, endedAt, runID = _detalhes:UnpackMythicDungeonInfo (mythicDungeonInfo) + local combat_time = thisCombat:GetCombatTime() + + if (not dungeon_run_id) then + dungeon_run_id = runID + else + if (dungeon_run_id ~= runID) then + dungeon_color = dungeon_color == party_line_color and party_line_color2 or party_line_color + dungeon_color_trash = dungeon_color_trash == party_line_color_trash and party_line_color2_trash or party_line_color_trash + dungeon_run_id = runID + end + end + + --> is mythic overall + if (isMythicOverallSegment) then + --mostrar o tempo da dungeon + local totalTime = combat_time + --CoolTip:AddLine (zoneName .. " +" .. mythicLevel .. " (overall)", _detalhes.gump:IntegerToTimer (totalTime), 1, dungeon_color) + CoolTip:AddLine (zoneName .. " +" .. mythicLevel .. " (" .. Loc ["STRING_SEGMENTS_LIST_OVERALL"] .. ")", _detalhes.gump:IntegerToTimer (endedAt - startedAt), 1, dungeon_color) + CoolTip:AddIcon ([[Interface\AddOns\Details\images\icons]], "main", "left", 14, 10, 479/512, 510/512, 24/512, 51/512) + CoolTip:AddLine (zoneName .. " +" .. mythicLevel .. " (" .. Loc ["STRING_SEGMENTS_LIST_OVERALL"] .. ")", nil, 2, "white", "white") + + else + if (segmentID == "trashoverall") then + --CoolTip:AddLine (encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_TRASH"] .. ")", _detalhes.gump:IntegerToTimer (combat_time), 1, dungeon_color, "gray") + CoolTip:AddLine ((encounterName or Loc ["STRING_UNKNOW"]) .. " (" .. Loc ["STRING_SEGMENTS_LIST_TRASH"] .. ")", _detalhes.gump:IntegerToTimer (endedAt - startedAt), 1, dungeon_color, "gray") + CoolTip:AddLine ((encounterName or Loc ["STRING_UNKNOW"]) .. " (" .. Loc ["STRING_SEGMENTS_LIST_TRASH"] .. ")", nil, 2, "white", "white") + else + CoolTip:AddLine ((encounterName or Loc ["STRING_UNKNOW"]) .. " (" .. Loc ["STRING_SEGMENTS_LIST_BOSS"] .. ")", _detalhes.gump:IntegerToTimer (combat_time), 1, dungeon_color, "gray") + CoolTip:AddLine ((encounterName or Loc ["STRING_UNKNOW"]) .. " (" .. Loc ["STRING_SEGMENTS_LIST_BOSS"] .. ")", nil, 2, "white", "white") + end + CoolTip:AddIcon ([[Interface\AddOns\Details\images\icons]], "main", "left", 14, 10, 479/512, 510/512, 24/512, 51/512) + end + + local portrait = (thisCombat.is_boss and thisCombat.is_boss.bossimage) or _detalhes:GetBossPortrait (nil, nil, encounterName, EJID) + if (portrait) then + CoolTip:AddIcon (portrait, 2, "top", 128, 64, 0, 1, 0, 0.96) + end + + local backgroundImage = _detalhes:GetRaidIcon (mapID, EJID, "party") + if (backgroundImage) then + CoolTip:SetWallpaper (2, backgroundImage, {0.070, 0.695, 0.087, 0.566}, {1, 1, 1, 0.5}, true) -- party_wallpaper_tex -- {0.09, 0.698125, .17, 0.833984375} + end + + --> sub menu + local decorrido = thisCombat:GetCombatTime() + local minutos, segundos = _math_floor (decorrido/60), _math_floor (decorrido%60) + --CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_COMBATTIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") + + if (segmentID == "trashoverall") then + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_TIMEINCOMBAT"] .. ":", _detalhes.gump:IntegerToTimer (decorrido), 2, "white", "white") + local totalRealTime = endedAt - startedAt + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_TOTALTIME"] .. ":", _detalhes.gump:IntegerToTimer (endedAt - startedAt) .. " [|cFFFF3300" .. _detalhes.gump:IntegerToTimer (totalRealTime - decorrido) .. "|r]", 2, "white", "white") + elseif (isMythicOverallSegment) then + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_TIMEINCOMBAT"] .. ":", _detalhes.gump:IntegerToTimer (decorrido), 2, "white", "white") + local totalRealTime = endedAt - startedAt + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_TOTALTIME"] .. ":", _detalhes.gump:IntegerToTimer (totalRealTime) .. " [|cFFFF3300" .. _detalhes.gump:IntegerToTimer (totalRealTime - decorrido) .. "|r]", 2, "white", "white") + else + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_COMBATTIME"] .. ":", _detalhes.gump:IntegerToTimer (decorrido), 2, "white", "white") + end + + if (thisCombat.is_boss) then + CoolTip:AddLine ("", "", 2, "white", "white") + end + + CoolTip:AddLine (Loc ["STRING_SEGMENT_START"] .. ":", thisCombat.data_inicio, 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", thisCombat.data_fim or "in progress", 2, "white", "white") + + else + --> the combat has mythic dungeon tag but doesn't have a mythic dungeon table information + --> so this is a trash cleanup segment + + local trashInfo = thisCombat:GetMythicDungeonTrashInfo() + + CoolTip:AddLine (Loc ["STRING_SEGMENT_TRASH"] .. " (#" .. i .. ")", _detalhes.gump:IntegerToTimer (thisCombat:GetCombatTime()), 1, dungeon_color_trash, "gray") + --CoolTip:AddIcon ([[Interface\AddOns\Details\images\icons]], "main", "left", 16, 12, 0.02734375, 0.11328125, 0.19140625, 0.3125, "red") + CoolTip:AddIcon ([[Interface\AddOns\Details\images\icons]], "main", "left", 14, 10, 479/512, 510/512, 24/512, 51/512, nil, nil, true) + + --submenu + CoolTip:AddLine (Loc ["STRING_SEGMENT_TRASH"], nil, 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_COMBATTIME"] .. ":", _detalhes.gump:IntegerToTimer (thisCombat:GetCombatTime()), 2, "white", "white") + CoolTip:AddLine ("", "", 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENT_START"] .. ":", thisCombat.data_inicio, 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", thisCombat.data_fim or "in progress", 2, "white", "white") + + if (trashInfo) then + local backgroundImage = _detalhes:GetRaidIcon (trashInfo.MapID, trashInfo.EJID, "party") + if (backgroundImage) then + CoolTip:SetWallpaper (2, backgroundImage, party_wallpaper_tex, {1, 1, 1, 0.5}, true) + end + end + end + segment_info_added = true + + elseif (thisCombat.is_boss and thisCombat.is_boss.name) then local try_number = thisCombat.is_boss.try_number local combat_time = thisCombat:GetCombatTime() if (thisCombat.instance_type == "party") then - CoolTip:AddLine (thisCombat.is_boss.name .." (#"..i..")", _, 1, party_line_color) + CoolTip:AddLine (thisCombat.is_boss.name .." (#"..i..")", _, 1, dungeon_color) elseif (thisCombat.is_boss.killed) then if (try_number) then local m, s = _math_floor (combat_time/60), _math_floor (combat_time%60) @@ -6034,16 +6194,16 @@ local build_segment_list = function (self, elapsed) if (_detalhes.tooltip.submenu_wallpaper) then local background = _detalhes:GetRaidIcon (thisCombat.is_boss.mapid) if (background) then - CoolTip:SetWallpaper (2, background, nil, segments_wallpaper_color) + CoolTip:SetWallpaper (2, background, nil, segments_wallpaper_color, true) else local ej_id = thisCombat.is_boss.ej_instance_id if (ej_id and ej_id ~= 0) then local name, description, bgImage, buttonImage, loreImage, dungeonAreaMapID, link = EJ_GetInstanceInfo (ej_id) if (name) then if (thisCombat.instance_type == "party") then - CoolTip:SetWallpaper (2, bgImage, party_wallpaper_tex, party_wallpaper_color) + CoolTip:SetWallpaper (2, bgImage, party_wallpaper_tex, party_wallpaper_color, true) else - CoolTip:SetWallpaper (2, loreImage, raid_wallpaper_tex, party_wallpaper_color) + CoolTip:SetWallpaper (2, loreImage, raid_wallpaper_tex, party_wallpaper_color, true) end end else @@ -6063,7 +6223,7 @@ local build_segment_list = function (self, elapsed) if (_detalhes.tooltip.submenu_wallpaper) then local file, coords = _detalhes:GetBattlegroundInfo (thisCombat.is_pvp.mapid) if (file) then - CoolTip:SetWallpaper (2, "Interface\\Glues\\LOADINGSCREENS\\" .. file, coords, empty_segment_color) + CoolTip:SetWallpaper (2, "Interface\\Glues\\LOADINGSCREENS\\" .. file, coords, empty_segment_color, true) end else --> wallpaper = main window @@ -6078,7 +6238,7 @@ local build_segment_list = function (self, elapsed) if (_detalhes.tooltip.submenu_wallpaper) then local file, coords = _detalhes:GetArenaInfo (thisCombat.is_arena.mapid) if (file) then - CoolTip:SetWallpaper (2, "Interface\\Glues\\LOADINGSCREENS\\" .. file, coords, empty_segment_color) + CoolTip:SetWallpaper (2, "Interface\\Glues\\LOADINGSCREENS\\" .. file, coords, empty_segment_color, true) end else --> wallpaper = main window @@ -6099,7 +6259,7 @@ local build_segment_list = function (self, elapsed) end if (_detalhes.tooltip.submenu_wallpaper) then - CoolTip:SetWallpaper (2, [[Interface\ACHIEVEMENTFRAME\UI-Achievement-StatsBackground]], segments_common_tex, segments_common_color) + CoolTip:SetWallpaper (2, [[Interface\ACHIEVEMENTFRAME\UI-Achievement-StatsBackground]], segments_common_tex, segments_common_color, true) else --> wallpaper = main window CoolTip:SetWallpaper (2, _detalhes.tooltip.menus_bg_texture, _detalhes.tooltip.menus_bg_coords, _detalhes.tooltip.menus_bg_color, true) @@ -6109,14 +6269,15 @@ local build_segment_list = function (self, elapsed) CoolTip:AddMenu (1, instancia.TrocaTabela, i) - CoolTip:AddLine (Loc ["STRING_SEGMENT_ENEMY"] .. ":", enemy, 2, "white", "white") - - local decorrido = thisCombat:GetCombatTime() - local minutos, segundos = _math_floor (decorrido/60), _math_floor (decorrido%60) - CoolTip:AddLine (Loc ["STRING_SEGMENT_TIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") - - CoolTip:AddLine (Loc ["STRING_SEGMENT_START"] .. ":", thisCombat.data_inicio, 2, "white", "white") - CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", thisCombat.data_fim or "in progress", 2, "white", "white") + if (not segment_info_added) then + CoolTip:AddLine (Loc ["STRING_SEGMENT_ENEMY"] .. ":", enemy, 2, "white", "white") + local decorrido = thisCombat:GetCombatTime() + local minutos, segundos = _math_floor (decorrido/60), _math_floor (decorrido%60) + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_COMBATTIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") + + CoolTip:AddLine (Loc ["STRING_SEGMENT_START"] .. ":", thisCombat.data_inicio, 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", thisCombat.data_fim or "in progress", 2, "white", "white") + end fight_amount = fight_amount + 1 else @@ -6143,14 +6304,123 @@ local build_segment_list = function (self, elapsed) GameCooltip:AddLine ("$div", nil, nil, -5, -13) ----------- current - CoolTip:AddLine (segmentos.current_standard, _, 1, "white") - CoolTip:AddMenu (1, instancia.TrocaTabela, 0) - CoolTip:AddIcon ([[Interface\QUESTFRAME\UI-Quest-BulletPoint]], "main", "left", 16, 16, nil, nil, nil, nil, "orange") - local enemy = _detalhes.tabela_vigente.is_boss and _detalhes.tabela_vigente.is_boss.name or _detalhes.tabela_vigente.enemy or "--x--x--" local file, coords - if (_detalhes.tabela_vigente.is_boss and _detalhes.tabela_vigente.is_boss.name) then + local thisCombat = _detalhes.tabela_vigente + local segment_info_added + + --> add the new line + CoolTip:AddLine (segmentos.current_standard, _, 1, "white") + CoolTip:AddMenu (1, instancia.TrocaTabela, 0) + CoolTip:AddIcon ([[Interface\QUESTFRAME\UI-Quest-BulletPoint]], "main", "left", 16, 16, nil, nil, nil, nil, "orange") + -- + + --> current segment is a dungeon mythic+? + if (thisCombat.is_mythic_dungeon_segment) then + local mythicDungeonInfo = thisCombat:GetMythicDungeonInfo() + + if (mythicDungeonInfo) then + --> is a boss, trash overall or run overall segment + + local bossInfo = thisCombat.is_boss + + local isMythicOverallSegment, segmentID, mythicLevel, EJID, mapID, zoneName, encounterID, encounterName, startedAt, endedAt, runID = _detalhes:UnpackMythicDungeonInfo (mythicDungeonInfo) + local combat_time = thisCombat:GetCombatTime() + + if (not dungeon_run_id) then + dungeon_run_id = runID + else + if (dungeon_run_id ~= runID) then + dungeon_color = dungeon_color == party_line_color and party_line_color2 or party_line_color + dungeon_color_trash = dungeon_color_trash == party_line_color_trash and party_line_color2_trash or party_line_color_trash + dungeon_run_id = runID + end + end + + --> is mythic overall + if (isMythicOverallSegment) then + --mostrar o tempo da dungeon + local totalTime = combat_time + --CoolTip:AddLine (zoneName .. " +" .. mythicLevel .. " (overall)", _detalhes.gump:IntegerToTimer (totalTime), 1, dungeon_color) + --CoolTip:AddLine (zoneName .. " +" .. mythicLevel .. " (overall)", _detalhes.gump:IntegerToTimer (endedAt - startedAt), 1, dungeon_color) + --CoolTip:AddIcon ([[Interface\AddOns\Details\images\icons]], "main", "left", 14, 10, 479/512, 510/512, 24/512, 51/512) + CoolTip:AddLine (zoneName .. " +" .. mythicLevel .. " (" .. Loc ["STRING_SEGMENTS_LIST_OVERALL"] .. ")", nil, 2, "white", "white") + + else + if (segmentID == "trashoverall") then + --CoolTip:AddLine (encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_TRASH"] .. ")", _detalhes.gump:IntegerToTimer (combat_time), 1, dungeon_color, "gray") + --CoolTip:AddLine (encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_TRASH"] .. ")", _detalhes.gump:IntegerToTimer (endedAt - startedAt), 1, dungeon_color, "gray") + CoolTip:AddLine (encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_TRASH"] .. ")", nil, 2, "white", "white") + else + --CoolTip:AddLine (encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_BOSS"] .. ")", _detalhes.gump:IntegerToTimer (combat_time), 1, dungeon_color, "gray") + CoolTip:AddLine (encounterName .. " (" .. Loc ["STRING_SEGMENTS_LIST_BOSS"] .. ")", nil, 2, "white", "white") + end + --CoolTip:AddIcon ([[Interface\AddOns\Details\images\icons]], "main", "left", 14, 10, 479/512, 510/512, 24/512, 51/512) + end + + local portrait = (thisCombat.is_boss and thisCombat.is_boss.bossimage) or _detalhes:GetBossPortrait (nil, nil, encounterName, EJID) + if (portrait) then + CoolTip:AddIcon (portrait, 2, "top", 128, 64, 0, 1, 0, 0.96) + end + + local backgroundImage = _detalhes:GetRaidIcon (mapID, EJID, "party") + if (backgroundImage) then + CoolTip:SetWallpaper (2, backgroundImage, {0.070, 0.695, 0.087, 0.566}, {1, 1, 1, 0.5}, true) -- party_wallpaper_tex -- {0.09, 0.698125, .17, 0.833984375} + end + + --> sub menu + local decorrido = thisCombat:GetCombatTime() + local minutos, segundos = _math_floor (decorrido/60), _math_floor (decorrido%60) + --CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_COMBATTIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") + + if (segmentID == "trashoverall") then + local totalRealTime = endedAt - startedAt + CoolTip:AddLine (Loc["STRING_SEGMENTS_LIST_TIMEINCOMBAT"] .. ":", _detalhes.gump:IntegerToTimer (decorrido), 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_TOTALTIME"] .. ":", _detalhes.gump:IntegerToTimer (endedAt - startedAt) .. " [|cFFFF3300" .. _detalhes.gump:IntegerToTimer (totalRealTime - decorrido) .. "|r]", 2, "white", "white") + + elseif (isMythicOverallSegment) then + CoolTip:AddLine (Loc["STRING_SEGMENTS_LIST_TIMEINCOMBAT"] .. ":", _detalhes.gump:IntegerToTimer (decorrido), 2, "white", "white") + local totalRealTime = endedAt - startedAt + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_TOTALTIME"] .. ":", _detalhes.gump:IntegerToTimer (totalRealTime) .. " [|cFFFF3300" .. _detalhes.gump:IntegerToTimer (totalRealTime - decorrido) .. "|r]", 2, "white", "white") + + else + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_COMBATTIME"] .. ":", _detalhes.gump:IntegerToTimer (decorrido), 2, "white", "white") + end + + if (thisCombat.is_boss) then + CoolTip:AddLine ("", "", 2, "white", "white") + end + + CoolTip:AddLine (Loc ["STRING_SEGMENT_START"] .. ":", thisCombat.data_inicio, 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", thisCombat.data_fim or "in progress", 2, "white", "white") + + else + --> the combat has mythic dungeon tag but doesn't have a mythic dungeon table information + --> so this is a trash cleanup segment + + local trashInfo = thisCombat:GetMythicDungeonTrashInfo() + + --CoolTip:AddLine (Loc ["STRING_SEGMENT_TRASH"], _detalhes.gump:IntegerToTimer (thisCombat:GetCombatTime()), 1, dungeon_color_trash, "gray") + --CoolTip:AddIcon ([[Interface\AddOns\Details\images\icons]], "main", "left", 16, 12, 0.02734375, 0.11328125, 0.19140625, 0.3125, "red") + --CoolTip:AddIcon ([[Interface\AddOns\Details\images\icons]], "main", "left", 14, 10, 479/512, 510/512, 24/512, 51/512, nil, nil, true) + + --submenu + CoolTip:AddLine (Loc ["STRING_SEGMENT_TRASH"], nil, 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_COMBATTIME"] .. ":", _detalhes.gump:IntegerToTimer (thisCombat:GetCombatTime()), 2, "white", "white") + CoolTip:AddLine ("", "", 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENT_START"] .. ":", thisCombat.data_inicio, 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", thisCombat.data_fim or "in progress", 2, "white", "white") + + local backgroundImage = _detalhes:GetRaidIcon (trashInfo.MapID, trashInfo.EJID, "party") + if (backgroundImage) then + CoolTip:SetWallpaper (2, backgroundImage, party_wallpaper_tex, {1, 1, 1, 0.5}, true) + end + end + + segment_info_added = true + + elseif (_detalhes.tabela_vigente.is_boss and _detalhes.tabela_vigente.is_boss.name) then local portrait = _detalhes:GetBossPortrait (_detalhes.tabela_vigente.is_boss.mapid, _detalhes.tabela_vigente.is_boss.index) or _detalhes.tabela_vigente.is_boss.bossimage if (portrait) then CoolTip:AddIcon (portrait, 2, "top", 128, 64) @@ -6173,16 +6443,16 @@ local build_segment_list = function (self, elapsed) if (_detalhes.tooltip.submenu_wallpaper) then local background = _detalhes:GetRaidIcon (_detalhes.tabela_vigente.is_boss.mapid) if (background) then - CoolTip:SetWallpaper (2, background, nil, segments_wallpaper_color) + CoolTip:SetWallpaper (2, background, nil, segments_wallpaper_color, true) else local ej_id = _detalhes.tabela_vigente.is_boss.ej_instance_id if (ej_id and ej_id ~= 0) then local name, description, bgImage, buttonImage, loreImage, dungeonAreaMapID, link = EJ_GetInstanceInfo (ej_id) if (name) then if (_detalhes.tabela_vigente.instance_type == "party") then - CoolTip:SetWallpaper (2, bgImage, party_wallpaper_tex, party_wallpaper_color) + CoolTip:SetWallpaper (2, bgImage, party_wallpaper_tex, party_wallpaper_color, true) else - CoolTip:SetWallpaper (2, loreImage, raid_wallpaper_tex, party_wallpaper_color) + CoolTip:SetWallpaper (2, loreImage, raid_wallpaper_tex, party_wallpaper_color, true) end end end @@ -6191,6 +6461,7 @@ local build_segment_list = function (self, elapsed) --> wallpaper = main window CoolTip:SetWallpaper (2, _detalhes.tooltip.menus_bg_texture, _detalhes.tooltip.menus_bg_coords, _detalhes.tooltip.menus_bg_color, true) end + elseif (_detalhes.tabela_vigente.is_pvp) then enemy = _detalhes.tabela_vigente.is_pvp.name file, coords = _detalhes:GetBattlegroundInfo (_detalhes.tabela_vigente.is_pvp.mapid) @@ -6199,41 +6470,43 @@ local build_segment_list = function (self, elapsed) file, coords = _detalhes:GetArenaInfo (_detalhes.tabela_vigente.is_arena.mapid) else if (_detalhes.tooltip.submenu_wallpaper) then - CoolTip:SetWallpaper (2, [[Interface\ACHIEVEMENTFRAME\UI-Achievement-StatsBackground]], segments_common_tex, segments_common_color) + CoolTip:SetWallpaper (2, [[Interface\ACHIEVEMENTFRAME\UI-Achievement-StatsBackground]], segments_common_tex, {1, 1, 1, 0.5}, true) else --> wallpaper = main window CoolTip:SetWallpaper (2, _detalhes.tooltip.menus_bg_texture, _detalhes.tooltip.menus_bg_coords, _detalhes.tooltip.menus_bg_color, true) end end - - CoolTip:AddLine (Loc ["STRING_SEGMENT_ENEMY"] .. ":", enemy, 2, "white", "white") - + if (_detalhes.tooltip.submenu_wallpaper) then if (file) then - CoolTip:SetWallpaper (2, "Interface\\Glues\\LOADINGSCREENS\\" .. file, coords, empty_segment_color) + CoolTip:SetWallpaper (2, "Interface\\Glues\\LOADINGSCREENS\\" .. file, coords, empty_segment_color, true) end else --> wallpaper = main window CoolTip:SetWallpaper (2, _detalhes.tooltip.menus_bg_texture, _detalhes.tooltip.menus_bg_coords, _detalhes.tooltip.menus_bg_color, true) end - if (not _detalhes.tabela_vigente:GetEndTime()) then - if (_detalhes.in_combat) then + if (not segment_info_added) then + CoolTip:AddLine (Loc ["STRING_SEGMENT_ENEMY"] .. ":", enemy, 2, "white", "white") + + if (not _detalhes.tabela_vigente:GetEndTime()) then + if (_detalhes.in_combat) then + local decorrido = _detalhes.tabela_vigente:GetCombatTime() + local minutos, segundos = _math_floor (decorrido/60), _math_floor (decorrido%60) + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_COMBATTIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") + else + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_COMBATTIME"] .. ":", "--x--x--", 2, "white", "white") + end + else local decorrido = _detalhes.tabela_vigente:GetCombatTime() local minutos, segundos = _math_floor (decorrido/60), _math_floor (decorrido%60) - CoolTip:AddLine (Loc ["STRING_SEGMENT_TIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") - else - CoolTip:AddLine (Loc ["STRING_SEGMENT_TIME"] .. ":", "--x--x--", 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_COMBATTIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") end - else - local decorrido = _detalhes.tabela_vigente:GetCombatTime() - local minutos, segundos = _math_floor (decorrido/60), _math_floor (decorrido%60) - CoolTip:AddLine (Loc ["STRING_SEGMENT_TIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") - end - CoolTip:AddLine (Loc ["STRING_SEGMENT_START"] .. ":", _detalhes.tabela_vigente.data_inicio, 2, "white", "white") - CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", _detalhes.tabela_vigente.data_fim or "in progress", 2, "white", "white") - + CoolTip:AddLine (Loc ["STRING_SEGMENT_START"] .. ":", _detalhes.tabela_vigente.data_inicio, 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", _detalhes.tabela_vigente.data_fim or "in progress", 2, "white", "white") + end + --> fill é a quantidade de menu que esta sendo mostrada if (instancia.segmento == 0) then if (fill - 2 == menuIndex) then @@ -6260,12 +6533,10 @@ local build_segment_list = function (self, elapsed) local combat_time = _detalhes.tabela_overall:GetCombatTime() local minutos, segundos = _math_floor (combat_time / 60), _math_floor (combat_time % 60) - CoolTip:AddLine (Loc ["STRING_SEGMENT_TIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") - - --CoolTip:SetWallpaper (2, [[Interface\ACHIEVEMENTFRAME\UI-Achievement-StatsBackground]], segments_common_tex, segments_common_color) - --CoolTip:SetWallpaper (2, [[Interface\PetBattles\MountJournal-NoMounts]], {0, 403/512, 0, 294/512}, {.5, .5, .5, 0.9}) + CoolTip:AddLine (Loc ["STRING_SEGMENTS_LIST_COMBATTIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") + if (_detalhes.tooltip.submenu_wallpaper) then - CoolTip:SetWallpaper (2, [[Interface\PetPaperDollFrame\PetStatsBG-Hunter]], {321/512, 0, 0, 190/512}, {1, 1, 1, 0.9}) + CoolTip:SetWallpaper (2, [[Interface\PetPaperDollFrame\PetStatsBG-Hunter]], {321/512, 0, 0, 190/512}, {1, 1, 1, 0.9}, true) else --> wallpaper = main window CoolTip:SetWallpaper (2, _detalhes.tooltip.menus_bg_texture, _detalhes.tooltip.menus_bg_coords, _detalhes.tooltip.menus_bg_color, true) diff --git a/images/dotted.blp b/images/dotted.blp new file mode 100644 index 00000000..7ae83dd9 Binary files /dev/null and b/images/dotted.blp differ diff --git a/images/icons.tga b/images/icons.tga index aa6b76c2..23351c83 100644 Binary files a/images/icons.tga and b/images/icons.tga differ diff --git a/images/icons2.blp b/images/icons2.blp index c41e2e36..69f4e6cf 100644 Binary files a/images/icons2.blp and b/images/icons2.blp differ diff --git a/plugins/Details_3DModelsPaths/Details_3DModelsPaths.toc b/plugins/Details_3DModelsPaths/Details_3DModelsPaths.toc index 2e791ae5..039444d2 100644 --- a/plugins/Details_3DModelsPaths/Details_3DModelsPaths.toc +++ b/plugins/Details_3DModelsPaths/Details_3DModelsPaths.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details! 3D Model Viewer ## Notes: When the 3d models option is enabled, this tool is used to select which model will be used on the window's rows. ## DefaultState: Enabled diff --git a/plugins/Details_DataStorage/Details_DataStorage.toc b/plugins/Details_DataStorage/Details_DataStorage.toc index 098bcdd8..854ffda0 100644 --- a/plugins/Details_DataStorage/Details_DataStorage.toc +++ b/plugins/Details_DataStorage/Details_DataStorage.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details Storage ## Notes: Stores information for Details! ## DefaultState: Enabled diff --git a/plugins/Details_DmgRank/Details_DmgRank.toc b/plugins/Details_DmgRank/Details_DmgRank.toc index 1a0918dd..22969e26 100644 --- a/plugins/Details_DmgRank/Details_DmgRank.toc +++ b/plugins/Details_DmgRank/Details_DmgRank.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details Damage, the Game! (plugin) ## Notes: Plugin for Details ## RequiredDeps: Details diff --git a/plugins/Details_DpsTuning/Details_DpsTuning.toc b/plugins/Details_DpsTuning/Details_DpsTuning.toc index e2c8845c..6c5e96c0 100644 --- a/plugins/Details_DpsTuning/Details_DpsTuning.toc +++ b/plugins/Details_DpsTuning/Details_DpsTuning.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details Dps Tuning (plugin) ## Notes: Plugin for Details ## RequiredDeps: Details diff --git a/plugins/Details_EncounterDetails/Details_EncounterDetails.lua b/plugins/Details_EncounterDetails/Details_EncounterDetails.lua index 578302de..4c0563e6 100644 --- a/plugins/Details_EncounterDetails/Details_EncounterDetails.lua +++ b/plugins/Details_EncounterDetails/Details_EncounterDetails.lua @@ -146,7 +146,7 @@ local function CreatePluginFrames (data) EncounterDetails:AutoShowIcon() end - EncounterDetails:CreateCallbackListeners() + --EncounterDetails:CreateCallbackListeners() elseif (event == "COMBAT_PLAYER_ENTER") then --> combat started if (EncounterDetails.showing and EncounterDetails.db.hide_on_combat) then @@ -236,6 +236,8 @@ local function CreatePluginFrames (data) end end + + --desativado, agora ele é gerenciado dentro do proprio details! function EncounterDetails:CreateCallbackListeners() EncounterDetails.DBM_timers = {} @@ -538,6 +540,9 @@ local shift_monitor = function (self) if (IsShiftKeyDown()) then local spellname = GetSpellInfo (self.spellid) if (spellname) then + if (GameCooltip) then + GameCooltip:Hide() + end GameTooltip:SetOwner (self, "ANCHOR_TOPLEFT") GameTooltip:SetSpellByID (self.spellid) GameTooltip:Show() diff --git a/plugins/Details_EncounterDetails/Details_EncounterDetails.toc b/plugins/Details_EncounterDetails/Details_EncounterDetails.toc index 0ca91182..bf54172e 100644 --- a/plugins/Details_EncounterDetails/Details_EncounterDetails.toc +++ b/plugins/Details_EncounterDetails/Details_EncounterDetails.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details Encounter (plugin) ## Notes: Plugin for Details ## RequiredDeps: Details diff --git a/plugins/Details_RaidCheck/Details_RaidCheck.toc b/plugins/Details_RaidCheck/Details_RaidCheck.toc index cf3c73aa..7186be1e 100644 --- a/plugins/Details_RaidCheck/Details_RaidCheck.toc +++ b/plugins/Details_RaidCheck/Details_RaidCheck.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details Raid Check (plugin) ## Notes: Show a icon on Details title bar showing flask, food, pre-pots. ## RequiredDeps: Details diff --git a/plugins/Details_RaidInfo-EmeraldNightmare/Details_RaidInfo-EmeraldNightmare.toc b/plugins/Details_RaidInfo-EmeraldNightmare/Details_RaidInfo-EmeraldNightmare.toc index b55984ee..5634883c 100644 --- a/plugins/Details_RaidInfo-EmeraldNightmare/Details_RaidInfo-EmeraldNightmare.toc +++ b/plugins/Details_RaidInfo-EmeraldNightmare/Details_RaidInfo-EmeraldNightmare.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details: Emerald Nightmare ## Notes: Plugin for Details ## RequiredDeps: Details diff --git a/plugins/Details_RaidInfo-Nighthold/Details_RaidInfo-Nighthold.toc b/plugins/Details_RaidInfo-Nighthold/Details_RaidInfo-Nighthold.toc index 4e05d3cc..7f05d709 100644 --- a/plugins/Details_RaidInfo-Nighthold/Details_RaidInfo-Nighthold.toc +++ b/plugins/Details_RaidInfo-Nighthold/Details_RaidInfo-Nighthold.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details: Nighthold ## Notes: Plugin for Details ## RequiredDeps: Details diff --git a/plugins/Details_RaidInfo-TombOfSargeras/Details_RaidInfo-TombOfSargeras.toc b/plugins/Details_RaidInfo-TombOfSargeras/Details_RaidInfo-TombOfSargeras.toc index 68f6ba3b..897b54a8 100644 --- a/plugins/Details_RaidInfo-TombOfSargeras/Details_RaidInfo-TombOfSargeras.toc +++ b/plugins/Details_RaidInfo-TombOfSargeras/Details_RaidInfo-TombOfSargeras.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details: Tomb of Sargeras ## Notes: Plugin for Details ## RequiredDeps: Details diff --git a/plugins/Details_RaidInfo-TrialOfValor/Details_RaidInfo-TrialOfValor.toc b/plugins/Details_RaidInfo-TrialOfValor/Details_RaidInfo-TrialOfValor.toc index 74f28eec..0ac840b9 100644 --- a/plugins/Details_RaidInfo-TrialOfValor/Details_RaidInfo-TrialOfValor.toc +++ b/plugins/Details_RaidInfo-TrialOfValor/Details_RaidInfo-TrialOfValor.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details: Trial Of Valor ## Notes: Plugin for Details ## RequiredDeps: Details diff --git a/plugins/Details_Streamer/Details_Streamer.toc b/plugins/Details_Streamer/Details_Streamer.toc index e7a07319..c406afcd 100644 --- a/plugins/Details_Streamer/Details_Streamer.toc +++ b/plugins/Details_Streamer/Details_Streamer.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details!: Streamer (plugin) ## Notes: Show which spells you are casting, viewers can see what are you doing and follow your steps. ## RequiredDeps: Details diff --git a/plugins/Details_TimeAttack/Details_TimeAttack.toc b/plugins/Details_TimeAttack/Details_TimeAttack.toc index 8feffa0f..8f5654f9 100644 --- a/plugins/Details_TimeAttack/Details_TimeAttack.toc +++ b/plugins/Details_TimeAttack/Details_TimeAttack.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details TimeAttack (plugin) ## Notes: Plugin for Details ## SavedVariablesPerCharacter: _detalhes_databaseTimeAttack diff --git a/plugins/Details_TinyThreat/Details_TinyThreat.toc b/plugins/Details_TinyThreat/Details_TinyThreat.toc index c93390ae..dcef0bc0 100644 --- a/plugins/Details_TinyThreat/Details_TinyThreat.toc +++ b/plugins/Details_TinyThreat/Details_TinyThreat.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details Tiny Threat (plugin) ## Notes: Plugin for Details ## RequiredDeps: Details diff --git a/plugins/Details_Vanguard/Details_Vanguard.toc b/plugins/Details_Vanguard/Details_Vanguard.toc index 63059fb9..47ea88ca 100644 --- a/plugins/Details_Vanguard/Details_Vanguard.toc +++ b/plugins/Details_Vanguard/Details_Vanguard.toc @@ -1,4 +1,4 @@ -## Interface: 70200 +## Interface: 70300 ## Title: Details Vanguard (plugin) ## Notes: Plugin for Details ## SavedVariablesPerCharacter: _detalhes_databaseVanguard diff --git a/startup.lua b/startup.lua index 4af90a47..0fac3a70 100644 --- a/startup.lua +++ b/startup.lua @@ -265,6 +265,737 @@ function _G._detalhes:Start() self.listener:RegisterEvent ("PLAYER_SPECIALIZATION_CHANGED") + --test immersion stuff + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + + local immersionFrame = CreateFrame ("frame", "DetailsImmersionFrame", UIParent) + immersionFrame:RegisterEvent ("ZONE_CHANGED_NEW_AREA") + immersionFrame.DevelopmentDebug = false + + --> check if can enabled the immersino stuff + + function immersionFrame.CheckIfCanEnableImmersion() + local mapFileName = GetMapInfo() + if (mapFileName and mapFileName:find ("InvasionPoint")) then + self.immersion_enabled = true + if (immersionFrame.DevelopmentDebug) then + print ("Details!", "CheckIfCanEnableImmersion() > immersion enabled.") + end + else + if (self.immersion_enabled) then + if (immersionFrame.DevelopmentDebug) then + print ("Details!", "CheckIfCanEnableImmersion() > immersion disabled.") + end + self.immersion_enabled = nil + end + end + end + + --> check events + immersionFrame:SetScript ("OnEvent", function (_, event, ...) + if (event == "ZONE_CHANGED_NEW_AREA") then + C_Timer.After (3, immersionFrame.CheckIfCanEnableImmersion) + end + end) + + + --test mythic + stuff + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + + --> data for the current mythic + dungeon + self.MythicPlus = { + RunID = 0, + } + + -- ~mythic ~dungeon + local newFrame = CreateFrame ("frame", "DetailsMythicPlusFrame", UIParent) + newFrame.DevelopmentDebug = false + + --[ + newFrame:RegisterEvent ("CHALLENGE_MODE_START") + newFrame:RegisterEvent ("CHALLENGE_MODE_COMPLETED") + newFrame:RegisterEvent ("ZONE_CHANGED_NEW_AREA") + newFrame:RegisterEvent ("ENCOUNTER_END") + --]] + + --[[ + all mythic segments have: + .is_mythic_dungeon_segment = true + .is_mythic_dungeon_run_id = run id from details.profile.mythic_dungeon_id + boss, 'trash overall' and 'dungeon overall' segments have: + .is_mythic_dungeon + boss segments have: + .is_boss + 'trash overall' segments have: + .is_mythic_dungeon with .SegmentID = "trashoverall" + 'dungeon overall' segment have: + .is_mythic_dungeon with .SegmentID = "overall" + + --]] + + --precisa converter um wipe em um trash segment? provavel que sim + + -- at the end of a mythic run, if enable on settings, merge all the segments from the mythic run into only one + function newFrame.MergeSegmentsOnEnd() + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonFinished() > starting to merge mythic segments.", "InCombatLockdown():", InCombatLockdown()) + end + + --> create a new combat to be the overall for the mythic run + self:EntrarEmCombate() + + --> get the current combat just created and the table with all past segments + local newCombat = self:GetCurrentCombat() + local segmentHistory = self:GetCombatSegments() + + local totalTime = 0 + local startDate, endDate = "", "" + local lastSegment + + --> add all boss segments from this run to this new segment + for i = 1, 25 do --> from the newer combat to the oldest + local pastCombat = segmentHistory [i] + if (pastCombat and pastCombat.is_mythic_dungeon and pastCombat.is_mythic_dungeon.RunID == self.mythic_dungeon_id) then + local canAddThisSegment = true + if (_detalhes.mythic_plus.make_overall_boss_only) then + if (not pastCombat.is_boss) then + canAddThisSegment = false + end + end + + if (canAddThisSegment) then + newCombat = newCombat + pastCombat + totalTime = totalTime + pastCombat:GetCombatTime() + + if (newFrame.DevelopmentDebug) then + print ("MythicDungeonFinished() > adding time:", pastCombat:GetCombatTime(), pastCombat.is_boss and pastCombat.is_boss.name) + end + + if (endDate == "") then + local _, whenEnded = pastCombat:GetDate() + endDate =whenEnded + end + lastSegment = pastCombat + end + end + end + + --> get the date where the first segment started + if (lastSegment) then + startDate = lastSegment:GetDate() + end + + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonFinished() > totalTime:", totalTime, "startDate:", startDate) + end + + local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() + + --> tag the segment as mythic overall segment + newCombat.is_mythic_dungeon = { + StartedAt = self.MythicPlus.StartedAt, --the start of the run + EndedAt = self.MythicPlus.EndedAt, --the end of the run + SegmentID = "overall", --segment number within the dungeon + RunID = self.mythic_dungeon_id, + OverallSegment = true, + ZoneName = self.MythicPlus.DungeonName, + MapID = instanceMapID, + Level = self.MythicPlus.Level, + EJID = self.MythicPlus.ejID, + } + + newCombat.is_mythic_dungeon_segment = true + newCombat.is_mythic_dungeon_run_id = self.mythic_dungeon_id + + --> set the segment time and date + newCombat:SetStartTime (GetTime() - totalTime) + newCombat:SetEndTime (GetTime()) + newCombat:SetDate (startDate, endDate) + + --> immediatly finishes the segment just started + self:SairDoCombate() + + --> update all windows + self:InstanciaCallFunction (self.gump.Fade, "in", nil, "barras") + self:InstanciaCallFunction (self.AtualizaSegmentos) + self:InstanciaCallFunction (self.AtualizaSoloMode_AfertReset) + self:InstanciaCallFunction (self.ResetaGump) + self:AtualizaGumpPrincipal (-1, true) + + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonFinished() > finished merging segments.") + print ("Details!", "MythicDungeonFinished() > all done, check in the segments list if everything is correct, if something is weird: '/details feedback' thanks in advance!") + end + + end + + --> after each boss fight, if enalbed on settings, create an extra segment with all trash segments from the boss just killed + function newFrame.MergeTrashCleanup() + if (newFrame.DevelopmentDebug) then + print ("Details!", "MergeTrashCleanup() > running", newFrame.TrashMergeScheduled and #newFrame.TrashMergeScheduled) + end + + local segmentsToMerge = newFrame.TrashMergeScheduled + + --> table exists and there's at least one segment + if (segmentsToMerge and segmentsToMerge[1]) then + --> do the merge + + --> leave combat if still tagged as combat + if (self.in_combat) then + if (newFrame.DevelopmentDebug) then + print ("Details!", "MergeTrashCleanup() > was in combat, calling SairDoCombate()", _detalhes.tabela_vigente, _detalhes.tabela_vigente.is_boss) + end + self:SairDoCombate() + end + + --> create a new combat to be the overall for the mythic run + self:EntrarEmCombate() + + --> get the current combat just created and the table with all past segments + local newCombat = self:GetCurrentCombat() + local totalTime = 0 + local startDate, endDate = "", "" + local lastSegment + + --> add segments + for _, pastCombat in ipairs (segmentsToMerge) do + newCombat = newCombat + pastCombat + totalTime = totalTime + pastCombat:GetCombatTime() + + --> tag this combat as already added to a boss trash overall + pastCombat._trashoverallalreadyadded = true + + if (endDate == "") then + local _, whenEnded = pastCombat:GetDate() + endDate = whenEnded + end + lastSegment = pastCombat + end + + --> get the date where the first segment started + if (lastSegment) then + startDate = lastSegment:GetDate() + end + + local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() + + --> tag the segment as mythic overall segment + newCombat.is_mythic_dungeon = { + StartedAt = segmentsToMerge.PreviousBossKilledAt, --start of the mythic run or when the previous boss got killed + EndedAt = segmentsToMerge.LastBossKilledAt, --the time() when encounter_end got triggered + SegmentID = "trashoverall", + RunID = self.mythic_dungeon_id, + TrashOverallSegment = true, + ZoneName = self.MythicPlus.DungeonName, + MapID = instanceMapID, + Level = self.MythicPlus.Level, + EJID = self.MythicPlus.ejID, + EncounterID = segmentsToMerge.EncounterID, + EncounterName = segmentsToMerge.EncounterName or Loc ["STRING_UNKNOW"], + } + + newCombat.is_mythic_dungeon_segment = true + newCombat.is_mythic_dungeon_run_id = self.mythic_dungeon_id + + --> set the segment time / using a sum of combat times, this combat time is reliable + newCombat:SetStartTime (GetTime() - totalTime) + newCombat:SetEndTime (GetTime()) + --> set the segment date + newCombat:SetDate (startDate, endDate) + + --> immediatly finishes the segment just started + self:SairDoCombate() + + --o combate agora é _tabela_vigente e [1] na tabela de overall + --seria necessario passar essa tabela para [2] na overall + local segmentHistory = self:GetCombatSegments() + local bossSegment = segmentHistory [2] + if (bossSegment) then + --set the boss as the current combat + _detalhes.tabela_vigente = bossSegment + --swap tables + segmentHistory [1] = bossSegment --as the boss combat is done, it is also the first combat in the past combats table + segmentHistory [2] = newCombat --se the overall trash as the second segment on the past table (the semgnet 2 was occupy by the boss segment) + end + + --> update all windows + self:InstanciaCallFunction (self.gump.Fade, "in", nil, "barras") + self:InstanciaCallFunction (self.AtualizaSegmentos) + self:InstanciaCallFunction (self.AtualizaSoloMode_AfertReset) + self:InstanciaCallFunction (self.ResetaGump) + self:AtualizaGumpPrincipal (-1, true) + + if (newFrame.DevelopmentDebug) then + print ("Details!", "MergeTrashCleanup() > finished merging trash segments.", _detalhes.tabela_vigente, _detalhes.tabela_vigente.is_boss) + end + + --> should delete the trash segments after the merge? + if (_detalhes.mythic_plus.delete_trash_after_merge) then + local segmentHistory = self:GetCombatSegments() + for _, pastCombat in ipairs (segmentsToMerge) do + for i = #segmentHistory, 1, -1 do + local segment = segmentHistory [i] + if (segment == pastCombat) then + wipe (segment) + tremove (segmentHistory, i) + break + end + end + end + wipe (segmentsToMerge) + self:SendEvent ("DETAILS_DATA_SEGMENTREMOVED") + else + --> clear the segments to merge table + for i = #segmentsToMerge, 1, -1 do + tremove (segmentsToMerge, i) + --> notify plugins about a segment deleted + self:SendEvent ("DETAILS_DATA_SEGMENTREMOVED") + end + + --> clear encounter name and id + segmentsToMerge.EncounterID = nil + segmentsToMerge.EncounterName = nil + end + end + end + + --> this function merges trash segments after all bosses of the mythic dungeon are defeated + --> happens when the group finishes all bosses but don't complete the trash requirement + function newFrame.MergeRemainingTrashAfterAllBossesDone() + if (newFrame.DevelopmentDebug) then + print ("Details!", "MergeRemainingTrashAfterAllBossesDone() > running, #segments: ", #newFrame.TrashMergeScheduled2, "trash overall table:", newFrame.TrashMergeScheduled2_OverallCombat) + end + + local segmentsToMerge = newFrame.TrashMergeScheduled2 + local overallCombat = newFrame.TrashMergeScheduled2_OverallCombat + + --> needs to merge, add the total combat time, set the date end to the date of the first segment + local totalTime = 0 + local startDate, endDate = "", "" + local lastSegment + + --> add segments + for _, pastCombat in ipairs (segmentsToMerge) do + overallCombat = overallCombat + pastCombat + if (newFrame.DevelopmentDebug) then + print ("MergeRemainingTrashAfterAllBossesDone() > segment added") + end + totalTime = totalTime + pastCombat:GetCombatTime() + + --> tag this combat as already added to a boss trash overall + pastCombat._trashoverallalreadyadded = true + + if (endDate == "") then --get the end date of the first index only + local _, whenEnded = pastCombat:GetDate() + endDate = whenEnded + end + lastSegment = pastCombat + end + + --> set the segment time / using a sum of combat times, this combat time is reliable + local startTime = overallCombat:GetStartTime() + overallCombat:SetStartTime (startTime - totalTime) + if (newFrame.DevelopmentDebug) then + print ("MergeRemainingTrashAfterAllBossesDone() > total combat time:", totalTime) + end + --> set the segment date + local startDate = overallCombat:GetDate() + overallCombat:SetDate (startDate, endDate) + if (newFrame.DevelopmentDebug) then + print ("MergeRemainingTrashAfterAllBossesDone() > new end date:", endDate) + end + + local mythicDungeonInfo = overallCombat:GetMythicDungeonInfo() + + if (newFrame.DevelopmentDebug) then + print ("MergeRemainingTrashAfterAllBossesDone() > elapsed time before:", mythicDungeonInfo.EndedAt - mythicDungeonInfo.StartedAt) + end + mythicDungeonInfo.StartedAt = mythicDungeonInfo.StartedAt - (self.MythicPlus.EndedAt - self.MythicPlus.PreviousBossKilledAt) + if (newFrame.DevelopmentDebug) then + print ("MergeRemainingTrashAfterAllBossesDone() > elapsed time after:", mythicDungeonInfo.EndedAt - mythicDungeonInfo.StartedAt) + end + + --> should delete the trash segments after the merge? + if (_detalhes.mythic_plus.delete_trash_after_merge) then + local segmentHistory = self:GetCombatSegments() + for _, pastCombat in ipairs (segmentsToMerge) do + for i = #segmentHistory, 1, -1 do + local segment = segmentHistory [i] + if (segment == pastCombat) then + wipe (segment) + tremove (segmentHistory, i) + break + end + end + end + wipe (segmentsToMerge) + self:SendEvent ("DETAILS_DATA_SEGMENTREMOVED") + else + --> clear the segments to merge table + for i = #segmentsToMerge, 1, -1 do + tremove (segmentsToMerge, i) + + --> notify plugins about a segment deleted + self:SendEvent ("DETAILS_DATA_SEGMENTREMOVED") + end + end + + newFrame.TrashMergeScheduled2 = nil + newFrame.TrashMergeScheduled2_OverallCombat = nil + + if (newFrame.DevelopmentDebug) then + print ("Details!", "MergeRemainingTrashAfterAllBossesDone() > done merging") + end + end + + --this function is called right after defeat a boss inside a mythic dungeon + function newFrame.BossDefeated (this_is_end_end, encounterID, encounterName, difficultyID, raidSize, endStatus) --hold your breath and count to ten + if (newFrame.DevelopmentDebug) then + print ("Details!", "BossDefeated() > boss defeated | SegmentID:", self.MythicPlus.SegmentID, " | mapID:", self.MythicPlus.DungeonID) + end + + local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo() + + --> addon the mythic dungeon info to the combat + _detalhes.tabela_vigente.is_mythic_dungeon = { + StartedAt = self.MythicPlus.StartedAt, --the start of the run + EndedAt = time(), --when the boss got killed + SegmentID = self.MythicPlus.SegmentID, --segment number within the dungeon + EncounterID = encounterID, + EncounterName = encounterName or Loc ["STRING_UNKNOW"], + RunID = self.mythic_dungeon_id, + ZoneName = self.MythicPlus.DungeonName, + MapID = self.MythicPlus.DungeonID, + OverallSegment = false, + Level = self.MythicPlus.Level, + EJID = self.MythicPlus.ejID, + } + + if (not this_is_end_end) then + --> parser doesn't handle ENCOUNTER_END to party instances, so we close the combat from here + self:SairDoCombate (true, {encounterID, encounterName, difficultyID, raidSize, endStatus}) + if (newFrame.DevelopmentDebug) then + print ("Details!", "BossDefeated() > closing the combat with SairDoCombate()", _detalhes.tabela_vigente, _detalhes.tabela_vigente.is_boss) + end + end + + --> check if need to merge the trash for this boss + if (_detalhes.mythic_plus.merge_boss_trash) then + --> store on an table all segments which should be merged + local segmentsToMerge = newFrame.TrashMergeScheduled or {} + --> table with all past semgnets + local segmentHistory = self:GetCombatSegments() + + --> iterate among segments + for i = 1, 25 do --> from the newer combat to the oldest + local pastCombat = segmentHistory [i] + --> does the combat exists + if (pastCombat and not pastCombat._trashoverallalreadyadded) then + --> is the combat a mythic segment from this run? + local isMythicSegment, SegmentID = pastCombat:IsMythicDungeon() + if (isMythicSegment and SegmentID == self.mythic_dungeon_id and not pastCombat.is_boss) then + + local mythicDungeonInfo = pastCombat:GetMythicDungeonInfo() -- .is_mythic_dungeon only boss, trash overall and run overall have it + if (not mythicDungeonInfo or not mythicDungeonInfo.TrashOverallSegment) then + --> trash segment found, schedule to merge + tinsert (segmentsToMerge, pastCombat) + end + end + end + end + + --> add encounter information + segmentsToMerge.EncounterID = encounterID + segmentsToMerge.EncounterName = encounterName + segmentsToMerge.PreviousBossKilledAt = self.MythicPlus.PreviousBossKilledAt + + --> reduce this boss encounter time from the trash lenght time, since the boss doesn't count towards the time spent cleaning trash + segmentsToMerge.LastBossKilledAt = time() - _detalhes.tabela_vigente:GetCombatTime() + + newFrame.TrashMergeScheduled = segmentsToMerge + + if (not InCombatLockdown() and not UnitAffectingCombat ("player")) then + if (newFrame.DevelopmentDebug) then + print ("Details!", "BossDefeated() > not in combat, merging trash now") + end + newFrame.MergeTrashCleanup() + else + if (newFrame.DevelopmentDebug) then + print ("Details!", "BossDefeated() > player in combatlockdown, scheduling trash merge") + end + _detalhes.schedule_mythicdungeon_trash_merge = true + end + end + + --> close the combat + if (this_is_end_end) then + --> player left the dungeon + if (in_combat and _detalhes.mythic_plus.always_in_combat) then + self:SairDoCombate() + end + else + --> re-enter in combat if details! is set to always be in combat during mythic plus + if (self.mythic_plus.always_in_combat) then + self:EntrarEmCombate() + end + + --> increase the segment number for the mythic run + self.MythicPlus.SegmentID = self.MythicPlus.SegmentID + 1 + + --> register the time when the last boss has been killed (started a clean up for the next trash) + self.MythicPlus.PreviousBossKilledAt = time() + end + end + + function newFrame.MythicDungeonFinished() + if (newFrame.IsDoingMythicDungeon) then + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonFinished() > the dungeon was a Mythic+ and just ended.") + end + + newFrame.IsDoingMythicDungeon = false + self.MythicPlus.Started = false + self.MythicPlus.EndedAt = time()-1.9 + + --> at this point, details! should not be in combat, but if something triggered a combat start, just close the combat right away + if (self.in_combat) then + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonFinished() > was in combat, calling SairDoCombate():", InCombatLockdown()) + end + self:SairDoCombate() + end + + local segmentsToMerge = {} + + --> check if there is trash segments after the last boss. need to merge these segments with the trash segment of the last boss + if (_detalhes.mythic_plus.merge_boss_trash) then + --> is the current combat not a boss fight? this means a combat was opened after the mythic run completed + if (not self.tabela_vigente.is_boss and self.tabela_vigente:GetCombatTime() > 5) then + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonFinished() > the last combat isn't a boss fight, might have trash after bosses done.") + end + + --> table with all past semgnets + local segmentHistory = self:GetCombatSegments() + + for i = 1, #segmentHistory do + local pastCombat = segmentHistory [i] + --> does the combat exists + + if (pastCombat and not pastCombat._trashoverallalreadyadded and pastCombat:GetCombatTime() > 5) then + --> is the last boss? + if (pastCombat.is_boss) then + break + end + --> is the combat a mythic segment from this run? + local isMythicSegment, SegmentID = pastCombat:IsMythicDungeon() + if (isMythicSegment and SegmentID == self.mythic_dungeon_id) then + --> if have mythic dungeon info, cancel the loop + local mythicDungeonInfo = pastCombat:GetMythicDungeonInfo() + if (mythicDungeonInfo) then + break + end + --> merge this segment + tinsert (segmentsToMerge, pastCombat) + if (newFrame.DevelopmentDebug) then + print ("MythicDungeonFinished() > found after last boss combat") + end + end + end + end + end + end + + if (#segmentsToMerge > 0) then + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonFinished() > found ", #segmentsToMerge, "segments after the last boss") + end + + --> find the latest trash overall + local segmentHistory = self:GetCombatSegments() + local latestTrashOverall + for i = 1, #segmentHistory do + local pastCombat = segmentHistory [i] + if (pastCombat and pastCombat.is_mythic_dungeon and pastCombat.is_mythic_dungeon.SegmentID == "trashoverall") then + latestTrashOverall = pastCombat + break + end + end + + if (latestTrashOverall) then + --> stores the segment table and the trash overall segment to use on the merge + newFrame.TrashMergeScheduled2 = segmentsToMerge + newFrame.TrashMergeScheduled2_OverallCombat = latestTrashOverall + + if (not InCombatLockdown() and not UnitAffectingCombat ("player")) then + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonFinished() > not in combat, merging last pack of trash now") + end + newFrame.MergeRemainingTrashAfterAllBossesDone() + else + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonFinished() > player in combatlockdown, scheduling the merge for last trash packs") + end + _detalhes.schedule_mythicdungeon_endtrash_merge = true + end + end + end + + --> merge segments + if (_detalhes.mythic_plus.make_overall_when_done) then + if (not InCombatLockdown() and not UnitAffectingCombat ("player")) then + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonFinished() > not in combat, creating overall segment now") + end + newFrame.MergeSegmentsOnEnd() + else + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonFinished() > player in combatlockdown, scheduling the creation of the overall segment") + end + _detalhes.schedule_mythicdungeon_overallrun_merge = true + end + end + end + end + + function newFrame.MythicDungeonStarted() + --> flag as a mythic dungeon + newFrame.IsDoingMythicDungeon = true + + if (newFrame.DevelopmentDebug) then + print ("=========") + print ("Details!", "Thanks for using an alpha version of Details!, please don't mind all these debug lines.") + print ("Details!", "We are developing new stuff.") + print ("=========") + print ("Details!", "MythicDungeonStarted() > CHALLENGE_MODE_START triggered, setting up details!") + end + + local mythicLevel = C_ChallengeMode.GetActiveKeystoneInfo() + local zoneName, _, _, _, _, _, _, currentZoneID = GetInstanceInfo() + local ejID = EJ_GetCurrentInstance() + + --> setup the mythic run info + self.MythicPlus.Started = true + self.MythicPlus.DungeonName = zoneName + self.MythicPlus.DungeonID = currentZoneID + self.MythicPlus.StartedAt = time()+9.7 --> there's the countdown timer of 10 seconds + self.MythicPlus.SegmentID = 1 + self.MythicPlus.Level = mythicLevel + self.MythicPlus.ejID = ejID + self.MythicPlus.PreviousBossKilledAt = time() + + --> this counter is individual for each character + self.mythic_dungeon_id = self.mythic_dungeon_id + 1 --14 --15 + + --> start a new combat segment after 10 seconds + if (_detalhes.mythic_plus.always_in_combat) then + C_Timer.After (9.7, function() + if (newFrame.DevelopmentDebug) then + print ("Details!", "New segment for mythic dungeon created.") + end + _detalhes:EntrarEmCombate() + end) + end + + local name, groupType, difficultyID, difficult = GetInstanceInfo() + if (groupType == "party" and self.overall_clear_newchallenge) then + self.historico:resetar_overall() + if (self.debug) then + self:Msg ("(debug) timer is for a mythic+ dungeon, overall has been reseted.") + end + end + + if (newFrame.DevelopmentDebug) then + print ("Details!", "MythicDungeonStarted() > State set to Mythic Dungeon, new combat starting in 10 seconds.") + end + end + + newFrame:SetScript ("OnEvent", function (_, event, ...) + + if (event == "CHALLENGE_MODE_START") then + --> CHALLENGE_MODE_START does trigger every time the player enters a mythic dungeon already in progress + + if (newFrame.DevelopmentDebug) then + print ("Details!", event, ...) + end + + --> is this a mythic dungeon? + local _, _, difficulty, _, _, _, _, currentZoneID = GetInstanceInfo() + + if (newFrame.DevelopmentDebug) then + print ("Details!", "Dungeon Dificulty:", difficulty, currentZoneID) + end + + if (difficulty == 8) then + --> start the dungeon on Details! + newFrame.MythicDungeonStarted() + end + + elseif (event == "CHALLENGE_MODE_COMPLETED") then + if (newFrame.DevelopmentDebug) then + print ("Details!", event, ...) + 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) + + elseif (event == "ENCOUNTER_END") then + if (newFrame.DevelopmentDebug) then + print ("Details!", event, ...) + end + + if (newFrame.IsDoingMythicDungeon) then + local encounterID, encounterName, difficultyID, raidSize, endStatus = ... + if (endStatus == 1) then + newFrame.BossDefeated (false, encounterID, encounterName, difficultyID, raidSize, endStatus) + else + --> remove the boss table, so it will be considered trash + if (self.tabela_vigente.is_boss) then + --> check if is still in combat + if (newFrame.DevelopmentDebug) then + print ("Details!", "Boss Wipe, removing the boss table from the segment.") + end + if (self.in_combat) then + if (newFrame.DevelopmentDebug) then + print ("Details!", "Boss Wipe, was in combat, calling SairDoCombate().") + end + self:SairDoCombate() + end + self.tabela_vigente.is_boss = nil + end + end + end + + elseif (event == "ZONE_CHANGED_NEW_AREA") then + if (newFrame.IsDoingMythicDungeon) then + if (newFrame.DevelopmentDebug) then + print ("Details!", event, ...) + print ("Zone changed and is Doing Mythic Dungeon") + 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 + --> finish the segment + newFrame.BossDefeated (true) + + --> finish the mythic run + newFrame.MythicDungeonFinished() + end + end + + end + + end) + + + --fazer a captura de dados para o gráfico ao iniciar a corrida e parar ao sair da dungeon ou terminar a run. + + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + self.parser_frame:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED") --> group