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.
204 lines
6.3 KiB
204 lines
6.3 KiB
--[[
|
|
State provider for currencies
|
|
]]
|
|
|
|
local ADDON_NAME, Internal = ...
|
|
local External = _G[ADDON_NAME]
|
|
local L = Internal.L
|
|
|
|
local currencyMapNameToID = {}
|
|
|
|
local CurrencyMixin = CreateFromMixins(External.StateMixin)
|
|
function CurrencyMixin:Init(currencyID)
|
|
External.StateMixin.Init(self, currencyID)
|
|
|
|
if Internal.data and Internal.data.currencies and Internal.data.currencies[currencyID] then
|
|
Mixin(self, Internal.data.currencies[currencyID]);
|
|
end
|
|
if BtWTodoCache.currencies[currencyID] then
|
|
Mixin(self, BtWTodoCache.currencies[currencyID]);
|
|
end
|
|
|
|
Mixin(self, C_CurrencyInfo.GetCurrencyInfo(currencyID))
|
|
|
|
if not BtWTodoCache.currencies[currencyID] then
|
|
BtWTodoCache.currencies[currencyID] = {}
|
|
end
|
|
|
|
self.discovered = nil
|
|
self.isShowInBackpack = nil
|
|
self.quantity = nil
|
|
self.quantityEarnedThisWeek = nil
|
|
self.totalEarned = nil
|
|
end
|
|
function CurrencyMixin:GetDisplayName()
|
|
return string.format(L["Currency: %s"], self:GetName())
|
|
end
|
|
function CurrencyMixin:GetUniqueKey()
|
|
return "currency:" .. self:GetID()
|
|
end
|
|
function CurrencyMixin:GetName()
|
|
return self.name
|
|
end
|
|
function CurrencyMixin:GetQuantity()
|
|
if self:GetCharacter():IsPlayer() then
|
|
return C_CurrencyInfo.GetCurrencyInfo(self:GetID()).quantity;
|
|
else
|
|
return self:GetCharacter():GetData("currencyQuantity", self:GetID()) or 0
|
|
end
|
|
end
|
|
function CurrencyMixin:GetQuantityEarnedThisWeek()
|
|
if self:GetCharacter():IsPlayer() then
|
|
return C_CurrencyInfo.GetCurrencyInfo(self:GetID()).quantityEarnedThisWeek;
|
|
else
|
|
return self:GetCharacter():GetData("currencyEarnedThisWeek", self:GetID()) or 0
|
|
end
|
|
end
|
|
function CurrencyMixin:GetTotalEarned()
|
|
if self:GetCharacter():IsPlayer() then
|
|
return C_CurrencyInfo.GetCurrencyInfo(self:GetID()).totalEarned;
|
|
else
|
|
return self:GetCharacter():GetData("currencyTotalEarned", self:GetID()) or 0
|
|
end
|
|
end
|
|
function CurrencyMixin:GetMaxQuantity()
|
|
return self.maxQuantity
|
|
end
|
|
function CurrencyMixin:GetMaxWeeklyQuantity()
|
|
return self.maxWeeklyQuantity
|
|
end
|
|
function CurrencyMixin:UseTotalEarnedForMaxQty()
|
|
return self.useTotalEarnedForMaxQty
|
|
end
|
|
function CurrencyMixin:IsCapped()
|
|
if self:UseTotalEarnedForMaxQty() then
|
|
return self:GetTotalEarned() >= self:GetMaxQuantity()
|
|
else
|
|
return self:GetQuantity() >= self:GetMaxQuantity()
|
|
end
|
|
end
|
|
function CurrencyMixin:IsWeeklyCapped()
|
|
return self:GetQuantityEarnedThisWeek() > self:GetMaxWeeklyQuantity()
|
|
end
|
|
function CurrencyMixin:HasWeeklyCap()
|
|
return self:GetMaxWeeklyQuantity() ~= 0
|
|
end
|
|
function CurrencyMixin:HasCap()
|
|
return self:GetMaxQuantity() ~= 0
|
|
end
|
|
function CurrencyMixin:RegisterEventsFor(driver)
|
|
if self:GetID() == 1822 then
|
|
driver:RegisterEvents("PLAYER_ENTERING_WORLD", "COVENANT_SANCTUM_RENOWN_LEVEL_CHANGED", "WEEKLY_RESET")
|
|
else
|
|
driver:RegisterEvents("PLAYER_ENTERING_WORLD", "CURRENCY_DISPLAY_UPDATE", "CHAT_MSG_CURRENCY", "DAILY_RESET", "HALF_WEEKLY_RESET")
|
|
end
|
|
end
|
|
|
|
local CurrencyProviderMixin = CreateFromMixins(External.StateProviderMixin)
|
|
function CurrencyProviderMixin:GetID()
|
|
return "currency"
|
|
end
|
|
function CurrencyProviderMixin:GetName()
|
|
return L["Currency"]
|
|
end
|
|
function CurrencyProviderMixin:Acquire(...)
|
|
return CreateAndInitFromMixin(CurrencyMixin, ...)
|
|
end
|
|
function CurrencyProviderMixin:GetFunctions()
|
|
return {
|
|
{
|
|
name = "IsCapped",
|
|
returnValue = "bool",
|
|
},
|
|
{
|
|
name = "IsWeeklyCapped",
|
|
returnValue = "bool",
|
|
},
|
|
}
|
|
end
|
|
function CurrencyProviderMixin:GetDefaults()
|
|
return { -- Completed
|
|
"or", {"IsWeeklyCapped"}, {"IsCapped"},
|
|
}, { -- Text
|
|
{"GetQuantity"}
|
|
}
|
|
end
|
|
function CurrencyProviderMixin:ParseInput(value)
|
|
local num = tonumber(value)
|
|
if num ~= nil then
|
|
return true, num
|
|
end
|
|
if currencyMapNameToID[value] then
|
|
return true, currencyMapNameToID[value]
|
|
end
|
|
return false, L["Invalid currency"]
|
|
end
|
|
function CurrencyProviderMixin:FillAutoComplete(tbl, text, offset, length)
|
|
local text = strsub(text, offset, length):lower()
|
|
for value in pairs(currencyMapNameToID) 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(CurrencyProviderMixin))
|
|
|
|
-- Update our list of currencies to save for players
|
|
Internal.RegisterEvent("PLAYER_ENTERING_WORLD", function()
|
|
for index=1,C_CurrencyInfo.GetCurrencyListSize() do
|
|
local link = C_CurrencyInfo.GetCurrencyListLink(index)
|
|
if link then
|
|
local _, id = strsplit(":", string.match(link, "currency:[:%d]+"))
|
|
id = tonumber(id)
|
|
|
|
local data = BtWTodoCache.currencies[id] or {}
|
|
BtWTodoCache.currencies[id] = data
|
|
end
|
|
end
|
|
|
|
-- Update the currency map store
|
|
for id in pairs(BtWTodoCache.currencies) do
|
|
local info = C_CurrencyInfo.GetCurrencyInfo(id)
|
|
currencyMapNameToID[info.name] = id
|
|
end
|
|
end, -2)
|
|
|
|
-- Save Currency Data for Player
|
|
Internal.RegisterEvent("PLAYER_LOGOUT", function ()
|
|
local player = Internal.GetPlayer()
|
|
local quantity = player:GetDataTable("currencyQuantity")
|
|
local totalEarned = player:GetDataTable("currencyTotalEarned")
|
|
wipe(quantity)
|
|
wipe(totalEarned)
|
|
|
|
for id in pairs(BtWTodoCache.currencies) do
|
|
local currency = C_CurrencyInfo.GetCurrencyInfo(id)
|
|
if currency then
|
|
if currency.quantity ~= 0 then
|
|
quantity[id] = currency.quantity
|
|
end
|
|
if currency.totalEarned ~= 0 then
|
|
totalEarned[id] = currency.totalEarned
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
-- Handle currencies that reset each season
|
|
local seasonalCurrencies = {
|
|
[1191] = true, -- Valor
|
|
[1602] = true, -- Conquest
|
|
[1904] = true, -- Tower Knowledge
|
|
}
|
|
Internal.RegisterEvent("SEASON_RESET", function ()
|
|
for _,character in Internal.IterateCharacters() do
|
|
local quantity = character:GetDataTable("currencyQuantity")
|
|
local totalEarned = character:GetDataTable("currencyTotalEarned")
|
|
for currencyID in pairs(seasonalCurrencies) do
|
|
quantity[currencyID] = nil
|
|
totalEarned[currencyID] = nil
|
|
end
|
|
end
|
|
end)
|
|
|