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

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