local Details = _G.Details
local DF = _G.DetailsFramework
local C_Timer = _G.C_Timer
local unpack = _G.unpack
local GetTime = _G.GetTime
local tremove = _G.tremove
local GetInstanceInfo = _G.GetInstanceInfo
local addonName , Details222 = ...
local Loc = _G.LibStub ( " AceLocale-3.0 " ) : GetLocale ( " Details " )
--data for the current mythic + dungeon
Details.MythicPlus = {
RunID = 0 ,
}
-- ~mythic ~dungeon
local DetailsMythicPlusFrame = _G.CreateFrame ( " frame " , " DetailsMythicPlusFrame " , UIParent )
DetailsMythicPlusFrame.DevelopmentDebug = false
--disabling the mythic+ feature if the user is playing in wow classic
if ( not DF.IsTimewalkWoW ( ) ) then
DetailsMythicPlusFrame : RegisterEvent ( " CHALLENGE_MODE_START " )
DetailsMythicPlusFrame : RegisterEvent ( " CHALLENGE_MODE_COMPLETED " )
DetailsMythicPlusFrame : RegisterEvent ( " ZONE_CHANGED_NEW_AREA " )
DetailsMythicPlusFrame : RegisterEvent ( " ENCOUNTER_END " )
DetailsMythicPlusFrame : RegisterEvent ( " START_TIMER " )
end
function Details222 . MythicPlus . LogStep ( log )
local today = date ( " %d/%m/%y %H:%M:%S " )
table.insert ( Details.mythic_plus_log , 1 , today .. " | " .. log )
tremove ( Details.mythic_plus_log , 50 )
end
--[[
all mythic segments have :
. is_mythic_dungeon_segment = true
. is_mythic_dungeon_run_id = run id from details.profile . mythic_dungeon_id
boss , ' trash overall ' and ' dungeon overall ' segments have :
. is_mythic_dungeon
boss segments have :
. is_boss
' trash overall ' segments have :
. is_mythic_dungeon with . SegmentID = " trashoverall "
' dungeon overall ' segment have :
. is_mythic_dungeon with . SegmentID = " overall "
--]]
--precisa converter um wipe em um trash segment? provavel que sim
-- at the end of a mythic run, if enable on settings, merge all the segments from the mythic run into only one
function DetailsMythicPlusFrame . MergeSegmentsOnEnd ( ) --~merge
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MergeSegmentsOnEnd() > starting to merge mythic segments. " , " InCombatLockdown(): " , InCombatLockdown ( ) )
end
Details222.MythicPlus . LogStep ( " MergeSegmentsOnEnd started | creating the overall segment at the end of the run. " )
--create a new combat to be the overall for the mythic run
Details : StartCombat ( )
--get the current combat just created and the table with all past segments
local newCombat = Details : GetCurrentCombat ( )
local segmentsTable = Details : GetCombatSegments ( )
local totalTime = 0
local startDate , endDate = " " , " "
local lastSegment
local totalSegments = 0
if ( Details.mythic_plus . reverse_death_log ) then
for i = 1 , 40 do --copy the deaths from the first segment to the last one
local thisCombat = segmentsTable [ i ]
if ( thisCombat and thisCombat.is_mythic_dungeon_run_id == Details.mythic_dungeon_id ) then
newCombat : CopyDeathsFrom ( thisCombat , true )
end
end
else
for i = 40 , 1 , - 1 do --copy the deaths from the last segment to the new segment
local thisCombat = segmentsTable [ i ]
if ( thisCombat ) then
if ( thisCombat.is_mythic_dungeon_run_id == Details.mythic_dungeon_id ) then
newCombat : CopyDeathsFrom ( thisCombat , true )
end
end
end
end
--add all boss segments from this run to this new segment
for i = 1 , 40 do --from the newer combat to the oldest
local thisCombat = segmentsTable [ i ]
if ( thisCombat and thisCombat.is_mythic_dungeon_run_id == Details.mythic_dungeon_id ) then
local canAddThisSegment = true
if ( Details.mythic_plus . make_overall_boss_only ) then
if ( not thisCombat.is_boss ) then
canAddThisSegment = false
end
end
if ( canAddThisSegment ) then
newCombat = newCombat + thisCombat
--newCombat:CopyDeathsFrom(thisCombat, true)
totalTime = totalTime + thisCombat : GetCombatTime ( )
totalSegments = totalSegments + 1
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " MergeSegmentsOnEnd() > adding time: " , thisCombat : GetCombatTime ( ) , thisCombat.is_boss and thisCombat.is_boss . name )
end
if ( endDate == " " ) then
local _ , whenEnded = thisCombat : GetDate ( )
endDate = whenEnded
end
lastSegment = thisCombat
end
end
end
--get the date where the first segment started
if ( lastSegment ) then
startDate = lastSegment : GetDate ( )
end
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MergeSegmentsOnEnd() > totalTime: " , totalTime , " startDate: " , startDate )
end
local zoneName , instanceType , difficultyID , difficultyName , maxPlayers , dynamicDifficulty , isDynamic , instanceMapID , instanceGroupSize = GetInstanceInfo ( )
--tag the segment as mythic overall segment
newCombat.is_mythic_dungeon = {
StartedAt = Details.MythicPlus . StartedAt , --the start of the run
EndedAt = Details.MythicPlus . EndedAt , --the end of the run
SegmentID = " overall " , --segment number within the dungeon
RunID = Details.mythic_dungeon_id ,
OverallSegment = true ,
ZoneName = Details.MythicPlus . DungeonName ,
MapID = instanceMapID ,
Level = Details.MythicPlus . Level ,
EJID = Details.MythicPlus . ejID ,
}
newCombat.total_segments_added = totalSegments
newCombat.is_mythic_dungeon_segment = true
newCombat.is_mythic_dungeon_run_id = Details.mythic_dungeon_id
--set the segment time and date
newCombat : SetStartTime ( GetTime ( ) - totalTime )
newCombat : SetEndTime ( GetTime ( ) )
newCombat : SetDate ( startDate , endDate )
--immediatly finishes the segment just started
Details : SairDoCombate ( )
--update all windows
Details : InstanceCallDetailsFunc ( Details.FadeHandler . Fader , " IN " , nil , " barras " )
Details : InstanceCallDetailsFunc ( Details.UpdateCombatObjectInUse )
Details : InstanceCallDetailsFunc ( Details.AtualizaSoloMode_AfertReset )
Details : InstanceCallDetailsFunc ( Details.ResetaGump )
Details : RefreshMainWindow ( - 1 , true )
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MergeSegmentsOnEnd() > finished merging segments. " )
print ( " Details! " , " MergeSegmentsOnEnd() > all done, check in the segments list if everything is correct, if something is weird: '/details feedback' thanks in advance! " )
end
local lower_instance = Details : GetLowerInstanceNumber ( )
if ( lower_instance ) then
local instance = Details : GetInstance ( lower_instance )
if ( instance ) then
local func = { function ( ) end }
instance : InstanceAlert ( " Showing Mythic+ Run Segment " , { [[Interface\AddOns\Details\images\icons]] , 16 , 16 , false , 434 / 512 , 466 / 512 , 243 / 512 , 273 / 512 } , 6 , func , true )
end
end
end
--after each boss fight, if enalbed on settings, create an extra segment with all trash segments from the boss just killed
function DetailsMythicPlusFrame . MergeTrashCleanup ( isFromSchedule )
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MergeTrashCleanup() > running " , DetailsMythicPlusFrame.TrashMergeScheduled and # DetailsMythicPlusFrame.TrashMergeScheduled )
end
local segmentsToMerge = DetailsMythicPlusFrame.TrashMergeScheduled
--table exists and there's at least one segment
if ( segmentsToMerge and segmentsToMerge [ 1 ] ) then
Details222.MythicPlus . LogStep ( " MergeTrashCleanup started. " )
--the first segment is the segment where all other trash segments will be added
local masterSegment = segmentsToMerge [ 1 ]
masterSegment.is_mythic_dungeon_trash = nil
--get the current combat just created and the table with all past segments
local newCombat = masterSegment
local totalTime = newCombat : GetCombatTime ( )
local startDate , endDate = " " , " "
local lastSegment
--add segments
for i = 2 , # segmentsToMerge do --segment #1 is the host
local pastCombat = segmentsToMerge [ i ]
newCombat = newCombat + pastCombat
totalTime = totalTime + pastCombat : GetCombatTime ( )
newCombat : CopyDeathsFrom ( pastCombat , true )
--tag this combat as already added to a boss trash overall
pastCombat._trashoverallalreadyadded = true
if ( endDate == " " ) then
local _ , whenEnded = pastCombat : GetDate ( )
endDate = whenEnded
end
lastSegment = pastCombat
end
--get the date where the first segment started
if ( lastSegment ) then
startDate = lastSegment : GetDate ( )
end
local zoneName , instanceType , difficultyID , difficultyName , maxPlayers , dynamicDifficulty , isDynamic , instanceMapID , instanceGroupSize = GetInstanceInfo ( )
--tag the segment as mythic overall segment
newCombat.is_mythic_dungeon = {
StartedAt = segmentsToMerge.PreviousBossKilledAt , --start of the mythic run or when the previous boss got killed
EndedAt = segmentsToMerge.LastBossKilledAt , --the time() when encounter_end got triggered
SegmentID = " trashoverall " ,
RunID = Details.mythic_dungeon_id ,
TrashOverallSegment = true ,
ZoneName = Details.MythicPlus . DungeonName ,
MapID = instanceMapID ,
Level = Details.MythicPlus . Level ,
EJID = Details.MythicPlus . ejID ,
EncounterID = segmentsToMerge.EncounterID ,
EncounterName = segmentsToMerge.EncounterName or Loc [ " STRING_UNKNOW " ] ,
}
newCombat.is_mythic_dungeon_segment = true
newCombat.is_mythic_dungeon_run_id = Details.mythic_dungeon_id
--set the segment time / using a sum of combat times, this combat time is reliable
newCombat : SetStartTime ( GetTime ( ) - totalTime )
newCombat : SetEndTime ( GetTime ( ) )
--set the segment date
newCombat : SetDate ( startDate , endDate )
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MergeTrashCleanup() > finished merging trash segments. " , Details.tabela_vigente , Details.tabela_vigente . is_boss )
end
--delete all segments that were merged
local segmentsTable = Details : GetCombatSegments ( )
for segmentId = # segmentsTable , 1 , - 1 do
local segment = segmentsTable [ segmentId ]
if ( segment and segment._trashoverallalreadyadded ) then
tremove ( segmentsTable , segmentId )
end
end
for i = # segmentsToMerge , 1 , - 1 do
tremove ( segmentsToMerge , i )
end
--call the segment removed event to notify third party addons
Details : SendEvent ( " DETAILS_DATA_SEGMENTREMOVED " )
--update all windows
Details : InstanceCallDetailsFunc ( Details.FadeHandler . Fader , " IN " , nil , " barras " )
Details : InstanceCallDetailsFunc ( Details.UpdateCombatObjectInUse )
Details : InstanceCallDetailsFunc ( Details.AtualizaSoloMode_AfertReset )
Details : InstanceCallDetailsFunc ( Details.ResetaGump )
Details : RefreshMainWindow ( - 1 , true )
else
Details222.MythicPlus . LogStep ( " MergeTrashCleanup | no segments to merge. " )
end
end
--this function merges trash segments after all bosses of the mythic dungeon are defeated
--happens when the group finishes all bosses but don't complete the trash requirement
function DetailsMythicPlusFrame . MergeRemainingTrashAfterAllBossesDone ( )
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MergeRemainingTrashAfterAllBossesDone() > running, #segments: " , # DetailsMythicPlusFrame.TrashMergeScheduled2 , " trash overall table: " , DetailsMythicPlusFrame.TrashMergeScheduled2_OverallCombat )
end
Details222.MythicPlus . LogStep ( " running MergeRemainingTrashAfterAllBossesDone. " )
local segmentsToMerge = DetailsMythicPlusFrame.TrashMergeScheduled2
local overallCombat = DetailsMythicPlusFrame.TrashMergeScheduled2_OverallCombat
--needs to merge, add the total combat time, set the date end to the date of the first segment
local totalTime = 0
local startDate , endDate = " " , " "
local lastSegment
--add segments
for i , pastCombat in ipairs ( segmentsToMerge ) do
overallCombat = overallCombat + pastCombat
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " MergeRemainingTrashAfterAllBossesDone() > segment added " )
end
totalTime = totalTime + pastCombat : GetCombatTime ( )
--tag this combat as already added to a boss trash overall
pastCombat._trashoverallalreadyadded = true
if ( endDate == " " ) then --get the end date of the first index only
local _ , whenEnded = pastCombat : GetDate ( )
endDate = whenEnded
end
lastSegment = pastCombat
end
--set the segment time / using a sum of combat times, this combat time is reliable
local startTime = overallCombat : GetStartTime ( )
overallCombat : SetStartTime ( startTime - totalTime )
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " MergeRemainingTrashAfterAllBossesDone() > total combat time: " , totalTime )
end
--set the segment date
local startDate = overallCombat : GetDate ( )
overallCombat : SetDate ( startDate , endDate )
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " MergeRemainingTrashAfterAllBossesDone() > new end date: " , endDate )
end
local mythicDungeonInfo = overallCombat : GetMythicDungeonInfo ( )
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " MergeRemainingTrashAfterAllBossesDone() > elapsed time before: " , mythicDungeonInfo.EndedAt - mythicDungeonInfo.StartedAt )
end
mythicDungeonInfo.StartedAt = mythicDungeonInfo.StartedAt - ( Details.MythicPlus . EndedAt - Details.MythicPlus . PreviousBossKilledAt )
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " MergeRemainingTrashAfterAllBossesDone() > elapsed time after: " , mythicDungeonInfo.EndedAt - mythicDungeonInfo.StartedAt )
end
--remove trash segments from the segment history after the merge
local removedCurrentSegment = false
local segmentsTable = Details : GetCombatSegments ( )
for _ , pastCombat in ipairs ( segmentsToMerge ) do
for i = # segmentsTable , 1 , - 1 do
local segment = segmentsTable [ i ]
if ( segment == pastCombat ) then
--remove the segment
if ( Details.tabela_vigente == segment ) then
removedCurrentSegment = true
end
tremove ( segmentsTable , i )
break
end
end
end
for i = # segmentsToMerge , 1 , - 1 do
tremove ( segmentsToMerge , i )
end
if ( removedCurrentSegment ) then
--find another current segment
local segmentsTable = Details : GetCombatSegments ( )
Details.tabela_vigente = segmentsTable [ 1 ]
if ( not Details.tabela_vigente ) then
--assuming there's no segment from the dungeon run
Details : EntrarEmCombate ( )
Details : SairDoCombate ( )
end
--update all windows
Details : InstanceCallDetailsFunc ( Details.FadeHandler . Fader , " IN " , nil , " barras " )
Details : InstanceCallDetailsFunc ( Details.UpdateCombatObjectInUse )
Details : InstanceCallDetailsFunc ( Details.AtualizaSoloMode_AfertReset )
Details : InstanceCallDetailsFunc ( Details.ResetaGump )
Details : RefreshMainWindow ( - 1 , true )
end
Details222.MythicPlus . LogStep ( " delete_trash_after_merge | concluded " )
Details : SendEvent ( " DETAILS_DATA_SEGMENTREMOVED " )
DetailsMythicPlusFrame.TrashMergeScheduled2 = nil
DetailsMythicPlusFrame.TrashMergeScheduled2_OverallCombat = nil
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MergeRemainingTrashAfterAllBossesDone() > done merging " )
end
end
--this function is called right after defeat a boss inside a mythic dungeon
--it comes from details! control leave combat
function DetailsMythicPlusFrame . BossDefeated ( this_is_end_end , encounterID , encounterName , difficultyID , raidSize , endStatus ) --hold your breath and count to ten
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " BossDefeated() > boss defeated | SegmentID: " , Details.MythicPlus . SegmentID , " | mapID: " , Details.MythicPlus . DungeonID )
end
local zoneName , instanceType , difficultyID , difficultyName , maxPlayers , dynamicDifficulty , isDynamic , instanceMapID , instanceGroupSize = GetInstanceInfo ( )
--add the mythic dungeon info to the combat
Details.tabela_vigente . is_mythic_dungeon = {
StartedAt = Details.MythicPlus . StartedAt , --the start of the run
EndedAt = time ( ) , --when the boss got killed
SegmentID = Details.MythicPlus . SegmentID , --segment number within the dungeon
EncounterID = encounterID ,
EncounterName = encounterName or Loc [ " STRING_UNKNOW " ] ,
RunID = Details.mythic_dungeon_id ,
ZoneName = Details.MythicPlus . DungeonName ,
MapID = Details.MythicPlus . DungeonID ,
OverallSegment = false ,
Level = Details.MythicPlus . Level ,
EJID = Details.MythicPlus . ejID ,
}
local mythicLevel = C_ChallengeMode.GetActiveKeystoneInfo ( )
local mPlusTable = Details.tabela_vigente . is_mythic_dungeon
Details222.MythicPlus . LogStep ( " BossDefeated | key level: | " .. mythicLevel .. " | " .. ( mPlusTable.EncounterName or " " ) .. " | " .. ( mPlusTable.ZoneName or " " ) )
--check if need to merge the trash for this boss
if ( Details.mythic_plus . merge_boss_trash and not Details.MythicPlus . IsRestoredState ) then
--store on an table all segments which should be merged
local segmentsToMerge = DetailsMythicPlusFrame.TrashMergeScheduled or { }
--table with all past semgnets
local segmentsTable = Details : GetCombatSegments ( )
--iterate among segments
for i = 1 , 25 do --from the newer combat to the oldest
local pastCombat = segmentsTable [ i ]
--does the combat exists
if ( pastCombat and not pastCombat._trashoverallalreadyadded and pastCombat.is_mythic_dungeon_trash ) then
--is the combat a mythic segment from this run?
local isMythicSegment , SegmentID = pastCombat : IsMythicDungeon ( )
if ( isMythicSegment and SegmentID == Details.mythic_dungeon_id and not pastCombat.is_boss ) then
local mythicDungeonInfo = pastCombat : GetMythicDungeonInfo ( ) -- .is_mythic_dungeon only boss, trash overall and run overall have it
if ( not mythicDungeonInfo or not mythicDungeonInfo.TrashOverallSegment ) then
--trash segment found, schedule to merge
table.insert ( segmentsToMerge , pastCombat )
end
end
end
end
--add encounter information
segmentsToMerge.EncounterID = encounterID
segmentsToMerge.EncounterName = encounterName
segmentsToMerge.PreviousBossKilledAt = Details.MythicPlus . PreviousBossKilledAt
--reduce this boss encounter time from the trash lenght time, since the boss doesn't count towards the time spent cleaning trash
segmentsToMerge.LastBossKilledAt = time ( ) - Details.tabela_vigente : GetCombatTime ( )
DetailsMythicPlusFrame.TrashMergeScheduled = segmentsToMerge
--there's no more script run too long
--if (not InCombatLockdown() and not UnitAffectingCombat("player")) then
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " BossDefeated() > not in combat, merging trash now " )
end
--merge the trash clean up
DetailsMythicPlusFrame.MergeTrashCleanup ( )
--else
-- if (DetailsMythicPlusFrame.DevelopmentDebug) then
-- print("Details!", "BossDefeated() > player in combatlockdown, scheduling trash merge")
-- end
-- _detalhes.schedule_mythicdungeon_trash_merge = true
--end
end
--close the combat
if ( this_is_end_end ) then
--player left the dungeon
--had some deprecated code removed about alweays in combat
else
--increase the segment number for the mythic run
Details.MythicPlus . SegmentID = Details.MythicPlus . SegmentID + 1
--register the time when the last boss has been killed (started a clean up for the next trash)
Details.MythicPlus . PreviousBossKilledAt = time ( )
--update the saved table inside the profile
Details : UpdateState_CurrentMythicDungeonRun ( true , Details.MythicPlus . SegmentID , Details.MythicPlus . PreviousBossKilledAt )
end
end
function DetailsMythicPlusFrame . MythicDungeonFinished ( fromZoneLeft )
if ( DetailsMythicPlusFrame.IsDoingMythicDungeon ) then
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MythicDungeonFinished() > the dungeon was a Mythic+ and just ended. " )
end
DetailsMythicPlusFrame.IsDoingMythicDungeon = false
Details.MythicPlus . Started = false
Details.MythicPlus . EndedAt = time ( ) - 1.9
Details : UpdateState_CurrentMythicDungeonRun ( )
--at this point, details! should not be in combat, but if something triggered a combat start, just close the combat right away
if ( Details.in_combat ) then
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MythicDungeonFinished() > was in combat, calling SairDoCombate(): " , InCombatLockdown ( ) )
end
Details : SairDoCombate ( )
Details222.MythicPlus . LogStep ( " MythicDungeonFinished() | Details was in combat. " )
end
local segmentsToMerge = { }
--check if there is trash segments after the last boss. need to merge these segments with the trash segment of the last boss
local bCanMergeBossTrash = Details.mythic_plus . merge_boss_trash
Details222.MythicPlus . LogStep ( " MythicDungeonFinished() | merge_boss_trash = " .. ( bCanMergeBossTrash and " true " or " false " ) )
if ( bCanMergeBossTrash and not Details.MythicPlus . IsRestoredState and not fromZoneLeft ) then
--is the current combat not a boss fight?
--this mean a combat was opened after the last boss of the dungeon was killed
if ( not Details.tabela_vigente . is_boss and Details.tabela_vigente : GetCombatTime ( ) > 5 ) then
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MythicDungeonFinished() > the last combat isn't a boss fight, might have trash after bosses done. " )
end
--table with all past semgnets
local segmentsTable = Details : GetCombatSegments ( )
for i = 1 , # segmentsTable do
local pastCombat = segmentsTable [ i ]
--does the combat exists
if ( pastCombat and not pastCombat._trashoverallalreadyadded and pastCombat : GetCombatTime ( ) > 5 ) then
--is the last boss?
if ( pastCombat.is_boss ) then
break
end
--is the combat a mythic segment from this run?
local isMythicSegment , SegmentID = pastCombat : IsMythicDungeon ( )
if ( isMythicSegment and SegmentID == Details.mythic_dungeon_id and pastCombat.is_mythic_dungeon_trash ) then
--if have mythic dungeon info, cancel the loop
local mythicDungeonInfo = pastCombat : GetMythicDungeonInfo ( )
if ( mythicDungeonInfo ) then
break
end
--merge this segment
table.insert ( segmentsToMerge , pastCombat )
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " MythicDungeonFinished() > found after last boss combat " )
end
end
end
end
end
end
if ( # segmentsToMerge > 0 ) then
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MythicDungeonFinished() > found " , # segmentsToMerge , " segments after the last boss " )
end
--find the latest trash overall
local segmentsTable = Details : GetCombatSegments ( )
local latestTrashOverall
for i = 1 , # segmentsTable do
local pastCombat = segmentsTable [ i ]
if ( pastCombat and pastCombat.is_mythic_dungeon and pastCombat.is_mythic_dungeon . SegmentID == " trashoverall " ) then
latestTrashOverall = pastCombat
break
end
end
if ( latestTrashOverall ) then
--stores the segment table and the trash overall segment to use on the merge
DetailsMythicPlusFrame.TrashMergeScheduled2 = segmentsToMerge
DetailsMythicPlusFrame.TrashMergeScheduled2_OverallCombat = latestTrashOverall
--there's no more script ran too long
--if (not InCombatLockdown() and not UnitAffectingCombat("player")) then
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MythicDungeonFinished() > not in combat, merging last pack of trash now " )
end
DetailsMythicPlusFrame.MergeRemainingTrashAfterAllBossesDone ( )
--else
-- if (DetailsMythicPlusFrame.DevelopmentDebug) then
-- print("Details!", "MythicDungeonFinished() > player in combatlockdown, scheduling the merge for last trash packs")
-- end
-- _detalhes.schedule_mythicdungeon_endtrash_merge = true
--end
end
end
--merge segments
if ( Details.mythic_plus . make_overall_when_done and not Details.MythicPlus . IsRestoredState and not fromZoneLeft ) then
--if (not InCombatLockdown() and not UnitAffectingCombat("player")) then
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MythicDungeonFinished() > not in combat, creating overall segment now " )
end
DetailsMythicPlusFrame.MergeSegmentsOnEnd ( )
--else
-- if (DetailsMythicPlusFrame.DevelopmentDebug) then
-- print("Details!", "MythicDungeonFinished() > player in combatlockdown, scheduling the creation of the overall segment")
-- end
-- _detalhes.schedule_mythicdungeon_overallrun_merge = true
--end
end
Details.MythicPlus . IsRestoredState = nil
--shutdown parser for a few seconds to avoid opening new segments after the run ends
if ( not fromZoneLeft ) then
Details : CaptureSet ( false , " damage " , false , 15 )
Details : CaptureSet ( false , " energy " , false , 15 )
Details : CaptureSet ( false , " aura " , false , 15 )
Details : CaptureSet ( false , " energy " , false , 15 )
Details : CaptureSet ( false , " spellcast " , false , 15 )
end
--store data
--[=[
local expansion = tostring ( select ( 4 , GetBuildInfo ( ) ) ) : match ( " %d%d " )
if ( expansion and type ( expansion ) == " string " and string.len ( expansion ) == 2 ) then
local expansionDungeonData = _detalhes.dungeon_data [ expansion ]
if ( not expansionDungeonData ) then
expansionDungeonData = { }
_detalhes.dungeon_data [ expansion ] = expansionDungeonData
end
--store information about the dungeon run
--the the dungeon ID, can't be localized
--players in the group
--difficulty level
--
end
--]=]
end
end
function DetailsMythicPlusFrame . MythicDungeonStarted ( )
--flag as a mythic dungeon
DetailsMythicPlusFrame.IsDoingMythicDungeon = true
--this counter is individual for each character
Details.mythic_dungeon_id = Details.mythic_dungeon_id + 1
local mythicLevel = C_ChallengeMode.GetActiveKeystoneInfo ( )
local zoneName , _ , _ , _ , _ , _ , _ , currentZoneID = GetInstanceInfo ( )
local mapID = C_Map.GetBestMapForUnit ( " player " )
if ( not mapID ) then
return
end
local ejID = DF.EncounterJournal . EJ_GetInstanceForMap ( mapID )
--setup the mythic run info
Details.MythicPlus . Started = true
Details.MythicPlus . DungeonName = zoneName
Details.MythicPlus . DungeonID = currentZoneID
Details.MythicPlus . StartedAt = time ( ) + 9.7 --there's the countdown timer of 10 seconds
Details.MythicPlus . EndedAt = nil --reset
Details.MythicPlus . SegmentID = 1
Details.MythicPlus . Level = mythicLevel
Details.MythicPlus . ejID = ejID
Details.MythicPlus . PreviousBossKilledAt = time ( )
Details : SaveState_CurrentMythicDungeonRun ( Details.mythic_dungeon_id , zoneName , currentZoneID , time ( ) + 9.7 , 1 , mythicLevel , ejID , time ( ) )
local name , groupType , difficultyID , difficult = GetInstanceInfo ( )
if ( groupType == " party " and Details.overall_clear_newchallenge ) then
Details.historico : ResetOverallData ( )
Details : Msg ( " overall data are now reset. " )
if ( Details.debug ) then
Details : Msg ( " (debug) timer is for a mythic+ dungeon, overall has been reseted. " )
end
end
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , " MythicDungeonStarted() > State set to Mythic Dungeon, new combat starting in 10 seconds. " )
end
end
function DetailsMythicPlusFrame . OnChallengeModeStart ( )
--is this a mythic dungeon?
local _ , _ , difficulty , _ , _ , _ , _ , currentZoneID = GetInstanceInfo ( )
if ( difficulty == 8 and DetailsMythicPlusFrame.LastTimer and DetailsMythicPlusFrame.LastTimer + 2 > GetTime ( ) ) then
--start the dungeon on Details!
DetailsMythicPlusFrame.MythicDungeonStarted ( )
--print("D! mythic dungeon started!")
else
--print("D! mythic dungeon was already started!")
--from zone changed
local mythicLevel = C_ChallengeMode.GetActiveKeystoneInfo ( )
local zoneName , _ , _ , _ , _ , _ , _ , currentZoneID = GetInstanceInfo ( )
--print("Details.MythicPlus.Started", Details.MythicPlus.Started)
--print("Details.MythicPlus.DungeonID", Details.MythicPlus.DungeonID)
--print("currentZoneID", currentZoneID)
--print("Details.MythicPlus.Level", Details.MythicPlus.Level)
--print("mythicLevel", mythicLevel)
if ( not Details.MythicPlus . Started and Details.MythicPlus . DungeonID == currentZoneID and Details.MythicPlus . Level == mythicLevel ) then
Details.MythicPlus . Started = true
Details.MythicPlus . EndedAt = nil
Details.mythic_dungeon_currentsaved . started = true
DetailsMythicPlusFrame.IsDoingMythicDungeon = true
--print("D! mythic dungeon was NOT already started! debug 2")
end
end
end
--make an event listener to sync combat data
DetailsMythicPlusFrame.EventListener = Details : CreateEventListener ( )
DetailsMythicPlusFrame.EventListener : RegisterEvent ( " COMBAT_ENCOUNTER_START " )
DetailsMythicPlusFrame.EventListener : RegisterEvent ( " COMBAT_ENCOUNTER_END " )
DetailsMythicPlusFrame.EventListener : RegisterEvent ( " COMBAT_PLAYER_ENTER " )
DetailsMythicPlusFrame.EventListener : RegisterEvent ( " COMBAT_PLAYER_LEAVE " )
DetailsMythicPlusFrame.EventListener : RegisterEvent ( " COMBAT_MYTHICDUNGEON_START " )
DetailsMythicPlusFrame.EventListener : RegisterEvent ( " COMBAT_MYTHICDUNGEON_END " )
function DetailsMythicPlusFrame . EventListener . OnDetailsEvent ( contextObject , event , ... )
--these events triggers within Details control functions, they run exactly after details! creates or close a segment
if ( event == " COMBAT_PLAYER_ENTER " ) then
elseif ( event == " COMBAT_PLAYER_LEAVE " ) then
--ignore the event if ignoring mythic dungeon special treatment
if ( Details.streamer_config . disable_mythic_dungeon ) then
return
end
if ( DetailsMythicPlusFrame.IsDoingMythicDungeon ) then
local combatObject = ...
if ( combatObject.is_boss ) then
if ( not combatObject.is_boss . killed ) then
local encounterName = combatObject.is_boss . encounter
local zoneName = combatObject.is_boss . zone
local mythicLevel = C_ChallengeMode.GetActiveKeystoneInfo ( )
--just in case the combat get tagged as boss fight
Details.tabela_vigente . is_boss = nil
--tag the combat as mythic dungeon trash
local zoneName , instanceType , difficultyID , difficultyName , maxPlayers , dynamicDifficulty , isDynamic , instanceMapID , instanceGroupSize = GetInstanceInfo ( )
Details.tabela_vigente . is_mythic_dungeon_trash = {
ZoneName = zoneName ,
MapID = instanceMapID ,
Level = Details.MythicPlus . Level ,
EJID = Details.MythicPlus . ejID ,
}
Details222.MythicPlus . LogStep ( " COMBAT_PLAYER_LEAVE | wiped on boss | key level: | " .. mythicLevel .. " | " .. ( encounterName or " " ) .. " " .. zoneName )
else
DetailsMythicPlusFrame.BossDefeated ( false , combatObject.is_boss . id , combatObject.is_boss . name , combatObject.is_boss . diff , 5 , 1 )
end
end
end
elseif ( event == " COMBAT_ENCOUNTER_START " ) then
--ignore the event if ignoring mythic dungeon special treatment
if ( Details.streamer_config . disable_mythic_dungeon ) then
Details222.MythicPlus . LogStep ( " COMBAT_ENCOUNTER_START | streamer_config.disable_mythic_dungeon is true and the code cannot continue. " )
return
end
local encounterID , encounterName , difficultyID , raidSize , endStatus = ...
--nothing
elseif ( event == " COMBAT_ENCOUNTER_END " ) then
--ignore the event if ignoring mythic dungeon special treatment
if ( Details.streamer_config . disable_mythic_dungeon ) then
Details222.MythicPlus . LogStep ( " COMBAT_ENCOUNTER_END | streamer_config.disable_mythic_dungeon is true and the code cannot continue. " )
return
end
local encounterID , encounterName , difficultyID , raidSize , endStatus = ...
--nothing
elseif ( event == " COMBAT_MYTHICDUNGEON_START " ) then
local lowerInstance = Details : GetLowerInstanceNumber ( )
if ( lowerInstance ) then
lowerInstance = Details : GetInstance ( lowerInstance )
if ( lowerInstance ) then
C_Timer.After ( 3 , function ( )
if ( lowerInstance : IsEnabled ( ) ) then
--todo, need localization
lowerInstance : InstanceAlert ( " Details! " .. " " .. " Damage " .. " " .. " Meter " , { [[Interface\AddOns\Details\images\minimap]] , 16 , 16 , false } , 3 , { function ( ) end } , false , true )
end
end )
end
end
--ignore the event if ignoring mythic dungeon special treatment
if ( Details.streamer_config . disable_mythic_dungeon ) then
return
end
--reset spec cache if broadcaster requested
if ( Details.streamer_config . reset_spec_cache ) then
Details : Destroy ( Details.cached_specs )
end
C_Timer.After ( 0.5 , DetailsMythicPlusFrame.OnChallengeModeStart )
--debugging
local mPlusSettings = Details.mythic_plus
local result = " "
for key , value in pairs ( Details.mythic_plus ) do
if ( type ( value ) ~= " table " ) then
result = result .. key .. " = " .. tostring ( value ) .. " | "
end
end
local mythicLevel = C_ChallengeMode.GetActiveKeystoneInfo ( )
local zoneName , _ , _ , _ , _ , _ , _ , currentZoneID = GetInstanceInfo ( )
Details222.MythicPlus . LogStep ( " CHALLENGE_MODE_START | settings: " .. result .. " | level: " .. mythicLevel .. " | zone: " .. zoneName .. " | zoneId: " .. currentZoneID )
elseif ( event == " COMBAT_MYTHICDUNGEON_END " ) then
--ignore the event if ignoring mythic dungeon special treatment
if ( Details.streamer_config . disable_mythic_dungeon ) then
Details222.MythicPlus . LogStep ( " COMBAT_MYTHICDUNGEON_END | streamer_config.disable_mythic_dungeon is true and the code cannot continue. " )
return
end
--delay to wait the encounter_end trigger first
--assuming here the party cleaned the mobs kill objective before going to kill the last boss
C_Timer.After ( 2 , DetailsMythicPlusFrame.MythicDungeonFinished )
end
end
DetailsMythicPlusFrame : SetScript ( " OnEvent " , function ( _ , event , ... )
if ( event == " START_TIMER " ) then
DetailsMythicPlusFrame.LastTimer = GetTime ( )
elseif ( event == " ZONE_CHANGED_NEW_AREA " ) then
if ( DetailsMythicPlusFrame.IsDoingMythicDungeon ) then
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Details! " , event , ... )
print ( " Zone changed and is Doing Mythic Dungeon " )
end
--ignore the event if ignoring mythic dungeon special treatment
if ( Details.streamer_config . disable_mythic_dungeon ) then
Details222.MythicPlus . LogStep ( " ZONE_CHANGED_NEW_AREA | streamer_config.disable_mythic_dungeon is true and the code cannot continue. " )
return
end
local _ , _ , difficulty , _ , _ , _ , _ , currentZoneID = GetInstanceInfo ( )
if ( currentZoneID ~= Details.MythicPlus . DungeonID ) then
if ( DetailsMythicPlusFrame.DevelopmentDebug ) then
print ( " Zone changed and the zone is different than the dungeon " )
end
Details222.MythicPlus . LogStep ( " ZONE_CHANGED_NEW_AREA | player has left the dungeon and Details! finished the dungeon because of that. " )
--send mythic dungeon end event
Details : SendEvent ( " COMBAT_MYTHICDUNGEON_END " )
--finish the segment
DetailsMythicPlusFrame.BossDefeated ( true )
--finish the mythic run
DetailsMythicPlusFrame.MythicDungeonFinished ( true )
end
end
end
end )