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.
321 lines
12 KiB
321 lines
12 KiB
|
3 years ago
|
--[[
|
||
|
|
State provider for currencies
|
||
|
|
]]
|
||
|
|
|
||
|
|
local ADDON_NAME, Internal = ...
|
||
|
|
local External = _G[ADDON_NAME]
|
||
|
|
local L = Internal.L
|
||
|
|
|
||
|
|
local factionMapNameToID = {}
|
||
|
|
|
||
|
|
local FactionMixin = CreateFromMixins(External.StateMixin)
|
||
|
|
function FactionMixin:Init(factionID)
|
||
|
|
External.StateMixin.Init(self, factionID)
|
||
|
|
|
||
|
|
if Internal.data and Internal.data.factions and Internal.data.factions[factionID] then
|
||
|
|
Mixin(self, Internal.data.factions[factionID]);
|
||
|
|
end
|
||
|
|
if BtWTodoCache.factions[factionID] then
|
||
|
|
Mixin(self, BtWTodoCache.factions[factionID]);
|
||
|
|
end
|
||
|
|
|
||
|
|
local _
|
||
|
|
self.name, self.description, _, _, _, _, self.canToggleAtWar = GetFactionInfoByID(self:GetID())
|
||
|
|
|
||
|
|
local friendshipInfo = C_GossipInfo and C_GossipInfo.GetFriendshipReputation and C_GossipInfo.GetFriendshipReputation(self:GetID()) or nil
|
||
|
|
if friendshipInfo then
|
||
|
|
self.max = friendshipInfo.maxRep > 0 and friendshipInfo.maxRep or 42000
|
||
|
|
else
|
||
|
|
self.max = (select(3, GetFriendshipReputation(self:GetID()))) or 42000
|
||
|
|
end
|
||
|
|
self.paragonMax = select(2, C_Reputation.GetFactionParagonInfo(self:GetID())) or 0
|
||
|
|
self.isMajorFaction = (C_MajorFactions and C_MajorFactions.GetMajorFactionData and C_MajorFactions.GetMajorFactionData(factionID)) ~= nil
|
||
|
|
end
|
||
|
|
function FactionMixin:GetDisplayName()
|
||
|
|
return string.format(L["Faction: %s"], self:GetName())
|
||
|
|
end
|
||
|
|
function FactionMixin:GetUniqueKey()
|
||
|
|
return "faction:" .. self:GetID()
|
||
|
|
end
|
||
|
|
function FactionMixin:GetName()
|
||
|
|
return self.name
|
||
|
|
end
|
||
|
|
function FactionMixin:GetDescription()
|
||
|
|
return self.description
|
||
|
|
end
|
||
|
|
function FactionMixin:HasParagon()
|
||
|
|
return C_Reputation.GetFactionParagonInfo(self:GetID()) ~= nil
|
||
|
|
end
|
||
|
|
function FactionMixin:HasParagonAvailable()
|
||
|
|
if self:GetCharacter():IsPlayer() then
|
||
|
|
return select(4, C_Reputation.GetFactionParagonInfo(self:GetID())) or false
|
||
|
|
else
|
||
|
|
return self:GetCharacter():GetData("factionParagonAvailable", self:GetID())
|
||
|
|
end
|
||
|
|
end
|
||
|
|
function FactionMixin:IsMajorFaction()
|
||
|
|
return self.isMajorFaction
|
||
|
|
end
|
||
|
|
function FactionMixin:GetStanding()
|
||
|
|
if self:GetCharacter():IsPlayer() then
|
||
|
|
if self.isMajorFaction then
|
||
|
|
local majorFactionData = C_MajorFactions.GetMajorFactionData(self:GetID())
|
||
|
|
return majorFactionData.renownLevel or 0
|
||
|
|
end
|
||
|
|
|
||
|
|
return (select(3, GetFactionInfoByID(self:GetID())) or 0)
|
||
|
|
else
|
||
|
|
return self:GetCharacter():GetData("factionStanding", self:GetID()) or 0
|
||
|
|
end
|
||
|
|
end
|
||
|
|
function FactionMixin:IsStanding(standing)
|
||
|
|
return self:GetStanding() >= standing
|
||
|
|
end
|
||
|
|
function FactionMixin:GetMaxQuantity()
|
||
|
|
return self.max
|
||
|
|
end
|
||
|
|
function FactionMixin:GetQuantity()
|
||
|
|
if self:GetCharacter():IsPlayer() then
|
||
|
|
if self.isMajorFaction then
|
||
|
|
local majorFactionData = C_MajorFactions.GetMajorFactionData(self:GetID())
|
||
|
|
return (majorFactionData.renownLevelThreshold or 0) * ((majorFactionData.renownLevel or 1) - 1) + (majorFactionData.renownReputationEarned or 0)
|
||
|
|
end
|
||
|
|
|
||
|
|
return (select(6, GetFactionInfoByID(self:GetID())) or 0)
|
||
|
|
else
|
||
|
|
return self:GetCharacter():GetData("factionQuantity", self:GetID()) or 0
|
||
|
|
end
|
||
|
|
end
|
||
|
|
function FactionMixin:IsCapped()
|
||
|
|
return self:GetQuantity() >= self:GetMaxQuantity()
|
||
|
|
end
|
||
|
|
function FactionMixin:GetTotalMaxQuantity()
|
||
|
|
return self.max + self.paragonMax
|
||
|
|
end
|
||
|
|
function FactionMixin:GetTotalQuantity()
|
||
|
|
if self:GetCharacter():IsPlayer() then
|
||
|
|
if self.isMajorFaction then
|
||
|
|
local majorFactionData = C_MajorFactions.GetMajorFactionData(self:GetID())
|
||
|
|
return (majorFactionData.renownLevelThreshold or 0) * ((majorFactionData.renownLevel or 1) - 1) + (majorFactionData.renownReputationEarned or 0)
|
||
|
|
end
|
||
|
|
|
||
|
|
local currentValue, _, _, hasRewardPending = C_Reputation.GetFactionParagonInfo(self:GetID())
|
||
|
|
if currentValue ~= nil then
|
||
|
|
currentValue = currentValue % 10000
|
||
|
|
if hasRewardPending then
|
||
|
|
currentValue = currentValue + 10000
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local standingMin, _, standingValue = select(4, GetFactionInfoByID(self:GetID()))
|
||
|
|
return (standingMin or 0) + (standingValue or 0) + (currentValue or 0)
|
||
|
|
else
|
||
|
|
return self:GetCharacter():GetData("factionTotalQuantity", self:GetID()) or 0
|
||
|
|
end
|
||
|
|
end
|
||
|
|
function FactionMixin:IsTotalCapped()
|
||
|
|
return self:GetTotalQuantity() >= self:GetTotalMax()
|
||
|
|
end
|
||
|
|
function FactionMixin:GetStandingMaxQuantity()
|
||
|
|
if self:GetCharacter():IsPlayer() then
|
||
|
|
if self.isMajorFaction then
|
||
|
|
local majorFactionData = C_MajorFactions.GetMajorFactionData(self:GetID())
|
||
|
|
return majorFactionData.renownLevelThreshold or 0
|
||
|
|
end
|
||
|
|
|
||
|
|
if C_GossipInfo and C_GossipInfo.GetFriendshipReputation then
|
||
|
|
local info = C_GossipInfo.GetFriendshipReputation(self:GetID())
|
||
|
|
if info and info.friendshipFactionID == self:GetID() then
|
||
|
|
return info.nextThreshold
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local currentValue, threshold = C_Reputation.GetFactionParagonInfo(self:GetID())
|
||
|
|
if currentValue ~= nil and currentValue ~= 0 then
|
||
|
|
return threshold
|
||
|
|
end
|
||
|
|
|
||
|
|
local standingMin, standingMax = select(4, GetFactionInfoByID(self:GetID()))
|
||
|
|
return standingMax - standingMin
|
||
|
|
else
|
||
|
|
return self:GetCharacter():GetData("factionStandingMax", self:GetID()) or 0
|
||
|
|
end
|
||
|
|
end
|
||
|
|
function FactionMixin:GetStandingQuantity()
|
||
|
|
if self:GetCharacter():IsPlayer() then
|
||
|
|
if self.isMajorFaction then
|
||
|
|
local majorFactionData = C_MajorFactions.GetMajorFactionData(self:GetID())
|
||
|
|
return majorFactionData.renownReputationEarned or 0
|
||
|
|
end
|
||
|
|
|
||
|
|
if C_GossipInfo and C_GossipInfo.GetFriendshipReputation then
|
||
|
|
local info = C_GossipInfo.GetFriendshipReputation(self:GetID())
|
||
|
|
if info and info.friendshipFactionID == self:GetID() then
|
||
|
|
return info.standing
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local currentValue, _, _, hasRewardPending = C_Reputation.GetFactionParagonInfo(self:GetID())
|
||
|
|
if currentValue ~= nil and currentValue ~= 0 then
|
||
|
|
currentValue = currentValue % 10000
|
||
|
|
if hasRewardPending then
|
||
|
|
currentValue = currentValue + 10000
|
||
|
|
end
|
||
|
|
return currentValue
|
||
|
|
end
|
||
|
|
|
||
|
|
local standingMin, _, standingValue = select(4, GetFactionInfoByID(self:GetID()))
|
||
|
|
return standingValue - standingMin
|
||
|
|
else
|
||
|
|
return self:GetCharacter():GetData("factionStandingQuantity", self:GetID()) or 0
|
||
|
|
end
|
||
|
|
end
|
||
|
|
-- Get the number of paragon boxes looted, not counting if 1 is available
|
||
|
|
function FactionMixin:GetParagonLooted()
|
||
|
|
if self:GetCharacter():IsPlayer() then
|
||
|
|
local currentValue, _, _, hasRewardPending = C_Reputation.GetFactionParagonInfo(self:GetID())
|
||
|
|
if currentValue == nil then
|
||
|
|
return 0
|
||
|
|
end
|
||
|
|
if hasRewardPending then
|
||
|
|
currentValue = currentValue - 10000
|
||
|
|
end
|
||
|
|
return math.floor(currentValue * 0.0001)
|
||
|
|
else
|
||
|
|
return self:GetCharacter():GetData("factionParagonLooted", self:GetID()) or 0
|
||
|
|
end
|
||
|
|
end
|
||
|
|
function FactionMixin:RegisterEventsFor(driver)
|
||
|
|
driver:RegisterEvents("PLAYER_ENTERING_WORLD", "UPDATE_FACTION", "DAILY_RESET", "HALF_WEEKLY_RESET")
|
||
|
|
end
|
||
|
|
|
||
|
|
local FactionProviderMixin = CreateFromMixins(External.StateProviderMixin)
|
||
|
|
function FactionProviderMixin:GetID()
|
||
|
|
return "faction"
|
||
|
|
end
|
||
|
|
function FactionProviderMixin:GetName()
|
||
|
|
return L["Faction"]
|
||
|
|
end
|
||
|
|
function FactionProviderMixin:Acquire(...)
|
||
|
|
return CreateAndInitFromMixin(FactionMixin, ...)
|
||
|
|
end
|
||
|
|
function FactionProviderMixin:GetFunctions()
|
||
|
|
return {
|
||
|
|
{
|
||
|
|
name = "IsCapped",
|
||
|
|
returnValue = "bool",
|
||
|
|
},
|
||
|
|
}
|
||
|
|
end
|
||
|
|
function FactionProviderMixin:GetDefaults()
|
||
|
|
return { -- Completed
|
||
|
|
{"IsCapped"},
|
||
|
|
}, { -- Text
|
||
|
|
{"GetQuantity"}
|
||
|
|
}
|
||
|
|
end
|
||
|
|
function FactionProviderMixin:ParseInput(value)
|
||
|
|
local num = tonumber(value)
|
||
|
|
if num ~= nil then
|
||
|
|
return true, num
|
||
|
|
end
|
||
|
|
if factionMapNameToID[value] then
|
||
|
|
return true, factionMapNameToID[value]
|
||
|
|
end
|
||
|
|
return false, L["Invalid Faction"]
|
||
|
|
end
|
||
|
|
function FactionProviderMixin:FillAutoComplete(tbl, text, offset, length)
|
||
|
|
local text = strsub(text, offset, length):lower()
|
||
|
|
for value in pairs(factionMapNameToID) do
|
||
|
|
local name = value:lower()
|
||
|
|
if #name >= #text and strsub(name, offset, length) == text then
|
||
|
|
tbl[#tbl+1] = value
|
||
|
|
end
|
||
|
|
end
|
||
|
|
table.sort(tbl)
|
||
|
|
end
|
||
|
|
Internal.RegisterStateProvider(CreateFromMixins(FactionProviderMixin))
|
||
|
|
|
||
|
|
-- Update our list of currencies to save for players
|
||
|
|
Internal.RegisterEvent("PLAYER_LOGIN", function()
|
||
|
|
for index=1,GetNumFactions() do
|
||
|
|
local name, isHeader, id = GetFactionInfo(index), select(9, GetFactionInfo(index)), select(14, GetFactionInfo(index))
|
||
|
|
if not isHeader then
|
||
|
|
local data = BtWTodoCache.factions[id] or {}
|
||
|
|
data.name = name
|
||
|
|
BtWTodoCache.factions[id] = data
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Update the faction map store
|
||
|
|
for id in pairs(BtWTodoCache.factions) do
|
||
|
|
local name = GetFactionInfo(id)
|
||
|
|
if not name then
|
||
|
|
local data = BtWTodoCache.factions[id]
|
||
|
|
name = data and data.name
|
||
|
|
end
|
||
|
|
if name then
|
||
|
|
factionMapNameToID[name] = id
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
-- Save Faction Data for Player
|
||
|
|
Internal.RegisterEvent("PLAYER_ENTERING_WORLD", function ()
|
||
|
|
local player = Internal.GetPlayer()
|
||
|
|
local standing = player:GetDataTable("factionStanding")
|
||
|
|
local quantity = player:GetDataTable("factionQuantity")
|
||
|
|
local totalQuantity = player:GetDataTable("factionTotalQuantity")
|
||
|
|
local standingMax = player:GetDataTable("factionStandingMax")
|
||
|
|
local standingQuantity = player:GetDataTable("factionStandingQuantity")
|
||
|
|
local paragonAvailable = player:GetDataTable("factionParagonAvailable")
|
||
|
|
local paragonLooted = player:GetDataTable("factionParagonLooted")
|
||
|
|
wipe(standing)
|
||
|
|
wipe(quantity)
|
||
|
|
wipe(totalQuantity)
|
||
|
|
wipe(standingMax)
|
||
|
|
wipe(standingQuantity)
|
||
|
|
wipe(paragonAvailable)
|
||
|
|
wipe(paragonLooted)
|
||
|
|
|
||
|
|
for id in pairs(BtWTodoCache.factions) do
|
||
|
|
local standingID, standingMin, standingMaxValue, standingValue = select(3, GetFactionInfoByID(id))
|
||
|
|
if standingValue then
|
||
|
|
local paragonValue, threshold, _, hasRewardPending = C_Reputation.GetFactionParagonInfo(id)
|
||
|
|
local currentValue, numLooted
|
||
|
|
if paragonValue ~= nil and paragonValue ~= 0 then
|
||
|
|
currentValue = paragonValue
|
||
|
|
numLooted = paragonValue
|
||
|
|
|
||
|
|
currentValue = currentValue % 10000
|
||
|
|
if hasRewardPending then
|
||
|
|
currentValue = currentValue + 10000
|
||
|
|
numLooted = numLooted - 10000
|
||
|
|
end
|
||
|
|
numLooted = math.floor(numLooted * 0.0001)
|
||
|
|
end
|
||
|
|
|
||
|
|
standing[id] = standingID
|
||
|
|
if standingValue ~= 0 then
|
||
|
|
quantity[id] = standingValue
|
||
|
|
end
|
||
|
|
if standingMin + standingValue + (currentValue or 0) ~= 0 then
|
||
|
|
totalQuantity[id] = standingMin + standingValue + (currentValue or 0)
|
||
|
|
end
|
||
|
|
if currentValue ~= nil and currentValue ~= 0 then
|
||
|
|
standingMax[id] = threshold
|
||
|
|
elseif standingMaxValue - standingMin ~= 0 then
|
||
|
|
standingMax[id] = standingMaxValue - standingMin
|
||
|
|
end
|
||
|
|
if currentValue or (standingValue - standingMin) ~= 0 then
|
||
|
|
standingQuantity[id] = currentValue or (standingValue - standingMin)
|
||
|
|
end
|
||
|
|
if hasRewardPending then
|
||
|
|
paragonAvailable[id] = true
|
||
|
|
end
|
||
|
|
if numLooted ~= nil and numLooted ~= 0 then
|
||
|
|
paragonLooted[id] = numLooted
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end)
|