AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
mmaps_commandscript Class Reference
Inheritance diagram for mmaps_commandscript:
CommandScript ScriptObject

Public Member Functions

 mmaps_commandscript ()
 
ChatCommandTable GetCommands () const override
 
- Public Member Functions inherited from ScriptObject
virtual bool IsDatabaseBound () const
 
virtual bool isAfterLoadScript () const
 
virtual void checkValidity ()
 
const std::string & GetName () const
 
uint16 GetTotalAvailableHooks ()
 

Static Public Member Functions

static bool HandleMmapPathCommand (ChatHandler *handler, Optional< std::string > param)
 
static bool HandleMmapLocCommand (ChatHandler *handler)
 
static bool HandleMmapLoadedTilesCommand (ChatHandler *handler)
 
static bool HandleMmapStatsCommand (ChatHandler *handler)
 
static bool HandleMmapTestArea (ChatHandler *handler)
 

Additional Inherited Members

- Protected Member Functions inherited from CommandScript
 CommandScript (const char *name)
 
- Protected Member Functions inherited from ScriptObject
 ScriptObject (const char *name, uint16 totalAvailableHooks=0)
 
virtual ~ScriptObject ()=default
 

Detailed Description

Constructor & Destructor Documentation

◆ mmaps_commandscript()

mmaps_commandscript::mmaps_commandscript ( )
inline
43: CommandScript("mmaps_commandscript") { }
Definition CommandScript.h:25

Member Function Documentation

◆ GetCommands()

ChatCommandTable mmaps_commandscript::GetCommands ( ) const
inlineoverridevirtual

Implements CommandScript.

46 {
47 static ChatCommandTable mmapCommandTable =
48 {
54 };
55
56 static ChatCommandTable commandTable =
57 {
58 { "mmap", mmapCommandTable }
59 };
60 return commandTable;
61 }
static bool HandleMmapPathCommand(ChatHandler *handler, Optional< std::string > param)
Definition cs_mmaps.cpp:63
static bool HandleMmapLoadedTilesCommand(ChatHandler *handler)
Definition cs_mmaps.cpp:229
static bool HandleMmapStatsCommand(ChatHandler *handler)
Definition cs_mmaps.cpp:254
static bool HandleMmapLocCommand(ChatHandler *handler)
Definition cs_mmaps.cpp:131
static bool HandleMmapTestArea(ChatHandler *handler)
Definition cs_mmaps.cpp:302
std::vector< ChatCommandBuilder > ChatCommandTable
Definition ChatCommand.h:46
@ RBAC_PERM_COMMAND_MMAP_LOC
Definition RBAC.h:369
@ RBAC_PERM_COMMAND_MMAP_TESTAREA
Definition RBAC.h:372
@ RBAC_PERM_COMMAND_MMAP_STATS
Definition RBAC.h:371
@ RBAC_PERM_COMMAND_MMAP_LOADEDTILES
Definition RBAC.h:368
@ RBAC_PERM_COMMAND_MMAP_PATH
Definition RBAC.h:370

References HandleMmapLoadedTilesCommand(), HandleMmapLocCommand(), HandleMmapPathCommand(), HandleMmapStatsCommand(), HandleMmapTestArea(), rbac::RBAC_PERM_COMMAND_MMAP_LOADEDTILES, rbac::RBAC_PERM_COMMAND_MMAP_LOC, rbac::RBAC_PERM_COMMAND_MMAP_PATH, rbac::RBAC_PERM_COMMAND_MMAP_STATS, and rbac::RBAC_PERM_COMMAND_MMAP_TESTAREA.

◆ HandleMmapLoadedTilesCommand()

