Class combat updates

- Added combat type DETAILS_SEGMENTTYPE_EVENT_VALENTINEDAY.
- Added: SetDateToNow(bSetStartDate, bSetEndDate), set the start or end data to the current time.
- Added: GetEncounterName(): return the encounter name if any.
- Added: GetBossImage(): return the boss face.
- Added: GetSegmentSlotId(): return which slot in the segments table this combat is in.
- Added: GetCombatIcon(): return an atlastable containing texture information for the combat icon. example: a skull for a boss fight.
- Added: GetCombatName(bOnlyName, bTryFind): return a name for the combat.
- Added: GetTrinketProcsForPlayer(playerName): return table<spellid, trinketprocdata>.
- Added: GetFormattedCombatTime(): return elapsed time as string, format: "minute:seconds".
- Added combat.zoneName and combat.mapId.

- Renamed InstanceType() to GetInstanceType().
- Renamed: GetFormatedCombatTime() to GetMSTime(): return floors minute, second.
This commit is contained in:
Tercio Jose
2024-02-26 13:48:47 -03:00
parent 7176e027a8
commit 71565d3a90
+350 -64
View File
@@ -1,8 +1,11 @@
local Details = _G.Details
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _
local addonName, Details222 = ...
local Details = _G.Details
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _
local addonName, Details222 = ...
---@type detailsframework
local detailsFramework = DetailsFramework
--[[global]] DETAILS_TOTALS_ONLYGROUP = true
--[[global]] DETAILS_SEGMENTID_OVERALL = -1
@@ -25,12 +28,31 @@
--[[global]] DETAILS_SEGMENTTYPE_MYTHICDUNGEON_GENERIC = 10
--[[global]] DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASH = 11
--[[global]] DETAILS_SEGMENTTYPE_MYTHICDUNGEON_OVERALL = 12
--[[global]] DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASHOVERALL = 13
--[[global]] DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASHOVERALL = 13 --not in use at the moment
--[[global]] DETAILS_SEGMENTTYPE_MYTHICDUNGEON_BOSS = 14
--[[global]] DETAILS_SEGMENTTYPE_PVP_ARENA = 20
--[[global]] DETAILS_SEGMENTTYPE_PVP_BATTLEGROUND = 21
--[[global]] DETAILS_SEGMENTTYPE_EVENT_VALENTINEDAY = 30
local segmentTypeToString = {
[DETAILS_SEGMENTTYPE_GENERIC] = "Generic",
[DETAILS_SEGMENTTYPE_OVERALL] = "Overall",
[DETAILS_SEGMENTTYPE_DUNGEON_TRASH] = "DungeonTrash",
[DETAILS_SEGMENTTYPE_DUNGEON_BOSS] = "DungeonBoss",
[DETAILS_SEGMENTTYPE_RAID_TRASH] = "RaidTrash",
[DETAILS_SEGMENTTYPE_RAID_BOSS] = "RaidBoss",
[DETAILS_SEGMENTTYPE_MYTHICDUNGEON] = "Category MythicDungeon",
[DETAILS_SEGMENTTYPE_MYTHICDUNGEON_GENERIC] = "MythicDungeonGeneric",
[DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASH] = "MythicDungeonTrash",
[DETAILS_SEGMENTTYPE_MYTHICDUNGEON_OVERALL] = "MythicDungeonOverall",
[DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASHOVERALL] = "MythicDungeonTrashOverall",
[DETAILS_SEGMENTTYPE_MYTHICDUNGEON_BOSS] = "MythicDungeonBoss",
[DETAILS_SEGMENTTYPE_PVP_ARENA] = "PvPArena",
[DETAILS_SEGMENTTYPE_PVP_BATTLEGROUND] = "PvPBattleground",
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
local ipairs = ipairs -- lua local
@@ -39,7 +61,7 @@
local date = date -- lua local
local tremove = table.remove -- lua local
local rawget = rawget
local _math_max = math.max
local max = math.max
local floor = math.floor
local GetTime = GetTime
@@ -88,7 +110,9 @@
return self.data_inicio, self.data_fim
end
--set the combat date
---set the combat date
---@param started string?
---@param ended string?
function classCombat:SetDate(started, ended)
if (started and type(started) == "string") then
self.data_inicio = started
@@ -98,6 +122,18 @@
end
end
---Sets the date to the current time.
---@param bSetStartDate boolean? Whether to set the start date.
---@param bSetEndDate boolean? Whether to set the end date.
function classCombat:SetDateToNow(bSetStartDate, bSetEndDate)
if (bSetStartDate) then
self.data_inicio = date("%H:%M:%S")
end
if (bSetEndDate) then
self.data_fim = date("%H:%M:%S")
end
end
---return a table representing a chart data
---@param name string
---@return number[]
@@ -126,7 +162,7 @@
return self.raid_roster
end
function classCombat:InstanceType()
function classCombat:GetInstanceType()
return rawget(self, "instance_type")
end
@@ -142,6 +178,8 @@
return self.is_boss and self.is_boss.id
end
---@param self combat
---@return bossinfo bossInfo
function classCombat:GetBossInfo()
return self.is_boss
end
@@ -198,6 +236,29 @@
return deaths
end
---Return the encounter name if any
---@param self combat
---@return string|number
function classCombat:GetEncounterName()
return self.EncounterName or (self.is_boss and self.is_boss.name)
end
function classCombat:GetBossImage()
---@type details_encounterinfo
local encounterInfo = Details:GetEncounterInfo(self:GetEncounterName())
if (encounterInfo) then
return encounterInfo.creatureIcon
end
---@type bossinfo
local bossInfo = self:GetBossInfo()
if (bossInfo) then
return bossInfo.bossimage
end
return self.bossIcon or ""
end
function classCombat:GetCombatId()
return self.combat_id
end
@@ -287,56 +348,214 @@
return 0
end
--return the name of the encounter or enemy
function classCombat:GetCombatName(try_find)
if (self.is_pvp) then
return self.is_pvp.name
elseif (self.is_boss) then
return self.is_boss.encounter
elseif (self.is_mythic_dungeon_trash) then
return self.is_mythic_dungeon_trash.ZoneName .. " (" .. Loc ["STRING_SEGMENTS_LIST_TRASH"] .. ")"
elseif (rawget(self, "is_trash")) then
return Loc ["STRING_SEGMENT_TRASH"]
else
if (self.enemy) then
return self.enemy
end
if (try_find) then
return Details:FindEnemy()
---Retrieves the slot ID of the current combat segment within the combat segments table.
---@return number The slot ID of the current combat segment.
function classCombat:GetSegmentSlotId()
local segmentsTable = Details:GetCombatSegments()
for i = 1, #segmentsTable do
if (segmentsTable[i] == self) then
return i
end
end
return Loc ["STRING_UNKNOW"]
if (Details:GetCurrentCombat() == self) then
return DETAILS_SEGMENTID_CURRENT
else
return DETAILS_SEGMENTID_OVERALL
end
end
---return the atlasinfo for the combat icon
---@param self combat
---@return df_atlasinfo
function classCombat:GetCombatIcon()
local textureAtlas = Details:GetTextureAtlasTable()
if (not self) then
return textureAtlas["segment-icon-regular"]
end
local combatType = self:GetCombatType()
if (combatType == DETAILS_SEGMENTTYPE_OVERALL) then
return textureAtlas["segment-icon-overall"]
elseif (combatType == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_OVERALL or combatType == DETAILS_SEGMENTTYPE_MYTHICDUNGEON) then
return textureAtlas["segment-icon-mythicplus"]
--elseif (combatType == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASHOVERALL) then
-- return textureAtlas["segment-icon-mythicplus"]
elseif (combatType == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_BOSS) then
return textureAtlas["segment-icon-mythicplus"]
elseif (combatType == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASH) then
return textureAtlas["segment-icon-mythicplus"]
elseif (combatType == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_GENERIC) then
return textureAtlas["segment-icon-mythicplus"]
elseif (combatType == DETAILS_SEGMENTTYPE_PVP_ARENA) then
return textureAtlas["segment-icon-arena"]
elseif (combatType == DETAILS_SEGMENTTYPE_PVP_BATTLEGROUND) then
return textureAtlas["segment-icon-arena"]
elseif (combatType == DETAILS_SEGMENTTYPE_RAID_TRASH) then
return textureAtlas["segment-icon-broom"]
elseif (combatType == DETAILS_SEGMENTTYPE_RAID_BOSS) then
return textureAtlas["segment-icon-skull"]
elseif (combatType == DETAILS_SEGMENTTYPE_EVENT_VALENTINEDAY) then
return textureAtlas["segment-icon-love-is-in-the-air"]
elseif (combatType == DETAILS_SEGMENTTYPE_DUNGEON_BOSS) then
return textureAtlas["segment-icon-skull"]
end
return textureAtlas["segment-icon-regular"]
end
local partyColor = {170/255, 167/255, 255/255}
local loveIsInTheAirColor = {1, 0.411765, 0.705882, 1}
local bossKillColor = "lime"
local bossWipeColor = "red"
local mythicDungeonBossColor = {170/255, 167/255, 255/255, 1}
local mythicDungeonBossColor2 = {210/255, 200/255, 255/255, 1}
function classCombat:GetCombatName(bOnlyName, bTryFind)
if (not self) then
return Loc["STRING_UNKNOW"]
end
local r, g, b
local combatType, categoryType = self:GetCombatType()
if (combatType == DETAILS_SEGMENTTYPE_OVERALL) then
return Loc["STRING_SEGMENT_OVERALL"]
end
if (categoryType == DETAILS_SEGMENTTYPE_MYTHICDUNGEON) then
local mythicDungeonInfo = self:GetMythicDungeonInfo()
local isMythicOverallSegment, segmentID, mythicLevel, EJID, mapID, zoneName, encounterID, encounterName, startedAt, endedAt, runID = Details:UnpackMythicDungeonInfo(mythicDungeonInfo)
--print("mythic combat type", combatType, self.combat_id)
if (combatType == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_OVERALL) then
local overallIconString = detailsFramework:CreateAtlasString(Details.TextureAtlas["segment-icon-mythicplus-overall"])
local combatName = zoneName .. " +" .. mythicLevel
if (bOnlyName) then
return combatName, unpack(partyColor)
else
return overallIconString .. zoneName .. " +" .. mythicLevel .. " (" .. Loc["STRING_SEGMENTS_LIST_OVERALL"] .. ")", unpack(partyColor)
end
--elseif (combatType == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASHOVERALL) then
-- local trashIconString = detailsFramework:CreateAtlasString(Details.TextureAtlas["segment-icon-broom"])
-- return trashIconString .. zoneName .. " +" .. mythicLevel .. " (" .. Loc["STRING_SEGMENT_TRASH"] .. ")"
elseif (combatType == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASH) then
return (encounterName or Loc["STRING_UNKNOW"]) .. " (" .. string.lower(Loc["STRING_SEGMENTS_LIST_TRASH"]) .. ")"
elseif (combatType == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_BOSS) then
return (encounterName or Loc["STRING_UNKNOW"]) .. " (" .. string.lower(_G["BOSS"]) .. ")", detailsFramework:ParseColors(mythicDungeonBossColor)
end
end
if (combatType == DETAILS_SEGMENTTYPE_PVP_BATTLEGROUND) then
return self.is_pvp.name
elseif (combatType == DETAILS_SEGMENTTYPE_PVP_ARENA) then
return self.is_arena.name
elseif (combatType == DETAILS_SEGMENTTYPE_EVENT_VALENTINEDAY) then
local bossInfo = self:GetBossInfo()
r, g, b = detailsFramework:ParseColors(loveIsInTheAirColor)
return bossInfo.name, r, g, b, 1
elseif (combatType == DETAILS_SEGMENTTYPE_DUNGEON_BOSS) then
local bossInfo = self:GetBossInfo()
local bIsKill = bossInfo.killed
if (bOnlyName) then
return bossInfo.name, detailsFramework:ParseColors(bIsKill and bossKillColor or bossWipeColor)
else
local segmentId = self:GetSegmentSlotId()
return bossInfo.name .." (#" .. segmentId .. ")", detailsFramework:ParseColors(bIsKill and bossKillColor or bossWipeColor)
end
elseif (combatType == DETAILS_SEGMENTTYPE_RAID_BOSS) then
local bossInfo = self:GetBossInfo()
if (bossInfo and bossInfo.name) then
--bossKillColor
local bIsKill = bossInfo.killed
local formattedTime = self:GetFormattedCombatTime()
local tryNumber = self:GetTryNumber()
if (tryNumber) then
return bossInfo.name .." (#" .. tryNumber .. " " .. formattedTime .. ")", detailsFramework:ParseColors(bIsKill and bossKillColor or bossWipeColor)
else
local segmentId = self:GetSegmentSlotId()
return bossInfo.name .." (#" .. segmentId .. ")", detailsFramework:ParseColors(bIsKill and bossKillColor or bossWipeColor)
end
end
end
local bossInfo = self:GetBossInfo()
if (bossInfo and (bossInfo.encounter or bossInfo.name)) then
return bossInfo.encounter or bossInfo.name
end
if (rawget(self, "is_trash")) then
return Loc ["STRING_SEGMENT_TRASH"]
end
if (self.enemy) then
return self.enemy
end
if (bTryFind) then
local newName = Details:FindEnemy()
if (newName) then
self.enemy = newName
return newName
end
end
local segmentId = self:GetSegmentSlotId()
return Loc["STRING_FIGHTNUMBER"] .. segmentId
end
function classCombat:GetCombatType()
--mythic dungeon
local isMythicDungeon = self.is_mythic_dungeon_segment
if (isMythicDungeon) then
local bIsMythicDungeonOverall = self.is_mythic_dungeon and self.is_mythic_dungeon.OverallSegment
if (bIsMythicDungeonOverall) then
local bIsMythicDungeon = self:IsMythicDungeon()
if (bIsMythicDungeon) then
local mythicDungeonInfo = self:GetMythicDungeonInfo()
local bIsMythicOverallSegment, segmentID, mythicLevel, EJID, mapID, zoneName, encounterID, encounterName, startedAt, endedAt, runID = Details:UnpackMythicDungeonInfo(mythicDungeonInfo)
if (bIsMythicOverallSegment) then
return DETAILS_SEGMENTTYPE_MYTHICDUNGEON_OVERALL, DETAILS_SEGMENTTYPE_MYTHICDUNGEON
end
local bIsMythicDungeonTrashOverall = self.is_mythic_dungeon and self.is_mythic_dungeon.TrashOverallSegment
if (bIsMythicDungeonTrashOverall) then
return DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASHOVERALL, DETAILS_SEGMENTTYPE_MYTHICDUNGEON
end
--self.is_mythic_dungeon_trash only exists if the segment isn't a boss trash overall
local isMythicDungeonTrash = self.is_mythic_dungeon_trash
if (isMythicDungeonTrash) then
if (segmentID == "trashoverall" and encounterName) then
return DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASH, DETAILS_SEGMENTTYPE_MYTHICDUNGEON
end
--if (segmentID == "trashoverall") then --overall trash for the whole dungeon doesn't exists anymore
-- return DETAILS_SEGMENTTYPE_MYTHICDUNGEON_TRASHOVERALL, DETAILS_SEGMENTTYPE_MYTHICDUNGEON
--end
local bossEncounter = self.is_boss
if (bossEncounter) then
return DETAILS_SEGMENTTYPE_MYTHICDUNGEON_BOSS, DETAILS_SEGMENTTYPE_MYTHICDUNGEON
end
return DETAILS_SEGMENTTYPE_MYTHICDUNGEON_GENERIC, DETAILS_SEGMENTTYPE_MYTHICDUNGEON
else
--local mythicDungeonInfo = self:GetMythicDungeonInfo()
--local bIsMythicOverallSegment, segmentID, mythicLevel, EJID, mapID, zoneName, encounterID, encounterName, startedAt, endedAt, runID = Details:UnpackMythicDungeonInfo(mythicDungeonInfo)
--segmentID == "trashoverall"
end
--arena
@@ -355,9 +574,14 @@
local instanceType = self.instance_type
if (instanceType == "party") then
local bossEncounter = self.is_boss
if (bossEncounter) then
return DETAILS_SEGMENTTYPE_DUNGEON_BOSS
local bossInfo = self:GetBossInfo()
if (bossInfo) then
if (bossInfo.mapid == 33 and bossInfo.diff_string == "Event" and bossInfo.id == 2879) then --Shadowfang Keep | The Crown Chemical Co.
return DETAILS_SEGMENTTYPE_EVENT_VALENTINEDAY
else
return DETAILS_SEGMENTTYPE_DUNGEON_BOSS
end
else
return DETAILS_SEGMENTTYPE_DUNGEON_TRASH
end
@@ -379,8 +603,12 @@
return DETAILS_SEGMENTTYPE_GENERIC
end
function Details:UnpackMythicDungeonInfo(t)
return t.OverallSegment, t.SegmentID, t.Level, t.EJID, t.MapID, t.ZoneName, t.EncounterID, t.EncounterName, t.StartedAt, t.EndedAt, t.RunID
end
--return a numeric table with all actors on the specific containter
function classCombat:GetActorList (container)
function classCombat:GetActorList(container)
return self [container]._ActorTable
end
@@ -396,9 +624,38 @@
return nil
end
---return the combat time in seconds
---Return a key|value table containing the spellId as key and a table with information about the trinket as value
---@param self combat
---@param playerName string
---@return table<spellid, trinketprocdata>
function classCombat:GetTrinketProcsForPlayer(playerName)
local trinketProcs = self.trinketProcs
return trinketProcs[playerName] or {}
end
---return a string with minute and seconds of the combat time separated by a colon
---@return string
function classCombat:GetFormattedCombatTime()
local combatTime = self:GetCombatTime()
local minute, second = floor(combatTime / 60), floor(combatTime % 60)
local minuteString = tostring(minute)
local secondString = tostring(second)
if (minute < 10) then
minuteString = "0" .. minuteString
end
if (second < 10) then
secondString = "0" .. secondString
end
return minuteString .. ":" .. secondString
end
---return two values, one for minute and another for seconds
---@return number, number
function classCombat:GetFormatedCombatTime()
function classCombat:GetMSTime()
local combatTime = self:GetCombatTime()
local minute, second = floor(combatTime / 60), floor(combatTime % 60)
return minute, second
@@ -408,36 +665,70 @@
---@return number
function classCombat:GetCombatTime()
if (self.end_time) then
return _math_max (self.end_time - self.start_time, 0.1)
return max(self.end_time - self.start_time, 0.1)
elseif (self.start_time and Details.in_combat and self ~= Details.tabela_overall) then
return _math_max (GetTime() - self.start_time, 0.1)
return max(GetTime() - self.start_time, 0.1)
else
return 0.1
end
end
---return the amount of time a mythic plus run has elapsed, if there's no information about the run time, it'll return the combat time
---@param self combat
---@return number
function classCombat:GetRunTime()
return self.run_time or self:GetCombatTime()
end
---return the amount of time a mythic plus run has elapsed, if there's no information about the run time, return nil
---@param self combat
---@return number?
function classCombat:GetRunTimeNoDefault()
return self.run_time
end
---Return the gametime when the combat started
---Game Time is the result value from the function GetTime()
---@param self combat
---@return gametime
function classCombat:GetStartTime()
return self.start_time
end
---Set the gametime when the combat started
---Game Time is the result value from the function GetTime()
---@param self combat
---@param thisTime gametime
function classCombat:SetStartTime(thisTime)
self.start_time = thisTime
end
---Return the gametime when the combat ended
---Game Time is the result value from the function GetTime()
---@param self combat
---@return gametime
function classCombat:GetEndTime()
return self.end_time
end
---Set the gametime when the combat ended
---Game Time is the result value from the function GetTime()
---@param self combat
---@param thisTime gametime
function classCombat:SetEndTime(thisTime)
self.end_time = thisTime
end
---Return how many attempts were made for this boss
---@return number|nil
function classCombat:GetTryNumber()
---@type bossinfo
local bossInfo = self:GetBossInfo()
if (bossInfo) then
return bossInfo.try_number
end
end
---copy deaths from combat2 into combat1
---if bMythicPlus is true it'll check if the death has mythic plus death time and use it instead of the normal death time
---@param combat1 combat
@@ -614,16 +905,16 @@ function classCombat:NovaTabela(bTimeStarted, overallCombatObject, combatId, ...
combatObject.combat_counter = Details.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
if (alvo_name and bitBand (alvo_flags, REACTION_HOSTILE) ~= 0) then --tentando pegar o inimigo pelo alvo
combatObject.contra = alvo_name
if (bitBand (alvo_flags, CONTROL_PLAYER) ~= 0) then
local sourceGUID, sourceName, sourceFlags, targetGUID, targetName, targetFlags = ...
if (sourceGUID) then --aqui ir identificar o boss ou o oponente
if (targetName and bitBand (targetFlags, REACTION_HOSTILE) ~= 0) then --tentando pegar o inimigo pelo alvo
combatObject.contra = targetName
if (bitBand (targetFlags, CONTROL_PLAYER) ~= 0) then
combatObject.pvp = true --o alvo da faco oposta ou foi dado mind control
end
elseif (who_name and bitBand (who_flags, REACTION_HOSTILE) ~= 0) then --tentando pegar o inimigo pelo who caso o mob quem deu o primeiro hit
combatObject.contra = who_name
if (bitBand (who_flags, CONTROL_PLAYER) ~= 0) then
elseif (sourceName and bitBand (sourceFlags, REACTION_HOSTILE) ~= 0) then --tentando pegar o inimigo pelo who caso o mob quem deu o primeiro hit
combatObject.contra = sourceName
if (bitBand (sourceFlags, CONTROL_PLAYER) ~= 0) then
combatObject.pvp = true --o who da faco oposta ou foi dado mind control
end
else
@@ -653,7 +944,6 @@ function classCombat:NovaTabela(bTimeStarted, overallCombatObject, combatId, ...
--players in the raid
combatObject.raid_roster = {}
combatObject.raid_roster_indexed = {}
--frags
combatObject.frags = {}
@@ -676,6 +966,10 @@ function classCombat:NovaTabela(bTimeStarted, overallCombatObject, combatId, ...
n = 1 --event counter
}
local zoneName, _, _, _, _, _, _, zoneMapID = GetInstanceInfo()
combatObject.zoneName = zoneName
combatObject.mapId = zoneMapID
--a tabela sem o tempo de inicio a tabela descartavel do inicio do addon
if (bTimeStarted) then
--esta_tabela.start_time = _tempo
@@ -807,14 +1101,6 @@ end
end
end
function classCombat:seta_data(tipo)
if (tipo == Details._detalhes_props.DATA_TYPE_START) then
self.data_inicio = date("%H:%M:%S")
elseif (tipo == Details._detalhes_props.DATA_TYPE_END) then
self.data_fim = date("%H:%M:%S")
end
end
function classCombat:seta_tempo_decorrido()
--self.end_time = _tempo
self.end_time = GetTime()