You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2115 lines
75 KiB

5 years ago
local Factory, AN, T = {}, ...
local C, EV, L, U, S = C_Garrison, T.Evie, T.L, T.Util, {}
local PROGRESS_MIN_STEP = 0.2
local CovenKit = "NightFae"
local tooltipSharedPB, tooltipShopWatch
local UIBUTTON_HEIGHT = ({zhCN=24, zhTW=24, koKR=24})[GetLocale()] or 22
local CreateObject do
local skip, peekO = {SharedTooltipProgressBar=1, ObjectGroup=1, TexSlice=1, CommonHoverTooltip=1, Shadow=1}
local function peek(k)
local o = peekO and peekO[k]
return o and o.GetObjectType and o or nil
end
local function ret(otype, ...)
local a = ...
local s, nf = S[a], VPEX_OnUIObjectCreated
if a and not skip[otype] and type(nf) == "function" and (s or type(a) == "table") then
local ar = a and a.GetObjectType and a or s and s.GetObjectType and s
if ar then
peekO = s and (ar == s and a or s) or nil
securecall(nf, otype, ar, peek)
peekO = nil
end
end
return ...
end
function CreateObject(otype, ...)
return ret(otype, assert(Factory[otype], otype)(...))
end
end
T.Shadows, T.CreateObject = S, CreateObject
local function Mirror(tex, swapH, swapV)
local ulX, ulY, llX, llY, urX, urY, lrX, lrY = tex:GetTexCoord()
if swapH then
ulX, ulY, llX, llY, urX, urY, lrX, lrY = urX, urY, lrX, lrY, ulX, ulY, llX, llY
end
if swapV then
ulX, ulY, llX, llY, urX, urY, lrX, lrY = llX, llY, ulX, ulY, lrX, lrY, urX, urY
end
tex:SetTexCoord(ulX, ulY, llX, llY, urX, urY, lrX, lrY)
return tex
end
local function AugmentFollowerInfo(info)
info.autoCombatantStats = C_Garrison.GetFollowerAutoCombatStats(info.followerID)
info.autoCombatSpells = C_Garrison.GetFollowerAutoCombatSpells(info.followerID, info.level)
info.missionTimeEnd = info.missionTimeEnd or info.status == GARRISON_FOLLOWER_ON_MISSION and
(GetTime() + (C_Garrison.GetFollowerMissionTimeLeftSeconds(info.followerID) or 1)) or nil
return info
end
local GetTimeStringFromSeconds = U.GetTimeStringFromSeconds
local function HideOwnGameTooltip(self)
if GameTooltip:IsOwned(self) then
GameTooltip:Hide()
end
end
local function CommonTooltip_ShopWatch()
if not tooltipShopWatch or GameTooltip:IsForbidden() or GameTooltip:GetOwner() ~= tooltipShopWatch then
tooltipShopWatch = nil
return "remove"
end
if IsModifiedClick("COMPAREITEMS") or GetCVarBool("alwaysCompareItems") then
GameTooltip_ShowCompareItem(GameTooltip, GameTooltip)
else
GameTooltip_HideShoppingTooltips(GameTooltip)
end
end
local function CommonTooltip_ArmShopWatch(self, item)
if IsEquippableItem(item) and tooltipShopWatch ~= self then
if not tooltipShopWatch then
EV.MODIFIER_STATE_CHANGED = CommonTooltip_ShopWatch
end
tooltipShopWatch = self
end
end
local function CommonTooltip_OnEnter(self)
local showCurrencyBar = false
if self.tooltipAnchor == "ANCHOR_TRUE_LEFT" then
GameTooltip:SetOwner(self, "ANCHOR_NONE")
GameTooltip:SetPoint("RIGHT", self, "LEFT", self.tooltipXO or 0, self.tooltipYO or 0)
else
GameTooltip:SetOwner(self, self.tooltipAnchor or "ANCHOR_TOP", self.tooltipXO or 0, self.tooltipYO or 0)
end
tooltipShopWatch = not not tooltipShopWatch
if type(self.mechanicInfo) == "table" then
local ic, m = self.Icon and self.Icon:GetTexture(), self.mechanicInfo
ic = ic or m.icon
GameTooltip:SetText((ic and "|T" .. ic .. ":0:0:0:0:64:64:4:60:4:60|t " or "") .. m.name)
if (m.enemy or "") ~= "" then
GameTooltip:AddLine("|cff49C8F2" .. m.enemy)
elseif (m.description or "") ~= "" then
GameTooltip:AddLine(m.description, 1,1,1,1)
end
if type(m.ability) == "table" then
local a = m.ability
GameTooltip:AddLine(" ")
GameTooltip:AddLine((a.icon and "|T" .. a.icon .. ":0|t " or "") .. a.name)
if (a.description or "") ~= "" then
GameTooltip:AddLine(a.description, 1,1,1,1)
end
end
elseif self.itemLink then
GameTooltip:SetHyperlink(self.itemLink)
CommonTooltip_ArmShopWatch(self, self.itemLink)
elseif self.itemID then
GameTooltip:SetItemByID(self.itemID)
CommonTooltip_ArmShopWatch(self, self.itemID)
elseif self.tooltipHeader and (self.tooltipText or self.tooltipCountdownTo) then
GameTooltip:AddLine(self.tooltipHeader)
if self.tooltipCountdownTo then
GameTooltip:AddLine(GetTimeStringFromSeconds(self.tooltipCountdownTo - GetTime(), false, false, true), 1,1,1)
else
GameTooltip:AddLine(self.tooltipText, 1,1,1, self.tooltipTextNW == nil and 1 or nil)
end
showCurrencyBar = not not (self.currencyID)
elseif self.currencyID then
GameTooltip:SetCurrencyByID(self.currencyID)
if self.currencyID == 1889 then
local ci = C_CurrencyInfo.GetCurrencyInfo(self.currencyID)
local q = ci and U.GetShiftedCurrencyValue(self.currencyID, ci.quantity) or "??"
GameTooltip:AddLine("|n" .. (L"Current Progress: %s"):format("|cffffffff" .. q .. "|r"))
GameTooltip:Show()
end
elseif self.achievementID then
local self, achievementID, highlightAsset = GameTooltip, self.achievementID, self.assetID
local _, n, _points, c, _, _, _, description, _, _icon, _, _, wasEarnedByMe, _earnedBy =
GetAchievementInfo(achievementID)
self:SetText(n)
if not c or not wasEarnedByMe then
self:AddLine(ACHIEVEMENT_TOOLTIP_IN_PROGRESS:format(UnitName("player")), 0.1, 0.9, 0.1)
self:AddLine(" ")
end
self:AddLine(description, 1,1,1,1)
local nc = GetAchievementNumCriteria(achievementID)
for i=1,nc,2 do
local n1, _, c1, _, _, _, _, asid = GetAchievementCriteriaInfo(achievementID, i)
n1 = (asid == highlightAsset and "|cffffea00" or c1 and "|cff20c020" or "|cffa8a8a8") .. n1
if i == nc then
self:AddLine(n1)
else
local n2, _, c2, _, _, _, _, asid = GetAchievementCriteriaInfo(achievementID, i+1)
n2 = (asid == highlightAsset and "|cffffea00" or c2 and "|cff20c020" or "|cffa8a8a8") .. n2
self:AddDoubleLine(n1, n2)
end
end
else
GameTooltip:Hide()
return
end
if self.ShowQuantityFromWidgetText and not showCurrencyBar then
local w = self[self.ShowQuantityFromWidgetText]
local t = w and w:GetText() or ""
local c = NORMAL_FONT_COLOR
if t ~= "" then
GameTooltip:AddLine((L"Quantity: %s"):format("|cffffffff" .. t), c.r, c.g, c.b)
end
end
GameTooltip:Show()
if self.tooltipPostShow then
self.tooltipPostShow(GameTooltip, self)
end
if showCurrencyBar then
local q1, factionID, cur, max, label = self.currencyQ, C_CurrencyInfo.GetFactionGrantedByCurrency(self.currencyID)
if factionID then
if C_Reputation.IsFactionParagon(factionID) then
label, cur, max = _G["FACTION_STANDING_LABEL8" .. (UnitSex("player") ~= 2 and "_FEMALE" or "")], C_Reputation.GetFactionParagonInfo(factionID)
cur = cur % max
else
local _, _, stID, bMin, bMax, bVal = GetFactionInfoByID(factionID)
if stID and bMin then
cur, max, label = bVal - bMin, bMax-bMin, _G["FACTION_STANDING_LABEL" .. stID .. (UnitSex("player") ~= 2 and "_FEMALE" or "")]
end
end
end
if not (cur and max) then
return
end
label = label .. " - " .. BreakUpLargeNumbers(cur) .. " / " .. BreakUpLargeNumbers(max)
CreateObject("SharedTooltipProgressBar"):Activate(GameTooltip, cur, max, label, self.isRetrospective and 0 or q1)
end
end
local function CommonTooltip_DelayedRefresh_OnUpdate(self, elapsed)
local tl = self.tooltipRefreshDelay - (elapsed or 0)
if not GameTooltip:IsOwned(self) then
self:SetScript("OnUpdate", nil)
self.tooltipRefreshDelay = nil
elseif tl > 0 then
self.tooltipRefreshDelay = tl
else
self:SetScript("OnUpdate", nil)
self.tooltipRefreshDelay = nil
self:GetScript("OnEnter")(self)
end
end
local function CommonLinkable_OnClick(self)
if self.itemLink then
HandleModifiedItemClick(self.itemLink)
elseif not IsModifiedClick("CHATLINK") then
elseif self.achievementID then
ChatEdit_InsertLink(GetAchievementLink(self.achievementID))
elseif self.itemID then
local _, link = GetItemInfo(self.itemID)
if link then
ChatEdit_InsertLink(link)
end
elseif self.currencyID and self.currencyID ~= 0 then
ChatEdit_InsertLink(C_CurrencyInfo.GetCurrencyLink(self.currencyID, self.currencyAmount or 0))
end
end
local function MissionList_ScrollToward(self, obj)
if obj:GetBottom() < self:GetBottom() then
self:GetScript("OnMouseWheel")(self, -1)
elseif obj:GetTop() > self:GetTop() then
self:GetScript("OnMouseWheel")(self, 1)
end
end
local function MissionList_SpawnMissionButton(arr, i)
local prev = type(i) == "number" and rawget(arr, i-1)
if type(prev) == "table" then
local cf = CreateObject("MissionButton", prev:GetParent())
arr[i] = cf
cf:SetPoint("TOPLEFT", 292*(((i-1)%3)+1)-284, math.floor((i-1)/3) *- 195)
return cf
end
end
local function MissionButton_OnClick(self)
local s = S[self]
if IsModifiedClick("CHATLINK") and s.missionID then
ChatEdit_InsertLink(C.GetMissionLink(s.missionID))
else
self:GetParent():GetParent():ScrollToward(self)
end
end
local function MissionButton_OnProgressBarClick(self)
local s = S[self:GetParent()]
if s.missionID and s.completableAfter and s.completableAfter <= GetTime() then
U.InitiateMissionCompletion(s.missionID)
end
end
local function MissionButton_OnViewClick(self)
U.ShowMission(S[self:GetParent()].missionID, self:GetParent():GetParent():GetParent():GetParent())
end
local function MissionButton_SetGroupPortraits(mb, g, isVeiled, altWidget)
local hasGroup = g and next(g) ~= nil or false
mb.Group:SetShown(hasGroup)
altWidget:SetShown(not hasGroup)
local s = S[mb.Group]
local vc = isVeiled and 0.85 or 1
for i=0, hasGroup and 4 or -1 do
local f = g[i]
local t = f and C_Garrison.GetFollowerPortraitIconID(f)
local c = t and vc or 0.2
s[i]:SetTexture(t or "Interface/Masks/CircleMask")
s[i]:SetVertexColor(c, c, c)
s[5+i]:SetVertexColor(vc, vc, vc)
end
end
local function Progress_UpdateTimer(self)
local now, endTime = GetTime(), self.endTime
if endTime <= now then
self.Fill:SetWidth(math.max(0.01, self:GetWidth()))
self.Fill:SetTexCoord(0, 1, 0, 1)
self:SetScript("OnUpdate", nil)
if self.endText then
self.Text:SetText(self.endText)
end
self:SetEnabled(not not self.endClick)
self.endTime, self.duration, self.endText, self.nextUp = nil
elseif (self.nextUp or now) <= now then
local w, d = self:GetWidth(), self.duration
local secsLeft, p = endTime-now-0.5, math.min(1, 1-(endTime-now)/d)
self.Fill:SetWidth(math.max(0.01, w*p))
self.Fill:SetTexCoord(0, math.max(1/128, p), 0, 1)
self.nextUp = now + math.min(PROGRESS_MIN_STEP/w * d, 0.01 + secsLeft % (secsLeft < 100 and 1 or 60))
if self.showTimeRemaining then
self.Text:SetText(GetTimeStringFromSeconds(secsLeft, false, true))
else
self.Text:SetText("")
end
self:Disable()
end
end
local function Progress_SetProgress(self, progress)
progress = progress > 1 and 1 or progress
self.Fill:SetWidth(math.max(0.01,self:GetWidth()*progress))
self.Fill:SetTexCoord(0, math.max(1/128, progress), 0, 1)
self.endTime, self.duration, self.endText, self.endClick, self.nextUp = nil
self:SetScript("OnUpdate", nil)
end
local function Progress_SetTimer(self, endTime, duration, endText, endClick, showTimeRemaining)
self.endTime, self.duration, self.endText, self.endClick, self.showTimeRemaining, self.nextUp = endTime, duration, endText, endClick == true or nil, showTimeRemaining == true or nil, nil
self:SetScript("OnUpdate", Progress_UpdateTimer)
Progress_UpdateTimer(self)
end
local function TooltipProgressBar_Update(self)
local p = self:GetParent()
local pt, sb, pw = p:GetTop(), self:GetBottom(), p:GetWidth()
if pt and sb then
p:SetHeight(pt-sb+8)
end
if pw then
self:SetWidth(pw - 20)
end
self.Bar:SetProgress(self.pv)
self.Fill2:SetWidth(self.Bar:GetWidth()*self.v2)
end
local function TooltipProgressBar_Activate(self, tip, cur, max, label, q1)
if not (cur and max) then
return
end
self.pv = cur/max
self.v2 = math.max(0.00001, math.min(1-self.pv, (q1 or 0)/max))
self.Bar.Text:SetText(label)
self.Fill2:SetAtlas((cur+ (q1 or 0)) > max and "UI-Frame-Bar-Fill-Green" or "UI-Frame-Bar-Fill-Yellow")
local tl = (q1 or 0)/max
self.Fill2:SetTexCoord(tl, tl+self.v2, 0, 1)
self.Fill2:SetShown((q1 or 0) > 0)
self:SetParent(tip)
tip:AddLine(("|TInterface/Minimap/PartyRaidBlipsV2:5:65:0:0:64:32:62:63:0:2|t "):rep(3))
local lastLine = _G[tip:GetName() .. "TextLeft" .. (tip:NumLines()-1)]
self:SetPoint("TOPLEFT", lastLine, "BOTTOMLEFT", 0, -2)
self:Show()
tip:Show()
TooltipProgressBar_Update(self)
end
local function TooltipProgressBar_OnHide(self)
self:Hide()
self:SetParent(nil)
self:ClearAllPoints()
end
local function CountdownText_OnUpdate(self)
local now = GetTime()
if now >= self.cdtTick then
local cdTo = self.cdtTo
local secsLeft = cdTo-now
if secsLeft <= 0 then
self.CDTDisplay:SetText(self.cdtRest)
self:SetScript("OnUpdate", nil)
self.cdtTick, self.cdtTo = nil
else
self.cdtTick = secsLeft < 120 and (now + secsLeft % 0.5 + 0.01) or (now + secsLeft % 60 + 0.01)
self.CDTDisplay:SetText(self.cdtPrefix .. GetTimeStringFromSeconds(secsLeft, self.cdtShort, self.cdtRoundedUp) .. self.cdtSuffix .. self.cdtRest)
end
end
end
local function CountdownText_SetCountdown(self, prefix, expireAt, suffix, rest, isShort, isRoundUp)
prefix, suffix, rest = prefix or "", suffix or "", rest or ""
local now = GetTime()
if not (expireAt and expireAt > now) then
self.CDTDisplay:SetText(rest or "")
self:SetScript("OnUpdate", nil)
else
self.cdtTick, self.cdtPrefix, self.cdtTo, self.cdtSuffix, self.cdtRest, self.cdtShort, self.cdtRoundedUp = now, prefix, expireAt, suffix, rest, isShort, isRoundUp == true
self:SetScript("OnUpdate", CountdownText_OnUpdate)
CountdownText_OnUpdate(self)
end
end
local function ResizedButton_SetText(self, text)
(self.Text or self):SetText(text)
self:SetWidth((self.Text or self):GetStringWidth()+26)
end
local function ResourceButton_Update(self, _event, currencyID)
if currencyID == self.currencyID then
local ci = C_CurrencyInfo.GetCurrencyInfo(currencyID)
local quant = ci and U.GetShiftedCurrencyValue(currencyID, ci.quantity)
if quant then
self.Text:SetText(BreakUpLargeNumbers(quant))
self:SetWidth(self.Text:GetStringWidth()+26)
end
if GameTooltip:IsOwned(self) and GameTooltip:IsShown() then
self:GetScript("OnEnter")(self)
end
end
end
local function ResourceButton_OnClick(self)
if IsModifiedClick("CHATLINK") then
ChatEdit_InsertLink(C_CurrencyInfo.GetCurrencyLink(self.currencyID, 42))
end
end
local function SetRarityBorder(b, r, atlas)
r = type(r) == "number" and r or 2
local vc = (atlas or r >= 1) and 1 or 0.65
b:SetAtlas(atlas
or r <= 1 and "loottoast-itemborder-gold"
or r == 2 and "loottoast-itemborder-green"
or r == 3 and "loottoast-itemborder-blue"
or r == 4 and "loottoast-itemborder-purple"
or r == 9 and "loottoast-itemborder-gold"
or "loottoast-itemborder-orange")
b:SetDesaturated(r <= 1 and not atlas)
b:SetVertexColor(vc, vc, vc)
end
local RewardButton_SetReward do
local baseXPReward = {title=L"Follower XP", tooltip=L"Awarded even if the adventurers are defeated.", icon="Interface/Icons/XP_Icon", qualityAtlas="loottoast-itemborder-purple"}
function RewardButton_SetReward(self, rew, isOvermax, pw)
if rew == "xp" then
baseXPReward.followerXP = isOvermax
return RewardButton_SetReward(self, baseXPReward)
end
self:SetShown(not not rew)
if not rew then
return
end
local q, tooltipTitle, tooltipText, cq = rew.quantity, rew.title
if rew.icon then
self.Icon:SetTexture(rew.icon)
elseif rew.itemID then
self.Icon:SetTexture(GetItemIcon(rew.itemID))
end
self.RarityBorder:SetDesaturated(false)
self.RarityBorder:SetVertexColor(1,1,1)
if rew.currencyID then
if rew.currencyID == 0 then
q = math.floor(rew.quantity / 1e4)
tooltipText = GetMoneyString(rew.quantity)
SetRarityBorder(self.RarityBorder, 9)
else
local ci = C_CurrencyInfo.GetCurrencyContainerInfo(rew.currencyID, rew.quantity)
if ci then
self.Icon:SetTexture(ci.icon)
tooltipTitle = (ci.quality and "|c" .. (select(4,GetItemQualityColor(ci.quality)) or "ff00ffff") or "") .. ci.name
tooltipText = NORMAL_FONT_COLOR_CODE .. (ci.description or "")
end
local ci2 = C_CurrencyInfo.GetCurrencyInfo(rew.currencyID)
SetRarityBorder(self.RarityBorder, ci and ci.quality or ci2 and ci2.quality)
cq = (isOvermax and pw and pw.currencyID == rew.currencyID and pw.currencyQ or 0) + q
end
elseif rew.itemID then
q = rew.quantity == 1 and "" or rew.quantity or ""
local r = select(3,GetItemInfo(rew.itemLink or rew.itemID)) or select(3,GetItemInfo(rew.itemID)) or 2
SetRarityBorder(self.RarityBorder, r)
elseif rew.followerXP then
q, tooltipTitle, tooltipText = BreakUpLargeNumbers(rew.followerXP), rew.title, rew.tooltip
SetRarityBorder(self.RarityBorder, 2, rew.qualityAtlas)
end
self.currencyID, self.currencyAmount, self.currencyQ = rew.currencyID, rew.quantity, cq
self.itemID, self.itemLink = rew.itemID, rew.itemLink
self.tooltipHeader, self.tooltipText = tooltipTitle, tooltipText
self.Quantity:SetText(q == 1 and "" or q or "")
end
end
local function RewardBlock_SetRewards(self, xp, rw)
local nc = xp and (self[1]:SetReward("xp", xp) and nil or 2) or 1
nc = nc + (self[nc]:SetReward(rw and rw[1]) and nil or 1)
nc = nc + (self[nc]:SetReward(rw and rw[2]) and nil or 1)
for i=nc, #self do self[i]:SetReward() end
if self.Container then
self.Container:SetWidth((self[1]:GetWidth()+4)*((xp and 1 or 0) + (rw and #rw or 0))-2)
elseif self.Label then
self[1]:GetParent():SetWidth(self.Label:GetStringWidth()+16+32*(1+(rw and #rw or 0)))
end
end
local function FollowerButton_OnDragStart(self)
if self:IsEnabled() then
local fa = CovenantMissionFrame.MissionTab.MissionPage.Board.framesByBoardIndex
local fid = self.info.followerID
if not self.info.isAutoTroop then
for i=0,4 do
local f = fa[i]
if f:IsShown() and f:GetFollowerGUID() == fid then
return
end
end
end
CovenantMissionFrame:OnDragStartFollowerButton(CovenantMissionFrame:GetPlacerFrame(), self, 24);
end
end
local function FollowerButton_OnDragStop(self)
if self:IsEnabled() then
CovenantMissionFrame:OnDragStopFollowerButton(CovenantMissionFrame:GetPlacerFrame());
end
end
local function GetAltModifierKeyText(ex)
local m = GetModifiedClick(ex)
return m and m:match("ALT") and CTRL_KEY_TEXT or ALT_KEY_TEXT
end
local function IsAltModifiedClick(ex)
local m = GetModifiedClick(ex)
if m and m:match("ALT") then
return IsControlKeyDown()
else
return IsAltKeyDown()
end
end
local function FollowerButton_OnClick(self, b)
if b == "LeftButton" and not self.info.isAutoTroop and IsAltModifiedClick("CHATLINK") then
local gid = self.info.garrFollowerID
U.FollowerSetFavorite(gid, not U.FollowerIsFavorite(gid))
GameTooltip:Hide()
self:GetParent():Refresh()
return
elseif b == "RightButton" then
local fa = CovenantMissionFrame.MissionTab.MissionPage.Board.framesByBoardIndex
local fid = self.info.followerID
for i=0,self.info.isAutoTroop and -1 or 4 do
if fa[i]:GetFollowerGUID() == fid then
CovenantMissionFrame:RemoveFollowerFromMission(fa[i], true)
return
end
end
CovenantMissionFrame.MissionTab.MissionPage:AddFollower(fid)
elseif b == "LeftButton" and IsModifiedClick("CHATLINK") then
ChatEdit_InsertLink(C.GetFollowerLink(self.info.followerID))
end
self:GetParent():SyncToBoard()
end
local function FollowerButton_OnEnter(self)
local info = self.info
if not info then return end
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
U.SetFollowerInfo(GameTooltip, info, info.autoCombatSpells, nil, nil, nil, nil, true)
local tmid = U.FollowerHasTentativeGroup(info.followerID)
if info.status == GARRISON_FOLLOWER_ON_MISSION and info.missionTimeEnd then
local tl = math.max(0, info.missionTimeEnd-GetTime())
GameTooltip:AddLine(" ")
GameTooltip:AddLine(tl > 0 and COVENANT_MISSIONS_ON_ADVENTURE_DURATION:format(GetTimeStringFromSeconds(tl, false, true, true)) or COVENANT_FOLLOWER_MISSION_COMPLETE, 1, 0.4, 0)
GameTooltip:Show()
elseif tmid and C_Garrison.GetMissionTimes(tmid) then
local tn = C_Garrison.GetMissionName(tmid)
GameTooltip:AddLine(" ")
GameTooltip:AddLine((L"In Tentative Party - %s"):format(tn or "??"), 1, 0.4, 0)
GameTooltip:Show()
end
if not (info.isAutoTroop or info.missionTimeEnd) then
local act = U.FollowerIsFavorite(info.garrFollowerID) and BATTLE_PET_UNFAVORITE or BATTLE_PET_FAVORITE
local short = GetAltModifierKeyText("CHATLINK") .. "+|TInterface\\TUTORIALFRAME\\UI-TUTORIAL-FRAME:0:0:0:-1:512:512:2:78:240:316|t: "
GameTooltip:AddLine(" ")
GameTooltip:AddLine(short .. act, 0.5, 0.8, 1)
GameTooltip:Show()
end
end
local function FollowerButton_GetInfo(self)
return self.info
end
local function FollowerButton_GetFollowerGUID(self)
return self.info.followerID
end
local function FollowerButton_SetInfo(self, info)
local s = S[self]
local onMission = info.status == GARRISON_FOLLOWER_ON_MISSION
local inTG = not info.isAutoTroop and U.FollowerHasTentativeGroup(info.followerID)
local vc, dc = inTG and 0.55 or onMission and 0.25 or 1, onMission and 0.65 or 1
local mc = onMission and DISABLED_FONT_COLOR or NORMAL_FONT_COLOR
local mtl = info.missionTimeEnd and GetTimeStringFromSeconds(math.max(0, info.missionTimeEnd-GetTime()), 2, true, true) or ""
self.info = info
s.Portrait:SetTexture(info.portraitIconID)
s.Portrait2:SetTexture(info.portraitIconID)
s.TextLabel:SetText(onMission and mtl or info.level)
s.TextLabel:SetTextColor(mc.r, mc.g, mc.b)
s.PortraitR:SetVertexColor(dc, dc, dc)
s.PortraitT:SetShown(inTG)
s.Portrait:SetVertexColor(vc, vc, vc)
s.Portrait2:SetShown(inTG or onMission)
s.Favorite:SetShown(not info.isAutoTroop and not (onMission and inTG) and (info.soFavorite or 0) > 0)
if inTG then
s.Portrait2:SetVertexColor(0.6, 0, 0)
else
s.Portrait2:SetVertexColor(1, 1, 1)
end
local ir = info.role
s.Role:SetAtlas(ir == 1 and "adventures-dps" or ir == 4 and "adventures-healer" or ir == 5 and "adventures-tank" or "adventures-dps-ranged")
self:SetEnabled(not onMission)
s.Health:SetShown(not onMission)
local cs = info.autoCombatantStats
s.Health:SetWidth(s.HealthBG:GetWidth()*math.min(1, cs and (cs.currentHealth/cs.maxHealth)+0.001 or 0.001))
s.ExtraTex:SetDesaturated(onMission)
if info.missionTimeEnd then
local t = GetTime()
local tl = info.missionTimeEnd-t
local te = tl > 1 and (t+tl%60+0.05)
if te and te < (self:GetParent().nextUpdate or 0) then
self:GetParent().nextUpdate = te
end
end
local ns = info.autoCombatSpells and #info.autoCombatSpells or 0
for i=1,ns do
local sp = info.autoCombatSpells[i]
s.Abilities[i]:SetTexture(sp.icon)
s.Abilities[i]:Show()
s.AbilitiesB[i]:Show()
end
for i=ns+1, #s.Abilities do
s.Abilities[i]:Hide()
s.AbilitiesB[i]:Hide()
end
if onMission then
s.HealthBG:SetGradient("VERTICAL", 0.1,0.1,0.1, 0.2,0.2, 0.2)
else
s.HealthBG:SetGradient("VERTICAL", 0.07,0.07,0.07, 0.14,0.14,0.14)
end
end
local SortFollowerList, CompareFollowerXP do
local preferLowHealth, uiOrder
local function FollowerList_Compare(a,b)
local ac, bc = a.missionTimeEnd, b.missionTimeEnd
if ac ~= bc then
if ac and bc then
return ac < bc
else
return not ac
end
end
ac, bc = not a.inTentativeGroup, not b.inTentativeGroup
if ac ~= bc then
return ac
end
local uiFree = uiOrder and not (a.missionTimeEnd or a.inTentativeGroup)
if uiFree and a.soFavorite ~= b.soFavorite then
ac, bc = a.soFavorite, b.soFavorite
else
ac, bc = a.level, b.level
end
if preferLowHealth and ac == bc then
ac, bc = a.autoCombatantStats, b.autoCombatantStats
ac, bc = ac and -ac.currentHealth/ac.maxHealth or 0, bc and -bc.currentHealth/bc.maxHealth or 0
end
if uiFree and ac == bc then
ac, bc = #(a.autoCombatSpells or "1"), #(b.autoCombatSpells or "1")
end
if ac == bc then
ac, bc = a.xp, b.xp
end
if ac == bc then
ac, bc = a.autoCombatantStats, b.autoCombatantStats
ac, bc = ac and ac.maxHealth or 0, bc and bc.maxHealth or 0
end
if ac == bc then
ac, bc = b.name, a.name
end
return ac > bc
end
function CompareFollowerXP(a,b)
local ac, bc = a.level, b.level
if ac == bc then
ac, bc = a.xp, b.xp
end
if ac == bc then
ac, bc = a.name, b.name
end
return ac > bc
end
function SortFollowerList(list, preferLowHP, forUI)
preferLowHealth, uiOrder = preferLowHP, forUI
for i=1,#list do
list[i].inTentativeGroup = U.FollowerHasTentativeGroup(list[i].followerID)
list[i].soFavorite = forUI and U.FollowerIsFavorite(list[i].garrFollowerID) and 1 or 0
end
table.sort(list, FollowerList_Compare)
end
end
local function FollowerList_GetTroopHint(ft)
local o
if #ft > 0 then
table.sort(ft, CompareFollowerXP)
local m = (#ft + #ft%2)/2
local ml = ft[m].level
if #ft % 2 == 0 then
local fi = ft[m+1]
o = "|cffa0a0a0[" .. fi.level .. "]|r |cffffffff" .. fi.name .. "|r"
ml = (ml+fi.level)/2
end
for i=ft[m].level == 60 and 0 or m, 1, -1 do
local fi = ft[i]
o = "|cffa0a0a0[" .. fi.level .. "]|r |cffffffff" .. fi.name .. "|r" .. (o and "\n" .. o or "")
if i == 1 or ft[i].level ~= ft[i-1].level then
break
end
end
local mlc = ("%s%.3g|r"):format(NORMAL_FONT_COLOR_CODE, ml)
o = (L"Your troop level is the median level of your companions (%s), rounded down. It does not decrease when you recruit additional companions."):format(mlc)
.. (ml < 60 and "\n\n" .. NORMAL_FONT_COLOR_CODE .. L"These companions currently affect your troop level:" .. "|r\n" .. o or "")
end
return COVENANT_MISSIONS_TUTORIAL_TROOPS .. (o and ("\n\n" .. o) or "")
end
local function FollowerList_SyncToBoard(self)
local fa = CovenantMissionFrame.MissionTab.MissionPage.Board.framesByBoardIndex
local ca = S[self].companions
for i=1, #ca do
local c = ca[i]
local isInMission = false
for i=0, c:IsShown() and 4 or -1 do
local f = fa[i]
if f and f.name and f:IsShown() and f.info and f.info.followerID == c.info.followerID then
isInMission = true
break
end
end
if S[c].EC then
S[c].EC:SetShown(isInMission)
end
end
end
local function FollowerList_SyncXPGain(self, setXPGain)
local ca = S[self].companions
local xpGain = type(setXPGain) == "number" and setXPGain or self.xpGain or -1
self.xpGain = xpGain
for i=1,#ca do
local w = ca[i]
local info = w.info
local isAway = (info and info.status == GARRISON_FOLLOWER_ON_MISSION)
local willLevel = (info and not info.isAutoTroop and not info.isMaxLevel and info.xp and info.levelXP and (info.levelXP-info.xp) <= xpGain)
S[w].Blip:SetShown(willLevel and not isAway)
end
end
local function FollowerList_Refresh(self, setXPGain)
local s = S[self]
local wt, wf = s.troops, s.companions
if self.noRefresh == nil then
local fl = C_Garrison.GetFollowers(123)
local ft = C_Garrison.GetAutoTroops(123)
for i=1,#ft do
FollowerButton_SetInfo(wt[i], AugmentFollowerInfo(ft[i]))
end
for i=1,#fl do
AugmentFollowerInfo(fl[i])
end
s.TroopInfo.tooltipText = FollowerList_GetTroopHint(fl)
SortFollowerList(fl, false, true)
for i=1,#fl do
local fi = fl[i]
FollowerButton_SetInfo(wf[i], fi)
wf[i]:Show()
end
for i=#fl+1,#wf do
wf[i]:Hide()
end
self:SetHeight(135+72*math.ceil(#fl/4))
self.noRefresh = true
end
FollowerList_SyncToBoard(self)
FollowerList_SyncXPGain(self, setXPGain)
end
local function FollowerList_OnUpdate(self)
local t = GetTime()
self.noRefresh = nil
if t >= (self.nextUpdate or 0) then
self.nextUpdate = t+60
self:Refresh()
local mf = GetMouseFocus()
if mf and mf:GetParent() == self and GameTooltip:IsOwned(mf) then
local f = mf:GetScript("OnEnter")
if f then f(mf) end
end
end
end
local function DoomRun_OnEnter(self)
local ft, g, gn = C_Garrison.GetFollowers(123), {}, 0
SortFollowerList(ft, true, false)
for i=#ft,1,-1 do
local fi = ft[i]
if fi.isCollected and not fi.isMaxLevel and fi.status ~= GARRISON_FOLLOWER_ON_MISSION
and not U.FollowerHasTentativeGroup(fi.followerID)
and C_Garrison.GetFollowerAutoCombatStats(fi.followerID).currentHealth > 0 then
g[gn], gn = i, gn + 1
if gn == 5 then
break
end
end
end
local xpR = S[self:GetParent()].baseXPReward
local xpT = "|cff00ff00" .. GARRISON_REWARD_XP_FORMAT:format(BreakUpLargeNumbers(xpR)) .. "|r"
GameTooltip:SetOwner(self, "ANCHOR_TOP")
GameTooltip:SetText(L"Doomed Run")
GameTooltip:AddLine(L("Failing this mission grants %s to each companion."):format(xpT), 1,1,1,1)
if gn > 0 then
GameTooltip:AddLine(" ")
for i=0, gn-1 do
local fi = ft[g[i]]
local willLevelUp = fi.levelXP and fi.xp and fi.levelXP - fi.xp <= xpR or false
local upTex = willLevelUp and " |A:bags-greenarrow:0:0|a" or ""
GameTooltip:AddLine("|cffa0a0a0[" .. fi.level .. "]|r " .. fi.name .. upTex, 1,1,1)
g[i] = fi.followerID
end
GameTooltip:AddLine(L"Tentatively assign these rookies to this adventure.", 0.2,1,0.2, 1)
GameTooltip:AddLine("|TInterface/TUTORIALFRAME/UI-TUTORIAL-FRAME:14:12:0:-1:512:512:10:70:330:410|t " .. L"Start the adventure", 0.5, 0.8, 1)
end
self.group = gn > 0 and g or nil
GameTooltip:Show()
end
local function DoomRun_OnClick(self, button)
local mid = S[self:GetParent()].missionID
local g, st = self.group, self.showTime
local inShowCooldown = (GetTime()-st < 0.25)
if not (mid and g and st) or inShowCooldown then return end
if GameTooltip:IsOwned(self) then
GameTooltip:Hide()
end
if button == "RightButton" then
U.StartMissionWithDelay(mid, g)
else
U.StoreMissionGroup(mid, g)
PlaySound(SOUNDKIT.U_CHAT_SCROLL_BUTTON)
end
EV("I_MISSION_LIST_UPDATE")
end
local function DoomRun_OnShow(self)
self.showTime = GetTime()
end
local function TentativeGroupClear_OnClick(self)
local mid = S[self:GetParent()].missionID
U.StoreMissionGroup(mid, nil)
PlaySound(SOUNDKIT.U_CHAT_SCROLL_BUTTON)
end
local function getWastedRewards(r)
local o
for i=1, r and #r or 0 do
local ri = r[i]
local cid = ri and ri.currencyID
if cid and cid ~= 0 and ri.quantity then
local ci = C_CurrencyInfo.GetCurrencyInfo(cid)
local wq = ci and (ci.maxQuantity or 0) > 0 and ci.quantity and math.min(ci.quantity, ci.quantity + ri.quantity - ci.maxQuantity) or 0
if wq > 0 then
o = (o and o .. " " or "") .. wq .. " |T" .. (ci.iconFileID or "Interface/Icons/Temp") .. ":0|t"
end
end
end
return o
end
local function UButton_SetStartMode(self)
local tco = 0
for mid, nt in U.EnumerateTentativeGroups() do
tco = tco + nt + (C_Garrison.GetMissionCost(mid) or 0)
end
local anima = C_CurrencyInfo.GetCurrencyInfo(1813)
self.mode = anima and anima.quantity and anima.quantity >= tco and "start-send" or "start-cost"
end
local function UButton_Sync(self)
local ps = S[self:GetParent()]
if self == ps.StartButton then
return UButton_Sync(ps.UnButton)
end
local idm = U.HasDelayedStartMissions()
local ism = U.IsStartingMissions()
local icm = U.IsCompletingMissions()
local tg = U.HaveTentativeGroups()
self:Show()
if ism then
self:SetFormattedText(L"%d |4party:parties; remaining...", ism)
self.mode = "stop-send"
elseif idm then
self:SetFormattedText(L"Starting soon...")
self.mode = "stop-delayed-send"
elseif icm then
self:SetFormattedText(L"%d |4adventure:adventures; remaining...", icm)
self.mode = "stop-complete"
elseif ps and ps.hasCompletedMissions then
self:SetText(L"Complete All")
self.mode = "start-complete"
elseif tg then
self:SetText(L"Send Tentative Parties")
UButton_SetStartMode(self)
else
self.mode, self.clickWithEscape = nil, nil
self:Hide()
end
local ocwe = self.clickWithEscape
self.clickKey = self.mode ~= "start-send" and "SPACE" or nil
self.clickWithEscape = self.mode and self.mode:match("^stop%-") and true or nil
self.eatEscapeUntil = math.max(self.eatEscapeUntil or -math.huge, ocwe and self.clickWithEscape ~= ocwe and GetTime()+0.5 or -math.huge)
self.Glow:SetShown(self.mode == "stop-delayed-send")
if GameTooltip:IsOwned(self) then
local oe = self:GetScript("OnEnter")
if not self:IsVisible() then
GameTooltip:Hide()
elseif oe then
oe(self)
end
end
if self.mode == "start-complete" and tg then
UButton_SetStartMode(ps.StartButton)
ps.StartButton:Show()
else
ps.StartButton:Hide()
end
end
local function UButton_OnEnter(self)
local m = self.mode
if m == "start-send" or m == "stop-send" or m == "start-cost" then
GameTooltip:SetOwner(self, "ANCHOR_BOTTOM")
GameTooltip:AddLine(L"Send Tentative Parties")
local cb = C_CurrencyInfo.GetBasicCurrencyInfo(1813)
local curIco = cb and cb.icon and " |T" .. cb.icon .. ":0|t" or ""
local hadZH, hourglass = false, "|Tinterface/common/mini-hourglass:0:0:0:0:1:1:0:1:0:1:255:80:0|t "
local tco, ng = 0,0
for mid, nt, zeroHealth in U.EnumerateTentativeGroups() do
local co = C_Garrison.GetMissionCost(mid) or 0
hadZH = hadZH or zeroHealth
GameTooltip:AddDoubleLine((zeroHealth and hourglass or "") .. C_Garrison.GetMissionName(mid), (co+nt) .. curIco, 1,1,1, 1,1,1)
tco, ng = tco + co + nt, ng + 1
end
if ng > 1 then
local nc, ac = NORMAL_FONT_COLOR, m == "start-cost" and RED_FONT_COLOR or HIGHLIGHT_FONT_COLOR
GameTooltip:AddDoubleLine(TOTAL, tco .. curIco, nc.r, nc.g, nc.b, ac.r, ac.g, ac.b)
end
GameTooltip:AddLine(" ")
if m == "start-cost" then
GameTooltip:AddLine(L"Insufficient anima", 1, 0.5, 0)
end
if hadZH then
GameTooltip:AddLine(hourglass .. "|cffff8000" .. COVENANT_MISSIONS_COMPANIONS_MISSING_HEALTH, 1, 0.5, 0)
self.tooltipRefreshDelay = 10
self:SetScript("OnUpdate", CommonTooltip_DelayedRefresh_OnUpdate)
end
GameTooltip:AddLine("|TInterface/TUTORIALFRAME/UI-TUTORIAL-FRAME:14:12:0:-1:512:512:10:70:330:410|t " .. L"Clear all tentative parties", 0.5, 0.8, 1)
GameTooltip:Show()
elseif m == "start-complete" then
GameTooltip:SetOwner(self, "ANCHOR_BOTTOM")
GameTooltip:AddLine(L"Complete All")
local ct = C_Garrison.GetCompleteMissions(123)
for i=1, ct and #ct or 0 do
local m = ct[i]
GameTooltip:AddDoubleLine(m.name or "", getWastedRewards(m.rewards) or "", 1,1,1, 1,0,0)
end
GameTooltip:AddLine(" ")
GameTooltip:AddLine("|TInterface/TUTORIALFRAME/UI-TUTORIAL-FRAME:14:12:0:-1:512:512:10:70:330:410|t " .. COVENANT_MISSIONS_COMBAT_LOG_HEADER, 0.5, 0.8, 1)
GameTooltip:Show()
elseif m == "stop-delayed-send" then
GameTooltip:SetOwner(self, "ANCHOR_BOTTOM")
GameTooltip:AddLine(L"Starting soon...")
local cb = C_CurrencyInfo.GetBasicCurrencyInfo(1813)
local curIco = cb and cb.icon and " |T" .. cb.icon .. ":0|t" or ""
for mid, nt in U.EnumerateTentativeGroups() do
if U.IsMissionStartingSoon(mid) then
local co = C_Garrison.GetMissionCost(mid) or 0
GameTooltip:AddDoubleLine(C_Garrison.GetMissionName(mid), (co+nt) .. curIco, 1,1,1, 1,1,1)
end
end
GameTooltip:AddLine(" ")
GameTooltip:AddLine("|TInterface/TUTORIALFRAME/UI-TUTORIAL-FRAME:14:12:0:-1:512:512:10:70:330:410|t " .. COVENANT_MISSIONS_START_ADVENTURE, 0.5, 0.8, 1)
GameTooltip:Show()
end
end
local function UButton_OnClick(self, button)
local m, snd = self.mode, SOUNDKIT.U_CHAT_SCROLL_BUTTON
if U.IsStartingMissions() and m == "stop-send" then
U.StopStartingMissions()
elseif U.IsCompletingMissions() and m == "stop-complete" then
U.StopCompletingMissions()
elseif m == "stop-delayed-send" then
if button == "RightButton" then
U.RushDelayedStartMissions()
else
U.ClearDelayedStartMissions()
U.StopStartingMissions()
snd = 39514
end
elseif m == "start-complete" then
if button == "RightButton" then
U.InitiateMissionCompletion("first")
else
U.StartCompletingMissions()
if GameTooltip:IsOwned(self) then
GameTooltip:Hide()
end
end
elseif U.HaveTentativeGroups() and m == "start-send" then
if button == "RightButton" then
U.DisbandTentativeGroups()
else
U.SendTentativeGroups()
end
end
PlaySound(snd)
UButton_Sync(self)
end
local function UButton_OnKeyDown(self, button)
if self:GetParent().keyFocus then
return
end
local click = button and button == self.clickKey
local abort = button == "ESCAPE" and self.clickWithEscape
local eatEsc = button == "ESCAPE" and self.eatEscapeUntil and self.eatEscapeUntil >= GetTime()
self:SetPropagateKeyboardInput(not (click or abort or eatEsc))
if click or abort then
self:Click()
end
end
local function Toast_Animate(self, elapsed)
local now, as, ap, d = GetTime(), self.animStart, self.animPhase
if as and elapsed > 0.04 then
as = as + elapsed - 0.04
self.animStart = as
end
if ap == nil then
self.animPhase, self.animStart = 1, nil
self:SetAlpha(0)
return
elseif as == nil then
self.animStart, as = now, now
self:SetAlpha(1)
end
d = now-as
if d < 0.5 then
self.PreGlow:SetAlpha(d < 0.25 and (d < 0.125 and d*8 or 2-d*8)*0.75 or 0)
self.Background:SetAlpha(d < 0.15 and sin(20+70*d/0.15) or 1)
self.Sheen:SetAlpha(sin(360*d))
self.Sheen:SetPoint("LEFT", 480*d, -1)
elseif d >= 4 then
self:Hide()
elseif self:IsMouseOver() then
self.animStart = now-2
if ap ~= 2 then
self.animPhase = 2
self.PreGlow:SetAlpha(0)
self.Background:SetAlpha(1)
self.Sheen:SetAlpha(0)
self:SetAlpha(1)
end
elseif d >= 3 then
self:SetAlpha(cos(90*(d-3)))
self.animPhase = 3
elseif ap ~= 2 then
self.animPhase = 2
self.PreGlow:SetAlpha(0)
self.Background:SetAlpha(1)
self.Sheen:SetAlpha(0)
end
end
local function Toast_OnClick(self, button)
if button == "RightButton" then
self.animPhase, self.animStart = nil
self:Hide()
end
end
local function MissionPage_AcquireToast(self, followerMode)
local toasts, toast = self.Toasts
for i=1,#toasts do
toast = toasts[i]
if not toast:IsShown() then
break
end
toast = nil
end
if not toast then
toast = CreateObject("MissionToast", toasts[1]:GetParent())
toast:SetPoint("TOP", toasts[#toasts], "BOTTOM", 0, -5)
toasts[#toasts+1] = toast
end
followerMode = not not followerMode
S[toast].Rewards.Container:SetWidth(38)
S[toast].Rewards.Container:SetShown(not followerMode)
toast.Portrait:SetShown(followerMode)
toast.PortraitFrame:SetShown(followerMode)
toast.animStart, toast.animPhase = nil
toast:Show()
return toast
end
local function MissionToast_CheckTooltip(tip, self)
if (tip:GetLeft() or 2) < 1 then
tip:ClearAllPoints()
tip:SetPoint("LEFT", self, "RIGHT", self.tooltipFXO or 0, self.tooltipFYO or 0)
end
end
local function cmpTimeLeft(a, b)
if a.timeLeft ~= b.timeLeft then
return a.timeLeft < b.timeLeft
end
return (a.name or "") < (b.name or "")
end
local function Common_RefreshTooltip(self)
local rat = self.refreshAt
local owned = rat and GameTooltip:IsOwned(self)
if owned and rat > GetTime() then
return
end
self.refreshAt = nil
self:SetScript("OnUpdate", nil)
if owned then
self:GetScript("OnEnter")(self)
end
end
local function AwayFollowers_OnEnter(self)
GameTooltip:SetOwner(self, self.tooltipAnchor or "ANCHOR_TOP", self.tooltipXO or 0, self.tooltipYO or 0)
GameTooltip:SetText(ITEM_QUALITY_COLORS[3].hex .. COVENANT_MISSION_FOLLOWER_CATEGORY)
local ft, ct, nt = {}, C_Garrison.GetFollowers(123), 0
for i=1,#ct do
local ci = ct[i]
if ci.status == GARRISON_FOLLOWER_ON_MISSION then
ci.timeLeft = C_Garrison.GetFollowerMissionTimeLeftSeconds(ci.followerID) or 86400
ft[#ft+1] = ci
elseif U.FollowerHasTentativeGroup(ci.followerID) then
nt = nt + 1
end
end
table.sort(ft, cmpTimeLeft)
local refNext = nil
if #ft == 0 and nt == 0 then
GameTooltip:AddLine(L'All companions are ready for adventures.', 1,1,1);
elseif #ct ~= #ft or nt > 0 then
GameTooltip:AddLine((L'%d |4companion is:companions are; ready for adventures.'):format(#ct-#ft), 1,1,1, 1)
end
if nt > 0 then
GameTooltip:AddLine((L'%d |4companion is:companions are; in a tentative party.'):format(nt), 1,1,1, 1)
end
if #ft > 0 then
if GameTooltip:NumLines() > 1 then
GameTooltip:AddLine(" ")
end
GameTooltip:AddLine(L"Returning soon:")
for i=1,#ft do
local fi = ft[i]
local nr, tl = (fi.timeLeft + 59.998) % 60, U.GetTimeStringFromSeconds(fi.timeLeft, false, true, true)
refNext = refNext and refNext <= nr and refNext or nr
GameTooltip:AddDoubleLine("|cff909090[" .. fi.level .. "]|r|cffffffff " .. fi.name, NORMAL_FONT_COLOR_CODE .. " " .. (tl or ""))
end
end
self.refreshAt = refNext and (GetTime() + refNext)
self:SetScript("OnUpdate", Common_RefreshTooltip)
GameTooltip:Show()
end
do -- Factory.ObjectGroup
local NamedMethodCallCache = setmetatable({}, {__index=function(t,k)
t[k] = function(self, ...)
for i=1,#self do
local o = self[i]
securecall(o[k], o, ...)
end
end
return t[k]
end})
local ObjectGroup_Meta = {__index=function(t,k)
if type(k) == "string" and type(t[1]) == "table" and type(t[1][k]) == "function" then
t[k] = NamedMethodCallCache[k]
return t[k]
end
end}
function Factory.ObjectGroup(...)
return setmetatable(type((...)) == "table" and ... or {...}, ObjectGroup_Meta)
end
end
function Factory.PanelButton(parent)
local r = CreateFrame("Button", nil, parent, "UIPanelButtonNoTooltipTemplate")
r:SetHeight(UIBUTTON_HEIGHT)
r:SetPushedTextOffset(-1, -1)
return r
end
function Factory.PanelButtonGlow(p)
local ex, ey, w = 6, 6, 16
local g = CreateFrame("Frame", nil, p)
g:SetFlattensRenderLayers(true)
local t = g:CreateTexture(nil, "BACKGROUND", nil, -1)
g:SetAllPoints()
t:SetTexture("Interface/Buttons/UI-Panel-Button-Glow")
t:SetPoint("TOPLEFT", -ex, ey)
t:SetPoint("BOTTOMRIGHT", g, "BOTTOMLEFT", w-ex, -ey)
t:SetTexCoord(0, 20/128, 0, 38/64)
t:SetBlendMode("ADD")
t, g[1] = g:CreateTexture(nil, "BACKGROUND", nil, -1)
t:SetTexture("Interface/Buttons/UI-Panel-Button-Glow")
t:SetPoint("TOPRIGHT", ex, ey)
t:SetPoint("BOTTOMLEFT", g, "BOTTOMRIGHT", ex-w, -ey)
t:SetTexCoord(75/128, 95/128, 0, 38/64)
t:SetBlendMode("ADD")
t, g[2] = g:CreateTexture(nil, "BACKGROUND", nil, -1)
t:SetTexture("Interface/Buttons/UI-Panel-Button-Glow")
t:SetPoint("TOPLEFT", w-ex, ey)
t:SetPoint("BOTTOMRIGHT", ex-w, -ey)
t:SetTexCoord(20/128, 75/128, 0, 38/64)
t:SetBlendMode("ADD")
g[3] = t
local ag = g:CreateAnimationGroup()
ag:SetLooping("BOUNCE")
local aa = ag:CreateAnimation("Alpha")
aa:SetFromAlpha(0.15)
aa:SetToAlpha(0.75)
aa:SetDuration(0.8)
aa:SetSmoothing("IN_OUT")
ag:Play()
return g
end
function Factory.RaisedBorder(parent)
local border = CreateFrame("Frame", nil, parent)
border:SetPoint("TOPLEFT", 0, 8)
border:SetPoint("BOTTOMRIGHT", 0, -4)
do
local t = border:CreateTexture(nil, "BACKGROUND")
t:SetPoint("TOPLEFT", 0, 2)
t:SetPoint("TOPRIGHT", 0, 2)
t:SetHeight(12)
t:SetTexture("Interface/Garrison/AdventureMissionsFrameHorizontal")
t:SetTexCoord(0,1, 67/128, 79/128)
t = border:CreateTexture(nil, "BACKGROUND")
t:SetPoint("BOTTOMLEFT", 0, -2)
t:SetPoint("BOTTOMRIGHT", 0, -2)
t:SetHeight(12)
t:SetTexture("Interface/Garrison/AdventureMissionsFrameHorizontal")
t:SetTexCoord(0,1, 79/128, 67/128)
t = border:CreateTexture(nil, "BACKGROUND")
t:SetPoint("TOPLEFT", -1, 0)
t:SetPoint("BOTTOMLEFT", -1, 0)
t:SetWidth(12)
t:SetTexture("Interface/Garrison/AdventureMissionsFrameVert")
t:SetTexCoord(85/128, 97/128, 0, 1)
t = border:CreateTexture(nil, "BACKGROUND")
t:SetPoint("TOPRIGHT", 1, 0)
t:SetPoint("BOTTOMRIGHT", 1, 0)
t:SetWidth(12)
t:SetTexture("Interface/Garrison/AdventureMissionsFrameVert")
t:SetTexCoord(67/128, 79/128, 0, 1)
t = border:CreateTexture(nil, "BACKGROUND", nil, 1)
t:SetSize(42, 42)
t:SetPoint("TOPLEFT")
t:SetTexture("Interface/Garrison/AdventureMissionsFrame")
t:SetTexCoord(650/1024, 688/1024, 1119/2048, 1158/2048)
t = border:CreateTexture(nil, "BACKGROUND", nil, 1)
t:SetSize(42, 42)
t:SetPoint("TOPRIGHT")
t:SetTexture("Interface/Garrison/AdventureMissionsFrame")
t:SetTexCoord(650/1024, 688/1024, 1119/2048, 1158/2048)
Mirror(t, true, false)
t = border:CreateTexture(nil, "BACKGROUND", nil, 1)
t:SetSize(42, 42)
t:SetPoint("BOTTOMLEFT")
t:SetTexture("Interface/Garrison/AdventureMissionsFrame")
t:SetTexCoord(650/1024, 688/1024, 1119/2048, 1158/2048)
Mirror(t, false, true)
t = border:CreateTexture(nil, "BACKGROUND", nil, 1)
t:SetSize(42, 42)
t:SetPoint("BOTTOMRIGHT")
t:SetTexture("Interface/Garrison/AdventureMissionsFrame")
t:SetTexCoord(650/1024, 688/1024, 1119/2048, 1158/2048)
Mirror(t, true, true)
t = parent:CreateTexture(nil, "BACKGROUND", nil, -2)
t:SetTexture("Interface/FrameGeneral/UIFrame"..CovenKit.."Background", true, true)
t:SetHorizTile(true)
t:SetVertTile(true)
t:SetAllPoints(border)
t:SetVertexColor(0.95, 0.95, 0.95)
t = parent:CreateTexture(nil, "BACKGROUND", nil, -1)
t:SetAtlas("Adventures-Missions-Shadow")
t:SetAllPoints(border)
t:SetAlpha(0.45)
end
end
function Factory.MissionPage(parent)
local f = CreateFrame("Frame", nil, parent)
local s = CreateObject("Shadow", f)
f:SetAllPoints()
f:EnableMouse(true)
s.MissionList = CreateObject("MissionList", f)
local resButton = CreateObject("ResourceButton", f, 1813) do
s.ResourceCounter = resButton
resButton:SetPoint("TOPRIGHT", -72, -30)
end
local ccButton = CreateObject("ILButton", f) do
s.CompanionCounter = ccButton
ccButton.Icon:SetTexture("Interface/FriendsFrame/Battlenet-Battleneticon")
ccButton.Icon:SetTexCoord(6/32,26/32, 6/32,26/32)
ccButton.Icon:SetBlendMode("ADD")
ccButton:SetPoint("RIGHT", resButton, "LEFT", -30, 0)
ccButton:SetScript("OnEnter", AwayFollowers_OnEnter)
end
local prButton = CreateObject("ResourceButton", f, 1889) do
s.ProgressCounter = prButton
prButton:SetPoint("RIGHT", ccButton, "LEFT", -35, 0)
end
local uButton = CreateObject("PanelButton", f) do
s.UnButton, uButton.Glow = uButton, CreateObject("PanelButtonGlow", uButton)
uButton:SetWidth(200)
uButton:SetPoint("TOPLEFT", 200, -34)
uButton:Hide()
uButton:RegisterForClicks("LeftButtonUp", "RightButtonUp")
uButton:SetScript("OnEnter", UButton_OnEnter)
uButton:SetScript("OnClick", UButton_OnClick)
uButton:SetScript("OnLeave", HideOwnGameTooltip)
uButton:SetScript("OnKeyDown", UButton_OnKeyDown)
uButton.Sync = UButton_Sync
end
local sButton = CreateObject("PanelButton", f) do
s.StartButton = sButton
sButton:Hide()
sButton:SetWidth(26)
sButton:SetPoint("LEFT", uButton, "RIGHT", 4, 0)
sButton:RegisterForClicks("LeftButtonUp", "RightButtonUp")
sButton:SetScript("OnEnter", UButton_OnEnter)
sButton:SetScript("OnClick", UButton_OnClick)
sButton:SetScript("OnLeave", HideOwnGameTooltip)
sButton:SetText("|TInterface/RaidFrame/UI-RaidFrame-Arrow:22:30:-3:-1|t")
end
local vButton = CreateObject("CommonHoverTooltip", CreateFrame("Button", nil, f)) do
s.Version = vButton
vButton:Disable()
vButton:SetMotionScriptsWhileDisabled(true)
local an = GetAddOnMetadata(AN, "Title") or AN or ""
local av = GetAddOnMetadata(AN, "Version") or "Q"
local aw = GetAddOnMetadata(AN, "X-Website")
vButton:SetPoint("BOTTOMRIGHT", -62, 20)
vButton:SetSize(110, 20)
vButton:SetPushedTextOffset(0,0)
vButton:SetNormalFontObject(GameFontNormalSmall)
vButton:SetDisabledFontObject(GameFontNormalSmall)
vButton:SetText("|cff787878" .. an .. " |r|cffb0b0b0" .. av)
local fs = vButton:GetFontString()
fs:ClearAllPoints()
fs:SetPoint("RIGHT")
vButton.tooltipHeader, vButton.tooltipTextNW, vButton.tooltipAnchor = an, true, "ANCHOR_TOPRIGHT"
vButton.tooltipText = aw and "|cff20a0ff" .. aw or nil
end
s.Toasts = {CreateObject("MissionToast", f)}
s.Toasts[1]:SetPoint("TOPLEFT", 20, -62)
s.AcquireToast = MissionPage_AcquireToast
return s
end
function Factory.MissionList(parent)
local coven = C_Covenants.GetCovenantData(C_Covenants.GetActiveCovenantID() or 1)
CovenKit = coven and coven.textureKit or "NightFae"
local missionList = CreateFrame("ScrollFrame", nil, parent)
local s = CreateObject("Shadow", missionList)
missionList:SetSize(892, 524)
missionList:SetPoint("TOP", 0, -72)
missionList:EnableMouseWheel(true)
missionList.ScrollToward = MissionList_ScrollToward
CreateObject("RaisedBorder", missionList)
do -- missionList:OnMouseWheel
local v = CreateFrame("Frame", nil, parent)
v:SetAllPoints(missionList)
v:EnableMouse(true)
v:SetFrameLevel(parent:GetFrameLevel()+20)
v:Hide()
s.ScrollVeil = v
local function scrollFinish(self)
local se = S[self]
self:GetScrollChild():SetPoint("TOPLEFT", 0, se.scrollEnd)
se.scrollStart, se.scrollEnd, se.scrollTimeStart, se.scrollTimeEnd, se.scrollSpeed, se.scrollLast = nil
self:SetScript("OnUpdate", nil)
self:SetScript("OnHide", nil)
se.ScrollVeil:Hide()
end
local function scrollOnUpdate(self)
local se = S[self]
local a, b, s, t = se.scrollStart, se.scrollEnd, se.scrollTimeStart, se.scrollTimeEnd
local sc, c = self:GetScrollChild(), GetTime()
if c >= t then
scrollFinish(self)
else
local p = a + (b-a)*(c-s)/(t-s)
sc:SetPoint("TOPLEFT", 0, p)
se.scrollLastTime, se.scrollLastOffset = c, s
end
end
local function onMouseWheel(self, d)
local se, y = S[self], select(5, self:GetScrollChild():GetPoint())
local snap = math.min(math.max(0, (se.scrollSnap or 0) - d), math.floor(((se.numMissions or 0)-1)/3)-1)
local dy = snap == 0 and 0 or (195*snap-30)
if se.scrollEnd ~= dy then
local ct = GetTime()
se.scrollSnap, se.scrollStart, se.scrollEnd, se.scrollTimeStart, se.scrollTimeEnd = snap, y, dy, ct, ct + 0.20
self:SetScript("OnUpdate", scrollOnUpdate)
self:SetScript("OnHide", scrollFinish)
S[self].ScrollVeil:Show()
end
end
missionList:SetScript("OnMouseWheel", onMouseWheel)
missionList:SetScript("OnKeyDown", function(self, k)
self:SetPropagateKeyboardInput(true)
if k == "PAGEDOWN" or k == "PAGEUP" then
self:SetPropagateKeyboardInput(false)
onMouseWheel(self, k == "PAGEDOWN" and -2 or 2)
elseif k == "HOME" or k == "END" then
self:SetPropagateKeyboardInput(false)
onMouseWheel(self, k == "END" and -math.huge or math.huge)
end
end)
function missionList:ReturnToTop()
local se = S[self]
se.scrollSnap, se.scrollEnd = 0, 0
scrollFinish(self)
end
function missionList:CheckScrollRange()
onMouseWheel(self, 0)
end
end
local scrollChild = CreateFrame("Frame", nil, missionList)
scrollChild:SetPoint("TOPLEFT")
scrollChild:SetSize(902,missionList:GetHeight())
missionList:SetScrollChild(scrollChild)
s.Missions = setmetatable({}, {__index=MissionList_SpawnMissionButton, __metatable=false})
for i=1,6 do
local cf = CreateObject("MissionButton", scrollChild)
s.Missions[i] = cf
cf:SetPoint("TOPLEFT", 292*(((i-1)%3)+1)-284, math.floor((i-1)/3) *- 195)
end
return s
end
function Factory.MissionButton(parent)
local cf, t = CreateFrame("Button", nil, parent)
local s = CreateObject("Shadow", cf)
cf:SetSize(290, 196)
cf:SetScript("OnClick", MissionButton_OnClick)
t = cf:CreateTexture(nil, "BACKGROUND", nil, -2)
t:SetAtlas("UI-Frame-"..CovenKit.."-CardParchmentWider")
t:SetPoint("TOPLEFT", 0, -24)
t:SetPoint("BOTTOMRIGHT", 0, 0)
Mirror(t, true)
t = cf:CreateTexture(nil, "ARTWORK", nil, -6)
t:SetAtlas("UI-Frame-"..CovenKit.."-CardParchmentWider")
t:SetPoint("TOPLEFT", 0, -24)
t:SetPoint("BOTTOMRIGHT", 0, 0)
t:SetVertexColor(0.30, 0.30, 0.40, 0.60)
Mirror(t, true)
t, s.Veil = cf:CreateFontString(nil, "BACKGROUND", "GameFontHighlightLarge"), t
t:SetText("Beast Beneath the Hydrant")
t:SetPoint("TOP", 0, -55.5)
t:SetWidth(276)
t:SetTextColor(0.97, 0.94, 0.70)
t, s.Name = cf:CreateTexture(nil, "BACKGROUND", nil, 2), t
t:SetAtlas("Campaign-QuestLog-LoreDivider")
local divC = CovenKit == "Kyrian" and 0xfeb0a0 or CovenKit == "Venthyr" and 0xfe40f0 or CovenKit == "Necrolord" and 0xc0fe00 or 0x4080fe
t:SetVertexColor(divC / 2^24, divC/256 % 256 / 255, divC%256/255)
t:SetWidth(286)
t:SetPoint("TOP", s.Name, 0, 6)
t:SetPoint("BOTTOM", s.Name, "BOTTOM", 0, -5)
t = cf:CreateFontString(nil, "OVERLAY", "GameFontBlack")
t:SetWidth(262)
t:SetPoint("TOP", s.Name, "BOTTOM", 0, -28.5)
t:SetText("Nyar!")
t, s.Description = CreateObject("CommonHoverTooltip", CreateFrame("Button", nil, cf)), t
t:SetNormalFontObject(GameFontBlack)
t:SetSize(40, 16)
t:SetPoint("BOTTOMLEFT", cf, 14, 13)
t:SetText("Expired")
t:GetFontString():SetJustifyH("LEFT")
t:SetMouseClickEnabled(false)
s.ExpireTime = t
CreateObject("CountdownText", cf, s.ExpireTime)
s.Rewards = CreateObject("RewardBlock", cf, 48, 4)
s.Rewards.Container:SetPoint("TOP", 0, -4)
t = CreateObject("AchievementRewardIcon", cf)
t:SetPoint("RIGHT", cf, "TOPRIGHT", -25, -40)
s.AchievementReward = t
t = CreateFrame("Frame", nil, cf)
t:SetPoint("TOP", s.Name, "BOTTOM", 0, -6)
t:SetSize(224, 20)
local a, b = cf:CreateTexture(nil, "BACKGROUND", nil, 2)
a:SetAtlas("ui_adv_health", true)
a:SetPoint("LEFT", t, "LEFT", -6, 0)
b = t:CreateFontString(nil, "OVERLAY", "GameFontBlack")
b:SetPoint("LEFT", a, "RIGHT", -2, 0)
b:SetText("2,424")
a, s.enemyHP = cf:CreateTexture(nil, "BACKGROUND", nil, 2), b
a:SetAtlas("ui_adv_atk", true)
a:SetPoint("LEFT", b, "RIGHT", 0, 0)
b = t:CreateFontString(nil, "OVERLAY", "GameFontBlack")
b:SetPoint("LEFT", a, "RIGHT", -2, 0)
b:SetText("2,424")
a, s.enemyATK = cf:CreateTexture(nil, "BACKGROUND", nil, 2), b
a:SetAtlas("animachannel-bar-" .. CovenKit .. "-gem", true)
a:SetPoint("LEFT", b, "RIGHT", 8, 0)
b = t:CreateFontString(nil, "OVERLAY", "GameFontBlack")
b:SetPoint("LEFT", a, "RIGHT", -2, 0)
b:SetText("42")
a, s.animaCost = cf:CreateTexture(nil, "BACKGROUND", nil, 2), b
a:SetTexture("Interface/Common/Mini-hourglass")
a:SetSize(14, 14)
a:SetVertexColor(0.5, 0.75, 1)
a:SetPoint("LEFT", b, "RIGHT", 8, 0)
b = t:CreateFontString(nil, "OVERLAY", "GameFontBlack")
b:SetPoint("LEFT", a, "RIGHT", 2, 0)
s.duration = b
s.statLine = t
t = CreateObject("ProgressBar", cf)
t:SetWidth(cf:GetWidth()-50)
t:SetPoint("BOTTOM", 0, 14)
t:SetHitRectInsets(-6, -6, -6, -6)
t.Fill:SetAtlas("UI-Frame-Bar-Fill-Blue")
t:SetScript("OnClick", MissionButton_OnProgressBarClick)
s.ProgressBar = t
local gb = CreateObject("PanelButton", cf)
gb:SetPoint("BOTTOM", 20, 10)
gb:SetText("Buttons!")
gb:SetWidth(165)
gb:RegisterForClicks("LeftButtonUp", "RightButtonUp")
gb:SetScript("OnClick", MissionButton_OnViewClick)
s.ViewButton = gb
t = CreateObject("PanelButton", cf)
t:SetPoint("RIGHT", s.ViewButton, "LEFT", -8)
t:SetWidth(24)
t:SetText("|TInterface/EncounterJournal/UI-EJ-HeroicTextIcon:0|t")
t:SetPushedTextOffset(-1, -1)
t:RegisterForClicks("LeftButtonUp", "RightButtonUp")
t:SetScript("OnEnter", DoomRun_OnEnter)
t:SetScript("OnLeave", HideOwnGameTooltip)
t:SetScript("OnClick", DoomRun_OnClick)
t:SetScript("OnShow", DoomRun_OnShow)
t, s.DoomRunButton = CreateObject("PanelButton", cf), t
t:SetAllPoints(s.DoomRunButton)
t:SetText("|TInterface/Buttons/UI-StopButton:0|t")
t:SetScript("OnClick", TentativeGroupClear_OnClick)
t:SetPushedTextOffset(-1, -1)
s.TentativeClear = t
t = cf:CreateFontString(nil, "BACKGROUND", "GameFontNormalSmall")
t:SetTextColor(0.97, 0.94, 0.70)
t:SetPoint("TOPLEFT", 16, -38)
t, s.TagText = CreateObject("BoardGroup", cf), t
t:SetWidth(272)
t:SetPoint("TOP", s.Name, "BOTTOM", 0, -24)
t:SetPoint("BOTTOM", 0, 37)
s.Group = t
s.SetGroupPortraits = MissionButton_SetGroupPortraits
return cf
end
function Factory.BoardGroup(parent)
local f, t, r = CreateFrame("Frame", nil, parent)
local s = CreateObject("Shadow", f)
for i=0,4 do
t = f:CreateTexture(nil, "ARTWORK", nil, 1)
r = f:CreateTexture(nil, "ARTWORK", nil, 2)
t:SetSize(36, 36)
r:SetAtlas("GarrMission_PortraitRing_Enemy")
r:SetPoint("TOPRIGHT", t, "TOPRIGHT", 3.5, 3.5)
r:SetPoint("BOTTOMLEFT", t, "BOTTOMLEFT", -3.5, -3.5)
s[i], s[5+i] = t, r
end
s[0]:SetPoint("BOTTOM", -44, 5)
s[1]:SetPoint("BOTTOM", 44, 5)
s[2]:SetPoint("TOP", -88, -5)
s[3]:SetPoint("TOP", 0, -5)
s[4]:SetPoint("TOP", 88, -5)
return f
end
function Factory.RewardFrame(parent, sz)
sz = sz or 48
local f, t = CreateObject("CommonHoverTooltip", CreateFrame("Button", nil, parent))
f:SetSize(sz, sz)
t = f:CreateTexture(nil, "ARTWORK")
local o = sz*6/64
t:SetPoint("TOPLEFT", o, -o)
t:SetPoint("BOTTOMRIGHT", -o, o)
t:SetTexture("Interface/Icons/Temp")
t:SetTexCoord(4/64, 60/64, 4/64, 60/64)
t, f.Icon = f:CreateTexture(nil, "ARTWORK", nil, 2), t
t:SetAllPoints()
t:SetAtlas("loottoast-itemborder-orange")
t, f.RarityBorder = f:CreateFontString(nil, "OVERLAY", "GameFontHighlightOutline"), t
t:SetPoint("BOTTOMRIGHT", -4, 5)
f.Quantity = t
f:SetScript("OnClick", CommonLinkable_OnClick)
f.SetReward = RewardButton_SetReward
return f
end
function Factory.RewardBlock(parent, sz, sp)
local t, s, r = CreateFrame("Frame", nil, parent), sz+(sp or 3)
t:SetSize(s+sz, sz)
r = {Container=t, SetRewards=RewardBlock_SetRewards}
for j=1,3 do
local rew = CreateObject("RewardFrame", t, sz)
rew:SetPoint("LEFT", s*j-s, 0)
r[j] = rew
end
return r
end
function Factory.InlineRewardBlock(parent)
local f, t = CreateFrame("Frame", nil, parent)
f:EnableMouse(true)
f:SetSize(140, 28)
t = f:CreateFontString(nil, "OVERLAY", "GameFontNormal")
t:SetPoint("LEFT")
t:SetText(L"Rewards:")
f.Rewards = {Label=t}
for i=1,3 do
t = CreateObject("RewardFrame", f, 28)
t:SetPoint("LEFT", f.Rewards[i-1] or f.Rewards.Label, "RIGHT", i == 1 and 12 or 4, 0)
t.Quantity:Hide()
t.ShowQuantityFromWidgetText = "Quantity"
f.Rewards[i] = t
end
f.Rewards.SetRewards = RewardBlock_SetRewards
return f
end
function Factory.CommonHoverTooltip(frame)
frame:SetScript("OnEnter", CommonTooltip_OnEnter)
frame:SetScript("OnLeave", HideOwnGameTooltip)
return frame
end
function Factory.MissionBaseBackground(parent, expandW, expandH)
local eX, eY, t = expandW or 10, expandH or expandW or 10
t = parent:CreateTexture(nil, "BORDER")
t:SetAtlas("Garr_InfoBoxMission-BackgroundTile")
t:SetPoint("TOPLEFT", -eX, eY)
t:SetPoint("BOTTOMRIGHT", eX, -eY)
t = parent:CreateTexture(nil, "BORDER", nil, 1)
parent["BaseFrameTop"] = t
t:SetAtlas("_Garr_InfoBoxMission-Top", true)
t:SetHorizTile(true)
t:SetPoint("TOPLEFT", 1-eX, 7+eY)
t:SetPoint("TOPRIGHT", -1+eX, 7+eY)
t = parent:CreateTexture(nil, "BORDER", nil, 1)
parent["BaseFrameBottom"] = t
t:SetAtlas("_Garr_InfoBoxMission-Top", true)
t:SetHorizTile(true)
t:SetPoint("BOTTOMLEFT", -eX, -7-eY)
t:SetPoint("BOTTOMRIGHT", eX, -7-eY)
t:SetTexCoord(0.0, 1.0, 1.0, 0.0)
t = parent:CreateTexture(nil, "BORDER", nil, 1)
parent["BaseFrameLeft"] = t
t:SetAtlas("!Garr_InfoBoxMission-Left", true)
t:SetVertTile(true)
t:SetPoint("TOPLEFT", -7-eX, eY)
t:SetPoint("BOTTOMLEFT", -7-eX, -eY)
t = parent:CreateTexture(nil, "BORDER", nil, 1)
parent["BaseFrameRight"] = t
t:SetAtlas("!Garr_InfoBoxMission-Left", true)
t:SetVertTile(true)
t:SetPoint("TOPRIGHT", 7+eX, eY)
t:SetPoint("BOTTOMRIGHT", 7+eX, -eY)
t:SetTexCoord(1.0, 0.0, 0.0, 1.0)
t = parent:CreateTexture(nil, "BORDER", nil, 2)
parent["BaseFrameTopLeft"] = t
t:SetAtlas("Garr_InfoBoxMission-Corner", true)
t:SetPoint("TOPLEFT", -6-eX, 7+eY)
t = parent:CreateTexture(nil, "BORDER", nil, 2)
parent["BaseFrameTopRight"] = t
t:SetAtlas("Garr_InfoBoxMission-Corner", true)
t:SetPoint("TOPRIGHT", 6+eX, 7+eY)
t:SetTexCoord(1.0, 0.0, 0.0, 1.0)
t = parent:CreateTexture(nil, "BORDER", nil, 2)
parent["BaseFrameBottomLeft"] = t
t:SetAtlas("Garr_InfoBoxMission-Corner", true)
t:SetPoint("BOTTOMLEFT", -7-eX, -7-eY)
t:SetTexCoord(0.0, 1.0, 1.0, 0.0)
t = parent:CreateTexture(nil, "BORDER", nil, 2)
parent["BaseFrameBottomRight"] = t
t:SetAtlas("Garr_InfoBoxMission-Corner", true)
t:SetPoint("BOTTOMRIGHT", 7+eX, -7-eY)
t:SetTexCoord(1.0, 0.0, 1.0, 0.0)
t = parent:CreateTexture(nil, "BORDER", nil, 4)
t:SetAtlas("_Garr_InfoBoxBorderMission-Top", true)
t:SetHorizTile(true)
t:SetPoint("TOPLEFT", -eX,eY)
t:SetPoint("TOPRIGHT", eX,eY)
t = parent:CreateTexture(nil, "BORDER", nil, 4)
t:SetAtlas("_Garr_InfoBoxBorderMission-Top", true)
t:SetHorizTile(true)
t:SetPoint("BOTTOMLEFT", -eX,-eY)
t:SetPoint("BOTTOMRIGHT", eX,-eY)
t:SetTexCoord(0.0, 1.0, 1.0, 0.0)
t = parent:CreateTexture(nil, "BORDER", nil, 4)
t:SetAtlas("!Garr_InfoBoxBorderMission-Left", true)
t:SetVertTile(true)
t:SetPoint("TOPLEFT", -eX,eY)
t:SetPoint("BOTTOMLEFT", -eX,-eY)
t = parent:CreateTexture(nil, "BORDER", nil, 4)
t:SetAtlas("!Garr_InfoBoxBorderMission-Left", true)
t:SetVertTile(true)
t:SetPoint("TOPRIGHT", eX,eY)
t:SetPoint("BOTTOMRIGHT", eX,-eY)
t:SetTexCoord(1.0, 0.0, 0.0, 1.0)
t = parent:CreateTexture(nil, "BORDER", nil, 5)
t:SetAtlas("Garr_InfoBoxBorderMission-Corner", true)
t:SetPoint("TOPLEFT", -eX, eY)
t = parent:CreateTexture(nil, "BORDER", nil, 5)
t:SetAtlas("Garr_InfoBoxBorderMission-Corner", true)
t:SetPoint("TOPRIGHT", eX, eY)
t:SetTexCoord(1.0, 0.0, 0.0, 1.0)
t = parent:CreateTexture(nil, "BORDER", nil, 5)
t:SetAtlas("Garr_InfoBoxBorderMission-Corner", true)
t:SetPoint("BOTTOMLEFT", -eX, -eY)
t:SetTexCoord(0.0, 1.0, 1.0, 0.0)
t = parent:CreateTexture(nil, "BORDER", nil, 5)
t:SetAtlas("Garr_InfoBoxBorderMission-Corner", true)
t:SetPoint("BOTTOMRIGHT", eX, -eY)
t:SetTexCoord(1.0, 0.0, 1.0, 0.0)
end
function Factory.CountdownText(widget, textWidget)
widget.SetCountdown = CountdownText_SetCountdown
widget.CDTDisplay = textWidget or widget
end
function Factory.AchievementRewardIcon(parent)
local f, t = CreateObject("CommonHoverTooltip", CreateFrame("Button", nil, parent))
f:SetSize(30,30)
f:SetScript("OnHide", HideOwnGameTooltip)
f:SetScript("OnClick", CommonLinkable_OnClick)
t = f:CreateTexture(nil, "ARTWORK")
t:SetTexture("Interface/AchievementFrame/UI-Achievement-Progressive-Shield")
t:SetTexCoord(0, 0.75, 0, 0.75)
t:SetAllPoints()
return f
end
function Factory.ProgressBar(parent)
local f, t, r = CreateFrame("Button", nil, parent)
f:Disable()
f:SetHeight(16)
f:SetHitRectInsets(-3, -3, -6, -4)
t = f:CreateTexture(nil, "BACKGROUND")
t:SetAtlas("UI-Frame-Bar-BGLeft", true)
t:SetPoint("LEFT", -2,0)
t = f:CreateTexture(nil, "BACKGROUND")
t:SetAtlas("UI-Frame-Bar-BGRight", true)
t:SetPoint("RIGHT", 2,0)
t = f:CreateTexture(nil, "BACKGROUND")
t:SetAtlas("UI-Frame-Bar-BGCenter")
t:SetPoint("LEFT", 27,0)
t:SetPoint("RIGHT", -27,0)
t:SetHeight(18)
t = f:CreateTexture(nil, "BORDER")
t:SetAtlas("UI-Frame-Bar-BorderLeft", true)
t:SetPoint("LEFT", -8,0)
t = f:CreateTexture(nil, "BORDER")
t:SetAtlas("UI-Frame-Bar-BorderRight", true)
t:SetPoint("RIGHT", 8,0)
t = f:CreateTexture(nil, "BORDER")
t:SetAtlas("UI-Frame-Bar-BorderCenter")
t:SetPoint("LEFT", 27,0)
t:SetPoint("RIGHT", -27,0)
t:SetHeight(31)
t, r = f:CreateTexture(nil, "HIGHLIGHT"), CreateObject("ObjectGroup")
t:SetAtlas("UI-Frame-Bar-BorderLeft", true)
t:SetPoint("LEFT", -8,0)
t, r[#r+1] = f:CreateTexture(nil, "HIGHLIGHT"), t
t:SetAtlas("UI-Frame-Bar-BorderRight", true)
t:SetPoint("RIGHT", 8,0)
t, r[#r+1] = f:CreateTexture(nil, "HIGHLIGHT", nil, 2), t
t:SetAtlas("UI-Frame-Bar-BorderCenter")
t:SetPoint("LEFT", 27,0)
t:SetPoint("RIGHT", -27,0)
t:SetHeight(31)
r[#r+1], f.Highlight = t, r
r:SetBlendMode("ADD")
t = f:CreateTexture(nil, "BACKGROUND", nil, 2)
t:SetAtlas("UI-Frame-Bar-Fill-Red")
t:SetPoint("TOPLEFT")
t:SetPoint("BOTTOMLEFT")
t:SetWidth(50)
f:SetText(" ")
t, f.Fill = f:GetFontString(), t
t:SetFontObject(GameFontHighlight)
f:SetPushedTextOffset(-1, -1)
t:SetPoint("TOPLEFT", 4, 0)
t:SetPoint("BOTTOMRIGHT", -4, 1)
t:SetJustifyV("MIDDLE")
f.Text = t
f.SetProgress = Progress_SetProgress
f.SetProgressCountdown = Progress_SetTimer
return f
end
function Factory.TooltipProgressBar()
local f, t = CreateFrame("Frame")
f:SetSize(180, 30)
f:Hide()
t = CreateObject("ProgressBar", f)
t:SetPoint("LEFT", 8, 0)
t:SetPoint("RIGHT", -8, 0)
t:SetClipsChildren(true)
t.Fill:SetAtlas("UI-Frame-Bar-Fill-Blue")
t, f.Bar = t:CreateTexture(nil, "BACKGROUND", nil, 2), t
t:SetAtlas("UI-Frame-Bar-Fill-Yellow")
t:SetPoint("TOPLEFT", f.Bar.Fill, "TOPRIGHT")
t:SetPoint("BOTTOMLEFT", f.Bar.Fill, "BOTTOMRIGHT")
t:SetWidth(50)
f.Activate, f.Fill2 = TooltipProgressBar_Activate, t
f:SetScript("OnHide", TooltipProgressBar_OnHide)
f:SetScript("OnUpdate", TooltipProgressBar_Update)
return f
end
function Factory.ControlContainerBorder(parent, expandX, expandY)
expandX, expandY = expandX or 0, expandY or 0
local t, is, ts = parent:CreateTexture(nil, "BACKGROUND"), 18, 1/16
t:SetAtlas("adventures_mission_materialframe")
t:SetTexCoord(0, ts, 0, 1)
t:SetPoint("TOPLEFT", -expandX, expandY)
t:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", is-expandX, -expandY)
t = parent:CreateTexture(nil, "BACKGROUND")
t:SetTexCoord(ts, 1-ts, 0, 1)
t:SetAtlas("adventures_mission_materialframe")
t:SetPoint("TOPLEFT", is-expandX, expandY)
t:SetPoint("BOTTOMRIGHT", -is+expandX, -expandY)
t = parent:CreateTexture(nil, "BACKGROUND")
t:SetTexCoord(1-ts, 1, 0, 1)
t:SetAtlas("adventures_mission_materialframe")
t:SetPoint("TOPRIGHT", expandX, expandY)
t:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", -is+expandX, -expandY)
end
function Factory.ILButton(parent)
local f = CreateObject("CommonHoverTooltip", CreateFrame("Button", nil, parent))
f:SetSize(60, 23)
f.tooltipAnchor, f.tooltipYO = "ANCHOR_BOTTOM", -6
local t = f:CreateTexture()
t:SetSize(18, 18)
t:SetTexture("Interface/Icons/Temp")
t:SetTexCoord(4/64,60/64, 4/64,60/64)
t:SetPoint("LEFT", 1, 0)
t, f.Icon = f:CreateFontString(nil, "OVERLAY", "GameFontHighlightMed2"), t
t:SetPoint("LEFT", 25, 0)
f.SetText, f.Text = ResizedButton_SetText, t
f:SetText("00")
CreateObject("ControlContainerBorder", f, 15, 9)
return f
end
function Factory.ResourceButton(parent, currencyID)
local f = CreateObject("ILButton", parent)
f.currencyID = currencyID
f:RegisterEvent("CURRENCY_DISPLAY_UPDATE")
f:SetScript("OnEvent", ResourceButton_Update)
f:SetScript("OnClick", ResourceButton_OnClick)
local ci = C_CurrencyInfo.GetCurrencyInfo(currencyID)
f.Icon:SetTexture(ci and ci.iconFileID or "Interface/Icons/Temp")
ResourceButton_Update(f, nil, currencyID)
return f
end
function Factory.FollowerListButton(parent, isTroop)
local f,t = CreateFrame("Button", nil, parent)
local s = CreateObject("Shadow", f)
local f2 = CreateFrame("Frame", nil, f)
local ett = {}
f2:SetAllPoints()
f:RegisterForClicks("LeftButtonUp", "RightButtonUp")
f:RegisterForDrag("LeftButton")
f:SetMotionScriptsWhileDisabled(true)
f:SetHitRectInsets(-3,4,0,5)
f:SetScript("OnDragStart", FollowerButton_OnDragStart)
f:SetScript("OnDragStop", FollowerButton_OnDragStop)
f:SetScript("OnClick", FollowerButton_OnClick)
f:SetScript("OnEnter", FollowerButton_OnEnter)
f:SetScript("OnLeave", HideOwnGameTooltip)
f:SetSize(70, 70)
t = f:CreateTexture(nil, "BORDER")
t:SetAtlas(isTroop and "adventurers-followers-frame-troops" or "adventurers-followers-frame")
t:SetSize(60, 60)
t:SetPoint("CENTER", 0, 5)
t, s.PortraitR = f:CreateTexture(nil, "BORDER", nil, 2), t
t:SetAtlas("adventurers-followers-xp")
t:SetVertexColor(1, 0.35, 0)
t:SetSize(50, 51)
t:SetPoint("CENTER", 0, 5)
t, s.PortraitT = f:CreateTexture(nil, "BACKGROUND", nil, 1), t
t:SetSize(46, 46)
t:SetPoint("CENTER", 0, 5)
t:SetTexture(1605024)
t:SetDesaturated(true)
t:SetBlendMode("ADD")
t:SetAlpha(0.5)
t, s.Portrait2 = f:CreateTexture(nil, "BACKGROUND"), t
t:SetSize(46, 46)
t:SetPoint("CENTER", 0, 5)
t:SetTexture(1605024)
t, s.Portrait = f2:CreateTexture(nil, "ARTWORK", nil, -1), t
t:SetColorTexture(1,1,1)
t:SetGradient("VERTICAL", 0.15,0.15,0.15, 0.2,0.2, 0.2)
t:SetSize(39, 12)
t:SetPoint("BOTTOMRIGHT", -9, 10)
t, s.HealthBG = f2:CreateTexture(nil, "ARTWORK"), t
t:SetColorTexture(1,1,1)
t:SetGradient("VERTICAL", 0.10,0.25,0.10, 0.05,0.5,0.05)
t:SetAlpha(0.85)
t:SetSize(24, s.HealthBG:GetHeight())
t:SetPoint("BOTTOMLEFT", s.HealthBG, "BOTTOMLEFT")
t, s.Health = f2:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall"), t
t:SetPoint("BOTTOMLEFT", f, "BOTTOM", -6, 11)
t, s.TextLabel = f2:CreateTexture(nil, "ARTWORK", nil, 4), t
t:SetSize(14,16)
t:SetAtlas("bags-greenarrow")
t:SetPoint("BOTTOMRIGHT", -8, 7.5)
t:Hide()
s.Blip = t
t = f2:CreateTexture(nil, "ARTWORK", nil, 4)
t:SetAtlas("adventure-healthbar")
t:SetPoint("BOTTOMRIGHT", -5, -5)
t:SetTexCoord(30/89, 1, 0, 1)
t:SetSize(48, 36)
s.HealthFrameR = t
t = f2:CreateTexture(nil, "ARTWORK", nil, 5)
t:SetAtlas("adventures-tank")
t:SetSize(20.53,22)
t:SetPoint("BOTTOMLEFT", 4, 5)
s.Role = t
t = f2:CreateTexture(nil, "ARTWORK", nil, 6)
t:SetAtlas("adventure_ability_frame")
t:SetSize(26.72, 26)
t:SetPoint("CENTER", s.Role, "CENTER", 0, -2)
t, s.RoleB, ett[#ett+1] = f2:CreateTexture(nil, "ARTWORK", nil, 6), t, t
t:SetPoint("TOPRIGHT", 0, 2)
t:SetSize(24,25)
t:SetAtlas("collections-icon-favorites")
s.Favorite, s.Abilities, s.AbilitiesB = t, {}, {}
for i=1,2 do
t = f2:CreateTexture(nil, "ARTWORK", nil, 3)
t:SetAtlas("adventure_ability_frame")
t:SetSize(26.72, 26)
t:SetPoint("CENTER", s.Portrait, "CENTER", cos(232-i*42)*30, sin(232-i*42)*30)
t, ett[#ett+1], s.AbilitiesB[i] = f2:CreateTexture(nil, "ARTWORK", nil, 2), t, t
t:SetSize(17, 17)
t:SetPoint("CENTER", s.AbilitiesB[i], "CENTER", 0, 1)
t:SetTexture("Interface/Icons/Temp")
t:SetMask("Interface/Masks/CircleMaskScalable")
s.Abilities[i] = t
end
ett[#ett+1] = s.HealthFrameR
t = f:CreateTexture(nil, "HIGHLIGHT")
t:SetTexture("Interface/Common/CommonRoundHighlight")
t:SetTexCoord(0,58/64,0,58/64)
t:SetPoint("TOPLEFT", s.Portrait, "TOPLEFT", -1, 1)
t:SetPoint("BOTTOMRIGHT", s.Portrait, "BOTTOMRIGHT", 1,-1)
s.Hi = t
if not isTroop then
t = f:CreateTexture(nil, "BORDER", nil, -1)
t:SetAtlas("adventures-buff-heal-ring")
local divC = CovenKit == "Kyrian" and 0x78c7ff or CovenKit == "Venthyr" and 0xcf1500 or CovenKit == "Necrolord" and 0x76c900 or 0x0058e6
t:SetVertexColor(divC / 2^24, divC/256 % 256 / 255, divC%256/255)
t:SetPoint("TOPLEFT", s.PortraitR, "TOPLEFT", -6, 6)
t:SetPoint("BOTTOMRIGHT", s.PortraitR, "BOTTOMRIGHT", 6, -6)
s.EC = t
end
s.ExtraTex = CreateObject("ObjectGroup", ett)
f.GetInfo = FollowerButton_GetInfo
f.GetFollowerGUID = FollowerButton_GetFollowerGUID
return f
end
function Factory.FollowerList(parent)
local f,t = CreateFrame("Frame", nil, parent)
local s = CreateObject("Shadow", f)
f:SetSize(320, 370)
t = f:CreateTexture(nil, "BACKGROUND")
t:SetAllPoints()
t:SetAtlas("adventures-followers-bg")
t = f:CreateTexture(nil, "BORDER")
t:SetPoint("TOPLEFT")
t:SetSize(320, 84)
t:SetAtlas("adventures-followers-frame")
t:SetTexCoord(0,1, 0, 50/311)
t = f:CreateTexture(nil, "BORDER")
t:SetPoint("BOTTOMLEFT")
t:SetSize(320, 84)
t:SetAtlas("adventures-followers-frame")
t:SetTexCoord(0,1, 261/311,1)
t = f:CreateTexture(nil, "BORDER")
t:SetAtlas("adventures-followers-frame")
t:SetPoint("TOPLEFT", 0, -84)
t:SetPoint("BOTTOMRIGHT", 0, 84)
t:SetTexCoord(0,1,50/311,261/311)
t = f:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
t:SetText(FOLLOWERLIST_LABEL_TROOPS)
t:SetPoint("TOPLEFT", 12, -14)
s.troops = {}
for i=1,2 do
s.troops[i] = CreateObject("FollowerListButton", f, true)
s.troops[i]:SetPoint("TOPLEFT", (i-1)*76+14, -35)
end
t = CreateObject("CommonHoverTooltip", CreateObject("InfoButton", f))
t:SetPoint("TOPRIGHT", -12, -12)
t.tooltipHeader = FOLLOWERLIST_LABEL_TROOPS
t.tooltipText = COVENANT_MISSIONS_TUTORIAL_TROOPS
s.TroopInfo = t
t = f:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
t:SetText(COVENANT_MISSION_FOLLOWER_CATEGORY)
t:SetPoint("TOPLEFT", 12, -110)
s.companions = {}
for i=1,20 do
t = CreateObject("FollowerListButton", f, false)
t:SetPoint("TOPLEFT", ((i-1)%4)*76+14, -math.floor((i-1)/4)*72-130)
s.companions[i] = t
end
f:SetPoint("LEFT", UIParent, "LEFT", 20, 0)
f.Refresh = FollowerList_Refresh
f.SyncToBoard = FollowerList_SyncToBoard
f.SyncXPGain = FollowerList_SyncXPGain
f:SetScript("OnUpdate", FollowerList_OnUpdate)
f:SetScript("OnShow", FollowerList_Refresh)
f:Hide()
return f
end
function Factory.InfoButton(parent)
local f = CreateFrame("Button", nil, parent)
f:SetSize(20, 20)
f:SetNormalTexture("Interface/Common/Help-i")
f:GetNormalTexture():SetTexCoord(0.2, 0.8, 0.2, 0.8)
f:SetHighlightTexture("Interface/Common/Help-i")
f:GetHighlightTexture():SetTexCoord(0.2, 0.8, 0.2, 0.8)
f:GetHighlightTexture():SetBlendMode("ADD")
f:GetHighlightTexture():SetAlpha(0.25)
return f
end
function Factory.TexSlice(parent, layer,subLevel, tex,tW,tH, x0,x1,x2,x3, y0,y1,y2,y3, xS,yS, oT,oR,oB,oL, mL)
local r, ni, t = CreateObject("ObjectGroup"), 1
for i=1,yS == 0 and 3 or 9 do
r[i] = parent:CreateTexture(nil, layer, nil, subLevel)
end
r:SetTexture(tex)
x0,x1,x2,x3=x0/tW,x1/tW,x2/tW,x3/tW
y0,y1,y2,y3=y0/tH,y1/tH,y2/tH,y3/tH
if yS > 0 then
t, ni = r[ni], ni + 1
t:SetTexCoord(mL and x3 or x0, mL and x2 or x1, y0, y1)
t:SetPoint("TOPLEFT", -oL, oT)
t:SetSize(xS, yS)
t, ni = r[ni], ni + 1
t:SetTexCoord(x1, x2, y0, y1)
t:SetPoint("TOPLEFT", xS-oL, oT)
t:SetPoint("BOTTOMRIGHT", parent, "TOPRIGHT", oR-xS, oT-yS)
t, ni = r[ni], ni + 1
t:SetTexCoord(x2, x3, y0, y1)
t:SetPoint("TOPRIGHT", oR, oT)
t:SetSize(xS, yS)
end
t, ni = r[ni], ni + 1
t:SetTexCoord(mL and x3 or x0, mL and x2 or x1, y1, y2)
t:SetPoint("TOPLEFT", -oL, oT-yS)
t:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", xS-oL, yS-oB)
t, ni = r[ni], ni + 1
t:SetTexCoord(x1, x2, y1, y2)
t:SetPoint("TOPLEFT", xS-oL, oT-yS)
t:SetPoint("BOTTOMRIGHT", -xS+oR, yS-oB)
t, ni = r[ni], ni + 1
t:SetTexCoord(x2, x3, y1, y2)
t:SetPoint("TOPLEFT", parent, "TOPRIGHT", oR-xS, oT-yS)
t:SetPoint("BOTTOMRIGHT", oR, yS-oB)
if yS > 0 then
t, ni = r[ni], ni + 1
t:SetTexCoord(mL and x3 or x0, mL and x2 or x1, y2, y3)
t:SetPoint("BOTTOMLEFT", -oL, -oB)
t:SetSize(xS, yS)
t, ni = r[ni], ni + 1
t:SetTexCoord(x1, x2, y2, y3)
t:SetPoint("BOTTOMLEFT", -oL+xS, -oB)
t:SetPoint("TOPRIGHT", parent, "BOTTOMRIGHT", oR-xS, yS-oB)
t, ni = r[ni], ni + 1
t:SetTexCoord(x2, x3, y2, y3)
t:SetPoint("BOTTOMRIGHT", oR, -oB)
t:SetSize(xS, yS)
end
return r
end
function Factory.MissionToast(parent)
local f, t = CreateFrame("Button", nil, parent)
local sf = CreateObject("Shadow", f)
f:SetSize(295, 40)
f:SetFrameStrata("FULLSCREEN")
f:SetHitRectInsets(-6, -6, -6, -6)
f:RegisterForClicks("RightButtonUp")
f:SetScript("OnUpdate", Toast_Animate)
f:SetScript("OnClick", Toast_OnClick)
f.Background = CreateObject("TexSlice", f, "BACKGROUND", 0, "Interface/LootFrame/LootToast",1024,256, 578,638,763,823, 0,3,69,0, 45,0, 5,0,5,0, true)
t = f:CreateTexture(nil, "ARTWORK")
t:SetAtlas("loottoast-sheen")
t:SetBlendMode("ADD")
t:SetSize(90, 38) -- 171,75
t:SetPoint("LEFT", 20, -1)
t, f.Sheen = f:CreateTexture(nil, "OVERLAY", nil, -2), t
t:SetTexture("Interface/AchievementFrame/UI-Achievement-Alert-Glow")
t:SetTexCoord(5/512, 395/512, 5/256, 167/256)
t:SetPoint("BOTTOMLEFT", -35, -30)
t:SetPoint("TOPRIGHT", 35, 30)
t:SetBlendMode("ADD")
t, f.PreGlow = CreateObject("RewardBlock", f, 32, 2), t
t.Container:SetPoint("LEFT", 10, -1)
for i=1,3 do
local ti = t[i]
ti.tooltipAnchor, ti.tooltipXO, ti.tooltipFXO = "ANCHOR_TRUE_LEFT", -34*i+28, 285-34*i
ti.tooltipPostShow = MissionToast_CheckTooltip
ti.isRetrospective, ti.ShowQuantityFromWidgetText = true, "Quantity"
ti.Quantity:Hide()
end
t, sf.Rewards = f:CreateFontString(nil, "ARTWORK", "GameFontNormal"), t
t:SetPoint("TOPLEFT", sf.Rewards.Container, "TOPRIGHT", 2, -2.25)
t:SetPoint("TOPRIGHT", -10, -7)
t:SetHeight(12)
t:SetText("|cffff8000Legendary Mission")
t, f.Header = f:CreateFontString(nil, "ARTWORK", "GameFontHighlight"), t
t:SetPoint("BOTTOMLEFT", sf.Rewards.Container, "BOTTOMRIGHT", 2, 2.25)
t:SetPoint("BOTTOMRIGHT", -10, 7)
t:SetHeight(12)
t:SetText("Legendary Goat Rescue")
t, f.Detail = f:CreateTexture(nil, "ARTWORK", nil, 0), t
t:SetSize(28, 28)
t:SetPoint("LEFT", 12, -1)
t:SetTexture(1605024)
t, f.Portrait = f:CreateTexture(nil, "ARTWORK", nil, 1), t
t:SetSize(34,34)
t:SetAtlas("adventurers-followers-frame")
t:SetPoint("CENTER", f.Portrait, "CENTER")
f.PortraitFrame = t
f:Hide()
return f
end
function Factory.IconButton(parent, sz, tex)
local mb = CreateFrame("Button", nil, parent)
mb:SetSize(sz, sz)
mb:SetNormalTexture(tex or "Interface/Icons/Temp")
mb:SetHighlightTexture("Interface/Buttons/ButtonHilight-Square")
mb:GetHighlightTexture():SetBlendMode("ADD")
mb:SetPushedTexture("Interface/Buttons/UI-Quickslot-Depress")
mb:GetPushedTexture():SetDrawLayer("OVERLAY")
local t = mb:CreateTexture(nil, "ARTWORK")
t:SetAllPoints()
t:SetTexture(tex or "Interface/Icons/Temp")
mb.Icon = t
return mb
end
function Factory.SharedTooltipProgressBar()
tooltipSharedPB = tooltipSharedPB or CreateObject("TooltipProgressBar")
return tooltipSharedPB
end
function Factory.Shadow(t)
if t ~= nil then
local s = S[t] or {}
S[t], S[s] = s, t
return s
end
end