static bool mmaps_commandscript::HandleMmapLoadedTilesCommand ( ChatHandler handler)
inlinestatic
230 {
231 Map* map = handler->GetSession()->GetPlayer()->GetMap();
232 dtNavMesh const* navmesh = map->GetMapCollisionData().GetMMapData().GetNavMesh();
233 dtNavMeshQuery const* navmeshquery = map->GetMapCollisionData().GetMMapData().GetNavMeshQuery();
234 if (!navmesh || !navmeshquery)
235 {
236 handler->PSendSysMessage("NavMesh not loaded for current map.");
237 return true;
238 }
239
240 handler->PSendSysMessage("mmap loadedtiles:");
241
242 for (int32 i = 0; i < navmesh->getMaxTiles(); ++i)
243 {
244 dtMeshTile const* tile = navmesh->getTile(i);
245 if (!tile || !tile->header)
246 continue;
247
248 handler->PSendSysMessage("[{}, {}]", tile->header->x, tile->header->y);
249 }
250
251 return true;
252 }
std::int32_t int32
Definition Define.h:103
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:219
WorldSession * GetSession()
Definition Chat.h:242
dtNavMesh const * GetNavMesh() const
Definition MapCollisionData.h:62
dtNavMeshQuery const * GetNavMeshQuery()
Definition MapCollisionData.cpp:177
MMapData & GetMMapData()
Definition MapCollisionData.h:86
Definition Map.h:166
MapCollisionData & GetMapCollisionData()
Definition Map.h:564
Map * GetMap() const
Definition Object.h:625
Player * GetPlayer() const
Definition WorldSession.h:454

References WorldObject::GetMap(), Map::GetMapCollisionData(), MapCollisionData::GetMMapData(), MMapData::GetNavMesh(), MMapData::GetNavMeshQuery(), WorldSession::GetPlayer(), ChatHandler::GetSession(), and ChatHandler::PSendSysMessage().

Referenced by GetCommands().

◆ HandleMmapLocCommand()

