From eae627f75287493ee12744af51112d43a8aaa10b Mon Sep 17 00:00:00 2001 From: Venugh Date: Mon, 9 Apr 2012 14:51:03 +0200 Subject: Core: + add mmaps files. + add the generator for movement. --- src/server/collision/Management/MMapManager.cpp | 301 ++++++++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 src/server/collision/Management/MMapManager.cpp (limited to 'src/server/collision/Management/MMapManager.cpp') diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp new file mode 100644 index 00000000000..aac5647a6de --- /dev/null +++ b/src/server/collision/Management/MMapManager.cpp @@ -0,0 +1,301 @@ +/* + * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2005-2010 MaNGOS + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "MMapManager.h" +#include "Log.h" +#include "World.h" + +namespace MMAP +{ + // ######################## MMapManager ######################## + MMapManager::~MMapManager() + { + for (MMapDataSet::iterator i = loadedMMaps.begin(); i != loadedMMaps.end(); ++i) + delete i->second; + + // by now we should not have maps loaded + // if we had, tiles in MMapData->mmapLoadedTiles, their actual data is lost! + } + + bool MMapManager::loadMapData(uint32 mapId) + { + // we already have this map loaded? + if (loadedMMaps.find(mapId) != loadedMMaps.end()) + return true; + + // load and init dtNavMesh - read parameters from file + uint32 pathLen = sWorld->GetDataPath().length() + strlen("mmaps/%03i.mmap")+1; + char *fileName = new char[pathLen]; + snprintf(fileName, pathLen, (sWorld->GetDataPath()+"mmaps/%03i.mmap").c_str(), mapId); + + FILE* file = fopen(fileName, "rb"); + if (!file) + { + sLog->outDebug(LOG_FILTER_MAPS, "MMAP:loadMapData: Error: Could not open mmap file '%s'", fileName); + delete [] fileName; + return false; + } + + dtNavMeshParams params; + fread(¶ms, sizeof(dtNavMeshParams), 1, file); + fclose(file); + + dtNavMesh* mesh = dtAllocNavMesh(); + ASSERT(mesh); + if (DT_SUCCESS != mesh->init(¶ms)) + { + dtFreeNavMesh(mesh); + sLog->outError("MMAP:loadMapData: Failed to initialize dtNavMesh for mmap %03u from file %s", mapId, fileName); + delete [] fileName; + return false; + } + + delete [] fileName; + + sLog->outDetail("MMAP:loadMapData: Loaded %03i.mmap", mapId); + + // store inside our map list + MMapData* mmap_data = new MMapData(mesh); + mmap_data->mmapLoadedTiles.clear(); + + loadedMMaps.insert(std::pair(mapId, mmap_data)); + return true; + } + + uint32 MMapManager::packTileID(int32 x, int32 y) + { + return uint32(x << 16 | y); + } + + bool MMapManager::loadMap(uint32 mapId, int32 x, int32 y) + { + // make sure the mmap is loaded and ready to load tiles + if(!loadMapData(mapId)) + return false; + + // get this mmap data + MMapData* mmap = loadedMMaps[mapId]; + ASSERT(mmap->navMesh); + + // check if we already have this tile loaded + uint32 packedGridPos = packTileID(x, y); + if (mmap->mmapLoadedTiles.find(packedGridPos) != mmap->mmapLoadedTiles.end()) + { + //sLog->outError("MMAP:loadMap: Asked to load already loaded navmesh tile. %03u%02i%02i.mmtile", mapId, y, x); + return false; + } + + // load this tile :: mmaps/MMMXXYY.mmtile + uint32 pathLen = sWorld->GetDataPath().length() + strlen("mmaps/%03i%02i%02i.mmtile")+1; + char *fileName = new char[pathLen]; + // this change of y and x is needed because of mapbuilder.cpp (x and y are swapped there) so change it here so we dont need to re-extract. All swappes are done in other files. DONT CHANGE THIS! + snprintf(fileName, pathLen, (sWorld->GetDataPath()+"mmaps/%03i%02i%02i.mmtile").c_str(), mapId, y, x); + + FILE *file = fopen(fileName, "rb"); + if (!file) + { + sLog->outDebug(LOG_FILTER_MAPS, "MMAP:loadMap: Could not open mmtile file '%s'", fileName); + delete [] fileName; + return false; + } + delete [] fileName; + + // read header + MmapTileHeader fileHeader; + fread(&fileHeader, sizeof(MmapTileHeader), 1, file); + + if (fileHeader.mmapMagic != MMAP_MAGIC) + { + sLog->outError("MMAP:loadMap: Bad header in mmap %03u%02i%02i.mmtile", mapId, y, x); + return false; + } + + if (fileHeader.mmapVersion != MMAP_VERSION) + { + sLog->outError("MMAP:loadMap: %03u%02i%02i.mmtile was built with generator v%i, expected v%i", + mapId, x, y, fileHeader.mmapVersion, MMAP_VERSION); + return false; + } + + unsigned char* data = (unsigned char*)dtAlloc(fileHeader.size, DT_ALLOC_PERM); + ASSERT(data); + + size_t result = fread(data, fileHeader.size, 1, file); + if(!result) + { + sLog->outError("MMAP:loadMap: Bad header or data in mmap %03u%02i%02i.mmtile", mapId, y, x); + fclose(file); + return false; + } + + fclose(file); + + dtMeshHeader* header = (dtMeshHeader*)data; + dtTileRef tileRef = 0; + + // memory allocated for data is now managed by detour, and will be deallocated when the tile is removed + if (DT_SUCCESS == mmap->navMesh->addTile(data, fileHeader.size, DT_TILE_FREE_DATA, 0, &tileRef)) + { + mmap->mmapLoadedTiles.insert(std::pair(packedGridPos, tileRef)); + ++loadedTiles; + sLog->outDetail("MMAP:loadMap: Loaded mmtile %03i[%02i,%02i] into %03i[%02i,%02i]", mapId, y, x, mapId, header->x, header->y); + return true; + } + else + { + sLog->outError("MMAP:loadMap: Could not load %03u%02i%02i.mmtile into navmesh", mapId, y, x); + dtFree(data); + return false; + } + + return false; + } + + bool MMapManager::unloadMap(uint32 mapId, int32 x, int32 y) + { + // check if we have this map loaded + if (loadedMMaps.find(mapId) == loadedMMaps.end()) + { + // file may not exist, therefore not loaded + sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMap: Asked to unload not loaded navmesh map. %03u%02i%02i.mmtile", mapId, y, x); + return false; + } + + MMapData* mmap = loadedMMaps[mapId]; + + // check if we have this tile loaded + uint32 packedGridPos = packTileID(x, y); + if (mmap->mmapLoadedTiles.find(packedGridPos) == mmap->mmapLoadedTiles.end()) + { + // file may not exist, therefore not loaded + sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMap: Asked to unload not loaded navmesh tile. %03u%02i%02i.mmtile", mapId, y, x); + return false; + } + + dtTileRef tileRef = mmap->mmapLoadedTiles[packedGridPos]; + + // unload, and mark as non loaded + if (DT_SUCCESS != mmap->navMesh->removeTile(tileRef, NULL, NULL)) + { + // this is technically a memory leak + // if the grid is later reloaded, dtNavMesh::addTile will return error but no extra memory is used + // we cannot recover from this error - assert out + sLog->outError("MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, y, x); + ASSERT(false); + } + else + { + mmap->mmapLoadedTiles.erase(packedGridPos); + --loadedTiles; + sLog->outDetail("MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, y, x, mapId); + return true; + } + + return false; + } + + bool MMapManager::unloadMap(uint32 mapId) + { + if (loadedMMaps.find(mapId) == loadedMMaps.end()) + { + // file may not exist, therefore not loaded + sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMap: Asked to unload not loaded navmesh map %03u", mapId); + return false; + } + + // unload all tiles from given map + MMapData* mmap = loadedMMaps[mapId]; + for (MMapTileSet::iterator i = mmap->mmapLoadedTiles.begin(); i != mmap->mmapLoadedTiles.end(); ++i) + { + uint32 x = (i->first >> 16); + uint32 y = (i->first & 0x0000FFFF); + if (DT_SUCCESS != mmap->navMesh->removeTile(i->second, NULL, NULL)) + sLog->outError("MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, y, x); + else + { + --loadedTiles; + sLog->outDetail("MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, y, x, mapId); + } + } + + delete mmap; + loadedMMaps.erase(mapId); + sLog->outDetail("MMAP:unloadMap: Unloaded %03i.mmap", mapId); + + return true; + } + + bool MMapManager::unloadMapInstance(uint32 mapId, uint32 instanceId) + { + // check if we have this map loaded + if (loadedMMaps.find(mapId) == loadedMMaps.end()) + { + // file may not exist, therefore not loaded + sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMapInstance: Asked to unload not loaded navmesh map %03u", mapId); + return false; + } + + MMapData* mmap = loadedMMaps[mapId]; + if (mmap->navMeshQueries.find(instanceId) == mmap->navMeshQueries.end()) + { + sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMapInstance: Asked to unload not loaded dtNavMeshQuery mapId %03u instanceId %u", mapId, instanceId); + return false; + } + + dtNavMeshQuery* query = mmap->navMeshQueries[instanceId]; + + dtFreeNavMeshQuery(query); + mmap->navMeshQueries.erase(instanceId); + sLog->outDetail("MMAP:unloadMapInstance: Unloaded mapId %03u instanceId %u", mapId, instanceId); + + return true; + } + + dtNavMesh const* MMapManager::GetNavMesh(uint32 mapId) + { + if (loadedMMaps.find(mapId) == loadedMMaps.end()) + return NULL; + + return loadedMMaps[mapId]->navMesh; + } + + dtNavMeshQuery const* MMapManager::GetNavMeshQuery(uint32 mapId, uint32 instanceId) + { + if (loadedMMaps.find(mapId) == loadedMMaps.end()) + return NULL; + + MMapData* mmap = loadedMMaps[mapId]; + if (mmap->navMeshQueries.find(instanceId) == mmap->navMeshQueries.end()) + { + // allocate mesh query + dtNavMeshQuery* query = dtAllocNavMeshQuery(); + ASSERT(query); + if (DT_SUCCESS != query->init(mmap->navMesh, 1024)) + { + dtFreeNavMeshQuery(query); + sLog->outError("MMAP:GetNavMeshQuery: Failed to initialize dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId); + return NULL; + } + + sLog->outDetail("MMAP:GetNavMeshQuery: created dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId); + mmap->navMeshQueries.insert(std::pair(instanceId, query)); + } + + return mmap->navMeshQueries[instanceId]; + } +} \ No newline at end of file -- cgit v1.2.3 From 8368112f453cc20672943dac533da1ee8ff933a3 Mon Sep 17 00:00:00 2001 From: Venugh Date: Mon, 9 Apr 2012 18:05:35 +0200 Subject: Try to check existance of mmaps folder. --- src/server/collision/Management/MMapManager.cpp | 9 +++------ src/server/collision/Management/MMapManager.h | 2 +- src/server/game/Maps/Map.cpp | 2 +- src/server/game/World/World.cpp | 4 +++- 4 files changed, 8 insertions(+), 9 deletions(-) (limited to 'src/server/collision/Management/MMapManager.cpp') diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp index aac5647a6de..449abcb967d 100644 --- a/src/server/collision/Management/MMapManager.cpp +++ b/src/server/collision/Management/MMapManager.cpp @@ -82,10 +82,10 @@ namespace MMAP return uint32(x << 16 | y); } - bool MMapManager::loadMap(uint32 mapId, int32 x, int32 y) + bool MMapManager::loadMap(const std::string& basePath, uint32 mapId, int32 x, int32 y) { // make sure the mmap is loaded and ready to load tiles - if(!loadMapData(mapId)) + if (!loadMapData(mapId)) return false; // get this mmap data @@ -95,10 +95,7 @@ namespace MMAP // check if we already have this tile loaded uint32 packedGridPos = packTileID(x, y); if (mmap->mmapLoadedTiles.find(packedGridPos) != mmap->mmapLoadedTiles.end()) - { - //sLog->outError("MMAP:loadMap: Asked to load already loaded navmesh tile. %03u%02i%02i.mmtile", mapId, y, x); return false; - } // load this tile :: mmaps/MMMXXYY.mmtile uint32 pathLen = sWorld->GetDataPath().length() + strlen("mmaps/%03i%02i%02i.mmtile")+1; @@ -136,7 +133,7 @@ namespace MMAP ASSERT(data); size_t result = fread(data, fileHeader.size, 1, file); - if(!result) + if (!result) { sLog->outError("MMAP:loadMap: Bad header or data in mmap %03u%02i%02i.mmtile", mapId, y, x); fclose(file); diff --git a/src/server/collision/Management/MMapManager.h b/src/server/collision/Management/MMapManager.h index 8af452032d1..23b7d5fc6f8 100644 --- a/src/server/collision/Management/MMapManager.h +++ b/src/server/collision/Management/MMapManager.h @@ -61,7 +61,7 @@ namespace MMAP MMapManager() : loadedTiles(0) {} ~MMapManager(); - bool loadMap(uint32 mapId, int32 x, int32 y); + bool loadMap(const std::string& basePath, uint32 mapId, int32 x, int32 y); bool unloadMap(uint32 mapId, int32 x, int32 y); bool unloadMap(uint32 mapId); bool unloadMapInstance(uint32 mapId, uint32 instanceId); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index c3732769d04..a9fc3f3350f 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -124,7 +124,7 @@ bool Map::ExistVMap(uint32 mapid, int gx, int gy) void Map::LoadMMap(int gx, int gy) { // DONT CHANGE "gy" and "gx" - Its necessary ! - int mmapLoadResult = MMAP::MMapFactory::createOrGetMMapManager()->loadMap(GetId(), gy, gx); + int mmapLoadResult = MMAP::MMapFactory::createOrGetMMapManager()->loadMap((sWorld->GetDataPath() + "mmaps").c_str(), GetId(), gy, gx); switch (mmapLoadResult) { case MMAP::MMAP_LOAD_RESULT_OK: diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 90d4ce3604a..a5ec6be10d4 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1123,8 +1123,10 @@ void World::LoadConfigSettings(bool reload) sLog->outString("Using DataDir %s", m_dataPath.c_str()); } - m_bool_configs[CONFIG_VMAP_INDOOR_CHECK] = ConfigMgr::GetBoolDefault("vmap.enableIndoorCheck", 0); m_bool_configs[CONFIG_ENABLE_MMAPS] = ConfigMgr::GetBoolDefault("mmap.enablePathFinding", true); + sLog->outString("WORLD: MMap data directory is: %smmaps", m_dataPath.c_str()); + + m_bool_configs[CONFIG_VMAP_INDOOR_CHECK] = ConfigMgr::GetBoolDefault("vmap.enableIndoorCheck", 0); bool enableIndoor = ConfigMgr::GetBoolDefault("vmap.enableIndoorCheck", true); bool enableLOS = ConfigMgr::GetBoolDefault("vmap.enableLOS", true); bool enableHeight = ConfigMgr::GetBoolDefault("vmap.enableHeight", true); -- cgit v1.2.3 From 937518181f2513e4ef43700d5b856349ebb7c7e6 Mon Sep 17 00:00:00 2001 From: Subv Date: Fri, 24 Aug 2012 11:38:39 -0500 Subject: Core/Mmaps: Fixed build after last merge --- src/server/collision/Management/MMapManager.cpp | 30 +++++++++++----------- src/server/game/Maps/Map.cpp | 6 ++--- .../PathFinderMovementGenerator.cpp | 6 ++--- src/server/game/Movement/Spline/MoveSplineInit.cpp | 21 ++++++++++----- src/server/game/Movement/Spline/MoveSplineInit.h | 18 +------------ src/server/game/World/World.cpp | 4 +-- src/tools/mmaps_generator/TerrainBuilder.h | 2 +- 7 files changed, 40 insertions(+), 47 deletions(-) (limited to 'src/server/collision/Management/MMapManager.cpp') diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp index 449abcb967d..0222f1a5995 100644 --- a/src/server/collision/Management/MMapManager.cpp +++ b/src/server/collision/Management/MMapManager.cpp @@ -60,14 +60,14 @@ namespace MMAP if (DT_SUCCESS != mesh->init(¶ms)) { dtFreeNavMesh(mesh); - sLog->outError("MMAP:loadMapData: Failed to initialize dtNavMesh for mmap %03u from file %s", mapId, fileName); + sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMapData: Failed to initialize dtNavMesh for mmap %03u from file %s", mapId, fileName); delete [] fileName; return false; } delete [] fileName; - sLog->outDetail("MMAP:loadMapData: Loaded %03i.mmap", mapId); + sLog->outInfo(LOG_FILTER_MAPS, "MMAP:loadMapData: Loaded %03i.mmap", mapId); // store inside our map list MMapData* mmap_data = new MMapData(mesh); @@ -118,13 +118,13 @@ namespace MMAP if (fileHeader.mmapMagic != MMAP_MAGIC) { - sLog->outError("MMAP:loadMap: Bad header in mmap %03u%02i%02i.mmtile", mapId, y, x); + sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMap: Bad header in mmap %03u%02i%02i.mmtile", mapId, y, x); return false; } if (fileHeader.mmapVersion != MMAP_VERSION) { - sLog->outError("MMAP:loadMap: %03u%02i%02i.mmtile was built with generator v%i, expected v%i", + sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMap: %03u%02i%02i.mmtile was built with generator v%i, expected v%i", mapId, x, y, fileHeader.mmapVersion, MMAP_VERSION); return false; } @@ -135,7 +135,7 @@ namespace MMAP size_t result = fread(data, fileHeader.size, 1, file); if (!result) { - sLog->outError("MMAP:loadMap: Bad header or data in mmap %03u%02i%02i.mmtile", mapId, y, x); + sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMap: Bad header or data in mmap %03u%02i%02i.mmtile", mapId, y, x); fclose(file); return false; } @@ -150,12 +150,12 @@ namespace MMAP { mmap->mmapLoadedTiles.insert(std::pair(packedGridPos, tileRef)); ++loadedTiles; - sLog->outDetail("MMAP:loadMap: Loaded mmtile %03i[%02i,%02i] into %03i[%02i,%02i]", mapId, y, x, mapId, header->x, header->y); + sLog->outInfo(LOG_FILTER_MAPS, "MMAP:loadMap: Loaded mmtile %03i[%02i,%02i] into %03i[%02i,%02i]", mapId, y, x, mapId, header->x, header->y); return true; } else { - sLog->outError("MMAP:loadMap: Could not load %03u%02i%02i.mmtile into navmesh", mapId, y, x); + sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMap: Could not load %03u%02i%02i.mmtile into navmesh", mapId, y, x); dtFree(data); return false; } @@ -192,14 +192,14 @@ namespace MMAP // this is technically a memory leak // if the grid is later reloaded, dtNavMesh::addTile will return error but no extra memory is used // we cannot recover from this error - assert out - sLog->outError("MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, y, x); + sLog->outError(LOG_FILTER_MAPS, "MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, y, x); ASSERT(false); } else { mmap->mmapLoadedTiles.erase(packedGridPos); --loadedTiles; - sLog->outDetail("MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, y, x, mapId); + sLog->outInfo(LOG_FILTER_MAPS, "MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, y, x, mapId); return true; } @@ -222,17 +222,17 @@ namespace MMAP uint32 x = (i->first >> 16); uint32 y = (i->first & 0x0000FFFF); if (DT_SUCCESS != mmap->navMesh->removeTile(i->second, NULL, NULL)) - sLog->outError("MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, y, x); + sLog->outError(LOG_FILTER_MAPS, "MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, y, x); else { --loadedTiles; - sLog->outDetail("MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, y, x, mapId); + sLog->outInfo(LOG_FILTER_MAPS, "MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, y, x, mapId); } } delete mmap; loadedMMaps.erase(mapId); - sLog->outDetail("MMAP:unloadMap: Unloaded %03i.mmap", mapId); + sLog->outInfo(LOG_FILTER_MAPS, "MMAP:unloadMap: Unloaded %03i.mmap", mapId); return true; } @@ -258,7 +258,7 @@ namespace MMAP dtFreeNavMeshQuery(query); mmap->navMeshQueries.erase(instanceId); - sLog->outDetail("MMAP:unloadMapInstance: Unloaded mapId %03u instanceId %u", mapId, instanceId); + sLog->outInfo(LOG_FILTER_MAPS, "MMAP:unloadMapInstance: Unloaded mapId %03u instanceId %u", mapId, instanceId); return true; } @@ -285,11 +285,11 @@ namespace MMAP if (DT_SUCCESS != query->init(mmap->navMesh, 1024)) { dtFreeNavMeshQuery(query); - sLog->outError("MMAP:GetNavMeshQuery: Failed to initialize dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId); + sLog->outError(LOG_FILTER_MAPS, "MMAP:GetNavMeshQuery: Failed to initialize dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId); return NULL; } - sLog->outDetail("MMAP:GetNavMeshQuery: created dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId); + sLog->outInfo(LOG_FILTER_MAPS, "MMAP:GetNavMeshQuery: created dtNavMeshQuery for mapId %03u instanceId %u", mapId, instanceId); mmap->navMeshQueries.insert(std::pair(instanceId, query)); } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 80668d23ed8..c960d8123fe 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -126,10 +126,10 @@ void Map::LoadMMap(int gx, int gy) // DONT CHANGE "gy" and "gx" - Its necessary ! bool mmapLoadResult = MMAP::MMapFactory::createOrGetMMapManager()->loadMap((sWorld->GetDataPath() + "mmaps").c_str(), GetId(), gy, gx); - if (result) - sLog->outDetail("MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); + if (mmapLoadResult) + sLog->outInfo(LOG_FILTER_MAPS, "MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); else - sLog->outDetail("Could not load MMAP name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); + sLog->outInfo(LOG_FILTER_MAPS, "Could not load MMAP name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); } void Map::LoadVMap(int gx, int gy) diff --git a/src/server/game/Movement/MovementGenerators/PathFinderMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/PathFinderMovementGenerator.cpp index 82dcbc07648..8988aa599da 100644 --- a/src/server/game/Movement/MovementGenerators/PathFinderMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PathFinderMovementGenerator.cpp @@ -88,7 +88,7 @@ bool PathFinderMovementGenerator::calculate(float destX, float destY, float dest { // our target is not moving - we just coming closer // we are moving on precalculated path - enjoy the ride - sLog->outStaticDebug("++ PathFinderMovementGenerator::calculate:: precalculated path\n"); + sLog->outDebug(LOG_FILTER_MAPS, "++ PathFinderMovementGenerator::calculate:: precalculated path\n"); m_pathPoints.erase(m_pathPoints.begin()); return false; @@ -367,7 +367,7 @@ void PathFinderMovementGenerator::BuildPolyPath(const Vector3 &startPos, const V // this is probably an error state, but we'll leave it // and hopefully recover on the next Update // we still need to copy our preffix - sLog->outError("%u's Path Build failed: 0 length path", m_sourceUnit->GetGUIDLow()); + sLog->outError(LOG_FILTER_MAPS, "%u's Path Build failed: 0 length path", m_sourceUnit->GetGUIDLow()); } sLog->outDebug(LOG_FILTER_MAPS, "++ m_polyLength=%u prefixPolyLength=%u suffixPolyLength=%u \n",m_polyLength, prefixPolyLength, suffixPolyLength); @@ -399,7 +399,7 @@ void PathFinderMovementGenerator::BuildPolyPath(const Vector3 &startPos, const V if (!m_polyLength || dtResult != DT_SUCCESS) { // only happens if we passed bad data to findPath(), or navmesh is messed up - sLog->outError("%u's Path Build failed: 0 length path", m_sourceUnit->GetGUIDLow()); + sLog->outError(LOG_FILTER_MAPS, "%u's Path Build failed: 0 length path", m_sourceUnit->GetGUIDLow()); BuildShortcut(); m_type = PATHFIND_NOPATH; return; diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index 5fca373503e..7452efc94ca 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -79,7 +79,7 @@ namespace Movement // should i do the things that user should do? - no. if (args.path.empty()) - return; + return 0; // corrent first vertex args.path[0] = real_position; @@ -148,12 +148,21 @@ namespace Movement args.flags.EnableFacingAngle(); } - void MoveSplineInit::MoveTo(Vector3 const& dest) + void MoveSplineInit::MoveTo(const Vector3& dest, bool generatePath, bool forceDestination) { - args.path_Idx_offset = 0; - args.path.resize(2); - TransportPathTransform transform(unit, args.TransformForTransport); - args.path[1] = transform(dest); + if (generatePath) + { + PathFinderMovementGenerator path(&unit); + path.calculate(dest.x, dest.y, dest.z, forceDestination); + MovebyPath(path.getPath()); + } + else + { + args.path_Idx_offset = 0; + args.path.resize(2); + TransportPathTransform transform(unit, args.TransformForTransport); + args.path[1] = transform(dest); + } } Vector3 TransportPathTransform::operator()(Vector3 input) diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index 740914c59db..9130d2827e6 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -161,26 +161,10 @@ namespace Movement inline void MoveSplineInit::MoveTo(float x, float y, float z, bool generatePath, bool forceDestination) { - Vector3 v(x,y,z); + Vector3 v(x, y, z); MoveTo(v, generatePath, forceDestination); } - inline void MoveSplineInit::MoveTo(const Vector3& dest, bool generatePath, bool forceDestination) - { - if (generatePath) - { - PathFinderMovementGenerator path(&unit); - path.calculate(dest.x, dest.y, dest.z, forceDestination); - MovebyPath(path.getPath()); - } - else - { - args.path_Idx_offset = 0; - args.path.resize(2); - args.path[1] = dest; - } - } - inline void MoveSplineInit::SetParabolic(float amplitude, float time_shift) { args.time_perc = time_shift; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 0d55d7a52e8..dee1b6dcdb8 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1125,8 +1125,8 @@ void World::LoadConfigSettings(bool reload) } m_bool_configs[CONFIG_ENABLE_MMAPS] = ConfigMgr::GetBoolDefault("mmap.enablePathFinding", true); - sLog->outString("WORLD: MMap data directory is: %smmaps", m_dataPath.c_str()); - MMap::MMapFactory::preventPathfindingOnMaps(ConfigMgr::GetStringDefault("mmap.ignoreMapIds", "").c_str()); + sLog->outInfo(LOG_FILTER_SERVER_LOADING, "WORLD: MMap data directory is: %smmaps", m_dataPath.c_str()); + MMAP::MMapFactory::preventPathfindingOnMaps(ConfigMgr::GetStringDefault("mmap.ignoreMapIds", "").c_str()); m_bool_configs[CONFIG_VMAP_INDOOR_CHECK] = ConfigMgr::GetBoolDefault("vmap.enableIndoorCheck", 0); bool enableIndoor = ConfigMgr::GetBoolDefault("vmap.enableIndoorCheck", true); diff --git a/src/tools/mmaps_generator/TerrainBuilder.h b/src/tools/mmaps_generator/TerrainBuilder.h index a7f21883af2..6d478753279 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.h +++ b/src/tools/mmaps_generator/TerrainBuilder.h @@ -62,7 +62,7 @@ namespace MMAP // see following files: // contrib/extractor/system.cpp // src/game/Map.cpp - static char const* MAP_VERSION_MAGIC = "v1.2"; + static char const* MAP_VERSION_MAGIC = "v1.3"; struct MeshData { -- cgit v1.2.3 From ccdca7774023e7570f17cf15456384b316322420 Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 5 Sep 2012 16:05:26 -0500 Subject: Core/Mmaps: Fixed unloading mmap tiles, the x and y were swapped. thanks to MaNGOS for original implementation, and thanks to @Chevron for noticing. --- src/server/collision/Management/MMapManager.cpp | 24 ++++++++++++------------ src/server/game/Maps/Map.cpp | 4 +--- 2 files changed, 13 insertions(+), 15 deletions(-) (limited to 'src/server/collision/Management/MMapManager.cpp') diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp index 0222f1a5995..8e6e2a3b6b4 100644 --- a/src/server/collision/Management/MMapManager.cpp +++ b/src/server/collision/Management/MMapManager.cpp @@ -100,8 +100,8 @@ namespace MMAP // load this tile :: mmaps/MMMXXYY.mmtile uint32 pathLen = sWorld->GetDataPath().length() + strlen("mmaps/%03i%02i%02i.mmtile")+1; char *fileName = new char[pathLen]; - // this change of y and x is needed because of mapbuilder.cpp (x and y are swapped there) so change it here so we dont need to re-extract. All swappes are done in other files. DONT CHANGE THIS! - snprintf(fileName, pathLen, (sWorld->GetDataPath()+"mmaps/%03i%02i%02i.mmtile").c_str(), mapId, y, x); + + snprintf(fileName, pathLen, (sWorld->GetDataPath()+"mmaps/%03i%02i%02i.mmtile").c_str(), mapId, x, y); FILE *file = fopen(fileName, "rb"); if (!file) @@ -118,7 +118,7 @@ namespace MMAP if (fileHeader.mmapMagic != MMAP_MAGIC) { - sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMap: Bad header in mmap %03u%02i%02i.mmtile", mapId, y, x); + sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMap: Bad header in mmap %03u%02i%02i.mmtile", mapId, x, y); return false; } @@ -135,7 +135,7 @@ namespace MMAP size_t result = fread(data, fileHeader.size, 1, file); if (!result) { - sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMap: Bad header or data in mmap %03u%02i%02i.mmtile", mapId, y, x); + sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMap: Bad header or data in mmap %03u%02i%02i.mmtile", mapId, x, y); fclose(file); return false; } @@ -150,12 +150,12 @@ namespace MMAP { mmap->mmapLoadedTiles.insert(std::pair(packedGridPos, tileRef)); ++loadedTiles; - sLog->outInfo(LOG_FILTER_MAPS, "MMAP:loadMap: Loaded mmtile %03i[%02i,%02i] into %03i[%02i,%02i]", mapId, y, x, mapId, header->x, header->y); + sLog->outInfo(LOG_FILTER_MAPS, "MMAP:loadMap: Loaded mmtile %03i[%02i,%02i] into %03i[%02i,%02i]", mapId, x, y, mapId, header->x, header->y); return true; } else { - sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMap: Could not load %03u%02i%02i.mmtile into navmesh", mapId, y, x); + sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMap: Could not load %03u%02i%02i.mmtile into navmesh", mapId, x, y); dtFree(data); return false; } @@ -169,7 +169,7 @@ namespace MMAP if (loadedMMaps.find(mapId) == loadedMMaps.end()) { // file may not exist, therefore not loaded - sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMap: Asked to unload not loaded navmesh map. %03u%02i%02i.mmtile", mapId, y, x); + sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMap: Asked to unload not loaded navmesh map. %03u%02i%02i.mmtile", mapId, x, y); return false; } @@ -180,7 +180,7 @@ namespace MMAP if (mmap->mmapLoadedTiles.find(packedGridPos) == mmap->mmapLoadedTiles.end()) { // file may not exist, therefore not loaded - sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMap: Asked to unload not loaded navmesh tile. %03u%02i%02i.mmtile", mapId, y, x); + sLog->outDebug(LOG_FILTER_MAPS, "MMAP:unloadMap: Asked to unload not loaded navmesh tile. %03u%02i%02i.mmtile", mapId, x, y); return false; } @@ -192,14 +192,14 @@ namespace MMAP // this is technically a memory leak // if the grid is later reloaded, dtNavMesh::addTile will return error but no extra memory is used // we cannot recover from this error - assert out - sLog->outError(LOG_FILTER_MAPS, "MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, y, x); + sLog->outError(LOG_FILTER_MAPS, "MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, x, y); ASSERT(false); } else { mmap->mmapLoadedTiles.erase(packedGridPos); --loadedTiles; - sLog->outInfo(LOG_FILTER_MAPS, "MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, y, x, mapId); + sLog->outInfo(LOG_FILTER_MAPS, "MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, x, y, mapId); return true; } @@ -222,11 +222,11 @@ namespace MMAP uint32 x = (i->first >> 16); uint32 y = (i->first & 0x0000FFFF); if (DT_SUCCESS != mmap->navMesh->removeTile(i->second, NULL, NULL)) - sLog->outError(LOG_FILTER_MAPS, "MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, y, x); + sLog->outError(LOG_FILTER_MAPS, "MMAP:unloadMap: Could not unload %03u%02i%02i.mmtile from navmesh", mapId, x, y); else { --loadedTiles; - sLog->outInfo(LOG_FILTER_MAPS, "MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, y, x, mapId); + sLog->outInfo(LOG_FILTER_MAPS, "MMAP:unloadMap: Unloaded mmtile %03i[%02i,%02i] from %03i", mapId, x, y, mapId); } } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index af139568ece..7e5a2ebb220 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -123,8 +123,7 @@ bool Map::ExistVMap(uint32 mapid, int gx, int gy) void Map::LoadMMap(int gx, int gy) { - // DONT CHANGE "gy" and "gx" - Its necessary ! - bool mmapLoadResult = MMAP::MMapFactory::createOrGetMMapManager()->loadMap((sWorld->GetDataPath() + "mmaps").c_str(), GetId(), gy, gx); + bool mmapLoadResult = MMAP::MMapFactory::createOrGetMMapManager()->loadMap((sWorld->GetDataPath() + "mmaps").c_str(), GetId(), gx, gy); if (mmapLoadResult) sLog->outInfo(LOG_FILTER_MAPS, "MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); @@ -1011,7 +1010,6 @@ bool Map::UnloadGrid(NGridType& ngrid, bool unloadAll) GridMaps[gx][gy]->unloadData(); delete GridMaps[gx][gy]; } - // x and y are swapped VMAP::VMapFactory::createOrGetVMapManager()->unloadMap(GetId(), gx, gy); MMAP::MMapFactory::createOrGetMMapManager()->unloadMap(GetId(), gx, gy); } -- cgit v1.2.3 From a2d533752c447a2bf4ef7b784e8abdbe3f6d6904 Mon Sep 17 00:00:00 2001 From: kaelima Date: Fri, 7 Sep 2012 04:21:11 +0200 Subject: Core/MMaps: Add several safety checks to confirm a valid path generation. - Address some issues in TargetMovementGenerator. Thanks Chevron --- src/server/collision/Management/MMapManager.cpp | 2 +- src/server/game/Entities/Object/Object.cpp | 2 +- .../ConfusedMovementGenerator.cpp | 4 +-- .../FleeingMovementGenerator.cpp | 4 +-- .../TargetedMovementGenerator.cpp | 41 +++++++++++----------- src/server/game/Movement/PathGenerator.cpp | 8 +++-- src/server/game/Movement/Spline/MoveSplineInit.cpp | 20 ++++++----- src/server/game/Spells/Spell.cpp | 5 +-- 8 files changed, 46 insertions(+), 40 deletions(-) (limited to 'src/server/collision/Management/MMapManager.cpp') diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp index 8e6e2a3b6b4..c7dea358d92 100644 --- a/src/server/collision/Management/MMapManager.cpp +++ b/src/server/collision/Management/MMapManager.cpp @@ -295,4 +295,4 @@ namespace MMAP return mmap->navMeshQueries[instanceId]; } -} \ No newline at end of file +} diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index fe5d32b9b95..2205efa8724 100755 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2780,7 +2780,7 @@ void WorldObject::MovePosition(Position &pos, float dist, float angle) desty = pos.m_positionY + dist * sin(angle); // Prevent invalid coordinates here, position is unchanged - if (!Trinity::IsValidMapCoord(destx, desty)) + if (!Trinity::IsValidMapCoord(destx, desty, pos.m_positionZ)) { sLog->outFatal(LOG_FILTER_GENERAL, "WorldObject::MovePosition invalid coordinates X: %f and Y: %f were passed!", destx, desty); return; diff --git a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp index 32c6ec3858d..4c269a1024a 100755 --- a/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/ConfusedMovementGenerator.cpp @@ -78,8 +78,8 @@ bool ConfusedMovementGenerator::Update(T* unit, const uint32& diff) PathGenerator path(unit); path.SetPathLengthLimit(30.0f); - path.CalculatePath(x, y, z); - if (path.GetPathType() & PATHFIND_NOPATH) + bool result = path.CalculatePath(x, y, z); + if (!result || path.GetPathType() & PATHFIND_NOPATH) { i_nextMoveTime.Reset(urand(800, 1000)); return true; diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp index 8f4d78b34b1..29466ab9670 100755 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp @@ -45,8 +45,8 @@ void FleeingMovementGenerator::_setTargetLocation(T* owner) PathGenerator path(owner); path.SetPathLengthLimit(30.0f); - path.CalculatePath(x, y, z); - if (path.GetPathType() & PATHFIND_NOPATH) + bool result = path.CalculatePath(x, y, z); + if (!result || path.GetPathType() & PATHFIND_NOPATH) { i_nextCheckTime.Reset(urand(1000, 1500)); return; diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 4a8d15b8079..145251ec4aa 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -35,30 +35,28 @@ void TargetedMovementGeneratorMedium::_setTargetLocation(T* owner) if (owner->HasUnitState(UNIT_STATE_NOT_MOVE)) return; + if (owner->GetTypeId() == TYPEID_UNIT && !i_target->isInAccessiblePlaceFor(owner->ToCreature())) + return; + float x, y, z; - //! Following block of code deleted by MrSmite in issue 4891 - //! Code kept for learning and diagnostical purposes -// -// if (i_offset && i_target->IsWithinDistInMap(&owner,2*i_offset)) -// { -// if (!owner.movespline->Finalized()) -// return; -// -// owner.GetPosition(x, y, z); -// } -// else + if (!i_offset) { - if (i_target->IsWithinMeleeRange(owner)) - return; + float dist = 0.0f; + + if (owner->getVictim() && owner->getVictim()->GetGUID() == i_target->GetGUID()) + dist = owner->GetFloatValue(UNIT_FIELD_COMBATREACH) + i_target->GetFloatValue(UNIT_FIELD_COMBATREACH) - i_target->GetObjectSize() - owner->GetObjectSize() - 1.0f; + + if (dist < 0.5f) + dist = 0.5f; - // to nearest random contact position - i_target->GetRandomContactPoint(owner, x, y, z, 0, MELEE_RANGE - 0.5f); + if (owner->IsWithinLOSInMap(owner->getVictim())) + i_target->GetContactPoint(owner, x, y, z, dist); + else + i_target->GetPosition(x, y, z); } else { - if (i_target->IsWithinDistInMap(owner, i_offset + 1.0f)) - return; // to at i_offset distance from target and i_angle from target facing i_target->GetClosePoint(x, y, z, owner->GetObjectSize(), i_offset, i_angle); } @@ -69,8 +67,9 @@ void TargetedMovementGeneratorMedium::_setTargetLocation(T* owner) // allow pets following their master to cheat while generating paths bool forceDest = (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()->isPet() && owner->HasUnitState(UNIT_STATE_FOLLOW)); - i_path->CalculatePath(x, y, z, forceDest); - if (i_path->GetPathType() & PATHFIND_NOPATH) + + bool result = i_path->CalculatePath(x, y, z, forceDest); + if (!result || i_path->GetPathType() & PATHFIND_NOPATH) return; D::_addUnitStateMove(owner); @@ -117,7 +116,7 @@ bool TargetedMovementGeneratorMedium::Update(T* owner, const uint32& time_d return false; if (!owner || !owner->isAlive()) - return true; + return false; if (owner->HasUnitState(UNIT_STATE_NOT_MOVE)) { @@ -154,7 +153,7 @@ bool TargetedMovementGeneratorMedium::Update(T* owner, const uint32& time_d else targetMoved = !i_target->IsWithinDist2d(dest.x, dest.y, allowed_dist); - if (targetMoved) + if (targetMoved || !owner->IsWithinLOSInMap(owner->getVictim())) _setTargetLocation(owner); } diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp index 165cc282e3a..68dd8f4057d 100644 --- a/src/server/game/Movement/PathGenerator.cpp +++ b/src/server/game/Movement/PathGenerator.cpp @@ -58,8 +58,12 @@ bool PathGenerator::CalculatePath(float destX, float destY, float destZ, bool fo if (!Trinity::IsValidMapCoord(destX, destY, destZ) || !Trinity::IsValidMapCoord(x, y, z)) return false; + float newDestZ = _sourceUnit->GetBaseMap()->GetHeight(_sourceUnit->GetPhaseMask(), x, y, z, true, MAX_FALL_DISTANCE); + if (newDestZ >= INVALID_HEIGHT) + return false; + Vector3 oldDest = GetEndPosition(); - Vector3 dest(destX, destY, destZ); + Vector3 dest(destX, destY, newDestZ); SetEndPosition(dest); Vector3 start(x, y, z); @@ -124,7 +128,7 @@ dtPolyRef PathGenerator::GetPathPolyByPosition(dtPolyRef const* polyPath, uint32 minDist3d = dtVdistSqr(point, closestPoint); } - if(minDist2d < 1.0f) // shortcut out - close enough for us + if (minDist2d < 1.0f) // shortcut out - close enough for us break; } diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index 2796e208e34..68201fcf275 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -153,16 +153,18 @@ namespace Movement if (generatePath) { PathGenerator path(unit); - path.CalculatePath(dest.x, dest.y, dest.z, forceDestination); - MovebyPath(path.GetPath()); - } - else - { - args.path_Idx_offset = 0; - args.path.resize(2); - TransportPathTransform transform(unit, args.TransformForTransport); - args.path[1] = transform(dest); + bool result = path.CalculatePath(dest.x, dest.y, dest.z, forceDestination); + if (result && path.GetPathType() & ~PATHFIND_NOPATH) + { + MovebyPath(path.GetPath()); + return; + } } + + args.path_Idx_offset = 0; + args.path.resize(2); + TransportPathTransform transform(unit, args.TransformForTransport); + args.path[1] = transform(dest); } Vector3 TransportPathTransform::operator()(Vector3 input) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index d9a3e6a4b3c..a701b9d143e 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5162,10 +5162,11 @@ SpellCastResult Spell::CheckCast(bool strict) target->GetFirstCollisionPosition(pos, CONTACT_DISTANCE, target->GetRelativeAngle(m_caster)); m_preGeneratedPath.SetPathLengthLimit(m_spellInfo->GetMaxRange(true) * 1.5f); - m_preGeneratedPath.CalculatePath(pos.m_positionX, pos.m_positionY, pos.m_positionZ + target->GetObjectSize()); - + bool result = m_preGeneratedPath.CalculatePath(pos.m_positionX, pos.m_positionY, pos.m_positionZ + target->GetObjectSize()); if (m_preGeneratedPath.GetPathType() & PATHFIND_SHORT) return SPELL_FAILED_OUT_OF_RANGE; + else if (!result) + return SPELL_FAILED_NOPATH; break; } -- cgit v1.2.3 From 5f15600e7a26170f0aacc77e9417df61db45a992 Mon Sep 17 00:00:00 2001 From: Spp Date: Wed, 9 Jan 2013 13:13:39 +0100 Subject: Core/Build: Fix linking and sooo many compile warnings --- src/server/collision/Management/MMapManager.cpp | 14 +- src/server/collision/Models/ModelInstance.h | 2 +- src/tools/map_extractor/adt.cpp | 21 +- src/tools/map_extractor/loadlib.cpp | 4 +- src/tools/map_extractor/loadlib/loadlib.h | 6 + src/tools/map_extractor/wdt.cpp | 12 +- src/tools/mesh_extractor/ADT.cpp | 4 +- src/tools/mesh_extractor/CMakeLists.txt | 3 +- src/tools/mesh_extractor/Cache.h | 4 +- src/tools/mesh_extractor/Chunk.cpp | 10 +- src/tools/mesh_extractor/ChunkedData.cpp | 3 +- src/tools/mesh_extractor/ContinentBuilder.cpp | 4 +- src/tools/mesh_extractor/ContinentBuilder.h | 8 +- src/tools/mesh_extractor/DBC.cpp | 22 +- src/tools/mesh_extractor/DoodadHandler.cpp | 6 +- src/tools/mesh_extractor/DoodadHandler.h | 14 +- src/tools/mesh_extractor/LiquidHandler.cpp | 10 +- src/tools/mesh_extractor/MapChunk.cpp | 3 +- src/tools/mesh_extractor/MeshExtractor.cpp | 36 ++- src/tools/mesh_extractor/Model.cpp | 9 +- src/tools/mesh_extractor/TileBuilder.cpp | 5 +- src/tools/mesh_extractor/Utils.cpp | 354 ++++++++++++++---------- src/tools/mesh_extractor/Utils.h | 4 +- src/tools/mesh_extractor/WDT.cpp | 11 +- src/tools/mesh_extractor/WorldModelGroup.cpp | 22 +- src/tools/mesh_extractor/WorldModelHandler.cpp | 20 +- src/tools/mmaps_generator/CMakeLists.txt | 2 +- src/tools/mmaps_generator/IntermediateValues.h | 2 +- src/tools/mmaps_generator/MapBuilder.cpp | 45 +-- src/tools/mmaps_generator/PathCommon.h | 2 +- src/tools/mmaps_generator/TerrainBuilder.cpp | 92 +++--- src/tools/mmaps_generator/TerrainBuilder.h | 1 - src/tools/mmaps_generator/VMapExtensions.cpp | 2 +- src/tools/vmap4_extractor/adtfile.cpp | 3 +- src/tools/vmap4_extractor/model.cpp | 4 +- src/tools/vmap4_extractor/vmapexport.cpp | 3 +- src/tools/vmap4_extractor/wmo.cpp | 4 +- 37 files changed, 468 insertions(+), 303 deletions(-) (limited to 'src/server/collision/Management/MMapManager.cpp') diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp index c7dea358d92..1b6cf5c0260 100644 --- a/src/server/collision/Management/MMapManager.cpp +++ b/src/server/collision/Management/MMapManager.cpp @@ -52,8 +52,14 @@ namespace MMAP } dtNavMeshParams params; - fread(¶ms, sizeof(dtNavMeshParams), 1, file); + int count = fread(¶ms, sizeof(dtNavMeshParams), 1, file); fclose(file); + if (count != 1) + { + sLog->outDebug(LOG_FILTER_MAPS, "MMAP:loadMapData: Error: Could not read params from file '%s'", fileName); + delete [] fileName; + return false; + } dtNavMesh* mesh = dtAllocNavMesh(); ASSERT(mesh); @@ -82,7 +88,7 @@ namespace MMAP return uint32(x << 16 | y); } - bool MMapManager::loadMap(const std::string& basePath, uint32 mapId, int32 x, int32 y) + bool MMapManager::loadMap(const std::string& /*basePath*/, uint32 mapId, int32 x, int32 y) { // make sure the mmap is loaded and ready to load tiles if (!loadMapData(mapId)) @@ -114,9 +120,7 @@ namespace MMAP // read header MmapTileHeader fileHeader; - fread(&fileHeader, sizeof(MmapTileHeader), 1, file); - - if (fileHeader.mmapMagic != MMAP_MAGIC) + if (fread(&fileHeader, sizeof(MmapTileHeader), 1, file) != 1 || fileHeader.mmapMagic != MMAP_MAGIC) { sLog->outError(LOG_FILTER_MAPS, "MMAP:loadMap: Bad header in mmap %03u%02i%02i.mmtile", mapId, x, y); return false; diff --git a/src/server/collision/Models/ModelInstance.h b/src/server/collision/Models/ModelInstance.h index 6d1b7c68bd5..f26089bb46c 100644 --- a/src/server/collision/Models/ModelInstance.h +++ b/src/server/collision/Models/ModelInstance.h @@ -75,7 +75,7 @@ namespace VMAP float iInvScale; WorldModel* iModel; public: - WorldModel* const getWorldModel(); + WorldModel* getWorldModel(); }; } // namespace VMAP diff --git a/src/tools/map_extractor/adt.cpp b/src/tools/map_extractor/adt.cpp index fde70681113..505813c4bd0 100644 --- a/src/tools/map_extractor/adt.cpp +++ b/src/tools/map_extractor/adt.cpp @@ -6,6 +6,13 @@ int holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888}; int holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000}; +u_map_fcc MHDRMagic = { {'M','H','D','R'} }; +u_map_fcc MCINMagic = { {'M','C','I','N'} }; +u_map_fcc MH20Magic = { {'M','H','2','0'} }; +u_map_fcc MCNKMagic = { {'M','C','N','K'} }; +u_map_fcc MCVTMagic = { {'M','C','V','T'} }; +u_map_fcc MCLQMagic = { {'M','C','L','Q'} }; + bool isHole(int holes, int i, int j) { int testi = i / 2; @@ -53,7 +60,7 @@ bool ADT_file::prepareLoadedData() bool adt_MHDR::prepareLoadedData() { - if (fcc != 'MHDR') + if (fcc != MHDRMagic.fcc) return false; if (size!=sizeof(adt_MHDR)-8) @@ -72,7 +79,7 @@ bool adt_MHDR::prepareLoadedData() bool adt_MCIN::prepareLoadedData() { - if (fcc != 'MCIN') + if (fcc != MCINMagic.fcc) return false; // Check cells data @@ -86,7 +93,7 @@ bool adt_MCIN::prepareLoadedData() bool adt_MH2O::prepareLoadedData() { - if (fcc != 'MH2O') + if (fcc != MH20Magic.fcc) return false; // Check liquid data @@ -98,7 +105,7 @@ bool adt_MH2O::prepareLoadedData() bool adt_MCNK::prepareLoadedData() { - if (fcc != 'MCNK') + if (fcc != MCNKMagic.fcc) return false; // Check height map @@ -113,7 +120,7 @@ bool adt_MCNK::prepareLoadedData() bool adt_MCVT::prepareLoadedData() { - if (fcc != 'MCVT') + if (fcc != MCVTMagic.fcc) return false; if (size != sizeof(adt_MCVT)-8) @@ -124,8 +131,8 @@ bool adt_MCVT::prepareLoadedData() bool adt_MCLQ::prepareLoadedData() { - if (fcc != 'MCLQ') + if (fcc != MCLQMagic.fcc) return false; return true; -} \ No newline at end of file +} diff --git a/src/tools/map_extractor/loadlib.cpp b/src/tools/map_extractor/loadlib.cpp index 465eb04083f..d1ea40110de 100644 --- a/src/tools/map_extractor/loadlib.cpp +++ b/src/tools/map_extractor/loadlib.cpp @@ -6,6 +6,8 @@ class MPQFile; +u_map_fcc MverMagic = { {'M','V','E','R'} }; + FileLoader::FileLoader() { data = 0; @@ -49,7 +51,7 @@ bool FileLoader::prepareLoadedData() { // Check version version = (file_MVER *) data; - if (version->fcc != 'MVER') + if (version->fcc != MverMagic.fcc) return false; if (version->ver != FILE_FORMAT_VERSION) return false; diff --git a/src/tools/map_extractor/loadlib/loadlib.h b/src/tools/map_extractor/loadlib/loadlib.h index bf6c0706d46..f32f46c63b9 100644 --- a/src/tools/map_extractor/loadlib/loadlib.h +++ b/src/tools/map_extractor/loadlib/loadlib.h @@ -29,6 +29,12 @@ typedef uint8_t uint8; #define FILE_FORMAT_VERSION 18 +union u_map_fcc +{ + char fcc_txt[4]; + uint32 fcc; +}; + // // File version chunk // diff --git a/src/tools/map_extractor/wdt.cpp b/src/tools/map_extractor/wdt.cpp index dedefbb64e5..90a07eafab3 100644 --- a/src/tools/map_extractor/wdt.cpp +++ b/src/tools/map_extractor/wdt.cpp @@ -2,23 +2,27 @@ #include "wdt.h" +u_map_fcc MWMOMagic = { {'M', 'W', 'M', 'O'} }; +u_map_fcc MPHDMagic = { {'M', 'P', 'H', 'D'} }; +u_map_fcc MAINMagic = { {'M', 'A', 'I', 'N'} }; + bool wdt_MWMO::prepareLoadedData() { - if (fcc != 'MWMO') + if (fcc != MWMOMagic.fcc) return false; return true; } bool wdt_MPHD::prepareLoadedData() { - if (fcc != 'MPHD') + if (fcc != MPHDMagic.fcc) return false; return true; } bool wdt_MAIN::prepareLoadedData() { - if (fcc != 'MAIN') + if (fcc != MAINMagic.fcc) return false; return true; } @@ -59,4 +63,4 @@ bool WDT_file::prepareLoadedData() if (!wmo->prepareLoadedData()) return false; return true; -} \ No newline at end of file +} diff --git a/src/tools/mesh_extractor/ADT.cpp b/src/tools/mesh_extractor/ADT.cpp index 8d7dce9ae11..c2ac19d5be0 100644 --- a/src/tools/mesh_extractor/ADT.cpp +++ b/src/tools/mesh_extractor/ADT.cpp @@ -3,7 +3,8 @@ #include "LiquidHandler.h" #include "WorldModelHandler.h" -ADT::ADT( std::string file ) : ObjectData(NULL), Data(NULL), _DoodadHandler(NULL), _WorldModelHandler(NULL), _LiquidHandler(NULL), HasObjectData(false) +ADT::ADT( std::string file ) : ObjectData(NULL), Data(NULL), HasObjectData(false), + _DoodadHandler(NULL), _WorldModelHandler(NULL), _LiquidHandler(NULL) { Data = new ChunkedData(file); ObjectData = new ChunkedData(Utils::Replace(file, ".adt", "_obj0.adt")); @@ -31,7 +32,6 @@ void ADT::Read() { Header.Read(Data->GetChunkByName("MHDR")->GetStream()); MapChunks.reserve(16 * 16); - int mapChunkIndex = 0; for (std::vector::iterator itr = Data->Chunks.begin(); itr != Data->Chunks.end(); ++itr) if ((*itr)->Name == "MCNK") diff --git a/src/tools/mesh_extractor/CMakeLists.txt b/src/tools/mesh_extractor/CMakeLists.txt index 8ef48a90742..29c571d9301 100644 --- a/src/tools/mesh_extractor/CMakeLists.txt +++ b/src/tools/mesh_extractor/CMakeLists.txt @@ -26,6 +26,7 @@ if( UNIX ) ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour ${CMAKE_SOURCE_DIR}/dep/libmpq ${CMAKE_SOURCE_DIR}/dep/g3dlite/include + ${ACE_INCLUDE_DIR} ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} @@ -77,4 +78,4 @@ if( UNIX ) install(TARGETS MeshExtractor DESTINATION bin) elseif( WIN32 ) install(TARGETS MeshExtractor DESTINATION "${CMAKE_INSTALL_PREFIX}") -endif() \ No newline at end of file +endif() diff --git a/src/tools/mesh_extractor/Cache.h b/src/tools/mesh_extractor/Cache.h index 90e2c138376..34293b14b54 100644 --- a/src/tools/mesh_extractor/Cache.h +++ b/src/tools/mesh_extractor/Cache.h @@ -14,7 +14,7 @@ class GenericCache public: GenericCache() {} - static const int32 FlushLimit = 1000; + static const uint32 FlushLimit = 1000; void Insert(K key, T* val) { @@ -59,4 +59,4 @@ public: }; extern CacheClass* Cache; -#endif \ No newline at end of file +#endif diff --git a/src/tools/mesh_extractor/Chunk.cpp b/src/tools/mesh_extractor/Chunk.cpp index 2f521f1badd..9f2898a46e0 100644 --- a/src/tools/mesh_extractor/Chunk.cpp +++ b/src/tools/mesh_extractor/Chunk.cpp @@ -12,12 +12,12 @@ int32 Chunk::FindSubChunkOffset(std::string name) uint32 matched = 0; while (uint32(ftell(stream)) < Utils::Size(stream)) { - char b; - fread(&b, sizeof(char), 1, stream); - if (b == name[matched]) - ++matched; - else + char b = 0; + if (fread(&b, sizeof(char), 1, stream) != 1 || b != name[matched]) matched = 0; + else + ++matched; + if (matched == 4) return ftell(stream) - 4; } diff --git a/src/tools/mesh_extractor/ChunkedData.cpp b/src/tools/mesh_extractor/ChunkedData.cpp index 4d609d8f6b2..e0db12a6be7 100644 --- a/src/tools/mesh_extractor/ChunkedData.cpp +++ b/src/tools/mesh_extractor/ChunkedData.cpp @@ -36,7 +36,8 @@ void ChunkedData::Load( uint32 maxLength, uint32 chunksHint ) // Utils::Reverse(nameBytes); name = std::string(name.rbegin(), name.rend()); uint32 length; - fread(&length, sizeof(uint32), 1, Stream); + if (fread(&length, sizeof(uint32), 1, Stream) != 1) + continue; calcOffset += 8; Chunks.push_back(new Chunk(name.c_str(), length, calcOffset + baseOffset, Stream)); calcOffset += length; diff --git a/src/tools/mesh_extractor/ContinentBuilder.cpp b/src/tools/mesh_extractor/ContinentBuilder.cpp index 013c0ff256a..9b5c9f9c77b 100644 --- a/src/tools/mesh_extractor/ContinentBuilder.cpp +++ b/src/tools/mesh_extractor/ContinentBuilder.cpp @@ -16,7 +16,7 @@ private: dtNavMeshParams Params; ContinentBuilder* cBuilder; public: - BuilderThread(ContinentBuilder* _cBuilder, bool deb, dtNavMeshParams& params) : Free(true), debug(deb), Params(params), cBuilder(_cBuilder) {} + BuilderThread(ContinentBuilder* _cBuilder, bool deb, dtNavMeshParams& params) : debug(deb), Params(params), cBuilder(_cBuilder), Free(true) {} void SetData(int x, int y, int map, std::string cont) { X = x; Y = y; MapId = map; Continent = cont; } int svc() @@ -113,7 +113,7 @@ void ContinentBuilder::Build(bool debug) std::vector Threads; for (uint32 i = 0; i < NumberOfThreads; ++i) Threads.push_back(new BuilderThread(this, debug, params)); - printf("Map %s ( %i ) has %i tiles. Building them with %i threads\n", Continent.c_str(), MapId, TileMap->TileTable.size(), NumberOfThreads); + printf("Map %s ( %i ) has %u tiles. Building them with %i threads\n", Continent.c_str(), MapId, uint32(TileMap->TileTable.size()), NumberOfThreads); for (std::vector::iterator itr = TileMap->TileTable.begin(); itr != TileMap->TileTable.end(); ++itr) { bool next = false; diff --git a/src/tools/mesh_extractor/ContinentBuilder.h b/src/tools/mesh_extractor/ContinentBuilder.h index 4c16fa0727e..3d7b879879e 100644 --- a/src/tools/mesh_extractor/ContinentBuilder.h +++ b/src/tools/mesh_extractor/ContinentBuilder.h @@ -7,7 +7,11 @@ class ContinentBuilder { public: - ContinentBuilder(std::string continent, uint32 mapId, WDT* wdt, uint32 tn) : MapId(mapId), Continent(continent), TileMap(wdt), NumberOfThreads(tn), tileXMin(64), tileYMin(64), tileXMax(0), tileYMax(0) {} + ContinentBuilder(std::string continent, uint32 mapId, WDT* wdt, uint32 tn) : + Continent(continent), TileMap(wdt), MapId(mapId), + NumberOfThreads(tn), tileXMin(64), tileYMin(64), tileXMax(0), tileYMax(0) + {} + void Build(bool debug); void getTileBounds(uint32 tileX, uint32 tileY, float* verts, int vertCount, float* bmin, float* bmax); void CalculateTileBounds(); @@ -23,4 +27,4 @@ private: int tileXMax; int tileYMax; }; -#endif \ No newline at end of file +#endif diff --git a/src/tools/mesh_extractor/DBC.cpp b/src/tools/mesh_extractor/DBC.cpp index c50e02014da..5c54d975487 100644 --- a/src/tools/mesh_extractor/DBC.cpp +++ b/src/tools/mesh_extractor/DBC.cpp @@ -2,16 +2,19 @@ #include "DBC.h" #include "Common.h" -DBC::DBC( FILE* stream ) : StringBlock(NULL), IsFaulty(true), StringBlockSize(0) +DBC::DBC( FILE* stream ) : StringBlock(NULL), StringBlockSize(0), IsFaulty(true) { char magic[5]; - fread(&magic, sizeof(char), 4, stream); + uint count = 0; + count += fread(&magic, sizeof(char), 4, stream); magic[4] = '\0'; - fread(&RecordCount, sizeof(uint32), 1, stream); + count += fread(&RecordCount, sizeof(uint32), 1, stream); Records.reserve(RecordCount); - fread(&Fields, sizeof(uint32), 1, stream); - fread(&RecordSize, sizeof(uint32), 1, stream); - fread(&StringBlockSize, sizeof(uint32), 1, stream); + count += fread(&Fields, sizeof(uint32), 1, stream); + count += fread(&RecordSize, sizeof(uint32), 1, stream); + count += fread(&StringBlockSize, sizeof(uint32), 1, stream); + if (count != 8) + printf("DBC::DBC: Failed to read some data expected 8, read %u\n", count); for (int i = 0; i < RecordCount; i++) { @@ -26,13 +29,16 @@ DBC::DBC( FILE* stream ) : StringBlock(NULL), IsFaulty(true), StringBlockSize(0) break; } uint32 tmp; - fread(&tmp, sizeof(uint32), 1, stream); + if (fread(&tmp, sizeof(uint32), 1, stream) != 1) + printf("DBC::DBC: Failed to read some data expected 1, read 0\n"); rec->Values.push_back(tmp); size += 4; } } StringBlock = new uint8[StringBlockSize]; - fread(StringBlock, sizeof(uint8), StringBlockSize, stream); + count = fread(StringBlock, sizeof(uint8), StringBlockSize, stream); + if (count != StringBlockSize) + printf("DBC::DBC: Failed to read some data expected %u, read %u\n", StringBlockSize, count); } std::string DBC::GetStringByOffset( int offset ) diff --git a/src/tools/mesh_extractor/DoodadHandler.cpp b/src/tools/mesh_extractor/DoodadHandler.cpp index 4e8028b3dff..56c2a7986f8 100644 --- a/src/tools/mesh_extractor/DoodadHandler.cpp +++ b/src/tools/mesh_extractor/DoodadHandler.cpp @@ -30,7 +30,8 @@ void DoodadHandler::ProcessInternal( ChunkedData* subChunks ) for (uint32 i = 0; i < refCount; i++) { int32 index; - fread(&index, sizeof(int32), 1, stream); + if (int count = fread(&index, sizeof(int32), 1, stream) != 1) + printf("DoodadHandler::ProcessInternal: Failed to read some data expected 1, read %d\n", count); if (index < 0 || uint32(index) >= _definitions->size()) continue; DoodadDefinition doodad = (*_definitions)[index]; @@ -81,7 +82,8 @@ void DoodadHandler::ReadDoodadPaths( Chunk* id, Chunk* data ) FILE* idStream = id->GetStream(); fseek(idStream, i * 4, SEEK_CUR); uint32 offset; - fread(&offset, sizeof(uint32), 1, idStream); + if (fread(&offset, sizeof(uint32), 1, idStream) != 1) + printf("DoodadHandler::ReadDoodadPaths: Failed to read some data expected 1, read 0\n"); FILE* dataStream = data->GetStream(); fseek(dataStream, offset + data->Offset, SEEK_SET); _paths->push_back(Utils::ReadString(dataStream)); diff --git a/src/tools/mesh_extractor/DoodadHandler.h b/src/tools/mesh_extractor/DoodadHandler.h index a212b032d1d..981834ec7ac 100644 --- a/src/tools/mesh_extractor/DoodadHandler.h +++ b/src/tools/mesh_extractor/DoodadHandler.h @@ -19,12 +19,16 @@ public: void Read(FILE* stream) { - fread(&MmidIndex, sizeof(uint32), 1, stream); - fread(&UniqueId, sizeof(uint32), 1, stream); + int count = 0; + + count += fread(&MmidIndex, sizeof(uint32), 1, stream); + count += fread(&UniqueId, sizeof(uint32), 1, stream); Position = Vector3::Read(stream); Rotation = Vector3::Read(stream); - fread(&DecimalScale, sizeof(uint16), 1, stream); - fread(&Flags, sizeof(uint16), 1, stream); + count += fread(&DecimalScale, sizeof(uint16), 1, stream); + count += fread(&Flags, sizeof(uint16), 1, stream); + if (count != 4) + printf("DoodadDefinition::Read: Failed to read some data expected 4, read %d\n", count); } }; @@ -50,4 +54,4 @@ private: std::vector* _definitions; std::vector* _paths; }; -#endif \ No newline at end of file +#endif diff --git a/src/tools/mesh_extractor/LiquidHandler.cpp b/src/tools/mesh_extractor/LiquidHandler.cpp index 7844130ab34..285ea1a5b74 100644 --- a/src/tools/mesh_extractor/LiquidHandler.cpp +++ b/src/tools/mesh_extractor/LiquidHandler.cpp @@ -50,17 +50,17 @@ void LiquidHandler::HandleNewLiquid() fseek(stream, chunk->Offset + information.OffsetMask2, SEEK_SET); uint32 size = ceil(information.Width * information.Height / 8.0f); uint8* altMask = new uint8[size]; - fread(altMask, sizeof(uint8), size, stream); - - for (uint32 mi = 0; mi < size; mi++) - renderMask.Mask[mi + information.OffsetY] |= altMask[mi]; + if (fread(altMask, sizeof(uint8), size, stream) == size) + for (uint32 mi = 0; mi < size; mi++) + renderMask.Mask[mi + information.OffsetY] |= altMask[mi]; delete[] altMask; } fseek(stream, chunk->Offset + information.OffsetHeightmap, SEEK_SET); for (int y = information.OffsetY; y < (information.OffsetY + information.Height); y++) for (int x = information.OffsetX; x < (information.OffsetX + information.Width); x++) - fread(&heights[x][y], sizeof(float), 1, stream); + if (fread(&heights[x][y], sizeof(float), 1, stream) != 1) + return; } else { diff --git a/src/tools/mesh_extractor/MapChunk.cpp b/src/tools/mesh_extractor/MapChunk.cpp index 67f4061035e..8fe40773d43 100644 --- a/src/tools/mesh_extractor/MapChunk.cpp +++ b/src/tools/mesh_extractor/MapChunk.cpp @@ -58,7 +58,8 @@ void MapChunk::GenerateVertices( FILE* stream ) for (int i = 0; i < values; i++) { float tmp; - fread(&tmp, sizeof(float), 1, stream); + if (fread(&tmp, sizeof(float), 1, stream) != 1) + printf("MapChunk::GenerateVertices: Failed to read some data expected 1, read 0\n"); Vector3 vert(Header.Position.x - (j * (Constants::UnitSize * 0.5f)), Header.Position.y - (i * Constants::UnitSize), Header.Position.z + tmp); if (values == 8) vert.y -= Constants::UnitSize * 0.5f; diff --git a/src/tools/mesh_extractor/MeshExtractor.cpp b/src/tools/mesh_extractor/MeshExtractor.cpp index 7379ba87117..b164ff5861d 100644 --- a/src/tools/mesh_extractor/MeshExtractor.cpp +++ b/src/tools/mesh_extractor/MeshExtractor.cpp @@ -59,7 +59,7 @@ void ExtractDBCs() { printf("Extracting DBCs for locale %s\n", MPQManager::Languages[*itr]); std::string path = baseDBCPath; - if (*itr != MPQHandler->BaseLocale) + if (*itr != uint32(MPQHandler->BaseLocale)) { path += std::string(MPQManager::Languages[*itr]) + "/"; Utils::CreateDir(path); @@ -198,7 +198,6 @@ void ExtractGameobjectModels() fwrite(&model.Header.CountGroups, sizeof(uint32), 1, output); fwrite(&model.Header.WmoId, sizeof(uint32), 1, output); - uint32 i = 0; for (std::vector::iterator itr2 = model.Groups.begin(); itr2 != model.Groups.end(); ++itr2) { fwrite(&itr2->Header.Flags, sizeof(uint32), 1, output); @@ -261,7 +260,7 @@ bool HandleArgs(int argc, char** argv, uint32& threads, std::set& mapLis for (Tokenizer::const_iterator itr = tokens.begin(); itr != tokens.end(); ++itr) mapList.insert(atoi(*itr)); - printf("Extracting only provided list of maps (%u).\n", mapList.size()); + printf("Extracting only provided list of maps (%u).\n", uint32(mapList.size())); } else if (strcmp(argv[i], "--debug") == 0) { @@ -314,18 +313,27 @@ void LoadTile(dtNavMesh*& navMesh, const char* tile) { FILE* f = fopen(tile, "rb"); MmapTileHeader header; - fread(&header, sizeof(MmapTileHeader), 1, f); + + if (fread(&header, sizeof(MmapTileHeader), 1, f) != 1) + return; + uint8* nav = new uint8[header.size]; - fread(nav, header.size, 1, f); + if (fread(nav, header.size, 1, f) != 1) + return; - dtStatus res = navMesh->addTile(nav, header.size, DT_TILE_FREE_DATA, 0, NULL); + navMesh->addTile(nav, header.size, DT_TILE_FREE_DATA, 0, NULL); fclose(f); } int main(int argc, char* argv[]) { - system("pause"); + if (!system("pause")) + { + printf("main: Error in system call to pause\n"); + return -1; + } + uint32 threads = 4, extractFlags = 0; std::set mapIds; bool debug = false; @@ -383,8 +391,13 @@ int main(int argc, char* argv[]) FILE* mmap = fopen(".mmap", "rb"); dtNavMeshParams params; - fread(¶ms, sizeof(dtNavMeshParams), 1, mmap); + int count = fread(¶ms, sizeof(dtNavMeshParams), 1, mmap); fclose(mmap); + if (count != 1) + { + printf("main: Error reading from .mmap\n"); + return 0; + } dtNavMesh* navMesh = new dtNavMesh(); dtNavMeshQuery* navMeshQuery = new dtNavMeshQuery(); @@ -401,10 +414,9 @@ int main(int argc, char* argv[]) float nearestPt[3]; - dtStatus status = navMeshQuery->findNearestPoly(m_spos, m_polyPickExt, &m_filter, &m_startRef, nearestPt); - status = navMeshQuery->findNearestPoly(m_epos, m_polyPickExt, &m_filter, &m_endRef, nearestPt); + navMeshQuery->findNearestPoly(m_spos, m_polyPickExt, &m_filter, &m_startRef, nearestPt); + navMeshQuery->findNearestPoly(m_epos, m_polyPickExt, &m_filter, &m_endRef, nearestPt); - // if ( !m_startRef || !m_endRef ) { std::cerr << "Could not find any nearby poly's (" << m_startRef << "," << m_endRef << ")" << std::endl; @@ -415,4 +427,4 @@ int main(int argc, char* argv[]) } return 0; -} \ No newline at end of file +} diff --git a/src/tools/mesh_extractor/Model.cpp b/src/tools/mesh_extractor/Model.cpp index 10fde0ebc2d..77b1adbeaa0 100644 --- a/src/tools/mesh_extractor/Model.cpp +++ b/src/tools/mesh_extractor/Model.cpp @@ -47,9 +47,12 @@ void Model::ReadBoundingTriangles( FILE* stream ) { Triangle tri; tri.Type = Constants::TRIANGLE_TYPE_DOODAD; - fread(&tri.V0, sizeof(uint16), 1, stream); - fread(&tri.V1, sizeof(uint16), 1, stream); - fread(&tri.V2, sizeof(uint16), 1, stream); + int count = 0; + count += fread(&tri.V0, sizeof(uint16), 1, stream); + count += fread(&tri.V1, sizeof(uint16), 1, stream); + count += fread(&tri.V2, sizeof(uint16), 1, stream); + if (count != 3) + printf("Model::ReadBoundingTriangles: Error reading data, expected 3, read %d\n", count); Triangles.push_back(tri); } } diff --git a/src/tools/mesh_extractor/TileBuilder.cpp b/src/tools/mesh_extractor/TileBuilder.cpp index 2a02bc50cd4..4a14cbbd51d 100644 --- a/src/tools/mesh_extractor/TileBuilder.cpp +++ b/src/tools/mesh_extractor/TileBuilder.cpp @@ -12,7 +12,8 @@ #include "ace/Synch.h" -TileBuilder::TileBuilder(ContinentBuilder* _cBuilder, std::string world, int x, int y, uint32 mapId) : _Geometry(NULL), World(world), X(x), Y(y), MapId(mapId), DataSize(0), cBuilder(_cBuilder) +TileBuilder::TileBuilder(ContinentBuilder* _cBuilder, std::string world, int x, int y, uint32 mapId) : + World(world), X(x), Y(y), MapId(mapId), _Geometry(NULL), DataSize(0), cBuilder(_cBuilder) { /* Test, non-working values @@ -62,7 +63,7 @@ TileBuilder::TileBuilder(ContinentBuilder* _cBuilder, std::string world, int x, Context = new rcContext; } -void TileBuilder::CalculateTileBounds( float*& bmin, float*& bmax, dtNavMeshParams& navMeshParams ) +void TileBuilder::CalculateTileBounds( float*& bmin, float*& bmax, dtNavMeshParams& /*navMeshParams*/ ) { bmin = new float[3]; bmax = new float[3]; diff --git a/src/tools/mesh_extractor/Utils.cpp b/src/tools/mesh_extractor/Utils.cpp index 3639cb88acf..119ac94f94f 100644 --- a/src/tools/mesh_extractor/Utils.cpp +++ b/src/tools/mesh_extractor/Utils.cpp @@ -53,8 +53,7 @@ std::string Utils::ReadString( FILE* file ) while (true) { char b; - fread(&b, sizeof(char), 1, file); - if (b == 0) + if (fread(&b, sizeof(char), 1, file) != 1 || b == 0) break; ret[i++] = b; } @@ -155,7 +154,7 @@ Vector3 Utils::VectorTransform( Vector3 vec, G3D::Matrix4 matrix ) std::string Utils::GetPathBase( std::string path ) { - int lastIndex = path.find_last_of("."); + size_t lastIndex = path.find_last_of("."); if (lastIndex != std::string::npos) return path.substr(0, lastIndex); return path; @@ -164,11 +163,12 @@ std::string Utils::GetPathBase( std::string path ) Vector3 Vector3::Read( FILE* file ) { Vector3 ret; - fread(&ret, sizeof(Vector3), 1, file); + if (fread(&ret, sizeof(Vector3), 1, file) != 1) + printf("Vector3::Read: Failed to read some data expected 1, read 0\n"); return ret; } -Vector3 Utils::GetLiquidVert(G3D::Matrix4 transformation, Vector3 basePosition, float height, int x, int y) +Vector3 Utils::GetLiquidVert(G3D::Matrix4 transformation, Vector3 basePosition, float height, int /*x*/, int /*y*/) { if (Utils::Distance(height, 0.0f) > 0.5f) basePosition.z = 0.0f; @@ -208,14 +208,18 @@ void Utils::SaveToDisk( FILE* stream, std::string path ) FILE* disk = fopen(path.c_str(), "wb"); if (!disk) { - printf("Could not save file %s to disk, please verify that you have write permissions on that directory\n", path.c_str()); + printf("SaveToDisk: Could not save file %s to disk, please verify that you have write permissions on that directory\n", path.c_str()); return; } uint32 size = Utils::Size(stream); uint8* data = new uint8[size]; // Read the data to an array - fread(data, 1, size, stream); + if (fread(data, 1, size, stream) != 1) + { + printf("SaveToDisk: Error reading from Stream while trying to save file %s to disck.\n", path.c_str()); + return; + } // And write it in the file fwrite(data, 1, size, disk); @@ -242,136 +246,164 @@ std::string Utils::GetExtension( std::string path ) void MapChunkHeader::Read(FILE* stream) { - fread(&Flags, sizeof(uint32), 1, stream); - fread(&IndexX, sizeof(uint32), 1, stream); - fread(&IndexY, sizeof(uint32), 1, stream); - fread(&Layers, sizeof(uint32), 1, stream); - fread(&DoodadRefs, sizeof(uint32), 1, stream); - fread(&OffsetMCVT, sizeof(uint32), 1, stream); - fread(&OffsetMCNR, sizeof(uint32), 1, stream); - fread(&OffsetMCLY, sizeof(uint32), 1, stream); - fread(&OffsetMCRF, sizeof(uint32), 1, stream); - fread(&OffsetMCAL, sizeof(uint32), 1, stream); - fread(&SizeMCAL, sizeof(uint32), 1, stream); - fread(&OffsetMCSH, sizeof(uint32), 1, stream); - fread(&SizeMCSH, sizeof(uint32), 1, stream); - fread(&AreaId, sizeof(uint32), 1, stream); - fread(&MapObjectRefs, sizeof(uint32), 1, stream); - fread(&Holes, sizeof(uint32), 1, stream); + int count = 0; + + count += fread(&Flags, sizeof(uint32), 1, stream); + count += fread(&IndexX, sizeof(uint32), 1, stream); + count += fread(&IndexY, sizeof(uint32), 1, stream); + count += fread(&Layers, sizeof(uint32), 1, stream); + count += fread(&DoodadRefs, sizeof(uint32), 1, stream); + count += fread(&OffsetMCVT, sizeof(uint32), 1, stream); + count += fread(&OffsetMCNR, sizeof(uint32), 1, stream); + count += fread(&OffsetMCLY, sizeof(uint32), 1, stream); + count += fread(&OffsetMCRF, sizeof(uint32), 1, stream); + count += fread(&OffsetMCAL, sizeof(uint32), 1, stream); + count += fread(&SizeMCAL, sizeof(uint32), 1, stream); + count += fread(&OffsetMCSH, sizeof(uint32), 1, stream); + count += fread(&SizeMCSH, sizeof(uint32), 1, stream); + count += fread(&AreaId, sizeof(uint32), 1, stream); + count += fread(&MapObjectRefs, sizeof(uint32), 1, stream); + count += fread(&Holes, sizeof(uint32), 1, stream); LowQualityTextureMap = new uint32[4]; - fread(LowQualityTextureMap, sizeof(uint32), 4, stream); - fread(&PredTex, sizeof(uint32), 1, stream); - fread(&NumberEffectDoodad, sizeof(uint32), 1, stream); - fread(&OffsetMCSE, sizeof(uint32), 1, stream); - fread(&SoundEmitters, sizeof(uint32), 1, stream); - fread(&OffsetMCLQ, sizeof(uint32), 1, stream); - fread(&SizeMCLQ, sizeof(uint32), 1, stream); + count += fread(LowQualityTextureMap, sizeof(uint32), 4, stream); + count += fread(&PredTex, sizeof(uint32), 1, stream); + count += fread(&NumberEffectDoodad, sizeof(uint32), 1, stream); + count += fread(&OffsetMCSE, sizeof(uint32), 1, stream); + count += fread(&SoundEmitters, sizeof(uint32), 1, stream); + count += fread(&OffsetMCLQ, sizeof(uint32), 1, stream); + count += fread(&SizeMCLQ, sizeof(uint32), 1, stream); Position = Vector3::Read(stream); - fread(&OffsetMCCV, sizeof(uint32), 1, stream); + count += fread(&OffsetMCCV, sizeof(uint32), 1, stream); + + if (count != 27) + printf("MapChunkHeader::Read: Failed to read some data expected 27, read %d\n", count); } void MHDR::Read(FILE* stream) { - fread(&Flags, sizeof(uint32), 1, stream); - fread(&OffsetMCIN, sizeof(uint32), 1, stream); - fread(&OffsetMTEX, sizeof(uint32), 1, stream); - fread(&OffsetMMDX, sizeof(uint32), 1, stream); - fread(&OffsetMMID, sizeof(uint32), 1, stream); - fread(&OffsetMWMO, sizeof(uint32), 1, stream); - fread(&OffsetMWID, sizeof(uint32), 1, stream); - fread(&OffsetMDDF, sizeof(uint32), 1, stream); - fread(&OffsetMODF, sizeof(uint32), 1, stream); - fread(&OffsetMFBO, sizeof(uint32), 1, stream); - fread(&OffsetMH2O, sizeof(uint32), 1, stream); - fread(&OffsetMTFX, sizeof(uint32), 1, stream); + int count = 0; + + count += fread(&Flags, sizeof(uint32), 1, stream); + count += fread(&OffsetMCIN, sizeof(uint32), 1, stream); + count += fread(&OffsetMTEX, sizeof(uint32), 1, stream); + count += fread(&OffsetMMDX, sizeof(uint32), 1, stream); + count += fread(&OffsetMMID, sizeof(uint32), 1, stream); + count += fread(&OffsetMWMO, sizeof(uint32), 1, stream); + count += fread(&OffsetMWID, sizeof(uint32), 1, stream); + count += fread(&OffsetMDDF, sizeof(uint32), 1, stream); + count += fread(&OffsetMODF, sizeof(uint32), 1, stream); + count += fread(&OffsetMFBO, sizeof(uint32), 1, stream); + count += fread(&OffsetMH2O, sizeof(uint32), 1, stream); + count += fread(&OffsetMTFX, sizeof(uint32), 1, stream); + + if (count != 12) + printf("MHDR::Read: Failed to read some data expected 12, read %d\n", count); } void ModelHeader::Read(FILE* stream) { - fread(&Magic, sizeof(char), 4, stream); + int count = 0; + + count += fread(&Magic, sizeof(char), 4, stream); Magic[4] = '\0'; // null-terminate it. - fread(&Version, sizeof(uint32), 1, stream); - fread(&LengthModelName, sizeof(uint32), 1, stream); - fread(&OffsetName, sizeof(uint32), 1, stream); - fread(&ModelFlags, sizeof(uint32), 1, stream); - fread(&CountGlobalSequences, sizeof(uint32), 1, stream); - fread(&OffsetGlobalSequences, sizeof(uint32), 1, stream); - fread(&CountAnimations, sizeof(uint32), 1, stream); - fread(&OffsetAnimations, sizeof(uint32), 1, stream); - fread(&CountAnimationLookup, sizeof(uint32), 1, stream); - fread(&OffsetAnimationLookup, sizeof(uint32), 1, stream); - fread(&CountBones, sizeof(uint32), 1, stream); - fread(&OffsetBones, sizeof(uint32), 1, stream); - fread(&CountKeyBoneLookup, sizeof(uint32), 1, stream); - fread(&OffsetKeyBoneLookup, sizeof(uint32), 1, stream); - fread(&CountVertices, sizeof(uint32), 1, stream); - fread(&OffsetVertices, sizeof(uint32), 1, stream); - fread(&CountViews, sizeof(uint32), 1, stream); - fread(&CountColors, sizeof(uint32), 1, stream); - fread(&OffsetColors, sizeof(uint32), 1, stream); - fread(&CountTextures, sizeof(uint32), 1, stream); - fread(&OffsetTextures, sizeof(uint32), 1, stream); - fread(&CountTransparency, sizeof(uint32), 1, stream); - fread(&OffsetTransparency, sizeof(uint32), 1, stream); - fread(&CountUvAnimation, sizeof(uint32), 1, stream); - fread(&OffsetUvAnimation, sizeof(uint32), 1, stream); - fread(&CountTexReplace, sizeof(uint32), 1, stream); - fread(&OffsetTexReplace, sizeof(uint32), 1, stream); - fread(&CountRenderFlags, sizeof(uint32), 1, stream); - fread(&OffsetRenderFlags, sizeof(uint32), 1, stream); - fread(&CountBoneLookup, sizeof(uint32), 1, stream); - fread(&OffsetBoneLookup, sizeof(uint32), 1, stream); - fread(&CountTexLookup, sizeof(uint32), 1, stream); - fread(&OffsetTexLookup, sizeof(uint32), 1, stream); - fread(&CountTexUnits, sizeof(uint32), 1, stream); - fread(&OffsetTexUnits, sizeof(uint32), 1, stream); - fread(&CountTransLookup, sizeof(uint32), 1, stream); - fread(&OffsetTransLookup, sizeof(uint32), 1, stream); - fread(&CountUvAnimLookup, sizeof(uint32), 1, stream); - fread(&OffsetUvAnimLookup, sizeof(uint32), 1, stream); + count += fread(&Version, sizeof(uint32), 1, stream); + count += fread(&LengthModelName, sizeof(uint32), 1, stream); + count += fread(&OffsetName, sizeof(uint32), 1, stream); + count += fread(&ModelFlags, sizeof(uint32), 1, stream); + count += fread(&CountGlobalSequences, sizeof(uint32), 1, stream); + count += fread(&OffsetGlobalSequences, sizeof(uint32), 1, stream); + count += fread(&CountAnimations, sizeof(uint32), 1, stream); + count += fread(&OffsetAnimations, sizeof(uint32), 1, stream); + count += fread(&CountAnimationLookup, sizeof(uint32), 1, stream); + count += fread(&OffsetAnimationLookup, sizeof(uint32), 1, stream); + count += fread(&CountBones, sizeof(uint32), 1, stream); + count += fread(&OffsetBones, sizeof(uint32), 1, stream); + count += fread(&CountKeyBoneLookup, sizeof(uint32), 1, stream); + count += fread(&OffsetKeyBoneLookup, sizeof(uint32), 1, stream); + count += fread(&CountVertices, sizeof(uint32), 1, stream); + count += fread(&OffsetVertices, sizeof(uint32), 1, stream); + count += fread(&CountViews, sizeof(uint32), 1, stream); + count += fread(&CountColors, sizeof(uint32), 1, stream); + count += fread(&OffsetColors, sizeof(uint32), 1, stream); + count += fread(&CountTextures, sizeof(uint32), 1, stream); + count += fread(&OffsetTextures, sizeof(uint32), 1, stream); + count += fread(&CountTransparency, sizeof(uint32), 1, stream); + count += fread(&OffsetTransparency, sizeof(uint32), 1, stream); + count += fread(&CountUvAnimation, sizeof(uint32), 1, stream); + count += fread(&OffsetUvAnimation, sizeof(uint32), 1, stream); + count += fread(&CountTexReplace, sizeof(uint32), 1, stream); + count += fread(&OffsetTexReplace, sizeof(uint32), 1, stream); + count += fread(&CountRenderFlags, sizeof(uint32), 1, stream); + count += fread(&OffsetRenderFlags, sizeof(uint32), 1, stream); + count += fread(&CountBoneLookup, sizeof(uint32), 1, stream); + count += fread(&OffsetBoneLookup, sizeof(uint32), 1, stream); + count += fread(&CountTexLookup, sizeof(uint32), 1, stream); + count += fread(&OffsetTexLookup, sizeof(uint32), 1, stream); + count += fread(&CountTexUnits, sizeof(uint32), 1, stream); + count += fread(&OffsetTexUnits, sizeof(uint32), 1, stream); + count += fread(&CountTransLookup, sizeof(uint32), 1, stream); + count += fread(&OffsetTransLookup, sizeof(uint32), 1, stream); + count += fread(&CountUvAnimLookup, sizeof(uint32), 1, stream); + count += fread(&OffsetUvAnimLookup, sizeof(uint32), 1, stream); VertexBox[0] = Vector3::Read(stream); VertexBox[1] = Vector3::Read(stream); - fread(&VertexRadius, sizeof(float), 1, stream); + count += fread(&VertexRadius, sizeof(float), 1, stream); BoundingBox[0] = Vector3::Read(stream); BoundingBox[1] = Vector3::Read(stream); - fread(&BoundingRadius, sizeof(float), 1, stream); - fread(&CountBoundingTriangles, sizeof(uint32), 1, stream); - fread(&OffsetBoundingTriangles, sizeof(uint32), 1, stream); - fread(&CountBoundingVertices, sizeof(uint32), 1, stream); - fread(&OffsetBoundingVertices, sizeof(uint32), 1, stream); - fread(&CountBoundingNormals, sizeof(uint32), 1, stream); - fread(&OffsetBoundingNormals, sizeof(uint32), 1, stream); + count += fread(&BoundingRadius, sizeof(float), 1, stream); + count += fread(&CountBoundingTriangles, sizeof(uint32), 1, stream); + count += fread(&OffsetBoundingTriangles, sizeof(uint32), 1, stream); + count += fread(&CountBoundingVertices, sizeof(uint32), 1, stream); + count += fread(&OffsetBoundingVertices, sizeof(uint32), 1, stream); + count += fread(&CountBoundingNormals, sizeof(uint32), 1, stream); + count += fread(&OffsetBoundingNormals, sizeof(uint32), 1, stream); + + if (count != 51) + printf("ModelHeader::Read: Failed to read some data expected 51, read %d\n", count); + } WorldModelHeader WorldModelHeader::Read(FILE* stream) { WorldModelHeader ret; - fread(&ret.CountMaterials, sizeof(uint32), 1, stream); - fread(&ret.CountGroups, sizeof(uint32), 1, stream); - fread(&ret.CountPortals, sizeof(uint32), 1, stream); - fread(&ret.CountLights, sizeof(uint32), 1, stream); - fread(&ret.CountModels, sizeof(uint32), 1, stream); - fread(&ret.CountDoodads, sizeof(uint32), 1, stream); - fread(&ret.CountSets, sizeof(uint32), 1, stream); - fread(&ret.AmbientColorUnk, sizeof(uint32), 1, stream); - fread(&ret.WmoId, sizeof(uint32), 1, stream); + int count = 0; + + count += fread(&ret.CountMaterials, sizeof(uint32), 1, stream); + count += fread(&ret.CountGroups, sizeof(uint32), 1, stream); + count += fread(&ret.CountPortals, sizeof(uint32), 1, stream); + count += fread(&ret.CountLights, sizeof(uint32), 1, stream); + count += fread(&ret.CountModels, sizeof(uint32), 1, stream); + count += fread(&ret.CountDoodads, sizeof(uint32), 1, stream); + count += fread(&ret.CountSets, sizeof(uint32), 1, stream); + count += fread(&ret.AmbientColorUnk, sizeof(uint32), 1, stream); + count += fread(&ret.WmoId, sizeof(uint32), 1, stream); ret.BoundingBox[0] = Vector3::Read(stream); ret.BoundingBox[1] = Vector3::Read(stream); - fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream); + count += fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream); + + if (count != 10) + printf("WorldModelHeader::Read: Failed to read some data expected 10, read %d\n", count); + return ret; } DoodadInstance DoodadInstance::Read(FILE* stream) { DoodadInstance ret; - fread(&ret.FileOffset, sizeof(uint32), 1, stream); + int count = 0; + + count += fread(&ret.FileOffset, sizeof(uint32), 1, stream); ret.Position = Vector3::Read(stream); - fread(&ret.QuatW, sizeof(float), 1, stream); - fread(&ret.QuatX, sizeof(float), 1, stream); - fread(&ret.QuatY, sizeof(float), 1, stream); - fread(&ret.QuatZ, sizeof(float), 1, stream); - fread(&ret.Scale, sizeof(float), 1, stream); - fread(&ret.LightColor, sizeof(uint32), 1, stream); + count += fread(&ret.QuatW, sizeof(float), 1, stream); + count += fread(&ret.QuatX, sizeof(float), 1, stream); + count += fread(&ret.QuatY, sizeof(float), 1, stream); + count += fread(&ret.QuatZ, sizeof(float), 1, stream); + count += fread(&ret.Scale, sizeof(float), 1, stream); + count += fread(&ret.LightColor, sizeof(uint32), 1, stream); + + if (count != 7) + printf("DoodadInstance::Read: Failed to read some data expected 7, read %d\n", count); + return ret; } @@ -379,24 +411,35 @@ DoodadSet DoodadSet::Read(FILE* stream) { DoodadSet ret; char name[21]; - fread(&name, sizeof(char), 20, stream); + int count = 0; + + count += fread(&name, sizeof(char), 20, stream); name[20] = '\0'; ret.Name = name; - fread(&ret.FirstInstanceIndex, sizeof(uint32), 1, stream); - fread(&ret.CountInstances, sizeof(uint32), 1, stream); - fread(&ret.UnknownZero, sizeof(uint32), 1, stream); + count += fread(&ret.FirstInstanceIndex, sizeof(uint32), 1, stream); + count += fread(&ret.CountInstances, sizeof(uint32), 1, stream); + count += fread(&ret.UnknownZero, sizeof(uint32), 1, stream); + + if (count != 23) + printf("DoodadSet::Read: Failed to read some data expected 23, read %d\n", count); + return ret; } LiquidHeader LiquidHeader::Read(FILE* stream) { LiquidHeader ret; - fread(&ret.CountXVertices, sizeof(uint32), 1, stream); - fread(&ret.CountYVertices, sizeof(uint32), 1, stream); - fread(&ret.Width, sizeof(uint32), 1, stream); - fread(&ret.Height, sizeof(uint32), 1, stream); + int count = 0; + count += fread(&ret.CountXVertices, sizeof(uint32), 1, stream); + count += fread(&ret.CountYVertices, sizeof(uint32), 1, stream); + count += fread(&ret.Width, sizeof(uint32), 1, stream); + count += fread(&ret.Height, sizeof(uint32), 1, stream); ret.BaseLocation = Vector3::Read(stream); - fread(&ret.MaterialId, sizeof(uint16), 1, stream); + count += fread(&ret.MaterialId, sizeof(uint16), 1, stream); + + if (count != 5) + printf("LiquidHeader::Read: Failed to read some data expected 5, read %d\n", count); + return ret; } @@ -416,10 +459,12 @@ LiquidData LiquidData::Read(FILE* stream, LiquidHeader& header) for (uint32 x = 0; x < header.CountXVertices; x++) { uint32 discard; - fread(&discard, sizeof(uint32), 1, stream); float tmp; - fread(&tmp, sizeof(float), 1, stream); - ret.HeightMap[x][y] = tmp; + if (fread(&discard, sizeof(uint32), 1, stream) == 1 && + fread(&tmp, sizeof(float), 1, stream) == 1) + { + ret.HeightMap[x][y] = tmp; + } } } @@ -427,9 +472,9 @@ LiquidData LiquidData::Read(FILE* stream, LiquidHeader& header) { for (uint32 x = 0; x < header.Width; x++) { - uint8 tmp; - fread(&tmp, sizeof(uint8), 1, stream); - ret.RenderFlags[x][y] = tmp; + uint8 tmp = 0; + if (fread(&tmp, sizeof(uint8), 1, stream) == 1) + ret.RenderFlags[x][y] = tmp; } } @@ -439,7 +484,8 @@ LiquidData LiquidData::Read(FILE* stream, LiquidHeader& header) H2ORenderMask H2ORenderMask::Read(FILE* stream) { H2ORenderMask ret; - fread(&ret.Mask, sizeof(uint8), 8, stream); + if (int count = fread(&ret.Mask, sizeof(uint8), 8, stream) != 8) + printf("H2OHeader::Read: Failed to read some data expected 8, read %d\n", count); return ret; } @@ -458,25 +504,35 @@ bool MCNKLiquidData::IsWater(int x, int y, float height) H2OHeader H2OHeader::Read(FILE* stream) { H2OHeader ret; - fread(&ret.OffsetInformation, sizeof(uint32), 1, stream); - fread(&ret.LayerCount, sizeof(uint32), 1, stream); - fread(&ret.OffsetRender, sizeof(uint32), 1, stream); + int count = 0; + count += fread(&ret.OffsetInformation, sizeof(uint32), 1, stream); + count += fread(&ret.LayerCount, sizeof(uint32), 1, stream); + count += fread(&ret.OffsetRender, sizeof(uint32), 1, stream); + + if (count != 3) + printf("H2OHeader::Read: Failed to read some data expected 3, read %d\n", count); + return ret; } H2OInformation H2OInformation::Read(FILE* stream) { H2OInformation ret; - fread(&ret.LiquidType, sizeof(uint16), 1, stream); - fread(&ret.Flags, sizeof(uint16), 1, stream); - fread(&ret.HeightLevel1, sizeof(float), 1, stream); - fread(&ret.HeightLevel2, sizeof(float), 1, stream); - fread(&ret.OffsetX, sizeof(uint8), 1, stream); - fread(&ret.OffsetY, sizeof(uint8), 1, stream); - fread(&ret.Width, sizeof(uint8), 1, stream); - fread(&ret.Height, sizeof(uint8), 1, stream); - fread(&ret.OffsetMask2, sizeof(uint32), 1, stream); - fread(&ret.OffsetHeightmap, sizeof(uint32), 1, stream); + int count = 0; + count += fread(&ret.LiquidType, sizeof(uint16), 1, stream); + count += fread(&ret.Flags, sizeof(uint16), 1, stream); + count += fread(&ret.HeightLevel1, sizeof(float), 1, stream); + count += fread(&ret.HeightLevel2, sizeof(float), 1, stream); + count += fread(&ret.OffsetX, sizeof(uint8), 1, stream); + count += fread(&ret.OffsetY, sizeof(uint8), 1, stream); + count += fread(&ret.Width, sizeof(uint8), 1, stream); + count += fread(&ret.Height, sizeof(uint8), 1, stream); + count += fread(&ret.OffsetMask2, sizeof(uint32), 1, stream); + count += fread(&ret.OffsetHeightmap, sizeof(uint32), 1, stream); + + if (count != 10) + printf("H2OInformation::Read: Failed to read some data expected 10, read %d\n", count); + return ret; } @@ -492,17 +548,21 @@ char* Utils::GetPlainName(const char* FileName) WMOGroupHeader WMOGroupHeader::Read( FILE* stream ) { WMOGroupHeader ret; - fread(&ret.OffsetGroupName, sizeof(uint32), 1, stream); - fread(&ret.OffsetDescriptiveName, sizeof(uint32), 1, stream); - fread(&ret.Flags, sizeof(uint32), 1, stream); + int count = 0; + count += fread(&ret.OffsetGroupName, sizeof(uint32), 1, stream); + count += fread(&ret.OffsetDescriptiveName, sizeof(uint32), 1, stream); + count += fread(&ret.Flags, sizeof(uint32), 1, stream); ret.BoundingBox[0] = Vector3::Read(stream); ret.BoundingBox[1] = Vector3::Read(stream); - fread(&ret.OffsetPortals, sizeof(uint32), 1, stream); - fread(&ret.CountPortals, sizeof(uint32), 1, stream); - fread(&ret.CountBatches, sizeof(uint16), 4, stream); - fread(&ret.Fogs, sizeof(uint8), 4, stream); - fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream); - fread(&ret.WmoId, sizeof(uint32), 1, stream); - + count += fread(&ret.OffsetPortals, sizeof(uint32), 1, stream); + count += fread(&ret.CountPortals, sizeof(uint32), 1, stream); + count += fread(&ret.CountBatches, sizeof(uint16), 4, stream); + count += fread(&ret.Fogs, sizeof(uint8), 4, stream); + count += fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream); + count += fread(&ret.WmoId, sizeof(uint32), 1, stream); + + if (count != 15) + printf("WMOGroupHeader::Read: Failed to read some data expected 15, read %d\n", count); + return ret; } diff --git a/src/tools/mesh_extractor/Utils.h b/src/tools/mesh_extractor/Utils.h index c5dd04fde06..e7380ed8142 100644 --- a/src/tools/mesh_extractor/Utils.h +++ b/src/tools/mesh_extractor/Utils.h @@ -40,7 +40,7 @@ template struct Triangle { Triangle() {} - Triangle(Constants::TriangleType type, T v0, T v1, T v2) : Type(type), V0(v0), V1(v1), V2(v2) {} + Triangle(Constants::TriangleType type, T v0, T v1, T v2) : V0(v0), V1(v1), V2(v2), Type(type) {} T V0; T V1; T V2; @@ -374,4 +374,4 @@ public: static std::string GetExtension( std::string path ); static char* GetPlainName(const char* FileName); }; -#endif \ No newline at end of file +#endif diff --git a/src/tools/mesh_extractor/WDT.cpp b/src/tools/mesh_extractor/WDT.cpp index f0c3091c04e..70d140e79ed 100644 --- a/src/tools/mesh_extractor/WDT.cpp +++ b/src/tools/mesh_extractor/WDT.cpp @@ -4,7 +4,7 @@ #include "Utils.h" #include "WorldModelHandler.h" -WDT::WDT(std::string file) : IsValid(false), IsGlobalModel(false) +WDT::WDT(std::string file) : IsGlobalModel(false), IsValid(false) { Data = new ChunkedData(file, 2); ReadTileTable(); @@ -37,8 +37,13 @@ void WDT::ReadTileTable() const uint32 hasTileFlag = 0x1; uint32 flags; uint32 discard; - fread(&flags, sizeof(uint32), 1, stream); - fread(&discard, sizeof(uint32), 1, stream); + int count = 0; + count += fread(&flags, sizeof(uint32), 1, stream); + count += fread(&discard, sizeof(uint32), 1, stream); + + if (count != 2) + printf("WDT::ReadTileTable: Failed to read some data expected 2, read %d\n", count); + if (flags & hasTileFlag) TileTable.push_back(TilePos(x, y)); diff --git a/src/tools/mesh_extractor/WorldModelGroup.cpp b/src/tools/mesh_extractor/WorldModelGroup.cpp index 35a5ba69782..5eeef824b1a 100644 --- a/src/tools/mesh_extractor/WorldModelGroup.cpp +++ b/src/tools/mesh_extractor/WorldModelGroup.cpp @@ -3,7 +3,7 @@ #include "Chunk.h" #include "Utils.h" -WorldModelGroup::WorldModelGroup( std::string path, int groupIndex ) : GroupIndex(groupIndex), IsBad(false), MOBA(NULL) +WorldModelGroup::WorldModelGroup( std::string path, int groupIndex ) : GroupIndex(groupIndex), MOBA(NULL), IsBad(false) { Data = new ChunkedData(path); if (!Data->Stream) @@ -85,9 +85,13 @@ void WorldModelGroup::ReadTriangles() uint16 v0; uint16 v1; uint16 v2; - fread(&v0, sizeof(uint16), 1, stream); - fread(&v1, sizeof(uint16), 1, stream); - fread(&v2, sizeof(uint16), 1, stream); + int count = 0; + count += fread(&v0, sizeof(uint16), 1, stream); + count += fread(&v1, sizeof(uint16), 1, stream); + count += fread(&v2, sizeof(uint16), 1, stream); + if (count != 3) + printf("WorldModelGroup::ReadMaterials: Error reading data, expected 3, read %d\n", count); + Triangles.push_back(Triangle(Constants::TRIANGLE_TYPE_WMO, v0, v1, v2)); } } @@ -105,10 +109,12 @@ void WorldModelGroup::ReadMaterials() for (uint32 i = 0; i < triangleCount; i++) { uint8 tmp; - fread(&tmp, sizeof(uint8), 1, stream); + if (fread(&tmp, sizeof(uint8), 1, stream) != 1) + printf("WorldModelGroup::ReadMaterials: Error reading data, expected 1, read 0\n"); TriangleFlags.push_back(tmp); // Read again for material. - fread(&tmp, sizeof(uint8), 1, stream); + if (fread(&tmp, sizeof(uint8), 1, stream) != 1) + printf("WorldModelGroup::ReadMaterials: Error reading data, expected 1, read 0\n"); TriangleMaterials.push_back(tmp); } } @@ -131,5 +137,7 @@ void WorldModelGroup::ReadBatches() MOBALength = chunk->Length / 2; MOBA = new uint16[MOBALength]; - fread(MOBA, sizeof(uint16), MOBALength, chunk->GetStream()); + int count = fread(MOBA, sizeof(uint16), MOBALength, chunk->GetStream()); + if (count != MOBALength) + printf("WorldModelGroup::ReadBatches: Error reading data, expected %d, read %d\n", MOBALength, count); } diff --git a/src/tools/mesh_extractor/WorldModelHandler.cpp b/src/tools/mesh_extractor/WorldModelHandler.cpp index 7b60b9b2151..6ce41807492 100644 --- a/src/tools/mesh_extractor/WorldModelHandler.cpp +++ b/src/tools/mesh_extractor/WorldModelHandler.cpp @@ -10,16 +10,20 @@ WorldModelDefinition WorldModelDefinition::Read( FILE* file ) { WorldModelDefinition ret; - fread(&ret.MwidIndex, sizeof(uint32), 1, file); - fread(&ret.UniqueId, sizeof(uint32), 1, file); + int count = 0; + count += fread(&ret.MwidIndex, sizeof(uint32), 1, file); + count += fread(&ret.UniqueId, sizeof(uint32), 1, file); ret.Position = Vector3::Read(file); ret.Rotation = Vector3::Read(file); ret.UpperExtents = Vector3::Read(file); ret.LowerExtents = Vector3::Read(file); - fread(&ret.Flags, sizeof(uint16), 1, file); - fread(&ret.DoodadSet, sizeof(uint16), 1, file); + count += fread(&ret.Flags, sizeof(uint16), 1, file); + count += fread(&ret.DoodadSet, sizeof(uint16), 1, file); uint32 discard; - fread(&discard, sizeof(uint32), 1, file); + count += fread(&discard, sizeof(uint32), 1, file); + + if (count != 5) + printf("WorldModelDefinition::Read: Error reading data, expected 5, read %d\n", count); return ret; } @@ -44,7 +48,8 @@ void WorldModelHandler::ProcessInternal( ChunkedData* subChunks ) for (uint32 i = 0; i < refCount; i++) { int32 index; - fread(&index, sizeof(int32), 1, stream); + if (fread(&index, sizeof(int32), 1, stream) != 1) + printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n"); if (index < 0 || uint32(index) >= _definitions->size()) continue; @@ -184,7 +189,8 @@ void WorldModelHandler::ReadModelPaths() FILE* stream = mwid->GetStream(); fseek(stream, i * 4, SEEK_CUR); uint32 offset; - fread(&offset, sizeof(uint32), 1, stream); + if (fread(&offset, sizeof(uint32), 1, stream) != 1) + printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n"); FILE* dataStream = mwmo->GetStream(); fseek(dataStream, offset + mwmo->Offset, SEEK_SET); _paths->push_back(Utils::ReadString(dataStream)); diff --git a/src/tools/mmaps_generator/CMakeLists.txt b/src/tools/mmaps_generator/CMakeLists.txt index 46bf9d00d43..229a2cd808f 100644 --- a/src/tools/mmaps_generator/CMakeLists.txt +++ b/src/tools/mmaps_generator/CMakeLists.txt @@ -22,13 +22,13 @@ include_directories( ${CMAKE_SOURCE_DIR}/dep/libmpq ${CMAKE_SOURCE_DIR}/dep/zlib ${CMAKE_SOURCE_DIR}/dep/bzip2 - ${CMAKE_SOURCE_DIR}/dep/acelite ${CMAKE_SOURCE_DIR}/dep/g3dlite/include ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour ${CMAKE_SOURCE_DIR}/src/server/shared ${CMAKE_SOURCE_DIR}/src/server/shared/Database ${CMAKE_SOURCE_DIR}/src/server/shared/Database/Implementation + ${CMAKE_SOURCE_DIR}/src/server/shared/Debugging ${CMAKE_SOURCE_DIR}/src/server/shared/Threading ${CMAKE_SOURCE_DIR}/src/server/shared/Logging ${CMAKE_SOURCE_DIR}/src/server/shared/Utilities diff --git a/src/tools/mmaps_generator/IntermediateValues.h b/src/tools/mmaps_generator/IntermediateValues.h index a267a0f6412..98042e1b917 100644 --- a/src/tools/mmaps_generator/IntermediateValues.h +++ b/src/tools/mmaps_generator/IntermediateValues.h @@ -35,7 +35,7 @@ namespace MMAP rcPolyMesh* polyMesh; rcPolyMeshDetail* polyMeshDetail; - IntermediateValues() : compactHeightfield(NULL), heightfield(NULL), + IntermediateValues() : heightfield(NULL), compactHeightfield(NULL), contours(NULL), polyMesh(NULL), polyMeshDetail(NULL) {} ~IntermediateValues(); diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index 754bced903c..689ccdc906d 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -29,7 +29,7 @@ // These make the linker happy. LoginDatabaseWorkerPool LoginDatabase; -uint32 GetLiquidFlags(uint32 liquidType) +uint32 GetLiquidFlags(uint32 /*liquidType*/) { return 0; } @@ -37,7 +37,7 @@ uint32 GetLiquidFlags(uint32 liquidType) #include "DisableMgr.h" namespace DisableMgr { - bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags) + bool IsDisabledFor(DisableType /*type*/, uint32 /*entry*/, Unit const* /*unit*/, uint8 /*flags*/) { return 0; } @@ -50,15 +50,15 @@ namespace MMAP MapBuilder::MapBuilder(float maxWalkableAngle, bool skipLiquid, bool skipContinents, bool skipJunkMaps, bool skipBattlegrounds, bool debugOutput, bool bigBaseUnit, const char* offMeshFilePath) : - m_terrainBuilder(NULL), + m_terrainBuilder (NULL), m_debugOutput (debugOutput), + m_offMeshFilePath (offMeshFilePath), m_skipContinents (skipContinents), m_skipJunkMaps (skipJunkMaps), m_skipBattlegrounds (skipBattlegrounds), m_maxWalkableAngle (maxWalkableAngle), m_bigBaseUnit (bigBaseUnit), - m_rcContext (NULL), - m_offMeshFilePath (offMeshFilePath) + m_rcContext (NULL) { m_terrainBuilder = new TerrainBuilder(skipLiquid); @@ -250,9 +250,12 @@ namespace MMAP printf("Building mesh from file\n"); int tileX, tileY, mapId; - fread(&mapId, sizeof(int), 1, file); - fread(&tileX, sizeof(int), 1, file); - fread(&tileY, sizeof(int), 1, file); + if (fread(&mapId, sizeof(int), 1, file) != 1) + return; + if (fread(&tileX, sizeof(int), 1, file) != 1) + return; + if (fread(&tileY, sizeof(int), 1, file) != 1) + return; dtNavMesh* navMesh = NULL; buildNavMesh(mapId, navMesh); @@ -263,23 +266,26 @@ namespace MMAP return; } - - int verticesCount, indicesCount; - fread(&verticesCount, sizeof(int), 1, file); - fread(&indicesCount, sizeof(int), 1, file); + uint verticesCount, indicesCount; + if (fread(&verticesCount, sizeof(uint), 1, file) != 1) + return; + if (fread(&indicesCount, sizeof(uint), 1, file) != 1) + return; float* verts = new float[verticesCount]; int* inds = new int[indicesCount]; - fread(verts, sizeof(float), verticesCount, file); - fread(inds, sizeof(int), indicesCount, file); + if (fread(verts, sizeof(float), verticesCount, file) != verticesCount) + return; + if (fread(inds, sizeof(int), indicesCount, file) != indicesCount) + return; MeshData data; - for (int i = 0; i < verticesCount; ++i) + for (uint i = 0; i < verticesCount; ++i) data.solidVerts.append(verts[i]); - for (int i = 0; i < indicesCount; ++i) + for (uint i = 0; i < indicesCount; ++i) data.solidTris.append(inds[i]); TerrainBuilder::cleanVertices(data.solidVerts, data.solidTris); @@ -310,7 +316,7 @@ namespace MMAP /**************************************************************************/ void MapBuilder::buildMap(uint32 mapID) { - printf("[Thread %i] Building map %03u:\n", ACE_Thread::self(), mapID); + printf("[Thread %u] Building map %03u:\n", uint32(ACE_Thread::self()), mapID); set* tiles = getTileList(mapID); @@ -409,7 +415,6 @@ namespace MMAP //if (tileBits < 1) tileBits = 1; // need at least one bit! //int polyBits = sizeof(dtPolyRef)*8 - SALT_MIN_BITS - tileBits; - int tileBits = STATIC_TILE_BITS; int polyBits = STATIC_POLY_BITS; int maxTiles = tiles->size(); @@ -955,8 +960,10 @@ namespace MMAP return false; MmapTileHeader header; - fread(&header, sizeof(MmapTileHeader), 1, file); + int count = fread(&header, sizeof(MmapTileHeader), 1, file); fclose(file); + if (count != 1) + return false; if (header.mmapMagic != MMAP_MAGIC || header.dtVersion != DT_NAVMESH_VERSION) return false; diff --git a/src/tools/mmaps_generator/PathCommon.h b/src/tools/mmaps_generator/PathCommon.h index fd02ec02d50..966c12ec19e 100644 --- a/src/tools/mmaps_generator/PathCommon.h +++ b/src/tools/mmaps_generator/PathCommon.h @@ -75,7 +75,7 @@ namespace MMAP LISTFILE_OK = 1 }; - inline ListFilesResult getDirContents(vector &fileList, string dirpath = ".", string filter = "*", bool includeSubDirs = false) + inline ListFilesResult getDirContents(vector &fileList, string dirpath = ".", string filter = "*") { #ifdef WIN32 HANDLE hFind; diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp index 0159219c110..22946df478a 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.cpp +++ b/src/tools/mmaps_generator/TerrainBuilder.cpp @@ -27,6 +27,9 @@ namespace MMAP { + + char const* MAP_VERSION_MAGIC = "v1.3"; + TerrainBuilder::TerrainBuilder(bool skipLiquid) : m_skipLiquid (skipLiquid){ } TerrainBuilder::~TerrainBuilder() { } @@ -86,9 +89,8 @@ namespace MMAP return false; map_fileheader fheader; - fread(&fheader, sizeof(map_fileheader), 1, mapFile); - - if (fheader.versionMagic != *((uint32 const*)(MAP_VERSION_MAGIC))) + if (fread(&fheader, sizeof(map_fileheader), 1, mapFile) != 1 || + fheader.versionMagic != *((uint32 const*)(MAP_VERSION_MAGIC))) { fclose(mapFile); printf("%s is the wrong version, please extract new .map files\n", mapFileName); @@ -97,10 +99,14 @@ namespace MMAP map_heightHeader hheader; fseek(mapFile, fheader.heightMapOffset, SEEK_SET); - fread(&hheader, sizeof(map_heightHeader), 1, mapFile); - bool haveTerrain = !(hheader.flags & MAP_HEIGHT_NO_HEIGHT); - bool haveLiquid = fheader.liquidMapOffset && !m_skipLiquid; + bool haveTerrain = false; + bool haveLiquid = false; + if (fread(&hheader, sizeof(map_heightHeader), 1, mapFile) == 1) + { + haveTerrain = !(hheader.flags & MAP_HEIGHT_NO_HEIGHT); + haveLiquid = fheader.liquidMapOffset && !m_skipLiquid; + } // no data in this map file if (!haveTerrain && !haveLiquid) @@ -120,42 +126,53 @@ namespace MMAP // terrain data if (haveTerrain) { - int i; float heightMultiplier; float V9[V9_SIZE_SQ], V8[V8_SIZE_SQ]; + int expected = V9_SIZE_SQ + V8_SIZE_SQ; if (hheader.flags & MAP_HEIGHT_AS_INT8) { uint8 v9[V9_SIZE_SQ]; uint8 v8[V8_SIZE_SQ]; - fread(v9, sizeof(uint8), V9_SIZE_SQ, mapFile); - fread(v8, sizeof(uint8), V8_SIZE_SQ, mapFile); + int count = 0; + count += fread(v9, sizeof(uint8), V9_SIZE_SQ, mapFile); + count += fread(v8, sizeof(uint8), V8_SIZE_SQ, mapFile); + if (count != expected) + printf("TerrainBuilder::loadMap: Failed to read some data expected %d, read %d\n", expected, count); + heightMultiplier = (hheader.gridMaxHeight - hheader.gridHeight) / 255; - for (i = 0; i < V9_SIZE_SQ; ++i) + for (int i = 0; i < V9_SIZE_SQ; ++i) V9[i] = (float)v9[i]*heightMultiplier + hheader.gridHeight; - for (i = 0; i < V8_SIZE_SQ; ++i) + for (int i = 0; i < V8_SIZE_SQ; ++i) V8[i] = (float)v8[i]*heightMultiplier + hheader.gridHeight; } else if (hheader.flags & MAP_HEIGHT_AS_INT16) { uint16 v9[V9_SIZE_SQ]; uint16 v8[V8_SIZE_SQ]; - fread(v9, sizeof(uint16), V9_SIZE_SQ, mapFile); - fread(v8, sizeof(uint16), V8_SIZE_SQ, mapFile); + int count = 0; + count += fread(v9, sizeof(uint16), V9_SIZE_SQ, mapFile); + count += fread(v8, sizeof(uint16), V8_SIZE_SQ, mapFile); + if (count != expected) + printf("TerrainBuilder::loadMap: Failed to read some data expected %d, read %d\n", expected, count); + heightMultiplier = (hheader.gridMaxHeight - hheader.gridHeight) / 65535; - for (i = 0; i < V9_SIZE_SQ; ++i) + for (int i = 0; i < V9_SIZE_SQ; ++i) V9[i] = (float)v9[i]*heightMultiplier + hheader.gridHeight; - for (i = 0; i < V8_SIZE_SQ; ++i) + for (int i = 0; i < V8_SIZE_SQ; ++i) V8[i] = (float)v8[i]*heightMultiplier + hheader.gridHeight; } else { - fread (V9, sizeof(float), V9_SIZE_SQ, mapFile); - fread(V8, sizeof(float), V8_SIZE_SQ, mapFile); + int count = 0; + count += fread(V9, sizeof(float), V9_SIZE_SQ, mapFile); + count += fread(V8, sizeof(float), V8_SIZE_SQ, mapFile); + if (count != expected) + printf("TerrainBuilder::loadMap: Failed to read some data expected %d, read %d\n", expected, count); } // hole data @@ -163,7 +180,8 @@ namespace MMAP { memset(holes, 0, fheader.holesSize); fseek(mapFile, fheader.holesOffset, SEEK_SET); - fread(holes, fheader.holesSize, 1, mapFile); + if (fread(holes, fheader.holesSize, 1, mapFile) != 1) + printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n"); } int count = meshData.solidVerts.size() / 3; @@ -172,7 +190,7 @@ namespace MMAP float coord[3]; - for (i = 0; i < V9_SIZE_SQ; ++i) + for (int i = 0; i < V9_SIZE_SQ; ++i) { getHeightCoord(i, GRID_V9, xoffset, yoffset, coord, V9); meshData.solidVerts.append(coord[0]); @@ -180,7 +198,7 @@ namespace MMAP meshData.solidVerts.append(coord[1]); } - for (i = 0; i < V8_SIZE_SQ; ++i) + for (int i = 0; i < V8_SIZE_SQ; ++i) { getHeightCoord(i, GRID_V8, xoffset, yoffset, coord, V8); meshData.solidVerts.append(coord[0]); @@ -188,10 +206,10 @@ namespace MMAP meshData.solidVerts.append(coord[1]); } - int j, indices[3], loopStart, loopEnd, loopInc; + int indices[3], loopStart = 0, loopEnd = 0, loopInc = 0; getLoopVars(portion, loopStart, loopEnd, loopInc); - for (i = loopStart; i < loopEnd; i+=loopInc) - for (j = TOP; j <= BOTTOM; j+=1) + for (int i = loopStart; i < loopEnd; i+=loopInc) + for (int j = TOP; j <= BOTTOM; j+=1) { getHeightTriangle(i, Spot(j), indices); ttriangles.append(indices[2] + count); @@ -205,19 +223,25 @@ namespace MMAP { map_liquidHeader lheader; fseek(mapFile, fheader.liquidMapOffset, SEEK_SET); - fread(&lheader, sizeof(map_liquidHeader), 1, mapFile); + if (fread(&lheader, sizeof(map_liquidHeader), 1, mapFile) != 1) + printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n"); + float* liquid_map = NULL; if (!(lheader.flags & MAP_LIQUID_NO_TYPE)) - fread(liquid_type, sizeof(liquid_type), 1, mapFile); + if (fread(liquid_type, sizeof(liquid_type), 1, mapFile) != 1) + printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n"); if (!(lheader.flags & MAP_LIQUID_NO_HEIGHT)) { - liquid_map = new float [lheader.width*lheader.height]; - fread(liquid_map, sizeof(float), lheader.width*lheader.height, mapFile); + uint toRead = lheader.width*lheader.height; + liquid_map = new float [toRead]; + if (fread(liquid_map, sizeof(float), toRead, mapFile) != toRead) + printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n"); } + // FIXME: "the address of ‘liquid_type’ will always evaluate as ‘true’" if (liquid_type && liquid_map) { int count = meshData.liquidVerts.size() / 3; @@ -263,9 +287,8 @@ namespace MMAP delete [] liquid_map; - int indices[3], loopStart, loopEnd, loopInc, triInc; + int indices[3], loopStart = 0, loopEnd = 0, loopInc = 0, triInc = BOTTOM-TOP; getLoopVars(portion, loopStart, loopEnd, loopInc); - triInc = BOTTOM-TOP; // generate triangles for (int i = loopStart; i < loopEnd; i+=loopInc) @@ -283,7 +306,7 @@ namespace MMAP // now that we have gathered the data, we can figure out which parts to keep: // liquid above ground, ground above liquid - int loopStart, loopEnd, loopInc, tTriCount = 4; + int loopStart = 0, loopEnd = 0, loopInc = 0, tTriCount = 4; bool useTerrain, useLiquid; float* lverts = meshData.liquidVerts.getCArray(); @@ -313,6 +336,7 @@ namespace MMAP useTerrain = true; useLiquid = true; uint8 liquidType = MAP_LIQUID_TYPE_NO_WATER; + // FIXME: "warning: the address of ‘liquid_type’ will always evaluate as ‘true’" // if there is no liquid, don't use liquid if (!liquid_type || !meshData.liquidVerts.size() || !ltriangles.size()) @@ -825,13 +849,13 @@ namespace MMAP while(fgets(buf, 512, fp)) { float p0[3], p1[3]; - int mid, tx, ty; + uint32 mid, tx, ty; float size; - if (10 != sscanf(buf, "%d %d,%d (%f %f %f) (%f %f %f) %f", &mid, &tx, &ty, - &p0[0], &p0[1], &p0[2], &p1[0], &p1[1], &p1[2], &size)) + if (sscanf(buf, "%d %d,%d (%f %f %f) (%f %f %f) %f", &mid, &tx, &ty, + &p0[0], &p0[1], &p0[2], &p1[0], &p1[1], &p1[2], &size) != 10) continue; - if (mapID == mid, tileX == tx, tileY == ty) + if (mapID == mid && tileX == tx && tileY == ty) { meshData.offMeshConnections.append(p0[1]); meshData.offMeshConnections.append(p0[2]); diff --git a/src/tools/mmaps_generator/TerrainBuilder.h b/src/tools/mmaps_generator/TerrainBuilder.h index 6d478753279..7a24146946b 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.h +++ b/src/tools/mmaps_generator/TerrainBuilder.h @@ -62,7 +62,6 @@ namespace MMAP // see following files: // contrib/extractor/system.cpp // src/game/Map.cpp - static char const* MAP_VERSION_MAGIC = "v1.3"; struct MeshData { diff --git a/src/tools/mmaps_generator/VMapExtensions.cpp b/src/tools/mmaps_generator/VMapExtensions.cpp index 4f203e11c21..2b525fbf353 100644 --- a/src/tools/mmaps_generator/VMapExtensions.cpp +++ b/src/tools/mmaps_generator/VMapExtensions.cpp @@ -57,7 +57,7 @@ namespace VMAP } // declared in src/shared/vmap/ModelInstance.h - WorldModel* const ModelInstance::getWorldModel() + WorldModel* ModelInstance::getWorldModel() { return iModel; } diff --git a/src/tools/vmap4_extractor/adtfile.cpp b/src/tools/vmap4_extractor/adtfile.cpp index a605118eead..56e62d474d1 100644 --- a/src/tools/vmap4_extractor/adtfile.cpp +++ b/src/tools/vmap4_extractor/adtfile.cpp @@ -69,8 +69,7 @@ void fixname2(char* name, size_t len) char* GetExtension(char* FileName) { - char* szTemp; - if (szTemp = strrchr(FileName, '.')) + if (char* szTemp = strrchr(FileName, '.')) return szTemp; return NULL; } diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp index c642f73ccae..b950db023fe 100644 --- a/src/tools/vmap4_extractor/model.cpp +++ b/src/tools/vmap4_extractor/model.cpp @@ -152,10 +152,10 @@ ModelInstance::ModelInstance(MPQFile& f, char const* ModelInstName, uint32 mapID fseek(input, 8, SEEK_SET); // get the correct no of vertices int nVertices; - fread(&nVertices, sizeof (int), 1, input); + int count = fread(&nVertices, sizeof (int), 1, input); fclose(input); - if(nVertices == 0) + if (count != 1 || nVertices == 0) return; uint16 adtId = 0;// not used for models diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp index 186f9c8606e..89e4b850dac 100644 --- a/src/tools/vmap4_extractor/vmapexport.cpp +++ b/src/tools/vmap4_extractor/vmapexport.cpp @@ -461,8 +461,7 @@ int main(int argc, char ** argv) printf("Your output directory seems to be polluted, please use an empty directory!\n"); printf(""); char garbage[2]; - scanf("%c", garbage); - return 1; + return scanf("%c", garbage); } } diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp index 0bc749b9bd5..7c9f23c5a95 100644 --- a/src/tools/vmap4_extractor/wmo.cpp +++ b/src/tools/vmap4_extractor/wmo.cpp @@ -521,10 +521,10 @@ WMOInstance::WMOInstance(MPQFile& f, char const* WmoInstName, uint32 mapID, uint fseek(input, 8, SEEK_SET); // get the correct no of vertices int nVertices; - fread(&nVertices, sizeof (int), 1, input); + int count = fread(&nVertices, sizeof (int), 1, input); fclose(input); - if(nVertices == 0) + if (count != 1 || nVertices == 0) return; float x,z; -- cgit v1.2.3 From 65cd79dc779e1900cb82e862ffab9ef3a20771ac Mon Sep 17 00:00:00 2001 From: Vincent_Michael Date: Mon, 14 Jan 2013 17:42:06 +0100 Subject: Core/Misc: Update headers to 2013 --- src/server/collision/Management/MMapFactory.cpp | 2 +- src/server/collision/Management/MMapFactory.h | 2 +- src/server/collision/Management/MMapManager.cpp | 2 +- src/server/collision/Management/MMapManager.h | 2 +- src/server/scripts/Commands/cs_mmaps.cpp | 2 +- src/tools/mesh_extractor/CMakeLists.txt | 2 +- src/tools/mmaps_generator/IntermediateValues.cpp | 2 +- src/tools/mmaps_generator/IntermediateValues.h | 2 +- src/tools/mmaps_generator/MapBuilder.cpp | 2 +- src/tools/mmaps_generator/MapBuilder.h | 2 +- src/tools/mmaps_generator/PathCommon.h | 2 +- src/tools/mmaps_generator/TerrainBuilder.cpp | 2 +- src/tools/mmaps_generator/TerrainBuilder.h | 2 +- src/tools/mmaps_generator/VMapExtensions.cpp | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) (limited to 'src/server/collision/Management/MMapManager.cpp') diff --git a/src/server/collision/Management/MMapFactory.cpp b/src/server/collision/Management/MMapFactory.cpp index 0b292b56dca..7adf7fbfa66 100644 --- a/src/server/collision/Management/MMapFactory.cpp +++ b/src/server/collision/Management/MMapFactory.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2010 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/server/collision/Management/MMapFactory.h b/src/server/collision/Management/MMapFactory.h index a006aedfa6d..00f19a194d3 100644 --- a/src/server/collision/Management/MMapFactory.h +++ b/src/server/collision/Management/MMapFactory.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2010 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp index 1b6cf5c0260..e3ed8f3310a 100644 --- a/src/server/collision/Management/MMapManager.cpp +++ b/src/server/collision/Management/MMapManager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2010 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/server/collision/Management/MMapManager.h b/src/server/collision/Management/MMapManager.h index 23b7d5fc6f8..56b1b856d65 100644 --- a/src/server/collision/Management/MMapManager.h +++ b/src/server/collision/Management/MMapManager.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2010 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp index 09e777e4047..4649e13e1c4 100644 --- a/src/server/scripts/Commands/cs_mmaps.cpp +++ b/src/server/scripts/Commands/cs_mmaps.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2012 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the diff --git a/src/tools/mesh_extractor/CMakeLists.txt b/src/tools/mesh_extractor/CMakeLists.txt index 29c571d9301..b8bd9f54331 100644 --- a/src/tools/mesh_extractor/CMakeLists.txt +++ b/src/tools/mesh_extractor/CMakeLists.txt @@ -1,5 +1,5 @@ # Copyright (C) 2005-2009 MaNGOS project -# Copyright (C) 2008-2012 TrinityCore +# Copyright (C) 2008-2013 TrinityCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without diff --git a/src/tools/mmaps_generator/IntermediateValues.cpp b/src/tools/mmaps_generator/IntermediateValues.cpp index b473d6472a0..6fad96887a2 100644 --- a/src/tools/mmaps_generator/IntermediateValues.cpp +++ b/src/tools/mmaps_generator/IntermediateValues.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2011 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/tools/mmaps_generator/IntermediateValues.h b/src/tools/mmaps_generator/IntermediateValues.h index 98042e1b917..89a5c3ae4c2 100644 --- a/src/tools/mmaps_generator/IntermediateValues.h +++ b/src/tools/mmaps_generator/IntermediateValues.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2011 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index 29591a406df..9e6acd71a72 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2011 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/tools/mmaps_generator/MapBuilder.h b/src/tools/mmaps_generator/MapBuilder.h index 61a71ff6d5b..c083e0b680a 100644 --- a/src/tools/mmaps_generator/MapBuilder.h +++ b/src/tools/mmaps_generator/MapBuilder.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2011 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/tools/mmaps_generator/PathCommon.h b/src/tools/mmaps_generator/PathCommon.h index 820ff34d425..413f2b8735d 100644 --- a/src/tools/mmaps_generator/PathCommon.h +++ b/src/tools/mmaps_generator/PathCommon.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2011 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp index d3c3772532d..f7cf76e9718 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.cpp +++ b/src/tools/mmaps_generator/TerrainBuilder.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2011 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/tools/mmaps_generator/TerrainBuilder.h b/src/tools/mmaps_generator/TerrainBuilder.h index 7a24146946b..6ad4284f416 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.h +++ b/src/tools/mmaps_generator/TerrainBuilder.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2011 MaNGOS * * This program is free software; you can redistribute it and/or modify it diff --git a/src/tools/mmaps_generator/VMapExtensions.cpp b/src/tools/mmaps_generator/VMapExtensions.cpp index 2b525fbf353..37b7d94af55 100644 --- a/src/tools/mmaps_generator/VMapExtensions.cpp +++ b/src/tools/mmaps_generator/VMapExtensions.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 TrinityCore + * Copyright (C) 2008-2013 TrinityCore * Copyright (C) 2005-2011 MaNGOS * * This program is free software; you can redistribute it and/or modify it -- cgit v1.2.3