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.

164 lines
5.6 KiB

local _, addonTable = ...
local CONSTANTS = addonTable.constants
-- WOW API
local GetItemInfo = _G.C_Item.GetItemInfo
local TextureKitConstants = _G.TextureKitConstants
local GetAchievementInfo = _G.GetAchievementInfo
-- Rarity API
local R = Rarity
local L = LibStub("AceLocale-3.0"):GetLocale("Rarity")
-- Fake achievement popup stuff
local function RarityAchievementAlertFrame_SetUp(frame, itemId, attempts)
local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemTexture, itemSellPrice =
GetItemInfo(itemId)
if itemName == nil then
return
end
if itemTexture == nil then
itemTexture = [[Interface\Icons\INV_Misc_PheonixPet_01]]
end
-- The following code is adapted from Blizzard's AchievementAlertFrame_SetUp function found in FrameXML\AlertFrameSystems.lua [introduced in 7.0]
local displayName = frame.Name
local shieldPoints = frame.Shield.Points
local shieldIcon = frame.Shield.Icon
local unlocked = frame.Unlocked
local oldCheevo = frame.OldAchievement
displayName:SetText(itemName)
AchievementShield_SetPoints(0, shieldPoints, GameFontNormal, GameFontNormalSmall)
if frame.guildDisplay or frame.oldCheevo then
frame.oldCheevo = nil
shieldPoints:Show()
shieldIcon:Show()
oldCheevo:Hide()
frame.guildDisplay = nil
frame:SetHeight(88)
frame:SetHeight(104)
local background = frame.Background
background:SetTexture("Interface\\AchievementFrame\\UI-Achievement-Alert-Background")
background:SetTexCoord(0, 0.605, 0, 0.703)
background:SetPoint("TOPLEFT", 0, 0)
background:SetPoint("BOTTOMRIGHT", 0, 0)
local iconBorder = frame.Icon.Overlay
iconBorder:SetAtlas("ui-achievement-guild-iconframe", TextureKitConstants.UseAtlasSize)
iconBorder:SetPoint("CENTER", -1, 2)
frame.Icon:SetPoint("TOPLEFT", -26, 16)
displayName:SetPoint("BOTTOMLEFT", 72, 36)
displayName:SetPoint("BOTTOMRIGHT", -60, 36)
frame.Shield:SetPoint("TOPRIGHT", -10, -13)
shieldPoints:SetPoint("CENTER", 7, 2)
shieldPoints:SetVertexColor(1, 1, 1)
shieldIcon:SetTexCoord(0, 0.5, 0, 0.45)
unlocked:SetPoint("TOP", 7, -23)
frame.GuildName:Hide()
frame.GuildBorder:Hide()
frame.GuildBanner:Hide()
frame.glow:SetAtlas("ui-achievement-guild-glow", TextureKitConstants.UseAtlasSize)
frame.shine:SetAtlas("ui-achievement-guild-shine", TextureKitConstants.UseAtlasSize)
frame.shine:SetPoint("BOTTOMLEFT", 0, 8)
end
shieldIcon:SetAtlas("UI-Achievement-Shield-NoPoints", TextureKitConstants.UseAtlasSize)
frame.Icon.Texture:SetTexture(itemTexture)
frame:EnableMouse(false) -- Make achievement toast unclickable
if attempts == nil or attempts <= 0 then
attempts = 1
end
-- It's a quick 'n' dirty fix, but that's probably the least of our worries here...
local item = Rarity.db.profile.groups.mounts[itemName]
or Rarity.db.profile.groups.pets[itemName]
or Rarity.db.profile.groups.items[itemName]
or Rarity.db.profile.groups.user[itemName]
if item and item.method and item.method == CONSTANTS.DETECTION_METHODS.COLLECTION then
unlocked:SetText(L["Collection Complete"])
else
if attempts == 1 then
unlocked:SetText(L["Obtained On Your First Attempt"])
else
unlocked:SetText(format(L["Obtained After %d Attempts"], attempts))
end
end
Rarity:ScheduleTimer(
function()
-- Put the achievement frame back to normal when we're done
unlocked:SetText(ACHIEVEMENT_UNLOCKED)
frame:EnableMouse(true)
end,
10000 -- Give it enough time to fade out properly
)
frame.id = itemId
return true
end
local RarityAchievementAlertSystem =
AlertFrame:AddQueuedAlertFrameSubSystem("AchievementAlertFrameTemplate", RarityAchievementAlertFrame_SetUp, 2, 6)
RarityAchievementAlertSystem:SetCanShowMoreConditionFunc(function()
return not C_PetBattles.IsInBattle()
end)
local Output = Rarity.Output
-- test with: /run Rarity:ShowFoundAlert(32458, 5)
function R:ShowFoundAlert(itemId, attempts, item)
local trackedItem = Rarity.Tracking:GetTrackedItem()
if item == nil then
item = trackedItem
end
local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemTexture, itemSellPrice =
GetItemInfo(itemId)
if itemName == nil then
return
end -- Server doesn't know this item, we can't award it
if itemTexture == nil then
itemTexture = [[Interface\Icons\INV_Misc_PheonixPet_01]]
end
-- Output to the sink
if self.db.profile.enableAnnouncements ~= false and item.announce ~= false then
local s
if item.method == CONSTANTS.DETECTION_METHODS.COLLECTION then
s = format(L["%s: collection completed!"], itemName)
else
if attempts <= 1 then
s = format(L["%s: Found on the first attempt!"], itemName)
else
s = format(L["%s: Found after %d attempts!"], itemName, attempts)
end
end
Output:DisplayText(s, itemTexture)
end
-- The following code is adapted from Blizzard's AlertFrameMixin:OnEvent function found in FrameXML\AlertFrames.lua [heavily updated in 7.0]
-- Presumably, this is now outdated (as of 9.0) so maybe copy/pasting it wasn't the best idea? :P
if not AchievementFrame then
AchievementFrame_LoadUI()
end
-- If option to generate achievement toast on item found is enabled, then generate the toast.
if Rarity.db.profile.showAchievementToast then
RarityAchievementAlertSystem:AddAlert(itemId, attempts)
PlaySound(12891) -- UI_Alert_AchievementGained
end
self:ScheduleTimer(function()
-- Take a screenshot
if Rarity.db.profile.takeScreenshot then
if ActionStatus:IsShown() then
ActionStatus:Hide()
end
Screenshot()
end
end, 2)
end