static bool mmaps_commandscript::HandleMmapLocCommand ( ChatHandler handler)
inlinestatic
132 {
133 handler->PSendSysMessage("mmap tileloc:");
134
135 // grid tile location
136 Player* player = handler->GetSession()->GetPlayer();
137
138 GridCoord const gridCoord = Acore::ComputeGridCoord(player->GetPositionX(), player->GetPositionY());
139
140 handler->PSendSysMessage("{}{}{}.mmtile", player->GetMapId(), gridCoord.x_coord, gridCoord.y_coord);
141
142 std::string fileName = Acore::StringFormat(MMAP::TILE_FILE_NAME_FORMAT, sConfigMgr->GetOption<std::string>("DataDir", "."), player->GetMapId(), gridCoord.x_coord, gridCoord.y_coord);
143 FILE* file = fopen(fileName.c_str(), "rb");
144 if (!file)
145 {
146 LOG_DEBUG("maps", "MMAP:loadMap: Could not open mmtile file '{}'", fileName);
147 return false;
148 }
149
150 // read header
151 MmapTileHeader fileHeader;
152 if (fread(&fileHeader, sizeof(MmapTileHeader), 1, file) != 1 || fileHeader.mmapMagic != MMAP_MAGIC)
153 {
154 LOG_ERROR("maps", "MMAP:loadMap: Bad header in mmap {:03}{:02}{:02}.mmtile", player->GetMapId(), gridCoord.x_coord, gridCoord.y_coord);
155 fclose(file);
156 return false;
157 }
158 fclose(file);
159 handler->PSendSysMessage("Recast config used:");
160 handler->PSendSysMessage("- walkableSlopeAngle: {}", fileHeader.recastConfig.walkableSlopeAngle);
161
162 const float cellHeight = fileHeader.recastConfig.cellSizeVertical;
163 handler->PSendSysMessage("- walkableHeight: {} ({} units)", fileHeader.recastConfig.walkableHeight * cellHeight, fileHeader.recastConfig.walkableHeight);
164 handler->PSendSysMessage("- walkableClimb: {} ({} units)", fileHeader.recastConfig.walkableClimb * cellHeight, fileHeader.recastConfig.walkableClimb);
165 handler->PSendSysMessage("- walkableRadius: {} ({} units)", fileHeader.recastConfig.walkableRadius * cellHeight, fileHeader.recastConfig.walkableRadius);
166
167 handler->PSendSysMessage("- maxSimplificationError: {}", fileHeader.recastConfig.maxSimplificationError);
168 handler->PSendSysMessage("- vertexPerMapEdge: {}", fileHeader.recastConfig.vertexPerMapEdge);
169 handler->PSendSysMessage("- vertexPerTileEdge: {}", fileHeader.recastConfig.vertexPerTileEdge);
170 handler->PSendSysMessage("- tilesPerMapEdge: {}", fileHeader.recastConfig.tilesPerMapEdge);
171 handler->PSendSysMessage("- baseUnitDim: {}", fileHeader.recastConfig.baseUnitDim);
172 handler->PSendSysMessage("- cellSizeHorizontal: {}", fileHeader.recastConfig.cellSizeHorizontal);
173 handler->PSendSysMessage("- cellSizeVertical: {}", fileHeader.recastConfig.cellSizeVertical);
174
175 handler->PSendSysMessage("gridloc [{}, {}]", gridCoord.x_coord, gridCoord.y_coord);
176
177 Map* map = handler->GetSession()->GetPlayer()->GetMap();
178
179 // calculate navmesh tile location
180 dtNavMesh const* navmesh = map->GetMapCollisionData().GetMMapData().GetNavMesh();
181 dtNavMeshQuery const* navmeshquery = map->GetMapCollisionData().GetMMapData().GetNavMeshQuery();
182 if (!navmesh || !navmeshquery)
183 {
184 handler->PSendSysMessage("NavMesh not loaded for current map.");
185 return true;
186 }
187
188 float const* min = navmesh->getParams()->orig;
189 float x, y, z;
190 player->GetPosition(x, y, z);
191 float location[VERTEX_SIZE] = {y, z, x};
192 float extents[VERTEX_SIZE] = {3.0f, 5.0f, 3.0f};
193
194 int32 tilex = int32((y - min[0]) / SIZE_OF_GRIDS);
195 int32 tiley = int32((x - min[2]) / SIZE_OF_GRIDS);
196
197 handler->PSendSysMessage("Calc [{}, {}]", tilex, tiley);
198
199 // navmesh poly -> navmesh tile location
201 dtPolyRef polyRef = INVALID_POLYREF;
202 if (dtStatusFailed(navmeshquery->findNearestPoly(location, extents, &filter, &polyRef, nullptr)))
203 {
204 handler->PSendSysMessage("Dt [??,??] (invalid poly, probably no tile loaded)");
205 return true;
206 }
207
208 if (polyRef == INVALID_POLYREF)
209 handler->PSendSysMessage("Dt [??, ??] (invalid poly, probably no tile loaded)");
210 else
211 {
212 dtMeshTile const* tile;
213 dtPoly const* poly;
214 if (dtStatusSucceed(navmesh->getTileAndPolyByRef(polyRef, &tile, &poly)))
215 {
216 if (tile)
217 {
218 handler->PSendSysMessage("Dt [{},{}]", tile->header->x, tile->header->y);
219 return false;
220 }
221 }
222
223 handler->PSendSysMessage("Dt [??,??] (no tile loaded)");
224 }
225
226 return true;
227 }
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
#define SIZE_OF_GRIDS
Definition MapDefines.h:26
#define MMAP_MAGIC
Definition MapDefines.h:28
#define VERTEX_SIZE
Definition PathGenerator.h:41
#define INVALID_POLYREF
Definition PathGenerator.h:42
Definition Player.h:1084
uint32 GetMapId() const
Definition Position.h:281
Definition DetourExtended.h:11
#define sConfigMgr
Definition Config.h:93
std::string StringFormat(FormatStringView fmt, Args &&... args)
Default AC string format function.
Definition StringFormat.h:44
GridCoord ComputeGridCoord(float x, float y)
Definition GridDefines.h:185
static char const *const TILE_FILE_NAME_FORMAT
Definition MMapMgr.h:49
Definition GridDefines.h:88
uint32 x_coord
Definition GridDefines.h:155
uint32 y_coord
Definition GridDefines.h:156
Definition MapDefines.h:65
MmapTileRecastConfig recastConfig
Definition MapDefines.h:73
uint32 mmapMagic
Definition MapDefines.h:66
uint8 walkableRadius
Definition MapDefines.h:35
float cellSizeHorizontal
Definition MapDefines.h:44
float baseUnitDim
Definition MapDefines.h:43
uint32 tilesPerMapEdge
Definition MapDefines.h:42
uint32 vertexPerMapEdge
Definition MapDefines.h:40
uint8 walkableClimb
Definition MapDefines.h:37
uint32 vertexPerTileEdge
Definition MapDefines.h:41
float cellSizeVertical
Definition MapDefines.h:45
uint8 walkableHeight
Definition MapDefines.h:36
float walkableSlopeAngle
Definition MapDefines.h:33
float maxSimplificationError
Definition MapDefines.h:46
float GetPositionX() const
Definition Position.h:121
void GetPosition(float &x, float &y) const
Definition Position.h:126
float GetPositionY() const
Definition Position.h:122

