Files
Questie-X/Modules/QuestiePlayer.lua
T
2026-06-04 21:58:54 -05:00

210 lines
6.9 KiB
Lua

---@class QuestiePlayer
---@field numberOfGroupMembers number ---The number of players currently in the group
local QuestiePlayer = QuestieLoader:CreateModule("QuestiePlayer");
local _QuestiePlayer = QuestiePlayer.private
-------------------------
--Import modules.
-------------------------
---@type ZoneDB
local ZoneDB = QuestieLoader:ImportModule("ZoneDB")
---@type l10n
local l10n = QuestieLoader:ImportModule("l10n")
--- COMPATIBILITY ---
local C_Map = QuestieCompat.C_Map
local UnitRace = QuestieCompat.UnitRace
local UnitClass = QuestieCompat.UnitClass
local UnitInParty = QuestieCompat.UnitInParty
local IsInGroup = QuestieCompat.IsInGroup
local GetHomePartyInfo = QuestieCompat.GetHomePartyInfo
local GetClassColor = QuestieCompat.GetClassColor
local LE_PARTY_CATEGORY_INSTANCE = QuestieCompat.LE_PARTY_CATEGORY_INSTANCE
QuestiePlayer.currentQuestlog = {} --Gets populated by QuestieQuest:GetAllQuestIds(), this is either an object to the quest in question, or the ID if the object doesn't exist.
_QuestiePlayer.playerLevel = -1
local playerRaceId = -1
local playerRaceFlag = 255 -- dummy default value to always return race not matching, corrected in init
local playerRaceFlagX2 = 1 -- dummy default value to always return race not matching, corrected in init
local playerClassName = ""
local playerClassFlag = 255 -- dummy default value to always return class not matching, corrected in init
local playerClassFlagX2 = 1 -- dummy default value to always return class not matching, corrected in init
-- Optimizations
local math_max = math.max;
QuestiePlayer.numberOfGroupMembers = 0
QuestiePlayer.pendingCompleteQuestIds = {}
function QuestiePlayer:Initialize()
_QuestiePlayer.playerLevel = UnitLevel("player") or 1
playerRaceId = select(3, UnitRace("player"))
if playerRaceId then
playerRaceFlag = 2 ^ (playerRaceId - 1)
playerRaceFlagX2 = 2 * playerRaceFlag
end
playerClassName = select(1, UnitClass("player")) or "UNKNOWN"
local classId = select(3, UnitClass("player"))
if classId then
playerClassFlag = 2 ^ (classId - 1)
playerClassFlagX2 = 2 * playerClassFlag
end
end
--Always compare to the UnitLevel parameter, returning the highest.
---@param level Level
function QuestiePlayer:SetPlayerLevel(level)
if level == nil then return end
local localLevel = UnitLevel("player");
_QuestiePlayer.playerLevel = math_max(localLevel, level);
end
-- Gets the highest playerlevel available, most of the time playerLevel should be the most correct one
-- doing UnitLevel for completeness.
---@return Level
function QuestiePlayer.GetPlayerLevel()
local level = UnitLevel("player");
return math_max(_QuestiePlayer.playerLevel, level);
end
-- Find out if the player is at max level for the active expansion
---@return boolean isMaxLevel
function QuestiePlayer.IsMaxLevel()
local level = QuestiePlayer.GetPlayerLevel()
return (Questie.IsWotlk and level == 80) or (Questie.IsTBC and level == 70) or (Questie.IsClassic and level == 60)
end
---@return number
function QuestiePlayer:GetRaceId()
return playerRaceId
end
---@return string
function QuestiePlayer:GetLocalizedClassName()
return playerClassName
end
function QuestiePlayer:GetGroupType()
if(UnitInRaid("player")) then
return "raid";
elseif(IsInGroup(LE_PARTY_CATEGORY_INSTANCE)) then
return "instance";
elseif(UnitInParty("player")) then
return "party";
else
return nil;
end
end
---@return boolean
function QuestiePlayer.HasRequiredRace(requiredRaces)
-- test a bit flag: (value % (2*flag) >= flag)
return (not requiredRaces) or (requiredRaces == 0) or ((requiredRaces % playerRaceFlagX2) >= playerRaceFlag)
end
---@return boolean
function QuestiePlayer.HasRequiredClass(requiredClasses)
-- test a bit flag: (value % (2*flag) >= flag)
return (not requiredClasses) or (requiredClasses == 0) or ((requiredClasses % playerClassFlagX2) >= playerClassFlag)
end
function QuestiePlayer:GetCurrentZoneId()
local uiMapIdOrTable = C_Map.GetBestMapForUnit("player")
local uiMapId = type(uiMapIdOrTable) == "table" and uiMapIdOrTable.uiMapID or uiMapIdOrTable
if uiMapId then
local areaId = ZoneDB:GetAreaIdByUiMapId(uiMapId)
if areaId then
return areaId
end
return uiMapId
end
local _, _, _, _, _, _, _, instanceMapID = GetInstanceInfo()
return ZoneDB.instanceIdToUiMapId[instanceMapID]
end
function QuestiePlayer:GetCurrentUiMapId()
local uiMapIdOrTable = C_Map.GetBestMapForUnit("player")
local uiMapId = type(uiMapIdOrTable) == "table" and uiMapIdOrTable.uiMapID or uiMapIdOrTable
if uiMapId then
return uiMapId
end
local _, _, _, _, _, _, _, instanceMapID = GetInstanceInfo()
return ZoneDB.instanceIdToUiMapId[instanceMapID]
end
---@return number
function QuestiePlayer:GetCurrentContinentId()
local currentZoneId = QuestiePlayer:GetCurrentZoneId()
if (not currentZoneId) or currentZoneId == 0 then
return 1 -- Default to Eastern Kingdom
end
local currentContinentId = l10n:GetContinentIdByAreaId(currentZoneId)
if currentContinentId == 0 then
return 1 -- Default to Eastern Kingdom
end
return currentContinentId
end
function QuestiePlayer:GetPartyMembers()
local partyMembers = GetHomePartyInfo()
if partyMembers then
local party = {}
for _, v in pairs(partyMembers) do
local member = {}
member.Name = v;
local class, _, _ = UnitClass(v)
member.Class = class
member.Level = UnitLevel(v);
table.insert(party, member);
end
return party
end
return nil
end
function QuestiePlayer:GetPartyMemberByName(playerName)
if(UnitInParty("player") or UnitInRaid("player")) then
local player = {}
for index=1, 40 do
local name = UnitName("party"..index);
local _, classFilename = UnitClass("party"..index);
if name == playerName then
player.name = playerName;
player.class = classFilename;
local rPerc, gPerc, bPerc, argbHex = GetClassColor(classFilename)
player.r = rPerc;
player.g = gPerc;
player.b = bPerc;
player.colorHex = argbHex;
return player;
end
if(index > 6 and not UnitInRaid("player")) then
break;
end
end
end
return nil;
end
function QuestiePlayer:GetPartyMemberList()
local members = {}
if(UnitInParty("player") or UnitInRaid("player")) then
for index=1, 40 do
local name = UnitName("party"..index)
if name then
members[name] = true
end
if(index > 6 and not UnitInRaid("player")) then
break
end
end
end
return members
end
return QuestiePlayer