ProjectSkyfire / SkyFire.406a

SkyFireEMU is a full featured F/OSS World of Warcraft: Cataclysm emulator written in C++. || Compatible with World of Warcraft client 4.0.6a (Build:13623) || Public DB is located on forum
http://www.projectskyfire.org
GNU General Public License v3.0
343 stars 218 forks source link

Fixed crash and evade mmaps #869

Closed Retriman closed 11 years ago

Retriman commented 11 years ago

Fixed Crash in getTileAt and prevent memory leak in instance thanks TC Users. Fix Evade System in mmaps system.

diff --git a/dep/recastlite/Detour/DetourNavMesh.cpp b/dep/recastlite/Detour/DetourNavMesh.cpp
index ca279b5..ea3cfeb 100644
--- a/dep/recastlite/Detour/DetourNavMesh.cpp
+++ b/dep/recastlite/Detour/DetourNavMesh.cpp
@@ -27,6 +27,14 @@
 #include "DetourAssert.h"
 #include <new>

+#ifdef _WIN32
+#include <io.h>
+#define F_OK   0
+#else
+#include <unistd.h>
+#endif
+#include <errno.h>
+

 inline bool overlapSlabs(const float* amin, const float* amax, const float* bmin, const float* bmax, const float px, const float py)
 {
@@ -817,11 +825,28 @@ dtStatus dtNavMesh::addTile(unsigned char* data, int dataSize, int flags, dtTile

 const dtMeshTile* dtNavMesh::getTileAt(int x, int y) const
 {
+    if ((x < -100000 || x > 100000) || (y < -100000 || y > 100000))
+        return 0;
+
     // Find tile based on hash.
-    int h = computeTileHash(x, y, m_tileLutMask);
+    int h = computeTileHash(x,y,m_tileLutMask);
+    access ((char*)(m_posLookup+h),F_OK);
+    if (errno==14)
+        return 0;   
     dtMeshTile* tile = m_posLookup[h];
+
     while (tile)
     {
+        if (sizeof(*tile)!=sizeof(dtMeshTile))
+            return 0;
+        if (sizeof(*tile->header)!=sizeof(dtMeshHeader))
+            return 0;
+        access ((char*)tile,F_OK);
+        if (errno==14)
+            return 0;
+        access ((char*)tile->header,F_OK);
+        if (errno==14)
+            return 0;
         if (tile->header && tile->header->x == x && tile->header->y == y)
             return tile;
         tile = tile->next;
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 8962cf7..fd792c8 100755
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -71,7 +71,6 @@ Map::~Map()
     if (!m_scriptSchedule.empty())
         sScriptMgr->DecreaseScheduledScriptCount(m_scriptSchedule.size());

-    MMAP::MMapFactory::createOrGetMMapManager()->unloadMap(GetId());
     MMAP::MMapFactory::createOrGetMMapManager()->unloadMapInstance(GetId(), i_InstanceId);
 }

diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
index 9d49e49..3c63487 100755
--- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp
@@ -215,6 +215,17 @@ template<class T>
 void ChaseMovementGenerator<T>::Finalize(T &owner)
 {
     owner.ClearUnitState(UNIT_STATE_CHASE | UNIT_STATE_CHASE_MOVE);
+
+    if (owner.GetTypeId() == TYPEID_UNIT && !((Creature*)&owner)->isPet() && owner.isAlive())
+       owner.GetMotionMaster()->MoveTargetedHome();
+   {
+       if (!owner.isInCombat() || ( this->i_target.getTarget() && !this->i_target.getTarget()->isInAccessiblePlaceFor(((Creature*)&owner))))
+       {
+           if (owner.isInCombat())
+               owner.CombatStop(true);
+           owner.GetMotionMaster()->MoveTargetedHome();
+       }
+   }
 }

 template<class T>