aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Scenarios/Scenario.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Scenarios/Scenario.cpp')
-rw-r--r--src/server/game/Scenarios/Scenario.cpp87
1 files changed, 50 insertions, 37 deletions
diff --git a/src/server/game/Scenarios/Scenario.cpp b/src/server/game/Scenarios/Scenario.cpp
index 3366781ba39..ce994618d62 100644
--- a/src/server/game/Scenarios/Scenario.cpp
+++ b/src/server/game/Scenarios/Scenario.cpp
@@ -23,6 +23,7 @@
#include "Player.h"
#include "ScenarioMgr.h"
#include "ScenarioPackets.h"
+#include "WorldSession.h"
Scenario::Scenario(Map* map, ScenarioData const* scenarioData) : _map(map), _data(scenarioData),
_guid(ObjectGuid::Create<HighGuid::Scenario>(map->GetId(), scenarioData->Entry->ID, map->GenerateLowGuid<HighGuid::Scenario>())),
@@ -100,9 +101,12 @@ void Scenario::SetStep(ScenarioStepEntry const* step)
player->StartCriteria(CriteriaStartEvent::BeginScenarioStep, step->ID);
}
- WorldPackets::Scenario::ScenarioState scenarioState;
- BuildScenarioState(&scenarioState);
- SendPacket(scenarioState.Write());
+ DoForAllPlayers([&](Player const* receiver)
+ {
+ WorldPackets::Scenario::ScenarioState scenarioState;
+ BuildScenarioStateFor(receiver, &scenarioState);
+ receiver->SendDirectMessage(scenarioState.Write());
+ });
}
void Scenario::OnPlayerEnter(Player* player)
@@ -117,7 +121,7 @@ void Scenario::OnPlayerExit(Player* player)
SendBootPlayer(player);
}
-bool Scenario::IsComplete()
+bool Scenario::IsComplete() const
{
for (std::pair<uint8 const, ScenarioStepEntry const*> const& scenarioStep : _data->Steps)
{
@@ -136,7 +140,7 @@ ScenarioEntry const* Scenario::GetEntry() const
return _data->Entry;
}
-ScenarioStepState Scenario::GetStepState(ScenarioStepEntry const* step)
+ScenarioStepState Scenario::GetStepState(ScenarioStepEntry const* step) const
{
auto itr = _stepStates.find(step);
if (itr == _stepStates.end())
@@ -145,20 +149,24 @@ ScenarioStepState Scenario::GetStepState(ScenarioStepEntry const* step)
return itr->second;
}
-void Scenario::SendCriteriaUpdate(Criteria const * criteria, CriteriaProgress const * progress, Seconds timeElapsed, bool timedCompleted) const
+void Scenario::SendCriteriaUpdate(Criteria const* criteria, CriteriaProgress const* progress, Seconds timeElapsed, bool timedCompleted) const
{
- WorldPackets::Scenario::ScenarioProgressUpdate progressUpdate;
- progressUpdate.CriteriaProgress.Id = criteria->ID;
- progressUpdate.CriteriaProgress.Quantity = progress->Counter;
- progressUpdate.CriteriaProgress.Player = progress->PlayerGUID;
- progressUpdate.CriteriaProgress.Date = progress->Date;
- if (criteria->Entry->StartTimer)
- progressUpdate.CriteriaProgress.Flags = timedCompleted ? 1 : 0;
-
- progressUpdate.CriteriaProgress.TimeFromStart = timeElapsed;
- progressUpdate.CriteriaProgress.TimeFromCreate = Seconds::zero();
-
- SendPacket(progressUpdate.Write());
+ DoForAllPlayers([=](Player const* receiver)
+ {
+ WorldPackets::Scenario::ScenarioProgressUpdate progressUpdate;
+ progressUpdate.CriteriaProgress.Id = criteria->ID;
+ progressUpdate.CriteriaProgress.Quantity = progress->Counter;
+ progressUpdate.CriteriaProgress.Player = progress->PlayerGUID;
+ progressUpdate.CriteriaProgress.Date.SetUtcTimeFromUnixTime(progress->Date);
+ progressUpdate.CriteriaProgress.Date += receiver->GetSession()->GetTimezoneOffset();
+ if (criteria->Entry->StartTimer)
+ progressUpdate.CriteriaProgress.Flags = timedCompleted ? 1 : 0;
+
+ progressUpdate.CriteriaProgress.TimeFromStart = timeElapsed;
+ progressUpdate.CriteriaProgress.TimeFromCreate = Seconds::zero();
+
+ receiver->SendDirectMessage(progressUpdate.Write());
+ });
}
bool Scenario::CanUpdateCriteriaTree(Criteria const * /*criteria*/, CriteriaTree const * tree, Player * /*referencePlayer*/) const
@@ -220,20 +228,28 @@ bool Scenario::IsCompletedStep(ScenarioStepEntry const* step)
return IsCompletedCriteriaTree(tree);
}
-void Scenario::SendPacket(WorldPacket const* data) const
+void Scenario::DoForAllPlayers(std::function<void(Player*)> const& worker) const
{
for (ObjectGuid guid : _players)
if (Player* player = ObjectAccessor::GetPlayer(_map, guid))
- player->SendDirectMessage(data);
+ worker(player);
}
-void Scenario::BuildScenarioState(WorldPackets::Scenario::ScenarioState* scenarioState)
+void Scenario::SendPacket(WorldPacket const* data) const
+{
+ DoForAllPlayers([data](Player const* player)
+ {
+ player->SendDirectMessage(data);
+ });
+}
+
+void Scenario::BuildScenarioStateFor(Player const* player, WorldPackets::Scenario::ScenarioState* scenarioState) const
{
scenarioState->ScenarioGUID = _guid;
scenarioState->ScenarioID = _data->Entry->ID;
if (ScenarioStepEntry const* step = GetStep())
scenarioState->CurrentStep = step->ID;
- scenarioState->CriteriaProgress = GetCriteriasProgress();
+ scenarioState->CriteriaProgress = GetCriteriasProgressFor(player);
scenarioState->BonusObjectives = GetBonusObjectivesData();
// Don't know exactly what this is for, but seems to contain list of scenario steps that we're either on or that are completed
for (std::pair<ScenarioStepEntry const* const, ScenarioStepState> const& state : _stepStates)
@@ -288,14 +304,14 @@ ScenarioStepEntry const* Scenario::GetLastStep() const
return lastStep;
}
-void Scenario::SendScenarioState(Player* player)
+void Scenario::SendScenarioState(Player const* player) const
{
WorldPackets::Scenario::ScenarioState scenarioState;
- BuildScenarioState(&scenarioState);
+ BuildScenarioStateFor(player, &scenarioState);
player->SendDirectMessage(scenarioState.Write());
}
-std::vector<WorldPackets::Scenario::BonusObjectiveData> Scenario::GetBonusObjectivesData()
+std::vector<WorldPackets::Scenario::BonusObjectiveData> Scenario::GetBonusObjectivesData() const
{
std::vector<WorldPackets::Scenario::BonusObjectiveData> bonusObjectivesData;
for (std::pair<uint8 const, ScenarioStepEntry const*> const& scenarioStep : _data->Steps)
@@ -315,21 +331,18 @@ std::vector<WorldPackets::Scenario::BonusObjectiveData> Scenario::GetBonusObject
return bonusObjectivesData;
}
-std::vector<WorldPackets::Achievement::CriteriaProgress> Scenario::GetCriteriasProgress()
+std::vector<WorldPackets::Achievement::CriteriaProgress> Scenario::GetCriteriasProgressFor(Player const* player) const
{
std::vector<WorldPackets::Achievement::CriteriaProgress> criteriasProgress;
- if (!_criteriaProgress.empty())
+ for (auto const& [criteriaId, progress] : _criteriaProgress)
{
- for (std::pair<uint32 const, CriteriaProgress> const& progressPair : _criteriaProgress)
- {
- WorldPackets::Achievement::CriteriaProgress criteriaProgress;
- criteriaProgress.Id = progressPair.first;
- criteriaProgress.Quantity = progressPair.second.Counter;
- criteriaProgress.Date = progressPair.second.Date;
- criteriaProgress.Player = progressPair.second.PlayerGUID;
- criteriasProgress.push_back(criteriaProgress);
- }
+ WorldPackets::Achievement::CriteriaProgress& criteriaProgress = criteriasProgress.emplace_back();
+ criteriaProgress.Id = criteriaId;
+ criteriaProgress.Quantity = progress.Counter;
+ criteriaProgress.Date.SetUtcTimeFromUnixTime(progress.Date);
+ criteriaProgress.Date += player->GetSession()->GetTimezoneOffset();
+ criteriaProgress.Player = progress.PlayerGUID;
}
return criteriasProgress;
@@ -340,7 +353,7 @@ CriteriaList const& Scenario::GetCriteriaByType(CriteriaType type, uint32 /*asse
return sCriteriaMgr->GetScenarioCriteriaByTypeAndScenario(type, _data->Entry->ID);
}
-void Scenario::SendBootPlayer(Player* player)
+void Scenario::SendBootPlayer(Player const* player) const
{
WorldPackets::Scenario::ScenarioVacate scenarioBoot;
scenarioBoot.ScenarioGUID = _guid;