mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
Server: properly implement NavMesh hotswap
The hotswap feature is now fully functional and no longer crashes the game. The NavMesh query states had to be reset.
This commit is contained in:
parent
fb1d1ba2e2
commit
f694269072
@ -15,6 +15,8 @@
|
|||||||
|
|
||||||
#include "vscript/languages/squirrel_re/vsquirrel.h"
|
#include "vscript/languages/squirrel_re/vsquirrel.h"
|
||||||
|
|
||||||
|
#include "ai_basenpc.h"
|
||||||
|
|
||||||
static ConVar navmesh_always_reachable("navmesh_always_reachable", "0", FCVAR_DEVELOPMENTONLY, "Marks goal poly from agent poly as reachable regardless of table data ( !slower! )");
|
static ConVar navmesh_always_reachable("navmesh_always_reachable", "0", FCVAR_DEVELOPMENTONLY, "Marks goal poly from agent poly as reachable regardless of table data ( !slower! )");
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -118,10 +120,6 @@ bool Detour_IsLoaded()
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: hot swaps the NavMesh with the current files on the disk
|
// Purpose: hot swaps the NavMesh with the current files on the disk
|
||||||
// (All hulls will be reloaded! If NavMesh for hull no longer exist, it will be kept empty!!!)
|
// (All hulls will be reloaded! If NavMesh for hull no longer exist, it will be kept empty!!!)
|
||||||
//
|
|
||||||
// TODO: Currently when hotswapping, the game crashes if there's AI in the world.
|
|
||||||
// Loop over all CAI_BaseNPC instances, and call m_pPathfinder->m_navQuery.init()
|
|
||||||
// to clear NavMesh cache !!!
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void Detour_HotSwap()
|
void Detour_HotSwap()
|
||||||
{
|
{
|
||||||
@ -135,6 +133,21 @@ void Detour_HotSwap()
|
|||||||
if (!Detour_IsLoaded())
|
if (!Detour_IsLoaded())
|
||||||
Error(eDLL_T::SERVER, NOERROR, "%s - Failed to hot swap NavMesh\n", __FUNCTION__);
|
Error(eDLL_T::SERVER, NOERROR, "%s - Failed to hot swap NavMesh\n", __FUNCTION__);
|
||||||
|
|
||||||
|
const int numAis = g_AI_Manager->NumAIs();
|
||||||
|
CAI_BaseNPC** const pAis = g_AI_Manager->AccessAIs();
|
||||||
|
|
||||||
|
// Reinitialize the AI's navmesh query to update the navmesh cache.
|
||||||
|
for (int i = 0; i < numAis; i++)
|
||||||
|
{
|
||||||
|
CAI_BaseNPC* const npc = pAis[i];
|
||||||
|
CAI_Pathfinder* const pathFinder = npc->GetPathfinder();
|
||||||
|
|
||||||
|
const NavMeshType_e navType = NAI_Hull::NavMeshType(npc->GetHullType());
|
||||||
|
const dtNavMesh* const navMesh = Detour_GetNavMeshByType(navType);
|
||||||
|
|
||||||
|
pathFinder->GetNavMeshQuery()->init(navMesh, 2048);
|
||||||
|
}
|
||||||
|
|
||||||
g_pServerScript->ExecuteCodeCallback("CodeCallback_OnNavMeshHotSwapEnd");
|
g_pServerScript->ExecuteCodeCallback("CodeCallback_OnNavMeshHotSwapEnd");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user