References MmapTileRecastConfig::baseUnitDim, MmapTileRecastConfig::cellSizeHorizontal, MmapTileRecastConfig::cellSizeVertical, Acore::ComputeGridCoord(), WorldObject::GetMap(), Map::GetMapCollisionData(), WorldLocation::GetMapId(), MapCollisionData::GetMMapData(), MMapData::GetNavMesh(), MMapData::GetNavMeshQuery(), WorldSession::GetPlayer(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), ChatHandler::GetSession(), INVALID_POLYREF, LOG_DEBUG, LOG_ERROR, MmapTileRecastConfig::maxSimplificationError, MMAP_MAGIC, MmapTileHeader::mmapMagic, ChatHandler::PSendSysMessage(), MmapTileHeader::recastConfig, sConfigMgr, SIZE_OF_GRIDS, Acore::StringFormat(), MMAP::TILE_FILE_NAME_FORMAT, MmapTileRecastConfig::tilesPerMapEdge, VERTEX_SIZE, MmapTileRecastConfig::vertexPerMapEdge, MmapTileRecastConfig::vertexPerTileEdge, MmapTileRecastConfig::walkableClimb, MmapTileRecastConfig::walkableHeight, MmapTileRecastConfig::walkableRadius, MmapTileRecastConfig::walkableSlopeAngle, CoordPair< LIMIT >::x_coord, and CoordPair< LIMIT >::y_coord.

Referenced by GetCommands().

◆ HandleMmapPathCommand()

