From 0677e2e87403b379ecf9f321f31f24740b3e7bde Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Fri, 7 Jul 2023 18:49:16 -0300 Subject: [PATCH] Framework, update --- Libs/DF/charts.lua | 162 +++++++++++++++++- Libs/DF/fw.lua | 2 +- Libs/DF/mixins.lua | 11 +- Libs/LibLuaServer/LuaServerDefinitions.lua | 4 + classes/class_damage.lua | 152 ++++++++++------- core/parser.lua | 85 +++++++++- functions/skins.lua | 188 +++++++++++++++++++++ images/skins/ten_years_skin.tga | Bin 0 -> 3145772 bytes 8 files changed, 536 insertions(+), 68 deletions(-) create mode 100644 images/skins/ten_years_skin.tga diff --git a/Libs/DF/charts.lua b/Libs/DF/charts.lua index b640e237..27d0ac76 100644 --- a/Libs/DF/charts.lua +++ b/Libs/DF/charts.lua @@ -17,6 +17,17 @@ local _ ---@field Texture texture ---@field Label fontstring +---@class chart_backdropindicator : frame a frame which is used to indicate a specific time frame in the chart with a colored texture +---@field fieldTexture texture the texture which indicates the amount of time the effect was active, it is painted over the background texture +---@field fieldLabel fontstring the label showing the name of the indicator, example: bloodlust, heroism, etc +---@field indicatorTexture texture a small squere texture located in the top right of the chart frame, it is used to indicate the color of the indicator +---@field indicatorLabel fontstring the label showing the name of the indicator within the indicatorTexture +---@field bInUse boolean if the indicator is in use or not +---@field startTime number +---@field endTime number +---@field labelText string +---@field color color + ---@alias x_axisdatatype ---| "time" when setting the text into the labels, it will be converted into a time format ---| "number" same as timer, but the number is not comverted to time @@ -36,6 +47,11 @@ local _ ---@field chartBottomOffset number the offset of the bottom side of the chart frame to the plot frame ---@field xAxisLabelsYOffset number default: -6, the offset of the horizontal axis labels to the horizontal axis line (y coordinate) ---@field smoothnessLevel number default: 0, the smoothness level of the chart lines, 0 is no smoothness +---@field backdropIndicators chart_backdropindicator[] +---@field nextBackdropIndicator number tell which is the next backdrop indicator to be used +---@field CreateBackdropIndicator fun(self: df_chartmulti|df_chart, index: number) : chart_backdropindicator create a new backdrop indicator +---@field GetBackdropIndicator fun(self: df_chartmulti|df_chart) : chart_backdropindicator get a backdrop indicator by index +---@field ResetBackdropIndicators fun(self: df_chartmulti|df_chart) reset all backdrop indicators ---@field SetAxesColor fun(self: df_chartmulti, red: number|string|table|nil, green: number|nil, blue: number|nil, alpha: number|nil) : boolean set the color of both axis lines ---@field SetAxesThickness fun(self: df_chartmulti, thickness: number) : boolean set the thickness of both axis lines ---@field CreateAxesLines fun(self: df_chartmulti|df_chart, xOffset: number, yOffset: number, whichSide: "left"|"right", thickness: number, amountYLabels: number, amountXLabels: number, red: any, green: number|nil, blue: number|nil, alpha: number|nil) @@ -56,6 +72,8 @@ local chartFrameSharedConstructor = function(self) self.chartBottomOffset = 0 self.xAxisLabelsYOffset = -6 self.smoothnessLevel = 0 + self.backdropIndicators = {} + self.nextBackdropIndicator = 1 end ---@class df_chart: frame, df_data, df_value, df_chartshared @@ -389,6 +407,138 @@ detailsFramework.ChartFrameSharedMixin = { SetXAxisDataType = function(self, dataType) setXAxisDataType(self, dataType) end, + + ---create a new backdrop indicator, this is called from the function GetBackdropIndicator + ---@param self df_chartmulti|df_chart + ---@return chart_backdropindicator + CreateBackdropIndicator = function(self, nextIndicatorIndex) + ---@type chart_backdropindicator + local newBackdropIndicator = CreateFrame("frame", "$parentBackdropIndicator" .. nextIndicatorIndex, self.plotFrame) + --make the backdrop indicators bebelow the plot frame + newBackdropIndicator:SetFrameLevel(self.plotFrame:GetFrameLevel() - 1) + + newBackdropIndicator.fieldTexture = newBackdropIndicator:CreateTexture(nil, "overlay") + newBackdropIndicator.fieldTexture:SetAllPoints() + + newBackdropIndicator.fieldLabel = newBackdropIndicator:CreateFontString(nil, "overlay", "GameFontNormal") + newBackdropIndicator.fieldLabel:SetTextColor(1, 1, 1, 0.3) + newBackdropIndicator.fieldLabel:SetJustifyH("left") + newBackdropIndicator.fieldLabel:SetJustifyV("top") + detailsFramework:SetFontSize(newBackdropIndicator.fieldLabel, 10) + newBackdropIndicator.fieldLabel:SetPoint("topleft", newBackdropIndicator.fieldTexture, "topleft", 2, -2) + + newBackdropIndicator.indicatorTexture = newBackdropIndicator:CreateTexture(nil, "overlay") + newBackdropIndicator.indicatorTexture:SetSize(10, 10) + + newBackdropIndicator.indicatorLabel = newBackdropIndicator:CreateFontString(nil, "overlay", "GameFontNormal") + newBackdropIndicator.indicatorLabel:SetTextColor(1, 1, 1, 0.837) + newBackdropIndicator.indicatorLabel:SetJustifyH("left") + newBackdropIndicator.indicatorLabel:SetPoint("left", newBackdropIndicator.indicatorTexture, "right", 2, 0) + + return newBackdropIndicator + end, + + ---reset the backdrop indicators by hidding all of them + ---@param self df_chartmulti|df_chart + ResetBackdropIndicators = function(self) + for i = 1, #self.backdropIndicators do + local thisBackdropIndicator = self.backdropIndicators[i] + thisBackdropIndicator:Hide() + thisBackdropIndicator.bInUse = false + end + self.nextBackdropIndicator = 1 + end, + + ---get a backdrop indicator, if it doesn't exist, create a new one + ---@param self df_chartmulti|df_chart + ---@return chart_backdropindicator + GetBackdropIndicator = function(self) + local nextIndicator = self.nextBackdropIndicator + + if (not self.backdropIndicators[nextIndicator]) then + self.backdropIndicators[nextIndicator] = self:CreateBackdropIndicator(nextIndicator) + end + + self.nextBackdropIndicator = nextIndicator + 1 + return self.backdropIndicators[nextIndicator] + end, + + ---add a backdrop indicator to the chart + ---@param self df_chartmulti|df_chart + ---@param label string this is a text to be displayed on the left side of the indicator and on the top right corner of the chart panel + ---@param timeStart number the start time of the indicator + ---@param timeEnd number the end time of the indicator + ---@param red number|nil + ---@param green number|nil + ---@param blue number|nil + ---@param alpha number|nil + AddBackdropIndicator = function(self, label, timeStart, timeEnd, red, green, blue, alpha) + assert(type(label) == "string", "AddBackdropIndicator: label must be a string.") + assert(type(timeStart) == "number", "AddBackdropIndicator: timeStart must be a number.") + assert(type(timeEnd) == "number", "AddBackdropIndicator: timeEnd must be a number.") + + red, green, blue, alpha = detailsFramework:ParseColors(red, green, blue, alpha) + + local backdropIndicator = self:GetBackdropIndicator() + backdropIndicator.bInUse = true + backdropIndicator.startTime = timeStart + backdropIndicator.endTime = timeEnd + backdropIndicator.labelText = label + backdropIndicator.color = {red, green, blue, alpha} + + return true + end, + + ---when Plot() is called, this function will be called to show the backdrop indicators + ---it gets the x_axisdatatype or if not existant defaults to "time", calculate the area in pixels using the plot area width and the plot area 'time' + ---then set the texture color, label texts and show the small squere indicators in the top right of the plot area + ---@param self df_chartmulti|df_chart + ShowBackdropIndicators = function(self) + --get the x axis data type + local xDataType = self.xAxisDataType or "time" + --get the max value of the data type + local dataSize = self.xAxisDataNumber or self.GetDataSize and self:GetDataSize() or 0 + --frame width in pixels + local frameWidth = self.plotFrame:GetWidth() + + for i = 1, self.nextBackdropIndicator-1 do + local thisIndicator = self.backdropIndicators[i] + if (not thisIndicator.bInUse) then + break + end + + local startTime = thisIndicator.startTime + local endTime = thisIndicator.endTime + local labelText = thisIndicator.labelText + local color = thisIndicator.color + + --set the point where the indicator will be placed + local startX = startTime / dataSize * frameWidth + local endX = endTime / dataSize * frameWidth + + thisIndicator:SetPoint("topleft", self.plotFrame, "topleft", startX, 0) + thisIndicator:SetPoint("bottomright", self.plotFrame, "bottomleft", endX, 0) + + thisIndicator.fieldLabel:SetText(labelText) + thisIndicator.fieldTexture:SetColorTexture(unpack(color)) + + thisIndicator.indicatorLabel:SetText(labelText) + thisIndicator.indicatorTexture:SetColorTexture(unpack(color)) + + local stringWidth = thisIndicator.indicatorLabel:GetStringWidth() + local squareWidth = thisIndicator.indicatorTexture:GetWidth() + + if (i == 1) then + local space = stringWidth + squareWidth + thisIndicator.indicatorTexture:SetPoint("topright", self.plotFrame, "topright", -space + 2, -30) + else + local space = stringWidth + squareWidth + 10 + thisIndicator.indicatorTexture:SetPoint("left", self.backdropIndicators[i-1].indicatorTexture, "left", -space, 0) + end + + thisIndicator:Show() + end + end, } detailsFramework.ChartFrameMixin = { @@ -481,7 +631,10 @@ detailsFramework.ChartFrameMixin = { ---@param self df_chart Reset = function(self) self:HideLines() + self:ResetMinMaxValues() self.nextLine = 1 + self.xAxisDataNumber = 0 + self:ResetBackdropIndicators() end, ---@param self df_chart @@ -578,6 +731,8 @@ detailsFramework.ChartFrameMixin = { line:SetEndPoint("bottomleft", currentXPoint, currentYPoint) end + self:ShowBackdropIndicators() + if (bUpdateLabels or bUpdateLabels == nil) then updateLabelValues(self) end @@ -735,7 +890,11 @@ detailsFramework.MultiChartFrameMixin = { ---@param self df_chartmulti Reset = function(self) self:HideCharts() + self:ResetMinMaxValues() + self:ResetBackdropIndicators() self.nextChartFrame = 1 + self.biggestDataValue = 0 + self.xAxisDataNumber = 0 end, ---set the min and max values of all charts @@ -835,7 +994,7 @@ detailsFramework.MultiChartFrameMixin = { Plot = function(multiChartFrame) local minValue, multiChartMaxValue = multiChartFrame:GetMinMaxValues() local plotAreaWidth = multiChartFrame.plotFrame:GetWidth() --if there's no axis, the plotFrame has no width - local maxDataSize = multiChartFrame:GetMaxDataSize() + local maxDataSize = multiChartFrame:GetMaxDataSize() --it's not clearing when a new boss is selected local eachLineWidth = plotAreaWidth / maxDataSize local allCharts = multiChartFrame:GetCharts() @@ -857,6 +1016,7 @@ detailsFramework.MultiChartFrameMixin = { chartFrame:Plot(yPointScale, bUpdateLabels) end + multiChartFrame:ShowBackdropIndicators() updateLabelValues(multiChartFrame) multiChartFrame:UpdateChartNamesIndicator() end, diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua index 1e82271a..b63aab2c 100644 --- a/Libs/DF/fw.lua +++ b/Libs/DF/fw.lua @@ -1,6 +1,6 @@ -local dversion = 446 +local dversion = 447 local major, minor = "DetailsFramework-1.0", dversion local DF, oldminor = LibStub:NewLibrary(major, minor) diff --git a/Libs/DF/mixins.lua b/Libs/DF/mixins.lua index d194f018..04c9c65d 100644 --- a/Libs/DF/mixins.lua +++ b/Libs/DF/mixins.lua @@ -891,6 +891,7 @@ detailsFramework.DataMixin = { ---@field ValueConstructor fun(self: df_value) ---@field SetMinMaxValues fun(self: df_value, minValue: number, maxValue: number) ---@field GetMinMaxValues fun(self: df_value) : number, number +---@field ResetMinMaxValues fun(self: df_value) ---@field GetMinValue fun(self: df_value) : number ---@field GetMaxValue fun(self: df_value) : number ---@field SetMinValue fun(self: df_value, minValue: number) @@ -905,8 +906,7 @@ detailsFramework.ValueMixin = { ---initialize the value table ---@param self table ValueConstructor = function(self) - self.minValue = 0 - self.maxValue = 1 + self:ResetMinMaxValues() end, ---set the min and max values @@ -925,6 +925,13 @@ detailsFramework.ValueMixin = { return self.minValue, self.maxValue end, + ---reset the min and max values + ---@param self table + ResetMinMaxValues = function(self) + self.minValue = 0 + self.maxValue = 1 + end, + ---get the min value ---@param self table ---@return number diff --git a/Libs/LibLuaServer/LuaServerDefinitions.lua b/Libs/LibLuaServer/LuaServerDefinitions.lua index 56680a5f..a4373a28 100644 --- a/Libs/LibLuaServer/LuaServerDefinitions.lua +++ b/Libs/LibLuaServer/LuaServerDefinitions.lua @@ -149,6 +149,10 @@ ---@alias valueamount number used to represent a value, such as a damage amount, a healing amount, or a resource amount. ---@alias timestring string refers to a string showing a time value, such as "1:23" or "1:23:45". ---@alias combattime number elapsed time of a combat or time in seconds that a unit has been in combat. +---@alias coordleft number +---@alias coordright number +---@alias coordtop number +---@alias coordbottom number ---@class _G ---@field RegisterAttributeDriver fun(statedriver: frame, attribute: string, conditional: string) diff --git a/classes/class_damage.lua b/classes/class_damage.lua index 31a953ac..a6fb7a09 100644 --- a/classes/class_damage.lua +++ b/classes/class_damage.lua @@ -3745,7 +3745,7 @@ function damageClass:ToolTip_Enemies (instancia, numero, barra, keydown) end ---------DAMAGE TAKEN -function damageClass:ToolTip_DamageTaken (instance, numero, barra, keydown) +function damageClass:ToolTip_DamageTaken(instance, numero, barra, keydown) --if the object has a owner, it's a pet local owner = self.owner if (owner and owner.classe) then @@ -3761,13 +3761,19 @@ function damageClass:ToolTip_DamageTaken (instance, numero, barra, keydown) local combatObject = instance:GetShowingCombat() local damageContainer = combatObject:GetContainer(DETAILS_ATTRIBUTE_DAMAGE) - local damageTakenSorted = {} + ---@type {key1:actorname, key2:valueamount, key3:class, key4:actor} + local damageTakenDataSorted = {} local mainAttribute, subAttribute = instance:GetDisplay() if (subAttribute == DETAILS_SUBATTRIBUTE_ENEMIES) then for _, actorObject in damageContainer:ListActors() do if (actorObject:IsGroupPlayer() and actorObject.targets[actorName]) then - damageTakenSorted [#damageTakenSorted+1] = {actorName, actorObject.targets[actorName], actorObject.classe, actorObject} + damageTakenDataSorted [#damageTakenDataSorted+1] = { + actorName, + actorObject.targets[actorName], + actorObject:Class(), + actorObject + } end end else @@ -3775,67 +3781,66 @@ function damageClass:ToolTip_DamageTaken (instance, numero, barra, keydown) --get the aggressor local enemyActorObject = damageContainer:GetActor(enemyName) if (enemyActorObject) then - --local name = enemyName + ---@type {key1:actorname, key2:valueamount, key3:class, key4:actor} local damageTakenTable local damageInflictedByThisEnemy = enemyActorObject.targets[actorName] if (damageInflictedByThisEnemy) then if (enemyActorObject:IsPlayer() or enemyActorObject:IsNeutralOrEnemy()) then - damageTakenTable = {enemyName, damageInflictedByThisEnemy, enemyActorObject.classe, enemyActorObject} - damageTakenSorted [#damageTakenSorted+1] = damageTakenTable + damageTakenTable = {enemyName, damageInflictedByThisEnemy, enemyActorObject:Class(), enemyActorObject} + damageTakenDataSorted[#damageTakenDataSorted+1] = damageTakenTable end end --special cases - monk stagger - if (enemyName == actorName and self.classe == "MONK") then - local ff = enemyActorObject.friendlyfire [enemyName] - if (ff and ff.total > 0) then - local staggerDamage = ff.spells [124255] or 0 + if (enemyName == actorName and self:Class() == "MONK") then + local friendlyFire = enemyActorObject.friendlyfire[enemyName] + if (friendlyFire and friendlyFire.total > 0) then + local staggerDamage = friendlyFire.spells[124255] or 0 if (staggerDamage > 0) then if (damageTakenTable) then - damageTakenTable [2] = damageTakenTable [2] + staggerDamage + damageTakenTable[2] = damageTakenTable[2] + staggerDamage else - damageTakenSorted [#damageTakenSorted+1] = {enemyName, staggerDamage, "MONK", enemyActorObject} + damageTakenDataSorted[#damageTakenDataSorted+1] = {enemyName, staggerDamage, "MONK", enemyActorObject} end end end end end end - end - local max = #damageTakenSorted - if (max > 10) then - max = 10 + local maxDataAllowed = #damageTakenDataSorted + if (maxDataAllowed > 10) then + maxDataAllowed = 10 end local bIsMaximized = false if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3 or instance.sub_atributo == 6 or Details.damage_taken_everything) then - max = #damageTakenSorted + maxDataAllowed = #damageTakenDataSorted bIsMaximized = true end if (subAttribute == DETAILS_SUBATTRIBUTE_ENEMIES) then - Details:AddTooltipSpellHeaderText (Loc ["STRING_DAMAGE_TAKEN_FROM"], headerColor, #damageTakenSorted, [[Interface\Buttons\UI-MicroStream-Red]], 0.1875, 0.8125, 0.15625, 0.78125) + Details:AddTooltipSpellHeaderText(Loc ["STRING_DAMAGE_TAKEN_FROM"], headerColor, #damageTakenDataSorted, [[Interface\Buttons\UI-MicroStream-Red]], 0.1875, 0.8125, 0.15625, 0.78125) else - Details:AddTooltipSpellHeaderText (Loc ["STRING_FROM"], headerColor, #damageTakenSorted, [[Interface\Addons\Details\images\icons]], 0.126953125, 0.1796875, 0, 0.0546875) + Details:AddTooltipSpellHeaderText(Loc ["STRING_FROM"], headerColor, #damageTakenDataSorted, [[Interface\Addons\Details\images\icons]], 0.126953125, 0.1796875, 0, 0.0546875) end if (bIsMaximized) then --highlight - GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2) + GameCooltip:AddIcon([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2) if (subAttribute == DETAILS_SUBATTRIBUTE_ENEMIES) then - GameCooltip:AddStatusBar (100, 1, 0.7, g, b, 1) + GameCooltip:AddStatusBar(100, 1, 0.7, g, b, 1) else - Details:AddTooltipHeaderStatusbar (r, g, b, 1) + Details:AddTooltipHeaderStatusbar(r, g, b, 1) end else - GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay1) + GameCooltip:AddIcon([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay1) if (subAttribute == DETAILS_SUBATTRIBUTE_ENEMIES) then - GameCooltip:AddStatusBar (100, 1, 0.7, 0, 0, barAlha) + GameCooltip:AddStatusBar(100, 1, 0.7, 0, 0, barAlha) else - Details:AddTooltipHeaderStatusbar (r, g, b, barAlha) + Details:AddTooltipHeaderStatusbar(r, g, b, barAlha) end end @@ -3843,65 +3848,96 @@ function damageClass:ToolTip_DamageTaken (instance, numero, barra, keydown) local iconBorderTexCoord = Details.tooltip.icon_border_texcoord -- create a full list of incoming damage, before adding any lines to the tooltip, so we can sort them appropriately + + ---@class cooltip_icon + ---@field key1 textureid + ---@field key2 number 1 for main tooltip frame, 2 for the secondary frame + ---@field key3 number 1 for the left side, 2 for the right size + ---@field key4 width + ---@field key5 height + ---@field key6 coordleft + ---@field key7 coordright + ---@field key8 coordtop + ---@field key9 coordbottom + + ---@type {key1:valueamount, key2:table, key3:cooltip_icon} local lines_to_add = {} - for i = 1, max do - local enemyActorObject = damageTakenSorted[i][4] + + for i = 1, maxDataAllowed do + local enemyActorObject = damageTakenDataSorted[i][4] --only shows damage from enemies or from the player it self --the player it self can only be placed on the list by the iteration above --the iteration doesnt check friendly fire for all actors, only a few cases like Monk Stagger - if (enemyActorObject:IsNeutralOrEnemy() or enemyActorObject.nome == self.nome) then - local all_spells = {} + if (enemyActorObject:IsNeutralOrEnemy() or enemyActorObject:Name() == self:Name()) then + ---@type {key1:spellid, key2:valueamount, key:actorname} + local spellTargetDamageList = {} - for spellid, spell in pairs(enemyActorObject.spells._ActorTable) do - local on_target = spell.targets [self.nome] - if (on_target) then - tinsert(all_spells, {spellid, on_target, enemyActorObject.nome}) + for spellId, spellTable in pairs(enemyActorObject.spells._ActorTable) do + local damageOnTarget = spellTable.targets[self:Name()] + if (damageOnTarget) then + tinsert(spellTargetDamageList, {spellId, damageOnTarget, enemyActorObject:Name()}) end end --friendly fire - local friendlyFire = enemyActorObject.friendlyfire [self.nome] + local friendlyFire = enemyActorObject.friendlyfire[self:Name()] if (friendlyFire) then - for spellid, amount in pairs(friendlyFire.spells) do - tinsert(all_spells, {spellid, amount, enemyActorObject.nome}) + for spellId, valueAmount in pairs(friendlyFire.spells) do + table.insert(spellTargetDamageList, {spellId, valueAmount, enemyActorObject:Name()}) end end - for _, spell in ipairs(all_spells) do - local spellname, _, spellicon = _GetSpellInfo(spell [1]) + for _, spell in ipairs(spellTargetDamageList) do + local spellId, valueAmount, thisActorName = unpack(spell) + + local spellName, _, spellIcon = _GetSpellInfo(spellId) + local addTextArgs = {spellName .. " (|cFFFFFF00" .. thisActorName .. "|r)", Details:Format(valueAmount) .. " (" .. string.format("%.1f", (valueAmount / totalDamageTaken) * 100) .. "%)"} + ---@type cooltip_icon + local addIconArgs = {spellIcon, 1, 1, iconSize.W, iconSize.H, iconBorderTexCoord.L, iconBorderTexCoord.R, iconBorderTexCoord.T, iconBorderTexCoord.B} + tinsert(lines_to_add, { - spell [2], - {spellname .. " (|cFFFFFF00" .. spell [3] .. "|r)", FormatTooltipNumber (_, spell [2]).." (" .. format("%.1f", (spell [2] / totalDamageTaken) * 100).."%)"}, - {spellicon, 1, 1, iconSize.W, iconSize.H, iconBorderTexCoord.L, iconBorderTexCoord.R, iconBorderTexCoord.T, iconBorderTexCoord.B} + valueAmount, + addTextArgs, + addIconArgs }) end - else - local amount, addLineArgs, addIconArgs = damageTakenSorted[i][2] - local aggressorName = Details:GetOnlyName(damageTakenSorted[i][1]) - if (bIsMaximized and damageTakenSorted[i][1]:find(Details.playername)) then - addLineArgs = { aggressorName, FormatTooltipNumber (_, damageTakenSorted[i][2]).." ("..format("%.1f", (damageTakenSorted[i][2]/totalDamageTaken) * 100).."%)", nil, "yellow" } - else - addLineArgs = { aggressorName, FormatTooltipNumber (_, damageTakenSorted[i][2]).." ("..format("%.1f", (damageTakenSorted[i][2]/totalDamageTaken) * 100).."%)" } - end - local classe = damageTakenSorted[i][3] + ---@type actorname, valueamount, class, actor + local thisAggrossorTable = damageTakenDataSorted[i] + local actorName = thisAggrossorTable[1] + local amount = thisAggrossorTable[2] + local class = thisAggrossorTable[3] + local actorObject = thisAggrossorTable[4] - if (not classe) then - classe = "UNKNOW" + ---@type {key1:actorname, key2:string, key3:nil, key4:color} + local addLineArgs + ---@type cooltip_icon + local addIconArgs + + local aggressorName = Details:GetOnlyName(actorName) + if (bIsMaximized and actorName:find(Details.playername)) then + addLineArgs = {aggressorName, Details:Format(amount) .. " ("..string.format("%.1f", (amount / totalDamageTaken) * 100) .. "%)", nil, "yellow"} + else + addLineArgs = {aggressorName, Details:Format(amount) .. " ("..string.format("%.1f", (amount / totalDamageTaken) * 100) .. "%)"} end - if (classe == "UNKNOW") then - addIconArgs = { "Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, iconSize.W, iconSize.H, .25, .5, 0, 1 } - else - addIconArgs= { instance.row_info.icon_file, nil, nil, iconSize.W, iconSize.H, unpack(Details.class_coords [classe]) } + if (not class) then + class = "UNKNOW" end - tinsert(lines_to_add, { amount, addLineArgs, addIconArgs }) + + if (class == "UNKNOW") then + addIconArgs = {"Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, iconSize.W, iconSize.H, .25, .5, 0, 1} + else + addIconArgs= {instance.row_info.icon_file, nil, nil, iconSize.W, iconSize.H, unpack(Details.class_coords [class])} + end + tinsert(lines_to_add, {amount, addLineArgs, addIconArgs}) end end - table.sort(lines_to_add, function(a, b) return a[1] > b[1] end) + table.sort(lines_to_add, Details.Sort1) + for _, line in ipairs(lines_to_add) do GameCooltip:AddLine(unpack(line[2])) GameCooltip:AddIcon(unpack(line[3])) diff --git a/core/parser.lua b/core/parser.lua index dcfaf0d4..da9cfb1f 100755 --- a/core/parser.lua +++ b/core/parser.lua @@ -5935,17 +5935,90 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 local parserDebug = {} function Details.OnParserEventDebug() - local time, token, hidding, who_serial, who_name, who_flags, who_flags2, target_serial, target_name, target_flags, target_flags2, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12 = CombatLogGetCurrentEventInfo() + local time, token, hidding, who_serial, who_name, who_flags, who_flags2, target_serial, target_name, target_flags, target_flags2, spellId, spellName, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, unknown1, unknown2, unknown3, unknown4, unknown5 = CombatLogGetCurrentEventInfo() if (not parserDebug[token]) then parserDebug[token] = true print(token) end + if (token == "SPELL_DAMAGE") then + if (A13 ~= nil or unknown1 ~= nil or unknown2 ~= nil or unknown3 ~= nil or unknown4 ~= nil or unknown5) then + --print(time, token, hidding, who_serial, who_name, who_flags, who_flags2, target_serial, target_name, target_flags, target_flags2, spellId, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18) + end + --print(time, token, hidding, who_serial, who_name, who_flags, who_flags2, target_serial, target_name, target_flags, target_flags2, spellId, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18) + + if (spellName == "Fate Mirror") then + --print(time, token, hidding, who_serial, who_name, who_flags, who_flags2, target_serial, target_name, target_flags, target_flags2, spellId, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18) + end + end + + if (token == "SPELL_AURA_APPLIED") then + --print(spellName) + end + --local func = token_list[token] --if (func) then - -- return func(nil, token, time, who_serial, who_name, who_flags, target_serial, target_name, target_flags, target_flags2, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) + -- return func(nil, token, time, who_serial, who_name, who_flags, target_serial, target_name, target_flags, target_flags2, spellId, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) --end + + --[=[ getspellinfo + ["1"] = "Spatial Paradox", buff + ["3"] = 5199645, + ["4"] = 0, + ["5"] = 0, + ["6"] = 100, + ["7"] = 406789, + ["8"] = 5199645, + + ["1"] = "Spatial Paradox", buff + ["3"] = 5199645, + ["4"] = 0, + ["5"] = 0, + ["6"] = 60, + ["7"] = 406732, + ["8"] = 5199645, + + ["1"] = "Ebon Might", --spell cast start + ["3"] = 5061347, + ["4"] = 1473, + ["5"] = 0, + ["6"] = 0, + ["7"] = 395152, + ["8"] = 5061347, + --]=] + + if (who_serial == UnitGUID("player")) then + GLOB = GLOB or {} + --table.insert(GLOB, {time, token, hidding, who_serial, who_name, who_flags, who_flags2, target_serial, target_name, target_flags, target_flags2, spellId, spellName, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18}) + --print(time, token, hidding, who_serial, who_name, who_flags, who_flags2, target_serial, target_name, target_flags, target_flags2, spellId, spellName, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18) + end + + --two spells triggering _support + --404908,"Fate Mirror" + --395152,"Ebon Might" + + --SPELL_DAMAGE_SUPPORT on spellId 395152 spellname "Ebon Might", only seens to exists in the offline version of the combat log + + if (spellId == 395152) then --Ebon Might "cast start" and "buff applyed" + --print(time, token, hidding, who_serial, who_name, who_flags, who_flags2, target_serial, target_name, target_flags, target_flags2, spellId, spellName, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, unknown1, unknown2, unknown3, unknown4, unknown5) + end + + if (spellName== "Ebon Might") then + --print(token, spellName, spellId) + end + + if (token == "SPELL_CAST_START") then + if (who_serial == UnitGUID("player")) then + --print(token, spellName, spellId) + end + end + + --Prescience, Fate Mirror, Ebon Might, Breath of Eons, Shifting Sands + + --offline cleu: + --6/30 14:25:28.988 SPELL_DAMAGE,Player-5764-0001609B,"Mikito-Fyrakk",0x518,0x0,Creature-0-5770-2444-8-198594-00009DF6EF,"Cleave Training Dummy",0x30a28,0x0,44425,"Arcane Barrage",0x40,0000000000000000,0000000000000000,0,0,0,0,0,0,-1,0,0,0,0.00,0.00,2112,0.0000,0,18252,18251,-1,64,0,0,0,nil,nil,nil + --6/30 14:25:28.988 SPELL_DAMAGE_SUPPORT,Player-5764-0001609B,"Mikito-Fyrakk",0x518,0x0,Creature-0-5770-2444-8-198594-00009DF6EF,"Cleave Training Dummy",0x30a28,0x0,395152,"Ebon Might",0xc,0000000000000000,0000000000000000,0,0,0,0,0,0,-1,0,0,0,0.00,0.00,2112,0.0000,0,2572,2571,-1,64,0,0,0,nil,nil,nil,Player-5764-0001FACE end function Details.OnParserEventClassicEra() @@ -5994,11 +6067,11 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 } Details.parser_frame:SetScript("OnEvent", Details.OnParserEventClassicEra) else - --if ("I'm debugging something") then - -- Details.parser_frame:SetScript("OnEvent", Details.OnParserEventDebug) - --else + if (false and "I'm debugging something") then + Details.parser_frame:SetScript("OnEvent", Details.OnParserEventDebug) + else Details.parser_frame:SetScript("OnEvent", Details.OnParserEvent) - --end + end end function Details:UpdateParser() diff --git a/functions/skins.lua b/functions/skins.lua index 9d31e9c0..1c055310 100644 --- a/functions/skins.lua +++ b/functions/skins.lua @@ -2523,6 +2523,192 @@ local addonName, Details222 = ... }) + + _detalhes:InstallSkin ("10 Years Anniversary", { + file = [[Interface\AddOns\Details\images\skins\ten_years_skin.tga]], + author = "Details!", + version = "1.0", + site = "unknown", + desc = "based on AddonSkins for ElvUI, this skin has opaque title bar and background.", + no_cache = true, + + --general + can_change_alpha_head = true, + + --icon anchors + icon_anchor_main = {-4, -5}, + icon_anchor_plugins = {-7, -13}, + icon_plugins_size = {19, 18}, + + --micro frames + micro_frames = { + color = {0.525490, 0.525490, 0.525490, 1}, + font = "FORCED SQUARE", + size = 11, + textymod = 1, + }, + + -- the four anchors (for when the toolbar is on the top side) + icon_point_anchor = {-35, -0.5}, + left_corner_anchor = {-107, 0}, + right_corner_anchor = {96, 0}, + + -- the four anchors (for when the toolbar is on the bottom side) + icon_point_anchor_bottom = {-37, 12}, + left_corner_anchor_bottom = {-107, 0}, + right_corner_anchor_bottom = {96, 0}, + + --[[ callback function execute after all changes on the window, first argument is this skin table, second is the instance where the skin was applied --]] + callback = function(self, instance) end, + --[[ control_script is a OnUpdate script, it start right after all changes on the window and also after the callback --]] + --[[ control_script_on_start run before the control_script, use it to reset values if needed --]] + control_script_on_start = nil, + control_script = nil, + + --instance overwrites + --[[ when a skin is selected, all customized properties of the window is reseted and then the overwrites are applied]] + --[[ for the complete cprop list see the file classe_instancia_include.lua]] + + icon_on_top = true, + icon_ignore_alpha = true, + icon_titletext_position = {2, 5}, + + instance_cprops = { + menu_icons_alpha = 0.92, + ["show_statusbar"] = false, + ["color"] = {1,1,1,1}, + ["menu_anchor"] = {17, 2, ["side"] = 2}, + ["bg_r"] = 0.517647058823529, + ["color_buttons"] = {1,1,1,1}, + ["bars_sort_direction"] = 1, + ["instance_button_anchor"] = {-27,1}, + ["row_info"] = { + ["textR_outline"] = false, + ["textL_outline"] = false, + ["use_spec_icons"] = true, + ["textL_enable_custom_text"] = false, + ["icon_file"] = "Interface\\AddOns\\Details\\images\\spec_icons_normal", + ["texture_background_file"] = "Interface\\AddOns\\Details\\images\\BantoBar", + ["start_after_icon"] = true, + ["texture_highlight"] = "Interface\\FriendsFrame\\UI-FriendsList-Highlight", + ["textR_enable_custom_text"] = false, + ["textR_custom_text"] = "{data1} ({data2}, {data3}%)", + ["percent_type"] = 1, + ["fixed_text_color"] = {0.905882352941177,0.905882352941177,0.905882352941177,1}, + ["space"] = { + ["right"] = -3, + ["right_noborder"] = -3, + ["left"] = 1, + ["left_noborder"] = 1, + ["between"] = 1, + }, + ["texture"] = "DGround", + ["texture_background_class_color"] = false, + ["fixed_texture_background_color"] = {0,0,0,0.295484036207199}, + ["font_face_file"] = "Fonts\\ARIALN.TTF", + ["alpha"] = 1, + ["textR_class_colors"] = false, + ["models"] = { + ["upper_model"] = "Spells\\AcidBreath_SuperGreen.M2", + ["lower_model"] = "World\\EXPANSION02\\DOODADS\\Coldarra\\COLDARRALOCUS.m2", + ["upper_alpha"] = 0.5, + ["lower_enabled"] = false, + ["lower_alpha"] = 0.1, + ["upper_enabled"] = false, + }, + ["backdrop"] = { + ["enabled"] = false, + ["size"] = 5, + ["color"] = {0, 0, 0, 1}, + ["texture"] = "Details BarBorder 1", + }, + ["texture_background"] = "BantoBar", + ["textL_custom_text"] = "{data1}. {data3}{data2}", + ["no_icon"] = false, + ["font_size"] = 16, + ["height"] = 21, + ["textL_class_colors"] = false, + ["font_face"] = "FORCED SQUARE", + ["texture_class_colors"] = true, + ["texture_file"] = "Interface\\AddOns\\Details\\images\\bar_background", + ["textL_show_number"] = true, + ["fixed_texture_color"] = {0.862745098039216,0.862745098039216,0.862745098039216,1}, + }, + ["bars_grow_direction"] = 1, + ["menu_alpha"] = { + ["enabled"] = false, + ["onleave"] = 1, + ["ignorebars"] = false, + ["iconstoo"] = true, + ["onenter"] = 1, + }, + ["total_bar"] = { + ["enabled"] = false, + ["only_in_group"] = true, + ["icon"] = "Interface\\ICONS\\INV_Sigil_Thorim", + ["color"] = {1,1,1}, + }, + ["plugins_grow_direction"] = 1, + ["strata"] = "LOW", + ["show_sidebars"] = true, + ["show_sidebars_need_resize_by"] = 1, + ["hide_in_combat_alpha"] = 0, + ["menu_icons"] = {true, true, true, true, true, false, ["space"] = -1, ["shadow"] = true}, + ["desaturated_menu"] = false, + ["auto_hide_menu"] = { + ["left"] = false, + ["right"] = false, + }, + ["window_scale"] = 1.0, + ["grab_on_top"] = false, + ["menu_anchor_down"] = {16, -2}, + ["statusbar_info"] = { + ["alpha"] = 1, + ["overlay"] = {1,1,1}, + }, + ["hide_icon"] = true, + ["micro_displays_side"] = 2, + ["bg_alpha"] = 1, + ["auto_current"] = true, + ["toolbar_side"] = 1, + ["bg_g"] = 0.517647058823529, + ["backdrop_texture"] = "Details Ground", + ["hide_in_combat"] = false, + ["skin"] = "ElvUI Style II", + ["menu_icons_size"] = 0.850000023841858, + ["wallpaper"] = { + ["enabled"] = true, + ["width"] = 265.999979475717, + ["texcoord"] = {0.0480000019073486,0.298000011444092,0.630999984741211,0.755999984741211}, + ["overlay"] = {0.999997794628143,0.999997794628143,0.999997794628143,0.799998223781586}, + ["anchor"] = "all", + ["height"] = 226.000007591173, + ["alpha"] = 0.800000071525574, + ["texture"] = "Interface\\AddOns\\Details\\images\\skins\\elvui", + }, + ["stretch_button_side"] = 1, + ["attribute_text"] = { + ["enabled"] = true, + ["shadow"] = true, + ["side"] = 1, + ["enable_custom_text"] = false, + ["custom_text"] = "{name}", + ["text_face"] = "FORCED SQUARE", + ["anchor"] = {-18, 5}, + ["text_color"] = {1,1,1,0.7}, + ["text_size"] = 12, + }, + ["bg_b"] = 0.517647058823529, + }, + + skin_options = { + {spacement = true, type = "button", name = Loc ["STRING_OPTIONS_SKIN_ELVUI_BUTTON1"], func = align_right_chat, desc = Loc ["STRING_OPTIONS_SKIN_ELVUI_BUTTON1_DESC"]}, + {type = "button", name = Loc ["STRING_OPTIONS_SKIN_ELVUI_BUTTON2"], func = set_tooltip_elvui1, desc = Loc ["STRING_OPTIONS_SKIN_ELVUI_BUTTON2_DESC"]}, + {type = "button", name = Loc ["STRING_OPTIONS_SKIN_ELVUI_BUTTON3"], func = set_tooltip_elvui2, desc = Loc ["STRING_OPTIONS_SKIN_ELVUI_BUTTON3_DESC"]}, + } + }) + + _detalhes:InstallSkin ("Safe Skin Legion Beta", { file = [[Interface\AddOns\Details\images\skins\classic_skin_v1.blp]], author = "Details!", @@ -2806,3 +2992,5 @@ local addonName, Details222 = ... } }) + + diff --git a/images/skins/ten_years_skin.tga b/images/skins/ten_years_skin.tga new file mode 100644 index 0000000000000000000000000000000000000000..5c73dad379f61a4756752d838ce4f747ae63be58 GIT binary patch literal 3145772 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 z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5(*u)y}8*6@?pAO9Z#c>u!z literal 0 HcmV?d00001