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.
250 lines
7.6 KiB
250 lines
7.6 KiB
local _, addon = ...
|
|
|
|
local time = time;
|
|
|
|
local StatManager = {};
|
|
addon.StatManager = StatManager;
|
|
|
|
StatManager.widgets = {};
|
|
StatManager.LocationFrames = {};
|
|
|
|
function StatManager:LoadData()
|
|
if not NarciStatisticsDB_PC then
|
|
NarciStatisticsDB_PC = {};
|
|
end
|
|
|
|
if not NarciStatisticsDB_PC.Barbershop then
|
|
NarciStatisticsDB_PC.Barbershop = {};
|
|
end
|
|
|
|
if not NarciStatisticsDB_PC.Barbershop.Locations then
|
|
NarciStatisticsDB_PC.Barbershop.Locations = {}; --[mapID] = {visit, time};
|
|
end
|
|
|
|
self.DB = NarciStatisticsDB_PC.Barbershop;
|
|
end
|
|
|
|
function StatManager:StartTimer()
|
|
self.startTime = time();
|
|
end
|
|
|
|
function StatManager:StopTimer()
|
|
if self.startTime then
|
|
local stopTime = time();
|
|
local duration = stopTime - self.startTime;
|
|
self.startTime = 0;
|
|
|
|
local mapID = self.mapID;
|
|
if mapID and duration < 4800 then --time broken?
|
|
self.DB.Locations[mapID].time = self.DB.Locations[mapID].time + duration;
|
|
end
|
|
end
|
|
end
|
|
|
|
function StatManager:UpdateLocationFrame()
|
|
local Locations = self.DB.Locations;
|
|
local list = {};
|
|
for mapID, data in pairs(Locations) do
|
|
table.insert(list, {mapID, data.visit, data.time});
|
|
end
|
|
if #list > 0 then
|
|
table.sort(list, function(a, b) return a[1] < b[1] end );
|
|
local timestamp = time();
|
|
local mapID = self.mapID;
|
|
for i = 1, #list do
|
|
local widget = self.LocationFrames[i];
|
|
if not widget then
|
|
widget = CreateFrame("Frame", nil, self.StatFrame, "NarciBarberShopStatsLocationFrameTemplate");
|
|
if i == 1 then
|
|
widget:SetPoint("TOP", self.widgets.LocationHeader, "BOTTOM", 0, 16*(1 - i));
|
|
else
|
|
widget:SetPoint("TOP", self.LocationFrames[i - 1], "BOTTOM", 0, 0);
|
|
end
|
|
self.LocationFrames[i] = widget;
|
|
end
|
|
widget:SetLocation(list[i][1]);
|
|
widget:SetValue(list[i][2], list[i][3], timestamp);
|
|
if list[i][1] == mapID then
|
|
widget:StartTimer();
|
|
else
|
|
widget:StopTimer();
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function StatManager:UpdateLocationFramesHeight()
|
|
local numFrames = #self.LocationFrames;
|
|
if numFrames > 0 then
|
|
local height = self.LocationFrames[1]:GetTop() - self.LocationFrames[numFrames]:GetBottom() + 100;
|
|
self.StatFrame.tabHeight = self.StatFrame.basicHeight + 32;
|
|
if self.StatFrame:IsShown() then
|
|
self.SettingFrame:SelectTab(self.StatFrame);
|
|
end
|
|
return height
|
|
else
|
|
return 0
|
|
end
|
|
end
|
|
|
|
function StatManager:UpdateZone()
|
|
local mapID = C_Map.GetBestMapForUnit("player");
|
|
self.mapID = mapID;
|
|
if mapID then
|
|
--print(C_Map.GetMapInfo(mapID).name);
|
|
if not self.DB.Locations[mapID] then
|
|
self.DB.Locations[mapID] = { visit = 0, time = 0 };
|
|
end
|
|
self.DB.Locations[mapID].visit = self.DB.Locations[mapID].visit + 1;
|
|
end
|
|
end
|
|
|
|
function StatManager:UpdateFrame()
|
|
self:UpdateLocationFrame();
|
|
self:UpdateLocationFramesHeight();
|
|
end
|
|
|
|
function StatManager:OnBarberShopOpen()
|
|
C_Timer.After(0.5, function()
|
|
self:UpdateZone();
|
|
self:StartTimer();
|
|
--self:UpdateMoney();
|
|
end)
|
|
end
|
|
|
|
function StatManager:OnBarberShopClose()
|
|
self:StopTimer();
|
|
end
|
|
|
|
function StatManager:UpdateMoney()
|
|
local moneyLifetime = GetStatistic(1147);
|
|
local copperLifetime;
|
|
if moneyLifetime then
|
|
--"544|TInterface\\MoneyFrame\\UI-GoldIcon:0:0:2:0|t"
|
|
local gold = string.match(moneyLifetime, "(%d+)|TInterface\\MoneyFrame\\UI%-GoldIcon") or 0;
|
|
local silver = string.match(moneyLifetime, "(%d+)|TInterface\\MoneyFrame\\UI%-SilverIcon") or 0;
|
|
local copper = string.match(moneyLifetime, "(%d+)|TInterface\\MoneyFrame\\UI%-CopperIcon") or 0;
|
|
local rawCopper = 10000 * gold + 100 * silver + copper;
|
|
self.widgets.CoinsSpentLifetime:SetAmount(rawCopper);
|
|
if not self.DB.CoinSpentBeforeShadowlands then
|
|
self.DB.CoinSpentBeforeShadowlands = rawCopper;
|
|
end
|
|
|
|
local diff = rawCopper - self.DB.CoinSpentBeforeShadowlands;
|
|
self.widgets.CoinsSpentSinceShadowlands:SetAmount(diff);
|
|
else
|
|
copperLifetime = 0;
|
|
end
|
|
end
|
|
|
|
|
|
|
|
---- Barbershop Costs and Locations ----
|
|
local COPPER_PER_SILVER = 100;
|
|
local SILVER_PER_GOLD = 100;
|
|
|
|
|
|
local L = Narci.L;
|
|
local FormatTime = NarciAPI.FormatTime;
|
|
|
|
NarciBarberShopStatsMoneyFrameMixin = {};
|
|
|
|
function NarciBarberShopStatsMoneyFrameMixin:SetLabel(label)
|
|
self.Label:SetText(label)
|
|
end
|
|
|
|
function NarciBarberShopStatsMoneyFrameMixin:SetAmount(rawCopper)
|
|
local gold = math.floor(rawCopper / (COPPER_PER_SILVER * SILVER_PER_GOLD));
|
|
local silver = math.floor((rawCopper - (gold * COPPER_PER_SILVER * SILVER_PER_GOLD)) / COPPER_PER_SILVER);
|
|
local copper = math.fmod(rawCopper, COPPER_PER_SILVER);
|
|
self.Gold:SetText(gold);
|
|
self.Silver:SetText(silver);
|
|
self.Copper:SetText(copper);
|
|
end
|
|
|
|
|
|
local function GetMapParentMapName(mapID, mapName)
|
|
local parentMapID;
|
|
if mapID == 627 then
|
|
parentMapID = 619; --Broken Isles
|
|
elseif mapID == 125 then
|
|
parentMapID = 127; --Crystal Forest
|
|
end
|
|
if parentMapID then
|
|
local info = C_Map.GetMapInfo(parentMapID);
|
|
if info and info.name then
|
|
return mapName..", "..info.name;
|
|
else
|
|
return mapName
|
|
end
|
|
else
|
|
return mapName
|
|
end
|
|
end
|
|
|
|
|
|
NarciBarberShopStatsLocationFrameMixin = {};
|
|
|
|
function NarciBarberShopStatsLocationFrameMixin:SetHeader()
|
|
self.Label:SetText(L["Location"]);
|
|
self.Visit:SetText(L["Visits"]);
|
|
self.Duration:SetText(L["Duration"]);
|
|
local v = 0.5;
|
|
self.Label:SetTextColor(v, v, v);
|
|
self.Visit:SetTextColor(v, v, v);
|
|
self.Duration:SetTextColor(v, v, v);
|
|
end
|
|
|
|
function NarciBarberShopStatsLocationFrameMixin:SetLocation(mapID)
|
|
if mapID then
|
|
if mapID ~= self.mapID then
|
|
self.mapID = mapID;
|
|
local info = C_Map.GetMapInfo(mapID);
|
|
if info and info.name then
|
|
local mapName = info.name;
|
|
mapName = GetMapParentMapName(mapID, mapName)
|
|
self.Label:SetText(mapName);
|
|
else
|
|
self.Label:SetText("#"..mapID);
|
|
end
|
|
|
|
local textHeight = self.Label:GetHeight();
|
|
self:SetHeight(8 + textHeight);
|
|
end
|
|
end
|
|
end
|
|
|
|
function NarciBarberShopStatsLocationFrameMixin:StartTimer()
|
|
self.activeOnShow = true;
|
|
self.t = 1;
|
|
self:SetScript("OnUpdate", function(self, elapsed)
|
|
self.t = self.t + elapsed;
|
|
if self.t >= 1 then
|
|
self.t = 0;
|
|
local timestamp = time();
|
|
self.Duration:SetText( FormatTime(self.seconds + timestamp - self.timestamp) );
|
|
end
|
|
end);
|
|
end
|
|
|
|
function NarciBarberShopStatsLocationFrameMixin:StopTimer()
|
|
self:SetScript("OnUpdate", nil);
|
|
self.activeOnShow = false;
|
|
end
|
|
|
|
function NarciBarberShopStatsLocationFrameMixin:SetValue(numVisits, seconds, timestamp)
|
|
self.Visit:SetText(numVisits);
|
|
self.Duration:SetText( FormatTime(seconds) );
|
|
self.seconds = seconds;
|
|
self.timestamp = timestamp;
|
|
end
|
|
|
|
function NarciBarberShopStatsLocationFrameMixin:OnShow()
|
|
if self.activeOnShow then
|
|
self:StartTimer();
|
|
end
|
|
end
|
|
|
|
function NarciBarberShopStatsLocationFrameMixin:OnHide()
|
|
self:SetScript("OnUpdate", nil);
|
|
end
|
|
|