From f7dccde8b9e679cd41dd54ec373c7810ab994553 Mon Sep 17 00:00:00 2001 From: Tercio Date: Mon, 21 Sep 2015 18:30:01 -0300 Subject: [PATCH] - Added an options to use a customized skin file. - Added an options to use a customized bar texture file. - A Package with photoshop files with examples and the skin file for Minimalistic skin are available at WoW Interface. - Added 'API Custom Displays.txt' on Details! folder, this file explain how to create scripts for custom displays. --- API Custom Displays.txt | 134 +++++++++++++++++++++ API UI.txt | 6 +- boot.lua | 34 ++---- classes/classe_custom.lua | 19 +++ classes/classe_damage.lua | 4 + classes/classe_instancia_include.lua | 3 + gumps/janela_options.lua | 169 +++++++++++++++++++++++---- gumps/janela_principal.lua | 35 +++++- images/skins/classic_skin_v1.tga | Bin 129254 -> 126517 bytes 9 files changed, 354 insertions(+), 50 deletions(-) create mode 100644 API Custom Displays.txt diff --git a/API Custom Displays.txt b/API Custom Displays.txt new file mode 100644 index 00000000..e7d0b2fa --- /dev/null +++ b/API Custom Displays.txt @@ -0,0 +1,134 @@ + +A custom display is made with 4 scripts: + +Required: +Search - this is the main script, it's responsible to build a list of players to be show in the window. + +Optional: +Tooltip - it run when the user hover over a bar. +Total - runs when showing the bar, and helps format the total done. +Percent - also runs when showing the bar, it formats the percentage amount. + + +Search Code: +- The script receives 3 parameters: *Combat, *Container and *Instance. +*Combat - is the reference for the selected combat shown in the window (the one selected on segments menu). +*Container - is the place where the display mantain stored the results, Details! get the content inside the container and use to update the window. +*Instance - is the reference of the window where the custom display is being shown. + +- Also, the script must return three values: total made by all players, the amount of the top player and the amount of players found by the script. +- The search script basicaly begins getting these three parameters and declaring our three return values: + +local combat, instance_container, instance = ... +local total, top, amount = 0, 0, 0 + +- Then, we build our search for wherever we want to show, here we are building an example for Damage Done by Pets and Guardians. +- So, as we are working with damage, we want to get a list of Actors from the Damage Container of the combat and iterate it with ipairs: + +local damage_container = combat:GetActorList( DETAILS_ATTRIBUTE_DAMAGE ) +for i, actor in ipairs( damage_container ) do + --do stuff +end + +- Actor, can be anything, a monster, player, boss, etc, so, we need to check if actor is a pet: + +if (actor:IsPetOrGuardian()) then + --do stuff +end + +- Now we found a pet, we need to get the damage done and find who is the owner of this pet, after that, we also need to check if the owner is a player: + +local petOwner = actor.owner +if (petOwner:IsPlayer()) then + local petDamage = actor.total +end + +- The next step is add the pet owner into the Container: + +Container:AddValue (petOwner, petDamage) + +- And in the and, we need to get the total, top and amount values. This is generally calculated inside our loop above, but just calling the API for the result is more handy: + +total, top = Container:GetTotalAndHighestValue() +amount = Container:GetNumActors() +return total, top, amount + + +The finished script looks like this: + +local Combat, Container, Instance = ... +local total, top, amount = 0, 0, 0 + +local damage_container = Combat:GetActorList( DETAILS_ATTRIBUTE_DAMAGE ) +for i, actor in ipairs( damage_container ) do + if (actor:IsPetOrGuardian()) then + local petOwner = actor.owner + if (petOwner:IsPlayer()) then + local petDamage = actor.total + Container:AddValue( petOwner, petDamage ) + end + end +end + +total, top = Container:GetTotalAndHighestValue() +amount = Container:GetNumActors() + +return total, top, amount + + +Tooltip Code: +- The script receives 3 parameters: *Actor, *Combat and *Instance. This script has no return value. +*Actor - in our case, actor is the petOwner. + +local Actor, Combat, Instance = ... +local Format = Details:GetCurrentToKFunction() + +- What we want where is show all pets the player used in the combat and how much damage each one made. +- The member .pets gives us a table with pet names that belongs to the actor. + +local actorPets = Actor.pets + +- Next move is iterate this table and get the pet actor from the combat. +- In Details! always use ">= 1" not "> 0", also when not using our format functions, use at least floor() + +for i, petName in ipairs( actorPets ) do + local petActor = Combat( DETAILS_ATTRIBUTE_DAMAGE, petName) + if (petActor and petActor.total >= 1) then + --do stuff + end +end + +- With the pet in hands, what we have to do now is add this pet to our tooltip. +- Details! uses 'GameCooltip' which is slight different than 'GameTooltip': + +GameCooltip:AddLine( petName, Format( nil, petActor.total ) ) +Details:AddTooltipBackgroundStatusbar() + + +The finished script looks like this: + +local Actor, Combat, Instance = ... +local Format = Details:GetCurrentToKFunction() + +local actorPets = Actor.pets + +for i, petName in ipairs( actorPets ) do + local petActor = Combat( DETAILS_ATTRIBUTE_DAMAGE, petName) + if (petActor and petActor.total >= 1) then + GameCooltip:AddLine( petName, Format( nil, petActor.total ) ) + Details:AddTooltipBackgroundStatusbar() + end +end + + + +Total Code and Percent Code: +- Details! build the total and the percent automatically, these scripts are for special cases where you want to show something different, e.g. convert total into seconds/minutes. +- Both scripts receives 5 parameters, three are new to us: +*Value - the total made by this actor. +*Top - the value made by the rank 1 actor. +*Total - the total made by all actors. + +local value, top, total, combat, instance = ... +local result = floor (value) +return total \ No newline at end of file diff --git a/API UI.txt b/API UI.txt index 1757f977..4c91aa19 100644 --- a/API UI.txt +++ b/API UI.txt @@ -94,7 +94,7 @@ width = number, most of the times is ignored due to anchors settings. height = number, most of the times is ignored due to anchors settings. overlay = table {r, b, g, a} -instance:SetBarSettings (height, texture, colorclass, fixedcolor, backgroundtexture, backgroundcolorclass, backgroundfixedcolor, alpha, iconfile, barstart, spacement) +instance:SetBarSettings (height, texture, colorclass, fixedcolor, backgroundtexture, backgroundcolorclass, backgroundfixedcolor, alpha, iconfile, barstart, spacement, customtexture) height = number, the height of the bars. texture = texture name (SharedMedia), used on the statubar bar. colorclass = boolean, if true, the bar is painted with the player's class color. @@ -106,6 +106,10 @@ alpha = number. iconfile = string, icon file path to be used on bars. barstart = boolean, if true the bar attaches on the right side of the icon, else, on the left side (useful for transparent icons). spacement = number, how much space between bars. +customtexture = string, file name of a .tga file inside WoW/Interface/ folder. + +instance:SetUserCustomSkinFile (filename) +filename = string, name of the .tga file inside Interface folder to be used as the skin texture. instance:SetBarModel (upper_enabled, upper_model, upper_alpha, lower_enabled, lower_model, lower_alpha) upper_enabled = boolean diff --git a/boot.lua b/boot.lua index 4c007d9e..d9722a08 100644 --- a/boot.lua +++ b/boot.lua @@ -3,8 +3,8 @@ _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0") - _detalhes.build_counter = 1947 --it's 1946 for release - _detalhes.userversion = "v4.0i" + _detalhes.build_counter = 1959 --it's 1989 for release + _detalhes.userversion = "v4.0.1" _detalhes.realversion = 75 --core version _detalhes.version = _detalhes.userversion .. " (core " .. _detalhes.realversion .. ")" Details = _detalhes @@ -21,34 +21,16 @@ do local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) --[[ -|cFFFFFF00v3.19.0 (|cFFFFCC00Aug 21, 2015|r|cFFFFFF00)|r:\n\n -|cFFFFFF00-|r Updated Details! Framework.\n\n -|cFFFFFF00-|r Added option in order to change the bar orientation.\n\n -|cFFFFFF00-|r Added an option to make the menus on title bar work with clicks instead of hovering over them.\n\n -|cFFFFFF00-|r Fixed death display tooltip, wasn't respecting the font and size set on options panel.\n\n -|cFFFFFF00-|r Improvements on our support for Arena battles.\n\n -|cFFFFFF00-|r Fixed some issues on the Player Detail Window.\n\n -|cFFFFFF00-|r Healing for battleground enemies is now placed on healing done instead of enemy healing done.\n\n - -|cFFFFFF00-|r Fixed a rare bug where the window for Encounter Details Plugin won't open when clicking on its icon.\n\n -|cFFFFFF00-|r Fixed death display color when not using colored by the player class.\n\n -|cFFFFFF00-|r Fixed encounter time on title bar text.\n\n -|cFFFFFF00-|r Added officer channel to 'Announce Death' feature.\n\n - -|cFFFFFF00-|r Solo Plugins now has a close button on their panels.\n\n -|cFFFFFF00-|r Added a custom display for Crowd Control Received.\n\n -|cFFFFFF00-|r Weak Aura Creator Tool, now has full support for BigWigs and Dbm time bars.\n\n -|cFFFFFF00-|r Auras for interrupt and dispelling has been added on the Weak Aura Creator Tool.\n\n -|cFFFFFF00-|r Details! Forge now has support for DBM and BigWigs time bars.\n\n -|cFFFFFF00-|r Fixed damage/healing score message after a boss kill.\n\n -|cFFFFFF00-|r Now, an alert to open the history panel is shown after killing a boss.\n\n -|cFFFFFF00-|r Added a 'all-displays' menu when right clicking title bar.\n\n -|cFFFFFF00-|r Removed few texture from bookmarks panel, now it has a more clean appearance.\n\n +|cFFFFFF00v4.0.1 (|cFFFFCC00Set 21, 2015|r|cFFFFFF00)|r:\n\n +|cFFFFFF00-|r Added an options to use a customized skin file.\n\n +|cFFFFFF00-|r Added an options to use a customized bar texture file.\n\n +|cFFFFFF00-|r A Package with photoshop files with examples and the skin file for Minimalistic skin are available at WoW Interface.\n\n +|cFFFFFF00-|r Added 'API Custom Displays.txt' on Details! folder, this file explain how to create scripts for custom displays.\n\n --]] -- - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v4.0h (|cFFFFCC00Set 19, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Created new plugin 'Target Caller' for RBGs, it's available at Curse.com.\n\n|cFFFFFF00-|r Fixed death display color when not using colored by the player class.\n\n|cFFFFFF00-|r Fixed a rare bug where the window for Encounter Details Plugin won't open when clicking on its icon.\n\n|cFFFFFF00-|r Added officer channel to 'Announce Death' feature.\n\n|cFFFFFF00v4.0f (|cFFFFCC00Set 16, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for the title bar encounter timer.\n\n|cFFFFFF00v4.0e (|cFFFFCC00Set 14, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added a custom display for Crowd Control Received.\n\n|cFFFFFF00-|r Weak Aura Creator Tool, now has full support for BigWigs and Dbm time bars.\n\n|cFFFFFF00-|r Auras for interrupt and dispelling has been added on the Weak Aura Creator Tool.\n\n|cFFFFFF00-|r Details! Forge now has support for DBM and BigWigs time bars.\n\n|cFFFFFF00-|r Solo Plugins now has a close button on their panels.\n\n|cFFFFFF00-|r Fixed damage/healing score message after a boss kill.\n\n|cFFFFFF00-|r Now, an alert to open the history panel is shown after killing a boss.\n\n|cFFFFFF00-|r Added a 'all-displays' menu when right clicking title bar.\n\n|cFFFFFF00-|r Removed few texture from bookmarks panel, now it has a more clean appearance.\n\n|cFFFFFF00-|r Updated Details! Framework.\n\n|cFFFFFF00-|r Added option in order to change the bar orientation.\n\n|cFFFFFF00-|r Added an option to make the menus on title bar work with clicks instead of hovering over them.\n\n|cFFFFFF00-|r Healing for battleground enemies is now placed on healing done instead of enemy healing done.\n\n|cFFFFFF00-|r Improvements on our support for Arena battles.\n\n|cFFFFFF00-|r Fixed some issues on the Player Detail Window.\n\n|cFFFFFF00-|r Fixed encounter time on title bar text.\n\n|cFFFFFF00-|r Fixed death display tooltip, wasn't respecting the font and size set on options panel.\n\n|cFFFFFF00v3.18.5 (|cFFFFCC00Aug 19, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Improvements on Weakauras creation from Encounter Details plugin.\n\n|cFFFFFF00-|r Improvements on 'Auto Switch to Current' feature. Details! windows are now more responsible about auto changing a segment while the player, for instance, has the report window opened.\n\n|cFFFFFF00-|r Added slash command '/de wipe'. It ends the raid encounter segment and stop capturing data.\nIf you are the raid leader, all other users of Details! will also stop.\nWorks great for players not make damage padding after a wipe call.\n\n|cFFFFFF00-|r Added the overheal made by pets on tooltip and player details window.\n\n|cFFFFFF00-|r Added an option to disable stretch button and bar highlight.\n\n|cFFFFFF00-|r Disabling nicknames now also disable avatars.\n\n|cFFFFFF00-|r Added 'spinal healing injector' on custom display 'Health Potion & Stone' used.\n\n|cFFFFFF00-|r Fixed title text width when auto-hide menu buttons is enabled.\n\n|cFFFFFF00-|r Fixed item level of timewarped items.\n\n|cFFFFFF00-|r Fixed report for custom display Crowd Control.\n\n|cFFFFFF00-|r Fixed role icons on custom displays.\n\n|cFFFFFF00-|r Fixed an issue with dropdown boxes where wasn't showing all options.\n\n|cFFFFFF00-|r Fixed Ticket #53: background alpha after stretching which wasn't correctly coming back to original color.\n\n|cFFFFFF00-|r Fixed ticket #51: API Call 'GetCombat('overall')' wasn't returning the overall combat object.\n\n|cFFFFFF00-|r Fixed ticket #50: issue opening icon selection frame.\n\n|cFFFFFF00v3.17.12 (|cFFFFCC00Aug 05, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option for lock micro displays. When locked they don't interact with mouse or stay on top of menus.\n\n|cFFFFFF00-|r Fixed ticket #49: death display not working correctly with sort direction bottom-to-top.\n\n|cFFFFFF00-|r Fixed an issue with death display where the text wasn't updating their width correctly.\n\n|cFFFFFF00-|r Fixed an issue with energy and miscellaneous displays type not working correctly with bar animations.\n\n|cFFFFFF00-|r Fixed an issue while loading old profiles wans't updating their values for newer versions of the addon.\n\n|cFFFFFF00-|r Fixed an issue with bookmarks panel not opening correctly.\n\n|cFFFFFF00v3.17.10 (|cFFFFCC00Aug 02, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed ticket #47: Title bar font resets with UI reload / relog.\n\n|cFFFFFF00-|r Fixed ticket #46: Icon select panel wasn't opening.\n\n|cFFFFFF00-|r Fixed ticket #45: Windwalker icon for Mistweaver monks.\n\n|cFFFFFF00-|r Fixed issue with vehicles exchanging ownership, e.g. Soulbound Constructor on HFC raid.\n\n|cFFFFFF00v3.17.6 (|cFFFFCC00Jul 16, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Major improvements on the aura tool creation for WeakAuras.\n\n|cFFFFFF00-|r Fixed some issues with spec icons where sometimes it shows four small icons.\n\n|cFFFFFF00-|r Added an option to show a stopwatch on the title text showing the elapsed time of an encounter.\n\n|cFFFFFF00-|r Window title text now shrinks correctly when isn't enough space for it.\n\n|cFFFFFF00-|r For some special cases, left click now open the report window and shift+click shows the tooltip content in the window.\n\n|cFFFFFF00-|r Damage Taken by Spells now are a part of Damage bracket (no more on custom).\n\n|cFFFFFF00-|r Fixed custom functions for the customized bar left text.\n\n|cFFFFFF00-|r Improvements on report text format and also reverse option now works as intended.\n\n|cFFFFFF00-|r Removed the option for report only what is shown in the window.\n\n|cFFFFFF00-|r Added skins for report panel, the skin follow the skin selected for Player Detail Window.\n\n|cFFFFFF00v3.16.0c (|cFFFFCC00Jul 06, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with Encounter Details graphic for Archimonde encounter.\n\n|cFFFFFF00-|r Numbers format on Player Detail Window now respect the format chosen on options panel.\n\n|cFFFFFF00-|r Removed pet icons on Player Detail Window.\n\n|cFFFFFF00-|r Fixed some wrong textures on spec icons.\n\n|cFFFFFF00-|r Improvements on all skins for the Player Detail Window.\n\n|cFFFFFF00v3.15.8b (|cFFFFCC00Jul 01, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Soul Capacitor trinket fix.\n\n|cFFFFFF00-|r Fixed several small bugs from 6.2 patch.\n\n|cFFFFFF00-|r Disabled the special behavior for Tyrant Velhari encounter.\n\n|cFFFFFF00v3.15.7 (|cFFFFCC00Jun 23, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added support for Hellfire Citadel raid.\n\n|cFFFFFF00-|r Added support for custom CLEU parser functions.\n\n|cFFFFFF00-|r Tyrant Velhari encounter now has a custom CLEU parser function for healing where the heal absorbed by Aura of Contempt will count towards overheal and not healing done.\n\n|cFFFFFF00-|r Added support for embed on Chat Tabs.\n\n|cFFFFFF00-|r |cFFAAFFAAPS: We've made an addon for Shadow-Lord Iskar encounter called 'Iskar Assist' check it out|r.\n\n|cFFFFFF00v3.15.5a (|cFFFFCC00Jun 12, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue where sometimes tooltips wasn't being shown.\n\n|cFFFFFF00-|r Fixed a problem with overall data where it was using, even on dungoens, the raid-only 30 delay rule.\n\n|cFFFFFF00-|r Fixed an issue with spec detection (now it may detect even faster).\n\n|cFFFFFF00v3.15.5 (|cFFFFCC00Jun 09, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed a problem with auto hide feature not hiding plugins hosted by the window.\n\n|cFFFFFF00-|r Fixed an issue with stretch feature when the anchor button was anchored at the bottom side of the window." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v4.0.1 (|cFFFFCC00Set 21, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an options to use a customized skin file.\n\n|cFFFFFF00-|r Added an options to use a customized bar texture file.\n\n|cFFFFFF00-|r A Package with photoshop files with examples and the skin file for Minimalistic skin are available at WoW Interface.\n\n|cFFFFFF00-|r Added 'API Custom Displays.txt' on Details! folder, this file explain how to create scripts for custom displays.\n\n|cFFFFFF00v4.0h (|cFFFFCC00Set 19, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Created new plugin 'Target Caller' for RBGs, it's available at Curse.com.\n\n|cFFFFFF00-|r Fixed death display color when not using colored by the player class.\n\n|cFFFFFF00-|r Fixed a rare bug where the window for Encounter Details Plugin won't open when clicking on its icon.\n\n|cFFFFFF00-|r Added officer channel to 'Announce Death' feature.\n\n|cFFFFFF00v4.0f (|cFFFFCC00Set 16, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fix for the title bar encounter timer.\n\n|cFFFFFF00v4.0e (|cFFFFCC00Set 14, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added a custom display for Crowd Control Received.\n\n|cFFFFFF00-|r Weak Aura Creator Tool, now has full support for BigWigs and Dbm time bars.\n\n|cFFFFFF00-|r Auras for interrupt and dispelling has been added on the Weak Aura Creator Tool.\n\n|cFFFFFF00-|r Details! Forge now has support for DBM and BigWigs time bars.\n\n|cFFFFFF00-|r Solo Plugins now has a close button on their panels.\n\n|cFFFFFF00-|r Fixed damage/healing score message after a boss kill.\n\n|cFFFFFF00-|r Now, an alert to open the history panel is shown after killing a boss.\n\n|cFFFFFF00-|r Added a 'all-displays' menu when right clicking title bar.\n\n|cFFFFFF00-|r Removed few texture from bookmarks panel, now it has a more clean appearance.\n\n|cFFFFFF00-|r Updated Details! Framework.\n\n|cFFFFFF00-|r Added option in order to change the bar orientation.\n\n|cFFFFFF00-|r Added an option to make the menus on title bar work with clicks instead of hovering over them.\n\n|cFFFFFF00-|r Healing for battleground enemies is now placed on healing done instead of enemy healing done.\n\n|cFFFFFF00-|r Improvements on our support for Arena battles.\n\n|cFFFFFF00-|r Fixed some issues on the Player Detail Window.\n\n|cFFFFFF00-|r Fixed encounter time on title bar text.\n\n|cFFFFFF00-|r Fixed death display tooltip, wasn't respecting the font and size set on options panel.\n\n|cFFFFFF00v3.18.5 (|cFFFFCC00Aug 19, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Improvements on Weakauras creation from Encounter Details plugin.\n\n|cFFFFFF00-|r Improvements on 'Auto Switch to Current' feature. Details! windows are now more responsible about auto changing a segment while the player, for instance, has the report window opened.\n\n|cFFFFFF00-|r Added slash command '/de wipe'. It ends the raid encounter segment and stop capturing data.\nIf you are the raid leader, all other users of Details! will also stop.\nWorks great for players not make damage padding after a wipe call.\n\n|cFFFFFF00-|r Added the overheal made by pets on tooltip and player details window.\n\n|cFFFFFF00-|r Added an option to disable stretch button and bar highlight.\n\n|cFFFFFF00-|r Disabling nicknames now also disable avatars.\n\n|cFFFFFF00-|r Added 'spinal healing injector' on custom display 'Health Potion & Stone' used.\n\n|cFFFFFF00-|r Fixed title text width when auto-hide menu buttons is enabled.\n\n|cFFFFFF00-|r Fixed item level of timewarped items.\n\n|cFFFFFF00-|r Fixed report for custom display Crowd Control.\n\n|cFFFFFF00-|r Fixed role icons on custom displays.\n\n|cFFFFFF00-|r Fixed an issue with dropdown boxes where wasn't showing all options.\n\n|cFFFFFF00-|r Fixed Ticket #53: background alpha after stretching which wasn't correctly coming back to original color.\n\n|cFFFFFF00-|r Fixed ticket #51: API Call 'GetCombat('overall')' wasn't returning the overall combat object.\n\n|cFFFFFF00-|r Fixed ticket #50: issue opening icon selection frame.\n\n|cFFFFFF00v3.17.12 (|cFFFFCC00Aug 05, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added an option for lock micro displays. When locked they don't interact with mouse or stay on top of menus.\n\n|cFFFFFF00-|r Fixed ticket #49: death display not working correctly with sort direction bottom-to-top.\n\n|cFFFFFF00-|r Fixed an issue with death display where the text wasn't updating their width correctly.\n\n|cFFFFFF00-|r Fixed an issue with energy and miscellaneous displays type not working correctly with bar animations.\n\n|cFFFFFF00-|r Fixed an issue while loading old profiles wans't updating their values for newer versions of the addon.\n\n|cFFFFFF00-|r Fixed an issue with bookmarks panel not opening correctly.\n\n|cFFFFFF00v3.17.10 (|cFFFFCC00Aug 02, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed ticket #47: Title bar font resets with UI reload / relog.\n\n|cFFFFFF00-|r Fixed ticket #46: Icon select panel wasn't opening.\n\n|cFFFFFF00-|r Fixed ticket #45: Windwalker icon for Mistweaver monks.\n\n|cFFFFFF00-|r Fixed issue with vehicles exchanging ownership, e.g. Soulbound Constructor on HFC raid.\n\n|cFFFFFF00v3.17.6 (|cFFFFCC00Jul 16, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Major improvements on the aura tool creation for WeakAuras.\n\n|cFFFFFF00-|r Fixed some issues with spec icons where sometimes it shows four small icons.\n\n|cFFFFFF00-|r Added an option to show a stopwatch on the title text showing the elapsed time of an encounter.\n\n|cFFFFFF00-|r Window title text now shrinks correctly when isn't enough space for it.\n\n|cFFFFFF00-|r For some special cases, left click now open the report window and shift+click shows the tooltip content in the window.\n\n|cFFFFFF00-|r Damage Taken by Spells now are a part of Damage bracket (no more on custom).\n\n|cFFFFFF00-|r Fixed custom functions for the customized bar left text.\n\n|cFFFFFF00-|r Improvements on report text format and also reverse option now works as intended.\n\n|cFFFFFF00-|r Removed the option for report only what is shown in the window.\n\n|cFFFFFF00-|r Added skins for report panel, the skin follow the skin selected for Player Detail Window.\n\n|cFFFFFF00v3.16.0c (|cFFFFCC00Jul 06, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with Encounter Details graphic for Archimonde encounter.\n\n|cFFFFFF00-|r Numbers format on Player Detail Window now respect the format chosen on options panel.\n\n|cFFFFFF00-|r Removed pet icons on Player Detail Window.\n\n|cFFFFFF00-|r Fixed some wrong textures on spec icons.\n\n|cFFFFFF00-|r Improvements on all skins for the Player Detail Window.\n\n|cFFFFFF00v3.15.8b (|cFFFFCC00Jul 01, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Soul Capacitor trinket fix.\n\n|cFFFFFF00-|r Fixed several small bugs from 6.2 patch.\n\n|cFFFFFF00-|r Disabled the special behavior for Tyrant Velhari encounter.\n\n|cFFFFFF00v3.15.7 (|cFFFFCC00Jun 23, 2015|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Added support for Hellfire Citadel raid.\n\n|cFFFFFF00-|r Added support for custom CLEU parser functions.\n\n|cFFFFFF00-|r Tyrant Velhari encounter now has a custom CLEU parser function for healing where the heal absorbed by Aura of Contempt will count towards overheal and not healing done.\n\n|cFFFFFF00-|r Added support for embed on Chat Tabs.\n\n|cFFFFFF00-|r |cFFAAFFAAPS: We've made an addon for Shadow-Lord Iskar encounter called 'Iskar Assist' check it out|r." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails!:|r " diff --git a/classes/classe_custom.lua b/classes/classe_custom.lua index 8e047579..574b8848 100644 --- a/classes/classe_custom.lua +++ b/classes/classe_custom.lua @@ -752,6 +752,25 @@ actors.new_actor.classe = actors.actor.classe end + function atributo_custom:HasActor (actor) + return self._NameIndexTable [actor.nome or actor.name] and true or false + end + + function atributo_custom:GetNumActors() + return #self._ActorTable + end + + function atributo_custom:GetTotalAndHighestValue() + local total, top = 0, 0 + for i, actor in ipairs (self._ActorTable) do + if (actor.value > top) then + top = actor.value + end + total = total + actor.value + end + return total, top + end + local icon_cache = {} function atributo_custom:GetActorTable (actor, name_complement) diff --git a/classes/classe_damage.lua b/classes/classe_damage.lua index a5021380..03219e29 100644 --- a/classes/classe_damage.lua +++ b/classes/classe_damage.lua @@ -157,6 +157,10 @@ return self.grupo end +--[[ exported]] function _detalhes:IsPetOrGuardian() + return self.owner and true or false + end + --[[ exported]] function _detalhes:IsPlayer() if (self.flag_original) then if (_bit_band (self.flag_original, OBJECT_TYPE_PLAYER) ~= 0) then diff --git a/classes/classe_instancia_include.lua b/classes/classe_instancia_include.lua index 04455aa5..99cd04b0 100644 --- a/classes/classe_instancia_include.lua +++ b/classes/classe_instancia_include.lua @@ -95,6 +95,7 @@ _detalhes.instance_defaults = { ignore_mass_showhide = false, --skin skin = _detalhes.default_skin_to_use, + skin_custom = "", --scale window_scale = 1.0, libwindow = {}, @@ -203,8 +204,10 @@ _detalhes.instance_defaults = { font_face_file = SharedMedia:Fetch ("font", "Arial Narrow"), --bar texture texture = "Details D'ictum", + texture_custom = "", --bar texture name texture_file = [[Interface\AddOns\Details\images\bar4]], + texture_custom_file = "Interface\\", --bar texture on mouse over texture_highlight = [[Interface\FriendsFrame\UI-FriendsList-Highlight]], --bar background texture diff --git a/gumps/janela_options.lua b/gumps/janela_options.lua index 62979f10..32db90c7 100644 --- a/gumps/janela_options.lua +++ b/gumps/janela_options.lua @@ -4847,6 +4847,63 @@ function window:CreateFrame3() local frame3 = window.options [3][1] + --> custom skin texture + local custom_texture = g:NewTextEntry (frame3, _, "$parentCustomTextureEntry", "CustomTextureEntry", 120, TEXTENTRY_HEIGHT, nil, nil, nil, nil, nil, options_dropdown_template) + local custom_texture_label = g:NewLabel (frame3, _, "$parentCustomTextureLabel", "CustomTextureLabel", Loc ["STRING_CUSTOM_SKIN_TEXTURE"], "GameFontHighlightLeft") + custom_texture:SetPoint ("left", custom_texture_label, "right", 2, 0) + + custom_texture:SetHook ("OnEnterPressed", function() + local instance = _G.DetailsOptionsWindow.instance + local file_name = custom_texture.text + + instance:SetUserCustomSkinFile (file_name) + + if (_detalhes.options_group_edit and not DetailsOptionsWindow.loading_settings) then + for _, this_instance in ipairs (instance:GetInstanceGroup()) do + if (this_instance ~= instance) then + this_instance:SetUserCustomSkinFile (file_name) + end + end + end + + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end) + + window:CreateLineBackground2 (frame3, "CustomTextureEntry", "CustomTextureLabel", Loc ["STRING_CUSTOM_SKIN_TEXTURE_DESC"]) + + local custom_texture_cancel = g:NewButton (frame3.CustomTextureEntry, _, "$parentCustomTextureCancel", "CustomTextureCancel", 20, 20, function (self) + local instance = _G.DetailsOptionsWindow.instance + + instance:SetUserCustomSkinFile ("") + + if (_detalhes.options_group_edit and not DetailsOptionsWindow.loading_settings) then + for _, this_instance in ipairs (instance:GetInstanceGroup()) do + if (this_instance ~= instance) then + this_instance:SetUserCustomSkinFile ("") + end + end + end + + custom_texture:SetText ("") + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end) + custom_texture_cancel:SetPoint ("left", frame3.CustomTextureEntry, "right", 2, 0) + custom_texture_cancel:SetNormalTexture ([[Interface\Buttons\UI-GroupLoot-Pass-Down]]) + custom_texture_cancel:SetPushedTexture ([[Interface\Buttons\UI-GroupLoot-Pass-Up]]) + custom_texture_cancel:GetNormalTexture():SetDesaturated (true) + custom_texture_cancel.tooltip = "Stop using the custom texture" + custom_texture_cancel:SetHook ("OnEnter", function (self, capsule) + self:GetNormalTexture():SetBlendMode("ADD") + end) + custom_texture_cancel:SetHook ("OnLeave", function (self, capsule) + self:GetNormalTexture():SetBlendMode("BLEND") + end) + + + + + + --> import box function frame3:CreateImportBox() local textbox = g:NewSpecialLuaEditorEntry (frame3, 443, 80, "TextBox", "$parentTextBox", true) textbox:SetPoint ("bottomleft", frame3, "bottomleft", 30, 30) @@ -5000,7 +5057,8 @@ function window:CreateFrame3() local buildSkinMenu = function() local skinOptions = {} for skin_name, skin_table in pairs (_detalhes.skins) do - local desc = "Author: |cFFFFFFFF" .. skin_table.author .. "|r\nVersion: |cFFFFFFFF" .. skin_table.version .. "|r\nSite: |cFFFFFFFF" .. skin_table.site .. "|r\n\nDesc: |cFFFFFFFF" .. skin_table.desc .. "|r" + local file = skin_table.file:gsub ([[Interface\AddOns\Details\images\skins\]], "") + local desc = "Author: |cFFFFFFFF" .. skin_table.author .. "|r\nVersion: |cFFFFFFFF" .. skin_table.version .. "|r\nSite: |cFFFFFFFF" .. skin_table.site .. "|r\n\nDesc: |cFFFFFFFF" .. skin_table.desc .. "|r\n\nFile: |cFFFFFFFF" .. file .. ".tga|r" skinOptions [#skinOptions+1] = {value = skin_name, label = skin_name, onclick = onSelectSkin, icon = "Interface\\GossipFrame\\TabardGossipIcon", desc = desc} end return skinOptions @@ -5390,19 +5448,20 @@ function window:CreateFrame3() local left_side = { {"SkinSelectionAnchorLabel", 1, true}, {"skinLabel", 2}, - {"SkinPresetAnchorLabel", 3, true}, - {"saveSkinLabel", 4}, + {custom_texture_label, 3}, + {"SkinPresetAnchorLabel", 4, true}, + {"saveSkinLabel", 5}, - {"loadCustomSkinLabel", 5, true}, - {"removeCustomSkinLabel", 6}, - {"ExportCustomSkinLabel", 7}, + {"loadCustomSkinLabel", 6, true}, + {"removeCustomSkinLabel", 7}, + {"ExportCustomSkinLabel", 8}, - {"ImportButton", 9, true}, - {"makeDefault", 10}, - {"applyToAll", 11}, + {"ImportButton", 10, true}, + {"makeDefault", 11}, + {"applyToAll", 12}, - {"PDWAnchor", 12, true}, - {"PDWSkinLabel", 13}, + {"PDWAnchor", 13, true}, + {"PDWSkinLabel", 14}, } local right_side = { @@ -5606,6 +5665,69 @@ function window:CreateFrame4() frame4.textureDropdown:SetPoint ("left", frame4.textureLabel, "right", 2) window:CreateLineBackground2 (frame4, "textureDropdown", "textureLabel", Loc ["STRING_OPTIONS_BAR_TEXTURE_DESC"]) + + + + + --> custom bar texture + local custom_texture = g:NewTextEntry (frame4, _, "$parentCustomTextureEntry", "CustomTextureEntry", 120, TEXTENTRY_HEIGHT, nil, nil, nil, nil, nil, options_dropdown_template) + local custom_texture_label = g:NewLabel (frame4, _, "$parentCustomTextureLabel", "CustomTextureLabel", Loc ["STRING_OPTIONS_BARS_CUSTOM_TEXTURE"], "GameFontHighlightLeft") + custom_texture:SetPoint ("left", custom_texture_label, "right", 2, 0) + + custom_texture:SetHook ("OnEnterPressed", function() + local instance = _G.DetailsOptionsWindow.instance + local file_name = custom_texture.text + + instance:SetBarSettings (nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, file_name) + + if (_detalhes.options_group_edit and not DetailsOptionsWindow.loading_settings) then + for _, this_instance in ipairs (instance:GetInstanceGroup()) do + if (this_instance ~= instance) then + this_instance:SetBarSettings (nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, file_name) + end + end + end + + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end) + + window:CreateLineBackground2 (frame4, "CustomTextureEntry", "CustomTextureLabel", Loc ["STRING_CUSTOM_SKIN_TEXTURE_DESC"] .. Loc ["STRING_OPTIONS_BARS_CUSTOM_TEXTURE_DESC"]) + + local custom_texture_cancel = g:NewButton (frame4.CustomTextureEntry, _, "$parentCustomTextureCancel", "CustomTextureCancel", 20, 20, function (self) + local instance = _G.DetailsOptionsWindow.instance + + instance:SetBarSettings (nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, "") + + if (_detalhes.options_group_edit and not DetailsOptionsWindow.loading_settings) then + for _, this_instance in ipairs (instance:GetInstanceGroup()) do + if (this_instance ~= instance) then + this_instance:SetBarSettings (nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, "") + end + end + end + + custom_texture:SetText ("") + _detalhes:SendOptionsModifiedEvent (DetailsOptionsWindow.instance) + end) + custom_texture_cancel:SetPoint ("left", frame4.CustomTextureEntry, "right", 2, 0) + custom_texture_cancel:SetNormalTexture ([[Interface\Buttons\UI-GroupLoot-Pass-Down]]) + custom_texture_cancel:SetPushedTexture ([[Interface\Buttons\UI-GroupLoot-Pass-Up]]) + custom_texture_cancel:GetNormalTexture():SetDesaturated (true) + custom_texture_cancel.tooltip = "Stop using the custom texture" + custom_texture_cancel:SetHook ("OnEnter", function (self, capsule) + self:GetNormalTexture():SetBlendMode("ADD") + end) + custom_texture_cancel:SetHook ("OnLeave", function (self, capsule) + self:GetNormalTexture():SetBlendMode("BLEND") + end) + + + + + + + + -- row texture color local rowcolor_callback = function (button, r, g, b, a) _G.DetailsOptionsWindow.instance:SetBarSettings (nil, nil, nil, {r, g, b}) @@ -6020,18 +6142,19 @@ function window:CreateFrame4() --textures {frame4.rowUpperTextureLabel, 1, true}, {frame4.textureLabel, 2}, - {frame4.classColorsLabel, 3}, - {frame4.rowPickColorLabel, 4}, + {custom_texture_label, 3}, + {frame4.classColorsLabel, 4}, + {frame4.rowPickColorLabel, 5}, - {frame4.rowLowerTextureLabel, 5, true}, - {frame4.rowBackgroundLabel, 6}, - {frame4.rowBackgroundColorByClassLabel, 7}, - {frame4.rowBackgroundPickLabel, 8}, + {frame4.rowLowerTextureLabel, 6, true}, + {frame4.rowBackgroundLabel, 7}, + {frame4.rowBackgroundColorByClassLabel, 8}, + {frame4.rowBackgroundPickLabel, 9}, --icon - {frame4.rowIconsLabel, 9, true}, - {frame4.iconFileLabel, 10}, - {frame4.iconFileLabel2, 11}, - {frame4.barStartLabel, 12}, + {frame4.rowIconsLabel, 10, true}, + {frame4.iconFileLabel, 11}, + {frame4.iconFileLabel2, 12}, + {frame4.barStartLabel, 13}, } local right_side = { @@ -10258,6 +10381,8 @@ end --> if not window local skin = editing_instance.skin local frame3 = _G.DetailsOptionsWindow3 + _G.DetailsOptionsWindow3CustomTextureEntry:SetText (editing_instance.skin_custom) + _G.DetailsOptionsWindow3SkinDropdown.MyObject:SetFixedParameter (editing_instance) _G.DetailsOptionsWindow3SkinDropdown.MyObject:Select (skin) @@ -10301,6 +10426,8 @@ end --> if not window --> window 4 + _G.DetailsOptionsWindow4CustomTextureEntry:SetText (editing_instance.row_info.texture_custom) + _G.DetailsOptionsWindow4OrientationDropdown.MyObject:SetFixedParameter (editing_instance) _G.DetailsOptionsWindow4OrientationDropdown.MyObject:Select (editing_instance.bars_inverted and 2 or 1, true) _G.DetailsOptionsWindow4SortDropdown.MyObject:SetFixedParameter (editing_instance) diff --git a/gumps/janela_principal.lua b/gumps/janela_principal.lua index df5ef3bf..b45e177e 100644 --- a/gumps/janela_principal.lua +++ b/gumps/janela_principal.lua @@ -4108,7 +4108,7 @@ function _detalhes:SetBarSpecIconSettings (enabled, iconfile, fulltrack) end -function _detalhes:SetBarSettings (height, texture, colorclass, fixedcolor, backgroundtexture, backgroundcolorclass, backgroundfixedcolor, alpha, iconfile, barstart, spacement) +function _detalhes:SetBarSettings (height, texture, colorclass, fixedcolor, backgroundtexture, backgroundcolorclass, backgroundfixedcolor, alpha, iconfile, barstart, spacement, texture_custom) --> bar start if (type (barstart) == "boolean") then @@ -4148,6 +4148,11 @@ function _detalhes:SetBarSettings (height, texture, colorclass, fixedcolor, back self.row_info.texture_file = SharedMedia:Fetch ("statusbar", texture) end + if (texture_custom) then + self.row_info.texture_custom = texture_custom + self.row_info.texture_custom_file = "Interface\\" .. self.row_info.texture_custom + end + --> color by class if (type (colorclass) == "boolean") then self.row_info.texture_class_colors = colorclass @@ -4350,7 +4355,16 @@ function _detalhes:InstanceRefreshRows (instancia) --> texture local texture_file = SharedMedia:Fetch ("statusbar", self.row_info.texture) local texture_file2 = SharedMedia:Fetch ("statusbar", self.row_info.texture_background) - + --> update texture files + self.row_info.texture_file = texture_file + self.row_info.texture_background_file = texture_file2 + + if (type (self.row_info.texture_custom) == "string" and self.row_info.texture_custom ~= "") then + texture_file = "Interface\\" .. self.row_info.texture_custom + --> update texture file + self.row_info.texture_custom_file = texture_file + end + --> outline values local left_text_outline = self.row_info.textL_outline local right_text_outline = self.row_info.textR_outline @@ -6122,6 +6136,20 @@ local build_segment_list = function (self, elapsed) end -- ~skin + +function _detalhes:SetUserCustomSkinFile (file) + if (type (file) ~= "string") then + error ("SetUserCustomSkinFile() file must be a string.") + end + + if (file:find ("\\") or file:find ("/")) then + error ("SetUserCustomSkinFile() file must be only the file name (with out up folders) and slashes.") + end + + self.skin_custom = file + self:ChangeSkin() +end + function _detalhes:ChangeSkin (skin_name) if (not skin_name) then @@ -6220,6 +6248,9 @@ function _detalhes:ChangeSkin (skin_name) local skin_file = this_skin.file --> set textures + if (self.skin_custom ~= "") then + skin_file = "Interface\\" .. self.skin_custom + end self.baseframe.cabecalho.ball:SetTexture (skin_file) --> bola esquerda self.baseframe.cabecalho.emenda:SetTexture (skin_file) --> emenda que liga a bola a textura do centro diff --git a/images/skins/classic_skin_v1.tga b/images/skins/classic_skin_v1.tga index 5249e880e700e83e788da257cffac67451c10436..2b941f53afd3e021c463c352e4f286f6e9567dff 100644 GIT binary patch delta 2989 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