TrinityCore
TerrainMgr.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 TERRAIN_MGR_H
19#define TERRAIN_MGR_H
20
21#include "Define.h"
22#include "GridDefines.h"
23#include "MapDefines.h"
24#include "Position.h"
25#include "Timer.h"
26#include <atomic>
27#include <bitset>
28#include <memory>
29#include <mutex>
30#include <unordered_map>
31#include <vector>
32
33class DynamicMapTree;
34class GridMap;
35class PhaseShift;
36
38{
39public:
40 explicit TerrainInfo(uint32 mapId);
41 TerrainInfo(TerrainInfo const&) = delete;
46
47 uint32 GetId() const { return _mapId; }
48 char const* GetMapName() const;
49
50 void DiscoverGridMapFiles();
51
52 static bool ExistMap(uint32 mapid, int32 gx, int32 gy, bool log = true);
53 static bool ExistVMap(uint32 mapid, int32 gx, int32 gy);
54
55 bool HasChildTerrainGridFile(uint32 mapId, int32 gx, int32 gy) const;
56 void AddChildTerrain(std::shared_ptr<TerrainInfo> childTerrain);
57
58 void LoadMapAndVMap(int32 gx, int32 gy);
59 void LoadMMapInstance(uint32 mapId, uint32 instanceId);
60
61private:
62 void LoadMapAndVMapImpl(int32 gx, int32 gy);
63 void LoadMMapInstanceImpl(uint32 mapId, uint32 instanceId);
64 void LoadMap(int32 gx, int32 gy);
65 void LoadVMap(int32 gx, int32 gy);
66 void LoadMMap(int32 gx, int32 gy);
67
68public:
69 void UnloadMap(int32 gx, int32 gy);
70 void UnloadMMapInstance(uint32 mapId, uint32 instanceId);
71
72private:
73 void UnloadMapImpl(int32 gx, int32 gy);
74 void UnloadMMapInstanceImpl(uint32 mapId, uint32 instanceId);
75
76 GridMap* GetGrid(uint32 mapId, float x, float y, bool loadIfMissing = true);
77
78public:
79 void CleanUpGrids(uint32 diff);
80
81 void GetFullTerrainStatusForPosition(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, PositionFullTerrainStatus& data, Optional<map_liquidHeaderTypeFlags> reqLiquidType = {}, float collisionHeight = 2.03128f, DynamicMapTree const* dynamicMapTree = nullptr); // DEFAULT_COLLISION_HEIGHT in Object.h
82 ZLiquidStatus GetLiquidStatus(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, Optional<map_liquidHeaderTypeFlags> ReqLiquidType = {}, LiquidData* data = nullptr, float collisionHeight = 2.03128f); // DEFAULT_COLLISION_HEIGHT in Object.h
83
84 bool GetAreaInfo(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, uint32& mogpflags, int32& adtId, int32& rootId, int32& groupId, DynamicMapTree const* dynamicMapTree = nullptr);
85 uint32 GetAreaId(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, DynamicMapTree const* dynamicMapTree = nullptr);
86 uint32 GetAreaId(PhaseShift const& phaseShift, uint32 mapId, Position const& pos, DynamicMapTree const* dynamicMapTree = nullptr) { return GetAreaId(phaseShift, mapId, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), dynamicMapTree); }
87 uint32 GetZoneId(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, DynamicMapTree const* dynamicMapTree = nullptr);
88 uint32 GetZoneId(PhaseShift const& phaseShift, uint32 mapId, Position const& pos, DynamicMapTree const* dynamicMapTree = nullptr) { return GetZoneId(phaseShift, mapId, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), dynamicMapTree); }
89 void GetZoneAndAreaId(PhaseShift const& phaseShift, uint32 mapId, uint32& zoneid, uint32& areaid, float x, float y, float z, DynamicMapTree const* dynamicMapTree = nullptr);
90 void GetZoneAndAreaId(PhaseShift const& phaseShift, uint32 mapId, uint32& zoneid, uint32& areaid, Position const& pos, DynamicMapTree const* dynamicMapTree = nullptr) { GetZoneAndAreaId(phaseShift, mapId, zoneid, areaid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), dynamicMapTree); }
91
92 float GetMinHeight(PhaseShift const& phaseShift, uint32 mapId, float x, float y);
93 float GetGridHeight(PhaseShift const& phaseShift, uint32 mapId, float x, float y);
94 float GetStaticHeight(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH);
95 float GetStaticHeight(PhaseShift const& phaseShift, uint32 mapId, Position const& pos, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) { return GetStaticHeight(phaseShift, mapId, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), checkVMap, maxSearchDist); }
96
97 float GetWaterLevel(PhaseShift const& phaseShift, uint32 mapId, float x, float y);
98 bool IsInWater(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, LiquidData* data = nullptr);
99 bool IsUnderWater(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z);
100
101 float GetWaterOrGroundLevel(PhaseShift const& phaseShift, uint32 mapId, float x, float y, float z, float* ground = nullptr, bool swim = false, float collisionHeight = 2.03128f, DynamicMapTree const* dynamicMapTree = nullptr); // DEFAULT_COLLISION_HEIGHT in Object.h
102
103private:
104 static constexpr int32 GetBitsetIndex(int32 gx, int32 gy) { return gx * MAX_NUMBER_OF_GRIDS + gy; }
105
107
109 std::vector<std::shared_ptr<TerrainInfo>> _childTerrain;
110
111 std::mutex _loadMutex;
112 std::unique_ptr<GridMap> _gridMap[MAX_NUMBER_OF_GRIDS][MAX_NUMBER_OF_GRIDS];
113 std::atomic<uint16> _referenceCountFromMap[MAX_NUMBER_OF_GRIDS][MAX_NUMBER_OF_GRIDS];
114 std::bitset<MAX_NUMBER_OF_GRIDS* MAX_NUMBER_OF_GRIDS> _loadedGrids;
115 std::bitset<MAX_NUMBER_OF_GRIDS* MAX_NUMBER_OF_GRIDS> _gridFileExists; // cache what grids are available for this map (not including parent/child maps)
116
117 static constexpr Milliseconds CleanupInterval = 1min;
118
119 // global garbage collection timer
121};
122
124{
127public:
128 TerrainMgr(TerrainMgr const&) = delete;
130 TerrainMgr& operator=(TerrainMgr const&) = delete;
132
133 static TerrainMgr& Instance();
134
135 void InitializeParentMapData(std::unordered_map<uint32, std::vector<uint32>> const& mapData);
136
137 std::shared_ptr<TerrainInfo> LoadTerrain(uint32 mapId);
138 void UnloadAll();
139
140 void Update(uint32 diff);
141
142 uint32 GetAreaId(PhaseShift const& phaseShift, uint32 mapid, float x, float y, float z);
143 uint32 GetAreaId(PhaseShift const& phaseShift, uint32 mapid, Position const& pos) { return GetAreaId(phaseShift, mapid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); }
144 uint32 GetAreaId(PhaseShift const& phaseShift, WorldLocation const& loc) { return GetAreaId(phaseShift, loc.GetMapId(), loc); }
145
146 uint32 GetZoneId(PhaseShift const& phaseShift, uint32 mapid, float x, float y, float z);
147 uint32 GetZoneId(PhaseShift const& phaseShift, uint32 mapid, Position const& pos) { return GetZoneId(phaseShift, mapid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); }
148 uint32 GetZoneId(PhaseShift const& phaseShift, WorldLocation const& loc) { return GetZoneId(phaseShift, loc.GetMapId(), loc); }
149
150 void GetZoneAndAreaId(PhaseShift const& phaseShift, uint32& zoneid, uint32& areaid, uint32 mapid, float x, float y, float z);
151 void GetZoneAndAreaId(PhaseShift const& phaseShift, uint32& zoneid, uint32& areaid, uint32 mapid, Position const& pos) { GetZoneAndAreaId(phaseShift, zoneid, areaid, mapid, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ()); }
152 void GetZoneAndAreaId(PhaseShift const& phaseShift, uint32& zoneid, uint32& areaid, WorldLocation const& loc) { GetZoneAndAreaId(phaseShift, zoneid, areaid, loc.GetMapId(), loc); }
153
154 static bool ExistMapAndVMap(uint32 mapid, float x, float y);
155
156private:
157 std::shared_ptr<TerrainInfo> LoadTerrainImpl(uint32 mapId);
158
159 std::unordered_map<uint32, std::weak_ptr<TerrainInfo>> _terrainMaps;
160
161 // parent map links
162 std::unordered_map<uint32, std::vector<uint32>> _parentMapData;
163};
164
165#define sTerrainMgr TerrainMgr::Instance()
166
167#endif // TERRAIN_MGR_H
#define TC_GAME_API
Definition: Define.h:123
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
#define DEFAULT_HEIGHT_SEARCH
Definition: GridDefines.h:63
#define MAX_NUMBER_OF_GRIDS
Definition: GridDefines.h:38
ZLiquidStatus
Definition: MapDefines.h:125
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
TerrainInfo & operator=(TerrainInfo &&)=delete
uint32 GetAreaId(PhaseShift const &phaseShift, uint32 mapId, Position const &pos, DynamicMapTree const *dynamicMapTree=nullptr)
Definition: TerrainMgr.h:86
uint32 GetId() const
Definition: TerrainMgr.h:47
float GetStaticHeight(PhaseShift const &phaseShift, uint32 mapId, Position const &pos, bool checkVMap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH)
Definition: TerrainMgr.h:95
std::mutex _loadMutex
Definition: TerrainMgr.h:111
TimeTracker _cleanupTimer
Definition: TerrainMgr.h:120
uint32 GetZoneId(PhaseShift const &phaseShift, uint32 mapId, Position const &pos, DynamicMapTree const *dynamicMapTree=nullptr)
Definition: TerrainMgr.h:88
TerrainInfo(TerrainInfo const &)=delete
std::bitset< MAX_NUMBER_OF_GRIDS *MAX_NUMBER_OF_GRIDS > _loadedGrids
Definition: TerrainMgr.h:114
TerrainInfo(TerrainInfo &&)=delete
TerrainInfo & operator=(TerrainInfo const &)=delete
std::vector< std::shared_ptr< TerrainInfo > > _childTerrain
Definition: TerrainMgr.h:109
std::bitset< MAX_NUMBER_OF_GRIDS *MAX_NUMBER_OF_GRIDS > _gridFileExists
Definition: TerrainMgr.h:115
uint32 _mapId
Definition: TerrainMgr.h:106
static constexpr int32 GetBitsetIndex(int32 gx, int32 gy)
Definition: TerrainMgr.h:104
TerrainInfo * _parentTerrain
Definition: TerrainMgr.h:108
void GetZoneAndAreaId(PhaseShift const &phaseShift, uint32 mapId, uint32 &zoneid, uint32 &areaid, Position const &pos, DynamicMapTree const *dynamicMapTree=nullptr)
Definition: TerrainMgr.h:90
uint32 GetAreaId(PhaseShift const &phaseShift, WorldLocation const &loc)
Definition: TerrainMgr.h:144
TerrainMgr(TerrainMgr const &)=delete
void GetZoneAndAreaId(PhaseShift const &phaseShift, uint32 &zoneid, uint32 &areaid, uint32 mapid, Position const &pos)
Definition: TerrainMgr.h:151
TerrainMgr & operator=(TerrainMgr const &)=delete
std::unordered_map< uint32, std::weak_ptr< TerrainInfo > > _terrainMaps
Definition: TerrainMgr.h:159
uint32 GetZoneId(PhaseShift const &phaseShift, uint32 mapid, Position const &pos)
Definition: TerrainMgr.h:147
uint32 GetAreaId(PhaseShift const &phaseShift, uint32 mapid, Position const &pos)
Definition: TerrainMgr.h:143
std::unordered_map< uint32, std::vector< uint32 > > _parentMapData
Definition: TerrainMgr.h:162
void GetZoneAndAreaId(PhaseShift const &phaseShift, uint32 &zoneid, uint32 &areaid, WorldLocation const &loc)
Definition: TerrainMgr.h:152
TerrainMgr & operator=(TerrainMgr &&)=delete
uint32 GetZoneId(PhaseShift const &phaseShift, WorldLocation const &loc)
Definition: TerrainMgr.h:148
TerrainMgr(TerrainMgr &&)=delete
constexpr uint32 GetMapId() const
Definition: Position.h:201
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 GetPositionZ() const
Definition: Position.h:78
std::unordered_map< uint32, std::vector< uint32 > > LoadMap(std::string const &locale, bool silent, int32 errorExitCode)