TrinityCore
Loading...
Searching...
No Matches
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 "Object.h"
22#include "Map.h"
23#include "MapInstanced.h"
24#include "GridStates.h"
25#include "MapUpdater.h"
26#include "UniqueTrackablePtr.h"
27#include <boost/dynamic_bitset.hpp>
28
29class Transport;
30struct TransportCreatureProto;
31
33{
34 public:
35 static MapManager* instance();
36
37 Map* CreateBaseMap(uint32 mapId);
38 Map* FindBaseNonInstanceMap(uint32 mapId) const;
39 Map* CreateMap(uint32 mapId, Player* player, uint32 loginInstanceId=0);
40 Map* FindMap(uint32 mapId, uint32 instanceId) const;
41
42 uint32 GetAreaId(uint32 phaseMask, uint32 mapid, float x, float y, float z) const
43 {
44 Map const* m = const_cast<MapManager*>(this)->CreateBaseMap(mapid);
45 return m->GetAreaId(phaseMask, x, y, z);
46 }
47 uint32 GetAreaId(uint32 phaseMask, uint32 mapid, Position const& pos) const { return GetAreaId(phaseMask, mapid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); }
48 uint32 GetAreaId(uint32 phaseMask, WorldLocation const& loc) const { return GetAreaId(phaseMask, loc.GetMapId(), loc); }
49 uint32 GetZoneId(uint32 phaseMask, uint32 mapid, float x, float y, float z) const
50 {
51 Map const* m = const_cast<MapManager*>(this)->CreateBaseMap(mapid);
52 return m->GetZoneId(phaseMask, x, y, z);
53 }
54 uint32 GetZoneId(uint32 phaseMask, uint32 mapid, Position const& pos) const { return GetZoneId(phaseMask, mapid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); }
55 uint32 GetZoneId(uint32 phaseMask, WorldLocation const& loc) const { return GetZoneId(phaseMask, loc.GetMapId(), loc); }
56 void GetZoneAndAreaId(uint32 phaseMask, uint32& zoneid, uint32& areaid, uint32 mapid, float x, float y, float z) const
57 {
58 Map const* m = const_cast<MapManager*>(this)->CreateBaseMap(mapid);
59 m->GetZoneAndAreaId(phaseMask, zoneid, areaid, x, y, z);
60 }
61 void GetZoneAndAreaId(uint32 phaseMask, uint32& zoneid, uint32& areaid, uint32 mapid, Position const& pos) const { GetZoneAndAreaId(phaseMask, zoneid, areaid, mapid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); }
62 void GetZoneAndAreaId(uint32 phaseMask, uint32& zoneid, uint32& areaid, WorldLocation const& loc) const { GetZoneAndAreaId(phaseMask, zoneid, areaid, loc.GetMapId(), loc); }
63
64 void Initialize(void);
65 void Update(uint32);
66
68 {
69 if (t < MIN_GRID_DELAY)
70 i_gridCleanUpDelay = MIN_GRID_DELAY;
71 else
72 i_gridCleanUpDelay = t;
73 }
74
76 {
79
80 i_timer.SetInterval(t);
81 i_timer.Reset();
82 }
83
84 //void LoadGrid(int mapid, int instId, float x, float y, WorldObject const* obj, bool no_unload = false);
85 void UnloadAll();
86
87 static bool ExistMapAndVMap(uint32 mapid, float x, float y);
88 static bool IsValidMAP(uint32 mapid, bool startUp);
89
90 static bool IsValidMapCoord(uint32 mapid, float x, float y)
91 {
92 return IsValidMAP(mapid, false) && Trinity::IsValidMapCoord(x, y);
93 }
94
95 static bool IsValidMapCoord(uint32 mapid, float x, float y, float z)
96 {
97 return IsValidMAP(mapid, false) && Trinity::IsValidMapCoord(x, y, z);
98 }
99
100 static bool IsValidMapCoord(uint32 mapid, float x, float y, float z, float o)
101 {
102 return IsValidMAP(mapid, false) && Trinity::IsValidMapCoord(x, y, z, o);
103 }
104
105 static bool IsValidMapCoord(uint32 mapid, Position const& pos)
106 {
107 return IsValidMapCoord(mapid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
108 }
109
110 static bool IsValidMapCoord(WorldLocation const& loc)
111 {
112 return IsValidMapCoord(loc.GetMapId(), loc);
113 }
114
115 void DoDelayedMovesAndRemoves();
116
117 Map::EnterState PlayerCannotEnter(uint32 mapid, Player* player, bool loginCheck = false);
118 void InitializeVisibilityDistanceInfo();
119
120 /* statistics */
121 uint32 GetNumInstances();
122 uint32 GetNumPlayersInInstances();
123
124 // Instance ID management
125 void InitInstanceIds();
126 uint32 GenerateInstanceId();
127 void RegisterInstanceId(uint32 instanceId);
128 void FreeInstanceId(uint32 instanceId);
129
130 MapUpdater * GetMapUpdater() { return &m_updater; }
131
132 template<typename Worker>
133 void DoForAllMaps(Worker&& worker);
134
135 template<typename Worker>
136 void DoForAllMapsWithMapId(uint32 mapId, Worker&& worker);
137
138 void IncreaseScheduledScriptsCount() { ++_scheduledScripts; }
139 void DecreaseScheduledScriptCount() { --_scheduledScripts; }
140 void DecreaseScheduledScriptCount(std::size_t count) { _scheduledScripts -= count; }
141 bool IsScriptScheduled() const { return _scheduledScripts > 0; }
142
143 private:
144 typedef std::unordered_map<uint32, Trinity::unique_trackable_ptr<Map>> MapMapType;
145 typedef boost::dynamic_bitset<size_t> InstanceIds;
146
147 MapManager();
148 ~MapManager();
149
150 Map* FindBaseMap(uint32 mapId) const
151 {
152 MapMapType::const_iterator iter = i_maps.find(mapId);
153 return (iter == i_maps.end() ? nullptr : iter->second.get());
154 }
155
156 MapManager(MapManager const&) = delete;
157 MapManager& operator=(MapManager const&) = delete;
158
159 std::mutex _mapsLock;
163
167
168 // atomic op counter for active scripts amount
169 std::atomic<std::size_t> _scheduledScripts;
170};
171
172template<typename Worker>
173void MapManager::DoForAllMaps(Worker&& worker)
174{
175 std::lock_guard<std::mutex> lock(_mapsLock);
176
177 for (auto& mapPair : i_maps)
178 {
179 Map* map = mapPair.second.get();
180 if (MapInstanced* mapInstanced = map->ToMapInstanced())
181 {
182 MapInstanced::InstancedMaps& instances = mapInstanced->GetInstancedMaps();
183 for (auto& instancePair : instances)
184 worker(instancePair.second.get());
185 }
186 else
187 worker(map);
188 }
189}
190
191template<typename Worker>
192inline void MapManager::DoForAllMapsWithMapId(uint32 mapId, Worker&& worker)
193{
194 std::lock_guard<std::mutex> lock(_mapsLock);
195
196 auto itr = i_maps.find(mapId);
197 if (itr != i_maps.end())
198 {
199 Map* map = itr->second.get();
200 if (MapInstanced* mapInstanced = map->ToMapInstanced())
201 {
202 MapInstanced::InstancedMaps& instances = mapInstanced->GetInstancedMaps();
203 for (auto& p : instances)
204 worker(p.second.get());
205 }
206 else
207 worker(map);
208 }
209}
210
211#define sMapMgr MapManager::instance()
212#endif
#define TC_GAME_API
Definition Define.h:114
uint32_t uint32
Definition Define.h:133
#define MIN_GRID_DELAY
Definition GridDefines.h:43
#define MIN_MAP_UPDATE_DELAY
Definition GridDefines.h:44
std::unordered_map< uint32, Trinity::unique_trackable_ptr< Map > > InstancedMaps
uint32 GetZoneId(uint32 phaseMask, uint32 mapid, float x, float y, float z) const
Definition MapManager.h:49
static bool IsValidMapCoord(uint32 mapid, float x, float y, float z, float o)
Definition MapManager.h:100
void DecreaseScheduledScriptCount(std::size_t count)
Definition MapManager.h:140
uint32 GetAreaId(uint32 phaseMask, uint32 mapid, float x, float y, float z) const
Definition MapManager.h:42
void DoForAllMapsWithMapId(uint32 mapId, Worker &&worker)
Definition MapManager.h:192
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition MapManager.h:105
void GetZoneAndAreaId(uint32 phaseMask, uint32 &zoneid, uint32 &areaid, uint32 mapid, float x, float y, float z) const
Definition MapManager.h:56
void SetMapUpdateInterval(uint32 t)
Definition MapManager.h:75
MapUpdater m_updater
Definition MapManager.h:166
void DecreaseScheduledScriptCount()
Definition MapManager.h:139
boost::dynamic_bitset< size_t > InstanceIds
Definition MapManager.h:145
static bool IsValidMapCoord(uint32 mapid, float x, float y)
Definition MapManager.h:90
MapManager & operator=(MapManager const &)=delete
Map * FindBaseMap(uint32 mapId) const
Definition MapManager.h:150
uint32 i_gridCleanUpDelay
Definition MapManager.h:160
void GetZoneAndAreaId(uint32 phaseMask, uint32 &zoneid, uint32 &areaid, uint32 mapid, Position const &pos) const
Definition MapManager.h:61
void IncreaseScheduledScriptsCount()
Definition MapManager.h:138
MapManager(MapManager const &)=delete
std::atomic< std::size_t > _scheduledScripts
Definition MapManager.h:169
void DoForAllMaps(Worker &&worker)
Definition MapManager.h:173
void SetGridCleanUpDelay(uint32 t)
Definition MapManager.h:67
std::unordered_map< uint32, Trinity::unique_trackable_ptr< Map > > MapMapType
Definition MapManager.h:144
void GetZoneAndAreaId(uint32 phaseMask, uint32 &zoneid, uint32 &areaid, WorldLocation const &loc) const
Definition MapManager.h:62
static bool IsValidMapCoord(WorldLocation const &loc)
Definition MapManager.h:110
MapUpdater * GetMapUpdater()
Definition MapManager.h:130
std::mutex _mapsLock
Definition MapManager.h:159
uint32 _nextInstanceId
Definition MapManager.h:165
uint32 GetZoneId(uint32 phaseMask, WorldLocation const &loc) const
Definition MapManager.h:55
uint32 GetZoneId(uint32 phaseMask, uint32 mapid, Position const &pos) const
Definition MapManager.h:54
MapMapType i_maps
Definition MapManager.h:161
uint32 GetAreaId(uint32 phaseMask, WorldLocation const &loc) const
Definition MapManager.h:48
bool IsScriptScheduled() const
Definition MapManager.h:141
IntervalTimer i_timer
Definition MapManager.h:162
InstanceIds _freeInstanceIds
Definition MapManager.h:164
uint32 GetAreaId(uint32 phaseMask, uint32 mapid, Position const &pos) const
Definition MapManager.h:47
static bool IsValidMapCoord(uint32 mapid, float x, float y, float z)
Definition MapManager.h:95
Definition Map.h:281
uint32 GetZoneId(uint32 phaseMask, float x, float y, float z) const
Definition Map.cpp:2617
void GetZoneAndAreaId(uint32 phaseMask, uint32 &zoneid, uint32 &areaid, float x, float y, float z) const
Definition Map.cpp:2627
uint32 GetAreaId(uint32 phaseMask, float x, float y, float z) const
Definition Map.cpp:2581
MapInstanced * ToMapInstanced()
Definition Map.h:517
EnterState
Definition Map.h:394
uint32 GetMapId() const
Definition Position.h:193
bool IsValidMapCoord(float c)
float GetPositionZ() const
Definition Position.h:81
float GetOrientation() const
Definition Position.h:82
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80