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.
190 lines
6.9 KiB
190 lines
6.9 KiB
-- ========================================================================= --
|
|
-- SylingTracker --
|
|
-- https://www.curseforge.com/wow/addons/sylingtracker --
|
|
-- --
|
|
-- Repository: --
|
|
-- https://github.com/Skamer/SylingTracker --
|
|
-- --
|
|
-- ========================================================================= --
|
|
Syling "SylingTracker.Achievements" ""
|
|
-- ========================================================================= --
|
|
import "SLT"
|
|
-- ========================================================================= --
|
|
_Active = false
|
|
-- ========================================================================= --
|
|
RegisterContentType = API.RegisterContentType
|
|
RegisterModel = API.RegisterModel
|
|
-- ========================================================================= --
|
|
_AchievementModel = RegisterModel(AchievementModel, "achievements-data")
|
|
-- ========================================================================= --
|
|
HasAchievements = Utils.Achievement.HasAchievements
|
|
GetAchievementInfo = GetAchievementInfo
|
|
GetAchievementNumCriteria = GetAchievementNumCriteria
|
|
IsAchievementEligible = IsAchievementEligible
|
|
-- ========================================================================= --
|
|
-- Register the achievements content type
|
|
-- ========================================================================= --
|
|
RegisterContentType({
|
|
ID = "achievements",
|
|
DisplayName = "Achievements",
|
|
Description = "Display the achievements tracked",
|
|
DefaultOrder = 80,
|
|
DefaultModel = _AchievementModel,
|
|
DefaultViewClass = AchievementsContentView,
|
|
Events = { "TRACKED_ACHIEVEMENT_LIST_CHANGED", "PLAYER_ENTERING_WORLD" },
|
|
Status = function() return HasAchievements() end
|
|
})
|
|
-- ========================================================================= --
|
|
_AchievementsCache = {}
|
|
_ReadyForFetching = false
|
|
-- ========================================================================= --
|
|
__ActiveOnEvents__ "PLAYER_ENTERING_WORLD" "TRACKED_ACHIEVEMENT_LIST_CHANGED"
|
|
function ActivateOn(self, event)
|
|
if event == "PLAYER_ENTERING_WORLD" then
|
|
_ReadyForFetching = true
|
|
end
|
|
|
|
return HasAchievements()
|
|
end
|
|
-- ========================================================================= --
|
|
function OnActive(self)
|
|
-- NOTE: This seems the first time the player enters in the game, the achievements
|
|
-- details may be incorrect and missing. The workaround is to wait the
|
|
-- PLAYER_ENTERING_WORLD event which will set _ReadyForFetching to true for
|
|
-- saying it's ready for fetching the information.
|
|
if _ReadyForFetching then
|
|
self:LoadAchievements()
|
|
end
|
|
end
|
|
|
|
function OnInactive(self)
|
|
_AchievementModel:ClearData()
|
|
|
|
-- Clear the cache
|
|
wipe(_AchievementsCache)
|
|
end
|
|
-- ========================================================================= --
|
|
__SystemEvent__()
|
|
function TRACKED_ACHIEVEMENT_UPDATE(achievementID)
|
|
-- NOTE: We need to check the achievement is tracked for avoiding to add
|
|
-- untracked achievements.
|
|
if _AchievementsCache[achievementID] then
|
|
_M:UpdateAchievement(achievementID)
|
|
_AchievementModel:Flush()
|
|
end
|
|
end
|
|
|
|
__SystemEvent__()
|
|
function PLAYER_ENTERING_WORLD()
|
|
_ReadyForFetching = true
|
|
|
|
-- The information are now ready to be fetched, so we can load achievements
|
|
_M:LoadAchievements()
|
|
end
|
|
|
|
__SystemEvent__()
|
|
function TRACKED_ACHIEVEMENT_LIST_CHANGED(achievementID, isAdded)
|
|
if not _ReadyForFetching then
|
|
return
|
|
end
|
|
|
|
-- NOTE: When an achievement has failed, TRACKED_ACHIEVEMENT_LIST_CHANGED is triggered with
|
|
-- achievementID and isAdded having a nil value
|
|
if achievementID then
|
|
if isAdded then
|
|
_AchievementsCache[achievementID] = true
|
|
_M:UpdateAchievement(achievementID)
|
|
else
|
|
_AchievementModel:RemoveAchievementData(achievementID)
|
|
_AchievementsCache[achievementID] = nil
|
|
end
|
|
|
|
_AchievementModel:Flush()
|
|
else
|
|
-- NOTE: When an anchievement has failed, achievementID and isAdded have a nil value.
|
|
-- We must update all for the achievement eligibility is correctly updated.
|
|
-- Infortunnaly we don't know which achievement has an eligibility change.
|
|
_M:UpdateAllAchievements()
|
|
end
|
|
end
|
|
|
|
|
|
function LoadAchievements(self)
|
|
local trackedAchievements = { GetTrackedAchievements() }
|
|
for i = 1, #trackedAchievements do
|
|
local achievementID = trackedAchievements[i]
|
|
TRACKED_ACHIEVEMENT_LIST_CHANGED(achievementID, true)
|
|
end
|
|
end
|
|
|
|
function UpdateAllAchievements(self)
|
|
for achievementID in pairs(_AchievementsCache) do
|
|
self:UpdateAchievement(achievementID)
|
|
end
|
|
|
|
_AchievementModel:Flush()
|
|
end
|
|
|
|
function UpdateAchievement(self, achievementID)
|
|
local _, name, points, completed, month, day, year, description, flags, icon,
|
|
rewardText, isGuild, wasEarnedByMe, earnedBy = GetAchievementInfo(achievementID)
|
|
|
|
local numObjectives = GetAchievementNumCriteria(achievementID)
|
|
local failed = IsAchievementEligible(achievementID)
|
|
|
|
local achievementData = {
|
|
achievementID = achievementID,
|
|
title = name,
|
|
name = name,
|
|
numObjectives = numObjectives,
|
|
points = points,
|
|
failed = failed,
|
|
completed = completed,
|
|
month = month,
|
|
day = day,
|
|
year = year,
|
|
description = description,
|
|
flags = flags,
|
|
icon = icon,
|
|
rewardText = rewardText,
|
|
isGuild = isGuild,
|
|
wasEarnedByMe = wasEarnedByMe,
|
|
earnedBy = earnedBy
|
|
}
|
|
|
|
if numObjectives > 0 then
|
|
local objectivesData = {}
|
|
for index = 1, numObjectives do
|
|
local criteriaString, criteriaType, criteriaCompleted, quantity,
|
|
totalQuantity, name, flags, assetID, quantityString, criteriaID,
|
|
eligible, duration, elapsed = GetAchievementCriteriaInfo(achievementID, index)
|
|
|
|
local data = {
|
|
text = criteriaString,
|
|
failed = not eligible,
|
|
isCompleted = criteriaCompleted
|
|
}
|
|
|
|
if bit.band(flags, EVALUATION_TREE_FLAG_PROGRESS_BAR) == EVALUATION_TREE_FLAG_PROGRESS_BAR then
|
|
data.text = description
|
|
data.hasProgressBar = true
|
|
data.progress = quantity
|
|
data.minProgress = 0
|
|
data.maxProgress = totalQuantity
|
|
data.progressText = format("%i / %i", quantity, totalQuantity)
|
|
end
|
|
|
|
objectivesData[index] = data
|
|
end
|
|
|
|
achievementData.objectives = objectivesData
|
|
end
|
|
|
|
_AchievementModel:AddAchievementData(achievementID, achievementData)
|
|
end
|
|
-- ========================================================================= --
|
|
-- Debug Utils Tools
|
|
-- ========================================================================= --
|
|
if ViragDevTool_AddData then
|
|
ViragDevTool_AddData(_AchievementModel, "SLT Achievement Model")
|
|
end
|