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

-- ========================================================================= --
-- 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