Files
Questie-X/Modules/QuestieReputation.lua
T

122 lines
4.6 KiB
Lua

---@class QuestieReputation
local QuestieReputation = QuestieLoader:CreateModule("QuestieReputation")
---@type QuestieQuest
local QuestieQuest = QuestieLoader:ImportModule("QuestieQuest")
--- COMPATIBILITY ---
local GetFactionInfo = QuestieCompat.GetFactionInfo
local playerReputations = {}
local _ReachedNewStanding, _WinterSaberChanged
-- Fast local references
local ExpandFactionHeader, GetNumFactions = ExpandFactionHeader, GetNumFactions
--- Updates all factions a player already discovered and checks if any of these
--- reached a new reputation level
---@param isInit boolean? @
function QuestieReputation:Update(isInit)
Questie:Debug(Questie.DEBUG_DEVELOP, "QuestieReputation: Update")
ExpandFactionHeader(0) -- Expand all header
local factionChanged = false
local newFaction = false
for i=1, GetNumFactions() do
local name, _, standingId, _, _, barValue, _, _, isHeader, _, _, _, _, factionID, _, _ = GetFactionInfo(i)
if not isHeader and factionID then
local previousValues = playerReputations[factionID]
if (not previousValues) then
--? Reset all autoBlacklisted quests if a faction gets discovered
QuestieQuest.ResetAutoblacklistCategory("rep")
newFaction = true
end
playerReputations[factionID] = {standingId, barValue}
if (not isInit) and (
_ReachedNewStanding(previousValues, standingId)
or _WinterSaberChanged(factionID, previousValues, barValue)) then
Questie:Debug(Questie.DEBUG_DEVELOP, "QuestieReputation: Update - faction \"" .. name .. "\" (" .. factionID .. ") changed")
factionChanged = true
end
end
end
return factionChanged, newFaction
end
---@return boolean
_ReachedNewStanding = function(previousValues, standingId)
return (not previousValues) -- New faction
or (previousValues[1] ~= standingId) -- Standing changed
end
---@return boolean
_WinterSaberChanged = function(factionID, previousValues, barValue)
return factionID == 589 -- Wintersaber Trainer
and previousValues and ((previousValues[2] < 4500 and barValue >= 4500)
or (previousValues[2] < 13000 and barValue >= 13000))
end
-- This function is just for debugging purpose
-- There is no need to access the playerReputations table somewhere else
function QuestieReputation:GetPlayerReputations()
return playerReputations
end
---@param requiredMinRep { [1]: number, [2]: number }? [1] = factionId, [2] = repValue
---@param requiredMaxRep { [1]: number, [2]: number }? [1] = factionId, [2] = repValue
---@return boolean AboveMinRep
---@return boolean HasMinFaction
---@return boolean BelowMaxRep
---@return boolean HasMaxFaction
function QuestieReputation:HasFactionAndReputationLevel(requiredMinRep, requiredMaxRep)
local aboveMinRep = false -- the player has reached the min required reputation value
local belowMaxRep = false
local hasMinFaction = false
local hasMaxFaction = false
if requiredMinRep then
local minFactionID = requiredMinRep[1]
local reqMinValue = requiredMinRep[2]
if playerReputations[minFactionID] then
hasMinFaction = true
aboveMinRep = playerReputations[minFactionID][2] >= reqMinValue
end
else
-- If requiredMinRep is nil, we don't care about the reputation aka it fullfils it
aboveMinRep = true
hasMinFaction = true
end
if requiredMaxRep then
local maxFactionID = requiredMaxRep[1]
local reqMaxValue = requiredMaxRep[2]
if playerReputations[maxFactionID] then
hasMaxFaction = true
belowMaxRep = playerReputations[maxFactionID][2] < reqMaxValue
elseif maxFactionID == 909 then -- Darkmoon Faire
hasMaxFaction = true
belowMaxRep = true
end
else
-- If requiredMaxRep is nil, we don't care about the reputation aka it fullfils it
belowMaxRep = true
hasMaxFaction = true
end
return aboveMinRep, hasMinFaction, belowMaxRep, hasMaxFaction
end
--- Checkout https://github.com/Questie/Questie/wiki/Corrections#reputation-levels for more information
---@return boolean HasReputation Is the player within the required reputation ranges specified by the parameters
function QuestieReputation:HasReputation(requiredMinRep, requiredMaxRep)
local aboveMinRep, hasMinFaction, belowMaxRep, hasMaxFaction = QuestieReputation:HasFactionAndReputationLevel(requiredMinRep, requiredMaxRep)
return ((aboveMinRep and hasMinFaction) and (belowMaxRep and hasMaxFaction))
end
return QuestieReputation