TrinityCore
MapManager.h
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#ifndef TRINITY_MAPMANAGER_H
19#define TRINITY_MAPMANAGER_H
20
21#include "GridDefines.h"
22#include "IteratorPair.h"
23#include "MapUpdater.h"
24#include "Position.h"
25#include "SharedDefines.h"
26#include "UniqueTrackablePtr.h"
27#include <boost/dynamic_bitset_fwd.hpp>
28#include <map>
29#include <shared_mutex>
30
31class Battleground;
32class BattlegroundMap;
33class GarrisonMap;
34class Group;
35class InstanceLock;
36class InstanceMap;
37class Map;
38class Player;
39enum Difficulty : uint8;
40
42{
43 MapManager();
45
46 public:
47 MapManager(MapManager const&) = delete;
49 MapManager& operator=(MapManager const&) = delete;
51
52 static MapManager* instance();
53
54 Map* CreateMap(uint32 mapId, Player* player);
55 Map* FindMap(uint32 mapId, uint32 instanceId) const;
56 uint32 FindInstanceIdForPlayer(uint32 mapId, Player const* player) const;
57
58 void Initialize();
59 void Update(uint32 diff);
60
62 {
63 if (t < MIN_GRID_DELAY)
64 i_gridCleanUpDelay = MIN_GRID_DELAY;
65 else
66 i_gridCleanUpDelay = t;
67 }
68
70 {
73
74 i_timer.SetInterval(t);
75 i_timer.Reset();
76 }
77
78 void UnloadAll();
79
80 static bool IsValidMAP(uint32 mapId);
81
82 static bool IsValidMapCoord(uint32 mapid, float x, float y)
83 {
84 return IsValidMAP(mapid) && Trinity::IsValidMapCoord(x, y);
85 }
86
87 static bool IsValidMapCoord(uint32 mapid, float x, float y, float z)
88 {
89 return IsValidMAP(mapid) && Trinity::IsValidMapCoord(x, y, z);
90 }
91
92 static bool IsValidMapCoord(uint32 mapid, float x, float y, float z, float o)
93 {
94 return IsValidMAP(mapid) && Trinity::IsValidMapCoord(x, y, z, o);
95 }
96
97 static bool IsValidMapCoord(uint32 mapid, Position const& pos)
98 {
99 return IsValidMapCoord(mapid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
100 }
101
102 static bool IsValidMapCoord(WorldLocation const& loc)
103 {
104 return IsValidMapCoord(loc.GetMapId(), loc);
105 }
106
107 void InitializeVisibilityDistanceInfo();
108
109 /* statistics */
110 uint32 GetNumInstances() const;
111 uint32 GetNumPlayersInInstances() const;
112
113 // Instance ID management
114 void InitInstanceIds();
115 uint32 GenerateInstanceId();
116 void RegisterInstanceId(uint32 instanceId);
117 void FreeInstanceId(uint32 instanceId);
118
119 MapUpdater * GetMapUpdater() { return &m_updater; }
120
121 template<typename Worker>
122 void DoForAllMaps(Worker&& worker);
123
124 template<typename Worker>
125 void DoForAllMapsWithMapId(uint32 mapId, Worker&& worker);
126
127 void IncreaseScheduledScriptsCount() { ++_scheduledScripts; }
128 void DecreaseScheduledScriptCount() { --_scheduledScripts; }
129 void DecreaseScheduledScriptCount(std::size_t count) { _scheduledScripts -= count; }
130 bool IsScriptScheduled() const { return _scheduledScripts > 0; }
131
132 void AddSC_BuiltInScripts();
133
134 private:
135 using MapKey = std::pair<uint32, uint32>;
136 typedef std::map<MapKey, Trinity::unique_trackable_ptr<Map>> MapMapType;
137 typedef boost::dynamic_bitset<size_t> InstanceIds;
138
139 Map* FindMap_i(uint32 mapId, uint32 instanceId) const;
140
141 Map* CreateWorldMap(uint32 mapId, uint32 instanceId);
142 InstanceMap* CreateInstance(uint32 mapId, uint32 instanceId, InstanceLock* instanceLock, Difficulty difficulty, TeamId team, Group* group);
143 BattlegroundMap* CreateBattleground(uint32 mapId, uint32 instanceId, Battleground* bg);
144 GarrisonMap* CreateGarrison(uint32 mapId, uint32 instanceId, Player* owner);
145
146 bool DestroyMap(Map* map);
147
148 mutable std::shared_mutex _mapsLock;
152
153 std::unique_ptr<InstanceIds> _freeInstanceIds;
156
157 // atomic op counter for active scripts amount
158 std::atomic<std::size_t> _scheduledScripts;
159};
160
161template<typename Worker>
162void MapManager::DoForAllMaps(Worker&& worker)
163{
164 std::shared_lock<std::shared_mutex> lock(_mapsLock);
165
166 for (auto const& [key, map] : i_maps)
167 worker(map.get());
168}
169
170template<typename Worker>
171void MapManager::DoForAllMapsWithMapId(uint32 mapId, Worker&& worker)
172{
173 std::shared_lock<std::shared_mutex> lock(_mapsLock);
174
176 i_maps.lower_bound({ mapId, 0 }),
177 i_maps.upper_bound({ mapId, std::numeric_limits<uint32>::max() })
178 );
179
180 for (auto const& [key, map] : range)
181 worker(map.get());
182}
183
184#define sMapMgr MapManager::instance()
185
186#endif
Difficulty
Definition: DBCEnums.h:873
#define TC_GAME_API
Definition: Define.h:123
uint8_t uint8
Definition: Define.h:144
uint32_t uint32
Definition: Define.h:142
#define MIN_GRID_DELAY
Definition: GridDefines.h:45
#define MIN_MAP_UPDATE_DELAY
Definition: GridDefines.h:46
TeamId
Definition: Group.h:197
std::unique_ptr< InstanceIds > _freeInstanceIds
Definition: MapManager.h:153
std::shared_mutex _mapsLock
Definition: MapManager.h:148
static bool IsValidMapCoord(uint32 mapid, float x, float y, float z, float o)
Definition: MapManager.h:92
void DecreaseScheduledScriptCount(std::size_t count)
Definition: MapManager.h:129
void DoForAllMapsWithMapId(uint32 mapId, Worker &&worker)
Definition: MapManager.h:171
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition: MapManager.h:97
void SetMapUpdateInterval(uint32 t)
Definition: MapManager.h:69
MapUpdater m_updater
Definition: MapManager.h:155
void DecreaseScheduledScriptCount()
Definition: MapManager.h:128
boost::dynamic_bitset< size_t > InstanceIds
Definition: MapManager.h:137
static bool IsValidMapCoord(uint32 mapid, float x, float y)
Definition: MapManager.h:82
MapManager & operator=(MapManager const &)=delete
uint32 i_gridCleanUpDelay
Definition: MapManager.h:149
void IncreaseScheduledScriptsCount()
Definition: MapManager.h:127
MapManager(MapManager &&)=delete
MapManager(MapManager const &)=delete
std::atomic< std::size_t > _scheduledScripts
Definition: MapManager.h:158
void DoForAllMaps(Worker &&worker)
Definition: MapManager.h:162
void SetGridCleanUpDelay(uint32 t)
Definition: MapManager.h:61
static bool IsValidMapCoord(WorldLocation const &loc)
Definition: MapManager.h:102
MapUpdater * GetMapUpdater()
Definition: MapManager.h:119
std::pair< uint32, uint32 > MapKey
Definition: MapManager.h:135
uint32 _nextInstanceId
Definition: MapManager.h:154
MapMapType i_maps
Definition: MapManager.h:150
std::map< MapKey, Trinity::unique_trackable_ptr< Map > > MapMapType
Definition: MapManager.h:136
bool IsScriptScheduled() const
Definition: MapManager.h:130
IntervalTimer i_timer
Definition: MapManager.h:151
MapManager & operator=(MapManager &&)=delete
static bool IsValidMapCoord(uint32 mapid, float x, float y, float z)
Definition: MapManager.h:87
Definition: Map.h:189
constexpr uint32 GetMapId() const
Definition: Position.h:201
constexpr IteratorPair< iterator, end_iterator > MakeIteratorPair(iterator first, end_iterator second)
Definition: IteratorPair.h:48
bool IsValidMapCoord(float c)
Definition: GridDefines.h:231
void Update(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:90
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr float GetOrientation() const
Definition: Position.h:79
constexpr float GetPositionZ() const
Definition: Position.h:78