diff options
Diffstat (limited to 'src/server/game/Scenarios/Scenario.cpp')
-rw-r--r-- | src/server/game/Scenarios/Scenario.cpp | 87 |
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; |