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.

241 lines
7.9 KiB

4 years ago
local _, addon = ...;
local DataProvider = {};
addon.DataProvider = DataProvider;
local GetAchievementCategory = GetAchievementCategory;
local GetCategoryInfo = GetCategoryInfo;
local GetAchievementInfo = GetAchievementInfo;
local SetFocusedAchievement= SetFocusedAchievement;
--Changed in 10.1.5 (C_ContentTracking)
local GetTrackedAchievements = GetTrackedAchievements;
local RemoveTrackedAchievement = RemoveTrackedAchievement;
local AddTrackedAchievement = AddTrackedAchievement;
do
local TRACKING_TYPE_ACHV = (Enum and Enum.ContentTrackingType and Enum.ContentTrackingType.Achievement) or 2;
if C_ContentTracking then
if C_ContentTracking.GetTrackedIDs then
GetTrackedAchievements = function()
return C_ContentTracking.GetTrackedIDs(TRACKING_TYPE_ACHV)
end
end
if C_ContentTracking.StopTracking then
RemoveTrackedAchievement = function(id)
C_ContentTracking.StopTracking(TRACKING_TYPE_ACHV, id, Enum.ContentTrackingStopType.Manual);
end
end
if C_ContentTracking.StartTracking then
AddTrackedAchievement = function(id)
AchievementFrame_LoadUI(); --Due to the change of Objective Tracker in 10.1.5;
local trackingError = C_ContentTracking.StartTracking(TRACKING_TYPE_ACHV, id);
if trackingError then
ContentTrackingUtil.DisplayTrackingError(trackingError);
end
end
end
if C_ContentTracking.IsTracking then
function DataProvider:IsTrackedAchievement(id)
return C_ContentTracking.IsTracking(TRACKING_TYPE_ACHV, id)
end
end
else
function DataProvider:IsTrackedAchievement(id)
return self.isTrackedAchievements[id]
end
end
end
4 years ago
local NARCI_CATE_ID = 12080000;
DataProvider.categoryCache = {
[NARCI_CATE_ID] = {"Narcissus", -1},
};
DataProvider.achievementCache = {};
DataProvider.achievementOrderCache = {};
DataProvider.id2Button = {};
DataProvider.currentCategory = 0;
DataProvider.isTrackedAchievements = {};
DataProvider.trackedAchievements = {};
DataProvider.rootCategories = {};
4 years ago
function DataProvider:ClearCache()
wipe(self.categoryCache);
wipe(self.achievementCache);
collectgarbage("collect");
end
function DataProvider:GetCategoryInfo(id, index)
if id and id >= NARCI_CATE_ID or id < 0 then
return "Narcissus", -1
end
if not self.categoryCache[id] then
local name, parentID, flags = GetCategoryInfo(id);
if name then
self.categoryCache[id] = { name, parentID, flags };
end
return name, parentID, flags;
else
if index then
return self.categoryCache[id][index];
else
return unpack( self.categoryCache[id] );
end
end
end
function DataProvider:GetAchievementCategory(achievementID)
if achievementID and achievementID > NARCI_CATE_ID or achievementID < 0 then
return NARCI_CATE_ID
else
return GetAchievementCategory(achievementID)
end
end
function DataProvider:GetAchievementInfo(id, index)
if not id or id < 0 then
return id
end
if id > NARCI_CATE_ID then
--reserved for Narcissus Statistics
return id
end
if not self.achievementCache[id] then
local id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy, isStatistic = GetAchievementInfo(id);
if isGuild then
SetFocusedAchievement(id);
end
if description then
4 years ago
self.achievementCache[id] = {id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, true, isStatistic};
4 years ago
end
if index then
if self.achievementCache[id] then
return self.achievementCache[id][index];
end
else
return id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy, isStatistic
end
else
if index then
return self.achievementCache[id][index];
else
return unpack( self.achievementCache[id] );
end
end
end
function DataProvider:IsStatistic(id)
if id > NARCI_CATE_ID or id < 0 then
--reserved for Narcissus Statistics
return true
end
if self.achievementCache[id] then
return self.achievementCache[id][15]
else
local isStatistic = select(15, GetAchievementInfo(id));
return isStatistic
end
end
function DataProvider:UpdateAchievementCache(id)
if self.achievementCache[id] then
local id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy = GetAchievementInfo(id);
if isGuild then
SetFocusedAchievement(id);
end
if description then
self.achievementCache[id] = {id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe};
end
end
end
function DataProvider:GetAchievementInfoByOrder(categoryID, order)
if not self.achievementOrderCache[categoryID] then
self.achievementOrderCache[categoryID] = {};
end
if not self.achievementOrderCache[categoryID][order] then
local id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy = GetAchievementInfo(categoryID, order);
if isGuild then
SetFocusedAchievement(id);
end
if description then
self.achievementOrderCache[categoryID][order] = id;
self.achievementCache[id] = {id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe};
end
return id, name, points, completed, month, day, year, description, flags, icon, rewardText, isGuild, wasEarnedByMe, earnedBy
else
local id = self.achievementOrderCache[categoryID][order];
return self:GetAchievementInfo(id)
end
end
function DataProvider:GetCategoryButtonByID(categoryID, isGuild)
return self.id2Button[categoryID];
end
function DataProvider:GetTrackedAchievements()
local new = {GetTrackedAchievements()} or {};
local old = self.trackedAchievements;
local numNew, numOld = #new, #old;
local dif;
if numNew >= numOld then
local lookup = {};
for i = 1, #old do
lookup[ old[i] ] = true;
end
for i = 1, #new do
if not lookup[ new[i] ] then
dif = new[i];
break
end
end
else
local lookup = {};
for i = 1, #new do
lookup[ new[i] ] = true;
end
for i = 1, #old do
if not lookup[ old[i] ] then
dif = old[i];
break
end
end
end
self.trackedAchievements = new;
self.numTrackedAchievements = #new;
wipe(self.isTrackedAchievements);
for index, id in pairs(new) do
self.isTrackedAchievements[id] = true;
end
return dif
end
function DataProvider:StopTracking(id)
RemoveTrackedAchievement(id);
end
function DataProvider:StartTracking(id)
AddTrackedAchievement(id);
end
function DataProvider:IsAchievementCompleted(id)
return self:GetAchievementInfo(id, 4) and true
end
function DataProvider:IsRootCategory(categoryID)
if self.rootCategories[categoryID] == nil then
local name, parentID = self:GetCategoryInfo(categoryID);
self.rootCategories[categoryID] = (parentID == -1 or parentID == 15076) or false;
end
return self.rootCategories[categoryID]
4 years ago
end