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.
210 lines
8.6 KiB
210 lines
8.6 KiB
|
|
local ARENA_CATEGORY = 165;
|
|
local MAX_CRITERIA_PER_ACHIEVEMENT = 5;
|
|
|
|
KT_ACHIEVEMENT_TRACKER_MODULE = KT_ObjectiveTracker_GetModuleInfoTable("KT_ACHIEVEMENT_TRACKER_MODULE");
|
|
KT_ACHIEVEMENT_TRACKER_MODULE.updateReasonModule = KT_OBJECTIVE_TRACKER_UPDATE_MODULE_ACHIEVEMENT;
|
|
KT_ACHIEVEMENT_TRACKER_MODULE.updateReasonEvents = KT_OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT + KT_OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED;
|
|
KT_ACHIEVEMENT_TRACKER_MODULE:SetHeader(KT_ObjectiveTrackerFrame.BlocksFrame.AchievementHeader, TRACKER_HEADER_ACHIEVEMENTS, KT_OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT_ADDED);
|
|
|
|
local TIMED_CRITERIA = { };
|
|
|
|
function KT_ACHIEVEMENT_TRACKER_MODULE:OnBlockHeaderClick(block, mouseButton)
|
|
if ( IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() ) then
|
|
local achievementLink = GetAchievementLink(block.id);
|
|
if ( achievementLink ) then
|
|
ChatEdit_InsertLink(achievementLink);
|
|
end
|
|
elseif ( mouseButton ~= "RightButton" ) then
|
|
--CloseDropDownMenus();
|
|
if ( not AchievementFrame ) then
|
|
AchievementFrame_LoadUI();
|
|
end
|
|
if ( IsModifiedClick("QUESTWATCHTOGGLE") ) then
|
|
KT_AchievementObjectiveTracker_UntrackAchievement(_, block.id);
|
|
elseif ( not AchievementFrame:IsShown() ) then
|
|
AchievementFrame_ToggleAchievementFrame();
|
|
AchievementFrame_SelectAchievement(block.id);
|
|
else
|
|
if ( AchievementFrameAchievements.selection ~= block.id ) then
|
|
AchievementFrame_SelectAchievement(block.id);
|
|
else
|
|
AchievementFrame_ToggleAchievementFrame();
|
|
end
|
|
end
|
|
else
|
|
KT_ObjectiveTracker_ToggleDropDown(block, KT_AchievementObjectiveTracker_OnOpenDropDown);
|
|
end
|
|
end
|
|
|
|
function KT_ACHIEVEMENT_TRACKER_MODULE:GetDebugReportInfo(block)
|
|
return { debugType = "TrackedAchievement", achievementID = block.id, };
|
|
end
|
|
|
|
-- *****************************************************************************************************
|
|
-- ***** BLOCK DROPDOWN FUNCTIONS
|
|
-- *****************************************************************************************************
|
|
|
|
function KT_AchievementObjectiveTracker_OnOpenDropDown(self)
|
|
--[[local block = self.activeFrame;
|
|
local _, achievementName, _, completed, _, _, _, _, _, icon = GetAchievementInfo(block.id);
|
|
|
|
local info = UIDropDownMenu_CreateInfo();
|
|
info.text = achievementName;
|
|
info.isTitle = 1;
|
|
info.notCheckable = 1;
|
|
UIDropDownMenu_AddButton(info, UIDROPDOWN_MENU_LEVEL);
|
|
|
|
info = UIDropDownMenu_CreateInfo();
|
|
info.notCheckable = 1;
|
|
|
|
info.text = OBJECTIVES_VIEW_ACHIEVEMENT;
|
|
info.func = function (button, ...) OpenAchievementFrameToAchievement(...); end;
|
|
info.arg1 = block.id;
|
|
info.checked = false;
|
|
UIDropDownMenu_AddButton(info, UIDROPDOWN_MENU_LEVEL);
|
|
|
|
info.text = OBJECTIVES_STOP_TRACKING;
|
|
info.func = KT_AchievementObjectiveTracker_UntrackAchievement;
|
|
info.arg1 = block.id;
|
|
info.checked = false;
|
|
UIDropDownMenu_AddButton(info, UIDROPDOWN_MENU_LEVEL);]]
|
|
end
|
|
|
|
function KT_AchievementObjectiveTracker_UntrackAchievement(dropDownButton, achievementID)
|
|
RemoveTrackedAchievement(achievementID);
|
|
if ( AchievementFrame ) then
|
|
AchievementFrameAchievements_ForceUpdate();
|
|
end
|
|
end
|
|
|
|
-- *****************************************************************************************************
|
|
-- ***** UPDATE FUNCTIONS
|
|
-- *****************************************************************************************************
|
|
|
|
function KT_ACHIEVEMENT_TRACKER_MODULE:Update()
|
|
|
|
self:BeginLayout();
|
|
|
|
local _, instanceType = IsInInstance();
|
|
local displayOnlyArena = ArenaEnemyFramesContainer and ArenaEnemyFramesContainer:IsShown() and (instanceType == "arena");
|
|
local trackedAchievements = { GetTrackedAchievements() };
|
|
|
|
for i = 1, #trackedAchievements do
|
|
local achievementID = trackedAchievements[i];
|
|
local _, achievementName, _, completed, _, _, _, description, _, icon, _, _, wasEarnedByMe = GetAchievementInfo(achievementID);
|
|
-- check filters
|
|
local showAchievement = true;
|
|
if ( wasEarnedByMe ) then
|
|
showAchievement = false;
|
|
elseif ( displayOnlyArena ) then
|
|
if ( GetAchievementCategory(achievementID) ~= ARENA_CATEGORY ) then
|
|
showAchievement = false;
|
|
end
|
|
end
|
|
|
|
if ( showAchievement ) then
|
|
local block = self:GetBlock(achievementID);
|
|
self:SetBlockHeader(block, achievementName);
|
|
-- criteria
|
|
local numCriteria = GetAchievementNumCriteria(achievementID);
|
|
if ( numCriteria > 0 ) then
|
|
local numShownCriteria = 0;
|
|
for criteriaIndex = 1, numCriteria do
|
|
local criteriaString, criteriaType, criteriaCompleted, quantity, totalQuantity, name, flags, assetID, quantityString, criteriaID, eligible, duration, elapsed = GetAchievementCriteriaInfo(achievementID, criteriaIndex);
|
|
local colorStyle = eligible and KT_OBJECTIVE_TRACKER_COLOR["Normal"] or KT_OBJECTIVE_TRACKER_COLOR["Failed"];
|
|
if ( criteriaCompleted or ( numShownCriteria > MAX_CRITERIA_PER_ACHIEVEMENT and not criteriaCompleted ) ) then
|
|
-- Do not display this one
|
|
elseif ( numShownCriteria == MAX_CRITERIA_PER_ACHIEVEMENT and numCriteria > (MAX_CRITERIA_PER_ACHIEVEMENT + 1) ) then
|
|
-- We ran out of space to display incomplete criteria >_<
|
|
self:AddObjective(block, "Extra", "...", nil, nil, KT_OBJECTIVE_DASH_STYLE_HIDE);
|
|
numShownCriteria = numShownCriteria + 1;
|
|
else
|
|
if ( description and bit.band(flags, EVALUATION_TREE_FLAG_PROGRESS_BAR) == EVALUATION_TREE_FLAG_PROGRESS_BAR ) then
|
|
-- progress bar
|
|
if ( string.find(strlower(quantityString), "interface\\moneyframe") ) then -- no easy way of telling it's a money progress bar
|
|
criteriaString = quantityString.."\n"..description;
|
|
else
|
|
-- remove spaces so it matches the quest look, x/y
|
|
criteriaString = string.gsub(quantityString, " / ", "/").." "..description;
|
|
end
|
|
else
|
|
-- for meta criteria look up the achievement name
|
|
if ( criteriaType == CRITERIA_TYPE_ACHIEVEMENT and assetID ) then
|
|
_, criteriaString = GetAchievementInfo(assetID);
|
|
end
|
|
end
|
|
local line = self:AddObjective(block, criteriaIndex, criteriaString, nil, nil, KT_OBJECTIVE_DASH_STYLE_SHOW, colorStyle);
|
|
numShownCriteria = numShownCriteria + 1;
|
|
-- timer bar
|
|
if ( duration and elapsed and elapsed < duration ) then
|
|
self:AddTimerBar(block, line, duration, GetTime() - elapsed);
|
|
elseif ( line.TimerBar ) then
|
|
self:FreeTimerBar(block, line);
|
|
end
|
|
end
|
|
end
|
|
else
|
|
-- single criteria type of achievement
|
|
-- check if we're supposed to show a timer bar for this
|
|
local timerShown = false;
|
|
local timerFailed = false;
|
|
local timerCriteriaDuration = 0;
|
|
local timerCriteriaStartTime = 0;
|
|
for timedCriteriaID, timedCriteria in next, TIMED_CRITERIA do
|
|
if ( timedCriteria.achievementID == achievementID ) then
|
|
local elapsed = GetTime() - timedCriteria.startTime;
|
|
if ( elapsed <= timedCriteria.duration ) then
|
|
timerCriteriaDuration = timedCriteria.duration;
|
|
timerCriteriaStartTime = timedCriteria.startTime;
|
|
timerShown = true;
|
|
else
|
|
timerFailed = true;
|
|
end
|
|
break;
|
|
end
|
|
end
|
|
local colorStyle = (not timerFailed and IsAchievementEligible(achievementID)) and KT_OBJECTIVE_TRACKER_COLOR["Normal"] or KT_OBJECTIVE_TRACKER_COLOR["Failed"];
|
|
local line = self:AddObjective(block, 1, description, nil, nil, KT_OBJECTIVE_DASH_STYLE_SHOW, colorStyle);
|
|
if ( timerShown ) then
|
|
self:AddTimerBar(block, line, timerCriteriaDuration, timerCriteriaStartTime);
|
|
elseif ( line.TimerBar ) then
|
|
self:FreeTimerBar(block, line);
|
|
end
|
|
end
|
|
block:SetHeight(block.height);
|
|
|
|
if ( KT_ObjectiveTracker_AddBlock(block) ) then
|
|
block:Show();
|
|
self:FreeUnusedLines(block);
|
|
else
|
|
block.used = false;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
|
|
self:EndLayout();
|
|
end
|
|
|
|
function KT_AchievementObjectiveTracker_OnAchievementUpdate(achievementID, criteriaID, elapsed, duration)
|
|
if ( not elapsed or not duration ) then
|
|
-- Don't do anything
|
|
else
|
|
-- we're already handling timer bars for achievements with visible criteria
|
|
-- we use this system to handle timer bars for the rest
|
|
local numCriteria = GetAchievementNumCriteria(achievementID);
|
|
if ( numCriteria == 0 ) then
|
|
local timedCriteria = TIMED_CRITERIA[criteriaID] or {};
|
|
timedCriteria.achievementID = achievementID;
|
|
timedCriteria.startTime = GetTime() - elapsed;
|
|
timedCriteria.duration = duration;
|
|
TIMED_CRITERIA[criteriaID] = timedCriteria;
|
|
end
|
|
end
|
|
if ( IsTrackedAchievement(achievementID) ) then
|
|
KT_ObjectiveTracker_Update(KT_OBJECTIVE_TRACKER_UPDATE_ACHIEVEMENT);
|
|
else
|
|
TIMED_CRITERIA[criteriaID] = nil;
|
|
end
|
|
end
|