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.

214 lines
6.1 KiB

local _, addonTable = ...
--- GUI.lua
-- A random assortment of UI functionality... still needs to be cleaned up further (later)
local GUI = {}
-- Locals
local scanTip = CreateFrame("GameTooltip", "__Rarity_ScanTip", nil, "GameTooltipTemplate")
scanTip:SetOwner(WorldFrame, "ANCHOR_NONE")
GUI.scanTip = scanTip
Rarity.tooltipOpenDelay = false
-- Externals
local L = LibStub("AceLocale-3.0"):GetLocale("Rarity")
local lbb = LibStub("LibBabble-Boss-3.0"):GetUnstrictLookupTable()
-- Upvalues
local R = Rarity
local UIParent = UIParent
local CONSTANTS = addonTable.constants
-- LUA APIs
local format = format
local Round = Round
local debugprofilestop = debugprofilestop
local date = date
local time = time
-- WOW APIs
local GetItemInfo = C_Item.GetItemInfo
local IsShiftKeyDown = IsShiftKeyDown
local IsControlKeyDown = IsControlKeyDown
local LoadAddOn = C_AddOns.LoadAddOn
local UnitClass = UnitClass
local GetMapInfo = C_Map.GetMapInfo
local GetTime = GetTime
local IsQuestFlaggedCompleted = _G.C_QuestLog.IsQuestFlaggedCompleted
local InCombatLockdown = InCombatLockdown
local UnitCreatureType = UnitCreatureType
local UnitGUID = UnitGUID
local UnitCanAttack = UnitCanAttack
local UnitIsPlayer = UnitIsPlayer
local UnitIsPVP = UnitIsPVP
local GetAchievementLink = GetAchievementLink
local GetRealZoneText = GetRealZoneText
local GetSubZoneText = GetSubZoneText
local GetContainerItemID = C_Container.GetContainerItemID
local RequestRaidInfo = RequestRaidInfo
local RequestLFDPlayerLockInfo = RequestLFDPlayerLockInfo
-- Addon APIs
local FormatTime = Rarity.Utils.PrettyPrint.FormatTime
local sort = Rarity.Utils.Sorting.sort
local sort_difficulty = Rarity.Utils.Sorting.sort_difficulty
local sort_category = Rarity.Utils.Sorting.sort_category
local sort_zone = Rarity.Utils.Sorting.sort_zone
local sort_progress = Rarity.Utils.Sorting.sort_progress
local GetDate = Rarity.Utils.Time.GetDate
local AuctionDB = Rarity.AuctionDB
--[[
GAME TOOLTIPS ------------------------------------------------------------------------------------------------------------
]]
-- TOOLTIP: NPCS
local Announcements = Rarity.Announcements
function R:OutputAttempts(item, isForcedUpdate)
-- TODO: Check if item entry is valid (reuse DB helper), just to be safe
if type(item) ~= "table" then
self:Error("Usage: OutputAttempts(item[, isForcedUpdate]")
return
end
if not item.itemId or not item.name or item.attempts == nil then
self:Debug("Failed to OutputAttempts (item entry has invalid format")
return
end
self:Debug("New attempt found for %s", item.name)
if item.enabled == false then
self:Debug("Skipped OutputAttempts (item is disabled)")
return
end
if item.found and not item.repeatable then
self:Debug("Skipped OutputAttempts (non-repeatable item was already found)")
return
end
local isHordePlayer = R.Caching:IsHorde()
if (item.requiresHorde and not isHordePlayer) or (item.requiresAlliance and isHordePlayer) then
self:Debug("Ignoring attempt for this item (faction does not match)")
return
end
if not isForcedUpdate then
self:AddDailyAttempt(item)
self:AddSessionAttempt(item)
self:UpdateSessionAttempts(item)
end
-- Update LDB text
Rarity.GUI:UpdateText()
-- Switch to track this item
Rarity.Tracking:Update(item)
-- Save what we last tracked and when it happened
Rarity.Tracking:SetLastAttemptTime(GetTime())
Rarity.Tracking:SetLastAttemptItem(item)
-- If this item supports lockout detection, request updated instance info from the server now and in 10 seconds
self:ProcessLockoutDetection(item)
-- Save this item for coin tracking, but only for 90 seconds
self:StartBonusRollTrackingTimer(item)
-- Don't go any further if we don't want to announce this
if self.db.profile.enableAnnouncements == false then
return
end
if item.announce == false then
return
end
if self.db.profile.onlyAnnounceFound == true then
return
end
-- Output the attempt count
Announcements:AnnounceAttemptForItem(item)
end
-- Increment attempt counter for today
function Rarity:AddDailyAttempt(item)
local dt = GetDate()
if not item.dates then
item.dates = {}
end
if not item.dates[dt] then
item.dates[dt] = {}
end
if not item.dates[dt].attempts then
item.dates[dt].attempts = 0
end
item.dates[dt].attempts = item.dates[dt].attempts + 1
end
function Rarity:AddSessionAttempt(item)
if not item.session then
item.session = {}
end
if not item.session.attempts then
item.session.attempts = 0
end
item.session.attempts = item.session.attempts + 1
end
-- Handle time tracking (No idea what this does TBH)
function Rarity:UpdateSessionAttempts(item)
local lastAttemptItem = Rarity.Tracking:GetLastAttemptItem()
-- TODO: Clean this up once I know what it's actually used for
local DUAL_TRACK_THRESHOLD = Rarity.Tracking.DUAL_TRACK_THRESHOLD
local trackedItem = Rarity.Tracking:GetTrackedItem()
local trackedItem2 = Rarity.Tracking:GetTrackedItem(2)
if
lastAttemptItem
and lastAttemptItem ~= item
and GetTime() - (Rarity.Tracking:GetLastAttemptTime() or 0) <= DUAL_TRACK_THRESHOLD
then -- Beginning to track two things at once
Rarity.Session:Update()
else
if trackedItem == item or trackedItem2 == item then
Rarity.Session:Update()
else
Rarity.Session:End()
Rarity.Session:Start()
end
end
end
function Rarity:ProcessLockoutDetection(item)
if item.lockBossName or item.lockDungeonId then
RequestRaidInfo()
RequestLFDPlayerLockInfo()
self:ScheduleTimer(function()
RequestRaidInfo()
RequestLFDPlayerLockInfo()
end, 10)
self:ScheduleTimer(function()
Rarity:ScanInstanceLocks("ATTEMPT DETECTED")
end, 5)
end
end
function Rarity:StartBonusRollTrackingTimer(item)
if item.enableCoin then
self:Debug("Allowing this item to be counted again if a coin is used in the next 90 seconds")
self.lastCoinItem = item
self:ScheduleTimer(function()
self.lastCoinItem = nil
end, 90)
else
self.lastCoinItem = nil
end
end
Rarity.GUI = GUI
return GUI