2023-07-18 21:05:29 +02:00
//=============================================================================//
//
// Purpose: Expose native code to VScript API
//
//-----------------------------------------------------------------------------
//
// See 'game/shared/vscript_shared.cpp' for more details.
//
//=============================================================================//
# include "core/stdafx.h"
# include "vpc/keyvalues.h"
# include "engine/cmodel_bsp.h"
# include "engine/host_state.h"
2023-07-19 02:12:56 +02:00
# include "engine/client/cl_main.h"
2023-07-18 21:05:29 +02:00
# include "networksystem/pylon.h"
# include "networksystem/listmanager.h"
# include "game/shared/vscript_shared.h"
# include "vscript/languages/squirrel_re/include/sqvm.h"
2023-07-19 02:12:56 +02:00
# include "vscript_client.h"
2023-07-19 12:25:43 +02:00
//-----------------------------------------------------------------------------
// Purpose: checks if the server index is valid, raises an error if not
//-----------------------------------------------------------------------------
static SQBool Script_CheckServerIndex ( HSQUIRRELVM v , SQInteger iServer )
{
SQInteger iCount = static_cast < SQInteger > ( g_pServerListManager - > m_vServerList . size ( ) ) ;
if ( iServer > = iCount )
{
v_SQVM_RaiseError ( v , " Index must be less than %i. \n " , iCount ) ;
return false ;
}
return true ;
}
2023-07-18 21:05:29 +02:00
namespace VScriptCode
{
namespace Client
{
//-----------------------------------------------------------------------------
// Purpose: refreshes the server list
//-----------------------------------------------------------------------------
2023-07-19 12:09:42 +02:00
SQRESULT RefreshServerList ( HSQUIRRELVM v )
2023-07-18 21:05:29 +02:00
{
string serverMessage ; // Refresh list.
size_t iCount = g_pServerListManager - > RefreshServerList ( serverMessage ) ;
sq_pushinteger ( v , static_cast < SQInteger > ( iCount ) ) ;
return SQ_OK ;
}
2023-07-19 02:12:56 +02:00
//-----------------------------------------------------------------------------
// Purpose: get current server count from pylon
//-----------------------------------------------------------------------------
SQRESULT GetServerCount ( HSQUIRRELVM v )
{
size_t iCount = g_pServerListManager - > m_vServerList . size ( ) ;
sq_pushinteger ( v , static_cast < SQInteger > ( iCount ) ) ;
return SQ_OK ;
}
//-----------------------------------------------------------------------------
// Purpose: get response from private server request
//-----------------------------------------------------------------------------
SQRESULT GetHiddenServerName ( HSQUIRRELVM v )
{
SQChar * privateToken = sq_getstring ( v , 1 ) ;
if ( ! VALID_CHARSTAR ( privateToken ) )
return SQ_OK ;
string hiddenServerRequestMessage ;
NetGameServer_t serverListing ;
bool result = g_pMasterServer - > GetServerByToken ( serverListing , hiddenServerRequestMessage , privateToken ) ; // Send token connect request.
if ( ! result )
{
if ( hiddenServerRequestMessage . empty ( ) )
{
sq_pushstring ( v , " Request failed " , - 1 ) ;
}
else
{
hiddenServerRequestMessage = Format ( " Request failed: %s " , hiddenServerRequestMessage . c_str ( ) ) ;
sq_pushstring ( v , hiddenServerRequestMessage . c_str ( ) , - 1 ) ;
}
return SQ_OK ;
}
if ( serverListing . m_svHostName . empty ( ) )
{
if ( hiddenServerRequestMessage . empty ( ) )
{
hiddenServerRequestMessage = Format ( " Server listing empty " ) ;
}
else
{
hiddenServerRequestMessage = Format ( " Server listing empty: %s " , hiddenServerRequestMessage . c_str ( ) ) ;
}
sq_pushstring ( v , hiddenServerRequestMessage . c_str ( ) , - 1 ) ;
}
else
{
hiddenServerRequestMessage = Format ( " Found server: %s " , serverListing . m_svHostName . c_str ( ) ) ;
sq_pushstring ( v , hiddenServerRequestMessage . c_str ( ) , - 1 ) ;
}
return SQ_OK ;
}
2023-07-18 21:05:29 +02:00
//-----------------------------------------------------------------------------
// Purpose: get server's current name from serverlist index
//-----------------------------------------------------------------------------
SQRESULT GetServerName ( HSQUIRRELVM v )
{
std : : lock_guard < std : : mutex > l ( g_pServerListManager - > m_Mutex ) ;
SQInteger iServer = sq_getinteger ( v , 1 ) ;
2023-07-19 12:25:43 +02:00
if ( ! Script_CheckServerIndex ( v , iServer ) )
2023-07-18 21:05:29 +02:00
{
return SQ_ERROR ;
}
const string & serverName = g_pServerListManager - > m_vServerList [ iServer ] . m_svHostName ;
sq_pushstring ( v , serverName . c_str ( ) , - 1 ) ;
return SQ_OK ;
}
//-----------------------------------------------------------------------------
// Purpose: get server's current description from serverlist index
//-----------------------------------------------------------------------------
SQRESULT GetServerDescription ( HSQUIRRELVM v )
{
std : : lock_guard < std : : mutex > l ( g_pServerListManager - > m_Mutex ) ;
SQInteger iServer = sq_getinteger ( v , 1 ) ;
2023-07-19 12:25:43 +02:00
if ( ! Script_CheckServerIndex ( v , iServer ) )
2023-07-18 21:05:29 +02:00
{
return SQ_ERROR ;
}
const string & serverDescription = g_pServerListManager - > m_vServerList [ iServer ] . m_svDescription ;
sq_pushstring ( v , serverDescription . c_str ( ) , - 1 ) ;
return SQ_OK ;
}
//-----------------------------------------------------------------------------
// Purpose: get server's current map via serverlist index
//-----------------------------------------------------------------------------
SQRESULT GetServerMap ( HSQUIRRELVM v )
{
std : : lock_guard < std : : mutex > l ( g_pServerListManager - > m_Mutex ) ;
SQInteger iServer = sq_getinteger ( v , 1 ) ;
2023-07-19 12:25:43 +02:00
if ( ! Script_CheckServerIndex ( v , iServer ) )
2023-07-18 21:05:29 +02:00
{
return SQ_ERROR ;
}
const string & svServerMapName = g_pServerListManager - > m_vServerList [ iServer ] . m_svHostMap ;
sq_pushstring ( v , svServerMapName . c_str ( ) , - 1 ) ;
return SQ_OK ;
}
//-----------------------------------------------------------------------------
// Purpose: get server's current playlist via serverlist index
//-----------------------------------------------------------------------------
SQRESULT GetServerPlaylist ( HSQUIRRELVM v )
{
std : : lock_guard < std : : mutex > l ( g_pServerListManager - > m_Mutex ) ;
SQInteger iServer = sq_getinteger ( v , 1 ) ;
2023-07-19 12:25:43 +02:00
if ( ! Script_CheckServerIndex ( v , iServer ) )
2023-07-18 21:05:29 +02:00
{
return SQ_ERROR ;
}
const string & serverPlaylist = g_pServerListManager - > m_vServerList [ iServer ] . m_svPlaylist ;
sq_pushstring ( v , serverPlaylist . c_str ( ) , - 1 ) ;
return SQ_OK ;
}
//-----------------------------------------------------------------------------
// Purpose: get server's current player count via serverlist index
//-----------------------------------------------------------------------------
SQRESULT GetServerCurrentPlayers ( HSQUIRRELVM v )
{
std : : lock_guard < std : : mutex > l ( g_pServerListManager - > m_Mutex ) ;
SQInteger iServer = sq_getinteger ( v , 1 ) ;
2023-07-19 12:25:43 +02:00
if ( ! Script_CheckServerIndex ( v , iServer ) )
2023-07-18 21:05:29 +02:00
{
return SQ_ERROR ;
}
const string & playerCount = g_pServerListManager - > m_vServerList [ iServer ] . m_svPlayerCount . c_str ( ) ;
sq_pushinteger ( v , strtol ( playerCount . c_str ( ) , NULL , NULL ) ) ;
return SQ_OK ;
}
//-----------------------------------------------------------------------------
// Purpose: get server's current player count via serverlist index
//-----------------------------------------------------------------------------
SQRESULT GetServerMaxPlayers ( HSQUIRRELVM v )
{
std : : lock_guard < std : : mutex > l ( g_pServerListManager - > m_Mutex ) ;
SQInteger iServer = sq_getinteger ( v , 1 ) ;
2023-07-19 12:25:43 +02:00
if ( ! Script_CheckServerIndex ( v , iServer ) )
2023-07-18 21:05:29 +02:00
{
return SQ_ERROR ;
}
const string & maxPlayers = g_pServerListManager - > m_vServerList [ iServer ] . m_svMaxPlayers ;
sq_pushinteger ( v , strtol ( maxPlayers . c_str ( ) , NULL , NULL ) ) ;
return SQ_OK ;
}
//-----------------------------------------------------------------------------
// Purpose: get promo data for serverbrowser panels
//-----------------------------------------------------------------------------
SQRESULT GetPromoData ( HSQUIRRELVM v )
{
enum class R5RPromoData : SQInteger
{
PromoLargeTitle ,
PromoLargeDesc ,
PromoLeftTitle ,
PromoLeftDesc ,
PromoRightTitle ,
PromoRightDesc
} ;
R5RPromoData ePromoIndex = static_cast < R5RPromoData > ( sq_getinteger ( v , 1 ) ) ;
const char * pszPromoKey ;
switch ( ePromoIndex )
{
case R5RPromoData : : PromoLargeTitle :
{
pszPromoKey = " #PROMO_LARGE_TITLE " ;
break ;
}
case R5RPromoData : : PromoLargeDesc :
{
pszPromoKey = " #PROMO_LARGE_DESCRIPTION " ;
break ;
}
case R5RPromoData : : PromoLeftTitle :
{
pszPromoKey = " #PROMO_LEFT_TITLE " ;
break ;
}
case R5RPromoData : : PromoLeftDesc :
{
pszPromoKey = " #PROMO_LEFT_DESCRIPTION " ;
break ;
}
case R5RPromoData : : PromoRightTitle :
{
pszPromoKey = " #PROMO_RIGHT_TITLE " ;
break ;
}
case R5RPromoData : : PromoRightDesc :
{
pszPromoKey = " #PROMO_RIGHT_DESCRIPTION " ;
break ;
}
default :
{
pszPromoKey = " #PROMO_SDK_ERROR " ;
break ;
}
}
sq_pushstring ( v , pszPromoKey , - 1 ) ;
return SQ_OK ;
}
//-----------------------------------------------------------------------------
// Purpose: connect to server from native server browser entries
//-----------------------------------------------------------------------------
SQRESULT ConnectToServer ( HSQUIRRELVM v )
{
SQChar * ipAddress = sq_getstring ( v , 1 ) ;
SQChar * cryptoKey = sq_getstring ( v , 2 ) ;
if ( ! VALID_CHARSTAR ( ipAddress ) | | VALID_CHARSTAR ( cryptoKey ) )
return SQ_OK ;
2023-08-21 19:12:29 +02:00
Msg ( eDLL_T : : UI , " Connecting to server with ip address '%s' and encryption key '%s' \n " , ipAddress , cryptoKey ) ;
2023-07-18 21:05:29 +02:00
g_pServerListManager - > ConnectToServer ( ipAddress , cryptoKey ) ;
return SQ_OK ;
}
//-----------------------------------------------------------------------------
// Purpose: set netchannel encryption key and connect to server
//-----------------------------------------------------------------------------
SQRESULT ConnectToListedServer ( HSQUIRRELVM v )
{
std : : lock_guard < std : : mutex > l ( g_pServerListManager - > m_Mutex ) ;
SQInteger iServer = sq_getinteger ( v , 1 ) ;
2023-07-19 12:25:43 +02:00
if ( ! Script_CheckServerIndex ( v , iServer ) )
2023-07-18 21:05:29 +02:00
{
return SQ_ERROR ;
}
const NetGameServer_t & gameServer = g_pServerListManager - > m_vServerList [ iServer ] ;
g_pServerListManager - > ConnectToServer ( gameServer . m_svIpAddress , gameServer . m_svGamePort ,
gameServer . m_svEncryptionKey ) ;
return SQ_OK ;
}
//-----------------------------------------------------------------------------
// Purpose: request token from pylon and join server with result.
//-----------------------------------------------------------------------------
SQRESULT ConnectToHiddenServer ( HSQUIRRELVM v )
{
SQChar * privateToken = sq_getstring ( v , 1 ) ;
if ( ! VALID_CHARSTAR ( privateToken ) )
return SQ_OK ;
string hiddenServerRequestMessage ;
NetGameServer_t netListing ;
bool result = g_pMasterServer - > GetServerByToken ( netListing , hiddenServerRequestMessage , privateToken ) ; // Send token connect request.
if ( result )
{
g_pServerListManager - > ConnectToServer ( netListing . m_svIpAddress , netListing . m_svGamePort , netListing . m_svEncryptionKey ) ;
}
else
{
Warning ( eDLL_T : : UI , " Failed to connect to private server: %s \n " , hiddenServerRequestMessage . c_str ( ) ) ;
}
return SQ_OK ;
}
//-----------------------------------------------------------------------------
2023-07-19 02:12:56 +02:00
// Purpose: checks whether this SDK build is a client dll
2023-07-18 21:05:29 +02:00
//-----------------------------------------------------------------------------
2023-07-19 02:12:56 +02:00
SQRESULT IsClientDLL ( HSQUIRRELVM v )
2023-07-18 21:05:29 +02:00
{
2023-07-19 02:12:56 +02:00
sq_pushbool ( v , : : IsClientDLL ( ) ) ;
2023-07-18 21:05:29 +02:00
return SQ_OK ;
}
}
}
//---------------------------------------------------------------------------------
// Purpose: registers script functions in CLIENT context
// Input : *s -
//---------------------------------------------------------------------------------
void Script_RegisterClientFunctions ( CSquirrelVM * s )
{
2023-07-19 02:12:56 +02:00
Script_RegisterCommonAbstractions ( s ) ;
Script_RegisterCoreClientFunctions ( s ) ;
2023-07-18 21:05:29 +02:00
}
//---------------------------------------------------------------------------------
// Purpose: registers script functions in UI context
// Input : *s -
//---------------------------------------------------------------------------------
void Script_RegisterUIFunctions ( CSquirrelVM * s )
{
2023-07-19 02:12:56 +02:00
Script_RegisterCommonAbstractions ( s ) ;
Script_RegisterCoreClientFunctions ( s ) ;
2023-07-18 21:05:29 +02:00
2023-07-19 12:09:42 +02:00
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , RefreshServerList , " Refreshes the public server list and returns the count " , " int " , " " ) ;
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , GetServerCount , " Gets the number of public servers " , " int " , " " ) ;
2023-07-18 21:05:29 +02:00
// Functions for retrieving server browser data
2023-07-19 12:09:42 +02:00
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , GetHiddenServerName , " Gets hidden server name by token " , " string " , " string " ) ;
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , GetServerName , " Gets the name of the server at the specified index of the server list " , " string " , " int " ) ;
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , GetServerDescription , " Gets the description of the server at the specified index of the server list " , " string " , " int " ) ;
2023-07-18 21:05:29 +02:00
2023-07-19 12:09:42 +02:00
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , GetServerMap , " Gets the map of the server at the specified index of the server list " , " string " , " int " ) ;
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , GetServerPlaylist , " Gets the playlist of the server at the specified index of the server list " , " string " , " int " ) ;
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , GetServerCurrentPlayers , " Gets the current player count of the server at the specified index of the server list " , " int " , " int " ) ;
2023-07-18 21:05:29 +02:00
2023-07-19 12:09:42 +02:00
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , GetServerMaxPlayers , " Gets the max player count of the server at the specified index of the server list " , " int " , " int " ) ;
2023-07-18 21:05:29 +02:00
2023-07-19 02:12:56 +02:00
// Misc main menu functions
2023-07-19 12:09:42 +02:00
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , GetPromoData , " Gets promo data for specified slot type " , " string " , " int " ) ;
2023-07-18 21:05:29 +02:00
2023-07-19 02:12:56 +02:00
// Functions for connecting to servers
2023-07-19 12:09:42 +02:00
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , ConnectToServer , " Joins server by ip address and encryption key " , " void " , " string, string " ) ;
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , ConnectToListedServer , " Joins listed server by index " , " void " , " int " ) ;
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , ConnectToHiddenServer , " Joins hidden server by token " , " void " , " string " ) ;
2023-07-19 02:12:56 +02:00
}
2023-07-18 21:05:29 +02:00
2023-07-19 02:12:56 +02:00
//---------------------------------------------------------------------------------
// Purpose: core client script functions
// Input : *s -
//---------------------------------------------------------------------------------
void Script_RegisterCoreClientFunctions ( CSquirrelVM * s )
{
2023-07-19 12:09:42 +02:00
DEFINE_CLIENT_SCRIPTFUNC_NAMED ( s , IsClientDLL , " Returns whether this build is client only " , " bool " , " " ) ;
2023-07-18 21:05:29 +02:00
}