diff options
Diffstat (limited to 'NorthstarDLL/scripts')
-rw-r--r-- | NorthstarDLL/scripts/server/miscserverscript.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/NorthstarDLL/scripts/server/miscserverscript.cpp b/NorthstarDLL/scripts/server/miscserverscript.cpp index 0d865388..b58bdfda 100644 --- a/NorthstarDLL/scripts/server/miscserverscript.cpp +++ b/NorthstarDLL/scripts/server/miscserverscript.cpp @@ -58,3 +58,44 @@ ADD_SQFUNC("bool", NSIsDedicated, "", "", ScriptContext::SERVER) g_pSquirrel<context>->pushbool(sqvm, IsDedicatedServer()); return SQRESULT_NOTNULL; } + +ADD_SQFUNC( + "bool", + NSDisconnectPlayer, + "entity player, string reason", + "Disconnects the player from the server with the given reason", + ScriptContext::SERVER) +{ + const R2::CBasePlayer* pPlayer = g_pSquirrel<context>->getentity<R2::CBasePlayer>(sqvm, 1); + const char* reason = g_pSquirrel<context>->getstring(sqvm, 2); + + if (!pPlayer) + { + spdlog::warn("Attempted to call NSDisconnectPlayer() with null player."); + + g_pSquirrel<context>->pushbool(sqvm, false); + return SQRESULT_NOTNULL; + } + + // Shouldn't happen but I like sanity checks. + R2::CBaseClient* pClient = &R2::g_pClientArray[pPlayer->m_nPlayerIndex - 1]; + if (!pClient) + { + spdlog::warn("NSDisconnectPlayer(): player entity has null CBaseClient!"); + + g_pSquirrel<context>->pushbool(sqvm, false); + return SQRESULT_NOTNULL; + } + + if (reason) + { + R2::CBaseClient__Disconnect(pClient, 1, reason); + } + else + { + R2::CBaseClient__Disconnect(pClient, 1, "Disconnected by the server."); + } + + g_pSquirrel<context>->pushbool(sqvm, true); + return SQRESULT_NOTNULL; +} |