TrinityCore
InstanceScenario.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "InstanceScenario.h"
19#include "Containers.h"
20#include "DB2Stores.h"
21#include "GameTime.h"
22#include "InstanceScript.h"
23#include "Map.h"
24#include "ObjectMgr.h"
25#include "Player.h"
26#include "ScenarioMgr.h"
27#include "StringFormat.h"
28
29InstanceScenario::InstanceScenario(InstanceMap* map, ScenarioData const* scenarioData) : Scenario(map, scenarioData)
30{
31 ASSERT(_map);
33
34 Map::PlayerList const& players = map->GetPlayers();
35 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
36 if (Player* player = itr->GetSource()->ToPlayer())
37 SendScenarioState(player);
38}
39
41{
42 InstanceScript const* instanceScript = _map->ToInstanceMap()->GetInstanceScript();
43 if (!instanceScript)
44 return;
45
46 std::vector<CriteriaTree const*> criteriaTrees;
47
48 CriteriaList const& killCreatureCriteria = sCriteriaMgr->GetScenarioCriteriaByTypeAndScenario(CriteriaType::KillCreature, _data->Entry->ID);
49 if (!killCreatureCriteria.empty())
50 {
51 if (std::vector<InstanceSpawnGroupInfo> const* spawnGroups = sObjectMgr->GetInstanceSpawnGroupsForMap(_map->GetId()))
52 {
53 std::unordered_map<uint32, uint64> despawnedCreatureCountsById;
54 for (InstanceSpawnGroupInfo const& spawnGroup : *spawnGroups)
55 {
56 if (instanceScript->GetBossState(spawnGroup.BossStateId) != DONE)
57 continue;
58
59 bool isDespawned = !((1 << DONE) & spawnGroup.BossStates) || (spawnGroup.Flags & InstanceSpawnGroupInfo::FLAG_BLOCK_SPAWN);
60 if (isDespawned)
61 for (auto const& [spawnGroupId, spawn] : sObjectMgr->GetSpawnMetadataForGroup(spawnGroup.SpawnGroupId))
62 if (SpawnData const* spawnData = spawn->ToSpawnData())
63 ++despawnedCreatureCountsById[spawnData->id];
64 }
65
66 for (Criteria const* criteria : killCreatureCriteria)
67 {
68 // count creatures in despawned spawn groups
69 if (uint64* progress = Trinity::Containers::MapGetValuePtr(despawnedCreatureCountsById, criteria->Entry->Asset.CreatureID))
70 {
71 SetCriteriaProgress(criteria, *progress, nullptr, PROGRESS_SET);
72
73 if (CriteriaTreeList const* trees = sCriteriaMgr->GetCriteriaTreesByCriteria(criteria->ID))
74 for (CriteriaTree const* tree : *trees)
75 criteriaTrees.push_back(tree);
76 }
77 }
78 }
79 }
80
81 for (Criteria const* criteria : sCriteriaMgr->GetScenarioCriteriaByTypeAndScenario(CriteriaType::DefeatDungeonEncounter, _data->Entry->ID))
82 {
83 if (!instanceScript->IsEncounterCompleted(criteria->Entry->Asset.DungeonEncounterID))
84 continue;
85
86 SetCriteriaProgress(criteria, 1, nullptr, PROGRESS_SET);
87
88 if (CriteriaTreeList const* trees = sCriteriaMgr->GetCriteriaTreesByCriteria(criteria->ID))
89 for (CriteriaTree const* tree : *trees)
90 criteriaTrees.push_back(tree);
91 }
92
93 for (CriteriaTree const* tree : criteriaTrees)
94 {
95 ScenarioStepEntry const* step = tree->ScenarioStep;
96 if (!step)
97 continue;
98
101 }
102}
103
105{
106 return Trinity::StringFormat("Instance ID {}", _map->GetInstanceId());
107}
108
110{
111 _map->SendToPlayers(data);
112}
@ PROGRESS_SET
#define sCriteriaMgr
std::vector< Criteria const * > CriteriaList
std::vector< CriteriaTree const * > CriteriaTreeList
@ DefeatDungeonEncounter
uint64_t uint64
Definition: Define.h:141
#define ASSERT
Definition: Errors.h:68
@ DONE
#define sObjectMgr
Definition: ObjectMgr.h:1946
@ SCENARIO_STEP_DONE
Definition: Scenario.h:49
void SetCriteriaProgress(Criteria const *criteria, uint64 changeValue, Player *referencePlayer, ProgressType progressType=PROGRESS_SET)
bool IsCompletedCriteriaTree(CriteriaTree const *tree)
InstanceScript * GetInstanceScript()
Definition: Map.h:870
InstanceScenario(InstanceMap *map, ScenarioData const *scenarioData)
void SendPacket(WorldPacket const *data) const override
std::string GetOwnerInfo() const override
EncounterState GetBossState(uint32 id) const
bool IsEncounterCompleted(uint32 dungeonEncounterId) const
iterator end()
Definition: MapRefManager.h:35
iterator begin()
Definition: MapRefManager.h:34
void SendToPlayers(WorldPacket const *data) const
Definition: Map.cpp:2690
uint32 GetId() const
Definition: Map.cpp:3228
InstanceMap * ToInstanceMap()
Definition: Map.h:454
uint32 GetInstanceId() const
Definition: Map.h:314
PlayerList const & GetPlayers() const
Definition: Map.h:367
static Player * ToPlayer(Object *o)
Definition: Object.h:213
void SendScenarioState(Player const *player) const
Definition: Scenario.cpp:307
ScenarioData const * _data
Definition: Scenario.h:103
Map const * _map
Definition: Scenario.h:81
void SetStepState(ScenarioStepEntry const *step, ScenarioStepState state)
Definition: Scenario.h:70
auto MapGetValuePtr(M &map, typename M::key_type const &key)
Definition: MapUtils.h:29
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
Definition: StringFormat.h:38
ScenarioEntry const * Entry
Definition: ScenarioMgr.h:35
SpawnData const * ToSpawnData() const
Definition: SpawnData.h:90