Framework, update

This commit is contained in:
Tercio Jose
2023-07-07 18:49:16 -03:00
parent e6448ffee6
commit 0677e2e874
8 changed files with 536 additions and 68 deletions
+94 -58
View File
@@ -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<string, string>, 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]))