ee0b350aba
- Dungeon followers now correctly show into the damage done section. - Fixed an error while statusbar plugin options. - Framework update. - Mythic Dungeon Plus code has been separated into six files (was just 2), this will help with the organization and maintenance of the code.
720 lines
31 KiB
Lua
720 lines
31 KiB
Lua
|
|
local Details = _G.Details
|
|
local debugmode = false --print debug lines
|
|
local verbosemode = false --auto open the chart panel
|
|
local addonName, Details222 = ...
|
|
local mPlus = Details222.MythicPlusBreakdown
|
|
local detailsFramework = DetailsFramework
|
|
local _
|
|
|
|
local CreateFrame = CreateFrame
|
|
local UnitExists = UnitExists
|
|
local UnitGroupRolesAssigned = UnitGroupRolesAssigned
|
|
local UIParent = UIParent
|
|
local PixelUtil = PixelUtil
|
|
local C_Timer = C_Timer
|
|
|
|
local Loc = _G.LibStub("AceLocale-3.0"):GetLocale("Details")
|
|
|
|
local mythicDungeonCharts = Details222.MythicPlus.Charts.Listener
|
|
local mythicDungeonFrames = Details222.MythicPlus.Frames
|
|
|
|
--debug
|
|
--_G.DetailsMythicDungeonChartHandler = mythicDungeonCharts
|
|
|
|
|
|
local createPlayerBanner = function(parent, name)
|
|
local template = "ChallengeModeBannerPartyMemberTemplate"
|
|
local playerFrame = CreateFrame("frame", name, parent, template)
|
|
playerFrame:SetAlpha(1)
|
|
playerFrame:EnableMouse(true)
|
|
playerFrame:SetFrameLevel(parent:GetFrameLevel()+2)
|
|
|
|
local playerNameFontString = playerFrame:CreateFontString("$parentPlayerNameText", "overlay", "GameFontNormal")
|
|
playerNameFontString:SetTextColor(1, 1, 1)
|
|
playerNameFontString:SetPoint("top", playerFrame, "bottom", -1, -7)
|
|
DetailsFramework:SetFontSize(playerNameFontString, 12)
|
|
playerFrame.PlayerNameFontString = playerNameFontString
|
|
|
|
local playerNameBackgroundTexture = playerFrame:CreateTexture("$parentPlayerNameBackgroundTexture", "overlay", nil, 6)
|
|
playerNameBackgroundTexture:SetTexture([[Interface\Cooldown\LoC-ShadowBG]])
|
|
playerNameBackgroundTexture:SetSize(68, 12)
|
|
playerNameBackgroundTexture:SetPoint("center", playerNameFontString, "center", 0, 0)
|
|
|
|
local backgroundBannerTexture = playerFrame:CreateTexture("$parentBannerTexture", "background", nil, 0)
|
|
backgroundBannerTexture:SetTexture([[Interface\ACHIEVEMENTFRAME\GuildTabard]])
|
|
backgroundBannerTexture:SetDrawLayer("background", 0)
|
|
backgroundBannerTexture:SetSize(63, 129)
|
|
backgroundBannerTexture:SetTexCoord(5/128, 68/128, 123/256, 252/256)
|
|
backgroundBannerTexture:SetPoint("topleft", playerFrame, "bottomleft", -5, playerFrame:GetHeight()/2)
|
|
backgroundBannerTexture:SetPoint("topright", playerFrame, "bottomright", 4, playerFrame:GetHeight()/2)
|
|
backgroundBannerTexture:SetVertexColor(.1, .1, .1)
|
|
playerFrame.BackgroundBannerTexture = backgroundBannerTexture
|
|
|
|
local backgroundBannerBorderTexture = playerFrame:CreateTexture("$parentBannerBorderTexture", "highlight", nil, -1)
|
|
backgroundBannerBorderTexture:SetAtlas("UI-Achievement-Guild-Flag-Outline")
|
|
backgroundBannerBorderTexture:SetSize(63, 129)
|
|
backgroundBannerBorderTexture:SetPoint("topleft", playerFrame, "bottomleft", -5, playerFrame:GetHeight()/2)
|
|
backgroundBannerBorderTexture:SetPoint("topright", playerFrame, "bottomright", 4, playerFrame:GetHeight()/2)
|
|
|
|
local dungeonTexture = playerFrame:CreateTexture("$parentDungeonTexture", "artwork")
|
|
dungeonTexture:SetTexCoord(25/512, 360/512, 50/512, 290/512)
|
|
dungeonTexture:SetSize(50, 39)
|
|
dungeonTexture:SetPoint("top", playerFrame,"bottom", 0, -16)
|
|
dungeonTexture:SetAlpha(0.9934)
|
|
playerFrame.DungeonTexture = dungeonTexture
|
|
|
|
local dungeonBorderTexture = playerFrame:CreateTexture("$parentDungeonBorder", "border")
|
|
dungeonBorderTexture:SetTexture([[Interface\BUTTONS\UI-EmptySlot]])
|
|
dungeonBorderTexture:SetDrawLayer("border", 0)
|
|
dungeonBorderTexture:ClearAllPoints()
|
|
dungeonBorderTexture:SetPoint("topleft", dungeonTexture,"topleft", -17, 15)
|
|
dungeonBorderTexture:SetPoint("bottomright", dungeonTexture,"bottomright", 18, -15)
|
|
dungeonBorderTexture:SetAlpha(1)
|
|
playerFrame.DungeonBorderTexture = dungeonBorderTexture
|
|
|
|
--load this addon, required to have access to the garrison templates
|
|
if (not C_AddOns.IsAddOnLoaded("Blizzard_GarrisonTemplates")) then
|
|
C_AddOns.LoadAddOn("Blizzard_GarrisonTemplates")
|
|
end
|
|
|
|
--animation for the key leveling up
|
|
local levelUpFrame = CreateFrame("frame", "$LevelUpFrame", playerFrame, "GarrisonFollowerLevelUpTemplate")
|
|
levelUpFrame:SetPoint("top", dungeonTexture, "bottom", 0, 44)
|
|
levelUpFrame:SetScale(0.9)
|
|
levelUpFrame.Text:SetText("")
|
|
playerFrame.LevelUpFrame = levelUpFrame
|
|
levelUpFrame:SetFrameLevel(playerFrame:GetFrameLevel()+1)
|
|
|
|
local levelUpTextFrame = CreateFrame("frame", "$LevelUpTextFrame", playerFrame)
|
|
levelUpTextFrame:SetPoint("top", dungeonTexture, "bottom", -1, -14)
|
|
levelUpTextFrame:SetFrameLevel(playerFrame:GetFrameLevel()+2)
|
|
levelUpTextFrame:SetSize(1, 1)
|
|
playerFrame.LevelUpTextFrame = levelUpTextFrame
|
|
--scaleX, scaleY, fadeInTime, fadeOutTime
|
|
local shakeAnimation = detailsFramework:CreateFrameShake(levelUpTextFrame, 0.8, 2, 200, false, false, 0, 1, 0.5, 0.15)
|
|
local shakeAnimation2 = detailsFramework:CreateFrameShake(levelUpTextFrame, 0.5, 1, 200, false, false, 0, 1, 0, 0)
|
|
|
|
local levelFontString = levelUpTextFrame:CreateFontString("$parentLVLText", "artwork", "GameFontNormal")
|
|
levelFontString:SetTextColor(1, 1, 1)
|
|
levelFontString:SetPoint("center", levelUpTextFrame, "center", 0, 0)
|
|
DetailsFramework:SetFontSize(levelFontString, 20)
|
|
levelFontString:SetText("")
|
|
playerFrame.LevelFontString = levelFontString
|
|
|
|
--> animations for levelFontString
|
|
local animationGroup = levelFontString:CreateAnimationGroup("DetailsMythicLevelTextAnimationGroup")
|
|
animationGroup:SetLooping("NONE")
|
|
levelFontString.AnimationGroup = animationGroup
|
|
|
|
do
|
|
levelFontString.translation = animationGroup:CreateAnimation("TRANSLATION")
|
|
levelFontString.translation:SetTarget(levelFontString)
|
|
levelFontString.translation:SetOrder(1)
|
|
levelFontString.translation:SetDuration(0.096000000834465)
|
|
levelFontString.translation:SetOffset(0, -4)
|
|
levelFontString.translation = animationGroup:CreateAnimation("TRANSLATION")
|
|
levelFontString.translation:SetTarget(levelFontString)
|
|
levelFontString.translation:SetOrder(2)
|
|
levelFontString.translation:SetDuration(0.11599999666214)
|
|
levelFontString.translation:SetOffset(0, 16)
|
|
levelFontString.rotation = animationGroup:CreateAnimation("ROTATION")
|
|
levelFontString.rotation:SetTarget(levelFontString)
|
|
levelFontString.rotation:SetOrder(3)
|
|
levelFontString.rotation:SetDuration(0.096000000834465)
|
|
levelFontString.rotation:SetDegrees(20)
|
|
levelFontString.rotation:SetOrigin("center", 0, 0)
|
|
levelFontString.rotation = animationGroup:CreateAnimation("ROTATION")
|
|
levelFontString.rotation:SetTarget(levelFontString)
|
|
levelFontString.rotation:SetOrder(4)
|
|
levelFontString.rotation:SetDuration(0.096000000834465)
|
|
levelFontString.rotation:SetDegrees(-20)
|
|
levelFontString.rotation:SetOrigin("center", 0, 0)
|
|
levelFontString.rotation = animationGroup:CreateAnimation("ROTATION")
|
|
levelFontString.rotation:SetTarget(levelFontString)
|
|
levelFontString.rotation:SetOrder(5)
|
|
levelFontString.rotation:SetDuration(0.195999994874)
|
|
levelFontString.rotation:SetDegrees(360)
|
|
levelFontString.rotation:SetOrigin("center", 0, 0)
|
|
levelFontString.translation = animationGroup:CreateAnimation("TRANSLATION")
|
|
levelFontString.translation:SetTarget(levelFontString)
|
|
levelFontString.translation:SetOrder(6)
|
|
levelFontString.translation:SetDuration(0.21599999070168)
|
|
levelFontString.translation:SetOffset(0, 9)
|
|
levelFontString.translation = animationGroup:CreateAnimation("TRANSLATION")
|
|
levelFontString.translation:SetTarget(levelFontString)
|
|
levelFontString.translation:SetOrder(7)
|
|
levelFontString.translation:SetDuration(0.046000000089407)
|
|
levelFontString.translation:SetOffset(0, -24)
|
|
end
|
|
|
|
function levelUpTextFrame.PlayAnimations(newLevel)
|
|
levelUpTextFrame:PlayFrameShake(shakeAnimation)
|
|
|
|
C_Timer.After(0.7, function()
|
|
playerFrame.LevelUpFrame:Show()
|
|
playerFrame.LevelUpFrame:SetAlpha(1)
|
|
playerFrame.LevelUpFrame.Anim:Play()
|
|
animationGroup:Play()
|
|
end)
|
|
|
|
C_Timer.After(0.7 + 0.5, function()
|
|
levelFontString:SetText(newLevel or "")
|
|
end)
|
|
|
|
C_Timer.After(1.65, function()
|
|
levelUpTextFrame:PlayFrameShake(shakeAnimation2)
|
|
end)
|
|
end
|
|
|
|
local flashTexture = playerFrame:CreateTexture("$parentFlashTexture", "overlay", nil, 6)
|
|
flashTexture:SetAtlas("UI-Achievement-Guild-Flag-Outline")
|
|
flashTexture:SetSize(63, 129)
|
|
flashTexture:SetPoint("topleft", playerFrame, "bottomleft", -5, playerFrame:GetHeight()/2)
|
|
flashTexture:SetPoint("topright", playerFrame, "bottomright", 4, playerFrame:GetHeight()/2)
|
|
flashTexture:Hide()
|
|
playerFrame.flashTexture = flashTexture
|
|
|
|
detailsFramework:CreateFlashAnimation(flashTexture)
|
|
--flashTexture:Flash(0.1, 0.5, 0.01)
|
|
|
|
local lootSquare = CreateFrame("frame", name, parent)
|
|
lootSquare:SetSize(46, 46)
|
|
lootSquare:SetPoint("top", playerFrame, "bottom", 0, -90)
|
|
lootSquare:SetFrameLevel(parent:GetFrameLevel()+1)
|
|
playerFrame.LootSquare = lootSquare
|
|
lootSquare:Hide()
|
|
|
|
lootSquare:SetScript("OnEnter", function(self)
|
|
if (self.itemLink) then
|
|
GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT")
|
|
GameTooltip:SetHyperlink(lootSquare.itemLink)
|
|
GameTooltip:Show()
|
|
end
|
|
end)
|
|
|
|
lootSquare:SetScript("OnLeave", function(self)
|
|
GameTooltip:Hide()
|
|
end)
|
|
|
|
local lootIcon = lootSquare:CreateTexture("$parentLootIcon", "artwork")
|
|
lootIcon:SetSize(46, 46)
|
|
lootIcon:SetPoint("center", lootSquare, "center", 0, 0)
|
|
lootIcon:SetTexture([[Interface\ICONS\INV_Misc_QuestionMark]])
|
|
lootSquare.LootIcon = lootIcon
|
|
|
|
local lootIconBorder = lootSquare:CreateTexture("$parentLootSquareBorder", "overlay")
|
|
lootIconBorder:SetTexture([[Interface\COMMON\WhiteIconFrame]])
|
|
lootIconBorder:SetTexCoord(0, 1, 0, 1)
|
|
lootIconBorder:SetSize(46, 46)
|
|
lootIconBorder:SetPoint("center", lootIcon, "center", 0, 0)
|
|
lootSquare.LootIconBorder = lootIconBorder
|
|
|
|
local lootItemLevel = lootSquare:CreateFontString("$parentLootItemLevel", "overlay", "GameFontNormal")
|
|
lootItemLevel:SetPoint("top", lootSquare, "bottom", 0, -2)
|
|
lootItemLevel:SetTextColor(1, 1, 1)
|
|
DetailsFramework:SetFontSize(lootItemLevel, 12)
|
|
lootSquare.LootItemLevel = lootItemLevel
|
|
|
|
return playerFrame
|
|
end
|
|
|
|
local updatPlayerBanner = function(unitId, bannerIndex)
|
|
if (UnitExists(unitId)) then
|
|
local readyFrame = DetailsMythicDungeonReadyFrame
|
|
local unitName = Details:GetFullName(unitId)
|
|
local libOpenRaid = LibStub("LibOpenRaid-1.0", true)
|
|
|
|
local playerBanner = readyFrame.PlayerBanners[bannerIndex]
|
|
readyFrame.playerCacheByName[unitName] = playerBanner
|
|
playerBanner.unitId = unitId
|
|
playerBanner.unitName = unitName
|
|
playerBanner:Show()
|
|
|
|
SetPortraitTexture(playerBanner.Portrait, unitId)
|
|
|
|
unitName = detailsFramework:RemoveRealmName(unitName)
|
|
playerBanner.PlayerNameFontString:SetText(unitName)
|
|
detailsFramework:TruncateText(playerBanner.PlayerNameFontString, 60)
|
|
|
|
local role = UnitGroupRolesAssigned(unitId)
|
|
if (role == "TANK" or role == "HEALER" or role == "DAMAGER") then
|
|
playerBanner.RoleIcon:SetAtlas(GetMicroIconForRole(role), TextureKitConstants.IgnoreAtlasSize)
|
|
playerBanner.RoleIcon:Show()
|
|
else
|
|
playerBanner.RoleIcon:Hide()
|
|
end
|
|
|
|
local playerKeystoneInfo = libOpenRaid.GetKeystoneInfo(unitId)
|
|
if (playerKeystoneInfo) then
|
|
---@type details_instanceinfo
|
|
local instanceInfo = Details:GetInstanceInfo(playerKeystoneInfo.mapID)
|
|
|
|
playerBanner.LevelFontString:SetText(playerKeystoneInfo.level or "")
|
|
|
|
if (instanceInfo) then
|
|
playerBanner.DungeonTexture:SetTexture(instanceInfo.iconLore)
|
|
else
|
|
playerBanner.DungeonTexture:SetTexture([[Interface\ICONS\INV_Misc_QuestionMark]])
|
|
end
|
|
else
|
|
playerBanner.DungeonTexture:SetTexture([[Interface\ICONS\INV_Misc_QuestionMark]])
|
|
playerBanner.LevelFontString:SetText("")
|
|
end
|
|
return true
|
|
end
|
|
end
|
|
|
|
local updateKeysStoneLevel = function()
|
|
--update the player banners
|
|
local libOpenRaid = LibStub("LibOpenRaid-1.0", true)
|
|
local readyFrame = DetailsMythicDungeonReadyFrame
|
|
|
|
for bannerIndex = 1, #readyFrame.PlayerBanners do
|
|
local unitBanner = readyFrame.PlayerBanners[bannerIndex]
|
|
if (unitBanner) then
|
|
local unitId = unitBanner.unitId
|
|
if (UnitExists(unitId)) then
|
|
local unitKeystoneInfo = libOpenRaid.GetKeystoneInfo(unitId)
|
|
--print("Unit Exists:", unitBanner.unitName, unitId, "updating keystone level", unitKeystoneInfo)
|
|
if (unitKeystoneInfo) then
|
|
--if (instanceInfo) then
|
|
-- ---@type details_instanceinfo
|
|
-- local thisInstanceInfo = Details:GetInstanceInfo(unitKeystoneInfo.mapID)
|
|
-- unitBanner.DungeonTexture:SetTexture(thisInstanceInfo.iconLore)
|
|
--end
|
|
|
|
--unitBanner.LevelFontString:SetText(unitKeystoneInfo.level)
|
|
--print("setting player", unitBanner.unitName, "keystone level to", unitKeystoneInfo.level)
|
|
|
|
local oldKeystoneLevel = Details.KeystoneLevels[Details:GetFullName(unitId)]
|
|
|
|
if (oldKeystoneLevel and oldKeystoneLevel >= 2) then
|
|
if (unitKeystoneInfo.level > oldKeystoneLevel) then
|
|
C_Timer.After(0.5, function()
|
|
unitBanner.LevelUpTextFrame.PlayAnimations(unitKeystoneInfo.level)
|
|
end)
|
|
|
|
---@type details_instanceinfo
|
|
local instanceInfo = Details:GetInstanceInfo(unitKeystoneInfo.mapID)
|
|
|
|
if (instanceInfo) then
|
|
unitBanner.DungeonTexture:SetTexture(instanceInfo.iconLore)
|
|
else
|
|
unitBanner.DungeonTexture:SetTexture([[Interface\ICONS\INV_Misc_QuestionMark]])
|
|
end
|
|
|
|
--this character had its keystone upgraded
|
|
--unitBanner.flashTexture:Flash()
|
|
--print("keystone upgraded for", Details:GetFullName(unitId), unitKeystoneInfo.level, "old was:", oldKeystoneLevel)
|
|
--C_Timer.After(0.1, function() unitBanner.flashTexture:Stop() end)
|
|
end
|
|
end
|
|
|
|
--print("keystone level updated for", Details:GetFullName(unitId), unitKeystoneInfo.level)
|
|
else
|
|
unitBanner.DungeonTexture:SetTexture([[Interface\ICONS\INV_Misc_QuestionMark]])
|
|
unitBanner.LevelFontString:SetText("")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--SetPortraitTexture(texture, unitId)
|
|
-- /run _G.DetailsMythicDungeonChartHandler.ShowChart(); DetailsMythicDungeonChartFrame.ShowChartFrame()
|
|
-- /run _G.DetailsMythicDungeonChartHandler.ShowEndOfMythicPlusPanel()
|
|
|
|
--show a small panel telling the chart is ready to show
|
|
function mythicDungeonFrames.ShowEndOfMythicPlusPanel(bIsDebug)
|
|
--check if is enabled
|
|
if (not Details.mythic_plus.show_damage_graphic) then
|
|
return
|
|
end
|
|
|
|
if (bIsDebug) then
|
|
Details222.MythicPlus.Level = Details222.MythicPlus.Level or 2
|
|
end
|
|
|
|
--feature under development
|
|
if (Details222.MythicPlus.Level and Details222.MythicPlus.Level < 28 and not Details.user_is_patreon_supporter) then
|
|
--create the panel
|
|
if (not mythicDungeonFrames.ReadyFrame) then
|
|
mythicDungeonFrames.ReadyFrame = CreateFrame("frame", "DetailsMythicDungeonReadyFrame", UIParent, "BackdropTemplate")
|
|
local readyFrame = mythicDungeonFrames.ReadyFrame
|
|
|
|
local textColor = {1, 0.8196, 0, 1}
|
|
local textSize = 11
|
|
|
|
local roundedCornerTemplate = {
|
|
roundness = 6,
|
|
color = {.1, .1, .1, 0.98},
|
|
border_color = {.05, .05, .05, 0.834},
|
|
}
|
|
|
|
detailsFramework:AddRoundedCornersToFrame(readyFrame, roundedCornerTemplate)
|
|
|
|
local titleLabel = DetailsFramework:CreateLabel(readyFrame, "Details! Mythic Run Completed!", 12, "yellow")
|
|
titleLabel:SetPoint("top", readyFrame, "top", 0, -7)
|
|
titleLabel.textcolor = textColor
|
|
|
|
local closeButton = detailsFramework:CreateCloseButton(readyFrame, "$parentCloseButton")
|
|
closeButton:SetPoint("topright", readyFrame, "topright", -2, -2)
|
|
closeButton:SetScale(1.4)
|
|
closeButton:SetAlpha(0.823)
|
|
|
|
readyFrame:SetSize(255, 120)
|
|
readyFrame:SetPoint("center", UIParent, "center", 300, 0)
|
|
readyFrame:SetFrameStrata("LOW")
|
|
readyFrame:EnableMouse(true)
|
|
readyFrame:SetMovable(true)
|
|
--DetailsFramework:ApplyStandardBackdrop(readyFrame)
|
|
--DetailsFramework:CreateTitleBar (readyFrame, "Details! Mythic Run Completed!")
|
|
|
|
readyFrame:Hide()
|
|
|
|
--register to libwindow
|
|
local LibWindow = LibStub("LibWindow-1.1")
|
|
LibWindow.RegisterConfig(readyFrame, Details.mythic_plus.mythicrun_chart_frame_ready)
|
|
LibWindow.RestorePosition(readyFrame)
|
|
LibWindow.MakeDraggable(readyFrame)
|
|
LibWindow.SavePosition(readyFrame)
|
|
|
|
--show button
|
|
---@type df_button
|
|
readyFrame.ShowChartButton = DetailsFramework:CreateButton(readyFrame, function() mythicDungeonCharts.ShowChart(); readyFrame:Hide() end, 80, 20, "Show Damage Graphic")
|
|
readyFrame.ShowChartButton:SetTemplate(DetailsFramework:GetTemplate("button", "DETAILS_PLUGIN_BUTTON_TEMPLATE"))
|
|
readyFrame.ShowChartButton:SetPoint("topleft", readyFrame, "topleft", 5, -30)
|
|
readyFrame.ShowChartButton:SetIcon([[Interface\AddOns\Details\images\icons2.png]], 16, 16, "overlay", {42/512, 75/512, 153/512, 187/512}, {.7, .7, .7, 1}, nil, 0, 0)
|
|
readyFrame.ShowChartButton.textcolor = textColor
|
|
|
|
--disable feature check box (dont show this again)
|
|
local on_switch_enable = function(self, _, value)
|
|
Details.mythic_plus.show_damage_graphic = not value
|
|
end
|
|
|
|
local notAgainSwitch, notAgainLabel = DetailsFramework:CreateSwitch(readyFrame, on_switch_enable, not Details.mythic_plus.show_damage_graphic, _, _, _, _, _, _, _, _, _, Loc ["STRING_MINITUTORIAL_BOOKMARK4"], DetailsFramework:GetTemplate("switch", "OPTIONS_CHECKBOX_BRIGHT_TEMPLATE"), "GameFontHighlightLeft")
|
|
notAgainSwitch:ClearAllPoints()
|
|
notAgainLabel:SetPoint("left", notAgainSwitch, "right", 2, 0)
|
|
notAgainSwitch:SetPoint("bottomleft", readyFrame, "bottomleft", 5, 5)
|
|
notAgainSwitch:SetAsCheckBox()
|
|
notAgainLabel.textSize = textSize
|
|
|
|
local timeNotInCombatLabel = DetailsFramework:CreateLabel(readyFrame, "Time not in combat:", textSize, "orangered")
|
|
timeNotInCombatLabel:SetPoint("bottomleft", notAgainSwitch, "topleft", 0, 7)
|
|
local timeNotInCombatAmount = DetailsFramework:CreateLabel(readyFrame, "00:00", textSize, "orangered")
|
|
timeNotInCombatAmount:SetPoint("left", timeNotInCombatLabel, "left", 130, 0)
|
|
|
|
local elapsedTimeLabel = DetailsFramework:CreateLabel(readyFrame, "Run Time:", textSize, textColor)
|
|
elapsedTimeLabel:SetPoint("bottomleft", timeNotInCombatLabel, "topleft", 0, 5)
|
|
local elapsedTimeAmount = DetailsFramework:CreateLabel(readyFrame, "00:00", textSize, textColor)
|
|
elapsedTimeAmount:SetPoint("left", elapsedTimeLabel, "left", 130, 0)
|
|
|
|
readyFrame.TimeNotInCombatAmountLabel = timeNotInCombatAmount
|
|
readyFrame.ElapsedTimeAmountLabel = elapsedTimeAmount
|
|
end
|
|
|
|
mythicDungeonCharts.ReadyFrame:Show()
|
|
|
|
--update the run time and time not in combat
|
|
local elapsedTime = Details222.MythicPlus.time or 1507
|
|
mythicDungeonCharts.ReadyFrame.ElapsedTimeAmountLabel.text = DetailsFramework:IntegerToTimer(elapsedTime)
|
|
|
|
local overallMythicDungeonCombat = Details:GetCurrentCombat()
|
|
if (overallMythicDungeonCombat:GetCombatType() == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_OVERALL) then
|
|
local combatTime = overallMythicDungeonCombat:GetCombatTime()
|
|
local notInCombat = elapsedTime - combatTime
|
|
mythicDungeonCharts.ReadyFrame.TimeNotInCombatAmountLabel.text = DetailsFramework:IntegerToTimer(notInCombat) .. " (" .. math.floor(notInCombat / elapsedTime * 100) .. "%)"
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
--create the panel
|
|
if (not mythicDungeonCharts.ReadyFrame) then
|
|
mythicDungeonCharts.ReadyFrame = CreateFrame("frame", "DetailsMythicDungeonReadyFrame", UIParent, "BackdropTemplate")
|
|
local readyFrame = mythicDungeonCharts.ReadyFrame
|
|
readyFrame.playerCacheByName = {}
|
|
|
|
local textColor = {1, 0.8196, 0, 1}
|
|
local textSize = 11
|
|
|
|
local roundedCornerTemplate = {
|
|
roundness = 6,
|
|
color = {.1, .1, .1, 0.98},
|
|
border_color = {.05, .05, .05, 0.834},
|
|
}
|
|
|
|
detailsFramework:AddRoundedCornersToFrame(readyFrame, roundedCornerTemplate)
|
|
|
|
local titleLabel = DetailsFramework:CreateLabel(readyFrame, "Details! Mythic Run Completed!", 12, "yellow")
|
|
titleLabel:SetPoint("top", readyFrame, "top", 0, -7)
|
|
titleLabel.textcolor = textColor
|
|
|
|
local closeButton = detailsFramework:CreateCloseButton(readyFrame, "$parentCloseButton")
|
|
closeButton:SetPoint("topright", readyFrame, "topright", -2, -2)
|
|
closeButton:SetScale(1.4)
|
|
closeButton:SetAlpha(0.823)
|
|
|
|
readyFrame:SetSize(355, 390)
|
|
readyFrame:SetPoint("center", UIParent, "center", 300, 0)
|
|
readyFrame:SetFrameStrata("LOW")
|
|
readyFrame:EnableMouse(true)
|
|
readyFrame:SetMovable(true)
|
|
readyFrame:Hide()
|
|
|
|
--register to libwindow
|
|
local LibWindow = LibStub("LibWindow-1.1")
|
|
LibWindow.RegisterConfig(readyFrame, Details.mythic_plus.mythicrun_chart_frame_ready)
|
|
LibWindow.RestorePosition(readyFrame)
|
|
LibWindow.MakeDraggable(readyFrame)
|
|
LibWindow.SavePosition(readyFrame)
|
|
|
|
--warning footer
|
|
local warningFooter = DetailsFramework:CreateLabel(readyFrame, "You are seeing this because it's a 28 or above. Under development.", 9, "yellow")
|
|
warningFooter:SetPoint("bottom", readyFrame, "bottom", 0, 20)
|
|
|
|
local roundedCornerPreset = {
|
|
color = {.075, .075, .075, 1},
|
|
border_color = {.2, .2, .2, 1},
|
|
roundness = 8,
|
|
}
|
|
|
|
local leftAnchor
|
|
|
|
--show m+ run breakdown
|
|
local showBreakdownFunc = function()
|
|
mPlus.ShowSummary()
|
|
end
|
|
---@type df_button
|
|
readyFrame.ShowBreakdownButton = DetailsFramework:CreateButton(readyFrame, showBreakdownFunc, 145, 30, "Show Breakdown")
|
|
PixelUtil.SetPoint(readyFrame.ShowBreakdownButton, "topleft", readyFrame, "topleft", 5, -30)
|
|
PixelUtil.SetSize(readyFrame.ShowBreakdownButton, 145, 32)
|
|
readyFrame.ShowBreakdownButton:SetBackdrop(nil)
|
|
readyFrame.ShowBreakdownButton:SetIcon([[Interface\AddOns\Details\images\icons2.png]], 16, 16, "overlay", {84/512, 120/512, 153/512, 187/512}, {.7, .7, .7, 1}, nil, 0, 0)
|
|
readyFrame.ShowBreakdownButton.textcolor = textColor
|
|
detailsFramework:AddRoundedCornersToFrame(readyFrame.ShowBreakdownButton.widget, roundedCornerPreset)
|
|
leftAnchor = readyFrame.ShowBreakdownButton
|
|
readyFrame.ShowBreakdownButton:Disable()
|
|
|
|
--show graphic button
|
|
local showChartFunc = function(self)
|
|
mythicDungeonCharts.ShowChart()
|
|
readyFrame:Hide()
|
|
end
|
|
---@type df_button
|
|
readyFrame.ShowChartButton = DetailsFramework:CreateButton(readyFrame, showChartFunc, 145, 30, "Show Damage Graphic")
|
|
PixelUtil.SetPoint(readyFrame.ShowChartButton, "left", readyFrame.ShowBreakdownButton, "right", 5, 0)
|
|
PixelUtil.SetSize(readyFrame.ShowChartButton, 145, 32)
|
|
readyFrame.ShowChartButton:SetBackdrop(nil)
|
|
readyFrame.ShowChartButton:SetIcon([[Interface\AddOns\Details\images\icons2.png]], 16, 16, "overlay", {42/512, 75/512, 153/512, 187/512}, {.7, .7, .7, 1}, nil, 0, 0)
|
|
readyFrame.ShowChartButton.textcolor = textColor
|
|
detailsFramework:AddRoundedCornersToFrame(readyFrame.ShowChartButton.widget, roundedCornerPreset)
|
|
|
|
|
|
--disable feature check box (dont show this again)
|
|
local on_switch_enable = function(self, _, value)
|
|
Details.mythic_plus.show_damage_graphic = not value
|
|
end
|
|
|
|
local elapsedTimeLabel = DetailsFramework:CreateLabel(readyFrame, "Run Time:", textSize, textColor)
|
|
elapsedTimeLabel:SetPoint("topleft", leftAnchor, "bottomleft", 0, -8)
|
|
local elapsedTimeAmount = DetailsFramework:CreateLabel(readyFrame, "00:00", textSize, textColor)
|
|
elapsedTimeAmount:SetPoint("left", elapsedTimeLabel, "left", 130, 0)
|
|
|
|
local timeNotInCombatLabel = DetailsFramework:CreateLabel(readyFrame, "Time not in combat:", textSize, "orangered")
|
|
timeNotInCombatLabel:SetPoint("topleft", elapsedTimeLabel, "bottomleft", 0, -5)
|
|
local timeNotInCombatAmount = DetailsFramework:CreateLabel(readyFrame, "00:00", textSize, "orangered")
|
|
timeNotInCombatAmount:SetPoint("left", timeNotInCombatLabel, "left", 130, 0)
|
|
|
|
local youBeatTheTimerLabel = DetailsFramework:CreateLabel(readyFrame, "", textSize, "white")
|
|
youBeatTheTimerLabel:SetPoint("topleft", timeNotInCombatLabel, "bottomleft", 0, -5)
|
|
|
|
--local keystoneUpgradeLabel = DetailsFramework:CreateLabel(readyFrame, "Keystone Upgrade:", textSize, "white")
|
|
--keystoneUpgradeLabel:SetPoint("topleft", youBeatTheTimerLabel, "bottomleft", 0, -5)
|
|
|
|
local rantingLabel = DetailsFramework:CreateLabel(readyFrame, "", textSize, textColor)
|
|
--rantingLabel:SetPoint("topleft", keystoneUpgradeLabel, "bottomleft", 0, -5)
|
|
rantingLabel:SetPoint("topleft", youBeatTheTimerLabel, "bottomleft", 0, -5)
|
|
|
|
readyFrame.PlayerBanners = {}
|
|
for i = 1, 5 do
|
|
local playerBanner = createPlayerBanner(readyFrame, "$parentPlayerBanner" .. i)
|
|
readyFrame.PlayerBanners[#readyFrame.PlayerBanners+1] = playerBanner
|
|
if (i == 1) then
|
|
playerBanner:SetPoint("topleft", rantingLabel.widget, "bottomleft", 0, -22)
|
|
else
|
|
playerBanner:SetPoint("topleft", readyFrame.PlayerBanners[i-1], "topright", 10, 0)
|
|
end
|
|
end
|
|
|
|
--frame to handle loot events
|
|
local lootFrame = CreateFrame("frame", "$parentLootFrame", readyFrame)
|
|
lootFrame:RegisterEvent("BOSS_KILL");
|
|
lootFrame:RegisterEvent("ENCOUNTER_LOOT_RECEIVED")
|
|
|
|
local bossKillEncounterId
|
|
|
|
lootFrame:SetScript("OnEvent", function(self, event, ...)
|
|
if (event == "BOSS_KILL") then
|
|
local encounterID, name = ...;
|
|
bossKillEncounterId = encounterID
|
|
--print("BOSS_KILL", GetTime(), bossKillEncounterId)
|
|
|
|
elseif (event == "ENCOUNTER_LOOT_RECEIVED") then
|
|
local lootEncounterId, itemID, itemLink, quantity, playerName, className = ...
|
|
--print("ENCOUNTER_LOOT_RECEIVED", GetTime(), lootEncounterId, bossKillEncounterId)
|
|
|
|
--print("no ambig:", playerName, "with ambig:", Ambiguate(playerName, "none")) --debug
|
|
playerName = Ambiguate(playerName, "none")
|
|
local unitBanner = readyFrame.playerCacheByName[playerName]
|
|
|
|
if (not unitBanner) then
|
|
--print("no unitBanner for player", playerName, "aborting.")
|
|
return
|
|
end
|
|
|
|
local _, instanceType = GetInstanceInfo()
|
|
--print("Is encounter the same:", lootEncounterId == bossKillEncounterId)
|
|
if (instanceType == "party") then -- or instanceType == "raid" --lootEncounterId == bossKillEncounterId and
|
|
--print("all good showing loot for player", playerName)
|
|
local lootSquare = unitBanner.LootSquare
|
|
lootSquare.itemLink = itemLink
|
|
|
|
local effectiveILvl = GetDetailedItemLevelInfo(itemLink)
|
|
|
|
local itemName, itemLink, itemQuality, itemLevel, itemMinLevel, itemType, itemSubType,
|
|
itemStackCount, itemEquipLoc, itemTexture, sellPrice, classID, subclassID, bindType,
|
|
expacID, setID, isCraftingReagent = GetItemInfo(itemLink)
|
|
|
|
--print("equip loc:", itemEquipLoc)
|
|
|
|
if (effectiveILvl > 300) then --avoid showing loot that isn't items
|
|
|
|
local rarityColor = ITEM_QUALITY_COLORS[itemQuality]
|
|
lootSquare.LootIconBorder:SetVertexColor(rarityColor.r, rarityColor.g, rarityColor.b, 1)
|
|
|
|
lootSquare.LootIcon:SetTexture(GetItemIcon(itemID))
|
|
lootSquare.LootItemLevel:SetText(effectiveILvl or "0")
|
|
|
|
--print("loot info:", itemLink, effectiveILvl, itemQuality)
|
|
lootSquare:Show()
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
--[=[
|
|
Details222.MythicPlus.MapID = mapID
|
|
Details222.MythicPlus.Level = level --level of the key just finished
|
|
Details222.MythicPlus.OnTime = onTime
|
|
Details222.MythicPlus.KeystoneUpgradeLevels = keystoneUpgradeLevels
|
|
Details222.MythicPlus.PracticeRun = practiceRun
|
|
Details222.MythicPlus.OldDungeonScore = oldDungeonScore
|
|
Details222.MythicPlus.NewDungeonScore = newDungeonScore
|
|
Details222.MythicPlus.IsAffixRecord = isAffixRecord
|
|
Details222.MythicPlus.IsMapRecord = isMapRecord
|
|
Details222.MythicPlus.PrimaryAffix = primaryAffix
|
|
Details222.MythicPlus.IsEligibleForScore = isEligibleForScore
|
|
Details222.MythicPlus.UpgradeMembers = upgradeMembers
|
|
Details222.MythicPlus.DungeonName = dungeonName
|
|
Details222.MythicPlus.DungeonID = id
|
|
Details222.MythicPlus.TimeLimit = timeLimit
|
|
Details222.MythicPlus.Texture = texture
|
|
Details222.MythicPlus.BackgroundTexture = backgroundTexture
|
|
--]=]
|
|
|
|
local notAgainSwitch, notAgainLabel = DetailsFramework:CreateSwitch(readyFrame, on_switch_enable, not Details.mythic_plus.show_damage_graphic, _, _, _, _, _, _, _, _, _, Loc ["STRING_MINITUTORIAL_BOOKMARK4"], DetailsFramework:GetTemplate("switch", "OPTIONS_CHECKBOX_BRIGHT_TEMPLATE"), "GameFontHighlightLeft")
|
|
notAgainSwitch:ClearAllPoints()
|
|
notAgainLabel:SetPoint("left", notAgainSwitch, "right", 2, 0)
|
|
notAgainSwitch:SetPoint("bottomleft", readyFrame, "bottomleft", 5, 5)
|
|
notAgainSwitch:SetAsCheckBox()
|
|
notAgainSwitch:SetSize(12, 12)
|
|
notAgainLabel.textsize = 9
|
|
|
|
readyFrame.TimeNotInCombatAmountLabel = timeNotInCombatAmount
|
|
readyFrame.ElapsedTimeAmountLabel = elapsedTimeAmount
|
|
readyFrame.YouBeatTheTimerLabel = youBeatTheTimerLabel
|
|
readyFrame.KeystoneUpgradeLabel = keystoneUpgradeLabel
|
|
readyFrame.RantingLabel = rantingLabel
|
|
end
|
|
|
|
local readyFrame = mythicDungeonCharts.ReadyFrame
|
|
readyFrame:Show()
|
|
|
|
for i = 1, #readyFrame.PlayerBanners do
|
|
--hide the lootSquare
|
|
readyFrame.PlayerBanners[i].LootSquare:Hide()
|
|
end
|
|
|
|
wipe(readyFrame.playerCacheByName)
|
|
|
|
--update the run time and time not in combat
|
|
local elapsedTime = Details222.MythicPlus.time or 1507
|
|
readyFrame.ElapsedTimeAmountLabel.text = DetailsFramework:IntegerToTimer(elapsedTime)
|
|
|
|
C_Timer.After(1.5, function()
|
|
local overallMythicDungeonCombat = Details:GetCurrentCombat()
|
|
--print("overall combat type:", overallMythicDungeonCombat:GetCombatType(), overallMythicDungeonCombat:GetCombatType() == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_OVERALL)
|
|
if (overallMythicDungeonCombat:GetCombatType() == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_OVERALL) then
|
|
local combatTime = overallMythicDungeonCombat:GetCombatTime()
|
|
local notInCombat = elapsedTime - combatTime
|
|
readyFrame.TimeNotInCombatAmountLabel.text = DetailsFramework:IntegerToTimer(notInCombat) .. " (" .. math.floor(notInCombat / elapsedTime * 100) .. "%)"
|
|
else
|
|
readyFrame.TimeNotInCombatAmountLabel.text = "Unknown for this run"
|
|
end
|
|
end)
|
|
|
|
if (Details222.MythicPlus.OnTime) then
|
|
readyFrame.YouBeatTheTimerLabel:SetFormattedText(CHALLENGE_MODE_COMPLETE_BEAT_TIMER .. " | " .. CHALLENGE_MODE_COMPLETE_KEYSTONE_UPGRADED, Details222.MythicPlus.KeystoneUpgradeLevels) --"You beat the timer!"
|
|
readyFrame.YouBeatTheTimerLabel.textcolor = "limegreen"
|
|
--readyFrame.KeystoneUpgradeLabel:SetFormattedText(CHALLENGE_MODE_COMPLETE_KEYSTONE_UPGRADED, Details222.MythicPlus.KeystoneUpgradeLevels)
|
|
else
|
|
readyFrame.YouBeatTheTimerLabel.textcolor = "white"
|
|
readyFrame.YouBeatTheTimerLabel.text = CHALLENGE_MODE_COMPLETE_TIME_EXPIRED --"Time expired!"
|
|
--readyFrame.KeystoneUpgradeLabel.text = CHALLENGE_MODE_COMPLETE_TRY_AGAIN --"Try again! Beat the timer to upgrade your keystone!"
|
|
end
|
|
|
|
if (Details222.MythicPlus.NewDungeonScore and Details222.MythicPlus.OldDungeonScore) then
|
|
local gainedScore = Details222.MythicPlus.NewDungeonScore - Details222.MythicPlus.OldDungeonScore
|
|
local color = C_ChallengeMode.GetDungeonScoreRarityColor(Details222.MythicPlus.NewDungeonScore)
|
|
if (not color) then
|
|
color = HIGHLIGHT_FONT_COLOR
|
|
end
|
|
readyFrame.RantingLabel.text = CHALLENGE_COMPLETE_DUNGEON_SCORE:format(color:WrapTextInColorCode(CHALLENGE_COMPLETE_DUNGEON_SCORE_FORMAT_TEXT:format(Details222.MythicPlus.NewDungeonScore, gainedScore)))
|
|
readyFrame.RantingLabel.textcolor = "limegreen"
|
|
else
|
|
readyFrame.RantingLabel.text = ""
|
|
end
|
|
|
|
for i = 1, #readyFrame.PlayerBanners do
|
|
readyFrame.PlayerBanners[i]:Hide()
|
|
end
|
|
|
|
local playersFound = 0
|
|
local playerBannerIndex = 1
|
|
do --update the player banner
|
|
if (updatPlayerBanner("player", playerBannerIndex)) then
|
|
playersFound = playersFound + 1
|
|
end
|
|
end
|
|
|
|
local unitCount = 1
|
|
for bannerIndex = 2, #readyFrame.PlayerBanners do
|
|
if (updatPlayerBanner("party"..unitCount, bannerIndex)) then
|
|
playersFound = playersFound + 1
|
|
end
|
|
unitCount = unitCount + 1
|
|
end
|
|
|
|
for i = playersFound+1, #readyFrame.PlayerBanners do
|
|
readyFrame.PlayerBanners[i]:Hide()
|
|
end
|
|
|
|
C_Timer.After(2.5, updateKeysStoneLevel)
|
|
end
|
|
|
|
Details222.MythicPlus.IsMythicPlus = function()
|
|
return C_ChallengeMode and C_ChallengeMode.GetActiveKeystoneInfo() and true or false
|
|
end
|