TrinityCore
Loading...
Searching...
No Matches
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 "DB2Stores.h"
20#include "GameTime.h"
21#include "InstanceScript.h"
22#include "Map.h"
23#include "MapUtils.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}
32
34{
35 InstanceScript const* instanceScript = _map->ToInstanceMap()->GetInstanceScript();
36 if (!instanceScript)
37 return;
38
39 std::vector<CriteriaTree const*> criteriaTrees;
40
41 CriteriaList const& killCreatureCriteria = sCriteriaMgr->GetScenarioCriteriaByTypeAndScenario(CriteriaType::KillCreature, _data->Entry->ID);
42 if (!killCreatureCriteria.empty())
43 {
44 if (std::vector<InstanceSpawnGroupInfo> const* spawnGroups = sObjectMgr->GetInstanceSpawnGroupsForMap(_map->GetId()))
45 {
46 std::unordered_map<uint32, uint64> despawnedCreatureCountsById;
47 for (InstanceSpawnGroupInfo const& spawnGroup : *spawnGroups)
48 {
49 if (instanceScript->GetBossState(spawnGroup.BossStateId) != DONE)
50 continue;
51
52 bool isDespawned = !((1 << DONE) & spawnGroup.BossStates) || (spawnGroup.Flags & InstanceSpawnGroupInfo::FLAG_BLOCK_SPAWN);
53 if (isDespawned)
54 for (auto const& [spawnGroupId, spawn] : sObjectMgr->GetSpawnMetadataForGroup(spawnGroup.SpawnGroupId))
55 if (SpawnData const* spawnData = spawn->ToSpawnData())
56 ++despawnedCreatureCountsById[spawnData->id];
57 }
58
59 for (Criteria const* criteria : killCreatureCriteria)
60 {
61 // count creatures in despawned spawn groups
62 if (uint64* progress = Trinity::Containers::MapGetValuePtr(despawnedCreatureCountsById, criteria->Entry->Asset.CreatureID))
63 {
64 SetCriteriaProgress(criteria, *progress, nullptr, PROGRESS_SET);
65
66 if (CriteriaTreeList const* trees = sCriteriaMgr->GetCriteriaTreesByCriteria(criteria->ID))
67 for (CriteriaTree const* tree : *trees)
68 criteriaTrees.push_back(tree);
69 }
70 }
71 }
72 }
73
74 for (Criteria const* criteria : sCriteriaMgr->GetScenarioCriteriaByTypeAndScenario(CriteriaType::DefeatDungeonEncounter, _data->Entry->ID))
75 {
76 if (!instanceScript->IsEncounterCompleted(criteria->Entry->Asset.DungeonEncounterID))
77 continue;
78
79 SetCriteriaProgress(criteria, 1, nullptr, PROGRESS_SET);
80
81 if (CriteriaTreeList const* trees = sCriteriaMgr->GetCriteriaTreesByCriteria(criteria->ID))
82 for (CriteriaTree const* tree : *trees)
83 criteriaTrees.push_back(tree);
84 }
85
86 for (CriteriaTree const* tree : criteriaTrees)
87 {
88 ScenarioStepEntry const* step = tree->ScenarioStep;
89 if (!step)
90 continue;
91
94 }
95}
96
98{
99 return Trinity::StringFormat("Instance ID {}", _map->GetInstanceId());
100}
101
103{
104 _map->SendToPlayers(data);
105}
@ PROGRESS_SET
#define sCriteriaMgr
std::vector< Criteria const * > CriteriaList
std::vector< CriteriaTree const * > CriteriaTreeList
@ DefeatDungeonEncounter
uint64_t uint64
Definition Define.h:153
@ DONE
#define sObjectMgr
Definition ObjectMgr.h:1885
@ 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:890
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
void SendToPlayers(WorldPacket const *data) const
Definition Map.cpp:2688
uint32 GetId() const
Definition Map.cpp:3257
InstanceMap * ToInstanceMap()
Definition Map.h:490
uint32 GetInstanceId() const
Definition Map.h:350
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:37
std::string StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
Default TC string format function.
ScenarioEntry const * Entry
Definition ScenarioMgr.h:36
SpawnData const * ToSpawnData() const
Definition SpawnData.h:118