ElvUI/Modules/Skins/Blizzard/Quest.lua

501 lines
18 KiB
Lua
Raw Permalink Normal View History

2020-11-13 14:27:50 -05:00
local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local S = E:GetModule('Skins')
local _G = _G
local gsub, pairs, ipairs, select, unpack, strmatch, strfind = gsub, pairs, ipairs, select, unpack, strmatch, strfind
local C_QuestLog_GetNextWaypointText = C_QuestLog.GetNextWaypointText
local C_QuestLog_GetSelectedQuest = C_QuestLog.GetSelectedQuest
local GetMoney = GetMoney
local CreateFrame = CreateFrame
local GetQuestID = GetQuestID
local GetQuestBackgroundMaterial = GetQuestBackgroundMaterial
local GetQuestLogRequiredMoney = GetQuestLogRequiredMoney
local GetQuestLogLeaderBoard = GetQuestLogLeaderBoard
local GetNumQuestLeaderBoards = GetNumQuestLeaderBoards
local GetNumQuestLogRewardSpells = GetNumQuestLogRewardSpells
local GetNumRewardSpells = GetNumRewardSpells
local hooksecurefunc = hooksecurefunc
local sealFrameTextColor = {
['480404'] = 'c20606',
['042c54'] = '1c86ee',
}
function S:QuestInfoSealFrameText(text)
if text and text ~= '' then
local colorStr, rawText = strmatch(text, '|c[fF][fF](%x%x%x%x%x%x)(.-)|r')
if colorStr and rawText then
colorStr = sealFrameTextColor[colorStr] or '99ccff'
self:SetFormattedText('|cff%s%s|r', colorStr, rawText)
end
end
end
local function HandleReward(frame)
if not frame then return end
if frame.Icon then
frame.Icon:SetDrawLayer('ARTWORK')
S:HandleIcon(frame.Icon, true)
end
if frame.IconBorder then
frame.IconBorder:Kill()
end
if frame.Count then
frame.Count:SetDrawLayer('OVERLAY')
frame.Count:ClearAllPoints()
frame.Count:Point('BOTTOMRIGHT', frame.Icon, 'BOTTOMRIGHT', 0, 0)
end
if frame.NameFrame then
frame.NameFrame:SetAlpha(0)
frame.NameFrame:Hide()
end
if frame.IconOverlay then
frame.IconOverlay:SetAlpha(0)
end
if frame.Name then
frame.Name:FontTemplate()
end
if frame.CircleBackground then
frame.CircleBackground:SetAlpha(0)
frame.CircleBackgroundGlow:SetAlpha(0)
end
for i = 1, frame:GetNumRegions() do
local Region = select(i, frame:GetRegions())
if Region and Region:IsObjectType('Texture') and Region:GetTexture() == [[Interface\Spellbook\Spellbook-Parts]] then
Region:SetTexture('')
end
end
end
local function NewSealStyle()
local theme = _G.QuestInfoSealFrame.theme
return theme and theme.background
end
function S:QuestInfo_StyleScrollFrame(scrollFrame, widthOverride, heightOverride, inset)
if not scrollFrame.backdrop then
scrollFrame:CreateBackdrop()
end
if not scrollFrame.spellTex then
scrollFrame.spellTex = scrollFrame:CreateTexture(nil, 'BACKGROUND', 1)
end
if NewSealStyle() or GetQuestBackgroundMaterial() then
scrollFrame.spellTex:Hide()
scrollFrame.backdrop:Hide()
else
scrollFrame.backdrop:Show()
scrollFrame.spellTex:Show()
scrollFrame.spellTex:SetTexture([[Interface\QuestFrame\QuestBG]])
scrollFrame.spellTex:Point('TOPLEFT', inset and 1 or 0, inset and -1 or 0)
scrollFrame.spellTex:Size(widthOverride or 506, heightOverride or 615)
scrollFrame.spellTex:SetTexCoord(0, 1, 0.02, 1)
end
end
S.QuestInfo_StyleScrollFrames = {
[_G.QuestDetailScrollChildFrame] = { frame = _G.QuestDetailScrollFrame, width = 506, height = 615, inset = true },
[_G.QuestRewardScrollChildFrame] = { frame = _G.QuestRewardScrollFrame, width = 506, height = 615, inset = true },
[_G.QuestLogPopupDetailFrame.ScrollFrame.ScrollChild] = {
frame = _G.QuestLogPopupDetailFrameScrollFrame,
width = 509, height = 630, inset = false,
custom = function(self)
self:Height(self:GetHeight() - 2)
if not E.private.skins.parchmentRemoverEnable then
self.spellTex:Height(self:GetHeight() + 217)
end
end
}
}
-- Quest objective text color
local function Quest_GetQuestID()
if _G.QuestInfoFrame.questLog then
return C_QuestLog_GetSelectedQuest()
else
return GetQuestID()
end
end
function S:QuestInfo_ShowObjectives()
local objectives = _G.QuestInfoObjectivesFrame.Objectives
local index = 0
local questID = Quest_GetQuestID()
local waypointText = C_QuestLog_GetNextWaypointText(questID)
if waypointText then
index = index + 1
objectives[index]:SetTextColor(.4, 1, 1)
end
for i = 1, GetNumQuestLeaderBoards() do
local _, objectiveType, isCompleted = GetQuestLogLeaderBoard(i)
if objectiveType ~= 'spell' and objectiveType ~= 'log' and index < _G.MAX_OBJECTIVES then
index = index + 1
local objective = objectives[index]
if objective then
if isCompleted then
objective:SetTextColor(.2, 1, .2)
else
objective:SetTextColor(1, 1, 1)
end
end
end
end
end
function S:QuestInfoItem_OnClick() -- self is not S
_G.QuestInfoItemHighlight:ClearAllPoints()
_G.QuestInfoItemHighlight:SetOutside(self.Icon)
for _, Button in ipairs(_G.QuestInfoRewardsFrame.RewardButtons) do
Button.Name:SetTextColor(1, 1, 1)
end
self.Name:SetTextColor(1, .8, .1)
end
function S:QuestLogQuests_Update() -- self is not S
for i = 1, _G.QuestMapFrame.QuestsFrame.Contents:GetNumChildren() do
local child = select(i, _G.QuestMapFrame.QuestsFrame.Contents:GetChildren())
if child and child.ButtonText and not child.questID then
child:Size(16, 16)
for x = 1, child:GetNumRegions() do
local tex = select(x, child:GetRegions())
if tex and tex.GetAtlas then
local atlas = tex:GetAtlas()
if atlas == 'Campaign_HeaderIcon_Closed' or atlas == 'Campaign_HeaderIcon_ClosedPressed' then
tex:SetTexture(E.Media.Textures.PlusButton)
elseif atlas == 'Campaign_HeaderIcon_Open' or atlas == 'Campaign_HeaderIcon_OpenPressed' then
tex:SetTexture(E.Media.Textures.MinusButton)
end
end
end
end
end
end
function S:QuestInfo_Display(parentFrame) -- self is template, not S
local rewardsFrame = _G.QuestInfoFrame.rewardsFrame
local isQuestLog = _G.QuestInfoFrame.questLog ~= nil
for i, questItem in ipairs(rewardsFrame.RewardButtons) do
local point, relativeTo, relativePoint, _, y = questItem:GetPoint()
if point and relativeTo and relativePoint then
if i == 1 then
questItem:Point(point, relativeTo, relativePoint, 0, y)
elseif relativePoint == 'BOTTOMLEFT' then
questItem:Point(point, relativeTo, relativePoint, 0, -4)
else
questItem:Point(point, relativeTo, relativePoint, 4, 0)
end
end
HandleReward(questItem)
S:HandleIconBorder(questItem.IconBorder, questItem.Icon.backdrop)
questItem.NameFrame:Hide()
questItem.Name:SetTextColor(1, 1, 1)
end
local numSpellRewards = isQuestLog and GetNumQuestLogRewardSpells() or GetNumRewardSpells()
if numSpellRewards > 0 then
if E.private.skins.parchmentRemoverEnable then
for spellHeader in rewardsFrame.spellHeaderPool:EnumerateActive() do
spellHeader:SetVertexColor(1, 1, 1)
end
for spellIcon in rewardsFrame.spellRewardPool:EnumerateActive() do
HandleReward(spellIcon)
end
end
for followerReward in rewardsFrame.followerRewardPool:EnumerateActive() do
if not followerReward.isSkinned then
followerReward:CreateBackdrop()
followerReward.backdrop:SetAllPoints(followerReward.BG)
followerReward.backdrop:Point('TOPLEFT', 40, -5)
followerReward.backdrop:Point('BOTTOMRIGHT', 2, 5)
followerReward.BG:Hide()
followerReward.PortraitFrame:ClearAllPoints()
followerReward.PortraitFrame:Point('RIGHT', followerReward.backdrop, 'LEFT', -2, 0)
followerReward.PortraitFrame.PortraitRing:Hide()
followerReward.PortraitFrame.PortraitRingQuality:SetTexture()
followerReward.PortraitFrame.LevelBorder:SetAlpha(0)
followerReward.PortraitFrame.Portrait:SetTexCoord(0.2, 0.85, 0.2, 0.85)
local level = followerReward.PortraitFrame.Level
level:ClearAllPoints()
level:Point('BOTTOM', followerReward.PortraitFrame, 0, 3)
local squareBG = CreateFrame('Frame', nil, followerReward.PortraitFrame, 'BackdropTemplate')
squareBG:SetFrameLevel(followerReward.PortraitFrame:GetFrameLevel()-1)
squareBG:Point('TOPLEFT', 2, -2)
squareBG:Point('BOTTOMRIGHT', -2, 2)
squareBG:SetTemplate()
followerReward.PortraitFrame.squareBG = squareBG
followerReward.isSkinned = true
end
local r, g, b = followerReward.PortraitFrame.PortraitRingQuality:GetVertexColor()
followerReward.PortraitFrame.squareBG:SetBackdropBorderColor(r, g, b)
end
end
if E.private.skins.parchmentRemoverEnable then
_G.QuestInfoTitleHeader:SetTextColor(1, .8, .1)
_G.QuestInfoDescriptionHeader:SetTextColor(1, .8, .1)
_G.QuestInfoObjectivesHeader:SetTextColor(1, .8, .1)
_G.QuestInfoRewardsFrame.Header:SetTextColor(1, .8, .1)
_G.QuestInfoDescriptionText:SetTextColor(1, 1, 1)
_G.QuestInfoObjectivesText:SetTextColor(1, 1, 1)
_G.QuestInfoGroupSize:SetTextColor(1, 1, 1)
_G.QuestInfoRewardText:SetTextColor(1, 1, 1)
_G.QuestInfoQuestType:SetTextColor(1, 1, 1)
_G.QuestInfoRewardsFrame.ItemChooseText:SetTextColor(1, 1, 1)
_G.QuestInfoRewardsFrame.ItemReceiveText:SetTextColor(1, 1, 1)
if _G.QuestInfoRewardsFrame.SpellLearnText then
_G.QuestInfoRewardsFrame.SpellLearnText:SetTextColor(1, 1, 1)
end
_G.QuestInfoRewardsFrame.PlayerTitleText:SetTextColor(1, 1, 1)
_G.QuestInfoRewardsFrame.XPFrame.ReceiveText:SetTextColor(1, 1, 1)
S:QuestInfo_ShowObjectives()
else
_G.QuestInfoTitleHeader:SetShadowColor(0, 0, 0, 0)
_G.QuestInfoDescriptionHeader:SetShadowColor(0, 0, 0, 0)
_G.QuestInfoObjectivesHeader:SetShadowColor(0, 0, 0, 0)
_G.QuestInfoRewardsFrame.Header:SetShadowColor(0, 0, 0, 0)
_G.QuestInfoDescriptionText:SetShadowColor(0, 0, 0, 0)
_G.QuestInfoObjectivesText:SetShadowColor(0, 0, 0, 0)
_G.QuestInfoGroupSize:SetShadowColor(0, 0, 0, 0)
_G.QuestInfoRewardText:SetShadowColor(0, 0, 0, 0)
_G.QuestInfoQuestType:SetShadowColor(0, 0, 0, 0)
_G.QuestInfoRewardsFrame.ItemChooseText:SetShadowColor(0, 0, 0, 0)
_G.QuestInfoRewardsFrame.ItemReceiveText:SetShadowColor(0, 0, 0, 0)
local style = S.QuestInfo_StyleScrollFrames[parentFrame]
if style then
S:QuestInfo_StyleScrollFrame(style.frame, style.width, style.height, style.inset)
if style.custom then
style.custom(style.frame)
end
end
end
end
function S:CampaignCollapseButton_UpdateState(isCollapsed) -- self is button, not S
if isCollapsed then
self:SetNormalTexture(E.Media.Textures.PlusButton)
self:SetPushedTexture(E.Media.Textures.PlusButton)
else
self:SetNormalTexture(E.Media.Textures.MinusButton)
self:SetPushedTexture(E.Media.Textures.MinusButton)
end
self:Size(16, 16)
end
function S:QuestFrameProgressItems_Update() -- self is not S
_G.QuestProgressRequiredItemsText:SetTextColor(1, .8, .1)
_G.QuestProgressRequiredMoneyText:SetTextColor(1, 1, 1)
end
function S:QuestFrame_SetTitleTextColor() -- self is fontString
self:SetTextColor(1, .8, .1)
end
function S:QuestFrame_SetTextColor() -- self is fontString
self:SetTextColor(1, 1, 1)
end
function S:QuestInfo_ShowRequiredMoney() -- self is not S
local requiredMoney = GetQuestLogRequiredMoney()
if requiredMoney > 0 then
if requiredMoney > GetMoney() then
_G.QuestInfoRequiredMoneyText:SetTextColor(.63, .09, .09)
else
_G.QuestInfoRequiredMoneyText:SetTextColor(1, .8, .1)
end
end
end
function S:BlizzardQuestFrames()
if not (E.private.skins.blizzard.enable and E.private.skins.blizzard.quest) then return end
S:HandleScrollBar(_G.QuestProgressScrollFrameScrollBar)
S:HandleScrollBar(_G.QuestRewardScrollFrameScrollBar)
S:HandleScrollBar(_G.QuestDetailScrollFrameScrollBar)
S:HandleScrollBar(_G.QuestGreetingScrollFrameScrollBar)
local QuestInfoSkillPointFrame = _G.QuestInfoSkillPointFrame
QuestInfoSkillPointFrame:StripTextures()
QuestInfoSkillPointFrame:StyleButton()
QuestInfoSkillPointFrame:Width(QuestInfoSkillPointFrame:GetWidth() - 4)
QuestInfoSkillPointFrame:SetFrameLevel(QuestInfoSkillPointFrame:GetFrameLevel() + 2)
local QuestInfoSkillPointFrameIconTexture = _G.QuestInfoSkillPointFrameIconTexture
QuestInfoSkillPointFrameIconTexture:SetTexCoord(unpack(E.TexCoords))
QuestInfoSkillPointFrameIconTexture:SetDrawLayer('OVERLAY')
QuestInfoSkillPointFrameIconTexture:Point('TOPLEFT', 2, -2)
QuestInfoSkillPointFrameIconTexture:Size(QuestInfoSkillPointFrameIconTexture:GetWidth() - 2, QuestInfoSkillPointFrameIconTexture:GetHeight() - 2)
QuestInfoSkillPointFrame:CreateBackdrop()
_G.QuestInfoSkillPointFrameCount:SetDrawLayer('OVERLAY')
local QuestInfoItemHighlight = _G.QuestInfoItemHighlight
QuestInfoItemHighlight:StripTextures()
QuestInfoItemHighlight:CreateBackdrop()
QuestInfoItemHighlight.backdrop:SetAllPoints()
QuestInfoItemHighlight.backdrop:SetBackdropBorderColor(1, 1, 0)
QuestInfoItemHighlight.backdrop:SetBackdropColor(0, 0, 0, 0)
QuestInfoItemHighlight:Size(142, 40)
_G.QuestRewardScrollFrame:CreateBackdrop()
_G.QuestRewardScrollFrame:Height(_G.QuestRewardScrollFrame:GetHeight() - 2)
hooksecurefunc('QuestInfo_Display', S.QuestInfo_Display)
hooksecurefunc('QuestInfoItem_OnClick', S.QuestInfoItem_OnClick)
hooksecurefunc('QuestLogQuests_Update', S.QuestLogQuests_Update) -- Skin the Plus Minus buttons in the QuestLog
hooksecurefunc(_G.CampaignCollapseButtonMixin, 'UpdateState', S.CampaignCollapseButton_UpdateState) -- Plus Minus buttons for the CampaignHeaders in the QuestLog
for _, frame in pairs({'HonorFrame', 'XPFrame', 'SpellFrame', 'SkillPointFrame', 'ArtifactXPFrame', 'TitleFrame', 'WarModeBonusFrame'}) do
HandleReward(_G.MapQuestInfoRewardsFrame[frame])
HandleReward(_G.QuestInfoRewardsFrame[frame])
end
HandleReward(_G.MapQuestInfoRewardsFrame.MoneyFrame)
--Reward: Title
local QuestInfoPlayerTitleFrame = _G.QuestInfoPlayerTitleFrame
QuestInfoPlayerTitleFrame.FrameLeft:SetTexture()
QuestInfoPlayerTitleFrame.FrameCenter:SetTexture()
QuestInfoPlayerTitleFrame.FrameRight:SetTexture()
QuestInfoPlayerTitleFrame.Icon:SetTexCoord(unpack(E.TexCoords))
QuestInfoPlayerTitleFrame:CreateBackdrop()
QuestInfoPlayerTitleFrame.backdrop:SetOutside(QuestInfoPlayerTitleFrame.Icon)
--Quest Frame
local QuestFrame = _G.QuestFrame
S:HandlePortraitFrame(QuestFrame)
_G.QuestFrameDetailPanel:StripTextures(nil, E.private.skins.parchmentRemoverEnable)
_G.QuestDetailScrollFrame:StripTextures(nil, E.private.skins.parchmentRemoverEnable)
_G.QuestProgressScrollFrame:StripTextures(nil, E.private.skins.parchmentRemoverEnable)
_G.QuestGreetingScrollFrame:StripTextures(nil, E.private.skins.parchmentRemoverEnable)
_G.QuestDetailScrollFrame:CreateBackdrop()
_G.QuestProgressScrollFrame:CreateBackdrop()
_G.QuestGreetingScrollFrame:CreateBackdrop()
_G.QuestFrameGreetingPanel:HookScript('OnShow', function(frame)
for button in frame.titleButtonPool:EnumerateActive() do
button.Icon:SetDrawLayer('ARTWORK')
if E.private.skins.parchmentRemoverEnable then
local text = button:GetFontString():GetText()
if text and strfind(text, '|cff000000') then
button:GetFontString():SetText(gsub(text, '|cff000000', '|cffffe519'))
end
end
end
end)
if E.private.skins.parchmentRemoverEnable then
hooksecurefunc('QuestFrameProgressItems_Update', S.QuestFrameProgressItems_Update)
hooksecurefunc('QuestFrame_SetTitleTextColor', S.QuestFrame_SetTitleTextColor)
hooksecurefunc('QuestFrame_SetTextColor', S.QuestFrame_SetTextColor)
hooksecurefunc('QuestInfo_ShowRequiredMoney', S.QuestInfo_ShowRequiredMoney)
hooksecurefunc(_G.QuestInfoSealFrame.Text, 'SetText', S.QuestInfoSealFrameText)
_G.QuestFrameDetailPanel.SealMaterialBG:SetAlpha(0)
_G.QuestFrameRewardPanel.SealMaterialBG:SetAlpha(0)
_G.QuestFrameProgressPanel.SealMaterialBG:SetAlpha(0)
_G.QuestFrameGreetingPanel.SealMaterialBG:SetAlpha(0)
else
S:QuestInfo_StyleScrollFrame(_G.QuestProgressScrollFrame, 506, 615, true)
S:QuestInfo_StyleScrollFrame(_G.QuestGreetingScrollFrame, 506, 615, true)
end
_G.QuestFrameGreetingPanel:StripTextures(true)
S:HandleButton(_G.QuestFrameGreetingGoodbyeButton)
_G.QuestGreetingFrameHorizontalBreak:Kill()
_G.QuestDetailScrollChildFrame:StripTextures(true)
_G.QuestRewardScrollFrame:StripTextures(true)
_G.QuestRewardScrollChildFrame:StripTextures(true)
_G.QuestFrameProgressPanel:StripTextures(true)
_G.QuestFrameRewardPanel:StripTextures(true)
S:HandleButton(_G.QuestFrameAcceptButton)
S:HandleButton(_G.QuestFrameDeclineButton)
S:HandleButton(_G.QuestFrameCompleteButton)
S:HandleButton(_G.QuestFrameGoodbyeButton)
S:HandleButton(_G.QuestFrameCompleteQuestButton)
for i = 1, 6 do
local button = _G['QuestProgressItem'..i]
local icon = _G['QuestProgressItem'..i..'IconTexture']
icon:SetTexCoord(unpack(E.TexCoords))
icon:Point('TOPLEFT', 2, -2)
icon:Size(icon:GetWidth() -3, icon:GetHeight() -3)
button:Width(button:GetWidth() -4)
button:StripTextures()
button:SetFrameLevel(button:GetFrameLevel() +1)
local frame = CreateFrame('Frame', nil, button, 'BackdropTemplate')
frame:SetFrameLevel(button:GetFrameLevel() -1)
frame:SetTemplate('Transparent', nil, true)
frame:SetBackdropBorderColor(unpack(E.media.bordercolor))
frame:SetBackdropColor(0, 0, 0, 0)
frame:SetOutside(icon)
button.backdrop = frame
local hover = button:CreateTexture()
hover:SetColorTexture(1, 1, 1, 0.3)
hover:SetAllPoints(icon)
button:SetHighlightTexture(hover)
button.hover = hover
end
_G.QuestModelScene:StripTextures()
_G.QuestModelScene:CreateBackdrop('Transparent')
_G.QuestModelScene:Point('TOPLEFT', _G.QuestLogDetailFrame, 'TOPRIGHT', 4, -34)
_G.QuestNPCModelTextFrame:StripTextures()
_G.QuestNPCModelTextFrame:CreateBackdrop('Transparent')
S:HandleScrollBar(_G.QuestNPCModelTextScrollFrame.ScrollBar)
local QuestLogPopupDetailFrame = _G.QuestLogPopupDetailFrame
S:HandlePortraitFrame(QuestLogPopupDetailFrame)
S:HandleButton(_G.QuestLogPopupDetailFrameAbandonButton)
S:HandleButton(_G.QuestLogPopupDetailFrameShareButton)
S:HandleButton(_G.QuestLogPopupDetailFrameTrackButton)
_G.QuestLogPopupDetailFrameScrollFrame:StripTextures()
S:HandleScrollBar(_G.QuestLogPopupDetailFrameScrollFrameScrollBar)
QuestLogPopupDetailFrame:CreateBackdrop('Transparent')
QuestLogPopupDetailFrame.ShowMapButton:StripTextures()
S:HandleButton(QuestLogPopupDetailFrame.ShowMapButton)
QuestLogPopupDetailFrame.ShowMapButton.Text:ClearAllPoints()
QuestLogPopupDetailFrame.ShowMapButton.Text:Point('CENTER')
QuestLogPopupDetailFrame.ShowMapButton:Size(QuestLogPopupDetailFrame.ShowMapButton:GetWidth() - 30, QuestLogPopupDetailFrame.ShowMapButton:GetHeight(), - 40)
end
S:AddCallback('BlizzardQuestFrames')