208 lines
6.8 KiB
Lua
208 lines
6.8 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
|
|
|
|
return ZoneDB.instanceIdToUiMapId[select(8, GetInstanceInfo())]
|
|
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
|
|
return ZoneDB.instanceIdToUiMapId[select(8, GetInstanceInfo())]
|
|
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
|