From 20a9773a5899afea5e6704201229563e900eaec4 Mon Sep 17 00:00:00 2001 From: tercio Date: Mon, 8 Sep 2014 17:17:56 -0300 Subject: [PATCH] - Added Acitivity Time for Damage + Healing, tooltip show the activity separately. - Major changes on Encounter Details Plugin making more easy to use. - Removed Spell Details Plugin. - Added new plugin: Dps Tuning. - New API: actor:GetActorSpells() return table with spellid, spelltable. - New API: actor:GetSpell (spellid) return the table for the spellid. - New API: combat:GetCombatNumber() return a unique ID number identifying the combat. - New API: framework:CreateButton (parent, func, w, h, text, param1, param2, texture, member, name, short_method) - New API: framework:CreateDropDown (parent, func, default, w, h, member, name) - New API: framework:CreateLabel (parent, text, size, color, font, member, name, layer) - New API: framework:CreateBar (parent, texture, w, h, value, member, name) - New API: framework:CreateChartPanel (parent, w, h, name) --- boot.lua | 12 +- classes/classe_combate.lua | 7 + classes/classe_custom.lua | 141 +- classes/classe_others.lua | 11 +- core/control.lua | 4 +- core/parser.lua | 1 - core/plugins.lua | 37 +- framework/button.lua | 20 +- framework/cooltip.lua | 25 +- framework/dropdown.lua | 8 +- framework/framework.lua | 4 + framework/label.lua | 8 +- framework/normal_bar.lua | 23 +- framework/panel.lua | 539 ++++++- functions/boss.lua | 8 +- functions/classes.lua | 7 +- functions/profiles.lua | 1 + functions/timedata.lua | 12 +- gumps/janela_custom.lua | 14 +- gumps/janela_info.lua | 299 ++-- gumps/janela_principal.lua | 825 +++++----- .../Details_DpsTuning/Details_DpsTuning.lua | 1189 +++++++++++++++ .../Details_DpsTuning/Details_DpsTuning.toc | 7 + .../Details_EncounterDetails.lua | 253 ++-- plugins/Details_EncounterDetails/frames.lua | 614 ++++---- .../SiegeOfOrgrimmar.lua | 4 +- .../images/wallpaper.tga | Bin 476923 -> 0 bytes .../ThroneOfThunder.lua | 2 +- .../images/raid_tot.tga | Bin 450283 -> 0 bytes .../Details_SpellDetails.lua | 1338 ----------------- .../Details_SpellDetails.toc | 15 - .../Libs/AceLocale-3.0/AceLocale-3.0.lua | 137 -- .../Libs/AceLocale-3.0/AceLocale-3.0.xml | 4 - .../Libs/LibStub/LibStub.lua | 51 - .../Libs/LibStub/LibStub.toc | 13 - .../Libs/LibStub/tests/test.lua | 41 - .../Libs/LibStub/tests/test2.lua | 27 - .../Libs/LibStub/tests/test3.lua | 14 - .../Libs/LibStub/tests/test4.lua | 41 - plugins/Details_SpellDetails/embeds.xml | 6 - plugins/Details_SpellDetails/enUS.lua | 20 - .../Details_SpellDetails/images/solo_bg.tga | Bin 524332 -> 0 bytes plugins/Details_SpellDetails/ptBR.lua | 21 - 43 files changed, 2960 insertions(+), 2843 deletions(-) create mode 100644 plugins/Details_DpsTuning/Details_DpsTuning.lua create mode 100644 plugins/Details_DpsTuning/Details_DpsTuning.toc delete mode 100644 plugins/Details_RaidInfo-SiegeOfOrgrimmar/images/wallpaper.tga delete mode 100644 plugins/Details_RaidInfo-ThroneOfThunder/images/raid_tot.tga delete mode 100644 plugins/Details_SpellDetails/Details_SpellDetails.lua delete mode 100644 plugins/Details_SpellDetails/Details_SpellDetails.toc delete mode 100644 plugins/Details_SpellDetails/Libs/AceLocale-3.0/AceLocale-3.0.lua delete mode 100644 plugins/Details_SpellDetails/Libs/AceLocale-3.0/AceLocale-3.0.xml delete mode 100644 plugins/Details_SpellDetails/Libs/LibStub/LibStub.lua delete mode 100644 plugins/Details_SpellDetails/Libs/LibStub/LibStub.toc delete mode 100644 plugins/Details_SpellDetails/Libs/LibStub/tests/test.lua delete mode 100644 plugins/Details_SpellDetails/Libs/LibStub/tests/test2.lua delete mode 100644 plugins/Details_SpellDetails/Libs/LibStub/tests/test3.lua delete mode 100644 plugins/Details_SpellDetails/Libs/LibStub/tests/test4.lua delete mode 100644 plugins/Details_SpellDetails/embeds.xml delete mode 100644 plugins/Details_SpellDetails/enUS.lua delete mode 100644 plugins/Details_SpellDetails/images/solo_bg.tga delete mode 100644 plugins/Details_SpellDetails/ptBR.lua diff --git a/boot.lua b/boot.lua index 616e75d9..ae81e616 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 = 56 --it's 56 for release - _detalhes.userversion = "v1.24.5" - _detalhes.realversion = 27 + _detalhes.build_counter = 69 --it's 69 for release + _detalhes.userversion = "v1.25.0" + _detalhes.realversion = 28 _detalhes.version = _detalhes.userversion .. " (core " .. _detalhes.realversion .. ")" ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -18,12 +18,10 @@ do local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) --[[ -|cFFFFFF00v1.24.5 (|cFFFFCC00Ago 31, 2014|r|cFFFFFF00)|r:\n\n -|cFFFFFF00-|r .\n\n + --]] - - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.24.5 (|cFFFFCC00Ago 31, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Raid Tools bracket on Options Panel.\n\n|cFFFFFF00-|r Added interrupt, cooldown and death announcers (raid tools).\n\n|cFFFFFF00-|r Added pre potion recognition, showing after the encounter on the chat only for you (raid tools).\n\n|cFFFFFF00-|r Added a Boss Emotes tab for Encounter Details plugin |cFF999999(thanks Bloodforce-Azralon)|r.\n\n|cFFFFFF00-|r Rework on Activity Time, now it is tuned to closely match warcraftlogs |cFF999999(thanks www.warcraftlogs.com)|r.\n\n|cFFFFFF00-|r Added two new customs: Damage Activity Time and Healing Activity Time.\n\n|cFFFFFF00-|r Time Attack Plugin now have six fixed time amount options for test your dps on training dummies.\n\n|cFFFFFF00-|r Time Attack Plugin can now also share results on your realm, between players with the same class.\n\n|cFFFFFF00v1.23.6 (|cFFFFCC00Ago 24, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added 2 new bar textures and 6 new fonts.\n\n|cFFFFFF00-|r Swapped left and middle button for enemy bars, now left button open damage taken and middle button player detail window.\n\n|cFFFFFF00-|r Added new skin: Minimalistic v2.\n\n|cFFFFFF00-|r Minimalistic v2 is now the default skin.\n\n|cFFFFFF00-|r Few changes on both icon packs with transparency.\n\n|cFFFFFF00-|r Replaced the slash command '/d' with '/de' |cFF999999(thanks @kamuul-mmochampion forum)|r.\n\n|cFFFFFF00-|r Added custom spells for Atonement, Power Word: Solance and Life Bloom |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00v1.22.4 (|cFFFFCC00Ago 15, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added new skin: ElvUI Frame Style (Black White).\n\n|cFFFFFF00-|r Align With Right Chat Window option now check if the window have statusbar enabled.\n\n|cFFFFFF00-|r Few improvements on report for Deaths and Spells over Player Detail Window.\n\n|cFFFFFF00-|r Added option to disable reset button (reset only using its tooltip menu).\n\n|cFFFFFF00-|r Added option for disable window groups.\n\n|cFFFFFF00-|r Added option for select the icon pack to use, also added black white icon pack.\n\n|cFFFFFF00-|r Fixed many bugs involving skins and profiles, thing should run more smooth now.\n\n|cFFFFFF00-|r Plugin Time Attack now correctly saves the attempt when pressing the big save button.\n\n|cFFFFFF00-|r Added support for hotcorners.\n\n|cFFFFFF00v1.21.4 (|cFFFFCC00Ago 9, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Shaman's Ancestral Guidance on cooldowns list |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Added a profile selection screen when Details! are running for the first time on a character.\n\n|cFFFFFF00-|r Added Menu Text Size option over miscellaneous section on options panel |cFF999999(thanks @ Revi-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed a bug over Healing Player Details Window where pets wasn't being shown |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed issue with summoning pets with unknown owners where it was breaking the summon of all the others pets. |cFF999999(thanks @ThunderLost-curse website)|r.\n\n|cFFFFFF00-|r Hot Corners isn't no more a part of Details!, instead of that, Hot Corner is now a standalone addon which needs to be installed separately for who wants to use it.\n\n|cFFFFFF00-|r Skin data is now stored inside the profiles, many code parts got rewrite, still may have few bugs but it's more reliable then before.\n\n|cFFFFFF00-|r Rework on Auras and Voidzones: now shows damage, dps and percentage. Also its tooltip got fixes and now shows the correct damage done to players.\n\n|cFFFFFF00-|r Tooltip for Enemies now shows damage taken from players |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00-|r Right clicking a real-time enemy bar, makes it back to Enemies display instead of show Bookmark panel |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00-|r Tank comparison from previous segment now uses the same percentage method from player comparison panel.\n\n|cFFFFFF00-|r Fix bug with the slash command 'show' where was ignoring the window limit set on options panel |cFF999999(thanks @Castiel-US-Azralon realm)|r.\n\n|cFFFFFF00-|r Fixed few bugs with scroll bars, including scrolls on dropdown menu and player detail window |cFF999999(thanks @Revi-mmochampion forum)|r.\n\n|cFFFFFF00v1.20.2 (|cFFFFCC00Aug 1, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added a option under Miscellaneous section to provide spell link instead of spell name for helpful spells when reporting a death |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Improvements done on how deaths are handled, now latest events before death will be more precise.\n\n|cFFFFFF00-|r Implemented Damage Taken from environment like lava, gravity, etc.\n\n|cFFFFFF00-|r Added Warlock's Fire and Brimstone spell on customized spells.\n\n|cFFFFFF00-|r Added dwarf racial Stone Form on cooldown list |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Bookmark now are shared between all characters.\n\n|cFFFFFF00-|r Fixed few inconsistencies with trash recognition.\n\n|cFFFFFF00-|r Fixed Cloud Capture where sometimes it wasn't sharing.\n\n|cFFFFFF00-|r Fixed report where it wasn't sharing for guild and raid when the player name box were empty.\n\n|cFFFFFF00-|r Report box now also saves the position and the last channel used to report |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r You Are Not Prepared plugin now have tooltips for spells and its window auto opens after a boss encounter.\n\n|cFFFFFF00-|r Advanced Death Logs plugin got full rewrite (and still are in development).\n\n|cFFFFFF00v1.19.0 - v1.19.1 - v1.19.2 (|cFFFFCC00Jul 21, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! is now able to be translated by its community for all supported languages through Curse Forge Web Site:\n\n|cFFFFFF00http://wow.curseforge.com/addons/details/localization/|r\n\n|cFFFFFF00-|r Slash commands now are multi language, accepting both english and the localized language.\n\n|cFFFFFF00-|r Added Data Broker for: Combat Time, Player Dps and Player Hps.\n\n|cFFFFFF00-|r Rework on plugins: Timeline, You Are Not Prepared, Tiny Threat, Encounter Details. All those plugins got a options panel and few improvaments.\n\n|cFFFFFF00-|r Trash segments won't be saved anymore.\n\n|cFFFFFF00-|r Added support for plugins options.\n\n|cFFFFFF00-|r Revamp on Deaths report lines, adding links for harmful spells and changing the text order |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Modified the percentage used on Comparison panel |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed the Raid Dps and Hps data exported by Data Broker |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00v1.18.4 - v1.18.5 - v1.18.6 (|cFFFFCC00Jul 13, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added option to customize the bar left text.\n\n|cFFFFFF00-|r Added option for show or hide bar placement number.\n\n|cFFFFFF00-|r Spell icon is shown in the bar when the enemy character is a environment spell type.\n\n|cFFFFFF00-|r Changed the non-player enemy icon (monsters).\n\n|cFFFFFF00-|r Fixed bug on flex performance profile |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Added new version tracker which should alert you when a newer Details! version is found.\n\n|cFFFFFF00-|r Added Enemy Damage Taken by clicking with middle mouse button over a enemy bar (enemies display).\n\n|cFFFFFF00-|r Added import/export for saved skins and custom displays created.\n\n|cFFFFFF00-|r Small changes on ElvUI Frame Style skin (need reaply).\n\n|cFFFFFF00-|r Fixed the death recognition for bosses, now it should show the correct color over segments menu.\n\n|cFFFFFF00-|r Fixed Dps inacuracy when plyaing solo (no party or raid group).\n\n|cFFFFFF00-|r Fixed the duration time of buffs applied before the pull, like pre-potions.\n\n|cFFFFFF00v1.17.5 (|cFFFFCC00Jun 30, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Shortcut panel is now known as Bookmarks and a revamp has done on its panel.\n\n|cFFFFFF00-|r NickTag now doesnt check anymore if a received nickname from other guild member is invalid.\n\n|cFFFFFF00-|r Healthstone now is considered a cooldown.\n\n|cFFFFFF00-|r Few improvements on Default Skin, Minimalistic Skin and ElvUI Frame Style Skin.\n\n|cFFFFFF00-|r Revamp on Image Editor, many bugs solves and now it is usable." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.25.0 (|cFFFFCC00Set 08, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Acitivity Time for Damage + Healing, tooltip show the activity separately.\n\n|cFFFFFF00-|r Major changes on Encounter Details Plugin making more easy to use.\n\n|cFFFFFF00-|r Removed Spell Details Plugin.\n\n|cFFFFFF00-|r Added new plugin for Solo Mode: Dps Tuning.\n\n|cFFFFFF00v1.24.5 (|cFFFFCC00Ago 31, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Raid Tools bracket on Options Panel.\n\n|cFFFFFF00-|r Added interrupt, cooldown and death announcers (raid tools).\n\n|cFFFFFF00-|r Added pre potion recognition, showing after the encounter on the chat only for you (raid tools).\n\n|cFFFFFF00-|r Added a Boss Emotes tab for Encounter Details plugin |cFF999999(thanks Bloodforce-Azralon)|r.\n\n|cFFFFFF00-|r Rework on Activity Time, now it is tuned to closely match warcraftlogs |cFF999999(thanks www.warcraftlogs.com)|r.\n\n|cFFFFFF00-|r Added two new customs: Damage Activity Time and Healing Activity Time.\n\n|cFFFFFF00-|r Time Attack Plugin now have six fixed time amount options for test your dps on training dummies.\n\n|cFFFFFF00-|r Time Attack Plugin can now also share results on your realm, between players with the same class.\n\n|cFFFFFF00v1.23.6 (|cFFFFCC00Ago 24, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added 2 new bar textures and 6 new fonts.\n\n|cFFFFFF00-|r Swapped left and middle button for enemy bars, now left button open damage taken and middle button player detail window.\n\n|cFFFFFF00-|r Added new skin: Minimalistic v2.\n\n|cFFFFFF00-|r Minimalistic v2 is now the default skin.\n\n|cFFFFFF00-|r Few changes on both icon packs with transparency.\n\n|cFFFFFF00-|r Replaced the slash command '/d' with '/de' |cFF999999(thanks @kamuul-mmochampion forum)|r.\n\n|cFFFFFF00-|r Added custom spells for Atonement, Power Word: Solance and Life Bloom |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00v1.22.4 (|cFFFFCC00Ago 15, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added new skin: ElvUI Frame Style (Black White).\n\n|cFFFFFF00-|r Align With Right Chat Window option now check if the window have statusbar enabled.\n\n|cFFFFFF00-|r Few improvements on report for Deaths and Spells over Player Detail Window.\n\n|cFFFFFF00-|r Added option to disable reset button (reset only using its tooltip menu).\n\n|cFFFFFF00-|r Added option for disable window groups.\n\n|cFFFFFF00-|r Added option for select the icon pack to use, also added black white icon pack.\n\n|cFFFFFF00-|r Fixed many bugs involving skins and profiles, thing should run more smooth now.\n\n|cFFFFFF00-|r Plugin Time Attack now correctly saves the attempt when pressing the big save button.\n\n|cFFFFFF00-|r Added support for hotcorners.\n\n|cFFFFFF00v1.21.4 (|cFFFFCC00Ago 9, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added Shaman's Ancestral Guidance on cooldowns list |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Added a profile selection screen when Details! are running for the first time on a character.\n\n|cFFFFFF00-|r Added Menu Text Size option over miscellaneous section on options panel |cFF999999(thanks @ Revi-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed a bug over Healing Player Details Window where pets wasn't being shown |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed issue with summoning pets with unknown owners where it was breaking the summon of all the others pets. |cFF999999(thanks @ThunderLost-curse website)|r.\n\n|cFFFFFF00-|r Hot Corners isn't no more a part of Details!, instead of that, Hot Corner is now a standalone addon which needs to be installed separately for who wants to use it.\n\n|cFFFFFF00-|r Skin data is now stored inside the profiles, many code parts got rewrite, still may have few bugs but it's more reliable then before.\n\n|cFFFFFF00-|r Rework on Auras and Voidzones: now shows damage, dps and percentage. Also its tooltip got fixes and now shows the correct damage done to players.\n\n|cFFFFFF00-|r Tooltip for Enemies now shows damage taken from players |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00-|r Right clicking a real-time enemy bar, makes it back to Enemies display instead of show Bookmark panel |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00-|r Tank comparison from previous segment now uses the same percentage method from player comparison panel.\n\n|cFFFFFF00-|r Fix bug with the slash command 'show' where was ignoring the window limit set on options panel |cFF999999(thanks @Castiel-US-Azralon realm)|r.\n\n|cFFFFFF00-|r Fixed few bugs with scroll bars, including scrolls on dropdown menu and player detail window |cFF999999(thanks @Revi-mmochampion forum)|r.\n\n|cFFFFFF00v1.20.2 (|cFFFFCC00Aug 1, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added a option under Miscellaneous section to provide spell link instead of spell name for helpful spells when reporting a death |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Improvements done on how deaths are handled, now latest events before death will be more precise.\n\n|cFFFFFF00-|r Implemented Damage Taken from environment like lava, gravity, etc.\n\n|cFFFFFF00-|r Added Warlock's Fire and Brimstone spell on customized spells.\n\n|cFFFFFF00-|r Added dwarf racial Stone Form on cooldown list |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Bookmark now are shared between all characters.\n\n|cFFFFFF00-|r Fixed few inconsistencies with trash recognition.\n\n|cFFFFFF00-|r Fixed Cloud Capture where sometimes it wasn't sharing.\n\n|cFFFFFF00-|r Fixed report where it wasn't sharing for guild and raid when the player name box were empty.\n\n|cFFFFFF00-|r Report box now also saves the position and the last channel used to report |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r You Are Not Prepared plugin now have tooltips for spells and its window auto opens after a boss encounter.\n\n|cFFFFFF00-|r Advanced Death Logs plugin got full rewrite (and still are in development).\n\n|cFFFFFF00v1.19.0 - v1.19.1 - v1.19.2 (|cFFFFCC00Jul 21, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Details! is now able to be translated by its community for all supported languages through Curse Forge Web Site:\n\n|cFFFFFF00http://wow.curseforge.com/addons/details/localization/|r\n\n|cFFFFFF00-|r Slash commands now are multi language, accepting both english and the localized language.\n\n|cFFFFFF00-|r Added Data Broker for: Combat Time, Player Dps and Player Hps.\n\n|cFFFFFF00-|r Rework on plugins: Timeline, You Are Not Prepared, Tiny Threat, Encounter Details. All those plugins got a options panel and few improvaments.\n\n|cFFFFFF00-|r Trash segments won't be saved anymore.\n\n|cFFFFFF00-|r Added support for plugins options.\n\n|cFFFFFF00-|r Revamp on Deaths report lines, adding links for harmful spells and changing the text order |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Modified the percentage used on Comparison panel |cFF999999(thanks @Mystery2012-mmochampion forum)|r.\n\n|cFFFFFF00-|r Fixed the Raid Dps and Hps data exported by Data Broker |cFF999999(thanks @Arieth-mmochampion forum)|r.\n\n|cFFFFFF00v1.18.4 - v1.18.5 - v1.18.6 (|cFFFFCC00Jul 13, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added option to customize the bar left text.\n\n|cFFFFFF00-|r Added option for show or hide bar placement number.\n\n|cFFFFFF00-|r Spell icon is shown in the bar when the enemy character is a environment spell type.\n\n|cFFFFFF00-|r Changed the non-player enemy icon (monsters).\n\n|cFFFFFF00-|r Fixed bug on flex performance profile |cFF999999(thanks @skmzarn-mmochampion forum)|r.\n\n|cFFFFFF00-|r Added new version tracker which should alert you when a newer Details! version is found.\n\n|cFFFFFF00-|r Added Enemy Damage Taken by clicking with middle mouse button over a enemy bar (enemies display).\n\n|cFFFFFF00-|r Added import/export for saved skins and custom displays created.\n\n|cFFFFFF00-|r Small changes on ElvUI Frame Style skin (need reaply).\n\n|cFFFFFF00-|r Fixed the death recognition for bosses, now it should show the correct color over segments menu.\n\n|cFFFFFF00-|r Fixed Dps inacuracy when plyaing solo (no party or raid group).\n\n|cFFFFFF00-|r Fixed the duration time of buffs applied before the pull, like pre-potions.\n\n|cFFFFFF00v1.17.5 (|cFFFFCC00Jun 30, 2014|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Shortcut panel is now known as Bookmarks and a revamp has done on its panel.\n\n|cFFFFFF00-|r NickTag now doesnt check anymore if a received nickname from other guild member is invalid.\n\n|cFFFFFF00-|r Healthstone now is considered a cooldown.\n\n|cFFFFFF00-|r Few improvements on Default Skin, Minimalistic Skin and ElvUI Frame Style Skin.\n\n|cFFFFFF00-|r Revamp on Image Editor, many bugs solves and now it is usable." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails!:|r " --> startup diff --git a/classes/classe_combate.lua b/classes/classe_combate.lua index aa4378a4..b0c3dd40 100644 --- a/classes/classe_combate.lua +++ b/classes/classe_combate.lua @@ -70,6 +70,10 @@ return self.last_events_tables end + function combate:GetCombatNumber() + return self.combat_counter + end + --return the name of the encounter or enemy function combate:GetCombatName (try_find) if (self.is_pvp) then @@ -141,6 +145,9 @@ _setmetatable (esta_tabela, combate) + _detalhes.combat_counter = _detalhes.combat_counter + 1 + esta_tabela.combat_counter = _detalhes.combat_counter + --> try discover if is a pvp combat local who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags = ... if (who_serial) then --> aqui irá identificar o boss ou o oponente diff --git a/classes/classe_custom.lua b/classes/classe_custom.lua index 2e069fca..51002ad7 100644 --- a/classes/classe_custom.lua +++ b/classes/classe_custom.lua @@ -644,6 +644,11 @@ table.wipe (self._NameIndexTable) end + function atributo_custom:GetValue (actor) + local actor_table = self:GetActorTable (actor) + return actor_table.value + end + function atributo_custom:AddValue (actor, actortotal, checktop) local actor_table = self:GetActorTable (actor) actor_table.my_actor = actor @@ -654,6 +659,8 @@ atributo_custom._TargetActorsProcessedTop = actor_table.value end end + + return actor_table.value end function atributo_custom:SetValue (actor, actortotal) @@ -1122,77 +1129,20 @@ self.custom [#self.custom+1] = Healthstone end - local DamageActivityTime = { - name = Loc ["STRING_CUSTOM_ACTIVITY_DPS"], - icon = [[Interface\ICONS\Achievement_PVP_H_06]], +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + local ActivityTime = { + name = Loc ["STRING_CUSTOM_ACTIVITY_ALL"], + icon = [[INTERFACE\ICONS\Achievement_PVP_G_15]], attribute = false, spellid = false, author = "Details!", - desc = Loc ["STRING_CUSTOM_ACTIVITY_DPS_DESC"], + desc = Loc ["STRING_CUSTOM_ACTIVITY_ALL_DESC"], source = false, target = false, total_script = [[ local value, top, total, combat, instance = ... - local minutos, segundos = math.floor (value/60), math.floor (value%60) - return minutos .. "m " .. segundos .. "s" - ]], - percent_script = [[ - local value, top, total, combat, instance = ... - return string.format ("%.1f", value/top*100) - ]], - script = [[ - --init: - local combat, instance_container, instance = ... - local total, amount = 0, 0 - - --get the misc actor container - local damage_container = combat:GetActorList ( DETAILS_ATTRIBUTE_DAMAGE ) - - --do the loop: - for _, player in ipairs ( damage_container ) do - if (player.grupo) then - local activity = player:Tempo() - total = total + activity - amount = amount + 1 - --add amount to the player - instance_container:AddValue (player, activity) - end - end - - --return: - return total, combat:GetCombatTime(), amount - ]], - tooltip = [[ - - ]], - } - - local have = false - for _, custom in ipairs (self.custom) do - if (custom.name == Loc ["STRING_CUSTOM_ACTIVITY_DPS"]) then - have = true - break - end - end - if (not have) then - setmetatable (DamageActivityTime, _detalhes.atributo_custom) - DamageActivityTime.__index = _detalhes.atributo_custom - self.custom [#self.custom+1] = DamageActivityTime - end - - local HealActivityTime = { - name = Loc ["STRING_CUSTOM_ACTIVITY_HPS"], - icon = [[Interface\ICONS\Achievement_PVP_G_06]], - attribute = false, - spellid = false, - author = "Details!", - desc = Loc ["STRING_CUSTOM_ACTIVITY_HPS_DESC"], - source = false, - target = false, - total_script = [[ - local value, top, total, combat, instance = ... - local minutos, segundos = math.floor (value/60), math.floor (value%60) - return minutos .. "m " .. segundos .. "s" + return math.floor (value) ]], percent_script = [[ local value, top, total, combat, instance = ... @@ -1203,39 +1153,86 @@ local combat, instance_container, instance = ... local total, top, amount = 0, 0, 0 - --get the misc actor container - local damage_container = combat:GetActorList ( DETAILS_ATTRIBUTE_HEAL ) + --get the heal actor container + local heal_container = combat:GetActorList ( DETAILS_ATTRIBUTE_HEAL ) --do the loop: - for _, player in ipairs ( damage_container ) do + for _, player in ipairs ( heal_container ) do if (player.grupo) then local activity = player:Tempo() total = total + activity amount = amount + 1 --add amount to the player instance_container:AddValue (player, activity) + if (activity > top) then + top = activity + end + end + end + + --get the damage actor container + local damage_container = combat:GetActorList ( DETAILS_ATTRIBUTE_DAMAGE ) + + --do the loop: + for _, player in ipairs ( damage_container ) do + if (player.grupo) then + local activity = player:Tempo() + total = total + activity + if (not instance_container._NameIndexTable [player:Name()]) then + amount = amount + 1 + end + --add amount to the player + local value = instance_container:AddValue (player, activity) + if (value > top) then + top = value + end end end --return: - return total, combat:GetCombatTime(), amount + return total, top, amount ]], tooltip = [[ + --init: + local player, combat, instance = ... + local damage_actor = combat (DETAILS_ATTRIBUTE_DAMAGE, player:Name()) + if (damage_actor) then + local damage_activity = damage_actor:Tempo() + local minutos1, segundos1 = math.floor (damage_activity/60), math.floor (damage_activity%60) + GameCooltip:AddLine ("Damage Activity", minutos1 .. "m " .. segundos1 .. "s") + _detalhes:AddTooltipBackgroundStatusbar() + GameCooltip:AddIcon ('Interface\\ICONS\\Achievement_PVP_H_06', 1, 1, 14, 14) + else + GameCooltip:AddLine ("Damage Activity", "0m 0s") + end + + local heal_actor = combat (DETAILS_ATTRIBUTE_HEAL, player:Name()) + if (heal_actor) then + local heal_activity = heal_actor:Tempo() + local minutos2, segundos2 = math.floor (heal_activity/60), math.floor (heal_activity%60) + GameCooltip:AddLine ("Heal Activity", minutos2 .. "m " .. segundos2 .. "s") + _detalhes:AddTooltipBackgroundStatusbar() + GameCooltip:AddIcon ('Interface\\ICONS\\Achievement_PVP_G_06', 1, 1, 14, 14) + else + GameCooltip:AddLine ("Heal Activity", "0m 0s") + end ]], } + --/run _detalhes:AddDefaultCustomDisplays() + local have = false for _, custom in ipairs (self.custom) do - if (custom.name == Loc ["STRING_CUSTOM_ACTIVITY_HPS"]) then + if (custom.name == Loc ["STRING_CUSTOM_ACTIVITY_ALL"]) then have = true break end end if (not have) then - setmetatable (HealActivityTime, _detalhes.atributo_custom) - HealActivityTime.__index = _detalhes.atributo_custom - self.custom [#self.custom+1] = HealActivityTime + setmetatable (ActivityTime, _detalhes.atributo_custom) + ActivityTime.__index = _detalhes.atributo_custom + self.custom [#self.custom+1] = ActivityTime end end diff --git a/classes/classe_others.lua b/classes/classe_others.lua index ef1355ae..3cb93641 100644 --- a/classes/classe_others.lua +++ b/classes/classe_others.lua @@ -1370,8 +1370,7 @@ function _detalhes:CatchRaidBuffUptime (in_or_out) end _detalhes.parser:add_buff_uptime (nil, GetTime(), _UnitGUID ("player"), playerName, 0x00000514, _UnitGUID ("player"), playerName, 0x00000514, spellid, name, in_or_out) - else - break + end end @@ -1398,9 +1397,7 @@ function _detalhes:CatchRaidBuffUptime (in_or_out) end _detalhes.parser:add_buff_uptime (nil, GetTime(), _UnitGUID ("party"..groupIndex), playerName, 0x00000417, _UnitGUID ("party"..groupIndex), playerName, 0x00000417, spellid, name, in_or_out) - - else - --break + end end end @@ -1410,8 +1407,6 @@ function _detalhes:CatchRaidBuffUptime (in_or_out) if (name and unitCaster == "player") then local playerName = _UnitName ("player") _detalhes.parser:add_buff_uptime (nil, GetTime(), _UnitGUID ("player"), playerName, 0x00000417, _UnitGUID ("player"), playerName, 0x00000417, spellid, name, in_or_out) - else - break end end @@ -1431,8 +1426,6 @@ function _detalhes:CatchRaidBuffUptime (in_or_out) end _detalhes.parser:add_buff_uptime (nil, GetTime(), _UnitGUID ("player"), playerName, 0x00000417, _UnitGUID ("player"), playerName, 0x00000417, spellid, name, in_or_out) - else - break end end diff --git a/core/control.lua b/core/control.lua index 8fbf9651..6aafc001 100644 --- a/core/control.lua +++ b/core/control.lua @@ -536,7 +536,9 @@ _detalhes.SoloTables.CombatID = _detalhes.SoloTables.CombatIDLast else - _detalhes:RefreshSolo() + if (_detalhes.RefreshSolo) then + _detalhes:RefreshSolo() + end _detalhes.SoloTables.CombatID = nil end end diff --git a/core/parser.lua b/core/parser.lua index a382513e..20d7e208 100644 --- a/core/parser.lua +++ b/core/parser.lua @@ -2555,7 +2555,6 @@ end end - --"ENVIRONMENTAL_DAMAGE" --> damage aplied by enviorement like lava. --SPELL_PERIODIC_MISSED --> need research --DAMAGE_SHIELD_MISSED --> need research --SPELL_EXTRA_ATTACKS --> need research diff --git a/core/plugins.lua b/core/plugins.lua index bb73bc47..24e684d5 100644 --- a/core/plugins.lua +++ b/core/plugins.lua @@ -248,7 +248,42 @@ template = template or 1 - if (template == 1) then + if (template == 2) then + local options_frame = CreateFrame ("frame", name, UIParent, "ButtonFrameTemplate") + tinsert (UISpecialFrames, name) + options_frame:SetSize (500, 200) + options_frame:SetFrameStrata ("DIALOG") + + options_frame:SetScript ("OnMouseDown", function(self, button) + if (button == "RightButton") then + if (self.moving) then + self.moving = false + self:StopMovingOrSizing() + end + return options_frame:Hide() + elseif (button == "LeftButton" and not self.moving) then + self.moving = true + self:StartMoving() + end + end) + options_frame:SetScript ("OnMouseUp", function(self) + if (self.moving) then + self.moving = false + self:StopMovingOrSizing() + end + end) + + options_frame:SetMovable (true) + options_frame:EnableMouse (true) + options_frame:Hide() + + options_frame:SetPoint ("center", UIParent, "center") + options_frame.TitleText:SetText (title) + options_frame.portrait:SetTexture ([[Interface\CHARACTERFRAME\TEMPORARYPORTRAIT-FEMALE-BLOODELF]]) + + return options_frame + + elseif (template == 1) then local options_frame = CreateFrame ("frame", name, UIParent) tinsert (UISpecialFrames, name) options_frame:SetSize (500, 200) diff --git a/framework/button.lua b/framework/button.lua index 92660d02..0243c648 100644 --- a/framework/button.lua +++ b/framework/button.lua @@ -576,7 +576,7 @@ local ButtonMetaFunctions = {} end if (button.MyObject.OnEnterHook) then - local interrupt = button.MyObject.OnEnterHook (button) + local interrupt = button.MyObject.OnEnterHook (button, button.MyObject) if (interrupt) then return end @@ -621,7 +621,7 @@ local ButtonMetaFunctions = {} end if (button.MyObject.OnLeaveHook) then - local interrupt = button.MyObject.OnLeaveHook (button) + local interrupt = button.MyObject.OnLeaveHook (button, button.MyObject) if (interrupt) then return end @@ -653,7 +653,7 @@ local ButtonMetaFunctions = {} local OnHide = function (button) if (button.MyObject.OnHideHook) then - local interrupt = button.MyObject.OnHideHook (button) + local interrupt = button.MyObject.OnHideHook (button, button.MyObject) if (interrupt) then return end @@ -662,7 +662,7 @@ local ButtonMetaFunctions = {} local OnShow = function (button) if (button.MyObject.OnShowHook) then - local interrupt = button.MyObject.OnShowHook (button) + local interrupt = button.MyObject.OnShowHook (button, button.MyObject) if (interrupt) then return end @@ -687,7 +687,7 @@ local ButtonMetaFunctions = {} end if (button.MyObject.OnMouseDownHook) then - local interrupt = button.MyObject.OnMouseDownHook (button, buttontype) + local interrupt = button.MyObject.OnMouseDownHook (button, buttontype, button.MyObject) if (interrupt) then return end @@ -774,7 +774,7 @@ local ButtonMetaFunctions = {} end if (button.MyObject.OnMouseUpHook) then - local interrupt = button.MyObject.OnMouseUpHook (button, buttontype) + local interrupt = button.MyObject.OnMouseUpHook (button, buttontype, button.MyObject) if (interrupt) then return end @@ -836,10 +836,16 @@ local ButtonMetaFunctions = {} ------------------------------------------------------------------------------------------------------------ --> object constructor +function gump:CreateButton (parent, func, w, h, text, param1, param2, texture, member, name, short_method) + return gump:NewButton (parent, parent, name, member, w, h, func, param1, param2, texture, text, short_method) +end + function gump:NewButton (parent, container, name, member, w, h, func, param1, param2, texture, text, short_method) if (not name) then - return nil + name = "DetailsButtonNumber" .. gump.ButtonCounter + gump.ButtonCounter = gump.ButtonCounter + 1 + elseif (not parent) then return nil end diff --git a/framework/cooltip.lua b/framework/cooltip.lua index e383b046..7e4a7bc6 100644 --- a/framework/cooltip.lua +++ b/framework/cooltip.lua @@ -72,6 +72,7 @@ function DetailsCreateCoolTip() ["FixedHeight"] = true, ["FixedWidthSub"] = true, ["FixedHeightSub"] = true, + ["AlignAsBlizzTooltip"] = true, ["IgnoreSubMenu"] = true, ["IgnoreButtonAutoHeight"] = true, ["TextHeightMod"] = true, @@ -301,16 +302,6 @@ function DetailsCreateCoolTip() end) frame1:SetScript ("OnHide", function (self) - --[[ --> avoid taint errors - if (not frame1.hidden) then --> significa que foi fechado com ESC - frame1:Show() - gump:Fade (frame1, 1) - end - if (not frame2.hidden) then --> significa que foi fechado com ESC - frame2:Show() - gump:Fade (frame2, 1) - end - --]] CoolTip.active = false CoolTip.buttonClicked = false CoolTip.mouseOver = false @@ -1163,7 +1154,13 @@ function DetailsCreateCoolTip() menuButton:SetPoint ("right", frame1, "right") --> height - if (CoolTip.OptionsTable.IgnoreButtonAutoHeight) then + if (CoolTip.OptionsTable.AlignAsBlizzTooltip) then + local height = _math_max (8, menuButton.leftText:GetStringHeight(), menuButton.rightText:GetStringHeight(), menuButton.leftIcon:GetHeight(), menuButton.rightIcon:GetHeight()) + menuButton:SetHeight (height) + menuButton:SetPoint ("top", frame1, "top", 0, temp) + temp = temp + ( height * -1) + + elseif (CoolTip.OptionsTable.IgnoreButtonAutoHeight) then local height = _math_max (menuButton.leftText:GetStringHeight(), menuButton.rightText:GetStringHeight(), menuButton.leftIcon:GetHeight(), menuButton.rightIcon:GetHeight()) menuButton:SetHeight (height) @@ -1213,7 +1210,9 @@ function DetailsCreateCoolTip() if (CoolTip.OptionsTable.FixedHeight) then frame1:SetHeight (CoolTip.OptionsTable.FixedHeight) else - if (CoolTip.OptionsTable.IgnoreButtonAutoHeight) then + if (CoolTip.OptionsTable.AlignAsBlizzTooltip) then + frame1:SetHeight ( (temp-10) * -1) + elseif (CoolTip.OptionsTable.IgnoreButtonAutoHeight) then frame1:SetHeight ( (temp+spacing) * -1) else frame1:SetHeight ( _math_max ( (frame1.hHeight * CoolTip.Indexes) + 12, 22 )) @@ -2354,12 +2353,10 @@ function DetailsCreateCoolTip() if (not lineTable_left) then lineTable_left = {} _table_insert (frameTableLeft, CoolTip.Indexes, lineTable_left) - --frameTableLeft [CoolTip.Indexes] = lineTable_left end if (not lineTable_right) then lineTable_right = {} _table_insert (frameTableRight, CoolTip.Indexes, lineTable_right) - --frameTableRight [CoolTip.Indexes] = lineTable_right end end diff --git a/framework/dropdown.lua b/framework/dropdown.lua index a4344b9a..2237dfa9 100644 --- a/framework/dropdown.lua +++ b/framework/dropdown.lua @@ -819,10 +819,16 @@ end ------------------------------------------------------------------------------------------------------------ --> object constructor +function gump:CreateDropDown (parent, func, default, w, h, member, name) + return gump:NewDropDown (parent, parent, name, member, w, h, func, default) +end + function gump:NewDropDown (parent, container, name, member, w, h, func, default) if (not name) then - return nil + name = "DetailsDropDownNumber" .. gump.DropDownCounter + gump.DropDownCounter = gump.DropDownCounter + 1 + elseif (not parent) then return nil end diff --git a/framework/framework.lua b/framework/framework.lua index 40814dab..5e93bb1d 100644 --- a/framework/framework.lua +++ b/framework/framework.lua @@ -7,6 +7,10 @@ local _unpack = unpack local _ gump.LabelNameCounter = 1 gump.PictureNameCounter = 1 +gump.BarNameCounter = 1 +gump.DropDownCounter = 1 +gump.PanelCounter = 1 +gump.ButtonCounter = 1 gump.debug = false diff --git a/framework/label.lua b/framework/label.lua index f1ac9ec2..8da69613 100644 --- a/framework/label.lua +++ b/framework/label.lua @@ -217,11 +217,11 @@ local LabelMetaFunctions = {} ------------------------------------------------------------------------------------------------------------ --> object constructor -function gump:CreateLabel (parent, text, size, color, font, member, name) - return gump:NewLabel (parent, nil, name, member, text, font, size, color) +function gump:CreateLabel (parent, text, size, color, font, member, name, layer) + return gump:NewLabel (parent, nil, name, member, text, font, size, color, layer) end -function gump:NewLabel (parent, container, name, member, text, font, size, color) +function gump:NewLabel (parent, container, name, member, text, font, size, color, layer) if (not parent) then return nil @@ -257,7 +257,7 @@ function gump:NewLabel (parent, container, name, member, text, font, size, color font = font or "GameFontHighlightSmall" - LabelObject.label = parent:CreateFontString (name, "OVERLAY", font) + LabelObject.label = parent:CreateFontString (name, layer or "OVERLAY", font) LabelObject.widget = LabelObject.label LabelObject.label.MyObject = LabelObject diff --git a/framework/normal_bar.lua b/framework/normal_bar.lua index 7e3fc005..6e73436c 100644 --- a/framework/normal_bar.lua +++ b/framework/normal_bar.lua @@ -419,7 +419,7 @@ local APIBarFunctions local OnEnter = function (frame) if (frame.MyObject.OnEnterHook) then - local interrupt = frame.MyObject.OnEnterHook (frame) + local interrupt = frame.MyObject.OnEnterHook (frame, frame.MyObject) if (interrupt) then return end @@ -591,10 +591,16 @@ function DetailsNormalBar_OnCreate (self) return true end -function gump:NewBar (parent, container, name, member, w, h, value) +function gump:CreateBar (parent, texture, w, h, value, member, name) + return gump:NewBar (parent, parent, name, member, w, h, value, texture) +end + +function gump:NewBar (parent, container, name, member, w, h, value, texture_name) if (not name) then - return nil + name = "DetailsBarNumber" .. gump.BarNameCounter + gump.BarNameCounter = gump.BarNameCounter + 1 + elseif (not parent) then return nil elseif (not container) then @@ -617,6 +623,10 @@ function gump:NewBar (parent, container, name, member, w, h, value) if (container.dframework) then container = container.widget end + + value = value or 0 + w = w or 150 + h = h or 14 --> default members: --> hooks @@ -680,6 +690,11 @@ function gump:NewBar (parent, container, name, member, w, h, value) --> set class _setmetatable (BarObject, BarMetaFunctions) - + + --> set texture + if (texture_name) then + smember_texture (BarObject, texture_name) + end + return BarObject end diff --git a/framework/panel.lua b/framework/panel.lua index 9e7867db..8fbf3896 100644 --- a/framework/panel.lua +++ b/framework/panel.lua @@ -357,7 +357,7 @@ local APIFrameFunctions local OnEnter = function (frame) if (frame.MyObject.OnEnterHook) then - local interrupt = frame.MyObject.OnEnterHook (frame) + local interrupt = frame.MyObject.OnEnterHook (frame, frame.MyObject) if (interrupt) then return end @@ -379,7 +379,7 @@ local APIFrameFunctions local OnLeave = function (frame) if (frame.MyObject.OnLeaveHook) then - local interrupt = frame.MyObject.OnLeaveHook (frame) + local interrupt = frame.MyObject.OnLeaveHook (frame, frame.MyObject) if (interrupt) then return end @@ -397,7 +397,7 @@ local APIFrameFunctions local OnHide = function (frame) if (frame.MyObject.OnHideHook) then - local interrupt = frame.MyObject.OnHideHook (frame) + local interrupt = frame.MyObject.OnHideHook (frame, frame.MyObject) if (interrupt) then return end @@ -406,7 +406,7 @@ local APIFrameFunctions local OnShow = function (frame) if (frame.MyObject.OnShowHook) then - local interrupt = frame.MyObject.OnShowHook (frame) + local interrupt = frame.MyObject.OnShowHook (frame, frame.MyObject) if (interrupt) then return end @@ -415,7 +415,7 @@ local APIFrameFunctions local OnMouseDown = function (frame, button) if (frame.MyObject.OnMouseDownHook) then - local interrupt = frame.MyObject.OnMouseDownHook (frame, button) + local interrupt = frame.MyObject.OnMouseDownHook (frame, button, frame.MyObject) if (interrupt) then return end @@ -439,7 +439,7 @@ local APIFrameFunctions local OnMouseUp = function (frame, button) if (frame.MyObject.OnMouseUpHook) then - local interrupt = frame.MyObject.OnMouseUpHook (frame, button) + local interrupt = frame.MyObject.OnMouseUpHook (frame, button, frame.MyObject) if (interrupt) then return end @@ -464,10 +464,16 @@ local APIFrameFunctions ------------------------------------------------------------------------------------------------------------ --> object constructor +function gump:CreatePanel (parent, w, h, backdrop, backdropcolor, bordercolor, member, name) + return gump:NewPanel (parent, parent, name, member, w, h, backdrop, backdropcolor, bordercolor) +end + function gump:NewPanel (parent, container, name, member, w, h, backdrop, backdropcolor, bordercolor) if (not name) then - return nil + name = "DetailsPanelNumber" .. gump.PanelCounter + gump.PanelCounter = gump.PanelCounter + 1 + elseif (not parent) then parent = UIParent end @@ -1129,3 +1135,522 @@ function gump:IconPick (callback, close_when_select) gump.IconPickFrame.click_close = close_when_select end + +local chart_panel_backdrop = {bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, +edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", edgeSize = 32, insets = {left = 5, right = 5, top = 5, bottom = 5}} + +local chart_panel_align_timelabels = function (self, elapsed_time) + + self.TimeScale = elapsed_time + + local linha = self.TimeLabels [17] + local minutos, segundos = math.floor (elapsed_time / 60), math.floor (elapsed_time % 60) + if (segundos < 10) then + segundos = "0" .. segundos + end + + if (minutos > 0) then + if (minutos < 10) then + minutos = "0" .. minutos + end + linha:SetText (minutos .. ":" .. segundos) + else + linha:SetText ("00:" .. segundos) + end + + local time_div = elapsed_time / 16 --786 -- 49.125 + + for i = 2, 16 do + + local linha = self.TimeLabels [i] + + local this_time = time_div * (i-1) + local minutos, segundos = math.floor (this_time / 60), math.floor (this_time % 60) + + if (segundos < 10) then + segundos = "0" .. segundos + end + + if (minutos > 0) then + if (minutos < 10) then + minutos = "0" .. minutos + end + linha:SetText (minutos .. ":" .. segundos) + else + linha:SetText ("00:" .. segundos) + end + + end + +end + +local chart_panel_set_scale = function (self, amt, func, text) + if (type (amt) ~= "number") then + return + end + + local piece = amt / 8 + + for i = 1, 8 do + if (func) then + self ["dpsamt" .. math.abs (i-9)]:SetText ( func (piece*i) .. (text or "")) + else + self ["dpsamt" .. math.abs (i-9)]:SetText ( floor (piece*i) .. (text or "")) + end + end +end + +local chart_panel_can_move = function (self, can) + self.can_move = can +end + +local chart_panel_overlay_reset = function (self) + self.OverlaysAmount = 1 + for index, pack in ipairs (self.Overlays) do + for index2, texture in ipairs (pack) do + texture:Hide() + end + end +end + +local chart_panel_reset = function (self) + + self.Graphic:ResetData() + self.Graphic.max_value = 0 + + self.TimeScale = nil + self.BoxLabelsAmount = 1 + table.wipe (self.GData) + table.wipe (self.OData) + + for index, box in ipairs (self.BoxLabels) do + box.check:Hide() + box.button:Hide() + box.box:Hide() + box.text:Hide() + box.border:Hide() + box.showing = false + end + + chart_panel_overlay_reset (self) +end + +local chart_panel_enable_line = function (f, thisbox) + + local index = thisbox.index + local type = thisbox.type + + if (thisbox.enabled) then + --disable + thisbox.check:Hide() + thisbox.enabled = false + else + --enable + thisbox.check:Show() + thisbox.enabled = true + end + + if (type == "graphic") then + + f.Graphic:ResetData() + f.Graphic.max_value = 0 + + local max = 0 + + for index, box in ipairs (f.BoxLabels) do + if (box.type == type and box.showing and box.enabled) then + local data = f.GData [index] + f.Graphic:AddDataSeries (data[1], data[2], nil, data[3]) + if (data[4] > max) then + max = data[4] + end + end + end + + f:SetScale (max) + + elseif (type == "overlay") then + + chart_panel_overlay_reset (f) + + for index, box in ipairs (f.BoxLabels) do + if (box.type == type and box.showing and box.enabled) then + + f:AddOverlay (box.index) + + end + end + + end +end + +local create_box = function (self, next_box) + + local thisbox = {} + self.BoxLabels [next_box] = thisbox + + local box = gump:NewImage (self, nil, 16, 16, "border") + local text = gump:CreateLabel (self, nil, nil, nil, "GameFontNormal") + + local border = gump:NewImage (self, [[Interface\DialogFrame\UI-DialogBox-Gold-Corner]], 30, 30, "artwork") + border:SetPoint ("center", box, "center", -3, -4) + + local checktexture = gump:NewImage (self, [[Interface\Buttons\UI-CheckBox-Check]], 18, 18, "overlay") + checktexture:SetPoint ("center", box, "center", -1, -1) + + thisbox.box = box + thisbox.text = text + thisbox.border = border + thisbox.check = checktexture + thisbox.enabled = true + + local button = gump:CreateButton (self, chart_panel_enable_line, 20, 20, "", self, thisbox) + button:SetPoint ("center", box, "center") + + thisbox.button = button + + thisbox.box:SetPoint ("right", text, "left", -4, 0) + + if (next_box == 1) then + thisbox.text:SetPoint ("topright", self, "topright", -35, -16) + else + thisbox.text:SetPoint ("right", self.BoxLabels [next_box-1].box, "left", -7, 0) + end + + return thisbox + +end + +local chart_panel_add_label = function (self, color, name, type, number) + + local next_box = self.BoxLabelsAmount + local thisbox = self.BoxLabels [next_box] + + if (not thisbox) then + thisbox = create_box (self, next_box) + end + + self.BoxLabelsAmount = self.BoxLabelsAmount + 1 + + thisbox.type = type + thisbox.index = number + + thisbox.box:SetTexture (unpack (color)) + thisbox.text:SetText (name) + + thisbox.check:Show() + thisbox.button:Show() + thisbox.border:Show() + thisbox.box:Show() + thisbox.text:Show() + + thisbox.showing = true + thisbox.enabled = true + +end + +local line_default_color = {1, 1, 1} +local draw_overlay = function (self, this_overlay, overlayData, color) + + local pixel = self.Graphic:GetWidth() / self.TimeScale + local index = 1 + local r, g, b = unpack (color) + + for i = 1, #overlayData, 2 do + local aura_start = overlayData [i] + local aura_end = overlayData [i+1] + + local this_block = this_overlay [index] + if (not this_block) then + this_block = self.Graphic:CreateTexture (nil, "border") + tinsert (this_overlay, this_block) + end + this_block:SetHeight (self.Graphic:GetHeight()) + + this_block:SetPoint ("left", self.Graphic, "left", pixel * aura_start, 0) + if (aura_end) then + this_block:SetWidth ((aura_end-aura_start)*pixel) + else + --malformed table + this_block:SetWidth (pixel*5) + end + + this_block:SetTexture (r, g, b, 0.25) + this_block:Show() + + index = index + 1 + end + +end + +local chart_panel_add_overlay = function (self, overlayData, color, name, icon) + + if (not self.TimeScale) then + error ("Use SetTime (time) before adding an overlay.") + end + + if (type (overlayData) == "number") then + local overlay_index = overlayData + draw_overlay (self, self.Overlays [self.OverlaysAmount], self.OData [overlay_index][1], self.OData [overlay_index][2]) + else + local this_overlay = self.Overlays [self.OverlaysAmount] + if (not this_overlay) then + this_overlay = {} + tinsert (self.Overlays, this_overlay) + end + + draw_overlay (self, this_overlay, overlayData, color) + + tinsert (self.OData, {overlayData, color or line_default_color}) + if (name) then + self:AddLabel (color or line_default_color, name, "overlay", #self.OData) + end + end + + self.OverlaysAmount = self.OverlaysAmount + 1 +end + +local chart_panel_add_data = function (self, graphicData, color, name, lineTexture, smoothLevel) + + + local f = self + self = self.Graphic + + local _data = {} + local max_value = graphicData.max_value + local amount = #graphicData + + local scaleW = 1/self:GetWidth() + + local content = graphicData + tinsert (content, 1, 0) + tinsert (content, 1, 0) + tinsert (content, #content+1, 0) + tinsert (content, #content+1, 0) + + local _i = 3 + + local graphMaxDps = math.max (self.max_value, max_value) + if (not smoothLevel) then + while (_i <= #content-2) do + local v = (content[_i-2]+content[_i-1]+content[_i]+content[_i+1]+content[_i+2])/5 --> normalize + _data [#_data+1] = {scaleW*(_i-2), v/graphMaxDps} --> x and y coords + _i = _i + 1 + end + + elseif (smoothLevel == 1) then + _i = 2 + while (_i <= #content-1) do + local v = (content[_i-1]+content[_i]+content[_i+1])/3 --> normalize + _data [#_data+1] = {scaleW*(_i-1), v/graphMaxDps} --> x and y coords + _i = _i + 1 + end + + elseif (smoothLevel == 2) then + _i = 1 + while (_i <= #content) do + local v = content[_i] --> do not normalize + _data [#_data+1] = {scaleW*(_i), v/graphMaxDps} --> x and y coords + _i = _i + 1 + end + + end + + tremove (content, 1) + tremove (content, 1) + tremove (content, #graphicData) + tremove (content, #graphicData) + + if (max_value > self.max_value) then + --> normalize previous data + if (self.max_value > 0) then + local normalizePercent = self.max_value / max_value + for dataIndex, Data in ipairs (self.Data) do + local Points = Data.Points + for i = 1, #Points do + Points[i][2] = Points[i][2]*normalizePercent + end + end + end + + self.max_value = max_value + end + + tinsert (f.GData, {_data, color or line_default_color, lineTexture, graphicData.max_value}) + if (name) then + f:AddLabel (color or line_default_color, name, "graphic", #f.GData) + end + + self:AddDataSeries (_data, color or line_default_color, nil, lineTexture) + +end + +local chart_panel_onresize = function (self) + local width, height = self:GetSize() + local spacement = width - 78 - 60 + spacement = spacement / 16 + + for i = 1, 17 do + local label = self.TimeLabels [i] + label:SetPoint ("bottomleft", f, "bottomleft", 78 + ((i-1)*spacement), 13) + label.line:SetHeight (height - 45) + end + + local spacement = (self.Graphic:GetHeight()) / 8 + for i = 1, 8 do + self ["dpsamt"..i]:SetPoint ("TOPLEFT", self, "TOPLEFT", 27, -25 + (-(spacement* (i-1))) ) + self ["dpsamt"..i].line:SetWidth (width-20) + end + + self.Graphic:SetSize (width - 135, height - 67) + self.Graphic:SetPoint ("topleft", self, "topleft", 108, -35) +end + +local chart_panel_vlines_on = function (self) + for i = 1, 17 do + local label = self.TimeLabels [i] + label.line:Show() + end +end + +local chart_panel_vlines_off = function (self) + for i = 1, 17 do + local label = self.TimeLabels [i] + label.line:Hide() + end +end + +local chart_panel_set_title = function (self, title) + self.chart_title.text = title +end + +local chart_panel_mousedown = function (self, button) + if (button == "LeftButton" and self.can_move) then + if (not self.isMoving) then + self:StartMoving() + self.isMoving = true + end + elseif (button == "RightButton") then + if (not self.isMoving) then + self:Hide() + end + end +end +local chart_panel_mouseup = function (self, button) + if (button == "LeftButton" and self.isMoving) then + self:StopMovingOrSizing() + self.isMoving = nil + end +end + +function gump:CreateChartPanel (parent, w, h, name) + + if (not name) then + name = "DetailsPanelNumber" .. gump.PanelCounter + gump.PanelCounter = gump.PanelCounter + 1 + end + + parent = parent or UIParent + w = w or 800 + h = h or 500 + + local f = CreateFrame ("frame", name, parent) + f:SetSize (w or 500, h or 400) + f:EnableMouse (true) + f:SetMovable (true) + + f:SetScript ("OnMouseDown", chart_panel_mousedown) + f:SetScript ("OnMouseUp", chart_panel_mouseup) + + f:SetBackdrop (chart_panel_backdrop) + f:SetBackdropColor (.3, .3, .3, .3) + + local c = CreateFrame ("Button", nil, f, "UIPanelCloseButton") + c:SetWidth (32) + c:SetHeight (32) + c:SetPoint ("TOPRIGHT", f, "TOPRIGHT", -3, -7) + c:SetFrameLevel (f:GetFrameLevel()+1) + c:SetAlpha (0.9) + f.CloseButton = c + + local title = gump:NewLabel (f, nil, "$parentTitle", "chart_title", "Chart!", nil, 20, "yellow") + title:SetPoint (110, -13) + _detalhes:SetFontOutline (title, true) + + local bottom_texture = gump:NewImage (f, nil, 702, 25, "background", nil, nil, "$parentBottomTexture") + bottom_texture:SetTexture (0, 0, 0, .6) + bottom_texture:SetPoint ("bottomleft", f, "bottomleft", 8, 7) + bottom_texture:SetPoint ("bottomright", f, "bottomright", -8, 7) + + f.Overlays = {} + f.OverlaysAmount = 1 + + f.BoxLabels = {} + f.BoxLabelsAmount = 1 + + f.TimeLabels = {} + for i = 1, 17 do + local time = gump:NewLabel (f, nil, "$parentTime"..i, nil, "00:00") + time:SetPoint ("bottomleft", f, "bottomleft", 78 + ((i-1)*36), 13) + f.TimeLabels [i] = time + local line = gump:NewImage (f, nil, 1, h-45, "border", nil, nil, "$parentTime"..i.."Bar") + line:SetTexture (1, 1, 1, .1) + line:SetPoint ("bottomleft", time, "topright", 0, -10) + time.line = line + end + + --graphic + local g = LibStub:GetLibrary("LibGraph-2.0"):CreateGraphLine (name .. "Graphic", f, "topleft","topleft", 108, -35, w - 120, h - 67) + g:SetXAxis (-1,1) + g:SetYAxis (-1,1) + g:SetGridSpacing (false, false) + g:SetGridColor ({0.5,0.5,0.5,0.3}) + g:SetAxisDrawing (false,false) + g:SetAxisColor({1.0,1.0,1.0,1.0}) + g:SetAutoScale (true) + g:SetLineTexture ("smallline") + g:SetBorderSize ("right", 0.001) + g:SetBorderSize ("left", 0.000) + g:SetBorderSize ("top", 0.002) + g:SetBorderSize ("bottom", 0.001) + g.VerticalLines = {} + g.max_value = 0 + + g:SetLineTexture ("line") + + f.Graphic = g + f.GData = {} + f.OData = {} + + g:SetBackdrop ({bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 16}) + g:SetBackdropColor (0, 0, 0, 0.8) + + --div lines + for i = 1, 8, 1 do + local line = g:CreateTexture (nil, "overlay") + line:SetTexture (1, 1, 1, .2) + line:SetWidth (670) + line:SetHeight (1.1) + + gump:NewLabel (f, f, nil, "dpsamt"..i, "100k", "GameFontHighlightSmall") + f["dpsamt"..i]:SetPoint ("TOPLEFT", f, "TOPLEFT", 27, -61 + (-(24.6*i))) + line:SetPoint ("topleft", f["dpsamt"..i].widget, "bottom", -27, 0) + f["dpsamt"..i].line = line + end + + f.SetTime = chart_panel_align_timelabels + f.EnableVerticalLines = chart_panel_vlines_on + f.DisableVerticalLines = chart_panel_vlines_off + f.SetTitle = chart_panel_set_title + f.SetScale = chart_panel_set_scale + f.Reset = chart_panel_reset + f.AddLine = chart_panel_add_data + f.CanMove = chart_panel_can_move + f.AddLabel = chart_panel_add_label + f.AddOverlay = chart_panel_add_overlay + + f:SetScript ("OnSizeChanged", chart_panel_onresize) + chart_panel_onresize (f) + + return f +end diff --git a/functions/boss.lua b/functions/boss.lua index a94bc7e5..ca0c9365 100644 --- a/functions/boss.lua +++ b/functions/boss.lua @@ -147,7 +147,13 @@ do --> return the wallpaper for the raid instance function _detalhes:GetRaidBackground (mapid) - return _detalhes.EncounterInformation [mapid] and _detalhes.EncounterInformation [mapid].background + local bosstables = _detalhes.EncounterInformation [mapid] + if (bosstables) then + local bg = bosstables.backgroundFile + if (bg) then + return bg.file, unpack (bg.coords) + end + end end --> return the icon for the raid instance function _detalhes:GetRaidIcon (mapid) diff --git a/functions/classes.lua b/functions/classes.lua index 8bb0d8ba..69a2fa86 100644 --- a/functions/classes.lua +++ b/functions/classes.lua @@ -118,5 +118,10 @@ do function _detalhes:Class (actor) return self.classe or actor.classe end - + function _detalhes:GetActorSpells() + return self.spell_tables._ActorTable + end + function _detalhes:GetSpell (spellid) + return self.spell_tables._ActorTable [spellid] + end end diff --git a/functions/profiles.lua b/functions/profiles.lua index d39ebf03..5949ac50 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -804,6 +804,7 @@ _detalhes.default_profile = default_profile local default_player_data = { --> current combat number combat_id = 0, + combat_counter = 0, --> nicktag cache nick_tag_cache = {}, --> plugin data diff --git a/functions/timedata.lua b/functions/timedata.lua index 15992340..19bf4dcc 100644 --- a/functions/timedata.lua +++ b/functions/timedata.lua @@ -70,6 +70,10 @@ this_capture [INDEX_ENABLED] = this_capture [INDEX_ENABLED] end + if (_G.DetailsOptionsWindow and _G.DetailsOptionsWindow:IsShown()) then + _G.DetailsOptionsWindow16UserTimeCapturesFillPanel.MyObject:Refresh() + end + return true end @@ -131,11 +135,17 @@ --> unregister function _detalhes:TimeDataUnregister (name) if (type (name) == "number") then - return tremove (_detalhes.savedTimeCaptures, name) + tremove (_detalhes.savedTimeCaptures, name) + if (_G.DetailsOptionsWindow and _G.DetailsOptionsWindow:IsShown()) then + _G.DetailsOptionsWindow16UserTimeCapturesFillPanel.MyObject:Refresh() + end else for index, t in ipairs (_detalhes.savedTimeCaptures) do if (t [INDEX_NAME] == name) then tremove (_detalhes.savedTimeCaptures, index) + if (_G.DetailsOptionsWindow and _G.DetailsOptionsWindow:IsShown()) then + _G.DetailsOptionsWindow16UserTimeCapturesFillPanel.MyObject:Refresh() + end return true end end diff --git a/gumps/janela_custom.lua b/gumps/janela_custom.lua index 558a0bca..2826171b 100644 --- a/gumps/janela_custom.lua +++ b/gumps/janela_custom.lua @@ -91,10 +91,16 @@ custom_window:SetSize (850, 370) custom_window:EnableMouse (true) custom_window:SetMovable (true) - custom_window:SetScript ("OnMouseDown", function (self) - if (not self.moving) then - self.moving = true - self:StartMoving() + custom_window:SetScript ("OnMouseDown", function (self, button) + if (button == "LeftButton") then + if (not self.moving) then + self.moving = true + self:StartMoving() + end + elseif (button == "RightButton") then + if (not self.moving) then + _detalhes:CloseCustomDisplayWindow() + end end end) custom_window:SetScript ("OnMouseUp", function (self) diff --git a/gumps/janela_info.lua b/gumps/janela_info.lua index 4b8af0ba..a71d4eff 100644 --- a/gumps/janela_info.lua +++ b/gumps/janela_info.lua @@ -363,78 +363,42 @@ end --> seta os scripts da janela de informações +local mouse_down_func = function (self, button) + if (button == "LeftButton") then + info:StartMoving() + info.isMoving = true + elseif (button == "RightButton" and not self.isMoving) then + _detalhes:FechaJanelaInfo() + end +end + +local mouse_up_func = function (self, button) + if (info.isMoving) then + info:StopMovingOrSizing() + info.isMoving = false + end +end + ------------------------------------------------------------------------------------------------------------------------------ local function seta_scripts (este_gump) --> Janela - este_gump:SetScript ("OnMouseDown", - function (self, botao) - if (botao == "LeftButton") then - self:StartMoving() - self.isMoving = true - end - end) - - este_gump:SetScript ("OnMouseUp", - function (self) - if (self.isMoving) then - self:StopMovingOrSizing() - self.isMoving = false - end - end) - - este_gump.container_barras.gump:SetScript ("OnMouseDown", - function (self, botao) - if (botao == "LeftButton") then - este_gump:StartMoving() - este_gump.isMoving = true - end - end) - - este_gump.container_barras.gump:SetScript ("OnMouseUp", - function (self) - if (este_gump.isMoving) then - este_gump:StopMovingOrSizing() - este_gump.isMoving = false - end - end) - - este_gump.container_detalhes:SetScript ("OnMouseDown", - function (self, botao) - if (botao == "LeftButton") then - este_gump:StartMoving() - este_gump.isMoving = true - end - end) - - este_gump.container_detalhes:SetScript ("OnMouseUp", - function (self) - if (este_gump.isMoving) then - este_gump:StopMovingOrSizing() - este_gump.isMoving = false - end - end) + este_gump:SetScript ("OnMouseDown", mouse_down_func) + este_gump:SetScript ("OnMouseUp", mouse_up_func) - este_gump.container_alvos.gump:SetScript ("OnMouseDown", - function (self, botao) - if (botao == "LeftButton") then - este_gump:StartMoving() - este_gump.isMoving = true - end - end) + este_gump.container_barras.gump:SetScript ("OnMouseDown", mouse_down_func) + este_gump.container_barras.gump:SetScript ("OnMouseUp", mouse_up_func) - este_gump.container_alvos.gump:SetScript ("OnMouseUp", - function (self) - if (este_gump.isMoving) then - este_gump:StopMovingOrSizing() - este_gump.isMoving = false - end - end) + este_gump.container_detalhes:SetScript ("OnMouseDown", mouse_down_func) + este_gump.container_detalhes:SetScript ("OnMouseUp", mouse_up_func) + + este_gump.container_alvos.gump:SetScript ("OnMouseDown", mouse_down_func) + este_gump.container_alvos.gump:SetScript ("OnMouseUp", mouse_up_func) --> botão fechar - este_gump.fechar:SetScript ("OnClick", function(self) - _detalhes:FechaJanelaInfo() - end) + este_gump.fechar:SetScript ("OnClick", function (self) + _detalhes:FechaJanelaInfo() + end) end @@ -453,7 +417,28 @@ end --> cria a barra de detalhes a direita da janela de informações ------------------------------------------------------------------------------------------------------------------------------ + +local detalhe_infobg_onenter = function (self) + gump:Fade (self.overlay, "OUT") + gump:Fade (self.reportar, "OUT") +end + +local detalhe_infobg_onleave = function (self) + gump:Fade (self.overlay, "IN") + gump:Fade (self.reportar, "IN") +end + +local detalhes_inforeport_onenter = function (self) + gump:Fade (self:GetParent().overlay, "OUT") + gump:Fade (self, "OUT") +end +local detalhes_inforeport_onleave = function (self) + gump:Fade (self:GetParent().overlay, "IN") + gump:Fade (self, "IN") +end + function gump:CriaDetalheInfo (index) + local info = {} info.nome = _detalhes.janela_info.container_detalhes:CreateFontString (nil, "OVERLAY", "GameFontHighlightSmall") info.nome2 = _detalhes.janela_info.container_detalhes:CreateFontString (nil, "OVERLAY", "GameFontHighlightSmall") @@ -483,38 +468,15 @@ function gump:CriaDetalheInfo (index) info.bg.reportar:SetPoint ("BOTTOMLEFT", info.bg.overlay, "BOTTOMRIGHT", -33, 10) gump:Fade (info.bg.reportar, 1) - info.bg:SetScript ("OnEnter", - function(self) - gump:Fade (self.overlay, "OUT") - gump:Fade (self.reportar, "OUT") - end) - info.bg:SetScript ("OnLeave", - function(self) - gump:Fade (self.overlay, "IN") - gump:Fade (self.reportar, "IN") - end) + info.bg:SetScript ("OnEnter", detalhe_infobg_onenter) + info.bg:SetScript ("OnLeave", detalhe_infobg_onleave) + + info.bg.reportar:SetScript ("OnEnter", detalhes_inforeport_onenter) + info.bg.reportar:SetScript ("OnLeave", detalhes_inforeport_onleave) - info.bg.reportar:SetScript ("OnEnter", - function(self) - gump:Fade (info.bg.overlay, "OUT") - gump:Fade (self, "OUT") - end) - info.bg.reportar:SetScript ("OnLeave", - function(self) - gump:Fade (info.bg.overlay, "IN") - gump:Fade (self, "IN") - end) - info.bg_end = info.bg:CreateTexture (nil, "BACKGROUND") info.bg_end:SetHeight (47) - --este_gump.bg4:SetPoint ("BOTTOMRIGHT", este_gump, "BOTTOMRIGHT", 0, 0) - --este_gump.bg4:SetWidth (128) - --este_gump.bg4:SetHeight (256) info.bg_end:SetTexture ("Interface\\AddOns\\Details\\images\\bar_detalhes2_end") - --info.bg = _detalhes.janela_info.container_detalhes:CreateTexture (nil, "BACKGROUND") - --info.bg:SetWidth (400) - --info.bg:SetHeight (70) - --info.bg:SetTexture ("Interface\\MONEYFRAME\\UI-MoneyFrame2") _detalhes.janela_info.grupos_detalhes [index] = info end @@ -3384,6 +3346,79 @@ local row_on_leave = function (self) end end +local row_on_mousedown = function (self) + if (self.fading_in) then + return + end + + self.mouse_down = _GetTime() + local x, y = _GetCursorPosition() + self.x = _math_floor (x) + self.y = _math_floor (y) + + if ((not info.isLocked) or (info.isLocked == 0)) then + info:StartMoving() + info.isMoving = true + end +end + +local row_on_mouseup = function (self) + if (self.fading_in) then + return + end + + if (info.isMoving) then + info:StopMovingOrSizing() + info.isMoving = false + end + + local x, y = _GetCursorPosition() + x = _math_floor (x) + y = _math_floor (y) + if ((self.mouse_down+0.4 > _GetTime() and (x == self.x and y == self.y)) or (x == self.x and y == self.y)) then + --> setar os textos + + if (self.isMain) then --> se não for uma barra de alvo + + local barra_antiga = info.mostrando + if (barra_antiga and not info.mostrando_mouse_over) then + + barra_antiga.textura:SetStatusBarColor (1, 1, 1, 1) --> volta a textura normal + barra_antiga.on_focus = false --> não esta mais no foco + + --> CLICOU NA MESMA BARRA + if (barra_antiga == self) then --> + info.mostrando_mouse_over = true + return + + --> CLICOU EM OUTRA BARRA + else --> clicou em outra barra e trocou o foco + barra_antiga:SetAlpha (.9) --> volta a alfa antiga + + info.mostrando = self + info.showing = i + + info.jogador.detalhes = self.show + info.jogador:MontaDetalhes (self.show, self) + + self:SetAlpha (1) + self.textura:SetStatusBarColor (129/255, 125/255, 69/255, 1) + self.on_focus = true + return + end + end + + --> NÃO TINHA BARRAS PRECIONADAS + -- info.mostrando = self + info.mostrando_mouse_over = false + self:SetAlpha (1) + self.textura:SetStatusBarColor (129/255, 125/255, 69/255, 1) + self.on_focus = true + end + + end +end + local function SetBarraScripts (esta_barra, instancia, i) esta_barra._index = i @@ -3391,85 +3426,9 @@ local function SetBarraScripts (esta_barra, instancia, i) esta_barra:SetScript ("OnEnter", row_on_enter) esta_barra:SetScript ("OnLeave", row_on_leave) - esta_barra:SetScript ("OnMouseDown", function (self) - - if (self.fading_in) then - return - end - - self.mouse_down = _GetTime() - local x, y = _GetCursorPosition() - self.x = _math_floor (x) - self.y = _math_floor (y) - - if ((not info.isLocked) or (info.isLocked == 0)) then - info:StartMoving() - info.isMoving = true - end - - end) - - esta_barra:SetScript ("OnMouseUp", function (self) + esta_barra:SetScript ("OnMouseDown", row_on_mousedown) + esta_barra:SetScript ("OnMouseUp", row_on_mouseup) - if (self.fading_in) then - return - end - - if (info.isMoving) then - info:StopMovingOrSizing() - info.isMoving = false - --instancia:SaveMainWindowPosition() --> precisa fazer algo pra salvar o trem - end - - local x, y = _GetCursorPosition() - x = _math_floor (x) - y = _math_floor (y) - if ((self.mouse_down+0.4 > _GetTime() and (x == self.x and y == self.y)) or (x == self.x and y == self.y)) then - --> setar os textos - - if (self.isMain) then --> se não for uma barra de alvo - - local barra_antiga = info.mostrando --> ?? - - --> on_focus = quando a barra esta precionada - - if (barra_antiga and not info.mostrando_mouse_over) then - - barra_antiga.textura:SetStatusBarColor (1, 1, 1, 1) --> volta a textura normal - barra_antiga.on_focus = false --> não esta mais no foco - - --> CLICOU NA MESMA BARRA - if (barra_antiga == self) then --> - info.mostrando_mouse_over = true - return - - --> CLICOU EM OUTRA BARRA - else --> clicou em outra barra e trocou o foco - barra_antiga:SetAlpha (.9) --> volta a alfa antiga - - info.mostrando = self - info.showing = i - - info.jogador.detalhes = self.show - info.jogador:MontaDetalhes (self.show, self) - - self:SetAlpha (1) - self.textura:SetStatusBarColor (129/255, 125/255, 69/255, 1) - self.on_focus = true - return - end - end - - --> NÃO TINHA BARRAS PRECIONADAS - -- info.mostrando = self - info.mostrando_mouse_over = false - self:SetAlpha (1) - self.textura:SetStatusBarColor (129/255, 125/255, 69/255, 1) - self.on_focus = true - end - - end - end) end local function CriaTexturaBarra (instancia, barra) diff --git a/gumps/janela_principal.lua b/gumps/janela_principal.lua index 15162470..e8e010c4 100644 --- a/gumps/janela_principal.lua +++ b/gumps/janela_principal.lua @@ -661,52 +661,56 @@ local function move_janela (baseframe, iniciando, instancia) end _detalhes.move_janela_func = move_janela -local function BGFrame_scripts (BG, baseframe, instancia) - - BG:SetScript("OnEnter", function (self) - OnEnterMainWindow (instancia, self) - end) - - BG:SetScript("OnLeave", function (self) - OnLeaveMainWindow (instancia, self) - end) - - BG:SetScript ("OnMouseDown", function (frame, button) - if (baseframe.isMoving) then - move_janela (baseframe, false, instancia) - instancia:SaveMainWindowPosition() - return - end - - if (not baseframe.isLocked and button == "LeftButton") then - move_janela (baseframe, true, instancia) --> novo movedor da janela - if (BG.is_toolbar) then - if (instancia.attribute_text.enabled and instancia.attribute_text.side == 1 and instancia.toolbar_side == 1) then - instancia.menu_attribute_string:SetPoint ("bottomleft", instancia.baseframe.cabecalho.ball, "bottomright", instancia.attribute_text.anchor [1]+1, instancia.attribute_text.anchor [2]-1) - end - end - elseif (button == "RightButton") then - if (_detalhes.switch.current_instancia and _detalhes.switch.current_instancia == instancia) then - _detalhes.switch:CloseMe() - else - _detalhes.switch:ShowMe (instancia) - end - end - end) - - BG:SetScript ("OnMouseUp", function (frame) - if (baseframe.isMoving) then - move_janela (baseframe, false, instancia) --> novo movedor da janela - instancia:SaveMainWindowPosition() - if (BG.is_toolbar) then - if (instancia.attribute_text.enabled and instancia.attribute_text.side == 1 and instancia.toolbar_side == 1) then - instancia.menu_attribute_string:SetPoint ("bottomleft", instancia.baseframe.cabecalho.ball, "bottomright", instancia.attribute_text.anchor [1], instancia.attribute_text.anchor [2]) - end - end - end - end) +local BGFrame_scripts_onenter = function (self) + OnEnterMainWindow (self._instance, self) end +local BGFrame_scripts_onleave = function (self) + OnLeaveMainWindow (self._instance, self) +end + +local BGFrame_scripts_onmousedown = function (self, button) + if (self._instance.baseframe.isMoving) then + move_janela (self._instance.baseframe, false, self._instance) + self._instance:SaveMainWindowPosition() + return + end + + if (not self._instance.baseframe.isLocked and button == "LeftButton") then + move_janela (self._instance.baseframe, true, self._instance) + if (self.is_toolbar) then + if (self._instance.attribute_text.enabled and self._instance.attribute_text.side == 1 and self._instance.toolbar_side == 1) then + self._instance.menu_attribute_string:SetPoint ("bottomleft", self._instance.baseframe.cabecalho.ball, "bottomright", self._instance.attribute_text.anchor [1]+1, self._instance.attribute_text.anchor [2]-1) + end + end + elseif (button == "RightButton") then + if (_detalhes.switch.current_instancia and _detalhes.switch.current_instancia == self._instance) then + _detalhes.switch:CloseMe() + else + _detalhes.switch:ShowMe (self._instance) + end + end +end + +local BGFrame_scripts_onmouseup = function (self, button) + if (self._instance.baseframe.isMoving) then + move_janela (self._instance.baseframe, false, self._instance) --> novo movedor da janela + self._instance:SaveMainWindowPosition() + if (self.is_toolbar) then + if (self._instance.attribute_text.enabled and self._instance.attribute_text.side == 1 and self._instance.toolbar_side == 1) then + self._instance.menu_attribute_string:SetPoint ("bottomleft", self._instance.baseframe.cabecalho.ball, "bottomright", self._instance.attribute_text.anchor [1], self._instance.attribute_text.anchor [2]) + end + end + end +end + +local function BGFrame_scripts (BG, baseframe, instancia) + BG._instance = instancia + BG:SetScript ("OnEnter", BGFrame_scripts_onenter) + BG:SetScript ("OnLeave", BGFrame_scripts_onleave) + BG:SetScript ("OnMouseDown", BGFrame_scripts_onmousedown) + BG:SetScript ("OnMouseUp", BGFrame_scripts_onmouseup) +end function gump:RegisterForDetailsMove (frame, instancia) @@ -725,36 +729,41 @@ function gump:RegisterForDetailsMove (frame, instancia) end --> scripts do base frame +local BFrame_scripts_onsizechange = function (self) + self._instance:SaveMainWindowPosition() + self._instance:ReajustaGump() + self._instance.oldwith = self:GetWidth() + _detalhes:SendEvent ("DETAILS_INSTANCE_SIZECHANGED", nil, self._instance) +end + +local BFrame_scripts_onenter = function (self) + OnEnterMainWindow (self._instance, self) +end + +local BFrame_scripts_onleave = function (self) + OnLeaveMainWindow (self._instance, self) +end + +local BFrame_scripts_onmousedown = function (self, button) + if (not self.isLocked and button == "LeftButton") then + move_janela (self, true, self._instance) + end +end + +local BFrame_scripts_onmouseup = function (self, button) + if (self.isMoving) then + move_janela (self, false, self._instance) --> novo movedor da janela + self._instance:SaveMainWindowPosition() + end +end + local function BFrame_scripts (baseframe, instancia) - - baseframe:SetScript("OnSizeChanged", function (self) - instancia:SaveMainWindowPosition() - instancia:ReajustaGump() - instancia.oldwith = baseframe:GetWidth() - _detalhes:SendEvent ("DETAILS_INSTANCE_SIZECHANGED", nil, instancia) - end) - - baseframe:SetScript("OnEnter", function (self) - OnEnterMainWindow (instancia, self) - end) - - baseframe:SetScript("OnLeave", function (self) - OnLeaveMainWindow (instancia, self) - end) - - baseframe:SetScript ("OnMouseDown", function (frame, button) - if (not baseframe.isLocked and button == "LeftButton") then - move_janela (baseframe, true, instancia) --> novo movedor da janela - end - end) - - baseframe:SetScript ("OnMouseUp", function (frame) - if (baseframe.isMoving) then - move_janela (baseframe, false, instancia) --> novo movedor da janela - instancia:SaveMainWindowPosition() - end - end) - + baseframe._instance = instancia + baseframe:SetScript("OnSizeChanged", BFrame_scripts_onsizechange) + baseframe:SetScript("OnEnter", BFrame_scripts_onenter) + baseframe:SetScript("OnLeave", BFrame_scripts_onleave) + baseframe:SetScript ("OnMouseDown", BFrame_scripts_onmousedown) + baseframe:SetScript ("OnMouseUp", BFrame_scripts_onmouseup) end local function backgrounddisplay_scripts (backgrounddisplay, baseframe, instancia) @@ -1036,200 +1045,206 @@ local resizeTooltip = { } --> search key: ~resizescript + +local resize_scripts_onmousedown = function (self, button) + _G.GameCooltip:ShowMe (false) --> Hide Cooltip + + if (not self:GetParent().isLocked and button == "LeftButton" and self._instance.modo ~= _detalhes._detalhes_props["MODO_ALONE"]) then + self:GetParent().isResizing = true + self._instance:BaseFrameSnap() + + local isVertical = self._instance.verticalSnap + local isHorizontal = self._instance.horizontalSnap + + local agrupadas + if (self._instance.verticalSnap) then + agrupadas = self._instance:InstanciasVerticais() + elseif (self._instance.horizontalSnap) then + agrupadas = self._instance:InstanciasHorizontais() + end + + self._instance.stretchToo = agrupadas + if (self._instance.stretchToo and #self._instance.stretchToo > 0) then + for _, esta_instancia in ipairs (self._instance.stretchToo) do + esta_instancia.baseframe._place = esta_instancia:SaveMainWindowPosition() + esta_instancia.baseframe.isResizing = true + end + end + + ---------------- + + if (self._myside == "<") then + if (_IsShiftKeyDown()) then + self._instance.baseframe:StartSizing("left") + self._instance.eh_horizontal = true + elseif (_IsAltKeyDown()) then + self._instance.baseframe:StartSizing("top") + self._instance.eh_vertical = true + elseif (_IsControlKeyDown()) then + self._instance.baseframe:StartSizing("bottomleft") + self._instance.eh_tudo = true + else + self._instance.baseframe:StartSizing("bottomleft") + end + + self:SetPoint ("bottomleft", self._instance.baseframe, "bottomleft", -1, -1) + self.afundado = true + + elseif (self._myside == ">") then + if (_IsShiftKeyDown()) then + self._instance.baseframe:StartSizing ("right") + self._instance.eh_horizontal = true + elseif (_IsAltKeyDown()) then + self._instance.baseframe:StartSizing ("top") + self._instance.eh_vertical = true + elseif (_IsControlKeyDown()) then + self._instance.baseframe:StartSizing ("bottomright") + self._instance.eh_tudo = true + else + self._instance.baseframe:StartSizing ("bottomright") + end + + if (self._instance.rolagem and _detalhes.use_scroll) then + self:SetPoint ("bottomright", self._instance.baseframe, "bottomright", (self._instance.largura_scroll*-1) + 1, -1) + else + self:SetPoint ("bottomright", self._instance.baseframe, "bottomright", 1, -1) + end + self.afundado = true + end + + _detalhes:SendEvent ("DETAILS_INSTANCE_STARTRESIZE", nil, self._instance) + + end +end + +local resize_scripts_onmouseup = function (self, button) + + if (self.afundado) then + self.afundado = false + if (self._myside == ">") then + if (self._instance.rolagem and _detalhes.use_scroll) then + self:SetPoint ("bottomright", self._instance.baseframe, "bottomright", self._instance.largura_scroll*-1, 0) + else + self:SetPoint ("bottomright", self._instance.baseframe, "bottomright", 0, 0) + end + else + self:SetPoint ("bottomleft", self._instance.baseframe, "bottomleft", 0, 0) + end + end + + if (self:GetParent().isResizing) then + + self:GetParent():StopMovingOrSizing() + self:GetParent().isResizing = false + + if (self._instance.stretchToo and #self._instance.stretchToo > 0) then + for _, esta_instancia in ipairs (self._instance.stretchToo) do + esta_instancia.baseframe:StopMovingOrSizing() + esta_instancia.baseframe.isResizing = false + esta_instancia:ReajustaGump() + _detalhes:SendEvent ("DETAILS_INSTANCE_SIZECHANGED", nil, esta_instancia) + end + self._instance.stretchToo = nil + end + + local largura = self._instance.baseframe:GetWidth() + local altura = self._instance.baseframe:GetHeight() + + if (self._instance.eh_horizontal) then + instancias_horizontais (self._instance, largura, true, true) + self._instance.eh_horizontal = nil + end + + --if (instancia.eh_vertical) then + instancias_verticais (self._instance, altura, true, true) + self._instance.eh_vertical = nil + --end + + _detalhes:SendEvent ("DETAILS_INSTANCE_ENDRESIZE", nil, self._instance) + + if (self._instance.eh_tudo) then + for _, esta_instancia in _ipairs (_detalhes.tabela_instancias) do + if (esta_instancia:IsAtiva() and esta_instancia.modo ~= _detalhes._detalhes_props["MODO_ALONE"]) then + esta_instancia.baseframe:ClearAllPoints() + esta_instancia:SaveMainWindowPosition() + esta_instancia:RestoreMainWindowPosition() + end + end + + for _, esta_instancia in _ipairs (_detalhes.tabela_instancias) do + if (esta_instancia:IsAtiva() and esta_instancia ~= self._instance and esta_instancia.modo ~= _detalhes._detalhes_props["MODO_ALONE"]) then + esta_instancia.baseframe:SetWidth (largura) + esta_instancia.baseframe:SetHeight (altura) + esta_instancia.auto_resize = true + esta_instancia:ReajustaGump() + esta_instancia.auto_resize = false + _detalhes:SendEvent ("DETAILS_INSTANCE_SIZECHANGED", nil, esta_instancia) + end + end + + self._instance.eh_tudo = nil + end + + self._instance:BaseFrameSnap() + + for _, esta_instancia in _ipairs (_detalhes.tabela_instancias) do + if (esta_instancia:IsAtiva()) then + esta_instancia:SaveMainWindowPosition() + esta_instancia:RestoreMainWindowPosition() + end + end + end +end + +local resize_scripts_onhide = function (self) + if (self.going_hide) then + _G.GameCooltip:ShowMe (false) + self.going_hide = nil + end +end + +local resize_scripts_onenter = function (self) + if (self._instance.modo ~= _detalhes._detalhes_props["MODO_ALONE"] and not self._instance.baseframe.isLocked and not self.mostrando) then + + OnEnterMainWindow (self._instance, self) + + self.texture:SetBlendMode ("ADD") + self.mostrando = true + + GameCooltip:Reset() + GameCooltip:SetType ("tooltip") + GameCooltip:AddFromTable (resizeTooltip) + GameCooltip:SetOption ("TextSize", _detalhes.font_sizes.menus) + GameCooltip:SetOption ("NoLastSelectedBar", true) + GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0, 0.64453125}, {1, 1, 1, 0.1}, true) + GameCooltip:SetOwner (self) + GameCooltip:ShowCooltip() + end +end + +local resize_scripts_onleave = function (self) + if (self.mostrando) then + self.going_hide = true + if (not self.movendo) then + OnLeaveMainWindow (self._instance, self) + end + + self.texture:SetBlendMode ("BLEND") + self.mostrando = false + + GameCooltip:ShowMe (false) + end +end + local function resize_scripts (resizer, instancia, scrollbar, side, baseframe) + resizer._instance = instancia + resizer._myside = side - resizer:SetScript ("OnMouseDown", function (self, button) - - _G.GameCooltip:ShowMe (false) --> Hide Cooltip - - if (not self:GetParent().isLocked and button == "LeftButton" and instancia.modo ~= _detalhes._detalhes_props["MODO_ALONE"]) then - self:GetParent().isResizing = true - instancia:BaseFrameSnap() - - local isVertical = instancia.verticalSnap - local isHorizontal = instancia.horizontalSnap - - local agrupadas - if (instancia.verticalSnap) then - agrupadas = instancia:InstanciasVerticais() - elseif (instancia.horizontalSnap) then - agrupadas = instancia:InstanciasHorizontais() - end - - instancia.stretchToo = agrupadas - if (instancia.stretchToo and #instancia.stretchToo > 0) then - for _, esta_instancia in ipairs (instancia.stretchToo) do - esta_instancia.baseframe._place = esta_instancia:SaveMainWindowPosition() - esta_instancia.baseframe.isResizing = true - end - end - - ---------------- - - if (side == "<") then - if (_IsShiftKeyDown()) then - instancia.baseframe:StartSizing("left") - instancia.eh_horizontal = true - elseif (_IsAltKeyDown()) then - instancia.baseframe:StartSizing("top") - instancia.eh_vertical = true - elseif (_IsControlKeyDown()) then - instancia.baseframe:StartSizing("bottomleft") - instancia.eh_tudo = true - else - instancia.baseframe:StartSizing("bottomleft") - end - - resizer:SetPoint ("bottomleft", baseframe, "bottomleft", -1, -1) - resizer.afundado = true - - elseif (side == ">") then - if (_IsShiftKeyDown()) then - instancia.baseframe:StartSizing("right") - instancia.eh_horizontal = true - elseif (_IsAltKeyDown()) then - instancia.baseframe:StartSizing("top") - instancia.eh_vertical = true - elseif (_IsControlKeyDown()) then - instancia.baseframe:StartSizing("bottomright") - instancia.eh_tudo = true - else - instancia.baseframe:StartSizing("bottomright") - end - - if (instancia.rolagem and _detalhes.use_scroll) then - resizer:SetPoint ("bottomright", baseframe, "bottomright", (instancia.largura_scroll*-1) + 1, -1) - else - resizer:SetPoint ("bottomright", baseframe, "bottomright", 1, -1) - end - resizer.afundado = true - end - - _detalhes:SendEvent ("DETAILS_INSTANCE_STARTRESIZE", nil, instancia) - - end - end) - - resizer:SetScript ("OnMouseUp", function (self,button) - - if (resizer.afundado) then - resizer.afundado = false - if (resizer.side == 2) then - if (instancia.rolagem and _detalhes.use_scroll) then - resizer:SetPoint ("bottomright", baseframe, "bottomright", instancia.largura_scroll*-1, 0) - else - resizer:SetPoint ("bottomright", baseframe, "bottomright", 0, 0) - end - else - resizer:SetPoint ("bottomleft", baseframe, "bottomleft", 0, 0) - end - end - - if (self:GetParent().isResizing) then - - self:GetParent():StopMovingOrSizing() - self:GetParent().isResizing = false - - if (instancia.stretchToo and #instancia.stretchToo > 0) then - for _, esta_instancia in ipairs (instancia.stretchToo) do - esta_instancia.baseframe:StopMovingOrSizing() - esta_instancia.baseframe.isResizing = false - esta_instancia:ReajustaGump() - _detalhes:SendEvent ("DETAILS_INSTANCE_SIZECHANGED", nil, esta_instancia) - end - instancia.stretchToo = nil - end - - local largura = instancia.baseframe:GetWidth() - local altura = instancia.baseframe:GetHeight() - - if (instancia.eh_horizontal) then - instancias_horizontais (instancia, largura, true, true) - instancia.eh_horizontal = nil - end - - --if (instancia.eh_vertical) then - instancias_verticais (instancia, altura, true, true) - instancia.eh_vertical = nil - --end - - _detalhes:SendEvent ("DETAILS_INSTANCE_ENDRESIZE", nil, instancia) - - if (instancia.eh_tudo) then - for _, esta_instancia in _ipairs (_detalhes.tabela_instancias) do - if (esta_instancia:IsAtiva() and esta_instancia.modo ~= _detalhes._detalhes_props["MODO_ALONE"]) then - esta_instancia.baseframe:ClearAllPoints() - esta_instancia:SaveMainWindowPosition() - esta_instancia:RestoreMainWindowPosition() - end - end - - for _, esta_instancia in _ipairs (_detalhes.tabela_instancias) do - if (esta_instancia:IsAtiva() and esta_instancia ~= instancia and esta_instancia.modo ~= _detalhes._detalhes_props["MODO_ALONE"]) then - esta_instancia.baseframe:SetWidth (largura) - esta_instancia.baseframe:SetHeight (altura) - esta_instancia.auto_resize = true - esta_instancia:ReajustaGump() - esta_instancia.auto_resize = false - _detalhes:SendEvent ("DETAILS_INSTANCE_SIZECHANGED", nil, esta_instancia) - end - end - - instancia.eh_tudo = nil - end - - instancia:BaseFrameSnap() - - for _, esta_instancia in _ipairs (_detalhes.tabela_instancias) do - if (esta_instancia:IsAtiva()) then - esta_instancia:SaveMainWindowPosition() - esta_instancia:RestoreMainWindowPosition() - end - end - end - end) - - resizer:SetScript ("OnHide", function (self) - if (self.going_hide) then - _G.GameCooltip:ShowMe (false) - self.going_hide = nil - end - end) - - resizer:SetScript ("OnEnter", function (self) - if (instancia.modo ~= _detalhes._detalhes_props["MODO_ALONE"] and not instancia.baseframe.isLocked and not self.mostrando) then - - OnEnterMainWindow (instancia, self) - - self.texture:SetBlendMode ("ADD") - self.mostrando = true - - GameCooltip:Reset() - GameCooltip:SetType ("tooltip") - GameCooltip:AddFromTable (resizeTooltip) - GameCooltip:SetOption ("TextSize", _detalhes.font_sizes.menus) - GameCooltip:SetOption ("NoLastSelectedBar", true) - GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0, 0.64453125}, {1, 1, 1, 0.1}, true) - GameCooltip:SetOwner (resizer) - GameCooltip:ShowCooltip() - end - end) - - resizer:SetScript ("OnLeave", function (self) - - if (self.mostrando) then - - resizer.going_hide = true - if (not self.movendo) then - OnLeaveMainWindow (instancia, self) - end - - self.texture:SetBlendMode ("BLEND") - self.mostrando = false - - GameCooltip:ShowMe (false) - end - end) + resizer:SetScript ("OnMouseDown", resize_scripts_onmousedown) + resizer:SetScript ("OnMouseUp", resize_scripts_onmouseup) + resizer:SetScript ("OnHide", resize_scripts_onhide) + resizer:SetScript ("OnEnter", resize_scripts_onenter) + resizer:SetScript ("OnLeave", resize_scripts_onleave) end local lockButtonTooltip = { @@ -1392,161 +1407,159 @@ local on_switch_show = function (instance) return true end -local function barra_scripts (esta_barra, instancia, i) +local barra_backdrop_onenter = { + bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], + tile = true, tileSize = 16, + insets = {left = 1, right = 1, top = 0, bottom = 1} +} +local barra_backdrop_onleave = { + bgFile = "", + edgeFile = "", tile = true, tileSize = 16, edgeSize = 32, + insets = {left = 1, right = 1, top = 0, bottom = 1} +} - esta_barra:SetScript ("OnEnter", function (self) - self.mouse_over = true - OnEnterMainWindow (instancia, esta_barra) +local barra_scripts_onenter = function (self) + self.mouse_over = true + OnEnterMainWindow (self._instance, self) - instancia:MontaTooltip (self, i) - - self:SetBackdrop({ - bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], - tile = true, tileSize = 16, - insets = {left = 1, right = 1, top = 0, bottom = 1},}) - self:SetBackdropColor (0.588, 0.588, 0.588, 0.7) - - self:SetScript ("OnUpdate", shift_monitor) - - end) - - esta_barra:SetScript ("OnLeave", function (self) - self.mouse_over = false - OnLeaveMainWindow (instancia, self) - - _GameTooltip:Hide() - _G.GameCooltip:ShowMe (false) - - self:SetBackdrop({ - bgFile = "", edgeFile = "", tile = true, tileSize = 16, edgeSize = 32, - insets = {left = 1, right = 1, top = 0, bottom = 1},}) - - self:SetBackdropBorderColor (0, 0, 0, 0) - self:SetBackdropColor (0, 0, 0, 0) - - self.showing_allspells = false - self:SetScript ("OnUpdate", nil) - - end) - - esta_barra:SetScript ("OnMouseDown", function (self, button) - - if (esta_barra.fading_in) then - return - end - - if (button == "RightButton") then - return _detalhes.switch:ShowMe (instancia) - - elseif (button == "MiddleButton") then - --> verifica se é damage taken - - elseif (button == "LeftButton") then + self._instance:MontaTooltip (self, self.row_id) - if (instancia.atributo == 1 and instancia.sub_atributo == 6) then --> enemies - - local inimigo = esta_barra.minha_tabela.nome - local custom_name = inimigo .. Loc ["STRING_CUSTOM_ENEMY_DT"] - - --> procura se já tem um custom: - for index, CustomObject in _ipairs (_detalhes.custom) do - if (CustomObject:GetName() == custom_name) then - --> fix for not saving funcs on logout - if (not CustomObject.OnSwitchShow) then - CustomObject.OnSwitchShow = on_switch_show - end - return instancia:TrocaTabela (instancia.segmento, 5, index) + self:SetBackdrop (barra_backdrop_onenter) + self:SetBackdropColor (0.588, 0.588, 0.588, 0.7) + + self:SetScript ("OnUpdate", shift_monitor) +end + +local barra_scripts_onleave = function (self) + self.mouse_over = false + OnLeaveMainWindow (self._instance, self) + + _GameTooltip:Hide() + GameCooltip:ShowMe (false) + + self:SetBackdrop (barra_backdrop_onleave) + self:SetBackdropBorderColor (0, 0, 0, 0) + self:SetBackdropColor (0, 0, 0, 0) + + self.showing_allspells = false + self:SetScript ("OnUpdate", nil) +end + +local barra_scripts_onmousedown = function (self, button) + if (self.fading_in) then + return + end + + if (button == "RightButton") then + return _detalhes.switch:ShowMe (self._instance) + + --elseif (button == "MiddleButton") then + + elseif (button == "LeftButton") then + + if (self._instance.atributo == 1 and self._instance.sub_atributo == 6) then --> enemies + + local inimigo = self.minha_tabela.nome + local custom_name = inimigo .. Loc ["STRING_CUSTOM_ENEMY_DT"] + + --> procura se já tem um custom: + for index, CustomObject in _ipairs (_detalhes.custom) do + if (CustomObject:GetName() == custom_name) then + --> fix for not saving funcs on logout + if (not CustomObject.OnSwitchShow) then + CustomObject.OnSwitchShow = on_switch_show end + return self._instance:TrocaTabela (self._instance.segmento, 5, index) end - - --> criar um custom para este actor. - local new_custom_object = { - name = custom_name, - icon = [[Interface\ICONS\Pet_Type_Undead]], - attribute = "damagedone", - author = _detalhes.playername, - desc = inimigo .. " Damage Taken", - source = "[raid]", - target = inimigo, - script = false, - tooltip = false, - temp = true, - OnSwitchShow = on_switch_show, - } - - tinsert (_detalhes.custom, new_custom_object) - setmetatable (new_custom_object, _detalhes.atributo_custom) - new_custom_object.__index = _detalhes.atributo_custom - - return instancia:TrocaTabela (instancia.segmento, 5, #_detalhes.custom) - --func, true, 5, index - - end - end - - esta_barra.texto_direita:SetPoint ("right", esta_barra.statusbar, "right", 1, -1) - if (instancia.row_info.no_icon) then - esta_barra.texto_esquerdo:SetPoint ("left", esta_barra.statusbar, "left", 3, -1) - else - esta_barra.texto_esquerdo:SetPoint ("left", esta_barra.icone_classe, "right", 4, -1) - end - - self.mouse_down = _GetTime() - self.button = button - local x, y = _GetCursorPosition() - self.x = _math_floor (x) - self.y = _math_floor (y) - - local parent = instancia.baseframe - if ((not parent.isLocked) or (parent.isLocked == 0)) then - GameCooltip:Hide() --> fecha o tooltip - move_janela (parent, true, instancia) --> novo movedor da janela - end - - end) - - esta_barra:SetScript ("OnMouseUp", function (self, button) - - local parent = instancia.baseframe - if (parent.isMoving) then - - move_janela (parent, false, instancia) --> novo movedor da janela - instancia:SaveMainWindowPosition() - _GameTooltip:SetOwner (self, "ANCHOR_TOPRIGHT") - if (instancia:MontaTooltip (self, i)) then - GameCooltip:Show (esta_barra, 1) end + + --> criar um custom para este actor. + local new_custom_object = { + name = custom_name, + icon = [[Interface\ICONS\Pet_Type_Undead]], + attribute = "damagedone", + author = _detalhes.playername, + desc = inimigo .. " Damage Taken", + source = "[raid]", + target = inimigo, + script = false, + tooltip = false, + temp = true, + OnSwitchShow = on_switch_show, + } + + tinsert (_detalhes.custom, new_custom_object) + setmetatable (new_custom_object, _detalhes.atributo_custom) + new_custom_object.__index = _detalhes.atributo_custom + + return self._instance:TrocaTabela (self._instance.segmento, 5, #_detalhes.custom) + end + end + + self.texto_direita:SetPoint ("right", self.statusbar, "right", 1, -1) + if (self._instance.row_info.no_icon) then + self.texto_esquerdo:SetPoint ("left", self.statusbar, "left", 3, -1) + else + self.texto_esquerdo:SetPoint ("left", self.icone_classe, "right", 4, -1) + end + + self.mouse_down = _GetTime() + self.button = button + local x, y = _GetCursorPosition() + self.x = _math_floor (x) + self.y = _math_floor (y) + + if (not self._instance.baseframe.isLocked) then + GameCooltip:Hide() + move_janela (self._instance.baseframe, true, self._instance) + end +end + +local barra_scripts_onmouseup = function (self, button) + if (self._instance.baseframe.isMoving) then + move_janela (self._instance.baseframe, false, self._instance) + self._instance:SaveMainWindowPosition() + + if (self._instance:MontaTooltip (self, self.row_id)) then + GameCooltip:Show (self, 1) end + end - esta_barra.texto_direita:SetPoint ("right", esta_barra.statusbar, "right") - if (instancia.row_info.no_icon) then - esta_barra.texto_esquerdo:SetPoint ("left", esta_barra.statusbar, "left", 2, 0) - else - esta_barra.texto_esquerdo:SetPoint ("left", esta_barra.icone_classe, "right", 3, 0) - end - - local x, y = _GetCursorPosition() - x = _math_floor (x) - y = _math_floor (y) + self.texto_direita:SetPoint ("right", self.statusbar, "right") + if (self._instance.row_info.no_icon) then + self.texto_esquerdo:SetPoint ("left", self.statusbar, "left", 2, 0) + else + self.texto_esquerdo:SetPoint ("left", self.icone_classe, "right", 3, 0) + end + + local x, y = _GetCursorPosition() + x = _math_floor (x) + y = _math_floor (y) - if (self.mouse_down and (self.mouse_down+0.4 > _GetTime() and (x == self.x and y == self.y)) or (x == self.x and y == self.y)) then - --> a única maneira de abrir a janela de info é por aqui... - - if (self.button == "LeftButton" or self.button == "MiddleButton") then - if (instancia.atributo == 5 or _IsShiftKeyDown()) then - --> report - return _detalhes:ReportSingleLine (instancia, self) - end - instancia:AbreJanelaInfo (self.minha_tabela) + if (self.mouse_down and (self.mouse_down+0.4 > _GetTime() and (x == self.x and y == self.y)) or (x == self.x and y == self.y)) then + if (self.button == "LeftButton" or self.button == "MiddleButton") then + if (self._instance.atributo == 5 or _IsShiftKeyDown()) then + --> report + return _detalhes:ReportSingleLine (self._instance, self) end - + self._instance:AbreJanelaInfo (self.minha_tabela) end - end) + end +end - esta_barra:SetScript ("OnClick", function (self, button) +local barra_scripts_onclick = function (self, button) - end) +end + +local function barra_scripts (esta_barra, instancia, i) + esta_barra._instance = instancia + + esta_barra:SetScript ("OnEnter", barra_scripts_onenter) + esta_barra:SetScript ("OnLeave", barra_scripts_onleave) + esta_barra:SetScript ("OnMouseDown", barra_scripts_onmousedown) + esta_barra:SetScript ("OnMouseUp", barra_scripts_onmouseup) + esta_barra:SetScript ("OnClick", barra_scripts_onclick) end function _detalhes:ReportSingleLine (instancia, barra) diff --git a/plugins/Details_DpsTuning/Details_DpsTuning.lua b/plugins/Details_DpsTuning/Details_DpsTuning.lua new file mode 100644 index 00000000..d99468fe --- /dev/null +++ b/plugins/Details_DpsTuning/Details_DpsTuning.lua @@ -0,0 +1,1189 @@ +local Loc = LibStub ("AceLocale-3.0"):GetLocale ("Details") + +--> Main Plugin Object +local DpsTuningPlugin = _detalhes:NewPluginObject ("Details_DpsTuning") +--> Main Frame +local SDF = DpsTuningPlugin.Frame + +--> global pointers +local ClockTime = time --> lua library local +local ipairs = ipairs --> lua library local +local pairs = pairs --> lua library local +local floor = floor --> lua library local +local _cstr = string.format --> lua library local + +local GetSpellBonusDamage = GetSpellBonusDamage +local UnitAura = UnitAura --> wow api local +local GetTime = GetTime --> wow api local + +local _GetSpellInfo =_detalhes.getspellinfo --> details api local + +local function CreatePluginFrames() + + --> get the framework + local fw = _detalhes:GetFramework() + + --> player damage done chart code + local string_player_damage_done = [[ + + -- the goal of this script is get the current combat then get your character and extract your damage done. + -- the first thing to do is get the combat, so, we use here the command "_detalhes:GetCombat ( "overall" "current" or "segment number")" + + local current_combat = _detalhes:GetCombat ("current") --> getting the current combat + + -- the next step is request your character from the combat + -- to do this, we take the combat which here we named "current_combat" and tells what we want inside parentheses. + + local my_self = current_combat (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) + + -- _detalhes.playername holds the name of your character. + -- DETAILS_ATTRIBUTE_DAMAGE means we want the damage table, _HEAL _ENERGY _MISC is the other 3 tables. + + -- before we proceed, the result needs to be checked to make sure its a valid result. + + if (not my_self) then + return 0 -- the combat doesnt have *you*, this happens when you didn't deal any damage in the combat yet. + end + + -- now its time to get the total damage. + + local my_damage = my_self.total + + -- then finally return the amount to the capture. + + return my_damage + + ]] + + --> color for spell dps bars + DpsTuningPlugin.BarColor = {.4, .4, .4, .7} + + function DpsTuningPlugin:OnDetailsEvent (event, ...) + + if (event == "SHOW") then --> plugin shown on screen, actived + + SDF:SetResizable (false) --> cant resize, this is a fixed size + SDF:SetSize (300, 300) --> need to be 300x300 to fit details window + + --> create the frames on the first shown + if (not DpsTuningPlugin.frames_created) then + DpsTuningPlugin:BuildHeader() + DpsTuningPlugin:BuildSpellBars() + DpsTuningPlugin:BuildSummaryPanel() + DpsTuningPlugin:BuildBuffBlocks() + DpsTuningPlugin:BuildChartPanels() + + DpsTuningPlugin.frames_created = true + DpsTuningPlugin.Frame:Show() + + --tricky, localize members inside the plugin, so it doesn't need to lookup on _detalhes object every time + DpsTuningPlugin.playername = DpsTuningPlugin.playername + DpsTuningPlugin.comma_value = DpsTuningPlugin.comma_value + DpsTuningPlugin.ToK2 = DpsTuningPlugin.ToK2 + DpsTuningPlugin.Sort2 = DpsTuningPlugin.Sort2 + DpsTuningPlugin.Sort3 = DpsTuningPlugin.Sort3 + end + + --> we only want register the player damage done when the plugin is active + DpsTuningPlugin:TimeDataRegister ("Player Damage Done", string_player_damage_done, nil, "Spell Details", "v1.0", "Interface\\Icons\\INV_Fabric_Spellweave", true, true) + + elseif (event == "HIDE") then --> plugin hidded, disabled + + --> plugin is gone, unregister the chart + DpsTuningPlugin:TimeDataUnregister ("Player Damage Done") + + elseif (event == "DETAILS_STARTED") then + + --> triggered right after details finish run all ADDON_LOADED functions + local power = {} + for i = 1, 7 do + power [i] = {i, GetSpellBonusDamage (i)} + end + table.sort (power, DpsTuningPlugin.Sort2) + DpsTuningPlugin.PowerType = power [1][1] + + elseif (event == "REFRESH") then --> requested a refresh window + --> refresh window happens when there is a invalid combat, like a combat with less then 5 seconds. + --DpsTuningPlugin:Refresh() + + elseif (event == "COMBAT_PLAYER_ENTER") then + DpsTuningPlugin:OnCombatStart (...) + + elseif (event == "COMBAT_PLAYER_LEAVE") then + DpsTuningPlugin:OnCombatEnd (...) + + elseif (event == "PLUGIN_DISABLED") then + --> plugin got disabled on details options panel + + elseif (event == "PLUGIN_ENABLED") then + --> plugin got enabled on details options panel + + end + end + + function DpsTuningPlugin.GetActivityTime (thisspell, time) + if (thisspell.tempo_end) then --> o tempo do jogador esta trancado + local t = thisspell.tempo_end - thisspell.start + if (t < 6) then + t = 6 + end + return t + elseif (thisspell.onhold) then + local t = thisspell.delay - thisspell.start + if (t < 6) then + t = 6 + end + return t + else + if (thisspell.start == 0) then + return 6 + end + local t = time - thisspell.start + if (t < 6) then + if (DpsTuningPlugin.in_combat) then + local combat_time = DpsTuningPlugin.CurCombat:GetCombatTime() + if (combat_time < 6) then + return combat_time + end + end + t = 6 + end + return t + end + end + + local spells = {cur = 0} + local spell_activity = {} + local buff_activity = {} + local buff_graphic_data = {} + local spell_graphic_data = {} + local power_amount_chart_table = {} + power_amount_chart_table.max_value = 0 + + DpsTuningPlugin.FinishedAt = 0 + + function DpsTuningPlugin.RefreshSpells() + + if (DpsTuningPlugin.db.SpellBarsShowType == 1) then --> execution activity dps + + local now = ClockTime() + for spellid, spelltable in pairs (DpsTuningPlugin.CurPlayer:GetActorSpells()) do + + local this = spell_activity [spellid] + if (not this) then + local t = {} + t.total = spelltable.total + t.time = ClockTime() + t.start = t.time + t.tempo_end = nil + t.lastevent = t.time + spell_activity [spellid] = t + this = t + else + local lastdamage = this.total + if (lastdamage ~= spelltable.total) then + this.lastevent = now + end + + if (this.lastevent+6 < now) then + --hold + if (not this.onhold) then + this.delay = this.lastevent + if (this.delay < this.start) then + this.delay = this.start + end + this.onhold = true + end + else + --exec + if (this.onhold) then + local diff = now - this.delay - 2 + if (diff > 0) then + this.start = this.start + diff + end + this.onhold = nil + end + end + + this.total = spelltable.total + end + end + + local i = 0 + for spellid, spelltable in pairs (spell_activity) do + i = i + 1 + + if (not spells [i]) then + spells [i] = {} + end + + spells [i][1] = spellid + spells [i][2] = spelltable.total + spells [i][3] = DpsTuningPlugin.GetActivityTime (spelltable, now) + spells [i][4] = spells [i][2] / spells [i][3] --adps + end + + spells.cur = i + for o = #spells, i+1, -1 do + spells [o][1] = 0 + spells [o][2] = 0 + spells [o][3] = 0 + spells [o][4] = 0 + end + + table.sort (spells, DpsTuningPlugin.Sort4) + + DpsTuningPlugin.SpellList = spells + DpsTuningPlugin.SpellScroll:Update() + + elseif (DpsTuningPlugin.db.SpellBarsShowType == 2) then --> player activity dps + + local player_time = DpsTuningPlugin.CurPlayer:Tempo() + local i = 0 + + for spellid, spelltable in pairs (DpsTuningPlugin.CurPlayer:GetActorSpells()) do + i = i + 1 + + if (not spells [i]) then + spells [i] = {} + end + + spells [i][1] = spellid + spells [i][2] = spelltable.total + spells [i][3] = spelltable.total/player_time + end + + spells.cur = i + for o = #spells, i+1, -1 do + spells [o][1] = 0 + spells [o][2] = 0 + spells [o][3] = 0 + spells [o][4] = 0 + end + + table.sort (spells, DpsTuningPlugin.Sort3) + + DpsTuningPlugin.SpellList = spells + DpsTuningPlugin.SpellScroll:Update() + + elseif (DpsTuningPlugin.db.SpellBarsShowType == 3) then --> spell damage + + local i = 0 + for spellid, spelltable in pairs (DpsTuningPlugin.CurPlayer:GetActorSpells()) do + i = i + 1 + + if (not spells [i]) then + spells [i] = {} + end + + spells [i][1] = spellid + spells [i][2] = spelltable.total + end + + spells.cur = i + for o = #spells, i+1, -1 do + spells [o][1] = 0 + spells [o][2] = 0 + spells [o][3] = 0 + spells [o][4] = 0 + end + + table.sort (spells, DpsTuningPlugin.Sort2) + + DpsTuningPlugin.SpellList = spells + DpsTuningPlugin.SpellScroll:Update() + + end + + end + + function update_scroll (self) + + local spells = DpsTuningPlugin.SpellList + if (not spells) then + for bar_index = 1, 9 do + local bar = DpsTuningPlugin.SpellBars [bar_index] + bar:Hide() + end + return + end + + local offset = FauxScrollFrame_GetOffset (self) + local amt = 0 + for index, spell in ipairs (spells) do + if (spell[2] > 0) then + amt = amt + 1 + end + end + + for bar_index = 1, 9 do + local data = spells [bar_index + offset] + local bar = DpsTuningPlugin.SpellBars [bar_index] + + if (DpsTuningPlugin.db.SpellBarsShowType == 1) then --> execution activity dps + + if (data and data[3] > 0) then + local name, _, icon = _GetSpellInfo (data [1]) + bar.icon = icon + bar.lefttext = name + bar.righttext = DpsTuningPlugin:comma_value (data [2]) .. " (" .. data [3] .. ", " .. DpsTuningPlugin:ToK2 (floor (data [4])) .. ")" + bar.spellid = data [1] + bar:Show() + else + bar:Hide() + end + + elseif (DpsTuningPlugin.db.SpellBarsShowType == 2) then --> player activity dps + + if (data and data[2] > 0) then + local name, _, icon = _GetSpellInfo (data [1]) + bar.icon = icon + bar.lefttext = name + bar.righttext = DpsTuningPlugin:comma_value (data [2]) .. " (" .. DpsTuningPlugin:ToK2 (floor (data [3])) .. ")" + bar.spellid = data [1] + bar:Show() + else + bar:Hide() + end + + elseif (DpsTuningPlugin.db.SpellBarsShowType == 3) then --> spell damage + + local total = DpsTuningPlugin.CurPlayer.total + + if (data and data[2] > 0) then + local name, _, icon = _GetSpellInfo (data [1]) + bar.icon = icon + bar.lefttext = name + bar.righttext = DpsTuningPlugin:comma_value (data [2]) .. " (" .. floor (data[2] / total * 100) .. "%)" + bar.spellid = data [1] + bar:Show() + else + bar:Hide() + end + + end + end + + FauxScrollFrame_Update (self, amt, 9, 15) + + end + + function DpsTuningPlugin:BuildSummaryPanel() + + --total damage + local damage1 = fw:CreateLabel (SDF, "Damage:") + local damage2 = fw:CreateLabel (SDF, "") + damage1:SetPoint ("topleft", SDF, "topleft", 2, -165) + damage2:SetPoint ("left", damage1, "right", 2, 0) + DpsTuningPlugin.total_damage = damage2 + + --activity dps + local a_dps1 = fw:CreateLabel (SDF, "Dps:") + local a_dps2 = fw:CreateLabel (SDF, "") + a_dps1:SetPoint ("topleft", SDF, "topleft", 2, -180) + a_dps2:SetPoint ("left", a_dps1, "right", 2, 0) + DpsTuningPlugin.activity_dps = a_dps2 + + --timer + local timer1 = fw:CreateLabel (SDF, "Time:") + local timer2 = fw:CreateLabel (SDF, "") + timer1:SetPoint ("topleft", SDF, "topleft", 2, -195) + timer2:SetPoint ("left", timer1, "right", 2, 0) + DpsTuningPlugin.time_elapsed = timer2 + + --power + local power1 = fw:CreateLabel (SDF, "Power:") + local power2 = fw:CreateLabel (SDF, "", 15, "orange") + power1:SetPoint ("topleft", SDF, "topleft", 2, -215) + power2:SetPoint ("left", power1, "right", 2, 0) + DpsTuningPlugin.power_amount = power2 + end + + function DpsTuningPlugin:BuildHeader() + + local on_select_spell_type = function (_, _, type_number) + DpsTuningPlugin.db.SpellBarsShowType = type_number + DpsTuningPlugin:UpdateTick() + end + + local icon = [[Interface\COMMON\friendship-FistOrc]] + + local spell_type_options = { + {value = 1, label = "Execution Activity Dps", desc = "Oder and show the dps following the spell individual activity time.", onclick = on_select_spell_type, icon = icon}, + {value = 2, label = "Player Activity Dps", desc = "Order the spells using your activity time to measure the dps for each spell.", onclick = on_select_spell_type, icon = icon}, + {value = 3, label = "Damage", desc = "Order the spells following the damage done by each one.", onclick = on_select_spell_type, icon = icon}, + } + + local select_spell_type = function() + return spell_type_options + end + + local dropdown = fw:CreateDropDown (SDF, select_spell_type, DpsTuningPlugin.db.SpellBarsShowType, 160, 18) + local label = fw:CreateLabel (SDF, "Dps Format:") + label:SetPoint (2, -4) + dropdown:SetPoint ("left", label, "right", 2, -1) + end + + DpsTuningPlugin.AuraBlocks = {} + + local aura_onenter = function (self, capsule) + self:SetBackdropBorderColor (1, 1, 0, 1) + capsule.icontexture.alpha = 1 + local buff = capsule.buff + if (buff) then + GameCooltip:Reset() + GameCooltip:SetOwner (self) + GameCooltip:SetType ("tooltip") + DpsTuningPlugin:CooltipPreset (2) + + local name, _, icon = _GetSpellInfo (buff.spellid) + + GameCooltip:AddLine (name, "", 1, "orange", nil, 13, "Arrial Narrow") + GameCooltip:AddIcon (icon) + + GameCooltip:AddLine ("") + + local minutos, segundos = floor (buff.uptime/60), floor (buff.uptime%60) + GameCooltip:AddLine ("Uptime:", minutos .. "m " .. segundos .. "s", 1, "white", nil, 10, "Arrial Narrow") + GameCooltip:AddLine ("Percent:", _cstr ("%.1f", buff.uptime/DpsTuningPlugin.CurPlayer:Tempo()*100) .. "%", 1, "white", nil, 10, "Arrial Narrow") + + GameCooltip:SetOption ("AlignAsBlizzTooltip", true) + GameCooltip:Show() + end + end + local aura_onleave = function (self, capsule) + self:SetBackdropBorderColor (1, 1, 1, 1) + capsule.icontexture.alpha = 0.9 + GameCooltip:Hide() + end + + local aura_onenter2 = function (self, capsule) + aura_onenter (capsule.block.widget, capsule.block) + end + local aura_onleave2 = function (self, capsule) + aura_onleave (capsule.block.widget, capsule.block) + end + + local AuraOnClick = function (block) + if (block.buff) then + block.buff.disabled = not block.buff.disabled + if (block.buff.disabled) then + block.X:Show() + else + block.X:Hide() + end + end + end + + function DpsTuningPlugin:BuildBuffBlocks() + + local auras = fw:CreateLabel (SDF, "Auras (click to disable):") + auras:SetPoint (170, -165) + + local coords = {0.1, 0.9, 0.1, 0.9} + local size = 26 + local color = {.7, .7, .7} + + for i = 1, 3 do + local block = fw:CreatePanel (SDF, 32, 32) + block:SetFrameLevel (SDF:GetFrameLevel()+2) + block:SetPoint (170 + ((i-1) * 36), -180) + block:SetHook ("OnEnter", aura_onenter) + block:SetHook ("OnLeave", aura_onleave) + block.icontexture = fw:CreateImage (block, nil, size, size, "border", coords) + block.icontexture:SetPoint ("center", block, "center") + block.icontexture.alpha = 0.9 + block.icontexture:SetVertexColor (unpack (color)) + block.texttime = fw:CreateLabel (block, "", 16, "yellow", "GameFontNormal", nil, nil, "artwork") + block.texttime:SetPoint ("center", block, "center") + + block.X = fw:CreateImage (block, [[Interface\Glues\LOGIN\Glues-CheckBox-Check]], size*1.1, size*1.1, "overlay") + block.X:SetPoint ("center", block, "center") + block.X:Hide() + + block.button = fw:CreateButton (block, AuraOnClick, 32, 32, "", block) + block.button:SetPoint ("center", box, "center") + block.button:SetHook ("OnEnter", aura_onenter2) + block.button:SetHook ("OnLeave", aura_onleave2) + block.button.block = block + + tinsert (DpsTuningPlugin.AuraBlocks, block) + end + + for i = 1, 3 do + local block = fw:CreatePanel (SDF, 32, 32) + block:SetFrameLevel (SDF:GetFrameLevel()+2) + block:SetPoint (170 + ((i-1) * 36), -220) + block:SetHook ("OnEnter", aura_onenter) + block:SetHook ("OnLeave", aura_onleave) + block.icontexture = fw:CreateImage (block, nil, size, size, "border", coords) + block.icontexture:SetPoint ("center", block, "center") + block.icontexture.alpha = 0.9 + block.icontexture:SetVertexColor (unpack (color)) + block.texttime = fw:CreateLabel (block, "", 16, "yellow", "GameFontNormal", nil, nil, "artwork") + block.texttime:SetPoint ("center", block, "center") + + block.X = fw:CreateImage (block, [[Interface\Glues\LOGIN\Glues-CheckBox-Check]], size*1.1, size*1.1, "overlay") + block.X:SetPoint ("center", block, "center") + block.X:Hide() + + block.button = fw:CreateButton (block, AuraOnClick, 32, 32, "", block) + block.button:SetPoint ("center", box, "center") + block.button:SetHook ("OnEnter", aura_onenter2) + block.button:SetHook ("OnLeave", aura_onleave2) + block.button.block = block + + tinsert (DpsTuningPlugin.AuraBlocks, block) + end + + for i = 1, 3 do + local block = fw:CreatePanel (SDF, 32, 32) + block:SetFrameLevel (SDF:GetFrameLevel()+2) + block:SetPoint (170 + ((i-1) * 36), -260) + block:SetHook ("OnEnter", aura_onenter) + block:SetHook ("OnLeave", aura_onleave) + block.icontexture = fw:CreateImage (block, nil, size, size, "border", coords) + block.icontexture:SetPoint ("center", block, "center") + block.icontexture.alpha = 0.9 + block.icontexture:SetVertexColor (unpack (color)) + block.texttime = fw:CreateLabel (block, "", 16, "yellow", "GameFontNormal", nil, nil, "artwork") + block.texttime:SetPoint ("center", block, "center") + + block.X = fw:CreateImage (block, [[Interface\Glues\LOGIN\Glues-CheckBox-Check]], size*1.1, size*1.1, "overlay") + block.X:SetPoint ("center", block, "center") + block.X:Hide() + + block.button = fw:CreateButton (block, AuraOnClick, 32, 32, "", block) + block.button:SetPoint ("center", box, "center") + block.button:SetHook ("OnEnter", aura_onenter2) + block.button:SetHook ("OnLeave", aura_onleave2) + block.button.block = block + + tinsert (DpsTuningPlugin.AuraBlocks, block) + end + + end + + function DpsTuningPlugin:ClearBuffBlocks() + for index, block in ipairs (DpsTuningPlugin.AuraBlocks) do + block.buff = nil + block.icontexture.texture = nil + block.texttime.text = "" + end + end + + function DpsTuningPlugin:UpdateBuffBlocks() + for index, block in ipairs (DpsTuningPlugin.AuraBlocks) do + if (block.buff) then + if (block.buff.actived) then + block.texttime.text = block.buff.uptime + (ClockTime() - block.buff.actived_at) + else + block.texttime.text = block.buff.uptime + end + end + end + end + + function DpsTuningPlugin:EnableAuraBlock (block_number, buff_table) + if (block_number <= 9) then + local block = DpsTuningPlugin.AuraBlocks [block_number] + block.icontexture.texture = select (3, _GetSpellInfo (buff_table.spellid)) + block.buff = buff_table + end + end + + function DpsTuningPlugin:TrackBuffsAtEnd() + for buffIndex = 1, 41 do + local name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellid = UnitAura ("player", buffIndex, nil, "HELPFUL") + local buff_table = buff_activity [spellid] + if (buff_table) then + if (buff_table.actived_at and buff_table.actived) then + buff_table.uptime = buff_table.uptime + ClockTime() - buff_table.actived_at + end + buff_table.actived = false + buff_table.actived_at = nil + DpsTuningPlugin:BuffChartEnd (spellid) + end + end + end + + function DpsTuningPlugin:BuffChartStart (spellid) + local buff_chart = buff_graphic_data [spellid] + if (not buff_chart) then + buff_chart = {} + buff_graphic_data [spellid] = buff_chart + end + local bufftime = {time_start = DpsTuningPlugin.CurTick, time_end = 0} + tinsert (buff_chart, bufftime) + end + + function DpsTuningPlugin:BuffChartEnd (spellid) + local buff_chart = buff_graphic_data [spellid] + if (buff_chart) then + local bufftime = buff_chart [#buff_chart] + bufftime.time_end = DpsTuningPlugin.CurTick + end + end + + function DpsTuningPlugin:TrackBuffsAtStart() + for buffIndex = 1, 41 do + local name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellid = UnitAura ("player", buffIndex, nil, "HELPFUL") + + if (name and unitCaster == "player" and duration > 0 and expirationTime > 0 and not shouldConsolidate) then + local buff_table = buff_activity [spellid] + if (not buff_table) then + buff_table = {uptime = 0, actived = false, activedamt = 0, block = buff_activity.next, spellid = spellid, procs = {}} + buff_activity.next = buff_activity.next + 1 + buff_activity [spellid] = buff_table + end + + buff_table.actived = true + buff_table.activedamt = 1 + buff_table.actived_at = ClockTime() + tinsert (buff_table.procs, DpsTuningPlugin.CurCombat:GetCombatTime()) + + DpsTuningPlugin:BuffChartStart (spellid) + DpsTuningPlugin:EnableAuraBlock (buff_table.block, buff_table) + end + end + end + + + function DpsTuningPlugin:AuraApplied (time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, spellid, spellname, spellschool, tipo, amount) + if (tipo == "BUFF") then + + local name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellid = UnitAura ("player", spellname, nil, "HELPFUL") + + if (name and unitCaster == "player" and duration > 0 and expirationTime > 0 and not shouldConsolidate) then + + local buff_table = buff_activity [spellid] + if (not buff_table) then + buff_table = {uptime = 0, actived = false, activedamt = 0, block = buff_activity.next, spellid = spellid, procs = {}} + buff_activity.next = buff_activity.next + 1 + buff_activity [spellid] = buff_table + end + + buff_table.actived = true + buff_table.activedamt = buff_table.activedamt + 1 + buff_table.actived_at = ClockTime() + tinsert (buff_table.procs, DpsTuningPlugin.CurCombat:GetCombatTime()) + + DpsTuningPlugin:BuffChartStart (spellid) + DpsTuningPlugin:EnableAuraBlock (buff_table.block, buff_table) + + end + end + end + + function DpsTuningPlugin:AuraRefresh (time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, spellid, spellname, spellschool, tipo, amount) + if (tipo == "BUFF") then + local buff_table = buff_activity [spellid] + if (buff_table) then + if (buff_table.actived_at and buff_table.actived) then + buff_table.uptime = buff_table.uptime + ClockTime() - buff_table.actived_at + end + buff_table.actived_at = ClockTime() + buff_table.actived = true + end + end + end + + function DpsTuningPlugin:AuraRemoved (time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, spellid, spellname, spellschool, tipo, amount) + if (tipo == "BUFF") then + local buff_table = buff_activity [spellid] + if (buff_table) then + if (buff_table.actived_at and buff_table.actived) then + buff_table.uptime = buff_table.uptime + ClockTime() - buff_table.actived_at + end + buff_table.actived = false + buff_table.actived_at = nil + tinsert (buff_table.procs, DpsTuningPlugin.CurCombat:GetCombatTime()) + DpsTuningPlugin:BuffChartEnd (spellid) + end + end + end + + local misscolor = {1, 0.3, 0.3} + + local bar_onenter_script = function (self, capsule) + + if (not DpsTuningPlugin.CurPlayer or not capsule.spellid) then + return + end + + GameCooltip:Reset() + GameCooltip:SetOwner (self) + GameCooltip:SetType ("tooltip") + DpsTuningPlugin:CooltipPreset (2) + + local spell = DpsTuningPlugin.CurPlayer:GetSpell (capsule.spellid) + local name, _, icon = _GetSpellInfo (capsule.spellid) + + GameCooltip:AddLine (name, "", 1, "orange", nil, 13, "Arrial Narrow") + GameCooltip:AddIcon (icon) + + GameCooltip:AddLine ("") + + GameCooltip:AddLine ("Damage:", DpsTuningPlugin:comma_value (spell.total), 1, "white", nil, 10, "Arrial Narrow") + GameCooltip:AddLine ("Hits:", spell.counter, 1, "white", nil, 10, "Arrial Narrow") + GameCooltip:AddLine ("Dps:", DpsTuningPlugin:ToK2 (floor (spell.total / DpsTuningPlugin.CurPlayer:Tempo())), 1, "white", nil, 10, "Arrial Narrow") + GameCooltip:AddLine ("Percent:", _cstr ("%.1f", spell.total / DpsTuningPlugin.CurPlayer.total_without_pet * 100) .. "%", 1, "white", nil, 10, "Arrial Narrow") + + GameCooltip:AddLine ("") + + GameCooltip:AddLine ("Average Damage:", DpsTuningPlugin:comma_value (floor (spell.total / spell.counter)), 1, "white", nil, 10, "Arrial Narrow") + GameCooltip:AddLine ("Min Hit:", DpsTuningPlugin:comma_value (spell.n_min), 1, "white", nil, 10, "Arrial Narrow") + GameCooltip:AddLine ("Max Hit:", DpsTuningPlugin:comma_value (math.max (spell.n_max, spell.c_max)), 1, "white", nil, 10, "Arrial Narrow") + + GameCooltip:AddLine ("") + + GameCooltip:AddLine ("Critical Hits:", _cstr ("%.1f", spell.c_amt / spell.counter * 100) .. "%", 1, "white", nil, 10, "Arrial Narrow") + if (spell.c_amt > 0) then + GameCooltip:AddLine ("Critical Average Damage:", DpsTuningPlugin:comma_value (floor (spell.c_dmg / spell.c_amt)), 1, "white", nil, 10, "Arrial Narrow") + else + GameCooltip:AddLine ("Critical Average Damage:", "0", 1, "white", nil, 10, "Arrial Narrow") + end + + --uptime + local misc = DpsTuningPlugin.CurCombat (DETAILS_ATTRIBUTE_MISC, DpsTuningPlugin.playername) + if (misc) then + local debuff_uptime = misc.debuff_uptime + if (debuff_uptime) then + local this_spell = misc.debuff_uptime_spell_tables._ActorTable [capsule.spellid] + if (this_spell) then + GameCooltip:AddLine ("") + local uptime = this_spell.uptime + local minutos, segundos = floor (uptime/60), floor (uptime%60) + GameCooltip:AddLine ("Uptime:", minutos .. "m " .. segundos .. "s", 1, "white", nil, 10, "Arrial Narrow") + end + end + end + + --miss + GameCooltip:AddLine ("") + + local miss = spell ["MISS"] + local parry = spell ["PARRY"] + local dodge = spell ["DODGE"] + + if (miss) then + GameCooltip:AddLine ("Miss:", miss .. " (" .. _cstr ("%.1f", miss / spell.counter * 100) .. "%)", 1, misscolor, nil, 10, "Arrial Narrow") + end + if (parry) then + GameCooltip:AddLine ("Parry:", parry .. " (" .. _cstr ("%.1f", parry / spell.counter * 100) .. "%)", 1, misscolor, nil, 10, "Arrial Narrow") + end + if (dodge) then + GameCooltip:AddLine ("Dodge:", dodge .. " (" .. _cstr ("%.1f", dodge / spell.counter * 100) .. "%)", 1, misscolor, nil, 10, "Arrial Narrow") + end + if (spell.g_amt > 0) then + GameCooltip:AddLine ("Glancing:", spell.g_amt .. " (" .. _cstr ("%.1f", spell.g_amt / spell.counter * 100) .. "%)", 1, misscolor, nil, 10, "Arrial Narrow") + end + + GameCooltip:SetOption ("AlignAsBlizzTooltip", true) + GameCooltip:Show() + end + + local bar_onleanve_script = function (self) + GameCooltip:Hide() + end + + function DpsTuningPlugin:BuildSpellBars() + DpsTuningPlugin.SpellBars = {} + + local scrollbar = CreateFrame ("scrollframe", "DpsTuningPluginSpellsFauxScroll", DpsTuningPlugin.Frame, "FauxScrollFrameTemplate") + scrollbar:SetSize (275, 150) + scrollbar:SetPoint ("topleft", DpsTuningPlugin.Frame, "topleft", 1, 0) + scrollbar:SetScript ("OnVerticalScroll", function (self, offset) FauxScrollFrame_OnVerticalScroll (self, offset, 15, update_scroll) end) + scrollbar.Update = update_scroll + DpsTuningPlugin.SpellScroll = scrollbar + + for i = 1, 9 do + local bar = fw:CreateBar (DpsTuningPlugin.Frame, "Skyline", 275, 14, 100) + bar.color = DpsTuningPlugin.BarColor + bar.textfont = "Arial Narrow" + bar.textsize = 10 + bar:SetPoint ("topleft", DpsTuningPlugin.Frame, "topleft", 1, ((i-1) * -15) - 20) + + bar:SetHook ("OnEnter", bar_onenter_script) + bar:SetHook ("OnLeave", bar_onleanve_script) + + tinsert (DpsTuningPlugin.SpellBars, bar) + end + end + + local colors = { + {1, 1, 1}, --white + {1, 0.8, .1}, --orange + {.3, .3, 1}, --blue + {1, .3, .3}, --red + {.3, 1, .3}, --green + {.3, 1, 1}, --cyan + {1, 0.75, 0.79}, --pink + {0.98, 0.50, 0.44}, --salmon + {0.75, 0.75, 0.75}, --silver + {0.60, 0.80, 0.19}, --yellow + {1, .3, 1}, --magenta + } + + local linetypes = {"line", "smallline", "thinline"} + + function DpsTuningPlugin:BuildChartPanels() + + local chart_panel = fw:CreateChartPanel (UIParent, GetScreenWidth()-200, 500) + chart_panel:SetPoint ("topleft", UIParent, "topleft", 100, -100) + chart_panel:SetTitle ("Dps Tuning") + chart_panel:SetFrameStrata ("DIALOG") + chart_panel:CanMove (true) + tinsert (UISpecialFrames, chart_panel:GetName()) + + chart_panel:Hide() + + local open_chart_panel = function() + chart_panel:Reset() + + local player_dps = DpsTuningPlugin.CurCombat:GetTimeData ("Player Damage Done") + + chart_panel:SetTime (DpsTuningPlugin.CurCombat:GetCombatTime()) + chart_panel:SetScale (player_dps.max_value) + + chart_panel:AddLine (player_dps, {1, 1, 1, 1}, "Your Damage", "line") + chart_panel:AddLine (power_amount_chart_table, {1, .4, .4, 1}, "Spell/Attack Power (x3)") + + chart_panel:Show() + end + + local open_chart_panel2 = function() + + chart_panel:Reset() + + local GraphicSmoothLevel = 1 + + --> we need to copy because of the addition of spells with the same icon. + local spell_graphic_data = table_deepcopy (spell_graphic_data) + + local consolidate = {} + for spellid, data in pairs (spell_graphic_data) do + local spellname, _, spellicon = _GetSpellInfo (spellid) + if (consolidate [spellicon]) then + + local data2 = consolidate [spellicon][3] + local new_max_value = consolidate [spellicon][4] + + for i = 1, #data do + data2[i] = data2[i] + data[i] --can be the same table as the default one or it just will add and add over again. + if (data2[i] > new_max_value) then + new_max_value = data2[i] + end + end + + consolidate [spellicon][4] = new_max_value + + local spelldamage = DpsTuningPlugin.CurPlayer:GetSpell (spellid).total + consolidate [spellicon][5] = consolidate [spellicon][5] + spelldamage + + if (string.len (spellname) < string.len (consolidate [spellicon][2])) then + consolidate [spellicon][2] = spellname + end + + else + consolidate [spellicon] = {spellid, spellname, data, data.max_value, DpsTuningPlugin.CurPlayer:GetSpell (spellid).total} + end + end + + local order = {} + for spellid, data in pairs (consolidate) do + tinsert (order, data) + end + + table.sort (order, DpsTuningPlugin.Sort1) + + local player_total_damage = DpsTuningPlugin.CurPlayer.total + + local max = 0 + + for index, data in ipairs (order) do + local spellid = data[1] + local spellname = data[2] + local chart_data = data[3] + local max_value = data[4] + if (max_value > max) then + max = max_value + end + local spelldamage = data[5] + + if (spelldamage/player_total_damage*100 > 5) then + if (colors [index]) then + chart_panel:AddLine (chart_data, colors [index], spellname, nil, GraphicSmoothLevel) + end + end + end + + chart_panel:SetTime (DpsTuningPlugin.CurCombat:GetCombatTime()) + chart_panel:SetScale (max) + + chart_panel:Show() + end + + local open_chart_panel3 = function() + + chart_panel:Reset() + + local player_dps = DpsTuningPlugin.CurCombat:GetTimeData ("Player Damage Done") + chart_panel:AddLine (player_dps, {1, 1, 1, 1}, "Your Damage", "line") + + chart_panel:SetTime (DpsTuningPlugin.CurCombat:GetCombatTime()) + chart_panel:SetScale (player_dps.max_value) + + local index = 1 + for spellid, bufftable in pairs (buff_activity) do + if (type (bufftable) == "table") then + if (not bufftable.disabled) then + local proctable = bufftable.procs + + local spellname, _, spellicon = _GetSpellInfo (spellid) + + chart_panel:AddOverlay (bufftable.procs, colors [index], spellname, spellicon) + index = index + 1 + end + end + end + + chart_panel:Show() + + end + + local button_open = fw:CreateButton (SDF, open_chart_panel, 120, 18, "Damage x Power", nil, nil, nil, "OpenGraphicButton") + button_open:InstallCustomTexture (nil, nil, nil, nil, true) + button_open:SetPoint ("bottomleft", SDF, "bottomleft", 2, 3) + button_open:Disable() + + local button_open2 = fw:CreateButton (SDF, open_chart_panel2, 120, 18, "All Spells", nil, nil, nil, "OpenGraphicButton2") + button_open2:InstallCustomTexture (nil, nil, nil, nil, true) + button_open2:SetPoint ("bottom", button_open, "top", 0, 3) + button_open2:Disable() + + local button_open3 = fw:CreateButton (SDF, open_chart_panel3, 120, 18, "Aura Procs", nil, nil, nil, "OpenGraphicButton3") + button_open3:InstallCustomTexture (nil, nil, nil, nil, true) + button_open3:SetPoint ("bottom", button_open2, "top", 0, 3) + button_open3:Disable() + + end + + + function DpsTuningPlugin:UpdateSummary() + if (DpsTuningPlugin.CurPlayer) then + DpsTuningPlugin.total_damage.text = DpsTuningPlugin:comma_value (floor (DpsTuningPlugin.CurPlayer.total)) + DpsTuningPlugin.activity_dps.text = DpsTuningPlugin:ToK2 (floor (DpsTuningPlugin.CurPlayer.total / DpsTuningPlugin.CurPlayer:Tempo())) + DpsTuningPlugin.time_elapsed.text = _cstr ("%.1f", GetTime() - DpsTuningPlugin.StartTime) + DpsTuningPlugin.power_amount.text = DpsTuningPlugin:comma_value (GetSpellBonusDamage (DpsTuningPlugin.PowerType)) + end + end + + function DpsTuningPlugin:UpdateMiliTick() + DpsTuningPlugin:UpdateSummary() + end + + function DpsTuningPlugin:UpdateTick() + + --check for current player + if (not DpsTuningPlugin.CurPlayer) then + if (not DpsTuningPlugin.CurCombat) then + return + end + DpsTuningPlugin.CurPlayer = DpsTuningPlugin.CurCombat (DETAILS_ATTRIBUTE_DAMAGE, DpsTuningPlugin.playername) + if (not DpsTuningPlugin.CurPlayer) then + return + end + + if (DpsTuningPlugin.CurPlayer and not DpsTuningPlugin.MiliSecTick) then + DpsTuningPlugin.MiliSecTick = DpsTuningPlugin:ScheduleRepeatingTimer ("UpdateMiliTick", 0.1) + end + end + + DpsTuningPlugin.CurTick = DpsTuningPlugin.CurTick + 1 + + --refresh bars + DpsTuningPlugin.RefreshSpells() + + --refresh buff blocks + DpsTuningPlugin:UpdateBuffBlocks() + + --get spells damages + DpsTuningPlugin:ChartDataTick() + + end + + function DpsTuningPlugin:ChartDataTick() + + local power = math.max (GetSpellBonusDamage (1), GetSpellBonusDamage (2)) * 3 + tinsert (power_amount_chart_table, power) + if (power_amount_chart_table.max_value < power) then + power_amount_chart_table.max_value = power + end + + for spellid, spelltable in pairs (DpsTuningPlugin.CurPlayer:GetActorSpells()) do + if (spelltable.total > 0) then + + local chart_table = spell_graphic_data [spelltable.id] + + if (not chart_table) then + local new_chart_data = {} + new_chart_data.last_value = 0 + new_chart_data.max_value = 0 + + for i = 1, DpsTuningPlugin.CurTick-1 do + tinsert (new_chart_data, 0) + end + spell_graphic_data [spelltable.id] = new_chart_data + chart_table = new_chart_data + end + + local cvalue = spelltable.total - chart_table.last_value + if (chart_table.max_value < cvalue) then + chart_table.max_value = cvalue + end + tinsert (chart_table, cvalue) + chart_table.last_value = spelltable.total + + end + end + end + + function DpsTuningPlugin:OnCombatStart (...) + + if (DpsTuningPlugin.FinishedAt+10 > ClockTime()) then + DpsTuningPlugin:Msg ("Ignoring combat start: a combat just finished.") + DpsTuningPlugin.FinishedAt = ClockTime() + return + end + + DpsTuningPlugin.CurCombat = ... + DpsTuningPlugin.CurPlayer = DpsTuningPlugin.CurCombat (DETAILS_ATTRIBUTE_DAMAGE, DpsTuningPlugin.playername) + + table.wipe (spell_activity) + table.wipe (buff_activity) + table.wipe (spell_graphic_data) + table.wipe (buff_graphic_data) + table.wipe (power_amount_chart_table) + + buff_activity.next = 1 + power_amount_chart_table.max_value = 0 + + DpsTuningPlugin:ClearBuffBlocks() + DpsTuningPlugin:TrackBuffsAtStart() + + --> enable buff parser + SDF:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED") + + DpsTuningPlugin.LastDps = 0 + DpsTuningPlugin.CurTick = 0 + DpsTuningPlugin.StartTime = GetTime() + + DpsTuningPlugin.TimerTick = DpsTuningPlugin:ScheduleRepeatingTimer ("UpdateTick", 1) + + if (DpsTuningPlugin.CurPlayer and not DpsTuningPlugin.MiliSecTick) then + DpsTuningPlugin.MiliSecTick = DpsTuningPlugin:ScheduleRepeatingTimer ("UpdateMiliTick", 0.1) + end + + SDF.OpenGraphicButton:Disable() + SDF.OpenGraphicButton2:Disable() + SDF.OpenGraphicButton3:Disable() + + end + + function DpsTuningPlugin:OnCombatEnd (...) + local combat = ... + + if (DpsTuningPlugin.CurCombat and DpsTuningPlugin.CurCombat == combat) then + local now = ClockTime() + + DpsTuningPlugin.FinishedAt = now + + --> close spells + for spellid, spelltable in pairs (spell_activity) do + if (spelltable.onhold) then + local diff = now - spelltable.delay - 2 + if (diff > 0) then + spelltable.start = spelltable.start + diff + end + spelltable.onhold = nil + end + + spelltable.tempo_end = now + end + + --> close buffs + DpsTuningPlugin:TrackBuffsAtEnd() + + --> turn off buff parser + SDF:UnregisterEvent ("COMBAT_LOG_EVENT_UNFILTERED") + + --> cancel tick + DpsTuningPlugin:CancelTicker() + + SDF.OpenGraphicButton:Enable() + SDF.OpenGraphicButton2:Enable() + SDF.OpenGraphicButton3:Enable() + end + end + + function DpsTuningPlugin:CancelTicker() + if (DpsTuningPlugin.TimerTick) then + DpsTuningPlugin:CancelTimer (DpsTuningPlugin.TimerTick) + DpsTuningPlugin.TimerTick = nil + end + if (DpsTuningPlugin.MiliSecTick) then + DpsTuningPlugin:CancelTimer (DpsTuningPlugin.MiliSecTick) + DpsTuningPlugin.MiliSecTick = nil + end + end + +end + +function DpsTuningPlugin:OnEvent (_, event, ...) + + if (event == "COMBAT_LOG_EVENT_UNFILTERED") then + + local time1, token, hidding, who_serial, who_name, who_flags, who_flags2, alvo_serial, alvo_name, alvo_flags, alvo_flags2, spellid, spellname, spellschool, tipo, amount = select (1, ...) + + if (who_name == DpsTuningPlugin.playername and alvo_name == DpsTuningPlugin.playername) then + if (token == "SPELL_AURA_APPLIED") then + DpsTuningPlugin:AuraApplied (time1, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, spellid, spellname, spellschool, tipo, amount) + elseif (token == "SPELL_AURA_REMOVED") then + DpsTuningPlugin:AuraRemoved (time1, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, spellid, spellname, spellschool, tipo, amount) + elseif (token == "SPELL_AURA_REFRESH") then + DpsTuningPlugin:AuraRefresh (time1, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, spellid, spellname, spellschool, tipo, amount) + end + end + + elseif (event == "ADDON_LOADED") then + local AddonName = select (1, ...) + if (AddonName == "Details_DpsTuning") then + + if (_G._detalhes) then + + --> create main plugin object + CreatePluginFrames() + + local MINIMAL_DETAILS_VERSION_REQUIRED = 28 + + local default_settings = { + SpellBarsShowType = 1, + } + + --> Install plugin inside details + local install = _G._detalhes:InstallPlugin ("SOLO", "Dps Tuning", "Interface\\Icons\\Ability_Racial_RocketBarrage", DpsTuningPlugin, "DETAILS_PLUGIN_DPS_TUNING", MINIMAL_DETAILS_VERSION_REQUIRED, "Details! Team", "v1.00", default_settings) + if (type (install) == "table" and install.error) then + print (install.error) + end + + --> Register needed events + _G._detalhes:RegisterEvent (DpsTuningPlugin, "COMBAT_PLAYER_ENTER") + _G._detalhes:RegisterEvent (DpsTuningPlugin, "COMBAT_PLAYER_LEAVE") + _G._detalhes:RegisterEvent (DpsTuningPlugin, "DETAILS_DATA_RESET") + + end + end + + end +end diff --git a/plugins/Details_DpsTuning/Details_DpsTuning.toc b/plugins/Details_DpsTuning/Details_DpsTuning.toc new file mode 100644 index 00000000..593aa5da --- /dev/null +++ b/plugins/Details_DpsTuning/Details_DpsTuning.toc @@ -0,0 +1,7 @@ +## Interface: 50400 +## Title: Details Dps Tuning (plugin) +## Notes: Plugin for Details +## RequiredDeps: Details +## OptionalDeps: Ace3 + +Details_DpsTuning.lua \ No newline at end of file diff --git a/plugins/Details_EncounterDetails/Details_EncounterDetails.lua b/plugins/Details_EncounterDetails/Details_EncounterDetails.lua index e21a0918..de7c108c 100644 --- a/plugins/Details_EncounterDetails/Details_EncounterDetails.lua +++ b/plugins/Details_EncounterDetails/Details_EncounterDetails.lua @@ -38,7 +38,7 @@ local _combat_object local CLASS_ICON_TCOORDS = _G.CLASS_ICON_TCOORDS EncounterDetails.name = "Encounter Details" - +EncounterDetails.debugmode = false local ability_type_table = { [0x1] = "|cFF00FF00"..Loc ["STRING_HEAL"].."|r", @@ -61,8 +61,6 @@ local ability_type_table = { } -local debugmode = false - --> main object frame functions local function CreatePluginFrames (data) @@ -138,7 +136,7 @@ local function CreatePluginFrames (data) --_detalhes:TimeDataRegister ("Raid Damage Done", damage_done_func, {last_damage = 0, max_damage = 0}, "Encounter Details", "v1.0", [[Interface\ICONS\Ability_DualWield]], true) _detalhes:TimeDataRegister ("Raid Damage Done", string_damage_done_func, nil, "Encounter Details", "v1.0", [[Interface\ICONS\Ability_DualWield]], true, true) - + if (EncounterDetails.db.show_icon == 4) then EncounterDetails:ShowIcon() elseif (EncounterDetails.db.show_icon == 5) then @@ -194,7 +192,8 @@ local function CreatePluginFrames (data) --drop last combat table EncounterDetails.LastSegmentShown = nil - --table.wipe (EncounterDetails.boss_emotes_table) + --wipe emotes + table.wipe (EncounterDetails.boss_emotes_table) elseif (event == "GROUP_ONENTER") then if (EncounterDetails.db.show_icon == 2) then @@ -231,7 +230,7 @@ local function CreatePluginFrames (data) function EncounterDetails:WasEncounter() --> check if last combat was a boss encounter fight - if (not debugmode) then + if (not EncounterDetails.debugmode) then if (not _combat_object.is_boss) then return @@ -269,6 +268,7 @@ local function CreatePluginFrames (data) end --> build all window data + EncounterDetails.db.opened = EncounterDetails.db.opened + 1 EncounterDetails:OpenAndRefresh() --> show EncounterDetailsFrame:Show() @@ -322,14 +322,12 @@ end local function KillInfo (deathTable, row) - local lastEvents = deathTable [1] - local timeOfDeath = deathTable [2] + local eventos = deathTable [1] + local hora_da_morte = deathTable [2] local hp_max = deathTable [5] - local lines = {} - local battleress = false - local skillTable = row.extra + local lastcooldown = false local GameCooltip = GameCooltip @@ -337,90 +335,98 @@ end GameCooltip:SetType ("tooltipbar") GameCooltip:SetOwner (row) + GameCooltip:AddLine ("Click to Report", nil, 1, "orange") + GameCooltip:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 12, 16, 0.015625, 0.13671875, 0.4375, 0.59765625) + GameCooltip:AddStatusBar (0, 1, 1, 1, 1, 1, false, {value = 100, color = {.3, .3, .3, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar_serenity]]}) + + --death parser + for index, event in _ipairs (eventos) do - for index, event in _ipairs (lastEvents) do - - --max hp percent (in case of hp cooldowns) local hp = _math_floor (event[5]/hp_max*100) if (hp > 100) then hp = 100 end - if (event [1]) then --> DAMAGE - local nome_magia, _, icone_magia = _GetSpellInfo (event [2]) - - if (not event[3] and not battleress) then --> battle ress - GameCooltip:AddLine ("+".._cstr ("%.1f", event[4] - timeOfDeath) .."s "..nome_magia.." ("..event[6]..")", "-- -- -- ", 1, "white") - GameCooltip:AddIcon ("Interface\\Glues\\CharacterSelect\\Glues-AddOn-Icons", 1, 1, nil, nil, .75, 1, 0, 1) - GameCooltip:AddStatusBar (100, 1, "silver", false) - battleress = true + local evtype = event [1] + local spellname, _, spellicon = _GetSpellInfo (event [2]) + local amount = event [3] + local time = event [4] + local source = event [6] + + if (type (evtype) == "boolean") then + --> is damage or heal + if (evtype) then + --> damage + GameCooltip:AddLine ("" .. _cstr ("%.1f", time - hora_da_morte) .. "s " .. spellname .. " (" .. source .. ")", "-" .. _detalhes:ToK (amount) .. " (" .. hp .. "%)", 1, "white", "white") + GameCooltip:AddIcon (spellicon) - elseif (event[3]) then - - local habilidade_school = skillTable [event [2]] --> pegou a tabela com os hex - local _school = "" - - if (habilidade_school) then - for _, hex in _ipairs (habilidade_school) do - _school = _school .. " " .. ability_type_table [hex] - end - end - - _school = _detalhes:trim (_school) - local texto_esquerdo - if (nome_magia) then - texto_esquerdo = "".._cstr ("%.1f", event[4] - timeOfDeath) .."s " .. nome_magia .. " (".. event [6] ..")" --" (".. _school ..")" - texto_esquerdo = texto_esquerdo:gsub ("(%()%)", "") + if (event [9]) then + --> friendly fire + GameCooltip:AddStatusBar (hp, 1, "darkorange", true) else - texto_esquerdo = "" + --> from a enemy + GameCooltip:AddStatusBar (hp, 1, "red", true) end + else + --> heal + GameCooltip:AddLine ("" .. _cstr ("%.1f", time - hora_da_morte) .. "s " .. spellname .. " (" .. source .. ")", "+" .. _detalhes:ToK (amount) .. " (" .. hp .. "%)", 1, "white", "white") + GameCooltip:AddIcon (spellicon) + GameCooltip:AddStatusBar (hp, 1, "green", true) + + end + + elseif (type (evtype) == "number") then + if (evtype == 1) then + --> cooldown + GameCooltip:AddLine ("" .. _cstr ("%.1f", time - hora_da_morte) .. "s " .. spellname .. " (" .. source .. ")", "cooldown (" .. hp .. "%)", 1, "white", "white") + GameCooltip:AddIcon (spellicon) + GameCooltip:AddStatusBar (100, 1, "yellow", true) + + elseif (evtype == 2 and not battleress) then + --> battle ress + battleress = event + + elseif (evtype == 3) then + --> last cooldown used + lastcooldown = event - if (type (event [1]) ~= "boolean" and event [1] == 2) then --> last cooldown - if (event[3] == 1) then - GameCooltip:AddLine ("".._cstr ("%.1f", event[4] - timeOfDeath) .. "s " .. nome_magia .. " (" .. Loc ["STRING_LAST_COOLDOWN"] .. ")") - GameCooltip:AddIcon (icone_magia) - GameCooltip:AddStatusBar (100, 1, "gray", true) - else - GameCooltip:AddLine (Loc ["STRING_NOLAST_COOLDOWN"]) - GameCooltip:AddStatusBar (100, 1, "gray", true) - end - else - GameCooltip:AddLine (texto_esquerdo, "-".._detalhes:ToK (event[3]).." (".. hp .."%)", 1, "white", "white") - GameCooltip:AddIcon (icone_magia) - - if (type (event [1]) ~= "boolean" and event [1] == 1) then --> cooldown - GameCooltip:AddStatusBar (100, 1, "yellow", true) - else - GameCooltip:AddStatusBar (hp, 1, "red", true) - end - end - end - else - local nome_magia, _, icone_magia = _GetSpellInfo (event [2]) - GameCooltip:AddLine ("".._cstr ("%.1f", event[4] - timeOfDeath) .."s "..nome_magia.." ("..event[6]..")", "+".._detalhes:ToK (event[3]).." (".. hp .."%)", 1, "white", "white") - GameCooltip:AddIcon (icone_magia, 1, 1) - GameCooltip:AddStatusBar (hp, 1, "green", true) end end + + GameCooltip:AddLine (deathTable [6] .. " " .. "died" , "-- -- -- ", 1, "white") + GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\small_icons", 1, 1, nil, nil, .75, 1, 0, 1) + GameCooltip:AddStatusBar (0, 1, .5, .5, .5, .5, false, {value = 100, color = {.5, .5, .5, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar4_vidro]]}) if (battleress) then - GameCooltip:AddSpecial ("line", 2, nil, deathTable [6] .. " "..Loc ["STRING_DIED"], "-- -- -- ", 1, "white") - GameCooltip:AddSpecial ("icon", 2, nil, "Interface\\AddOns\\Details\\images\\small_icons", 1, 1, nil, nil, .75, 1, 0, 1) - GameCooltip:AddSpecial ("statusbar", 2, nil, 100, 1, "darkgray", false) - else - GameCooltip:AddSpecial ("line", 1, nil, deathTable [6] .. " "..Loc ["STRING_DIED"], "-- -- -- ", 1, "white") - GameCooltip:AddSpecial ("icon", 1, nil, "Interface\\AddOns\\Details\\images\\small_icons", 1, 1, nil, nil, .75, 1, 0, 1) - GameCooltip:AddSpecial ("statusbar", 1, nil, 100, 1, "darkgray", false) - + local nome_magia, _, icone_magia = _GetSpellInfo (battleress [2]) + GameCooltip:AddLine ("+" .. _cstr ("%.1f", battleress[4] - hora_da_morte) .. "s " .. nome_magia .. " (" .. battleress[6] .. ")", "", 1, "white") + GameCooltip:AddIcon ("Interface\\Glues\\CharacterSelect\\Glues-AddOn-Icons", 1, 1, nil, nil, .75, 1, 0, 1) + GameCooltip:AddStatusBar (0, 1, .5, .5, .5, .5, false, {value = 100, color = {.5, .5, .5, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar4_vidro]]}) end + if (lastcooldown) then + if (lastcooldown[3] == 1) then + local nome_magia, _, icone_magia = _GetSpellInfo (lastcooldown [2]) + GameCooltip:AddLine (_cstr ("%.1f", lastcooldown[4] - hora_da_morte) .. "s " .. nome_magia .. " (" .. Loc ["STRING_LAST_COOLDOWN"] .. ")") + GameCooltip:AddIcon (icone_magia) + else + GameCooltip:AddLine (Loc ["STRING_NOLAST_COOLDOWN"]) + GameCooltip:AddIcon ([[Interface\CHARACTERFRAME\UI-Player-PlayTimeUnhealthy]], 1, 1, 18, 18) + end + GameCooltip:AddStatusBar (0, 1, 1, 1, 1, 1, false, {value = 100, color = {.3, .3, .3, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar_serenity]]}) + end + + GameCooltip:SetOption ("StatusBarHeightMod", -6) - GameCooltip:SetOption ("FixedWidth", 400) + GameCooltip:SetOption ("FixedWidth", 300) GameCooltip:SetOption ("TextSize", 9) - GameCooltip:SetOption ("StatusBarTexture", "Interface\\AddOns\\Details\\images\\bar_serenity") - GameCooltip:ShowCooltip() + GameCooltip:SetOption ("LeftBorderSize", -4) + GameCooltip:SetOption ("RightBorderSize", 5) + GameCooltip:SetOption ("StatusBarTexture", [[Interface\AddOns\Details\images\bar4_reverse]]) + GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0.64453125, 0}, {.8, .8, .8, 0.2}, true) + GameCooltip:ShowCooltip() end --> custom tooltip for dispells details --------------------------------------------------------------------------------------------------------- @@ -614,6 +620,9 @@ end --> custom tooltip that handle mouse enter and leave on customized rows --------------------------------------------------------------------------------------------------------- +local backdrop_bar_onenter = {bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 16, edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", edgeSize = 8, insets = {left = 1, right = 1, top = 0, bottom = 1}} +local backdrop_bar_onleave = {bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 16, insets = {left = 1, right = 1, top = 0, bottom = 1}} + function EncounterDetails:SetRowScripts (barra, index, container) barra:SetScript ("OnMouseDown", function (self) @@ -663,9 +672,9 @@ function EncounterDetails:SetRowScripts (barra, index, container) self:SetHeight (17) self:SetAlpha(1) - self:SetBackdrop({edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10,insets = {left = 1, right = 1, top = 0, bottom = 1},}) - self:SetBackdropBorderColor (170/255, 170/255, 170/255) - self:SetBackdropColor (24/255, 24/255, 24/255) + self:SetBackdrop (backdrop_bar_onenter) + self:SetBackdropColor (.0, .0, .0, 0.3) + self:SetBackdropBorderColor (.0, .0, .0, 0.5) GameTooltip:SetOwner (self, "ANCHOR_TOPRIGHT") @@ -714,11 +723,10 @@ function EncounterDetails:SetRowScripts (barra, index, container) end self:SetHeight (16) - self:SetAlpha(0.9) + self:SetAlpha (0.9) - self:SetBackdrop({bgFile = "", edgeFile = "", tile = true, tileSize = 16, edgeSize = 32, insets = {left = 1, right = 1, top = 0, bottom = 1},}) - self:SetBackdropBorderColor (0, 0, 0, 0) - self:SetBackdropColor (0, 0, 0, 0) + self:SetBackdrop (backdrop_bar_onleave) + self:SetBackdropColor (.0, .0, .0, 0.3) GameTooltip:Hide() _detalhes.popup:ShowMe (false, "tooltip") @@ -739,21 +747,23 @@ function EncounterDetails:OpenAndRefresh (_, segment) if (segment) then --get combat segment, 1 more recently ...25 oldest _combat_object = EncounterDetails:GetCombat (segment) + EncounterDetails._segment = segment else _G [frame:GetName().."SegmentsDropdown"].MyObject:Select (1, true) + EncounterDetails._segment = 1 end local boss_id local map_id local boss_info - if (debugmode and not _combat_object.is_boss) then + if (EncounterDetails.debugmode and not _combat_object.is_boss) then _combat_object.is_boss = { index = 1, - name = _detalhes:GetBossName (1098, 1), - zone = "Throne of Thunder", - mapid = 1098, - encounter = "Jin'Rohk the Breaker" + name = "Immerseus", + zone = "Siege of Orggrimar", + mapid = 1136, + encounter = "Immerseus" } end @@ -785,6 +795,10 @@ function EncounterDetails:OpenAndRefresh (_, segment) end end + if (EncounterDetailsFrame.ShowType == "graph") then + EncounterDetails:BuildDpsGraphic() + end + EncounterDetails.LastSegmentShown = _combat_object -------------- set boss name and zone name -------------- @@ -795,14 +809,18 @@ function EncounterDetails:OpenAndRefresh (_, segment) local L, R, T, B, Texture = EncounterDetails:GetBossIcon (_combat_object.is_boss.mapid, _combat_object.is_boss.index) EncounterDetailsFrame.boss_icone:SetTexture (Texture) EncounterDetailsFrame.boss_icone:SetTexCoord (L, R, T, B) - EncounterDetailsFrame.raidbackground:SetTexture (EncounterDetails:GetRaidBackground (_combat_object.is_boss.mapid)) + + local file, L, R, T, B = EncounterDetails:GetRaidBackground (_combat_object.is_boss.mapid) + EncounterDetailsFrame.raidbackground:SetTexture (file) + EncounterDetailsFrame.raidbackground:SetTexCoord (L, R, T, B) + EncounterDetailsFrame.raidbackground:SetAlpha (0.8) -------------- set totals on down frame -------------- --[[ data mine: _combat_object ["totals_grupo"] hold the total [1] damage // [2] heal // [3] [energy_name] energies // [4] [misc_name] miscs --]] - EncounterDetailsFrame.StatusBar_totaldamage:SetText (Loc ["STRING_TOTAL_DAMAGE"]..": ".. _detalhes:comma_value (_combat_object.totals_grupo[1])) --> [1] total damage - EncounterDetailsFrame.StatusBar_totalheal:SetText (Loc ["STRING_TOTAL_HEAL"]..": ".. _detalhes:comma_value (_combat_object.totals_grupo[2])) --> [2] total heal + --EncounterDetailsFrame.StatusBar_totaldamage:SetText (Loc ["STRING_TOTAL_DAMAGE"]..": ".. _detalhes:comma_value (_combat_object.totals_grupo[1])) --> [1] total damage + --EncounterDetailsFrame.StatusBar_totalheal:SetText (Loc ["STRING_TOTAL_HEAL"]..": ".. _detalhes:comma_value (_combat_object.totals_grupo[2])) --> [2] total heal --> Container Overall Damage Taken --[[ data mine: @@ -1026,6 +1044,7 @@ function EncounterDetails:OpenAndRefresh (_, segment) --> agora ja tenho a lista de todos os adds da luta -- vasculhar o container de dano e achar os adds: + -- ~add local adds = {} @@ -1089,8 +1108,11 @@ function EncounterDetails:OpenAndRefresh (_, segment) --> montou a tabela, agora precisa mostrar no painel - local function _DanoFeito (barra) - barra = barra:GetParent() + local function _DanoFeito (self) + + self.textura:SetBlendMode ("ADD") + + local barra = self:GetParent() local tabela = barra.jogador local dano_em = tabela.dano_em @@ -1111,8 +1133,11 @@ function EncounterDetails:OpenAndRefresh (_, segment) GameTooltip:Show() end - local function _DanoRecebido (barra) - barra = barra:GetParent() + local function _DanoRecebido (self) + + self.textura:SetBlendMode ("ADD") + + local barra = self:GetParent() local tabela = barra.jogador local damage_from = tabela.damage_from @@ -1139,6 +1164,11 @@ function EncounterDetails:OpenAndRefresh (_, segment) GameTooltip:Show() end + local function _OnHide (self) + GameTooltip:Hide() + self.textura:SetBlendMode ("BLEND") + end + local y = 10 local frame_adds = EncounterDetailsFrame.overall_adds container = frame_adds.gump @@ -1153,8 +1183,11 @@ function EncounterDetails:OpenAndRefresh (_, segment) local barra = container.barras [index] if (not barra) then - barra = EncounterDetails:CreateRow (index, container) - barra:SetWidth (160) + barra = EncounterDetails:CreateRow (index, container, -0) + barra:SetBackdrop (backdrop_bar_onleave) + barra:SetBackdropColor (.0, .0, .0, 0.3) + + barra:SetWidth (155) barra._no_report = true @@ -1168,11 +1201,11 @@ function EncounterDetails:OpenAndRefresh (_, segment) add_damage_taken:SetResizable (false) add_damage_taken:SetPoint ("left", barra, "left", 0, 0) - add_damage_taken:SetBackdrop (gump_fundo_backdrop) - add_damage_taken:SetBackdropColor (.3, .7, .7, 0.8) + add_damage_taken:SetBackdrop ({bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 16}) + add_damage_taken:SetBackdropColor (.0, .5, .0, 0.5) add_damage_taken:SetScript ("OnEnter", _DanoRecebido) - add_damage_taken:SetScript ("OnLeave", function() GameTooltip:Hide() end) + add_damage_taken:SetScript ("OnLeave", _OnHide) add_damage_taken:SetScript ("OnClick", EncounterDetails.BossInfoRowClick) add_damage_taken.textura = add_damage_taken:CreateTexture (nil, "overlay") @@ -1191,8 +1224,8 @@ function EncounterDetails:OpenAndRefresh (_, segment) add_damage_done:SetResizable (false) add_damage_done:SetPoint ("left", add_damage_taken, "right", 0, 0) - add_damage_done:SetBackdrop (gump_fundo_backdrop) - add_damage_done:SetBackdropColor (.9, .9, .3, 0.8) + add_damage_done:SetBackdrop ({bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 16}) + add_damage_done:SetBackdropColor (.5, .0, .0, 0.5) add_damage_done.textura = add_damage_done:CreateTexture (nil, "overlay") add_damage_done.textura:SetTexture ("Interface\\Buttons\\UI-MicroStream-Red") @@ -1201,7 +1234,7 @@ function EncounterDetails:OpenAndRefresh (_, segment) add_damage_done.textura:SetPoint ("topleft", add_damage_done, "topleft") add_damage_done:SetScript ("OnEnter", _DanoFeito) - add_damage_done:SetScript ("OnLeave", function() GameTooltip:Hide() end) + add_damage_done:SetScript ("OnLeave", _OnHide) add_damage_done:SetScript ("OnClick", EncounterDetails.BossInfoRowClick) barra.texto_esquerdo:SetPoint ("left", add_damage_done, "right") @@ -1213,10 +1246,7 @@ function EncounterDetails:OpenAndRefresh (_, segment) end barra.texto_esquerdo:SetText (addName) - - --barra.texto_direita:SetText (_detalhes:comma_value (esta_tabela.total)) barra.texto_direita:SetText (_detalhes:ToK (esta_tabela.total)) - barra.texto_esquerdo:SetSize (barra:GetWidth() - barra.texto_direita:GetStringWidth() - 34, 15) barra.jogador = esta_tabela --> barra.jogador agora tem a tabela com --> [1] total dano causado [2] jogadores que foram alvos [3] jogadores que castaram essa magia [4] ID da magia @@ -1225,9 +1255,6 @@ function EncounterDetails:OpenAndRefresh (_, segment) barra.textura:SetStatusBarColor (1, 1, 1, 1) --> a cor pode ser a spell school da magia barra.textura:SetValue (100) - --barra.icone:SetTexture (icone_magia) - --barra.icone:SetTexCoord (_unpack (CLASS_ICON_TCOORDS [jogador.classe])) - barra:Show() quantidade = quantidade + 1 index = index +1 @@ -1300,6 +1327,9 @@ function EncounterDetails:OpenAndRefresh (_, segment) barra = EncounterDetails:CreateRow (index, container, 3, 3, -6) barra.TTT = "total_interrupt" -- tool tip type barra.report_text = "Details! ".. Loc ["STRING_INTERRUPT_BY"] + barra:SetBackdrop (backdrop_bar_onleave) + barra:SetBackdropColor (.0, .0, .0, 0.3) + barra:SetWidth (155) end local spellid = tabela [3] @@ -1411,6 +1441,9 @@ function EncounterDetails:OpenAndRefresh (_, segment) barra = EncounterDetails:CreateRow (index, container, 3, 3, -6) barra.TTT = "dispell" -- tool tip type barra.report_text = "Details! ".. Loc ["STRING_DISPELLED_BY"] + barra:SetBackdrop (backdrop_bar_onleave) + barra:SetBackdropColor (.0, .0, .0, 0.3) + barra:SetWidth (160) end local nome_magia, _, icone_magia = _GetSpellInfo (tabela [3]) @@ -1471,6 +1504,7 @@ function EncounterDetails:OpenAndRefresh (_, segment) _detalhes:SetFontSize (barra.texto_esquerdo, 9) _detalhes:SetFontSize (barra.texto_direita, 9) _detalhes:SetFontFace (barra.texto_esquerdo, "Arial Narrow") + barra:SetWidth (160) end if (tabela [3]:find ("-")) then @@ -1530,6 +1564,7 @@ function EncounterDetails:OnEvent (_, event, ...) show_icon = 5, --automatic hide_on_combat = false, --hide the window when a new combat start max_emote_segments = 3, + opened = 0, } --> Install @@ -1549,8 +1584,6 @@ function EncounterDetails:OnEvent (_, event, ...) print (install.error) end - EncounterDetails.db = saveddata - EncounterDetails.charsaved = EncounterDetailsDB or {emotes = {}} EncounterDetailsDB = EncounterDetails.charsaved diff --git a/plugins/Details_EncounterDetails/frames.lua b/plugins/Details_EncounterDetails/frames.lua index 59ad1d4c..adac599a 100644 --- a/plugins/Details_EncounterDetails/frames.lua +++ b/plugins/Details_EncounterDetails/frames.lua @@ -31,18 +31,8 @@ do end local build_options_panel = function() - local options_frame = CreateFrame ("frame", "EncounterDetailsOptionsWindow", UIParent, "ButtonFrameTemplate") - tinsert (UISpecialFrames, "EncounterDetailsOptionsWindow") - options_frame:SetSize (500, 200) - options_frame:SetFrameStrata ("DIALOG") - options_frame:SetScript ("OnMouseDown", function(self) self:StartMoving()end) - options_frame:SetScript ("OnMouseUp", function(self) self:StopMovingOrSizing()end) - options_frame:SetMovable (true) - options_frame:EnableMouse (true) - options_frame:Hide() - options_frame:SetPoint ("center", UIParent, "center") - options_frame.TitleText:SetText ("Encounter Details Options") - options_frame.portrait:SetTexture ([[Interface\CHARACTERFRAME\TEMPORARYPORTRAIT-FEMALE-BLOODELF]]) + + local options_frame = EncounterDetails:CreatePluginOptionsFrame ("EncounterDetailsOptionsWindow", "Encounter Details Options", 2) -- 1 = only when inside a raid map -- 2 = only when in raid group @@ -87,7 +77,6 @@ do -- /dump DETAILS_PLUGIN_ENCOUNTER_DETAILS.db.show_icon local menu = { - --show when dropdown { type = "select", get = function() return EncounterDetails.db.show_icon end, @@ -208,20 +197,38 @@ do end end - local grafico_cores = {{1, 1, 1, 1}, {1, 0.5, 0.3, 1}, {0.75, 0.7, 0.1, 1}, {0.2, 0.9, 0.2, 1}, {0.2, 0.5, 0.9, 1}} --, {0.9, 0.2, 0.35, 1}, {0.85, 0.55, 0.45, 1}, {0.4, 0.98, 0.29, 1} + local grafico_cores = {{1, 1, 1, 1}, {1, 0.5, 0.3, 1}, {0.75, 0.7, 0.1, 1}, {0.2, 0.9, 0.2, 1}, {0.2, 0.5, 0.9, 1}} local lastBoss = nil + EncounterDetails.CombatsAlreadyDrew = {} + function EncounterDetails:BuildDpsGraphic() - - EncounterDetails.LastGraphicDrew = EncounterDetails.LastGraphicDrew or {} - local graphicData = _detalhes.tabela_vigente:GetTimeData ("Raid Damage Done") - if (not graphicData or not _detalhes.tabela_vigente.start_time or not _detalhes.tabela_vigente.end_time) then - return - elseif (graphicData == EncounterDetails.LastGraphicDrew) then - return + local segment = EncounterDetails._segment + + --print ("Segment:", segment) + local g + + if (not _G.DetailsRaidDpsGraph) then + EncounterDetails:CreateGraphPanel() + g = _G.DetailsRaidDpsGraph else - EncounterDetails.LastGraphicDrew = graphicData + g = _G.DetailsRaidDpsGraph + + --if (not combat.is_boss or not lastBoss or combat.is_boss.index ~= lastBoss) then + -- g.max_damage = 0 + --end + end + g:ResetData() + + local combat = EncounterDetails:GetCombat (segment) + local graphicData = combat:GetTimeData ("Raid Damage Done") + + if (not graphicData or not combat.start_time or not combat.end_time) then + EncounterDetails:Msg ("This segment doesn't have chart data.") + return + --elseif (EncounterDetails.CombatsAlreadyDrew [combat:GetCombatNumber()]) then + --return end if (graphicData.max_value == 0) then @@ -229,128 +236,66 @@ do end --> battle time - if (_detalhes.tabela_vigente.end_time - _detalhes.tabela_vigente.start_time < 12) then + if (combat.end_time - combat.start_time < 12) then return end - local g - - EncounterDetails.Frame.linhas = EncounterDetails.Frame.linhas or 0 - EncounterDetails.Frame.linhas = EncounterDetails.Frame.linhas + 1 + --EncounterDetails.Frame.linhas = EncounterDetails.Frame.linhas or 0 + EncounterDetails.Frame.linhas = 1 if (EncounterDetails.Frame.linhas > 5) then EncounterDetails.Frame.linhas = 1 end - if (not _G.DetailsRaidDpsGraph) then - g = Graphics:CreateGraphLine ("DetailsRaidDpsGraph", EncounterDetails.Frame, "topleft","topleft",20,-76,670,238) - g:SetXAxis (-1,1) - g:SetYAxis (-1,1) - g:SetGridSpacing (false, false) - g:SetGridColor ({0.5,0.5,0.5,0.3}) - g:SetAxisDrawing (false,false) - g:SetAxisColor({1.0,1.0,1.0,1.0}) - g:SetAutoScale (true) - g:SetLineTexture ("smallline") - g:SetBorderSize ("right", 0.001) - g.VerticalLines = {} - g.TryIndicator = {} - - function g:ChangeColorOnDataSeries (index, color) - self.Data [index].Color = color - self.NeedsUpdate=true - end - - function g:AddDataSeriesOnFirstIndex (points, color, n2) - local data - --Make sure there is data points - if not points then - return - end - data=points - if n2==nil then - n2=false + + g.max_damage = 0 + + for _, line in ipairs (g.VerticalLines) do + line:Hide() + end + + lastBoss = combat.is_boss and combat.is_boss.index + + -- + for i = segment + 4, segment+1, -1 do + local combat = EncounterDetails:GetCombat (i) + if (combat) then --the combat exists + local elapsed_time = combat:GetCombatTime() + + if (EncounterDetails.debugmode and not combat.is_boss) then + combat.is_boss = { + index = 1, + name = _detalhes:GetBossName (1098, 1), + zone = "Throne of Thunder", + mapid = 1098, + encounter = "Jin'Rohk the Breaker" + } end - if n2 or (table.getn(points)==2 and table.getn(points[1])~=2) then - data={} - for k,v in ipairs(points[1]) do - tinsert(data,{v,points[2][k]}) + + if (elapsed_time > 12 and combat.is_boss and combat.is_boss.index == lastBoss) then --is the same boss + + local chart_data = combat:GetTimeData ("Raid Damage Done") + if (chart_data and chart_data.max_value and chart_data.max_value > 0) then --have a chart data + --if (not EncounterDetails.CombatsAlreadyDrew [combat:GetCombatNumber()]) then --isn't drew yet + EncounterDetails:DrawSegmentGraphic (g, chart_data, combat) + --EncounterDetails.CombatsAlreadyDrew [combat:GetCombatNumber()] = true + --end end end - - table.insert (self.Data, 1, {Points=data;Color=color}) - - self.NeedsUpdate=true - end - - DetailsFrameWork:NewLabel (EncounterDetails.Frame, EncounterDetails.Frame, nil, "timeamt0", "00:00", "GameFontHighlightSmall") - EncounterDetails.Frame["timeamt0"]:SetPoint ("TOPLEFT", EncounterDetails.Frame, "TOPLEFT", 85, -300) - - for i = 1, 8, 1 do - - local line = g:CreateTexture (nil, "overlay") - line:SetTexture (.5, .5, .5, .7) - line:SetWidth (670) - line:SetHeight (1) - line:SetVertexColor (.4, .4, .4, .8) - - DetailsFrameWork:NewLabel (EncounterDetails.Frame, EncounterDetails.Frame, nil, "dpsamt"..i, "", "GameFontHighlightSmall") - EncounterDetails.Frame["dpsamt"..i]:SetPoint ("TOPLEFT", EncounterDetails.Frame, "TOPLEFT", 27, -61 + (-(24.6*i))) - line:SetPoint ("topleft", EncounterDetails.Frame["dpsamt"..i].widget, "bottom", -27, 0) - - DetailsFrameWork:NewLabel (EncounterDetails.Frame, EncounterDetails.Frame, nil, "timeamt"..i, "", "GameFontHighlightSmall") - EncounterDetails.Frame["timeamt"..i].widget:SetPoint ("TOPLEFT", EncounterDetails.Frame, "TOPLEFT", 75+(73*i), -300) - end - - g.max_time = 0 - g.max_damage = 0 - - EncounterDetails.MaxGraphics = EncounterDetails.MaxGraphics or 5 - - for i = 1, EncounterDetails.MaxGraphics do - local texture = g:CreateTexture (nil, "overlay") - texture:SetWidth (9) - texture:SetHeight (9) - texture:SetPoint ("TOPLEFT", EncounterDetails.Frame, "TOPLEFT", (i*65) + 299, -81) - texture:SetTexture (unpack (grafico_cores[i])) - local text = g:CreateFontString (nil, "OVERLAY", "GameFontHighlightSmall") - text:SetPoint ("LEFT", texture, "right", 2, 0) - text:SetJustifyH ("LEFT") - if (i == 1) then - text:SetText (Loc ["STRING_CURRENT"]) - else - text:SetText (Loc ["STRING_TRY"] .. " #" .. i) - end - --texture:Hide() - g.TryIndicator [#g.TryIndicator+1] = {texture = texture, text = text} - end - - local v = g:CreateTexture (nil, "overlay") - v:SetWidth (1) - v:SetHeight (238) - v:SetPoint ("top", g, "top", 0, 1) - v:SetPoint ("left", g, "left", 55, 0) - v:SetTexture (1, 1, 1, 1) - - local h = g:CreateTexture (nil, "overlay") - h:SetWidth (668) - h:SetHeight (2) - h:SetPoint ("top", g, "top", 0, -217) - h:SetPoint ("left", g, "left") - h:SetTexture (1, 1, 1, 1) - - else - g = _G.DetailsRaidDpsGraph - - if (not _detalhes.tabela_vigente.is_boss or not lastBoss or _detalhes.tabela_vigente.is_boss.index ~= lastBoss) then - g:ResetData() - g.max_damage = 0 end end + -- - lastBoss = _detalhes.tabela_vigente.is_boss and _detalhes.tabela_vigente.is_boss.index + EncounterDetails:DrawSegmentGraphic (g, graphicData, combat, combat) + EncounterDetails.CombatsAlreadyDrew [combat:GetCombatNumber()] = true + g:Show() + + end + + function EncounterDetails:DrawSegmentGraphic (g, graphicData, combat, drawDeathsCombat) + local _data = {} local dps_max = graphicData.max_value local amount = #graphicData @@ -358,10 +303,11 @@ do local scaleW = 1/670 local content = graphicData - table.insert (content, 1, 0) - table.insert (content, 1, 0) - table.insert (content, #content+1, 0) - table.insert (content, #content+1, 0) + tinsert (content, 1, 0) + tinsert (content, 1, 0) + tinsert (content, #content+1, 0) + tinsert (content, #content+1, 0) + local _i = 3 local graphMaxDps = math.max (g.max_damage, dps_max) @@ -370,12 +316,13 @@ do _data [#_data+1] = {scaleW*(_i-2), v/graphMaxDps} --> x and y coords _i = _i + 1 end + + tremove (content, 1) + tremove (content, 1) + tremove (content, #graphicData) + tremove (content, #graphicData) ---[[ precisa de uma proteção contra troca de tabela, no inicio dos trash -Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: - attempt to perform arithmetic on field 'end_time' (a nil value)--]] - - local tempo = _detalhes.tabela_vigente.end_time - _detalhes.tabela_vigente.start_time + local tempo = combat.end_time - combat.start_time if (g.max_time < tempo) then g.max_time = tempo @@ -394,20 +341,14 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: end end - --print ("DPSMAX: " .. dps_max .. " > " .. g.max_damage) - if (dps_max > g.max_damage) then --> normalize previous data - - --table.insert (self.Data, 1, {Points=data;Color=color}) - if (g.max_damage > 0) then local normalizePercent = g.max_damage / dps_max for dataIndex, Data in ipairs (g.Data) do local Points = Data.Points for i = 1, #Points do - --print (Points[i][1], Points[i][2]) Points[i][2] = Points[i][2]*normalizePercent end end @@ -435,102 +376,197 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: for i = 2, #g.Data do g:ChangeColorOnDataSeries (i, grafico_cores [i]) end - - local mortes = _detalhes.tabela_vigente.last_events_tables - local scaleG = 650/_detalhes.tabela_vigente:GetCombatTime() - - for _, row in _ipairs (g.VerticalLines) do - row:Hide() - end - - for i = 1, math.min (3, #mortes) do - - local vRowFrame = g.VerticalLines [i] - local deadTime = mortes [i][2] - _detalhes.tabela_vigente.start_time + + if (drawDeathsCombat) then + local mortes = drawDeathsCombat.last_events_tables + --local scaleG = 650/_detalhes.tabela_vigente:GetCombatTime() + local scaleG = 610/drawDeathsCombat:GetCombatTime() - if (not vRowFrame) then - - vRowFrame = CreateFrame ("frame", "DetailsEncountersVerticalLine"..i, g) - vRowFrame:SetWidth (20) - vRowFrame:SetHeight (43) - vRowFrame:SetFrameLevel (g:GetFrameLevel()+2) - - vRowFrame:SetScript ("OnEnter", function (frame) - - if (vRowFrame.dead[1] and vRowFrame.dead[1][3] and vRowFrame.dead[1][3][2]) then - local nome_magia3, _, icone_magia3 = _GetSpellInfo (vRowFrame.dead[1][3][2]) - if (type (vRowFrame.dead[1][3][3]) == "number") then - nome_magia3 = _detalhes:comma_value (vRowFrame.dead[1][3][3]).." "..nome_magia3 - end - - local nome_magia2, _, icone_magia2 = _GetSpellInfo (vRowFrame.dead[1][2][2]) - if (type (vRowFrame.dead[1][2][3]) == "number") then - nome_magia2 = _detalhes:comma_value (vRowFrame.dead[1][2][3]).." "..nome_magia2 - end - - local nome_magia1, _, icone_magia1 = _GetSpellInfo (vRowFrame.dead[1][1][2]) - if (type (vRowFrame.dead[1][1][3]) == "number") then - nome_magia1 = _detalhes:comma_value (vRowFrame.dead[1][1][3]).." "..nome_magia1 - else --bress - local decorrido = vRowFrame.dead[1][1][4] - _detalhes.tabela_vigente.start_time - local minutos, segundos = _math_floor (decorrido/60), _math_floor (decorrido%60) - nome_magia1 = minutos..":"..segundos.." "..nome_magia1 - end - - GameCooltip:Reset() - - GameCooltip:AddLine (vRowFrame.dead[6].." "..vRowFrame.dead[3]) - GameCooltip:AddIcon ("Interface\\AddOns\\Details_EncounterDetails\\images\\small_icons", _,_,_,_, .75, 1, 0, 1) - - GameCooltip:AddLine (nome_magia3) - GameCooltip:AddIcon (icone_magia3) - - GameCooltip:AddLine (nome_magia2) - GameCooltip:AddIcon (icone_magia1) - - GameCooltip:AddLine (nome_magia1) - GameCooltip:AddIcon (icone_magia1) - - GameCooltip:SetOption ("TextSize", 9.5) - GameCooltip:SetOption ("IconSize", 12) - GameCooltip:SetOption ("HeightAnchorMod", -15) - - GameCooltip:ShowCooltip (frame, "tooltip") - end - end) - - vRowFrame:SetScript ("OnLeave", function (frame) - _detalhes.popup:ShowMe (false) - end) - - vRowFrame.texture = vRowFrame:CreateTexture (nil, "overlay") - vRowFrame.texture:SetTexture ("Interface\\AddOns\\Details\\images\\verticalline") - vRowFrame.texture:SetWidth (3) - vRowFrame.texture:SetHeight (20) - vRowFrame.texture:SetPoint ("center", "DetailsEncountersVerticalLine"..i, "center") - vRowFrame.texture:SetPoint ("bottom", "DetailsEncountersVerticalLine"..i, "bottom", 0, 0) - vRowFrame.texture:SetVertexColor (1, 1, 1, .5) - - vRowFrame.icon = vRowFrame:CreateTexture (nil, "overlay") - vRowFrame.icon:SetTexture ("Interface\\WorldStateFrame\\SkullBones") - vRowFrame.icon:SetTexCoord (0.046875, 0.453125, 0.046875, 0.46875) - vRowFrame.icon:SetWidth (16) - vRowFrame.icon:SetHeight (16) - vRowFrame.icon:SetPoint ("center", "DetailsEncountersVerticalLine"..i, "center") - vRowFrame.icon:SetPoint ("bottom", "DetailsEncountersVerticalLine"..i, "bottom", 0, 20) - - g.VerticalLines [i] = vRowFrame + for _, row in _ipairs (g.VerticalLines) do + row:Hide() end - vRowFrame:SetPoint ("topleft", EncounterDetails.Frame, "topleft", (deadTime*scaleG), -268) - vRowFrame.dead = mortes [i] - vRowFrame:Show() + for i = 1, math.min (3, #mortes) do + local vRowFrame = g.VerticalLines [i] + + if (not vRowFrame) then + + vRowFrame = CreateFrame ("frame", "DetailsEncountersVerticalLine"..i, g) + vRowFrame:SetWidth (20) + vRowFrame:SetHeight (43) + vRowFrame:SetFrameLevel (g:GetFrameLevel()+2) + + vRowFrame:SetScript ("OnEnter", function (frame) + + if (vRowFrame.dead[1] and vRowFrame.dead[1][3] and vRowFrame.dead[1][3][2]) then + + GameCooltip:Reset() + + --time of death and player name + GameCooltip:AddLine (vRowFrame.dead[6].." "..vRowFrame.dead[3]) + local class, l, r, t, b = _detalhes:GetClass (vRowFrame.dead[3]) + if (class) then + GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small]], 1, 1, 12, 12, l, r, t, b) + end + GameCooltip:AddLine ("") + + --last hits: + local death = vRowFrame.dead + local amt = 0 + for i = #death[1], 1, -1 do + local this_hit = death[1][i] + if (type (this_hit[1]) == "boolean" and this_hit[1]) then + local spellname, _, spellicon = _GetSpellInfo (this_hit[2]) + local t = death [2] - this_hit [4] + GameCooltip:AddLine ("-" .. _cstr ("%.1f", t) .. " " .. spellname .. " (" .. this_hit[6] .. ")", EncounterDetails:comma_value (this_hit [3])) + GameCooltip:AddIcon (spellicon, 1, 1, 12, 12, 0.1, 0.9, 0.1, 0.9) + amt = amt + 1 + if (amt == 3) then + break + end + end + end + + GameCooltip:SetOption ("TextSize", 9.5) + GameCooltip:SetOption ("HeightAnchorMod", -15) + + GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0, 0.64453125}, {1, 1, 1, 0.1}, true) + GameCooltip:ShowCooltip (frame, "tooltip") + end + end) + + vRowFrame:SetScript ("OnLeave", function (frame) + _detalhes.popup:ShowMe (false) + end) + + vRowFrame.texture = vRowFrame:CreateTexture (nil, "overlay") + vRowFrame.texture:SetTexture ("Interface\\AddOns\\Details\\images\\verticalline") + vRowFrame.texture:SetWidth (3) + vRowFrame.texture:SetHeight (20) + vRowFrame.texture:SetPoint ("center", "DetailsEncountersVerticalLine"..i, "center") + vRowFrame.texture:SetPoint ("bottom", "DetailsEncountersVerticalLine"..i, "bottom", 0, 0) + vRowFrame.texture:SetVertexColor (1, 1, 1, .5) + + vRowFrame.icon = vRowFrame:CreateTexture (nil, "overlay") + vRowFrame.icon:SetTexture ("Interface\\WorldStateFrame\\SkullBones") + vRowFrame.icon:SetTexCoord (0.046875, 0.453125, 0.046875, 0.46875) + vRowFrame.icon:SetWidth (16) + vRowFrame.icon:SetHeight (16) + vRowFrame.icon:SetPoint ("center", "DetailsEncountersVerticalLine"..i, "center") + vRowFrame.icon:SetPoint ("bottom", "DetailsEncountersVerticalLine"..i, "bottom", 0, 20) + + g.VerticalLines [i] = vRowFrame + end + + local deadTime = mortes [i].dead_at + --print (deadTime, mortes [i][3]) + vRowFrame:SetPoint ("topleft", EncounterDetails.Frame, "topleft", (deadTime*scaleG)+70, -268) + vRowFrame.dead = mortes [i] + vRowFrame:Show() + + end + end + end + + function EncounterDetails:CreateGraphPanel() + local g = Graphics:CreateGraphLine ("DetailsRaidDpsGraph", EncounterDetails.Frame, "topleft","topleft",20,-76,670,238) + g:SetXAxis (-1,1) + g:SetYAxis (-1,1) + g:SetGridSpacing (false, false) + g:SetGridColor ({0.5,0.5,0.5,0.3}) + g:SetAxisDrawing (false,false) + g:SetAxisColor({1.0,1.0,1.0,1.0}) + g:SetAutoScale (true) + g:SetLineTexture ("smallline") + g:SetBorderSize ("right", 0.001) + g.VerticalLines = {} + g.TryIndicator = {} + + function g:ChangeColorOnDataSeries (index, color) + self.Data [index].Color = color + self.NeedsUpdate=true end - _G.DetailsRaidDpsGraph:Show() + function g:AddDataSeriesOnFirstIndex (points, color, n2) + local data + --Make sure there is data points + if not points then + return + end + + data=points + if n2==nil then + n2=false + end + if n2 or (table.getn(points)==2 and table.getn(points[1])~=2) then + data={} + for k,v in ipairs(points[1]) do + tinsert(data,{v,points[2][k]}) + end + end + + table.insert (self.Data, 1, {Points=data;Color=color}) + + self.NeedsUpdate=true + end + + DetailsFrameWork:NewLabel (EncounterDetails.Frame, EncounterDetails.Frame, nil, "timeamt0", "00:00", "GameFontHighlightSmall") + EncounterDetails.Frame["timeamt0"]:SetPoint ("TOPLEFT", EncounterDetails.Frame, "TOPLEFT", 85, -300) - end + for i = 1, 8, 1 do + + local line = g:CreateTexture (nil, "overlay") + line:SetTexture (.5, .5, .5, .7) + line:SetWidth (670) + line:SetHeight (1) + line:SetVertexColor (.4, .4, .4, .8) + + DetailsFrameWork:NewLabel (EncounterDetails.Frame, EncounterDetails.Frame, nil, "dpsamt"..i, "", "GameFontHighlightSmall") + EncounterDetails.Frame["dpsamt"..i]:SetPoint ("TOPLEFT", EncounterDetails.Frame, "TOPLEFT", 27, -61 + (-(24.6*i))) + line:SetPoint ("topleft", EncounterDetails.Frame["dpsamt"..i].widget, "bottom", -27, 0) + + DetailsFrameWork:NewLabel (EncounterDetails.Frame, EncounterDetails.Frame, nil, "timeamt"..i, "", "GameFontHighlightSmall") + EncounterDetails.Frame["timeamt"..i].widget:SetPoint ("TOPLEFT", EncounterDetails.Frame, "TOPLEFT", 75+(73*i), -300) + end + + g.max_time = 0 + g.max_damage = 0 + + EncounterDetails.MaxGraphics = EncounterDetails.MaxGraphics or 5 + + for i = 1, EncounterDetails.MaxGraphics do + local texture = g:CreateTexture (nil, "overlay") + texture:SetWidth (9) + texture:SetHeight (9) + texture:SetPoint ("TOPLEFT", EncounterDetails.Frame, "TOPLEFT", (i*65) + 299, -81) + texture:SetTexture (unpack (grafico_cores[i])) + local text = g:CreateFontString (nil, "OVERLAY", "GameFontHighlightSmall") + text:SetPoint ("LEFT", texture, "right", 2, 0) + text:SetJustifyH ("LEFT") + if (i == 1) then + text:SetText (Loc ["STRING_CURRENT"]) + else + text:SetText (Loc ["STRING_TRY"] .. " #" .. i) + end + --texture:Hide() + g.TryIndicator [#g.TryIndicator+1] = {texture = texture, text = text} + end + + local v = g:CreateTexture (nil, "overlay") + v:SetWidth (1) + v:SetHeight (238) + v:SetPoint ("top", g, "top", 0, 1) + v:SetPoint ("left", g, "left", 55, 0) + v:SetTexture (1, 1, 1, 1) + + local h = g:CreateTexture (nil, "overlay") + h:SetWidth (668) + h:SetHeight (2) + h:SetPoint ("top", g, "top", 0, -217) + h:SetPoint ("left", g, "left") + h:SetTexture (1, 1, 1, 1) + end local BossFrame = EncounterDetails.Frame @@ -565,6 +601,8 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: if (botao == "LeftButton") then self:StartMoving() self.isMoving = true + elseif (botao == "RightButton" and not self.isMoving) then + EncounterDetails:CloseWindow() end end) @@ -735,7 +773,8 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: widget:Hide() end - BossFrame.segmentosDropdown:Disable() + BossFrame.segmentosDropdown:Enable() + --BossFrame.segmentosDropdown:Disable() end end @@ -809,7 +848,11 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: --tooltips BossFrame.buttonSwitchNormal.MouseOnEnterHook = function() GameCooltip:Reset() - GameCooltip:AddLine (Loc ["STRING_FIGHT_SUMMARY"]) + --GameCooltip:AddLine (Loc ["STRING_FIGHT_SUMMARY"]) + GameCooltip:AddLine (Loc ["STRING_FIGHT_SUMMARY"], nil, nil, "orange", nil, 12) + --GameCooltip:AddIcon ("Interface\\AddOns\\Details_EncounterDetails\\images\\boss_frame_buttons", 1, 1, 16, 16, 0, 0.1015625, 0, 0.515625) + + GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0, 0.64453125}, {1, 1, 1, 0.1}, true) GameCooltip:ShowCooltip (BossFrame.buttonSwitchNormal, "tooltip") t:SetBlendMode ("ADD") end @@ -817,7 +860,10 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: -- BossFrame.buttonSwitchGraphic.MouseOnEnterHook = function() GameCooltip:Reset() - GameCooltip:AddLine (Loc ["STRING_FIGHT_GRAPHIC"]) + GameCooltip:AddLine (Loc ["STRING_FIGHT_GRAPHIC"], nil, nil, "orange", nil, 12) + --GameCooltip:AddIcon ("Interface\\AddOns\\Details_EncounterDetails\\images\\boss_frame_buttons", 1, 1, 16, 16, 0.1171875, 0.21875, 0, 0.515625) + + GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0, 0.64453125}, {1, 1, 1, 0.1}, true) GameCooltip:ShowCooltip (BossFrame.buttonSwitchGraphic, "tooltip") g:SetBlendMode ("ADD") end @@ -825,7 +871,10 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: -- BossFrame.buttonSwitchBossEmotes:SetHook ("OnEnter", function() GameCooltip:Reset() - GameCooltip:AddLine ("boss emotes") + GameCooltip:AddLine ("boss emotes", nil, nil, "orange", nil, 12) + --GameCooltip:AddIcon ("Interface\\AddOns\\Details_EncounterDetails\\images\\boss_frame_buttons", 1, 1, 16, 16, 90/256, 116/256, 0, 0.515625) + + GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0, 0.64453125}, {1, 1, 1, 0.1}, true) GameCooltip:ShowCooltip (BossFrame.buttonSwitchBossEmotes, "tooltip") e:SetBlendMode ("ADD") end) @@ -1278,10 +1327,12 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: mouseOver_adds_frame:SetScript ("OnEnter", function() - _G.DetailsBubble:SetOwner (mouseOver_adds_frame.imagem, nil, nil, -45, -22) - _G.DetailsBubble:FlipHorizontal() - _G.DetailsBubble:SetBubbleText (Loc ["STRING_ADDS_HELP"]) - _G.DetailsBubble:ShowBubble() + if (EncounterDetails.db.opened < 30) then + _G.DetailsBubble:SetOwner (mouseOver_adds_frame.imagem, nil, nil, -45, -22) + _G.DetailsBubble:FlipHorizontal() + _G.DetailsBubble:SetBubbleText (Loc ["STRING_ADDS_HELP"]) + _G.DetailsBubble:ShowBubble() + end mouseOver_adds_frame.imagem:SetTexCoord (0.7734375, 0.99609375, 0.03125, 0.3671875) end) mouseOver_adds_frame:SetScript ("OnLeave", @@ -1305,16 +1356,16 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: --container_adds_window:SetBackdropColor (0, 0, 0, 0.1) container_adds_frame:SetAllPoints (container_adds_window) - container_adds_frame:SetWidth (170) + container_adds_frame:SetWidth (175) container_adds_frame:SetHeight (67) container_adds_frame:EnableMouse (true) container_adds_frame:SetResizable (false) container_adds_frame:SetMovable (true) - container_adds_window:SetWidth (170) + container_adds_window:SetWidth (175) container_adds_window:SetHeight (65) container_adds_window:SetScrollChild (container_adds_frame) - container_adds_window:SetPoint ("TOPLEFT", frame, "TOPLEFT", 260, -113) + container_adds_window:SetPoint ("TOPLEFT", frame, "TOPLEFT", 255, -113) DetailsFrameWork:NewLabel (container_adds_window, container_adds_window, nil, "titulo", Loc ["STRING_ADDS"], "QuestFont_Large", 16, {1, 1, 1}) container_adds_window.titulo:SetPoint ("bottomleft", container_adds_window, "topleft", 0, 4) @@ -1355,10 +1406,11 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: mouseOver_interrupt_frame:SetScript ("OnEnter", function() - _G.DetailsBubble:SetOwner (mouseOver_interrupt_frame.imagem, nil, nil, 40, -18) - --_G.DetailsBubble:FlipHorizontal() - _G.DetailsBubble:SetBubbleText (Loc ["STRING_INTERRIPT_HELP"]) - _G.DetailsBubble:ShowBubble() + if (EncounterDetails.db.opened < 30) then + _G.DetailsBubble:SetOwner (mouseOver_interrupt_frame.imagem, nil, nil, 40, -18) + _G.DetailsBubble:SetBubbleText (Loc ["STRING_INTERRIPT_HELP"]) + _G.DetailsBubble:ShowBubble() + end mouseOver_interrupt_frame.imagem:SetTexCoord (0.6015625, 1, 0.4296875, 0.6953125) end) mouseOver_interrupt_frame:SetScript ("OnLeave", @@ -1374,29 +1426,22 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: container_interrupt_frame.barras = {} - --container_interrupt_window:SetBackdrop({edgeFile = "Interface\\DialogFrame\\UI-DialogBox-gold-Border", tile = true, tileSize = 16, edgeSize = 5, insets = {left = 1, right = 1, top = 0, bottom = 1},}) - --container_interrupt_window:SetBackdropBorderColor (0,0,0,0) - - --container_interrupt_window:SetBackdrop (gump_fundo_backdrop) - --container_interrupt_window:SetBackdropBorderColor (1, 1, 1, 1) - --container_interrupt_window:SetBackdropColor (0, 0, 0, 0.1) - container_interrupt_frame:SetAllPoints (container_interrupt_window) - container_interrupt_frame:SetWidth (170) + container_interrupt_frame:SetWidth (185) container_interrupt_frame:SetHeight (67) container_interrupt_frame:EnableMouse (true) container_interrupt_frame:SetResizable (false) container_interrupt_frame:SetMovable (true) - container_interrupt_window:SetWidth (170) + container_interrupt_window:SetWidth (185) container_interrupt_window:SetHeight (65) container_interrupt_window:SetScrollChild (container_interrupt_frame) - container_interrupt_window:SetPoint ("TOPLEFT", frame, "TOPLEFT", 480, -113) + container_interrupt_window:SetPoint ("TOPLEFT", frame, "TOPLEFT", 470, -113) DetailsFrameWork:NewLabel (container_interrupt_window, container_interrupt_window, nil, "titulo", Loc ["STRING_INTERRUPTS"], "QuestFont_Large", 16, {1, 1, 1}) container_interrupt_window.titulo:SetPoint ("bottomleft", container_interrupt_window, "topleft", 0, 4) - DetailsFrameWork:NewScrollBar (container_interrupt_window, container_interrupt_frame, 4, -13) + DetailsFrameWork:NewScrollBar (container_interrupt_window, container_interrupt_frame, -1, -13) container_interrupt_window.slider:Altura (45) container_interrupt_window.slider:cimaPoint (0, 1) container_interrupt_window.slider:baixoPoint (0, -1) @@ -1432,10 +1477,12 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: mouseOver_dispell_frame:SetScript ("OnEnter", function() - _G.DetailsBubble:SetOwner (mouseOver_dispell_frame.imagem, nil, nil, -45, -22) - _G.DetailsBubble:FlipHorizontal() - _G.DetailsBubble:SetBubbleText (Loc ["STRING_DISPELL_HELP"]) - _G.DetailsBubble:ShowBubble() + if (EncounterDetails.db.opened < 30) then + _G.DetailsBubble:SetOwner (mouseOver_dispell_frame.imagem, nil, nil, -45, -22) + _G.DetailsBubble:FlipHorizontal() + _G.DetailsBubble:SetBubbleText (Loc ["STRING_DISPELL_HELP"]) + _G.DetailsBubble:ShowBubble() + end mouseOver_dispell_frame.imagem:SetTexCoord (0.1796875, 0.3359375, 0.4140625, 0.71875) end) mouseOver_dispell_frame:SetScript ("OnLeave", @@ -1451,29 +1498,22 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: container_dispell_frame.barras = {} - --container_dispell_window:SetBackdrop (backdrop) - --container_dispell_window:SetBackdropBorderColor (0,0,0,0) - - --container_dispell_window:SetBackdrop (gump_fundo_backdrop) - --container_dispell_window:SetBackdropBorderColor (1, 1, 1, 1) - --container_dispell_window:SetBackdropColor (0, 0, 0, 0.1) - container_dispell_frame:SetAllPoints (container_dispell_window) - container_dispell_frame:SetWidth (170) + container_dispell_frame:SetWidth (190) container_dispell_frame:SetHeight (62) container_dispell_frame:EnableMouse (true) container_dispell_frame:SetResizable (false) container_dispell_frame:SetMovable (true) - container_dispell_window:SetWidth (170) + container_dispell_window:SetWidth (190) container_dispell_window:SetHeight (68) container_dispell_window:SetScrollChild (container_dispell_frame) - container_dispell_window:SetPoint ("TOPLEFT", frame, "TOPLEFT", 260, -231) + container_dispell_window:SetPoint ("TOPLEFT", frame, "TOPLEFT", 245, -231) DetailsFrameWork:NewLabel (container_dispell_window, container_dispell_window, nil, "titulo", Loc ["STRING_DISPELLS"], "QuestFont_Large", 16, {1, 1, 1}) container_dispell_window.titulo:SetPoint ("bottomleft", container_dispell_window, "topleft", 0, 4) - DetailsFrameWork:NewScrollBar (container_dispell_window, container_dispell_frame, 4, -13) + DetailsFrameWork:NewScrollBar (container_dispell_window, container_dispell_frame, -1, -13) container_dispell_window.slider:Altura (45) container_dispell_window.slider:cimaPoint (0, 1) container_dispell_window.slider:baixoPoint (0, -1) @@ -1483,8 +1523,7 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: container_dispell_frame.window = container_dispell_window container_dispell_window.ultimo = 0 frame.overall_dispell = container_dispell_window - - + --> Caixa das mortes local container_dead_window = CreateFrame ("ScrollFrame", "Details_Boss_ContainerDead", frame) @@ -1510,10 +1549,11 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: mouseOver_dead_frame:SetScript ("OnEnter", function() - _G.DetailsBubble:SetOwner (mouseOver_dead_frame.imagem, nil, nil, 40, -18) - --_G.DetailsBubble:FlipHorizontal() - _G.DetailsBubble:SetBubbleText (Loc ["STRING_DEATHS_HELP"]) - _G.DetailsBubble:ShowBubble() + if (EncounterDetails.db.opened < 30) then + _G.DetailsBubble:SetOwner (mouseOver_dead_frame.imagem, nil, nil, 40, -18) + _G.DetailsBubble:SetBubbleText (Loc ["STRING_DEATHS_HELP"]) + _G.DetailsBubble:ShowBubble() + end mouseOver_dead_frame.imagem:SetTexCoord (0.171875, 0.3359375, 0.03125, 0.34375) end) mouseOver_dead_frame:SetScript ("OnLeave", @@ -1528,31 +1568,23 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: mouseOver_dead_frame:SetScript ("OnMouseUp", mouse_up) container_dead_frame.barras = {} - - --container_dead_window:SetBackdrop({edgeFile = "Interface\\DialogFrame\\UI-DialogBox-gold-Border", tile = true, tileSize = 16, edgeSize = 5, insets = {left = 1, right = 1, top = 0, bottom = 1},}) - --container_dead_window:SetBackdropBorderColor (0,0,0,0) - - --container_dead_window:SetBackdrop (gump_fundo_backdrop) - --container_dead_window:SetBackdropBorderColor (1, 1, 1, 1) - --container_dead_window:SetBackdropColor (0, 0, 0, 0.1) - - --container_dead_frame:SetAllPoints (container_dead_window) + container_dead_frame:SetPoint ("left", container_dead_window, "left") container_dead_frame:SetPoint ("right", container_dead_window, "right") container_dead_frame:SetPoint ("top", container_dead_window, "top") container_dead_frame:SetPoint ("bottom", container_dead_window, "bottom", 0, 10) - container_dead_frame:SetWidth (170) + container_dead_frame:SetWidth (178) container_dead_frame:SetHeight (60) container_dead_frame:EnableMouse (true) container_dead_frame:SetResizable (false) container_dead_frame:SetMovable (true) - container_dead_window:SetWidth (170) + container_dead_window:SetWidth (178) container_dead_window:SetHeight (70) container_dead_window:SetScrollChild (container_dead_frame) - container_dead_window:SetPoint ("TOPLEFT", frame, "TOPLEFT", 480, -235) + container_dead_window:SetPoint ("TOPLEFT", frame, "TOPLEFT", 472, -235) DetailsFrameWork:NewLabel (container_dead_window, container_dead_window, nil, "titulo", Loc ["STRING_DEATH_LOG"], "QuestFont_Large", 16, {1, 1, 1}) container_dead_window.titulo:SetPoint ("bottomleft", container_dead_window, "topleft", 0, 3) diff --git a/plugins/Details_RaidInfo-SiegeOfOrgrimmar/SiegeOfOrgrimmar.lua b/plugins/Details_RaidInfo-SiegeOfOrgrimmar/SiegeOfOrgrimmar.lua index 25de99af..1898f460 100644 --- a/plugins/Details_RaidInfo-SiegeOfOrgrimmar/SiegeOfOrgrimmar.lua +++ b/plugins/Details_RaidInfo-SiegeOfOrgrimmar/SiegeOfOrgrimmar.lua @@ -20,8 +20,8 @@ local siege_of_orgrimmar = { icon = "Interface\\AddOns\\Details_RaidInfo-SiegeOfOrgrimmar\\images\\icon256x128", is_raid = true, - - background = "Interface\\AddOns\\Details_RaidInfo-SiegeOfOrgrimmar\\images\\wallpaper", + + backgroundFile = {file = [[Interface\Glues\LOADINGSCREENS\LoadScreenSiegeOfOrgrimmar]], coords = {0, 1, 256/1024, 840/1024}}, backgroundEJ = [[Interface\EncounterJournal\UI-EJ-LOREBG-SiegeofOrgrimmar]], boss_names = { diff --git a/plugins/Details_RaidInfo-SiegeOfOrgrimmar/images/wallpaper.tga b/plugins/Details_RaidInfo-SiegeOfOrgrimmar/images/wallpaper.tga deleted file mode 100644 index 59d88d23dbd21c442f1906f051bbead8e5b68693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476923 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 diff --git a/plugins/Details_RaidInfo-ThroneOfThunder/ThroneOfThunder.lua b/plugins/Details_RaidInfo-ThroneOfThunder/ThroneOfThunder.lua index c1c0baab..31b80de1 100644 --- a/plugins/Details_RaidInfo-ThroneOfThunder/ThroneOfThunder.lua +++ b/plugins/Details_RaidInfo-ThroneOfThunder/ThroneOfThunder.lua @@ -21,7 +21,7 @@ local throne_of_thunder = { is_raid = true, - background = "Interface\\AddOns\\Details_RaidInfo-ThroneOfThunder\\images\\raid_tot", + backgroundFile = {file = [[Interface\Glues\LOADINGSCREENS\LoadscreenThunderkingRaid]], coords = {0, 1, 256/1024, 840/1024}}, backgroundEJ = [[Interface\EncounterJournal\UI-EJ-LOREBG-ThunderKingRaid]], boss_names = { diff --git a/plugins/Details_RaidInfo-ThroneOfThunder/images/raid_tot.tga b/plugins/Details_RaidInfo-ThroneOfThunder/images/raid_tot.tga deleted file mode 100644 index 746815896c11e847b66ed9487878e8e6533b8d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450283 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 z z>+u;Jq@&#=zfbL6Cx9OQ;Q$-l)|%jzQSKT5Uq@MY@aYE1KT+m;C6KDINEBRQQE&BN zwh>Oh&+6kW`tH7Rw#NQ23met(Yo0!1$yFQ52hlUeP*UR>?a(LLQIlRtNUnEEgJ&?P zW9S|s=}oTgK#g3=OmarrT_3HvQt!o1l^99tx2y5CSZmW|QSPU3%OW>Ew%?Zc1;`gL zzfl6Tq`WOUUdm*w-+Uz~wBEsiy v@%0h5JG{W-?4!He3O2X-`}cqQkKh02AO84 Main Plugin Object -local SpellDetails = _detalhes:NewPluginObject ("Details_SpellDetails") ---> Main Frame -local SpellDetailsFrame = SpellDetails.Frame - ---> Needed locals -local _GetTime = GetTime --> wow api local -local _UFC = UnitAffectingCombat --> wow api local -local _IsInRaid = IsInRaid --> wow api local -local _IsInGroup = IsInGroup --> wow api local -local _UnitAura = UnitAura --> wow api local -local _CreateFrame = CreateFrame --> wow api local -local _ipairs = ipairs --> lua library local -local _pairs = pairs --> lua library local -local _string_len = string.len --> lua library local -local _math_floor = math.floor --> lua library local -local _cstr = string.format --> lua library local -local _string_format = string.format -local _table_sort = table.sort -local _tostring = tostring -local _GetSpellInfo =_detalhes.getspellinfo --> details spell cache -local _string_lower = string.lower -local _string_sub = string.sub - ---> this function will run when the plugin receives the Addon_Loaded event, ["data"] = previus saved player rank -local function CreatePluginFrames (data) - - --> catch Details! main object - local _detalhes = _G._detalhes - local DetailsFrameWork = _detalhes.gump - - if (not _detalhes) then - --> details isn't active - return - end - - --> Saved Data - SpellDetails.data = data or {} - SpellDetails.updating = false - - local player_damage_done = function (support_table, time_table, tick_second) - - local player = _detalhes.tabela_vigente (1, _detalhes.playername) - - if (player) then - - local total_damage = player.total - - local current_damage = total_damage - support_table.last_damage - - time_table [tick_second] = current_damage - - if (current_damage > support_table.max_damage) then - support_table.max_damage = current_damage - time_table.max_damage = current_damage - end - - support_table.last_damage = total_damage - - else - time_table [tick_second] = 0 - end - - end - - local string_player_damage_done = [[ - - -- the goal of this script is get the current combat then get your character and extract your damage done. - -- the first thing to do is get the combat, so, we use here the command "_detalhes:GetCombat ( "overall" "current" or "segment number")" - - local current_combat = _detalhes:GetCombat ("current") --> getting the current combat - - -- the next step is request your character from the combat - -- to do this, we take the combat which here we named "current_combat" and tells what we want inside parentheses. - - local my_self = current_combat (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) - - -- _detalhes.playername holds the name of your character. - -- DETAILS_ATTRIBUTE_DAMAGE means we want the damage table, _HEAL _ENERGY _MISC is the other 3 tables. - - -- before we proceed, the result needs to be checked to make sure its a valid result. - - if (not my_self) then - return 0 -- the combat doesnt have *you*, this happens when you didn't deal any damage in the combat yet. - end - - -- now its time to get the total damage. - - local my_damage = my_self.total - - -- then finally return the amount to the capture. - - return my_damage - - ]] - - function SpellDetails:OnDetailsEvent (event, ...) - - if (event == "SHOW") then --> plugin shown on screen, actived - - --> register a custom time capture // time capture is a custom function wich will run every second and grab any kind of data. - --> here we want to capture the damage of "player". - --> _detalhes:RegisterTimeCapture ( function, give a name, parameters table ) - - elseif (event == "HIDE") then --> plugin hidded, disabled - SpellDetailsFrame:SetScript ("OnUpdate", nil) - - SpellDetails.playerActor = nil - - elseif (event == "DETAILS_STARTED") then - - -- _detalhes:TimeDataRegister ("Player Damage Done", player_damage_done, {last_damage = 0, max_damage = 0}, "Spell Details", "v1.0", [[Interface\ICONS\Achievement_Leader_Tyrande_Whisperwind]], true) - _detalhes:TimeDataRegister ("Player Damage Done", string_player_damage_done, nil, "Spell Details", "v1.0", [[Interface\ICONS\Achievement_Leader_Tyrande_Whisperwind]], true, true) - - elseif (event == "REFRESH") then --> requested a refresh window - SpellDetails:Refresh() - - elseif (event == "COMBAT_PLAYER_TIMESTARTED") then --> combat started - - if (not SpellDetailsFrame:GetScript ("OnUpdate")) then - _detalhes:RegisterEvent (SpellDetails, "BUFF_UPDATE") --> register buffs on player - _detalhes:RegisterEvent (SpellDetails, "BUFF_UPDATE_DEBUFFPOWER") --> register debuffs wich player cast on oponents - SpellDetails:RefreshBuffs() - SpellDetails:JanelaSoloUpdate (1) - SpellDetails.playerActor = select (2, ...) - end - - elseif (event == "BUFF_UPDATE") then - --> trigger when a buff is applyed on player - SpellDetails:RefreshBuffs() - - elseif (event == "PLUGIN_DISABLED") then - - elseif (event == "PLUGIN_ENABLED") then - - end - end - - function SpellDetails:CombatEnd() - _detalhes:UnregisterEvent (SpellDetails, "BUFF_UPDATE") - _detalhes:UnregisterEvent (SpellDetails, "BUFF_UPDATE_DEBUFFPOWER") - SpellDetailsFrame:SetScript ("OnUpdate", nil) - SpellDetails:RefreshBuffs() - end - ---------> Build Frame and Widgets --------------------------------------------------------------------------------------------------------------------------- - SpellDetailsFrame:SetResizable (false) - SpellDetailsFrame:SetPoint ("TOPLEFT", UIParent, "TOPLEFT") - SpellDetailsFrame:SetWidth (1) - SpellDetailsFrame:SetHeight (1) - - --> Widgets Container - SpellDetails.SummaryLine = {} - SpellDetails.SpellButtons = {} - SpellDetails.SpellInfoLabels = {} - SpellDetails.BuffTextEntry = {} - - --> reset all labels - function SpellDetails:ResetWindow() - SpellDetails.SummaryLine:Reset() - SpellDetails.SpellButtons:Reset() - SpellDetails.SpellInfoLabels:Reset() - SpellDetails:ClearBuffTexts() - end - ---------> Build head displays ----------------------------------------------------------------------------------------- - local y = -5 - local x = { - 25, 55, --> total de feito - 120, 158, --> media - 200, 240 --> tempo decorrido - } - - --> background - SpellDetailsFrame.bg_status = SpellDetailsFrame:CreateTexture (nil, "BACKGROUND") - SpellDetailsFrame.bg_status:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", -35, y+5) - SpellDetailsFrame.bg_status:SetWidth (370) - SpellDetailsFrame.bg_status:SetHeight (30) - SpellDetailsFrame.bg_status:SetTexture ("Interface\\UNITPOWERBARALT\\WowUI_Horizontal_Frame") - - local TotalLabel = DetailsFrameWork:NewLabel (SpellDetailsFrame, SpellDetailsFrame, nil, "SummaryDmg", Loc ["STRING_DAMAGE"]..": ".." 0", "GameFontHighlightSmall") - TotalLabel:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", x[1]-5, y-5) - - local TotalDpsLabel = DetailsFrameWork:NewLabel (SpellDetailsFrame, SpellDetailsFrame, nil, "SummaryDps", Loc ["STRING_DPS"]..":".." 0", "GameFontHighlightSmall") - TotalDpsLabel:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", x[3], y-5) - - local TotalTimeLabel = DetailsFrameWork:NewLabel (SpellDetailsFrame, SpellDetailsFrame, nil, "SummaryTime", Loc ["STRING_TEMPO"]..":".." 0.0", "GameFontHighlightSmall") - TotalTimeLabel:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", x[5]+10, y-5) - - SpellDetails.SummaryLine.total = TotalLabel - SpellDetails.SummaryLine.dps = TotalDpsLabel - SpellDetails.SummaryLine.time = TotalTimeLabel - - function SpellDetails.SummaryLine:Reset() - SpellDetails.SummaryLine.total:SetText (Loc ["STRING_DAMAGE"]..": 0") - SpellDetails.SummaryLine.dps:SetText (Loc ["STRING_DPS"]..":".." 0") - SpellDetails.SummaryLine.time:SetText (Loc ["STRING_TEMPO"]..":".." 0") - end - ---------> Build 9 spells boxes ----------------------------------------------------------------------------------------- - - function SpellDetails:ChangeSpellBox (id, spellid, icon, line1, line2, tooltip) - local BoxTable = SpellDetails.SpellButtons [id] - - if (BoxTable) then - if (icon) then - BoxTable.icon:SetTexture (icon) - end - - if (line1) then - BoxTable.label1:SetText (line1) - end - - if (line2) then - BoxTable.label2:SetText (line2) - end - - if (tooltip) then - BoxTable.button.tooltip = tooltip - end - - BoxTable.spellid = spellid - end - end - - function SpellDetails.ShowSpellDetails (id) - if (SpellDetails.CurrentSpellSlot) then - SpellDetails.SpellButtons [SpellDetails.CurrentSpellSlot].background:Hide() - end - return SpellDetails:DetalhesDaMagia (id) - end - - local CreateSpellBox = function (x, y, w, h, id, framelevel) - - local button = DetailsFrameWork:NewDetailsButton (SpellDetailsFrame, SpellDetailsFrame, _, SpellDetails.ShowSpellDetails, id, _, w, h+10, "Interface\\BUTTONS\\UI-DialogBox-Button-Disabled.blp") - button:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", x, y) - button:SetFrameLevel (framelevel) - - local icon = button:CreateTexture (nil, "OVERLAY") - icon:SetPoint ("TOPLEFT", button, "TOPLEFT", 6, -5) - icon:SetWidth (18) - icon:SetHeight (18) - - local label2 = DetailsFrameWork:NewLabel (button, button, nil, "text2", "", "GameFontHighlightSmall", 9.2) - label2:SetPoint ("LEFT", icon, "RIGHT", 5, 4) - local label1 = DetailsFrameWork:NewLabel (button, button, nil, "text1", "", "GameFontHighlightSmall", 9.2) - label1:SetPoint ("LEFT", icon, "RIGHT", 5, -5) - - local box = button:CreateTexture (nil, "artwork") - box:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", x, y) - box:SetWidth (w) - box:SetHeight (h+10) - box:SetTexture ("Interface\\BUTTONS\\UI-DialogBox-Button-Disabled.blp") - box:SetBlendMode ("ADD") - box:Hide() - - SpellDetails.SpellButtons [id] = {background = box, button = button, icon = icon, label1 = label1, label2 = label2, selected = false} - end - - SpellDetails.SpellButtons.LastSelected = nil - SpellDetails.SpellButtons.selected = SpellDetailsFrame:CreateTexture (nil, "background") - SpellDetails.SpellButtons.selected:SetDrawLayer ("background", 1) - SpellDetails.SpellButtons.selected:SetWidth (98) - SpellDetails.SpellButtons.selected:SetHeight (36) - - function SpellDetails:ClearSpellBox (id) - local BoxTable = SpellDetails.SpellButtons [id] - if (BoxTable) then - BoxTable.icon:SetTexture (nil) - BoxTable.label1:SetText ("") - BoxTable.label2:SetText ("") - BoxTable.button.tooltip = nil - BoxTable.selected = false - end - end - - function SpellDetails.SpellButtons:Reset() - for i = 1, 9 do - SpellDetails:ClearSpellBox (i) - SpellDetails.SpellButtons.LastSelected = nil - SpellDetails.SpellButtons.selected:ClearAllPoints() - end - end - - --> Call the build function for the 9 spell boxes - local ROWX = {6, 106, 206} --> up - - for i = 1, 3 do - CreateSpellBox (ROWX[i], -32, 90, 30, i, 5) - end - for i = 4, 6 do - CreateSpellBox (ROWX[i-3], -62, 90, 30, i, 6) - end - for i = 7, 9 do - CreateSpellBox (ROWX[i-6], -92, 90, 30, i, 7) - end - ---------> Cria o background da esquerda - SpellDetails.graphic = {} - - SpellDetails.graphic.fundo = _CreateFrame ("frame", nil, SpellDetailsFrame) - SpellDetails.graphic.fundo:SetPoint ("topleft", SpellDetailsFrame, "topleft", 5, -133) - SpellDetails.graphic.fundo:SetWidth (288) - SpellDetails.graphic.fundo:SetHeight (160) - SpellDetails.graphic.fundo:SetBackdrop ({ - --edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", - tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1}, - bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background"}) - - SpellDetails.graphic.fundo:SetScript ("OnEnter", function() - local _r, _g, _b, _a =SpellDetails.graphic.fundo:GetBackdropColor() - DetailsFrameWork:GradientEffect (SpellDetails.graphic.fundo, "frame", _r, _g, _b, _a, .3, .3, .3, .5, 0.9) - end) - - SpellDetails.graphic.fundo:SetScript ("OnLeave", function() - local _r, _g, _b, _a = SpellDetails.graphic.fundo:GetBackdropColor() - DetailsFrameWork:GradientEffect (SpellDetails.graphic.fundo, "frame", _r, _g, _b, _a, .9, .7, .7, 1, 0.9) - end) - - - --> Cria a janela do gráfico - if (not _G.DetailsSoloDpsGraph) then - local g = Graphics:CreateGraphLine ("DetailsSoloDpsGraph", SpellDetails.graphic.fundo, "topleft", "topleft", 0, 0, 288, 140) - g:SetXAxis (-1,1) - g:SetYAxis (-1,1) - g:SetGridSpacing (false, 0.105) - g:SetGridColor ({0.5, 0.5, 0.5, 0.5}) - g:SetAxisDrawing (true, true) - g:SetAxisColor({1.0, 1.0, 1.0, 1.0}) - g:SetAutoScale (true) - g.CustomRightBorder = 0.001 - g.max_time = 0 - g.max_damage = 0 - g.BuffLines = {} - g.LinesContainer = {} - g.CustomLine = "Interface\\AddOns\\Details\\Libs\\LibGraph-2.0\\smallline" - --g.LockOnXMax = true - - for i = 1, 8, 1 do - DetailsFrameWork:NewLabel (SpellDetails.graphic.fundo, SpellDetails.graphic.fundo, nil, "dpsamt"..i, "", "GameFontHighlightSmall") - SpellDetails.graphic.fundo["dpsamt"..i]:SetPoint ("TOPLEFT", SpellDetails.graphic.fundo, "TOPLEFT", -1, -(14.4*i)) - _detalhes:SetFontSize (SpellDetails.graphic.fundo["dpsamt"..i], 9) - end - - end - - function SpellDetails:UpdateDamageGraphic() - - local GraphicObject = _G.DetailsSoloDpsGraph - - if (not GraphicObject) then - print ("Nao ha um grafico criado.") - return - end - - SpellDetails.LastGraphicDrew = SpellDetails.LastGraphicDrew or {} - - local graphicData = _detalhes.tabela_vigente:GetTimeData ("Player Damage Done") - - if (not graphicData) then - print ("No graphic available for this segment.") - return - end - - if (graphicData == SpellDetails.LastGraphicDrew) then - return - else - SpellDetails.LastGraphicDrew = SpellDetails.LastGraphicDrew - end - - if (graphicData.max_damage == 0) then - return - end - - if (#graphicData < 2) then - local timetooshort = SpellDetails.graphic.fundo.timetooshot or DetailsFrameWork:NewLabel (SpellDetails.graphic.fundo, SpellDetails.graphic.fundo, nil, "timetooshort", Loc ["STRING_TOOSHORT"], "GameFontHighlightSmall") - timetooshort:SetPoint ("TOPLEFT", SpellDetails.graphic.fundo, "TOPLEFT", 40, -55) - _detalhes:SetFontSize (timetooshort, 10) - timetooshort:SetJustifyH ("center") - timetooshort:Show() - return - elseif (SpellDetails.graphic.fundo.timetooshort) then - SpellDetails.graphic.fundo.timetooshort:Hide() - end - - GraphicObject:ResetData() - - local _data = {} - local dps_max = graphicData.max_value - local amount = #graphicData - - local scaleW = 1/288 - - local content = graphicData - table.insert (content, 1, 0) - table.insert (content, 1, 0) - table.insert (content, #content+1, 0) - table.insert (content, #content+1, 0) - local _i = 3 - while (_i <= #content-2) do - local v = (content[_i-2]+content[_i-1]+content[_i]+content[_i+1]+content[_i+2])/5 - _data [#_data+1] = {scaleW*(_i-2), v/dps_max} --> - _i = _i + 1 - end - - local BuffTable = _detalhes.Buffs.BuffsTable - local iconIndex = 1 - - if (BuffTable) then - - local geralLineIndex = 1 - local scaleG = 277/_detalhes.tabela_vigente:GetCombatTime() --288 - - for spellName, spellTable in _pairs (BuffTable) do - - local timeTable = {} - for index, appliedAt in _ipairs (spellTable.appliedAt) do - timeTable [#timeTable+1] = {appliedAt, spellTable.tableIndex} - end - - for index, appliedAt in _ipairs (timeTable) do - local thisLine = GraphicObject.BuffLines [geralLineIndex] - if (not thisLine) then - thisLine = GraphicObject:CreateTexture (nil, "overlay") - thisLine:SetTexture ("Interface\\AddOns\\Details\\images\\verticalline") - thisLine:SetWidth (3) - thisLine:SetHeight (160) - thisLine:SetPoint ("topleft", SpellDetails.graphic.fundo, "topleft", (appliedAt[1]*scaleG)+25, 0) - thisLine:SetVertexColor (.4, .4, .4, .8) - - thisLine.icon = GraphicObject:CreateTexture (nil, "overlay") - local _, _, icon = GetSpellInfo (spellName) - --print (spellName, icon) - thisLine.icon:SetTexture (icon) - thisLine.icon:SetWidth (12) - thisLine.icon:SetHeight (12) - - if (iconIndex == 1) then - thisLine.icon:SetPoint ("left", thisLine, "right", -2, 0) - thisLine.icon:SetPoint ("top", thisLine, "bottom", 0, 25) - elseif (iconIndex == 2) then - thisLine.icon:SetPoint ("right", thisLine, "left", 2, 0) - thisLine.icon:SetPoint ("top", thisLine, "bottom", 0, 25) - elseif (iconIndex == 3) then - thisLine.icon:SetPoint ("right", thisLine, "left", 2, 0) - thisLine.icon:SetPoint ("top", thisLine, "bottom", 0, 12) - elseif (iconIndex == 4) then - thisLine.icon:SetPoint ("left", thisLine, "right", -2, 0) - thisLine.icon:SetPoint ("top", thisLine, "bottom", 0, 12) - end - - GraphicObject.BuffLines [geralLineIndex] = thisLine - else - thisLine:SetPoint ("topleft", SpellDetails.graphic.fundo, "topleft", (appliedAt[1]*scaleG)+28, 0) - local _, _, icon = GetSpellInfo (spellName) - thisLine.icon:SetTexture (icon) - end - - geralLineIndex = geralLineIndex + 1 - end - - iconIndex = iconIndex + 1 - if (iconIndex == 5) then - iconIndex = 1 - end - - end - end - - local dano_divisao = dps_max/8 - local o = 1 - for i = 8, 1, -1 do - local d = _detalhes:ToK0 (dano_divisao*i) - SpellDetails.graphic.fundo["dpsamt"..o]:SetText (d) - o = o + 1 - end - - GraphicObject:AddDataSeries (_data, {1, 1, 1, 1}) - - end - - --> Hida - SpellDetails.graphic.fundo:Hide() - ---------> Cria o background - SpellDetailsFrame.fundo = SpellDetailsFrame:CreateTexture (nil, "background") - SpellDetailsFrame.fundo:SetTexture ("Interface\\AddOns\\Details_SpellDetails\\images\\solo_bg") - SpellDetailsFrame.fundo:SetPoint ("topleft", SpellDetailsFrame, "topleft", 0, -125) - SpellDetailsFrame.fundo:SetWidth (298) - SpellDetailsFrame.fundo:SetHeight (175) - SpellDetailsFrame.fundo:SetTexCoord (0, 0.615234375, 0, 0.6640625) - SpellDetailsFrame.fundo:SetDrawLayer ("background", 1) - ---------> Cria o background da esquerda - SpellDetailsFrame.fundoEsq = _CreateFrame ("frame", nil, SpellDetailsFrame) - --SpellDetailsFrame.fundoEsq:SetTexture ("Interface\\Tooltips\\UI-Tooltip-Background") - SpellDetailsFrame.fundoEsq:SetPoint ("topleft", SpellDetailsFrame, "topleft", 5, -133) - SpellDetailsFrame.fundoEsq:SetWidth (120) - SpellDetailsFrame.fundoEsq:SetHeight (160) - SpellDetailsFrame.fundoEsq:SetBackdrop ({ - edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", - tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1}, - bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background"}) - - SpellDetailsFrame.fundoEsq:SetScript ("OnEnter", function() - local _r, _g, _b, _a =SpellDetailsFrame.fundoEsq:GetBackdropColor() - DetailsFrameWork:GradientEffect (SpellDetailsFrame.fundoEsq, "frame", _r, _g, _b, _a, .3, .3, .3, .5, .9) - - end) - - SpellDetailsFrame.fundoEsq:SetScript ("OnLeave", function() - local _r, _g, _b, _a = SpellDetailsFrame.fundoEsq:GetBackdropColor() - DetailsFrameWork:GradientEffect (SpellDetailsFrame.fundoEsq, "frame", _r, _g, _b, _a, .9, .7, .7, 1, .9) - end) - ---------> Cria o background da direita - SpellDetailsFrame.fundoDir = _CreateFrame ("frame", nil, SpellDetailsFrame) - SpellDetailsFrame.fundoDir:SetPoint ("topleft", SpellDetailsFrame, "topright", 127, -138+5) - SpellDetailsFrame.fundoDir:SetWidth (166) - SpellDetailsFrame.fundoDir:SetHeight (160) - SpellDetailsFrame.fundoDir:SetBackdrop ({ - edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", - tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1}, - bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background"}) - SpellDetailsFrame.fundoDir:SetScript ("OnEnter", function() - local _r, _g, _b, _a =SpellDetailsFrame.fundoDir:GetBackdropColor() - DetailsFrameWork:GradientEffect (SpellDetailsFrame.fundoDir, "frame", _r, _g, _b, _a, .3, .3, .3, .5, .9) - end) - SpellDetailsFrame.fundoDir:SetScript ("OnLeave", function() - local _r, _g, _b, _a = SpellDetailsFrame.fundoDir:GetBackdropColor() - DetailsFrameWork:GradientEffect (SpellDetailsFrame.fundoDir, "frame", _r, _g, _b, _a, .9, .7, .7, 1, .9) - end) - ------------------------------------------------------------------------------------------------------------------------------------------------ ---> botão switch - - SpellDetails.Detalhes = 1 --> normal - function SpellDetails:ShowGraphic() - --> hidar os 2 blocos em baixo: - - if (SpellDetails.Detalhes == 1) then --> show graphic - - if (InCombatLockdown()) then - print ("|cffFF2222"..Loc ["STRING_INCOMBAT"]) - return - end - - SpellDetailsFrame.fundoEsq:Hide() - SpellDetailsFrame.fundoDir:Hide() - SpellDetails.Detalhes = 2 - SpellDetails.SwitchButton.text:SetText ("X") --> localize-me - SpellDetails.SwitchButton:SetWidth (15) - SpellDetails.graphic.fundo:Show() - SpellDetails:UpdateDamageGraphic (SpellDetailsFrame) - SpellDetails.SwitchButton:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", 275, -136) - - elseif (SpellDetails.Detalhes == 2) then --> show normal details - SpellDetailsFrame.fundoEsq:Show() - SpellDetailsFrame.fundoDir:Show() - SpellDetails.Detalhes = 1 - SpellDetails.SwitchButton.text:SetText ("Graphic") --> localize-me - SpellDetails.SwitchButton:SetWidth (110) - SpellDetails.graphic.fundo:Hide() - SpellDetails.SwitchButton:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", 10, -274) - - end - end - - --> botão para o gráfico: - local SwitchButton = DetailsFrameWork:NewDetailsButton (SpellDetailsFrame, SpellDetailsFrame, _, SpellDetails.ShowGraphic, _, _, 110, 15) - SwitchButton:SetFrameStrata ("TOOLTIP") - SwitchButton:SetFrameLevel (50) - SwitchButton:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", 10, -274) - SwitchButton:SetFrameLevel (6) - SwitchButton:InstallCustomTexture() - SwitchButton.text:SetText ("Graphic") --> localize-me - - SpellDetails.SwitchButton = SwitchButton - - --------------------------------------------------------------------------------------------------------------------------------------------- - --> painel da esquerda inferior (informações da magia) - - local loc_y = {-140, -150, -160, -170, -180, -190, -200, -210, -220, -230, -240} - local xStart = 10 - - local total = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "total", Loc ["STRING_DAMAGE"]..":", "GameFontHighlightSmall") - SpellDetailsFrame.fundoEsq.total:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[1]) - SpellDetails.SpellInfoLabels.total = total - - local dps = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "dps", Loc ["STRING_DPS"]..":", "GameFontHighlightSmall") - SpellDetailsFrame.fundoEsq.dps:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[2]) - SpellDetails.SpellInfoLabels.dps = dps - - local media = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "porcento", Loc ["STRING_PERCENT"]..":", "GameFontHighlightSmall") - SpellDetailsFrame.fundoEsq.porcento:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[3]) - SpellDetails.SpellInfoLabels.porcento = media - - local uptime = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "tempo_em_uso", Loc ["STRING_UPTIME"]..":", "GameFontHighlightSmall") - SpellDetailsFrame.fundoEsq.tempo_em_uso:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[4]) - SpellDetails.SpellInfoLabels.uptime = uptime - - local critical = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "critico", Loc ["STRING_CRIT"]..":", "GameFontHighlightSmall") - SpellDetailsFrame.fundoEsq.critico:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[5]) - SpellDetails.SpellInfoLabels.critical = critical - - local miss = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "miss", Loc ["STRING_MISS"]..":", "GameFontHighlightSmall") - SpellDetailsFrame.fundoEsq.miss:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[6]) - SpellDetails.SpellInfoLabels.miss = miss - - local block = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "blocked", Loc ["STRING_BLOCKED"]..":", "GameFontHighlightSmall") - SpellDetailsFrame.fundoEsq.blocked:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[7]) - SpellDetails.SpellInfoLabels.block = block - - local glancing = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "glancing", "Glancing: ", "GameFontHighlightSmall") - SpellDetailsFrame.fundoEsq.glancing:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[8]) - SpellDetails.SpellInfoLabels.glancing = glancing - - function SpellDetails.SpellInfoLabels:Reset() - SpellDetails.SpellInfoLabels.total:SetText (Loc ["STRING_DAMAGE"]..": 0") - SpellDetails.SpellInfoLabels.dps:SetText (Loc ["STRING_DPS"]..":".." 0") - SpellDetails.SpellInfoLabels.porcento:SetText (Loc ["STRING_PERCENT"]..":".." 0") - SpellDetails.SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." 0") - SpellDetails.SpellInfoLabels.critical:SetText (Loc ["STRING_CRIT"]..":".." 0") - SpellDetails.SpellInfoLabels.miss:SetText (Loc ["STRING_MISS"]..":".." 0") - SpellDetails.SpellInfoLabels.block:SetText (Loc ["STRING_BLOCKED"]..":".." 0") - SpellDetails.SpellInfoLabels.glancing:SetText (Loc ["STRING_GLANCING"]..":".." 0") - end - - - --------------------------------------------------------------------------------------------------------------------------------------------- - --> painel da direita inferior (detalhes dos buffs do jogador) - - --_detalhes.SoloTables.BuffsTable.BuffIds = _detalhes.SoloTables.BuffsTable.BuffIds or {0, 0, 0, 0} - --_detalhes.SoloTables.BuffsTableNameCache = _detalhes.SoloTables.BuffsTableNameCache or {"", "", "", ""} - - local BuffIndex = {} - - function SpellDetails:ClearBuffTexts() - for _, BuffInput in _ipairs (SpellDetails.BuffTextEntry) do - BuffInput.amtdone:SetText ("") - BuffInput.dps:SetText ("") - BuffInput.uptime:SetText ("") - end - end - - function SpellDetails:SetBuffTexts (id, damage, dps) - local BuffInput = SpellDetails.BuffTextEntry [id] - BuffInput.amtdone:SetText (Loc ["STRING_DAMAGE"]..": "..damage) - BuffInput.dps:SetText (Loc ["STRING_DPS"]..":".." "..dps) - end - - local Clear = function (BuffEntryTable) - --> clicked on X to clear the buff - _detalhes.Buffs:RemoveBuff (BuffEntryTable.name:GetText()) - - --_detalhes.SoloTables.BuffsTable.BuffIds [BuffEntryTable.id] = 0 - BuffIndex [BuffEntryTable.name:GetText()] = nil - - BuffEntryTable.icon:SetTexture (nil) - BuffEntryTable.name:SetText ("") - BuffEntryTable.amtdone:SetText ("") - BuffEntryTable.dps:SetText ("") - BuffEntryTable.editbox:SetText (Loc ["STRING_DEBUFFNAME"]) - BuffEntryTable.editbox:Show() - BuffEntryTable.background:Hide() - BuffEntryTable.backgroundFrame:Hide() - BuffEntryTable.button:Hide() - end - - local SetBuff = function (BuffEntryTable, spellid, id) - - local spellname, _, spellicon = GetSpellInfo (spellid) - - if (not _detalhes.Buffs:IsRegistred (spellid)) then - _detalhes.Buffs:NewBuff (spellname, spellid) - end - - BuffIndex [spellname] = BuffEntryTable - - BuffEntryTable.icon:SetTexture (spellicon) - BuffEntryTable.name:SetText (spellname) - BuffEntryTable.amtdone:SetText (Loc ["STRING_DAMAGE"]..": 0") - BuffEntryTable.dps:SetText (Loc ["STRING_DPS"]..":".." 0") - BuffEntryTable.editbox:Hide() - BuffEntryTable.background:Show() - BuffEntryTable.backgroundFrame:Show() - BuffEntryTable.button:Show() - --print (debugstack()) - end - - local OnEnter = function (_, id, texto, editbox, by) - - if (_string_len (texto) > 0 and texto ~= Loc ["STRING_DEBUFFNAME"]) then - if (by == editbox) then --> By Enter - if (_detalhes.popup.NumLines > 0) then - local texto2 = _detalhes.popup:GetText(1):match ("(.-):") - texto = texto2 - end - end - if (not tonumber (texto)) then - editbox:SetText (Loc ["STRING_DEBUFFNAME"]) - return - end - SetBuff (SpellDetails.BuffTextEntry [id], tonumber (texto), id) - else - editbox:SetText (Loc ["STRING_DEBUFFNAME"]) - end - - if (_detalhes.popup.active) then - _detalhes.popup:ShowMe (false) - end - end - - local CreateBuffInput = function (y, id) - - local backgroundFrame = _CreateFrame ("frame", "SoloBuffEditBox"..id.."Background", SpellDetailsFrame.fundoDir) - backgroundFrame:SetWidth (166) - backgroundFrame:SetHeight (40) - backgroundFrame:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPRIGHT", 127, y+5+8) - backgroundFrame:SetBackdrop ({edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1}, - bgFile = "Interface\\DialogFrame\\UI-DialogBox-Gold-Background"}) - backgroundFrame:SetBackdropColor (.3, .3, .3, .5) - --backgroundFrame:SetBackdropBorderColor (1, 0, 0, 1) - backgroundFrame:Hide() - - backgroundFrame:SetScript ("OnEnter", function() - if (not backgroundFrame.Actived) then - local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() - DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, .9, .7, .7, 1, .9) - else - local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() - DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, 75/255, 246/255, 78/255, 1, .9) - end - end) - - backgroundFrame:SetScript ("OnLeave", function() - if (not backgroundFrame.Actived) then - local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() - DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, .3, .3, .3, .5, .9) - else - local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() - DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, 22/255, 155/255, 29/255, .9, .9) - end - end) - - function backgroundFrame:Active() - local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() - DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, 22/255, 155/255, 29/255, .9, .9) - backgroundFrame.Actived = true - end - - function backgroundFrame:Desactive() - local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() - DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, .3, .3, .3, .5, .9) - backgroundFrame.Actived = false - end - - local background = SpellDetailsFrame.fundoDir:CreateTexture (nil, "background") - --background:SetTexture ("Interface\\DialogFrame\\UI-DialogBox-Background") - background:SetWidth (166) - background:SetHeight (36) - background:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPRIGHT", 127, y+3+8) - background:SetDrawLayer ("background", 2) - background:Hide() - - --> editbox - --local editbox = DetailsFrameWork:NewTextBox (SpellDetailsFrame.fundoDir, SpellDetailsFrame.fundoDir, "SoloBuffEditBox"..id, OnEnter, "param_1", id, 120, 14) - - local editbox = DetailsFrameWork:NewTextEntry (SpellDetailsFrame.fundoDir, nil, "DetailsSpellDetailsBox"..id, "SoloBuffEditBox"..id, 120, 14, OnEnter, "param_1", id) - - editbox:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPRIGHT", 150, y) - editbox.text = Loc ["STRING_DEBUFFNAME"] - - local imageLeft = editbox:CreateTexture (nil, "overlay") - imageLeft:SetPoint ("right", "DetailsSpellDetailsBox"..id, "left", 0.5, -2) - imageLeft:SetTexture ("Interface\\ARCHEOLOGY\\ArchaeologyParts") - imageLeft:SetTexCoord (0.119140625, 0.1875, 0.8046875, 0.87890625) - imageLeft:SetWidth (19) - imageLeft:SetHeight (10) - local imageRight = editbox:CreateTexture (nil, "overlay") - imageRight:SetPoint ("left", "DetailsSpellDetailsBox"..id, "right", -0.5, -2) - imageRight:SetTexture ("Interface\\ARCHEOLOGY\\ArchaeologyParts") - imageRight:SetTexCoord (0.0078125, 0.078125, 0.859375, 0.93359375) - imageRight:SetWidth (19) - imageRight:SetHeight (10) - - editbox.HaveMenu = false - - local OnClickMenu = function (_, _, SpellID) - editbox:SetText (SpellID) - editbox:PressEnter (true) - editbox.HaveMenu = false - _detalhes.popup:ShowMe (false) - end - - editbox.OnTextChangedHook = function (frame, userChanged) - - if (not userChanged) then - return - end - - local texto = editbox:GetText() - texto = _detalhes:trim (texto) - texto = _string_lower (texto) - texto = texto:gsub ("%(", "") - texto = texto:gsub ("%[", "") - - local index = _string_sub (texto, 1, 1) - local cached = _detalhes.spellcachefull [index] - - if (cached) then - - local CoolTip = _G.GameCooltip - - CoolTip:Reset() - CoolTip:SetType ("menu") - CoolTip:SetOwner (_G ["DetailsSpellDetailsBox"..id]) - CoolTip:SetOption ("NoLastSelectedBar", true) - CoolTip:SetOption ("HeightAnchorMod", -8) - CoolTip:SetOption ("TextSize", 9.5) - - local CoolTipTable = {} - local texcoord = {0,1,0,1} - local i = 1 - - for SpellID, SpellTable in _pairs (cached) do - - if (_string_lower (SpellTable[1]):find (texto)) then - local rank = SpellTable[3] - if (not rank or rank == "") then - rank = "" - else - rank = " ("..rank..")" - end - - CoolTip:AddMenu (1, OnClickMenu, SpellID, nil, nil, SpellID..": "..SpellTable[1]..rank, SpellTable[2], true) - - if (i > 20) then - break - else - i = i + 1 - end - end - - end - - _detalhes.popup.buttonOver = true - editbox.HaveMenu = true - CoolTip:ShowCooltip() - end - end - - local icon = backgroundFrame:CreateTexture (nil, "OVERLAY") - icon:SetWidth (16) - icon:SetHeight (16) - icon:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPRIGHT", 133, y+8) - - local name = DetailsFrameWork:NewLabel (backgroundFrame, backgroundFrame, nil, "BuffName"..id, "", "GameFontHighlightSmall") - name:SetPoint ("LEFT", icon, "RIGHT", 3, 4) - - local amtdone = DetailsFrameWork:NewLabel (backgroundFrame, backgroundFrame, nil, "BuffDone"..id, "", "GameFontHighlightSmall") - amtdone:SetPoint ("LEFT", icon, "RIGHT", 3, -6) - local uptime = DetailsFrameWork:NewLabel (backgroundFrame, backgroundFrame, nil, "BuffUptime"..id, "", "GameFontHighlightSmall") - uptime:SetPoint ("LEFT", icon, "RIGHT", 55, -6) - - local dps = DetailsFrameWork:NewLabel (backgroundFrame, backgroundFrame, nil, "BuffDps"..id, "", "GameFontHighlightSmall") - dps:SetPoint ("LEFT", icon, "RIGHT", 3, -16) - - local clearbutton = _CreateFrame ("Button", nil, backgroundFrame, "UIPanelCloseButton") - clearbutton:SetWidth (20) - clearbutton:SetHeight (20) - clearbutton:SetPoint ("TOPLEFT", icon, "TOPRIGHT", -18, -15) - - SpellDetails.BuffTextEntry [id] = {id = id, editbox = editbox, icon = icon, name = name, amtdone = amtdone, dps = dps, uptime = uptime, button = clearbutton, background = background, backgroundFrame = backgroundFrame} - - --clearbutton:SetText ("x") - - clearbutton:SetScript ("OnClick", function() Clear (SpellDetails.BuffTextEntry [id]) end) - clearbutton:Hide() - - editbox.OnEscapePressedHook = function() - editbox:SetText (Loc ["STRING_DEBUFFNAME"]) - _detalhes.popup:ShowMe (false) - end - - editbox.OnEnterPressedHook = function() - if (editbox:GetText() == Loc ["STRING_DEBUFFNAME"]) then - editbox:SetText ("") - elseif (_string_len (editbox:GetText()) > 0) then - if (not _detalhes.popup.active) then - editbox.OnTextChangedHook (true) - end - end - end - - editbox.OnLeaveHook = function() - if (not editbox:HasFocus()) then - if (editbox:GetText() == "") then - editbox:SetText (Loc ["STRING_DEBUFFNAME"]) - end - end - - _detalhes.popup.buttonOver = false - if (_detalhes.popup.active) then - local passou = 0 - editbox:SetScript ("OnUpdate", function (self, elapsed) - passou = passou+elapsed - if (passou > 0.3) then - if (not _detalhes.popup.mouseOver and not _detalhes.popup.buttonOver) then - _detalhes.popup:ShowMe (false) - end - editbox:SetScript ("OnUpdate", nil) - end - end) - elseif (_detalhes.popup.tooltip) then - _detalhes.popup:ShowMe (false) - else - editbox:SetScript ("OnUpdate", nil) - end - - end - - editbox.OnEditFocusGainedHook = function() - if (InCombatLockdown()) then - - GameCooltip:Reset() - GameCooltip:AddLine ("|cffFF2222"..Loc ["STRING_INCOMBAT"]) - GameCooltip:AddIcon ("Interface\\Buttons\\LockButton-Locked-Up",_,_, 25, 25) - GameCooltip:ShowCooltip (_G ["DetailsSpellDetailsBox"..id], "tooltip") - - editbox:PressEnter() - else - editbox:SetText ("") - _detalhes:BuildSpellList() - end - end - - editbox.OnEditFocusLostHook = function() - editbox.HaveMenu = false - local texto = editbox:GetText() - if (_string_len (texto) > 0 and texto ~= Loc ["STRING_DEBUFFNAME"]) then - SetBuff (SpellDetails.BuffTextEntry [id], tonumber (texto), id) - else - editbox:SetText (Loc ["STRING_DEBUFFNAME"]) - end - _detalhes:ClearSpellList() - end - - end - - --> Crias as caixas dos buffs - local y = {-146, -186, -226, -266} -- +8 - for i = 1, 4 do - CreateBuffInput (y [i], i) - end - - --> fill with buff information: - --> inject inside details for ace3 delay - function _detalhes:SpellDetailsStartupBuffs() - local buffmax = 4 - local BuffList = _detalhes.Buffs:GetBuffListIds() - for i = 1, #BuffList do - if (i >= 5) then - break - end - SetBuff (SpellDetails.BuffTextEntry [i], BuffList [i], i) - end - end - - _detalhes:ScheduleTimer ("SpellDetailsStartupBuffs", 5) - --_detalhes:SpellDetailsStartupBuffs() - - function SpellDetails:RefreshBuffs() - for BuffName, BuffTable in _pairs (_detalhes.Buffs.BuffsTable) do - if (BuffTable.active and SpellDetails:IsInCombat()) then - if (BuffIndex [BuffName]) then - BuffIndex [BuffName].backgroundFrame:Active() - end - else - if (BuffIndex [BuffName]) then - BuffIndex [BuffName].backgroundFrame:Desactive() - end - end - end - end - - function SpellDetails:Refresh() - SpellDetails:AtualizaSoloMode() - SpellDetails:DetalhesDaMagia (SpellDetails.CurrentSpellSlot) - SpellDetails:ForceUpdateUpDisplay() - end - - function SpellDetails:JanelaSoloUpdate (OnOff) - - local janela_solo = SpellDetailsFrame - if (OnOff > 0) then - - if (not _detalhes.SoloTables.CombatID) then - return - end - - local MySelf - if (_detalhes.SoloTables.CombatID == _detalhes:NumeroCombate()) then - MySelf = _detalhes.tabela_vigente (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) - else - local vigente = _detalhes.tabela_historico.tabelas[_detalhes:NumeroCombate() - _detalhes.SoloTables.CombatID] - MySelf = vigente (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) - end - - if (MySelf) then - janela_solo.SoloInicioCombate = MySelf.start_time - janela_solo.SoloInicioTimer = _GetTime() - janela_solo.SoloTimer = 0 - janela_solo.SoloDps = 0 - janela_solo.AtualizarJanelaDetalhes = 0 - janela_solo.MySelf = MySelf - janela_solo.Instancia = self - janela_solo:SetScript ("OnUpdate", SpellDetails.SoloUpdater) - end - else - janela_solo.SoloInicioCombate = nil - janela_solo.SoloTimer = nil - janela_solo.SoloDps = nil - janela_solo.AtualizarJanelaDetalhes = nil - janela_solo.MySelf = nil - janela_solo.Instancia = nil - janela_solo:SetScript ("OnUpdate", nil) - end - end - - function SpellDetails:ForceUpdateUpDisplay() - local MySelf = _detalhes.tabela_vigente (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) - if (MySelf and MySelf.end_time and MySelf.start_time) then - local tempo_in_combat = MySelf.end_time - MySelf.start_time - SpellDetails.SummaryLine.time:SetText (Loc ["STRING_TEMPO"]..":".." ".._string_format ("%.1f", tempo_in_combat)) - SpellDetails.SummaryLine.dps:SetText (Loc ["STRING_DPS"]..":".." ".._cstr ("%.1f", MySelf.total/tempo_in_combat)) - SpellDetails.SummaryLine.total:SetText (Loc ["STRING_DAMAGE"]..": " .. _tostring (MySelf.total)) - else - SpellDetails.SummaryLine.time:SetText (Loc ["STRING_TEMPO"]..":".." 0.0") - SpellDetails.SummaryLine.dps:SetText (Loc ["STRING_DPS"]..":".." 0") - SpellDetails.SummaryLine.total:SetText (Loc ["STRING_DAMAGE"]..": 0") - end - end - - function SpellDetails:SoloUpdater (elapsed) - - self.SoloTimer = self.SoloTimer + elapsed - self.SoloDps = self.SoloDps + elapsed - self.AtualizarJanelaDetalhes = self.AtualizarJanelaDetalhes + elapsed - - if (self.SoloTimer > 0.1) then - local tempo_agora = (_GetTime() - self.SoloInicioTimer) - SpellDetails.SummaryLine.time:SetText (Loc ["STRING_TEMPO"]..":".." ".._string_format ("%.1f", tempo_agora)) - self.SoloTimer = 0 - end - - if (self.SoloDps > 0.2) then - - --print (_GetTime() .. " " .._detalhes._tempo .. " " .. time()) - --print (self.MySelf.start_time) - --_detalhes.SoloTables.SummaryLine.dps:SetText (Loc ["STRING_DPS"]..":".." ".._detalhes:comma_value( _math_floor (self.MySelf.total/(_tempo - self.SoloInicioCombate))) ) - --print (self.MySelf.total .. " / " .. (time() - self.MySelf.start_time)) - SpellDetails.SummaryLine.dps:SetText (Loc ["STRING_DPS"]..":".." ".._detalhes:comma_value( _math_floor (self.MySelf.total/( time() - self.MySelf.start_time))) ) - self.SoloDps = 0 - end - - if (self.AtualizarJanelaDetalhes > 1.0) then - SpellDetails:AtualizaSoloMode() - SpellDetails:DetalhesDaMagia (SpellDetails.CurrentSpellSlot) - self.AtualizarJanelaDetalhes = 0 - if (not _UFC ("player")) then - return SpellDetails:CombatEnd() - end - end - end - - function SpellDetails:AtualizaSoloMode() - - if (not _detalhes.SoloTables.CombatID) then - return - end - - -- self.atributo <- retorna o que esta sendo mostrado na instancia - local atributo = DETAILS_ATTRIBUTE_DAMAGE - local MySelf - - if (_detalhes.SoloTables.CombatID == _detalhes:NumeroCombate()) then - MySelf = _detalhes.tabela_vigente (atributo, _detalhes.playername) - else - local vigente = _detalhes.tabela_historico.tabelas[_detalhes:NumeroCombate() - _detalhes.SoloTables.CombatID] - if (not vigente) then - --print ("!Vigente> solo_id = ".._detalhes.SoloTables.CombatID.." <> " .. _detalhes:NumeroCombate() - _detalhes.SoloTables.CombatID) - return - end - MySelf = vigente (atributo, _detalhes.playername) - end - - local janela = SpellDetailsFrame - - if (MySelf) then - local meu_total, dps = MySelf.total, MySelf.last_dps - - SpellDetails.SummaryLine.total:SetText (Loc ["STRING_DAMAGE"]..": ".._detalhes:comma_value (meu_total)) --> gravar total - - --> pegar as magias que castei - - local tabela = MySelf.spell_tables._ActorTable - local meus_danos = {} - - local SpellsTotalHits = 0 - for _spellid, _tabela in _pairs (tabela) do - meus_danos [#meus_danos+1] = {_spellid, _tabela, _tabela.total} - SpellsTotalHits = SpellsTotalHits + _tabela.counter - end - - --> spellvalue - for _, _tabela in _ipairs (meus_danos) do - local PercentDamage = (_tabela[3]/MySelf.total)+1 -- a escala é de 0.0 a 0.9 + 1 então é de 1 a 1.999 - local PercentHits = ((_tabela[2].counter/SpellsTotalHits)*0.1) + 1 --> 0.1 scale down --> 1.09 - local pow = math.pow (PercentDamage, PercentHits) - local scaled = _detalhes:Scale (1, 2.15, 1, 100, pow) - _tabela[4] = scaled - end - - _table_sort (meus_danos, function (_spell1, _spell2) return _spell1[4] > _spell2[4] end) - - for i = 1, 9 do - local esta_magia = meus_danos[i] - if (esta_magia) then - local SpellName, _, Icon = _GetSpellInfo (esta_magia[1]) - local SpellBoxObject = SpellDetails.SpellButtons [i] - - SpellDetails:ChangeSpellBox (i, esta_magia[1], Icon, - "DPS: ".. _detalhes:ToK (_math_floor (esta_magia[3]/MySelf:Tempo())), - "SV: ".. _string_format ("%.1f", esta_magia[4]), - nil) - else - SpellDetails:ClearSpellBox (i) - end - end - end - end - - function SpellDetails:DetalhesDaMagia (slot) - - local SoloCombatID = _detalhes.SoloTables.CombatID - - if (not SoloCombatID) then - return - end - - if (not slot) then --> slot é qual dos 9 quadros vai mostrar - slot = 1 - SpellDetails.CurrentSpellSlot = 1 - SpellDetails.SpellButtons.LastSelected = slot - SpellDetails.SpellButtons.selected:SetPoint ("TOPLEFT", SpellDetails.SpellButtons [slot].background, "TOPLEFT", -5, 3) - SpellDetails.SpellButtons [slot].background:Show() - end - - if (slot ~= SpellDetails.CurrentSpellSlot) then --> se o player clicou em outro quadro - SpellDetails.CurrentSpellSlot = slot - SpellDetails:ClearBuffTexts() - SpellDetails.SpellButtons.LastSelected = slot - SpellDetails.SpellButtons.selected:SetPoint ("TOPLEFT", SpellDetails.SpellButtons [slot].background, "TOPLEFT", -5, 3) - SpellDetails.SpellButtons [slot].background:Show() - end - - local SpellBoxTable = SpellDetails.SpellButtons [slot] - local spellid = SpellBoxTable.spellid - local CombatTable - - local MySelf - if (SoloCombatID == _detalhes:NumeroCombate()) then - MySelf = _detalhes.tabela_vigente (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) - CombatTable = _detalhes.tabela_vigente - else - if (_detalhes.SoloTables.CombatID == 0) then - return - end - - local vigente = _detalhes.tabela_historico.tabelas [_detalhes:NumeroCombate() - SoloCombatID] - if (not vigente) then - --print ("!Vigente> solo_id = "..SoloCombatID.." <> " .. _detalhes:NumeroCombate() .. " table: " .. (_detalhes:NumeroCombate() - SoloCombatID)) - return - end - MySelf = vigente (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) - CombatTable = vigente - end - - if (not MySelf) then --> caso o jogador não esteja em combate - return - end - - local habilidade = MySelf.spell_tables._ActorTable [spellid] --> agora tem o objeto classe_TIPO_habilidade - if (not habilidade) then --> caso a tabela do jogador não tenha a skill pedida. - return - end - - local SpellInfoLabels = SpellDetails.SpellInfoLabels --> shortcut - - SpellInfoLabels.total:SetText (Loc ["STRING_DAMAGE"]..": ".._detalhes:comma_value (habilidade.total)) - SpellInfoLabels.dps:SetText (Loc ["STRING_DPS"]..":".." ".._detalhes:comma_value (_math_floor (habilidade.total/(MySelf:Tempo())))) - SpellInfoLabels.porcento:SetText (Loc ["STRING_PERCENT"]..":".." ".. _detalhes:comma_value ( _math_floor (habilidade.total/MySelf.total*100)).."%") - - local SoloDebuffUptime = CombatTable.SoloDebuffUptime - if (SoloDebuffUptime) then - local DebuffTable = SoloDebuffUptime [spellid] - if (DebuffTable) then - --SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." ".._math_floor (DebuffTable.duration).."s (".._math_floor (DebuffTable.duration/MySelf:Tempo()*100).."%) "..DebuffTable.castedAmt.."/"..DebuffTable.refreshAmt.."/"..DebuffTable.droppedAmt) --> localize-me - - local duration = DebuffTable.duration - if (DebuffTable.Active) then - duration = duration + (_detalhes._tempo - DebuffTable.start) - end - - SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." ".._math_floor (duration).."s (".._math_floor (duration/MySelf:Tempo()*100).."%) ") --> localize-me - else - SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." 0") --> localize-me - end - else - SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." 0") --> localize-me - end - - SpellInfoLabels.critical:SetText (Loc ["STRING_CRIT"]..":".." "..habilidade.c_amt.." (".. _math_floor ( habilidade.c_amt/habilidade.counter*100 ) .."%)") -- /"..habilidade.counter.." - if (habilidade.c_amt < 1) then - SpellInfoLabels.critical:SetTextColor (0.5, 0.5, 0.5) - SpellInfoLabels.critical:SetText (Loc ["STRING_CRIT"]..":".." "..habilidade.c_amt.."/"..habilidade.counter) --> localize-me - else - SpellInfoLabels.critical:SetTextColor (1, 1, 1) - end - - local erros = 0 - for _, missType in _ipairs (MySelf.missTypes) do - local este_erro = habilidade [missType] - if (este_erro) then - erros = erros + este_erro - end - end - - SpellInfoLabels.miss:SetText (Loc ["STRING_MISS"]..":".." "..erros.. " (".._string_format ("%.1f", erros/habilidade.counter*100).."%)") --> localize-me - if (erros < 1) then - SpellInfoLabels.miss:SetTextColor (0.5, 0.5, 0.5) - else - SpellInfoLabels.miss:SetTextColor (1, 1, 1) - end - - SpellInfoLabels.block:SetText (Loc ["STRING_BLOCKED"]..":".." ".. _string_format ("%.1f", habilidade.b_amt/habilidade.counter*100).."%") --> ..habilidade.b_dmg - if (habilidade.b_dmg < 1) then - SpellInfoLabels.block:SetTextColor (0.5, 0.5, 0.5) - else - SpellInfoLabels.block:SetTextColor (1, 1, 1) - end - - SpellInfoLabels.glancing:SetText ("Glancing: "..habilidade.g_amt.. " (".._string_format ("%.1f", habilidade.g_amt/habilidade.counter*100).."%)") --> localize-me - if (habilidade.g_amt < 1) then - SpellInfoLabels.glancing:SetTextColor (0.5, 0.5, 0.5) - else - SpellInfoLabels.glancing:SetTextColor (1, 1, 1) - end - - --> BUFFS - - local HabilidadeDetails = habilidade.BuffTable - if (not HabilidadeDetails) then - print ("!buffs -> !habilidade.BuffTable") - return - end - - local BuffTextEntry = SpellDetails.BuffTextEntry --> { 1,2,3,4 } - --local SoloBuffUptime = _detalhes.SoloTables.SoloBuffUptime - local SoloBuffUptime = _detalhes.Buffs.BuffsTable - - for BuffName, BuffTable in _pairs (_detalhes.Buffs.BuffsTable) do - local tabela = HabilidadeDetails [BuffName] - if (tabela) then - local EntryObject = BuffIndex [BuffName] - if (EntryObject) then - - local tempo = MySelf:Tempo() - local EntryObject = BuffIndex [BuffName] - EntryObject.amtdone:SetText ("Hits: "..tabela.counter) - - local duration = BuffTable.duration - if (BuffTable.active) then - if (not BuffTable.start) then - print ("BUFF " .. BuffTable.name.." sem START") - else - duration = duration + (_detalhes._tempo - BuffTable.start) - end - end - tempo = duration - - --SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." ".._math_floor (DebuffTable.duration).."s (".._math_floor (DebuffTable.duration/MySelf:Tempo()*100).."%) "..DebuffTable.castedAmt.."/"..DebuffTable.refreshAmt.."/"..DebuffTable.droppedAmt) --> localize-me - EntryObject.uptime:SetText (Loc ["STRING_UPTIME"]..":" .. " " .. _math_floor (tempo/MySelf:Tempo()*100).."%") --me _math_floor (BuffTable.duration).."s (".. - EntryObject.dps:SetText ("Dps: ".._detalhes:comma_value (_math_floor (tabela.total/tempo))) - - end - end - end - - end - -end - -function SpellDetails:OnEvent (_, event, ...) - - if (event == "ADDON_LOADED") then - local AddonName = select (1, ...) - if (AddonName == "Details_SpellDetails") then - - if (_G._detalhes) then - - --> create main plugin object - CreatePluginFrames (_detalhes_databaseSpellDetails) - - local MINIMAL_DETAILS_VERSION_REQUIRED = 1 - - --> Install plugin inside details - local install = _G._detalhes:InstallPlugin ("SOLO", Loc ["PLUGIN_NAME"], "Interface\\Icons\\INV_Fabric_Spellweave", SpellDetails, "DETAILS_PLUGIN_SPELL_DETAILS", MINIMAL_DETAILS_VERSION_REQUIRED, "Details! Team", "v1.08") - if (type (install) == "table" and install.error) then - print (install.error) - end - - --> Register needed events - _G._detalhes:RegisterEvent (SpellDetails, "COMBAT_PLAYER_TIMESTARTED") - - end - end - - elseif (event == "PLAYER_LOGOUT") then - _detalhes_databaseSpellDetails = SpellDetails.data - end -end diff --git a/plugins/Details_SpellDetails/Details_SpellDetails.toc b/plugins/Details_SpellDetails/Details_SpellDetails.toc deleted file mode 100644 index 70b04d2c..00000000 --- a/plugins/Details_SpellDetails/Details_SpellDetails.toc +++ /dev/null @@ -1,15 +0,0 @@ -## Interface: 50400 -## Title: Details Spells (plugin) -## Notes: Plugin for Details -## SavedVariablesPerCharacter: _detalhes_databaseSpellDetails -## RequiredDeps: Details -## OptionalDeps: Ace3 - -#@no-lib-strip@ -embeds.xml -#@end-no-lib-strip@ - -enUS.lua -ptBR.lua - -Details_SpellDetails.lua \ No newline at end of file diff --git a/plugins/Details_SpellDetails/Libs/AceLocale-3.0/AceLocale-3.0.lua b/plugins/Details_SpellDetails/Libs/AceLocale-3.0/AceLocale-3.0.lua deleted file mode 100644 index 2ecc0cb8..00000000 --- a/plugins/Details_SpellDetails/Libs/AceLocale-3.0/AceLocale-3.0.lua +++ /dev/null @@ -1,137 +0,0 @@ ---- **AceLocale-3.0** manages localization in addons, allowing for multiple locale to be registered with fallback to the base locale for untranslated strings. --- @class file --- @name AceLocale-3.0 --- @release $Id: AceLocale-3.0.lua 1035 2011-07-09 03:20:13Z kaelten $ -local MAJOR,MINOR = "AceLocale-3.0", 6 - -local AceLocale, oldminor = LibStub:NewLibrary(MAJOR, MINOR) - -if not AceLocale then return end -- no upgrade needed - --- Lua APIs -local assert, tostring, error = assert, tostring, error -local getmetatable, setmetatable, rawset, rawget = getmetatable, setmetatable, rawset, rawget - --- Global vars/functions that we don't upvalue since they might get hooked, or upgraded --- List them here for Mikk's FindGlobals script --- GLOBALS: GAME_LOCALE, geterrorhandler - -local gameLocale = GetLocale() -if gameLocale == "enGB" then - gameLocale = "enUS" -end - -AceLocale.apps = AceLocale.apps or {} -- array of ["AppName"]=localetableref -AceLocale.appnames = AceLocale.appnames or {} -- array of [localetableref]="AppName" - --- This metatable is used on all tables returned from GetLocale -local readmeta = { - __index = function(self, key) -- requesting totally unknown entries: fire off a nonbreaking error and return key - rawset(self, key, key) -- only need to see the warning once, really - geterrorhandler()(MAJOR..": "..tostring(AceLocale.appnames[self])..": Missing entry for '"..tostring(key).."'") - return key - end -} - --- This metatable is used on all tables returned from GetLocale if the silent flag is true, it does not issue a warning on unknown keys -local readmetasilent = { - __index = function(self, key) -- requesting totally unknown entries: return key - rawset(self, key, key) -- only need to invoke this function once - return key - end -} - --- Remember the locale table being registered right now (it gets set by :NewLocale()) --- NOTE: Do never try to register 2 locale tables at once and mix their definition. -local registering - --- local assert false function -local assertfalse = function() assert(false) end - --- This metatable proxy is used when registering nondefault locales -local writeproxy = setmetatable({}, { - __newindex = function(self, key, value) - rawset(registering, key, value == true and key or value) -- assigning values: replace 'true' with key string - end, - __index = assertfalse -}) - --- This metatable proxy is used when registering the default locale. --- It refuses to overwrite existing values --- Reason 1: Allows loading locales in any order --- Reason 2: If 2 modules have the same string, but only the first one to be --- loaded has a translation for the current locale, the translation --- doesn't get overwritten. --- -local writedefaultproxy = setmetatable({}, { - __newindex = function(self, key, value) - if not rawget(registering, key) then - rawset(registering, key, value == true and key or value) - end - end, - __index = assertfalse -}) - ---- Register a new locale (or extend an existing one) for the specified application. --- :NewLocale will return a table you can fill your locale into, or nil if the locale isn't needed for the players --- game locale. --- @paramsig application, locale[, isDefault[, silent]] --- @param application Unique name of addon / module --- @param locale Name of the locale to register, e.g. "enUS", "deDE", etc. --- @param isDefault If this is the default locale being registered (your addon is written in this language, generally enUS) --- @param silent If true, the locale will not issue warnings for missing keys. Must be set on the first locale registered. If set to "raw", nils will be returned for unknown keys (no metatable used). --- @usage --- -- enUS.lua --- local L = LibStub("AceLocale-3.0"):NewLocale("TestLocale", "enUS", true) --- L["string1"] = true --- --- -- deDE.lua --- local L = LibStub("AceLocale-3.0"):NewLocale("TestLocale", "deDE") --- if not L then return end --- L["string1"] = "Zeichenkette1" --- @return Locale Table to add localizations to, or nil if the current locale is not required. -function AceLocale:NewLocale(application, locale, isDefault, silent) - - -- GAME_LOCALE allows translators to test translations of addons without having that wow client installed - local gameLocale = GAME_LOCALE or gameLocale - - local app = AceLocale.apps[application] - - if silent and app and getmetatable(app) ~= readmetasilent then - geterrorhandler()("Usage: NewLocale(application, locale[, isDefault[, silent]]): 'silent' must be specified for the first locale registered") - end - - if not app then - if silent=="raw" then - app = {} - else - app = setmetatable({}, silent and readmetasilent or readmeta) - end - AceLocale.apps[application] = app - AceLocale.appnames[app] = application - end - - if locale ~= gameLocale and not isDefault then - return -- nop, we don't need these translations - end - - registering = app -- remember globally for writeproxy and writedefaultproxy - - if isDefault then - return writedefaultproxy - end - - return writeproxy -end - ---- Returns localizations for the current locale (or default locale if translations are missing). --- Errors if nothing is registered (spank developer, not just a missing translation) --- @param application Unique name of addon / module --- @param silent If true, the locale is optional, silently return nil if it's not found (defaults to false, optional) --- @return The locale table for the current language. -function AceLocale:GetLocale(application, silent) - if not silent and not AceLocale.apps[application] then - error("Usage: GetLocale(application[, silent]): 'application' - No locales registered for '"..tostring(application).."'", 2) - end - return AceLocale.apps[application] -end diff --git a/plugins/Details_SpellDetails/Libs/AceLocale-3.0/AceLocale-3.0.xml b/plugins/Details_SpellDetails/Libs/AceLocale-3.0/AceLocale-3.0.xml deleted file mode 100644 index d69dbb13..00000000 --- a/plugins/Details_SpellDetails/Libs/AceLocale-3.0/AceLocale-3.0.xml +++ /dev/null @@ -1,4 +0,0 @@ - -