static bool mmaps_commandscript::HandleMmapPathCommand ( ChatHandler handler,
Optional< std::string >  param 
)
inlinestatic
64 {
65 Map* map = handler->GetSession()->GetPlayer()->GetMap();
67 {
68 handler->PSendSysMessage("NavMesh not loaded for current map.");
69 return true;
70 }
71
72 handler->PSendSysMessage("mmap path:");
73
74 // units
75 Player* player = handler->GetSession()->GetPlayer();
76 Unit* target = handler->getSelectedUnit();
77 if (!player || !target)
78 {
79 handler->PSendSysMessage("Invalid target/source selection.");
80 return true;
81 }
82
83 bool useStraightPath = false;
84 bool useRaycast = false;
85 if (param)
86 {
87 auto paramValue = param.value();
88 if (paramValue.starts_with("true"))
89 {
90 useStraightPath = true;
91 }
92
93 if (paramValue.starts_with("line") || paramValue.starts_with("ray") || paramValue.starts_with("raycast"))
94 {
95 useRaycast = true;
96 }
97 }
98
99 // unit locations
100 float x, y, z;
101 player->GetPosition(x, y, z);
102
103 // path
104 PathGenerator path(target);
105 path.SetUseStraightPath(useStraightPath);
106 path.SetUseRaycast(useRaycast);
107 bool result = path.CalculatePath(x, y, z, false);
108
109 Movement::PointsArray const& pointPath = path.GetPath();
110 handler->PSendSysMessage("{}'s path to {}:", target->GetName(), player->GetName());
111 handler->PSendSysMessage("Building: {}", useStraightPath ? "StraightPath" : useRaycast ? "Raycast" : "SmoothPath");
112 handler->PSendSysMessage("Result: {} - Length: {} - Type: {}", (result ? "true" : "false"), pointPath.size(), path.GetPathType());
113
114 G3D::Vector3 const& start = path.GetStartPosition();
115 G3D::Vector3 const& end = path.GetEndPosition();
116 G3D::Vector3 const& actualEnd = path.GetActualEndPosition();
117
118 handler->PSendSysMessage("StartPosition ({}, {}, {})", start.x, start.y, start.z);
119 handler->PSendSysMessage("EndPosition ({}, {}, {})", end.x, end.y, end.z);
120 handler->PSendSysMessage("ActualEndPosition ({}, {}, {})", actualEnd.x, actualEnd.y, actualEnd.z);
121
122 if (!player->IsGameMaster())
123 handler->PSendSysMessage("Enable GM mode to see the path points.");
124
125 for (auto i : pointPath)
126 player->SummonCreature(VISUAL_WAYPOINT, i.x, i.y, i.z, 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
127
128 return true;
129 }
#define VISUAL_WAYPOINT
Definition MotionMaster.h:34
@ TEMPSUMMON_TIMED_DESPAWN
Definition Object.h:51
Unit * getSelectedUnit() const
Definition Chat.cpp:394
Definition PathGenerator.h:59
bool IsGameMaster() const
Definition Player.h:1174
Definition Unit.h:664
std::string const & GetName() const
Definition Object.h:528
std::vector< Vector3 > PointsArray
Definition MoveSplineInitArgs.h:28

References PathGenerator::CalculatePath(), PathGenerator::GetActualEndPosition(), PathGenerator::GetEndPosition(), WorldObject::GetMap(), Map::GetMapCollisionData(), MapCollisionData::GetMMapData(), WorldObject::GetName(), MMapData::GetNavMesh(), PathGenerator::GetPath(), PathGenerator::GetPathType(), WorldSession::GetPlayer(), Position::GetPosition(), ChatHandler::getSelectedUnit(), ChatHandler::GetSession(), PathGenerator::GetStartPosition(), Player::IsGameMaster(), ChatHandler::PSendSysMessage(), PathGenerator::SetUseRaycast(), PathGenerator::SetUseStraightPath(), WorldObject::SummonCreature(), TEMPSUMMON_TIMED_DESPAWN, and VISUAL_WAYPOINT.

Referenced by GetCommands().

◆ HandleMmapStatsCommand()

static bool mmaps_commandscript::HandleMmapStatsCommand ( ChatHandler handler)
inlinestatic
255 {
256 Map* map = handler->GetSession()->GetPlayer()->GetMap();
257
258 //handler->PSendSysMessage("mmap stats:");
259 //handler->PSendSysMessage(" global mmap pathfinding is {}abled", sDisableMgr->IsPathfindingEnabled(mapId) ? "en" : "dis");
260 //MMAP::MMapMgr* manager = MMAP::MMapFactory::createOrGetMMapMgr();
261 //handler->PSendSysMessage(" {} maps loaded with {} tiles overall", manager->getLoadedMapsCount(), manager->getLoadedTilesCount());
262
263 dtNavMesh const* navmesh = map->GetMapCollisionData().GetMMapData().GetNavMesh();
264 if (!navmesh)
265 {
266 handler->PSendSysMessage("NavMesh not loaded for current map.");
267 return true;
268 }
269
270 uint32 tileCount = 0;
271 uint32 nodeCount = 0;
272 uint32 polyCount = 0;
273 uint32 vertCount = 0;
274 uint32 triCount = 0;
275 uint32 triVertCount = 0;
276 uint32 dataSize = 0;
277 for (int32 i = 0; i < navmesh->getMaxTiles(); ++i)
278 {
279 dtMeshTile const* tile = navmesh->getTile(i);
280 if (!tile || !tile->header)
281 continue;
282
283 tileCount++;
284 nodeCount += tile->header->bvNodeCount;
285 polyCount += tile->header->polyCount;
286 vertCount += tile->header->vertCount;
287 triCount += tile->header->detailTriCount;
288 triVertCount += tile->header->detailVertCount;
289 dataSize += tile->dataSize;
290 }
291
292 handler->PSendSysMessage("Navmesh stats:");
293 handler->PSendSysMessage(" {} tiles loaded", tileCount);
294 handler->PSendSysMessage(" {} BVTree nodes", nodeCount);
295 handler->PSendSysMessage(" {} polygons ({} vertices)", polyCount, vertCount);
296 handler->PSendSysMessage(" {} triangles ({} vertices)", triCount, triVertCount);
297 handler->PSendSysMessage(" {} MB of data (not including pointers)", ((float)dataSize / sizeof(unsigned char)) / 1048576);
298
299 return true;
300 }
std::uint32_t uint32
Definition Define.h:107

References WorldObject::GetMap(), Map::GetMapCollisionData(), MapCollisionData::GetMMapData(), MMapData::GetNavMesh(), WorldSession::GetPlayer(), ChatHandler::GetSession(), and ChatHandler::PSendSysMessage().

Referenced by GetCommands().

◆ HandleMmapTestArea()

static bool mmaps_commandscript::HandleMmapTestArea ( ChatHandler handler)
inlinestatic
303 {
304 float radius = 40.0f;
305 WorldObject* object = handler->GetSession()->GetPlayer();
306
307 // Get Creatures
308 std::list<Creature*> creatureList;
309 Acore::AnyUnitInObjectRangeCheck go_check(object, radius);
310 Acore::CreatureListSearcher<Acore::AnyUnitInObjectRangeCheck> go_search(object, creatureList, go_check);
311 Cell::VisitObjects(object, go_search, radius);
312
313 if (!creatureList.empty())
314 {
315 handler->PSendSysMessage("Found {} Creatures.", creatureList.size());
316
317 uint32 paths = 0;
318 uint32 uStartTime = getMSTime();
319
320 float gx, gy, gz;
321 object->GetPosition(gx, gy, gz);
322 for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
323 {
324 PathGenerator path(*itr);
325 path.CalculatePath(gx, gy, gz);
326 ++paths;
327 }
328
329 uint32 uPathLoadTime = getMSTimeDiff(uStartTime, getMSTime());
330 handler->PSendSysMessage("Generated {} paths in {} ms", paths, uPathLoadTime);
331 }
332 else
333 handler->PSendSysMessage("No creatures in {} yard range.", radius);
334
335 return true;
336 }
uint32 getMSTime()
Definition Timer.h:103
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition Timer.h:110
Definition GridNotifiers.h:1030
Definition Object.h:475
Definition GridNotifiers.h:464
static void VisitObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:165

References PathGenerator::CalculatePath(), getMSTime(), getMSTimeDiff(), WorldSession::GetPlayer(), ChatHandler::GetSession(), ChatHandler::PSendSysMessage(), and Cell::VisitObjects().

Referenced by GetCommands().


The documentation for this class was generated from the following file: