diff --git a/r5dev/game/server/ai_networkmanager.cpp b/r5dev/game/server/ai_networkmanager.cpp
index d53e1b79..4697fc61 100644
--- a/r5dev/game/server/ai_networkmanager.cpp
+++ b/r5dev/game/server/ai_networkmanager.cpp
@@ -34,7 +34,7 @@ void CAI_NetworkBuilder::SaveNetworkGraph(CAI_Network* pNetwork)
 	const string svMeshDir = "maps\\navmesh\\";
 	const string svGraphDir = "maps\\graphs\\";
 
-	fs::path fsMeshPath(svMeshDir + g_pHostState->m_levelName + "_" + HULL_SIZE[3] + ".nm");
+	fs::path fsMeshPath(svMeshDir + g_pHostState->m_levelName + "_" + SHULL_SIZE[3] + ".nm");
 	fs::path fsGraphPath(svGraphDir + g_pHostState->m_levelName + ".ain");
 
 	CFastTimer masterTimer;
@@ -69,7 +69,7 @@ void CAI_NetworkBuilder::SaveNetworkGraph(CAI_Network* pNetwork)
 	}
 	else
 	{
-		Warning(eDLL_T::SERVER, "%s - No %s NavMesh found. Unable to calculate CRC for AI Network.\n", __FUNCTION__, HULL_SIZE[3].c_str());
+		Warning(eDLL_T::SERVER, "%s - No %s NavMesh found. Unable to calculate CRC for AI Network.\n", __FUNCTION__, SHULL_SIZE[3].c_str());
 	}
 
 	// Large NavMesh CRC.
@@ -300,7 +300,7 @@ void CAI_NetworkManager::LoadNetworkGraph(CAI_NetworkManager* pAINetworkManager,
 	string svMeshDir = "maps\\navmesh\\";
 	string svGraphDir = "maps\\graphs\\";
 
-	fs::path fsMeshPath(svMeshDir + g_pHostState->m_levelName + "_" + HULL_SIZE[3] + ".nm");
+	fs::path fsMeshPath(svMeshDir + g_pHostState->m_levelName + "_" + SHULL_SIZE[3] + ".nm");
 	fs::path fsGraphPath(svGraphDir + g_pHostState->m_levelName + ".ain");
 
 	int nAiNetVersion = NULL;
diff --git a/r5dev/game/server/ai_networkmanager.h b/r5dev/game/server/ai_networkmanager.h
index 1938240b..c703f54e 100644
--- a/r5dev/game/server/ai_networkmanager.h
+++ b/r5dev/game/server/ai_networkmanager.h
@@ -5,6 +5,7 @@
 //=============================================================================//
 #pragma once
 #include "game/server/ai_network.h"
+#include "game/server/detour_impl.h"
 
 #if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
 const int AINETWORK_OFFSET = 2808;
@@ -12,15 +13,6 @@ const int AINETWORK_OFFSET = 2808;
 const int AINETWORK_OFFSET = 2840;
 #endif
 
-const string HULL_SIZE[5] = 
-{
-	"small",
-	"med_short",
-	"medium",
-	"large",
-	"extra_large"
-};
-
 /* ==== CAI_NETWORKMANAGER ============================================================================================================================================== */
 inline CMemory p_CAI_NetworkManager__ShouldRebuild = nullptr;
 inline auto CAI_NetworkManager__ShouldRebuild = p_CAI_NetworkManager__ShouldRebuild.RCast<void* (*)(void* thisptr, CAI_Network* pNetwork, void* a3, int a4)>();
diff --git a/r5dev/game/server/ai_utility.cpp b/r5dev/game/server/ai_utility.cpp
index 90c31482..29ddfd0c 100644
--- a/r5dev/game/server/ai_utility.cpp
+++ b/r5dev/game/server/ai_utility.cpp
@@ -25,6 +25,17 @@ bool dtNavMesh__isPolyReachable(dtNavMesh* thisptr, dtPolyRef poly_1, dtPolyRef
 	return v_dtNavMesh__isPolyReachable(thisptr, poly_1, poly_2, hull_type);
 }
 
+//-----------------------------------------------------------------------------
+// Purpose: gets the navmesh by hull from global array [small, med_short, medium, large, extra_large]
+// input  : hull - 
+// Output : pointer to navmesh
+//-----------------------------------------------------------------------------
+dtNavMesh* GetNavMeshForHull(int hull)
+{
+	Assert(hull >= 0 && hull <= 4); // Programmer error.
+	return g_pNavMesh[hull];
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 void CAI_Utility_Attach()
 {
diff --git a/r5dev/game/server/detour_impl.h b/r5dev/game/server/detour_impl.h
index 746c3087..b9b973fd 100644
--- a/r5dev/game/server/detour_impl.h
+++ b/r5dev/game/server/detour_impl.h
@@ -13,6 +13,26 @@ inline auto v_dtNavMesh__addTile = p_dtNavMesh__addTile.RCast<dtStatus(*)(dtNavM
 
 inline CMemory p_dtNavMesh__isPolyReachable;
 inline auto v_dtNavMesh__isPolyReachable = p_dtNavMesh__isPolyReachable.RCast<bool(*)(dtNavMesh* thisptr, dtPolyRef poly_1, dtPolyRef poly_2, int hull_type)>();
+
+const string SHULL_SIZE[5] =
+{
+	"small",
+	"med_short",
+	"medium",
+	"large",
+	"extra_large"
+};
+
+enum EHULL_SIZE
+{
+	SMALL = 0,
+	MED_SHORT,
+	MEDIUM,
+	LARGE,
+	EXTRA_LARGE
+};
+
+inline dtNavMesh** g_pNavMesh = nullptr;
 ///////////////////////////////////////////////////////////////////////////////
 class VRecast : public IDetour
 {
@@ -21,6 +41,7 @@ class VRecast : public IDetour
 		spdlog::debug("| FUN: dtNavMesh::Init                      : {:#18x} |\n", p_dtNavMesh__Init.GetPtr());
 		spdlog::debug("| FUN: dtNavMesh::addTile                   : {:#18x} |\n", p_dtNavMesh__addTile.GetPtr());
 		spdlog::debug("| FUN: dtNavMesh::isPolyReachable           : {:#18x} |\n", p_dtNavMesh__isPolyReachable.GetPtr());
+		spdlog::debug("| VAR: g_pNavMesh[5]                        : {:#18x} |\n", reinterpret_cast<uintptr_t>(g_pNavMesh));
 		spdlog::debug("+----------------------------------------------------------------+\n");
 	}
 	virtual void GetFun(void) const
@@ -29,11 +50,15 @@ class VRecast : public IDetour
 		p_dtNavMesh__addTile         = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x44\x89\x4C\x24\x00\x41\x55"), "xxxx?xx");
 		p_dtNavMesh__isPolyReachable = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x6C\x24\x00\x48\x89\x74\x24\x00\x48\x89\x7C\x24\x00\x41\x56\x49\x63\xF1"), "xxxx?xxxx?xxxx?xxxxx");
 
-		v_dtNavMesh__Init            = p_dtNavMesh__Init.RCast<dtStatus(*)(dtNavMesh*, unsigned char*, int)>(); /*4C 89 44 24 ? 53 41 56 48 81 EC ? ? ? ? 0F 10 11*/
-		v_dtNavMesh__addTile         = p_dtNavMesh__addTile.RCast<dtStatus(*)(dtNavMesh*, unsigned char*, dtMeshHeader*, int, int, dtTileRef)>(); /*44 89 4C 24 ? 41 55*/
-		v_dtNavMesh__isPolyReachable = p_dtNavMesh__isPolyReachable.RCast<bool(*)(dtNavMesh*, dtPolyRef, dtPolyRef, int)>(); /*48 89 6C 24 ? 48 89 74 24 ? 48 89 7C 24 ? 41 56 49 63 F1*/
+		v_dtNavMesh__Init            = p_dtNavMesh__Init.RCast<dtStatus(*)(dtNavMesh*, unsigned char*, int)>();                                   /*4C 89 44 24 ?? 53 41 56 48 81 EC ?? ?? ?? ?? 0F 10 11*/
+		v_dtNavMesh__addTile         = p_dtNavMesh__addTile.RCast<dtStatus(*)(dtNavMesh*, unsigned char*, dtMeshHeader*, int, int, dtTileRef)>(); /*44 89 4C 24 ?? 41 55*/
+		v_dtNavMesh__isPolyReachable = p_dtNavMesh__isPolyReachable.RCast<bool(*)(dtNavMesh*, dtPolyRef, dtPolyRef, int)>();                      /*48 89 6C 24 ?? 48 89 74 24 ?? 48 89 7C 24 ?? 41 56 49 63 F1*/
+	}
+	virtual void GetVar(void) const
+	{
+		g_pNavMesh = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x54\x24\x00\x48\x89\x4C\x24\x00\x55\x53\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48\x8D\x6C\x24\x00\x48\x81\xEC\x00\x00\x00\x00\x48\x8B\x02"), "xxxx?xxxx?xxxxxxxxxxxxxxxx?xxx????xxx")
+			.FindPatternSelf("48 8D 3D").ResolveRelativeAddressSelf(0x3, 0x7).RCast<dtNavMesh**>();
 	}
-	virtual void GetVar(void) const { }
 	virtual void GetCon(void) const { }
 	virtual void Attach(void) const { }
 	virtual void Detach(void) const { }