diff --git a/src/engine/server/sv_rcon.cpp b/src/engine/server/sv_rcon.cpp index fdac5d5d..7e6789a3 100644 --- a/src/engine/server/sv_rcon.cpp +++ b/src/engine/server/sv_rcon.cpp @@ -523,6 +523,9 @@ void CRConServer::Execute(const cl_rcon::request& request) const const char* const pValueString = request.requestval().c_str(); + if (pCommandBase->IsFlagSet(FCVAR_SERVER_FRAME_THREAD)) + ThreadJoinServerJob(); + if (!pCommandBase->IsCommand()) { // Here we want to skip over the command string in the value buffer. diff --git a/src/game/server/ai_utility.cpp b/src/game/server/ai_utility.cpp index f0aa8836..d82e5a88 100644 --- a/src/game/server/ai_utility.cpp +++ b/src/game/server/ai_utility.cpp @@ -128,12 +128,18 @@ bool Detour_IsLoaded() //----------------------------------------------------------------------------- void Detour_HotSwap() { + Assert(ThreadInMainOrServerFrameThread()); + + // TODO: CodeCallback_OnNavMeshHotSwapStart() + // Free and re-init NavMesh. Detour_LevelShutdown(); v_Detour_LevelInit(); if (!Detour_IsLoaded()) Error(eDLL_T::SERVER, NOERROR, "%s - Failed to hot swap NavMesh\n", __FUNCTION__); + + // TODO: CodeCallback_OnNavMeshHotSwapEnd() } /* @@ -161,7 +167,7 @@ static void Detour_HotSwap_f() Msg(eDLL_T::SERVER, "Hot swap took '%lf' seconds\n", timer.GetDuration().GetSeconds()); } -static ConCommand navmesh_hotswap("navmesh_hotswap", Detour_HotSwap_f, "Hot swap the NavMesh for all hulls", FCVAR_DEVELOPMENTONLY); +static ConCommand navmesh_hotswap("navmesh_hotswap", Detour_HotSwap_f, "Hot swap the NavMesh for all hulls", FCVAR_DEVELOPMENTONLY | FCVAR_SERVER_FRAME_THREAD); /////////////////////////////////////////////////////////////////////////////// void VRecast::Detour(const bool bAttach) const diff --git a/src/game/server/vscript_server.cpp b/src/game/server/vscript_server.cpp index d037a9ae..e06d060a 100644 --- a/src/game/server/vscript_server.cpp +++ b/src/game/server/vscript_server.cpp @@ -34,7 +34,7 @@ static void SQVM_ServerScript_f(const CCommand& args) Script_Execute(args.ArgS(), SQCONTEXT::SERVER); } } -static ConCommand script("script", SQVM_ServerScript_f, "Run input code as SERVER script on the VM", FCVAR_DEVELOPMENTONLY | FCVAR_GAMEDLL | FCVAR_CHEAT); +static ConCommand script("script", SQVM_ServerScript_f, "Run input code as SERVER script on the VM", FCVAR_DEVELOPMENTONLY | FCVAR_GAMEDLL | FCVAR_CHEAT | FCVAR_SERVER_FRAME_THREAD); namespace VScriptCode { diff --git a/src/rtech/liveapi/liveapi.cpp b/src/rtech/liveapi/liveapi.cpp index 515b5556..e48b49cd 100644 --- a/src/rtech/liveapi/liveapi.cpp +++ b/src/rtech/liveapi/liveapi.cpp @@ -15,7 +15,6 @@ //----------------------------------------------------------------------------- static void LiveAPI_ParamsChangedCallback(IConVar* var, const char* pOldValue) { - // TODO[ AMOS ]: latch this off to the server frame thread! LiveAPISystem()->UpdateParams(); } @@ -24,7 +23,6 @@ static void LiveAPI_ParamsChangedCallback(IConVar* var, const char* pOldValue) //----------------------------------------------------------------------------- static void LiveAPI_AddressChangedCallback(IConVar* var, const char* pOldValue) { - // TODO[ AMOS ]: latch this off to the server frame thread! LiveAPISystem()->InstallAddressList(); } diff --git a/src/vscript/vscript.cpp b/src/vscript/vscript.cpp index ababaf01..8fcec3b4 100644 --- a/src/vscript/vscript.cpp +++ b/src/vscript/vscript.cpp @@ -133,17 +133,7 @@ SQBool Script_PrecompileClientScripts(CSquirrelVM* vm) void Script_Execute(const SQChar* code, const SQCONTEXT context) { Assert(context != SQCONTEXT::NONE); - - if (!ThreadInMainThread()) // TODO[ AMOS ]: server frame thread - { - const string scode(code); - g_TaskQueue.Dispatch([scode, context]() - { - Script_Execute(scode.c_str(), context); - }, 0); - - return; // Only run in main thread. - } + Assert(ThreadInMainOrServerFrameThread()); CSquirrelVM* s = Script_GetScriptHandle(context); const char* const contextName = s_scriptContextNames[(int)context];