Files
FC1/PunkBuster/pbsv.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

225 lines
5.7 KiB
C++

// Copyright (C) 2001-2003 Even Balance, Inc.
//
//
// pbsv.cpp
//
// EVEN BALANCE - T.RAY
//
#define _cplusplus
#define PbSdk_DEFINED
#include "pbsdk.h"
#if !defined(NOT_USE_PUNKBUSTER_SDK)
#ifdef __WITH_PB__
//
// Functions and wrappers
// these are declared in pbcommon.h
extern "C" {
void __cdecl PbSvAddEvent ( int event , int clientIndex , int datalen , char *data )
{
if ( pbsdk == NULL ) return ;
pbsdk->pbsv.AddPbEvent ( event , clientIndex , datalen , data , 0 ) ;
}
void __cdecl PbServerInitialize ( void )
{
if ( pbsdk == NULL ) return ;
pbsdk->pbsv.initialize() ;
pbsdk->pb_getBasePath ( pbsdk->pbsv.m_basepath , PB_Q_MAXRESULTLEN ) ;
pbsdk->pb_getHomePath ( pbsdk->pbsv.m_homepath , PB_Q_MAXRESULTLEN ) ;
PbSvAddEvent ( PB_EV_CONFIG , -1 , 0 , "" ) ;
if ( pbsdk->pbsv.m_AddPbEvent == NULL ) pbsdk->pb_SetSvPunkBuster ( "0" ) ;
}
void __cdecl PbServerProcessEvents ( void )
{
if ( !isPBmultiplayerMode() ) return ;
pbsdk->pbsv.ProcessPbEvents() ;
}
void __cdecl PbServerForceProcess ( void )
{
if ( !isPBmultiplayerMode() ) return ;
pbsdk->pbsv.ProcessPbEvents ( -1 ) ;
}
void __cdecl PbServerCompleteCommand ( char *buf , int buflen )
{
if ( !isPBmultiplayerMode() ) return ;
pbsdk->pbsv.AddPbEvent ( PB_EV_CMDCOMPL , -1 , buflen , buf ) ;
}
void __cdecl PbPassConnectString ( char *fromAddr , char *connectString )
{
if ( !isPBmultiplayerMode() ) return ;
if ( pbsdk->pbsv.m_PassConnectString == NULL ) return ;//means PB not installed/enabled
pbsdk->pbsv.m_PassConnectString ( &pbsdk->pbsv , fromAddr , connectString ) ;
}
char * __cdecl PbAuthClient ( char *fromAddr , int cl_pb , char *cl_guid )
{
if ( !isPBmultiplayerMode() ) return NULL ;
if ( pbsdk->pbsv.m_AuthClient == NULL ) return NULL ;//means PB not installed/enabled
return pbsdk->pbsv.m_AuthClient ( &pbsdk->pbsv , fromAddr , cl_pb , cl_guid ) ;
}
int __cdecl isPbSvEnabled ( void )
{
if ( !isPBmultiplayerMode() ) return 0 ;
return (int) pbsdk->pbsv.AddPbEvent ( PB_EV_ISENABLED , -1 , 0 , NULL ) ;
}
void __cdecl EnablePbSv ( void )
{
if ( !isPBmultiplayerMode() ) return ;
pbsdk->pbsv.AddPbEvent ( PB_EV_ENABLE , -1 , 0 , NULL ) ;
}
void __cdecl DisablePbSv ( void )
{
if ( !isPBmultiplayerMode() ) return ;
pbsdk->pbsv.AddPbEvent ( PB_EV_DISABLE , -1 , 0 , NULL ) ;
}
} //extern "C"
extern void __cdecl PbClientTrapConsole ( char *msg , int msglen ) ;//in pbcl.cpp
void __cdecl PbCaptureConsoleOutput ( char *msg , int msglen )
{
if ( !isPBmultiplayerMode() ) return ;
if ( pbsdk->pbcl.m_ReloadClient == 0 ) PbClientTrapConsole ( msg , msglen ) ;
if ( pbsdk->pbsv.m_ReloadServer == 0 ) if ( pbsdk->pbsv.m_TrapConsole != NULL ) pbsdk->pbsv.m_TrapConsole ( &pbsdk->pbsv , msg , msglen ) ;
if ( *msg == '/' || *msg == '\\' ) ++msg , --msglen ;
if ( !strnicmp ( msg , "pb_" , 3 ) ) {
if ( !strnicmp ( msg + 3 , "sv_" , 3 ) ) {
if ( pbsdk->pbsv.m_TrapConsole != NULL ) PbSvAddEvent ( PB_EV_CMD , -1 , msglen , msg ) ;
} else {
if ( pbsdk->pbcl.m_ReloadClient == 0 ) PbClAddEvent ( PB_EV_CMD , msglen , msg ) ;
}
}
if ( pbsdk->ConsoleCaptureBuf == NULL ) return ;
int sl = strlen ( pbsdk->ConsoleCaptureBuf ) ;
if ( sl + (int) strlen ( msg ) + 1 >= pbsdk->ConsoleCaptureBufLen ) return ;
strcpy ( pbsdk->ConsoleCaptureBuf + sl , msg ) ;
strcat ( pbsdk->ConsoleCaptureBuf , "\n" ) ;
}
//
// PbSvGameCommand
//
extern void PBpakNames ( char *buf ) ;
char * __cdecl PbSvGameCommand ( char *Cmd , char *Result )
{
if ( !isPBmultiplayerMode() ) return NULL ;
if ( !stricmp ( Cmd , "set_sv_punkbuster" ) ) pbsdk->pb_SetSvPunkBuster ( Result ) ;
else if ( !stricmp ( Cmd , "pakNames" ) ) PBpakNames ( Result ) ;//note: Result must be 1025+ bytes for this one
else if ( !stricmp ( Cmd , "ConCapBufLen" ) ) pbsdk->ConsoleCaptureBufLen = (int) Result ;
else if ( !stricmp ( Cmd , "ConCapBuf" ) ) pbsdk->ConsoleCaptureBuf = Result ;
else if ( !stricmp ( Cmd , "Cmd_Exec" ) ) {
int pb = !strnicmp ( Result , "pb_" , 3 ) ;
pbsdk->pb_ExecCmd ( Result ) ;
if ( pb ) PbServerForceProcess() ;
} else {
char *arg1 = Result ;
while ( *arg1 == ' ' ) ++arg1 ;
while ( *arg1 && *arg1 != ' ' ) ++arg1 ;
char *endResult = arg1 ;
while ( *arg1 == ' ' ) ++arg1 ;
if ( !stricmp ( Cmd , "DropClient" ) ) pbsdk->pb_DropClient ( atoi ( Result ) , arg1 ) ;
else if ( !stricmp ( Cmd , "Cvar_Set" ) ) {
char hold = *endResult ;
*endResult = 0 ;
pbsdk->pb_CvarSet ( Result , arg1 ) ;
*endResult = hold ;
}
}
return NULL ;
}
//
// PbSvGameQuery
//
// assumes Data buffer is appropriately size/allocated for Qtype call
char * __cdecl PbSvGameQuery ( int Qtype , char *Data )
{
Data[PB_Q_MAXRESULTLEN] = 0 ;
int i ;
switch ( Qtype ) {
case PB_Q_MAXCLIENTS: itoa ( PB_MAX_CLIENTS , Data , 10 ) ; break ;
case PB_Q_CLIENT:
i = atoi ( Data ) ;
if ( !pbsdk->pb_GetClientInfo ( i , (stPb_Sv_Client *) Data ) ) return PbsQueryFail ;
break ;
case PB_Q_CVAR: strncpy ( Data , pbsdk->pb_GetCvarValue ( Data ) , PB_Q_MAXRESULTLEN ) ; break ;
case PB_Q_STATS:
i = atoi ( Data ) ;
if ( !pbsdk->pb_GetClientStats ( i , Data ) ) return PbsQueryFail ;
break ;
}
return NULL ;
}
//
// PbSvGameMsg
//
char * __cdecl PbSvGameMsg ( char *Msg , int Type )
{
if ( !isPBmultiplayerMode() ) return NULL ;
Type;//reserved
pbsdk->pb_Outf ( "%s: %s\n" , pbsdk->pbsv.m_msgPrefix , Msg ) ;
return NULL ;
}
//
// PbSvSendToClient
//
char * __cdecl PbSvSendToClient ( int DataLen , char *Data , int clientIndex )
{
pbsdk->pb_SendSvPacket ( DataLen , Data , clientIndex ) ;
return NULL ;
}
//
// PbSvSendToAddrPort
//
char * __cdecl PbSvSendToAddrPort ( char *addr , unsigned short port , int DataLen , char *Data )
{
pbsdk->pb_SendUdpPacket ( addr , port , DataLen , Data , 0 ) ; //convert bits to bytes
return NULL ;
}
#endif //#ifdef __WITHPB__
#endif // NOT_USE_PUNKBUSTER_SDK