Files
Questie-X/Modules/QuestieCompat.lua
T

208 lines
9.7 KiB
Lua

---@diagnostic disable: undefined-global, return-type-mismatch, undefined-field
---@class QuestieCompat
QuestieCompat = setmetatable({}, {__index = _G})
-- addon is running on 3.3.5 WotLK client
QuestieCompat.Is335 = (select(4, GetBuildInfo()) == 30300)
local errorMsg = "Questie tried to call a blizzard API function that does not exist..."
------------------------------------------
-- Older client compatibility (pre 1.14.1)
------------------------------------------
-- Add missing Seasons object, if not available (e.g. 1.14.0 and below is missing it)
if not C_Seasons then
C_Seasons = {
---[C_Seasons.HasActiveSeason Documentation](https://wowpedia.fandom.com/wiki/API_C_Seasons.HasActiveSeason)
---Returns true if the player is on a seasonal realm.
HasActiveSeason = function()
return false
end,
---[C_Seasons.GetActiveSeason Documentation](https://wowpedia.fandom.com/wiki/API_C_Seasons.GetActiveSeason)
---Returns the ID of the season that is active on the current realm.
GetActiveSeason = function()
return 0
end
}
end
-- Specific subclass of this mixin was added in a minor version and is missing in earlier patches, functionality this makes next to no visual difference
if not TooltipBackdropTemplateMixin then
TooltipBackdropTemplateMixin = BackdropTemplateMixin
end
-------------------------------------------
-- API difference compatibility (Era/Wotlk)
-------------------------------------------
---[SetMinResize Documentation](https://wowpedia.fandom.com/wiki/API_Frame_SetMinResize)
---[SetMaxResize Documentation](https://wowpedia.fandom.com/wiki/API_Frame_SetMaxResize)
---[SetResizeBounds Documentation](https://wowpedia.fandom.com/wiki/API_Frame_SetMinResize)
---Specifies the minimum [and maximum] width and height that the object can be resized to.
---@param frame frame
---@param minWidth number The minimum width the object can be resized to.
---@param minHeight number The minimum height the object can be resized to.
---@param maxWidth number The maximum width the object can be resized to.
---@param maxHeight number The maximum height the object can be resized to.
function QuestieCompat.SetResizeBounds(frame, minWidth, minHeight, maxWidth, maxHeight)
if frame.SetResizeBounds then
frame:SetResizeBounds(minWidth, minHeight, maxWidth, maxHeight)
return
else
if frame.SetMinResize and frame.SetMaxResize then
if minWidth and minWidth ~= 0 then
frame:SetMinResize(minWidth, minHeight)
end
if maxWidth and maxWidth ~= 0 then
frame:SetMaxResize(maxWidth, maxHeight)
end
return
end
end
error(errorMsg, 2)
end
---[Documentation](https://wowpedia.fandom.com/wiki/API_C_GossipInfo.GetAvailableQuests)
---Returns the available quests at a quest giver.
---@return GossipQuestUIInfo[] info
function QuestieCompat.GetAvailableQuests()
if C_GossipInfo and C_GossipInfo.GetAvailableQuests then
local info = C_GossipInfo.GetAvailableQuests()
local availableQuests = {}
local index = 1
for _, availableQuest in pairs(info) do
availableQuests[index] = availableQuest.title
availableQuests[index + 1] = availableQuest.questLevel
availableQuests[index + 2] = availableQuest.isTrivial
availableQuests[index + 3] = availableQuest.frequency
availableQuests[index + 4] = availableQuest.repeatable
availableQuests[index + 5] = availableQuest.isLegendary
availableQuests[index + 6] = availableQuest.isIgnored
index = index + 7
end
return unpack(availableQuests)
elseif GetGossipAvailableQuests then
return GetGossipAvailableQuests() -- https://wowpedia.fandom.com/wiki/API_GetGossipAvailableQuests
end
error(errorMsg, 2)
end
---[Documentation](https://wowpedia.fandom.com/wiki/API_C_GossipInfo.GetActiveQuests)
---Returns the quests which can be turned in at a quest giver.
---@return GossipQuestUIInfo[] info
function QuestieCompat.GetActiveQuests()
if C_GossipInfo and C_GossipInfo.GetActiveQuests then
-- QuestieDB needs to be loaded locally, otherwise it will be an empty module
local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
local info = C_GossipInfo.GetActiveQuests()
local activeQuests = {}
local index = 1
for _, activeQuest in pairs(info) do
activeQuests[index] = activeQuest.title
activeQuests[index + 1] = activeQuest.questLevel
activeQuests[index + 2] = activeQuest.isTrivial
activeQuests[index + 3] = activeQuest.isComplete or QuestieDB.IsComplete(activeQuest.questID) == 1
activeQuests[index + 4] = activeQuest.isLegendary
activeQuests[index + 5] = activeQuest.isIgnored
index = index + 6
end
return unpack(activeQuests)
elseif GetGossipActiveQuests then
return GetGossipActiveQuests() -- https://wowpedia.fandom.com/wiki/API_GetGossipActiveQuests
end
error(errorMsg, 2)
end
---[Documentation](https://wowpedia.fandom.com/wiki/API_C_GossipInfo.SelectAvailableQuest)
---Selects an available quest from the gossip window.
---@param index number Index of the quest to select (I think questId might work here too...)
function QuestieCompat.SelectAvailableQuest(index)
if C_GossipInfo and C_GossipInfo.SelectAvailableQuest then
local questId = C_GossipInfo.GetAvailableQuests()[index].questID
return C_GossipInfo.SelectAvailableQuest(questId)
elseif SelectGossipAvailableQuest then
return SelectGossipAvailableQuest(index)
end
error(errorMsg, 2)
end
---[Documentation](https://wowpedia.fandom.com/wiki/API_C_GossipInfo.SelectActiveQuest)
---Selects an active quest from the gossip window.
---@param index number|QuestId Index of the active quest to select, from 1 to GetNumGossipActiveQuests(); order corresponds to the order of return values from GetGossipActiveQuests().
function QuestieCompat.SelectActiveQuest(index)
if C_GossipInfo and C_GossipInfo.SelectActiveQuest then
local questId = C_GossipInfo.GetActiveQuests()[index].questID
return C_GossipInfo.SelectActiveQuest(questId)
elseif SelectGossipActiveQuest then
return SelectGossipActiveQuest(index)
end
error(errorMsg, 2)
end
---[Documentation](https://wowpedia.fandom.com/wiki/API_GetContainerNumSlots)
---Returns the total number of slots in the bag specified by the index.
---@param bagID number the slot containing the bag, e.g. 0 for backpack, etc.
---@return number numberOfSlots the number of slots in the specified bag, or 0 if there is no bag in the given slot.
function QuestieCompat.GetContainerNumSlots(bagID)
if C_Container and C_Container.GetContainerNumSlots then
return C_Container.GetContainerNumSlots(bagID)
elseif GetContainerNumSlots then
return GetContainerNumSlots(bagID)
end
error(errorMsg, 2)
end
---[Documentation](https://wowpedia.fandom.com/wiki/API_GetContainerItemInfo)
---Returns info for an item in a container slot.
---@param bagID number BagID of the bag the item is in, e.g. 0 for your backpack.
---@param slot number index of the slot inside the bag to look up.
---@return number texture The icon texture (FileID) for the item in the specified bag slot.
---@return number itemCount The number of items in the specified bag slot.
---@return boolean locked True if the item is locked by the server, false otherwise.
---@return number quality The Quality of the item.
---@return boolean readable True if the item can be "read" (as in a book), false otherwise.
---@return boolean lootable True if the item is a temporary container containing items that can be looted, false otherwise.
---@return string itemLink The itemLink of the item in the specified bag slot.
---@return boolean isFiltered True if the item is grayed-out during the current inventory search, false otherwise.
---@return boolean noValue True if the item has no gold value, false otherwise.
---@return number itemID The unique ID for the item in the specified bag slot.
---@return boolean isBound True if the item is bound to the current character, false otherwise.
function QuestieCompat.GetContainerItemInfo(bagID, slot)
if C_Container and C_Container.GetContainerItemInfo then
local containerInfo = C_Container.GetContainerItemInfo(bagID, slot)
if containerInfo then
return containerInfo.iconFileID,
containerInfo.stackCount,
containerInfo.isLocked,
containerInfo.quality,
containerInfo.isReadable,
containerInfo.hasLoot,
containerInfo.hyperlink,
containerInfo.isFiltered,
containerInfo.hasNoValue,
containerInfo.itemID,
containerInfo.isBound
else
return nil
end
elseif GetContainerItemInfo then
return GetContainerItemInfo(bagID, slot)
end
error(errorMsg, 2)
end
---[Documentation](https://wowpedia.fandom.com/wiki/API_GetItemCooldown)
---Returns info about the cooldown state and time of an item.
---@param itemID number The item ID.
---@return number startTime The time when the cooldown started (as returned by GetTime()) or zero if no cooldown.
---@return number duration The number of seconds the cooldown will last, or zero if no cooldown.
---@return number enable 1 if the item is ready or on cooldown, 0 if the item is used, but the cooldown didn't start yet (e.g. potion in combat).
function QuestieCompat.GetItemCooldown(itemID)
if C_Container and C_Container.GetItemCooldown then
return C_Container.GetItemCooldown(itemID)
else
return GetItemCooldown(itemID)
end
end