本文整理汇总了C++中VM_Call函数的典型用法代码示例。如果您正苦于以下问题:C++ VM_Call函数的具体用法?C++ VM_Call怎么用?C++ VM_Call使用的例子?那么, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了VM_Call函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: CL_AutoMapKey
//intercept certain keys during automap mode
static void CL_AutoMapKey(int autoMapKey, qboolean up)
{
autoMapInput_t *data = (autoMapInput_t *)cl.mSharedMemory;
switch (autoMapKey)
{
case AUTOMAP_KEY_FORWARD:
if (up)
{
g_clAutoMapInput.up = 0.0f;
}
else
{
g_clAutoMapInput.up = 16.0f;
}
break;
case AUTOMAP_KEY_BACK:
if (up)
{
g_clAutoMapInput.down = 0.0f;
}
else
{
g_clAutoMapInput.down = 16.0f;
}
break;
case AUTOMAP_KEY_YAWLEFT:
if (up)
{
g_clAutoMapInput.yaw = 0.0f;
}
else
{
g_clAutoMapInput.yaw = -4.0f;
}
break;
case AUTOMAP_KEY_YAWRIGHT:
if (up)
{
g_clAutoMapInput.yaw = 0.0f;
}
else
{
g_clAutoMapInput.yaw = 4.0f;
}
break;
case AUTOMAP_KEY_PITCHUP:
if (up)
{
g_clAutoMapInput.pitch = 0.0f;
}
else
{
g_clAutoMapInput.pitch = -4.0f;
}
break;
case AUTOMAP_KEY_PITCHDOWN:
if (up)
{
g_clAutoMapInput.pitch = 0.0f;
}
else
{
g_clAutoMapInput.pitch = 4.0f;
}
break;
case AUTOMAP_KEY_DEFAULTVIEW:
memset(&g_clAutoMapInput, 0, sizeof(autoMapInput_t));
g_clAutoMapInput.goToDefaults = qtrue;
break;
default:
break;
}
memcpy(data, &g_clAutoMapInput, sizeof(autoMapInput_t));
if (cgvm)
{
VM_Call(cgvm, CG_AUTOMAP_INPUT, 0);
}
g_clAutoMapInput.goToDefaults = qfalse;
}
示例2: CL_UISystemCalls
//.........这里部分代码省略.........
LAN_GetServerInfo( args[1], args[2], VMA(3), args[4] );
return 0;
case UI_LAN_GETSERVERPING:
return LAN_GetServerPing( args[1], args[2] );
case UI_LAN_MARKSERVERVISIBLE:
LAN_MarkServerVisible( args[1], args[2], args[3] );
return 0;
case UI_LAN_SERVERISVISIBLE:
return LAN_ServerIsVisible( args[1], args[2] );
case UI_LAN_UPDATEVISIBLEPINGS:
return LAN_UpdateVisiblePings( args[1] );
case UI_LAN_RESETPINGS:
LAN_ResetPings( args[1] );
return 0;
case UI_LAN_SERVERSTATUS:
return LAN_GetServerStatus( VMA(1), VMA(2), args[3] );
case UI_LAN_COMPARESERVERS:
return LAN_CompareServers( args[1], args[2], args[3], args[4], args[5] );
case UI_MEMORY_REMAINING:
return Hunk_MemoryRemaining();
case UI_SET_PBCLSTATUS:
return 0;
case UI_CROSSHAIR_PLAYER:
return VM_Call( cgvm, CG_CROSSHAIR_PLAYER );
case UI_LAST_ATTACKER:
return VM_Call( cgvm, CG_LAST_ATTACKER );
case UI_R_REGISTERFONT:
re.RegisterFont( VMA(1), args[2], VMA(3));
return 0;
case UI_MEMSET:
Com_Memset( VMA(1), args[2], args[3] );
return 0;
case UI_MEMCPY:
Com_Memcpy( VMA(1), VMA(2), args[3] );
return 0;
case UI_STRNCPY:
strncpy( VMA(1), VMA(2), args[3] );
return args[1];
case UI_SIN:
return FloatAsInt( sin( VMF(1) ) );
case UI_COS:
return FloatAsInt( cos( VMF(1) ) );
case UI_ATAN2:
return FloatAsInt( atan2( VMF(1), VMF(2) ) );
case UI_SQRT:
return FloatAsInt( sqrt( VMF(1) ) );
示例3: CLWS_GetTag
bool CLWS_GetTag( int clientNum, const char* tagname, orientation_t* _or ) {
return VM_Call( cgvm, WSCG_GET_TAG, clientNum, tagname, _or );
}
示例4: UIWM_DrawConnectScreen
void UIWM_DrawConnectScreen( bool overlay ) {
VM_Call( uivm, WMUI_DRAW_CONNECT_SCREEN, overlay );
}
示例5: UIWM_CheckExecKey
bool UIWM_CheckExecKey( int key ) {
return VM_Call( uivm, WMUI_CHECKEXECKEY, key );
}
示例6: CL_CgameSystemCalls
//.........这里部分代码省略.........
case CG_CIN_STOPCINEMATIC:
return CIN_StopCinematic(args[1]);
case CG_CIN_RUNCINEMATIC:
return CIN_RunCinematic(args[1]);
case CG_CIN_DRAWCINEMATIC:
CIN_DrawCinematic(args[1]);
return 0;
case CG_CIN_SETEXTENTS:
CIN_SetExtents(args[1], args[2], args[3], args[4], args[5]);
return 0;
case CG_R_REMAP_SHADER:
re.RemapShader(VMA(1), VMA(2), VMA(3));
return 0;
case CG_TESTPRINTINT:
Com_Printf("%s%li\n", (char *)VMA(1), (long)args[2]);
return 0;
case CG_TESTPRINTFLOAT:
Com_Printf("%s%f\n", (char *)VMA(1), VMF(2));
return 0;
case CG_GET_ENTITY_TOKEN:
return re.GetEntityToken(VMA(1), args[2]);
case CG_INGAME_POPUP:
if (cls.state == CA_ACTIVE && !clc.demoplaying)
{
if (uivm) // can be called as the system is shutting down
{
VM_Call(uivm, UI_SET_ACTIVE_MENU, args[1]);
}
}
return 0;
case CG_KEY_GETBINDINGBUF:
Key_GetBindingBuf(args[1], VMA(2), args[3]);
return 0;
case CG_KEY_SETBINDING:
Key_SetBinding(args[1], VMA(2));
return 0;
case CG_KEY_KEYNUMTOSTRINGBUF:
Key_KeynumToStringBuf(args[1], VMA(2), args[3]);
return 0;
case CG_KEY_BINDINGTOKEYS:
Key_GetBindingByString(VMA(1), VMA(2), VMA(3));
return 0;
case CG_TRANSLATE_STRING:
CL_TranslateStringMod(VMA(1), VMA(2));
return 0;
case CG_S_FADEALLSOUNDS:
S_FadeAllSounds(VMF(1), args[2], args[3]);
return 0;
case CG_R_INPVS:
return re.inPVS(VMA(1), VMA(2));
case CG_GETHUNKDATA:
示例7: UIWM_GetActiveMenu
int UIWM_GetActiveMenu() {
return VM_Call( uivm, WMUI_GET_ACTIVE_MENU );
}
示例8: SV_BotFrame
/*
==================
SV_BotFrame
==================
*/
void SV_BotFrame( int time ) {
if (!bot_enable) return;
//NOTE: maybe the game is already shutdown
if (!gvm) return;
VM_Call( gvm, BOTAI_START_FRAME, time );
}
示例9: IN_Notebook
void IN_Notebook( void ) {
if ( clc.state == CA_ACTIVE && !clc.demoplaying ) {
Cvar_Set( "cg_youGotMail", "0" ); // clear icon //----(SA) added
VM_Call( uivm, UI_SET_ACTIVE_MENU, UIMENU_NOTEBOOK ); // startup notebook
}
}
示例10: SV_DirectConnect
//.........这里部分代码省略.........
svs.challenges[i].adr.port = 0;
return;
}
if ( sv_maxPing->value && ping > sv_maxPing->value ) {
NET_OutOfBandPrint( NS_SERVER, from, va("print\n%s\n", SE_GetString("MP_SVGAME", "SERVER_FOR_LOW_PING")));//Server is for low pings only\n" );
Com_DPrintf (SE_GetString("MP_SVGAME", "CLIENT_REJECTED_HIGH_PING"), i);//"Client %i rejected on a too high ping\n", i);
return;
}
}
} else {
// force the "ip" info key to "localhost"
Info_SetValueForKey( userinfo, "ip", "localhost" );
}
newcl = &temp;
Com_Memset (newcl, 0, sizeof(client_t));
// if there is already a slot for this ip, reuse it
for (i=0,cl=svs.clients ; i < sv_maxclients->integer ; i++,cl++) {
if ( cl->state == CS_FREE ) {
continue;
}
if ( NET_CompareBaseAdr( from, cl->netchan.remoteAddress )
&& ( cl->netchan.qport == qport
|| from.port == cl->netchan.remoteAddress.port ) ) {
Com_Printf ("%s:reconnect\n", NET_AdrToString (from));
newcl = cl;
#ifdef _XBOX
reconnect = true;
#endif
// VVFIXME - both SOF2 and Wolf remove this call, claiming it blows away the user's info
// disconnect the client from the game first so any flags the
// player might have are dropped
VM_Call( gvm, GAME_CLIENT_DISCONNECT, newcl - svs.clients );
//
goto gotnewcl;
}
}
// find a client slot
// if "sv_privateClients" is set > 0, then that number
// of client slots will be reserved for connections that
// have "password" set to the value of "sv_privatePassword"
// Info requests will report the maxclients as if the private
// slots didn't exist, to prevent people from trying to connect
// to a full server.
// This is to allow us to reserve a couple slots here on our
// servers so we can play without having to kick people.
// check for privateClient password
password = Info_ValueForKey( userinfo, "password" );
if ( !strcmp( password, sv_privatePassword->string ) ) {
startIndex = 0;
} else {
// skip past the reserved slots
startIndex = sv_privateClients->integer;
}
newcl = NULL;
for ( i = startIndex; i < sv_maxclients->integer ; i++ ) {
cl = &svs.clients[i];
if (cl->state == CS_FREE) {
newcl = cl;
break;
}
}
示例11: SV_FinalMessage
/*
=====================
SV_DropClient
Called when the player is totally leaving the server, either willingly
or unwillingly. This is NOT called if the entire server is quiting
or crashing -- SV_FinalMessage() will handle that
=====================
*/
void SV_DropClient( client_t *drop, const char *reason ) {
int i;
challenge_t *challenge;
if ( drop->state == CS_ZOMBIE ) {
return; // already dropped
}
if ( !drop->gentity || !(drop->gentity->r.svFlags & SVF_BOT) ) {
// see if we already have a challenge for this ip
challenge = &svs.challenges[0];
for (i = 0 ; i < MAX_CHALLENGES ; i++, challenge++) {
if ( NET_CompareAdr( drop->netchan.remoteAddress, challenge->adr ) ) {
challenge->connected = qfalse;
break;
}
}
}
// Kill any download
SV_CloseDownload( drop );
// tell everyone why they got dropped
SV_SendServerCommand( NULL, "print \"%s" S_COLOR_WHITE " %s\n\"", drop->name, reason );
Com_DPrintf( "Going to CS_ZOMBIE for %s\n", drop->name );
drop->state = CS_ZOMBIE; // become free in a few seconds
if (drop->download) {
FS_FCloseFile( drop->download );
drop->download = 0;
}
// call the prog function for removing a client
// this will remove the body, among other things
VM_Call( gvm, GAME_CLIENT_DISCONNECT, drop - svs.clients );
// add the disconnect command
SV_SendServerCommand( drop, va("disconnect \"%s\"", reason ) );
if ( drop->netchan.remoteAddress.type == NA_BOT ) {
SV_BotFreeClient( drop - svs.clients );
}
// nuke user info
SV_SetUserinfo( drop - svs.clients, "" );
// if this was the last client on the server, send a heartbeat
// to the master so it is known the server is empty
// send a heartbeat now so the master will get up to date info
// if there is already a slot for this ip, reuse it
for (i=0 ; i < sv_maxclients->integer ; i++ ) {
if ( svs.clients[i].state >= CS_CONNECTED ) {
break;
}
}
if ( i == sv_maxclients->integer ) {
SV_Heartbeat_f();
}
}
示例12: SV_MasterHeartbeat
void SV_MasterHeartbeat(const char *message)
{
static netadr_t adr[MAX_MASTER_SERVERS][2]; // [2] for v4 and v6 address for the same address string.
int i;
int res;
int netenabled;
netenabled = Cvar_VariableIntegerValue("net_enabled");
// "dedicated 1" is for lan play, "dedicated 2" is for inet public play
if (!com_dedicated || com_dedicated->integer != 2 || !(netenabled & (NET_ENABLEV4 | NET_ENABLEV6)))
return; // only dedicated servers send heartbeats
// if not time yet, don't send anything
if ( svs.time < svs.nextHeartbeatTime )
return;
svs.nextHeartbeatTime = svs.time + HEARTBEAT_MSEC;
VM_Call( gvm, GAME_AUTHSERVER_HEARTBEAT );
// send to group masters
for (i = 0; i < MAX_MASTER_SERVERS; i++)
{
if(!sv_master[i]->string[0])
continue;
// see if we haven't already resolved the name
// resolving usually causes hitches on win95, so only
// do it when needed
if(sv_master[i]->modified || (adr[i][0].type == NA_BAD && adr[i][1].type == NA_BAD))
{
sv_master[i]->modified = qfalse;
if(netenabled & NET_ENABLEV4)
{
Com_Printf("Resolving %s (IPv4)\n", sv_master[i]->string);
res = NET_StringToAdr(sv_master[i]->string, &adr[i][0], NA_IP);
if(res == 2)
{
// if no port was specified, use the default master port
adr[i][0].port = BigShort(PORT_MASTER);
}
if(res)
Com_Printf( "%s resolved to %s\n", sv_master[i]->string, NET_AdrToStringwPort(adr[i][0]));
else
Com_Printf( "%s has no IPv4 address.\n", sv_master[i]->string);
}
if(netenabled & NET_ENABLEV6)
{
Com_Printf("Resolving %s (IPv6)\n", sv_master[i]->string);
res = NET_StringToAdr(sv_master[i]->string, &adr[i][1], NA_IP6);
if(res == 2)
{
// if no port was specified, use the default master port
adr[i][1].port = BigShort(PORT_MASTER);
}
if(res)
Com_Printf( "%s resolved to %s\n", sv_master[i]->string, NET_AdrToStringwPort(adr[i][1]));
else
Com_Printf( "%s has no IPv6 address.\n", sv_master[i]->string);
}
if(adr[i][0].type == NA_BAD && adr[i][1].type == NA_BAD)
{
// if the address failed to resolve, clear it
// so we don't take repeated dns hits
Com_Printf("Couldn't resolve address: %s\n", sv_master[i]->string);
Cvar_Set(sv_master[i]->name, "");
sv_master[i]->modified = qfalse;
continue;
}
}
Com_Printf ("Sending heartbeat to %s\n", sv_master[i]->string );
// this command should be changed if the server info / status format
// ever incompatably changes
if(adr[i][0].type != NA_BAD)
NET_OutOfBandPrint( NS_SERVER, adr[i][0], "heartbeat %s\n", message);
if(adr[i][1].type != NA_BAD)
NET_OutOfBandPrint( NS_SERVER, adr[i][1], "heartbeat %s\n", message);
}
}
示例13: SV_DirectConnect
//.........这里部分代码省略.........
newcl = NULL;
for ( i = startIndex; i < MAX_PLAYERS ; i++ ) {
cl = &svs.clients[i];
if (cl->state == CS_FREE) {
newcl = cl;
break;
}
}
if ( !newcl ) {
if ( NET_IsLocalAddress( from ) ) {
count = 0;
for ( i = startIndex; i < sv_maxclients->integer ; i++ ) {
cl = &svs.clients[i];
if (cl->netchan.remoteAddress.type == NA_BOT) {
count++;
}
}
// if they're all bots
if (count >= sv_maxclients->integer - startIndex) {
SV_DropClient(&svs.clients[sv_maxclients->integer - 1], "only bots on server");
newcl = &svs.clients[sv_maxclients->integer - 1];
}
else {
Com_Error( ERR_FATAL, "server is full on local connect\n" );
return;
}
}
else {
NET_OutOfBandPrint( NS_SERVER, from, "print\nServer is full.\n" );
Com_DPrintf ("Rejected a connection.\n");
return;
}
}
// we got a newcl, so reset the reliableSequence and reliableAcknowledge
cl->reliableAcknowledge = 0;
cl->reliableSequence = 0;
gotnewcl:
// build a new connection
// accept the new client
// this is the only place a client_t is ever initialized
*newcl = temp;
clientNum = newcl - svs.clients;
ent = SV_GentityNum( clientNum );
newcl->gentity = ent;
// save the challenge
newcl->challenge = challenge;
// save the address
Netchan_Setup (NS_SERVER, &newcl->netchan , from, qport);
// init the netchan queue
newcl->netchan_end_queue = &newcl->netchan_start_queue;
// save the userinfo
Q_strncpyz( newcl->userinfo, userinfo, sizeof(newcl->userinfo) );
// get the game a chance to reject this connection or modify the userinfo
denied = VM_Call( gvm, GAME_CLIENT_CONNECT, clientNum, qtrue, qfalse ); // firstTime = qtrue
if ( denied ) {
// we can't just use VM_ArgPtr, because that is only valid inside a VM_Call
char *str = VM_ExplicitArgPtr( gvm, denied );
NET_OutOfBandPrint( NS_SERVER, from, "error\n%s\n", str );
Com_DPrintf ("Game rejected a connection: %s.\n", str);
return;
}
SV_UserinfoChanged( newcl );
// send the connect packet to the client
NET_OutOfBandPrint( NS_SERVER, from, "connectResponse" );
Com_DPrintf( "Going from CS_FREE to CS_CONNECTED for %s\n", newcl->name );
newcl->state = CS_CONNECTED;
newcl->nextSnapshotTime = svs.time;
newcl->lastPacketTime = svs.time;
newcl->lastConnectTime = svs.time;
// when we receive the first packet from the client, we will
// notice that it is from a different serverid and that the
// gamestate message was not just sent, forcing a retransmit
newcl->gamestateMessageNum = -1;
// if this was the first client on the server, or the last client
// the server can hold, send a heartbeat to the master.
count = 0;
for (i=0,cl=svs.clients ; i < sv_maxclients->integer ; i++,cl++) {
if ( svs.clients[i].state >= CS_CONNECTED ) {
count++;
}
}
if ( count == 1 || count == sv_maxclients->integer ) {
SV_Heartbeat_f();
}
}
示例14: CL_CgameSystemCalls
//.........这里部分代码省略.........
case CG_CIN_DRAWCINEMATIC:
CIN_DrawCinematic( args[1] );
return 0;
case CG_CIN_SETEXTENTS:
CIN_SetExtents( args[1], args[2], args[3], args[4], args[5] );
return 0;
case CG_R_REMAP_SHADER:
re.RemapShader( VMA( 1 ), VMA( 2 ), VMA( 3 ) );
return 0;
case CG_TESTPRINTINT:
// Com_Printf( "%s%i\n", (const char*)VMA( 1 ), args[2] );
return 0;
case CG_TESTPRINTFLOAT:
// Com_Printf( "%s%f\n", (const char*)VMA( 1 ), VMF( 2 ) );
return 0;
case CG_LOADCAMERA:
return loadCamera( args[1], VMA( 2 ) );
case CG_STARTCAMERA:
startCamera( args[1], args[2] );
return 0;
case CG_GETCAMERAINFO:
return getCameraInfo( args[1], args[2], VMA( 3 ), VMA( 4 ), VMA( 5 ) );
case CG_GET_ENTITY_TOKEN:
return re.GetEntityToken( VMA( 1 ), args[2] );
case CG_INGAME_POPUP:
if ( clc.state == CA_ACTIVE && !clc.demoplaying ) {
// NERVE - SMF
if ( VMA( 1 ) && !Q_stricmp( VMA( 1 ), "UIMENU_WM_PICKTEAM" ) ) {
VM_Call( uivm, UI_SET_ACTIVE_MENU, UIMENU_WM_PICKTEAM );
} else if ( VMA( 1 ) && !Q_stricmp( VMA( 1 ), "UIMENU_WM_PICKPLAYER" ) ) {
VM_Call( uivm, UI_SET_ACTIVE_MENU, UIMENU_WM_PICKPLAYER );
} else if ( VMA( 1 ) && !Q_stricmp( VMA( 1 ), "UIMENU_WM_QUICKMESSAGE" ) ) {
VM_Call( uivm, UI_SET_ACTIVE_MENU, UIMENU_WM_QUICKMESSAGE );
} else if ( VMA( 1 ) && !Q_stricmp( VMA( 1 ), "UIMENU_WM_QUICKMESSAGEALT" ) ) {
VM_Call( uivm, UI_SET_ACTIVE_MENU, UIMENU_WM_QUICKMESSAGEALT );
} else if ( VMA( 1 ) && !Q_stricmp( VMA( 1 ), "UIMENU_WM_LIMBO" ) ) {
VM_Call( uivm, UI_SET_ACTIVE_MENU, UIMENU_WM_LIMBO );
} else if ( VMA( 1 ) && !Q_stricmp( VMA( 1 ), "UIMENU_WM_AUTOUPDATE" ) ) {
VM_Call( uivm, UI_SET_ACTIVE_MENU, UIMENU_WM_AUTOUPDATE );
}
// -NERVE - SMF
else if ( VMA( 1 ) && !Q_stricmp( VMA( 1 ), "hbook1" ) ) { //----(SA)
VM_Call( uivm, UI_SET_ACTIVE_MENU, UIMENU_BOOK1 );
} else if ( VMA( 1 ) && !Q_stricmp( VMA( 1 ), "hbook2" ) ) { //----(SA)
VM_Call( uivm, UI_SET_ACTIVE_MENU, UIMENU_BOOK2 );
} else if ( VMA( 1 ) && !Q_stricmp( VMA( 1 ), "hbook3" ) ) { //----(SA)
VM_Call( uivm, UI_SET_ACTIVE_MENU, UIMENU_BOOK3 );
} else {
VM_Call( uivm, UI_SET_ACTIVE_MENU, UIMENU_CLIPBOARD );
}
}
return 0;
// NERVE - SMF
case CG_INGAME_CLOSEPOPUP:
// if popup menu is up, then close it
if ( VMA( 1 ) && !Q_stricmp( VMA( 1 ), "UIMENU_WM_LIMBO" ) ) {
if ( VM_Call( uivm, UI_GET_ACTIVE_MENU ) == UIMENU_WM_LIMBO ) {
VM_Call( uivm, UI_KEY_EVENT, K_ESCAPE, qtrue );
VM_Call( uivm, UI_KEY_EVENT, K_ESCAPE, qtrue );
}
}
return 0;
case CG_LIMBOCHAT:
if ( VMA( 1 ) ) {
CL_AddToLimboChat( VMA( 1 ) );
}
return 0;
case CG_KEY_GETBINDINGBUF:
Key_GetBindingBuf( args[1], VMA( 2 ), args[3] );
return 0;
case CG_KEY_SETBINDING:
Key_SetBinding( args[1], VMA( 2 ) );
return 0;
case CG_KEY_KEYNUMTOSTRINGBUF:
Key_KeynumToStringBuf( args[1], VMA( 2 ), args[3] );
return 0;
case CG_TRANSLATE_STRING:
CL_TranslateString( VMA( 1 ), VMA( 2 ) );
return 0;
// - NERVE - SMF
default:
Com_Error( ERR_DROP, "Bad cgame system trap: %ld", (long int) args[0] );
}
return 0;
}
示例15: CL_InitCGame
/*
====================
CL_InitCGame
Should only be called by CL_StartHunkUsers
====================
*/
void CL_InitCGame( void ) {
const char *info;
const char *mapname;
int t1, t2;
vmInterpret_t interpret;
#ifdef SMOKINGUNS
int l;
char *at;
char blockThis[255];
char *buf;
char **tempBuf;
int capacity = 40;
#endif
t1 = Sys_Milliseconds();
// Load language filter
#ifdef SMOKINGUNS
if( !badWords )
{
numWords = 0;
buf = Cvar_VariableString( "cg_filterWords" );
if( strlen( buf ) > 0 )
{
l = 0;
badWords = Z_Malloc( capacity * sizeof( char* ) );
at = buf;
while( ( at = strchr( buf, ',' ) ) )
{
if( ( l-1 ) > capacity ) // ( l-1 ) because we want to leave room for the last word
{
tempBuf = Z_Malloc( ( capacity + 40 ) * sizeof( char** ) );
Com_Memcpy( tempBuf, badWords, capacity * sizeof( char** ) );
Z_Free( badWords );
badWords = tempBuf;
capacity += 40;
}
strncpy( blockThis, buf, ( strchr( buf, ',' ) - buf ) );
blockThis[( strchr( buf, ',' ) - buf )] = '\0';
badWords[l] = strdup( blockThis );
buf = at + 1;
++l;
}
badWords[l] = strdup( buf );
++l;
numWords = l;
}
else
Com_Printf( "No filter loaded.\n" );
}
#endif
// put away the console
Con_Close();
// find the current mapname
info = cl.gameState.stringData + cl.gameState.stringOffsets[ CS_SERVERINFO ];
mapname = Info_ValueForKey( info, "mapname" );
Com_sprintf( cl.mapname, sizeof( cl.mapname ), "maps/%s.bsp", mapname );
// load the dll or bytecode
if ( cl_connectedToPureServer != 0 ) {
// if sv_pure is set we only allow qvms to be loaded
interpret = VMI_COMPILED;
}
else {
interpret = Cvar_VariableValue( "vm_cgame" );
}
cgvm = VM_Create( "cgame", CL_CgameSystemCalls, interpret );
if ( !cgvm ) {
Com_Error( ERR_DROP, "VM_Create on cgame failed" );
}
cls.state = CA_LOADING;
// init for this gamestate
// use the lastExecutedServerCommand instead of the serverCommandSequence
// otherwise server commands sent just before a gamestate are dropped
VM_Call( cgvm, CG_INIT, clc.serverMessageSequence, clc.lastExecutedServerCommand, clc.clientNum );
// reset any CVAR_CHEAT cvars registered by cgame
if ( !clc.demoplaying && !cl_connectedToCheatServer )
Cvar_SetCheatState();
// we will send a usercmd this frame, which
// will cause the server to send us the first snapshot
//.........这里部分代码省略.........