void CL_SeekEnd_f(void) { double t; if (!clc.demoplaying) { Com_FuncPrinf("not playing demo can't seek\n"); return; } if (Cmd_Argc() < 2) { Com_FuncPrinf("usage: seek <time in seconds>\n"); return; } if (!Q_isnumeric(Cmd_Argv(1)[0])) { t = Cvar_VariableValue(Cmd_Argv(1)) * 1000.0; } else { t = atof(Cmd_Argv(1)) * 1000.0; } CL_DemoSeekMs((double)di.lastServerTime - t, -1); }
int Q_isalphanumeric( int c ) { if ( Q_isalpha( c ) || Q_isnumeric( c ) ) { return( 1 ); } return ( 0 ); }
void CL_Rewind_f(void) { double t; if (!clc.demoplaying) { Com_FuncPrinf("not playing demo can't rewind\n"); return; } if (Cmd_Argc() < 2) { Com_FuncPrinf("usage: rewind <time in seconds>\n"); return; } if (!Q_isnumeric(Cmd_Argv(1)[0])) { t = Cvar_VariableValue(Cmd_Argv(1)) * 1000.0; } else { t = atof(Cmd_Argv(1)) * 1000.0; } if (cl.serverTime <= 0) { Com_FuncDrop("Servertime was unacceptable: %i\n", cl.serverTime); return; } DEMODEBUG("Servertime: %d snaptime: %d\n", cl.serverTime, cl.snap.serverTime); CL_RewindDemo((double)cl.serverTime + di.Overf - t); }
qboolean Sys_StringToSockaddr( const char *s, struct sockaddr *sadr ) { struct hostent *h; int val; char copy[MAX_STRING_CHARS]; memset( sadr, 0, sizeof( *sadr ) ); // check for an IPX address if ( ( strlen( s ) == 21 ) && ( s[8] == '.' ) ) { ( (struct sockaddr_ipx *)sadr )->sa_family = AF_IPX; ( (struct sockaddr_ipx *)sadr )->sa_socket = 0; copy[2] = 0; DO( 0, sa_netnum[0] ); DO( 2, sa_netnum[1] ); DO( 4, sa_netnum[2] ); DO( 6, sa_netnum[3] ); DO( 9, sa_nodenum[0] ); DO( 11, sa_nodenum[1] ); DO( 13, sa_nodenum[2] ); DO( 15, sa_nodenum[3] ); DO( 17, sa_nodenum[4] ); DO( 19, sa_nodenum[5] ); } else { ( (struct sockaddr_in *)sadr )->sin_family = AF_INET; ( (struct sockaddr_in *)sadr )->sin_port = 0; if ( Q_isnumeric( s[0] ) ) { *(int *)&( (struct sockaddr_in *)sadr )->sin_addr = inet_addr( s ); } else { if ( ( h = gethostbyname( s ) ) == 0 ) { return 0; } *(int *)&( (struct sockaddr_in *)sadr )->sin_addr = *(int *)h->h_addr_list[0]; } } return qtrue; }
void CL_FastForward_f(void) { double t; double wantedTime; if (!clc.demoplaying) { Com_FuncPrinf("not playing demo can't fast forward\n"); return; } if (Cmd_Argc() < 2) { Com_FuncPrinf("usage: fastforward <time in seconds>\n"); return; } if (!Q_isnumeric(Cmd_Argv(1)[0])) { t = Cvar_VariableValue(Cmd_Argv(1)) * 1000.0; } else { t = atof(Cmd_Argv(1)) * 1000.0; } if (cl.snap.serverTime) { wantedTime = (double)cl.serverTime + di.Overf + t; } else { wantedTime = (double)di.firstServerTime + t; } CL_DemoFastForward(wantedTime); }
/* ============ AnimParseAnimConfig returns qfalse if error, qtrue otherwise ============ */ static qboolean AnimParseAnimConfig( playerInfo_t *animModelInfo, const char *filename, const char *input ) { char *text_p, *token; animation_t *animations; // headAnimation_t *headAnims; int i, fps, skip = -1; // if (!weaponStringsInited) { // BG_InitWeaponStrings(); // } // globalFilename = (char *)filename; animations = animModelInfo->animations; animModelInfo->numAnimations = 0; // headAnims = animModelInfo->headAnims; text_p = (char *)input; COM_BeginParseSession( "AnimParseAnimConfig" ); animModelInfo->footsteps = FOOTSTEP_NORMAL; VectorClear( animModelInfo->headOffset ); animModelInfo->gender = GENDER_MALE; animModelInfo->isSkeletal = qfalse; animModelInfo->version = 0; // read optional parameters while ( 1 ) { token = COM_Parse( &text_p ); if ( !token ) { break; } if ( !Q_stricmp( token, "footsteps" ) ) { token = COM_Parse( &text_p ); if ( !token ) { break; } if ( !Q_stricmp( token, "default" ) || !Q_stricmp( token, "normal" ) ) { animModelInfo->footsteps = FOOTSTEP_NORMAL; } else if ( !Q_stricmp( token, "boot" ) ) { animModelInfo->footsteps = FOOTSTEP_BOOT; } else if ( !Q_stricmp( token, "flesh" ) ) { animModelInfo->footsteps = FOOTSTEP_FLESH; } else if ( !Q_stricmp( token, "mech" ) ) { animModelInfo->footsteps = FOOTSTEP_MECH; } else if ( !Q_stricmp( token, "energy" ) ) { animModelInfo->footsteps = FOOTSTEP_ENERGY; } else { // BG_AnimParseError( "Bad footsteps parm '%s'\n", token ); } continue; } else if ( !Q_stricmp( token, "headoffset" ) ) { for ( i = 0 ; i < 3 ; i++ ) { token = COM_Parse( &text_p ); if ( !token ) { break; } animModelInfo->headOffset[i] = atof( token ); } continue; } else if ( !Q_stricmp( token, "sex" ) ) { token = COM_Parse( &text_p ); if ( !token ) { break; } if ( token[0] == 'f' || token[0] == 'F' ) { animModelInfo->gender = GENDER_FEMALE; } else if ( token[0] == 'n' || token[0] == 'N' ) { animModelInfo->gender = GENDER_NEUTER; } else { animModelInfo->gender = GENDER_MALE; } continue; } else if ( !Q_stricmp( token, "version" ) ) { token = COM_Parse( &text_p ); if ( !token ) { break; } animModelInfo->version = atoi( token ); continue; } else if ( !Q_stricmp( token, "skeletal" ) ) { animModelInfo->isSkeletal = qtrue; continue; } if ( animModelInfo->version < 2 ) { // if it is a number, start parsing animations if ( Q_isnumeric( token[0] ) ) { text_p -= strlen( token ); // unget the token break; } } // STARTANIMS marks the start of the animations if ( !Q_stricmp( token, "STARTANIMS" ) ) { break; } // BG_AnimParseError( "unknown token '%s'", token ); } // read information for each frame for ( i = 0 ; ( animModelInfo->version > 1 ) || ( i < MAX_ANIMATIONS ) ; i++ ) { token = COM_Parse( &text_p ); if ( !token ) { break; } if ( animModelInfo->version > 1 ) { // includes animation names at start of each line if ( !Q_stricmp( token, "ENDANIMS" ) ) { // end of animations break; } Q_strncpyz( animations[i].name, token, sizeof( animations[i].name ) ); // convert to all lower case Q_strlwr( animations[i].name ); // token = COM_ParseExt( &text_p, qfalse ); if ( !token || !token[0] ) { // BG_AnimParseError( "end of file without ENDANIMS" ); break; } } else { // just set it to the equivalent animStrings[] Q_strncpyz( animations[i].name, animStrings[i], sizeof( animations[i].name ) ); // convert to all lower case Q_strlwr( animations[i].name ); } animations[i].firstFrame = atoi( token ); if ( !animModelInfo->isSkeletal ) { // skeletal models dont require adjustment // leg only frames are adjusted to not count the upper body only frames if ( i == LEGS_WALKCR ) { skip = animations[LEGS_WALKCR].firstFrame - animations[TORSO_GESTURE].firstFrame; } if ( i >= LEGS_WALKCR ) { animations[i].firstFrame -= skip; } } token = COM_ParseExt( &text_p, qfalse ); if ( !token || !token[0] ) { // BG_AnimParseError( "end of file without ENDANIMS" ); break; } animations[i].numFrames = atoi( token ); token = COM_ParseExt( &text_p, qfalse ); if ( !token || !token[0] ) { // BG_AnimParseError( "end of file without ENDANIMS: line %i" ); break; } animations[i].loopFrames = atoi( token ); token = COM_ParseExt( &text_p, qfalse ); if ( !token || !token[0] ) { // BG_AnimParseError( "end of file without ENDANIMS: line %i" ); break; } fps = atof( token ); if ( fps == 0 ) { fps = 1; } animations[i].frameLerp = 1000 / fps; animations[i].initialLerp = 1000 / fps; // movespeed token = COM_ParseExt( &text_p, qfalse ); if ( !token || !token[0] ) { // BG_AnimParseError( "end of file without ENDANIMS" ); break; } animations[i].moveSpeed = atoi( token ); // animation blending token = COM_ParseExt( &text_p, qfalse ); // must be on same line if ( !token ) { animations[i].animBlend = 0; } else { animations[i].animBlend = atoi( token ); } // calculate the duration animations[i].duration = animations[i].initialLerp + animations[i].frameLerp * animations[i].numFrames + animations[i].animBlend; // get the nameHash animations[i].nameHash = BG_StringHashValue( animations[i].name ); if ( !Q_strncmp( animations[i].name, "climb", 5 ) ) { animations[i].flags |= ANIMFL_LADDERANIM; } if ( strstr( animations[i].name, "firing" ) ) { animations[i].flags |= ANIMFL_FIRINGANIM; animations[i].initialLerp = 40; } } animModelInfo->numAnimations = i; if ( animModelInfo->version < 2 && i != MAX_ANIMATIONS ) { // BG_AnimParseError( "Incorrect number of animations" ); return qfalse; } #if 0 // check for head anims token = COM_Parse( &text_p ); if ( token && token[0] ) { if ( animModelInfo->version < 2 || !Q_stricmp( token, "HEADFRAMES" ) ) { // read information for each head frame for ( i = 0 ; i < MAX_HEAD_ANIMS ; i++ ) { token = COM_Parse( &text_p ); if ( !token || !token[0] ) { break; } if ( animModelInfo->version > 1 ) { // includes animation names at start of each line // just throw this information away, not required for head token = COM_ParseExt( &text_p, qfalse ); if ( !token || !token[0] ) { break; } } if ( !i ) { skip = atoi( token ); } headAnims[i].firstFrame = atoi( token ); // modify according to last frame of the main animations, since the head is totally seperate headAnims[i].firstFrame -= animations[MAX_ANIMATIONS - 1].firstFrame + animations[MAX_ANIMATIONS - 1].numFrames + skip; token = COM_ParseExt( &text_p, qfalse ); if ( !token || !token[0] ) { break; } headAnims[i].numFrames = atoi( token ); // skip the movespeed token = COM_ParseExt( &text_p, qfalse ); } // animModelInfo->numHeadAnims = i; if ( i != MAX_HEAD_ANIMS ) { // BG_AnimParseError( "Incorrect number of head frames" ); return qfalse; } } } #endif return qtrue; }
static void CG_Rocket_DFServerPing( int handle, const char *data ) { const char *str = Info_ValueForKey( data, "1" ); Rocket_DataFormatterFormattedData( handle, *str && Q_isnumeric( *str ) ? va( "%s ms", Info_ValueForKey( data, "1" ) ) : "", false ); }
qboolean Sys_StringToSockaddr( const char *s, struct sockaddr *sadr ) { struct hostent *h; int val; char copy[MAX_STRING_CHARS]; memset( sadr, 0, sizeof( *sadr ) ); // check for an IPX address #if !defined RTCW_ET if ( ( strlen( s ) == 21 ) && ( s[8] == '.' ) ) { #else // rain - too easy to falsely match a real hostname // if( ( strlen( s ) == 21 ) && ( s[8] == '.' ) ) { if ( NET_IsIPXAddress( s ) ) { #endif // RTCW_XX ( (struct sockaddr_ipx *)sadr )->sa_family = AF_IPX; ( (struct sockaddr_ipx *)sadr )->sa_socket = 0; copy[2] = 0; DO( 0, sa_netnum[0] ); DO( 2, sa_netnum[1] ); DO( 4, sa_netnum[2] ); DO( 6, sa_netnum[3] ); DO( 9, sa_nodenum[0] ); DO( 11, sa_nodenum[1] ); DO( 13, sa_nodenum[2] ); DO( 15, sa_nodenum[3] ); DO( 17, sa_nodenum[4] ); DO( 19, sa_nodenum[5] ); } else { ( (struct sockaddr_in *)sadr )->sin_family = AF_INET; ( (struct sockaddr_in *)sadr )->sin_port = 0; #if defined RTCW_SP if ( Q_isnumeric( s[0] ) ) { #else if ( s[0] >= '0' && s[0] <= '9' ) { #endif // RTCW_XX *(int *)&( (struct sockaddr_in *)sadr )->sin_addr = inet_addr( s ); } else { if ( ( h = gethostbyname( s ) ) == 0 ) { return 0; } *(int *)&( (struct sockaddr_in *)sadr )->sin_addr = *(int *)h->h_addr_list[0]; } } return qtrue; } #undef DO /* ============= Sys_StringToAdr idnewt 192.246.40.70 ============= */ qboolean Sys_StringToAdr( const char *s, netadr_t *a ) { struct sockaddr sadr; if ( !Sys_StringToSockaddr( s, &sadr ) ) { return qfalse; } SockadrToNetadr( &sadr, a ); return qtrue; } //============================================================================= /* ================== Sys_GetPacket Never called by the game logic, just the system event queing ================== */ int recvfromCount; qboolean Sys_GetPacket( netadr_t *net_from, msg_t *net_message ) { int ret; struct sockaddr from; int fromlen; int net_socket; int protocol; int err; for ( protocol = 0 ; protocol < 2 ; protocol++ ) { if ( protocol == 0 ) { net_socket = ip_socket; } else { net_socket = ipx_socket; } if ( !net_socket ) { continue; } fromlen = sizeof( from ); recvfromCount++; // performance check ret = recvfrom( net_socket, reinterpret_cast<char*> (net_message->data), net_message->maxsize, 0, (struct sockaddr *)&from, &fromlen ); if ( ret == SOCKET_ERROR ) { err = WSAGetLastError(); if ( err == WSAEWOULDBLOCK || err == WSAECONNRESET ) { continue; } Com_Printf( "NET_GetPacket: %s\n", NET_ErrorString() ); continue; } if ( net_socket == ip_socket ) { memset( ( (struct sockaddr_in *)&from )->sin_zero, 0, 8 ); } if ( usingSocks && net_socket == ip_socket && memcmp( &from, &socksRelayAddr, fromlen ) == 0 ) { if ( ret < 10 || net_message->data[0] != 0 || net_message->data[1] != 0 || net_message->data[2] != 0 || net_message->data[3] != 1 ) { continue; } net_from->type = NA_IP; net_from->ip[0] = net_message->data[4]; net_from->ip[1] = net_message->data[5]; net_from->ip[2] = net_message->data[6]; net_from->ip[3] = net_message->data[7]; net_from->port = *(short *)&net_message->data[8]; net_message->readcount = 10; } else { SockadrToNetadr( &from, net_from ); net_message->readcount = 0; } if ( ret == net_message->maxsize ) { Com_Printf( "Oversize packet from %s\n", NET_AdrToString( *net_from ) ); continue; } net_message->cursize = ret; return qtrue; } return qfalse; } //============================================================================= static char socksBuf[4096]; /* ================== Sys_SendPacket ================== */ void Sys_SendPacket( int length, const void *data, netadr_t to ) { int ret; struct sockaddr addr; SOCKET net_socket; if ( to.type == NA_BROADCAST ) { net_socket = ip_socket; } else if ( to.type == NA_IP ) { net_socket = ip_socket; } else if ( to.type == NA_IPX ) { net_socket = ipx_socket; } else if ( to.type == NA_BROADCAST_IPX ) { net_socket = ipx_socket; } else { Com_Error( ERR_FATAL, "Sys_SendPacket: bad address type" ); return; } if ( !net_socket ) { return; } NetadrToSockadr( &to, &addr ); if ( usingSocks && to.type == NA_IP ) { socksBuf[0] = 0; // reserved socksBuf[1] = 0; socksBuf[2] = 0; // fragment (not fragmented) socksBuf[3] = 1; // address type: IPV4 *(int *)&socksBuf[4] = ( (struct sockaddr_in *)&addr )->sin_addr.s_addr; *(short *)&socksBuf[8] = ( (struct sockaddr_in *)&addr )->sin_port; memcpy( &socksBuf[10], data, length ); ret = sendto( net_socket, socksBuf, length + 10, 0, &socksRelayAddr, sizeof( socksRelayAddr ) ); } else { ret = sendto( net_socket, static_cast<const char*> (data), length, 0, &addr, sizeof( addr ) ); } if ( ret == SOCKET_ERROR ) { int err = WSAGetLastError(); // wouldblock is silent if ( err == WSAEWOULDBLOCK ) { return; } // some PPP links do not allow broadcasts and return an error if ( ( err == WSAEADDRNOTAVAIL ) && ( ( to.type == NA_BROADCAST ) || ( to.type == NA_BROADCAST_IPX ) ) ) { return; } Com_Printf( "NET_SendPacket: %s\n", NET_ErrorString() ); } }