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.
231 lines
8.4 KiB
231 lines
8.4 KiB
-- ========================================================================= --
|
|
-- SylingTracker --
|
|
-- https://www.curseforge.com/wow/addons/sylingtracker --
|
|
-- --
|
|
-- Repository: --
|
|
-- https://github.com/Skamer/SylingTracker --
|
|
-- --
|
|
-- ========================================================================= --
|
|
Syling "SylingTracker.Scenario" ""
|
|
-- ========================================================================= --
|
|
namespace "SLT"
|
|
-- ========================================================================= --
|
|
_Active = false
|
|
-- ========================================================================= --
|
|
RegisterContentType = API.RegisterContentType
|
|
RegisterModel = API.RegisterModel
|
|
-- ========================================================================= --
|
|
IsInScenario = C_Scenario.IsInScenario
|
|
IsInJailersTower = IsInJailersTower
|
|
GetInfo = C_Scenario.GetInfo
|
|
GetStepInfo = C_Scenario.GetStepInfo
|
|
GetCriteriaInfo = C_Scenario.GetCriteriaInfo
|
|
GetBonusSteps = C_Scenario.GetBonusSteps
|
|
GetCriteriaInfoByStep = C_Scenario.GetCriteriaInfoByStep
|
|
GetBasicCurrencyInfo = C_CurrencyInfo.GetBasicCurrencyInfo
|
|
IsInInstance = IsInInstance
|
|
-- ========================================================================= --
|
|
_ScenarioModel = RegisterModel(Model, "scenario-data")
|
|
NIL_DATA = Model.NIL_DATA
|
|
-- ========================================================================= --
|
|
RegisterContentType({
|
|
ID = "scenario",
|
|
DisplayName = "Scenario",
|
|
Description = "Display the scenario",
|
|
DefaultOrder = 10,
|
|
DefaultModel = _ScenarioModel,
|
|
DefaultViewClass = ScenarioContentView,
|
|
Events = { "PLAYER_ENTERING_WORLD", "SCENARIO_POI_UPDATE", "SCENARIO_UPDATE"},
|
|
Status = function()
|
|
-- Prevent the scenario content to be shown in torghast
|
|
if IsInJailersTower() then
|
|
return false
|
|
end
|
|
|
|
-- Prevent the scenario content to be shown in dungeon
|
|
local inInstance, type = IsInInstance()
|
|
if inInstance and (type == "party") then
|
|
return false
|
|
end
|
|
|
|
return IsInScenario()
|
|
end
|
|
})
|
|
|
|
|
|
function OnActive(self)
|
|
PLAYER_ENTERING_WORLD()
|
|
end
|
|
|
|
function OnInactive(self)
|
|
_ScenarioModel:ClearData()
|
|
end
|
|
|
|
__ActiveOnEvents__ "PLAYER_ENTERING_WORLD" "SCENARIO_POI_UPDATE" "SCENARIO_UPDATE"
|
|
function ActiveOn(self)
|
|
-- Prevent the scenario content to be shown in torghast
|
|
if IsInJailersTower() then
|
|
return false
|
|
end
|
|
|
|
-- Prevent the scenario content to be shown in dungeon
|
|
local inInstance, type = IsInInstance()
|
|
if inInstance and (type == "party") then
|
|
return false
|
|
end
|
|
|
|
return IsInScenario()
|
|
end
|
|
|
|
__SystemEvent__()
|
|
function PLAYER_ENTERING_WORLD()
|
|
_M:UpdateScenario()
|
|
_M:UpdateObjectives()
|
|
_ScenarioModel:Flush()
|
|
end
|
|
|
|
__SystemEvent__ "SCENARIO_POI_UPDATE" "SCENARIO_CRITERIA_UPDATE" "CRITERIA_COMPLETE" "SCENARIO_COMPLETED"
|
|
function OBJECTIVES_UPDATE()
|
|
_M:UpdateObjectives()
|
|
|
|
_ScenarioModel:Flush()
|
|
end
|
|
|
|
__SystemEvent__()
|
|
function SCENARIO_UPDATE(...)
|
|
_M:UpdateScenario(...)
|
|
_M:UpdateObjectives()
|
|
|
|
_ScenarioModel:Flush()
|
|
end
|
|
|
|
function UpdateScenario(self, isNewStage)
|
|
local title, currentStage, numStages, flags, _, _, _, xp, money, scenarioType = GetInfo()
|
|
local scenarioData = {
|
|
title = title,
|
|
name = title,
|
|
currentStage = currentStage,
|
|
numStages = numStages,
|
|
flags = flags,
|
|
xp = xp,
|
|
money = money,
|
|
scenarioType = scenarioType
|
|
}
|
|
|
|
_ScenarioModel:AddData(scenarioData, "scenario")
|
|
end
|
|
|
|
function UpdateObjectives(self)
|
|
local stageName, stageDescription, numObjectives, _, _, _, _, numSpells, spellInfo, weightedProgress, rewardQuestID, widgetSetID = GetStepInfo()
|
|
local scenarioData = {
|
|
stageName = stageName,
|
|
stageDescription = stageDescription,
|
|
numObjectives = numObjectives,
|
|
numSpells = numSpells,
|
|
spellInfo = spellInfo,
|
|
weightedProgress = weightedProgress,
|
|
rewardQuestID = rewardQuestID,
|
|
widgetSetID = widgetSetID
|
|
}
|
|
|
|
if weightedProgress then
|
|
-- NOTE: Some scenario (e.g: 7.2 Broken shode introduction, invasion scenario )
|
|
-- can have an objective progress even if it say numObjectives == 0 so
|
|
-- we need checking if te step info has weightedProgress.
|
|
-- If the stage has a weightedProgress, show only this one even if the
|
|
-- numObjectives say >= 1
|
|
scenarioData.objectives = {
|
|
[1] = {
|
|
text = stageDescription,
|
|
isCompleted = false,
|
|
hasProgressBar = true,
|
|
progress = weightedProgress,
|
|
minProgress = 0,
|
|
maxProgress = 100,
|
|
progressText = PERCENTAGE_STRING:format(weightedProgress)
|
|
}
|
|
}
|
|
else
|
|
if numObjectives > 0 then
|
|
local objectivesData = {}
|
|
for index = 1, numObjectives do
|
|
local description, criteriaType, completed, quantity, totalQuantity,
|
|
flags, assetID, quantityString, criteriaID, duration, elapsed,
|
|
failed, isWeightProgress = GetCriteriaInfo(index)
|
|
|
|
if description and not isWeightProgress then
|
|
description = string.format("%d/%d %s", quantity, totalQuantity, description);
|
|
end
|
|
|
|
local data = {
|
|
text = description,
|
|
criteriaType = criteriaType,
|
|
isCompleted = completed,
|
|
quantity = quantity,
|
|
totalQuantity = totalQuantity,
|
|
flags = flags,
|
|
assetID = assetID,
|
|
quantityString = quantityString,
|
|
criteriaID = criteriaID,
|
|
duration = duration,
|
|
elapsed = elapsed,
|
|
failed = failed,
|
|
isWeightProgress = isWeightProgress
|
|
}
|
|
|
|
objectivesData[index] = data
|
|
end
|
|
-- NOTE: We use SetData only for objectives to be sure the scenario
|
|
-- doesn't keep the objectives data of previous stage.
|
|
_ScenarioModel:SetData(objectivesData, "scenario", "objectives")
|
|
end
|
|
|
|
-- Bonus objectives
|
|
local tblBonusSteps = GetBonusSteps()
|
|
local numBonusObjectives = #tblBonusSteps
|
|
if numBonusObjectives > 0 then
|
|
local bonusObjectivesData = {}
|
|
for index = 1, numBonusObjectives do
|
|
local bonusStepIndex = tblBonusSteps[index]
|
|
local criteriaString, criteriaType, criteriaCompleted, quantity, totalQuantity,
|
|
flags, assetID, quantityString, criteriaID, duration, elapsed,
|
|
criteriaFailed = C_Scenario.GetCriteriaInfoByStep(bonusStepIndex, 1)
|
|
|
|
local data = {
|
|
text = criteriaString,
|
|
criteriaType = criteriaType,
|
|
isCompleted = criteriaCompleted,
|
|
quantity = quantity,
|
|
totalQuantity = totalQuantity,
|
|
flags = flags,
|
|
assetID = assetID,
|
|
quantityString = quantityString,
|
|
criteriaID = criteriaID,
|
|
duration = duration,
|
|
elapsed = elapsed,
|
|
failed = criteriaFailed,
|
|
isWeightProgress = isWeightProgress
|
|
}
|
|
|
|
-- Hide the timer if the criteria has been complated or failed
|
|
if duration and duration > 0 and not criteriaFailed and not criteriaCompleted then
|
|
data.hasTimer = true
|
|
data.startTime = GetTime() - elapsed
|
|
end
|
|
|
|
bonusObjectivesData[index] = data
|
|
end
|
|
-- NOTE: We use SetData only for objectives to be sure the scenario
|
|
-- doesn't keep the objectives data of previous stage.
|
|
_ScenarioModel:SetData(bonusObjectivesData, "scenario", "bonusObjectives")
|
|
end
|
|
end
|
|
|
|
_ScenarioModel:AddData(scenarioData, "scenario")
|
|
end
|
|
-- ========================================================================= --
|
|
-- Debug Utils Tools
|
|
-- ========================================================================= --
|
|
if ViragDevTool_AddData then
|
|
ViragDevTool_AddData(_ScenarioModel, "SLT Scenario Model")
|
|
end
|
|
|