01 Aug 2008
This commit is contained in:
parent
ad1f8e3181
commit
89286b5444
@ -45,5 +45,4 @@ launch\studio\
|
|||||||
launch\viewer\
|
launch\viewer\
|
||||||
launch\wadlib\
|
launch\wadlib\
|
||||||
launch\credits\
|
launch\credits\
|
||||||
launch\install\
|
launch\install\
|
||||||
launch\dedicated\
|
|
@ -66,7 +66,7 @@ shader_t *FindShader( const char *texture )
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
// convert to lower case
|
// convert to lower case
|
||||||
strlower(texture, texname );
|
com.strlwr(texture, texname );
|
||||||
|
|
||||||
// build full path
|
// build full path
|
||||||
com.sprintf (shader, "textures/%s", texname );
|
com.sprintf (shader, "textures/%s", texname );
|
||||||
|
@ -2550,9 +2550,9 @@ void CreateModelScript( void )
|
|||||||
{
|
{
|
||||||
// FIXME: make cases for "attack_%"
|
// FIXME: make cases for "attack_%"
|
||||||
FS_Printf( f, "$sequence \"t->filenames[i]\" \"t->filenames[i]\"" );
|
FS_Printf( f, "$sequence \"t->filenames[i]\" \"t->filenames[i]\"" );
|
||||||
if(stristr(t->filenames[i], "walk" )) FS_Printf( f, "LX fps 30 loop ACT_WALK 1\n" );
|
if(com.stristr(t->filenames[i], "walk" )) FS_Printf( f, "LX fps 30 loop ACT_WALK 1\n" );
|
||||||
else if(stristr(t->filenames[i], "run" )) FS_Printf( f, "LX fps 30 loop ACT_RUN 1\n" );
|
else if(com.stristr(t->filenames[i], "run" )) FS_Printf( f, "LX fps 30 loop ACT_RUN 1\n" );
|
||||||
else if(stristr(t->filenames[i], "idle")) FS_Printf( f, "fps 16 loop ACT_IDLE 50\n" );
|
else if(com.stristr(t->filenames[i], "idle")) FS_Printf( f, "fps 16 loop ACT_IDLE 50\n" );
|
||||||
else FS_Printf( f, "fps 16\n" );
|
else FS_Printf( f, "fps 16\n" );
|
||||||
}
|
}
|
||||||
FS_Printf(f, "\n" ); //finished
|
FS_Printf(f, "\n" ); //finished
|
||||||
|
@ -721,15 +721,15 @@ int lookup_texture( char *texturename )
|
|||||||
|
|
||||||
for (i = 0; i < numtextures; i++)
|
for (i = 0; i < numtextures; i++)
|
||||||
{
|
{
|
||||||
if (stricmp( texture[i].name, texturename ) == 0)
|
if (com.stricmp( texture[i].name, texturename ) == 0)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy( texture[i].name, texturename, sizeof(texture[i].name));
|
com.strncpy( texture[i].name, texturename, sizeof(texture[i].name));
|
||||||
|
|
||||||
if(stristr( texturename, "chrome" ) != NULL)
|
if(com.stristr( texturename, "chrome" ) != NULL)
|
||||||
texture[i].flags = STUDIO_NF_FLATSHADE | STUDIO_NF_CHROME;
|
texture[i].flags = STUDIO_NF_FLATSHADE | STUDIO_NF_CHROME;
|
||||||
else if(stristr( texturename, "bright" ) != NULL)
|
else if(com.stristr( texturename, "bright" ) != NULL)
|
||||||
texture[i].flags = STUDIO_NF_FLATSHADE | STUDIO_NF_FULLBRIGHT;
|
texture[i].flags = STUDIO_NF_FLATSHADE | STUDIO_NF_FULLBRIGHT;
|
||||||
else texture[i].flags = 0;
|
else texture[i].flags = 0;
|
||||||
|
|
||||||
|
@ -75,5 +75,5 @@ if exist vsound\vsound.plg del /f /q vsound\vsound.plg
|
|||||||
echo Build succeeded!
|
echo Build succeeded!
|
||||||
echo Please wait. Xash is now loading
|
echo Please wait. Xash is now loading
|
||||||
cd D:\Xash3D\
|
cd D:\Xash3D\
|
||||||
quake.exe -log -game tmpQuArK -debug -dev 3 +map walk_test
|
quake.exe -log -game tmpQuArK -debug -dev 3 +map qctest
|
||||||
:done
|
:done
|
@ -119,11 +119,11 @@ void CL_SetSky_f( void )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Cmd_Argc() > 2) rotate = atof(Cmd_Argv(2));
|
if(Cmd_Argc() > 2) rotate = com.atof(Cmd_Argv(2));
|
||||||
else rotate = 0;
|
else rotate = 0;
|
||||||
if(Cmd_Argc() == 6)
|
if(Cmd_Argc() == 6)
|
||||||
{
|
{
|
||||||
VectorSet(axis, atof(Cmd_Argv(3)), atof(Cmd_Argv(4)), atof(Cmd_Argv(5)));
|
VectorSet(axis, com.atof(Cmd_Argv(3)), com.atof(Cmd_Argv(4)), com.atof(Cmd_Argv(5)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -73,8 +73,8 @@ void Con_ToggleConsole_f( void )
|
|||||||
UI_HideMenu();
|
UI_HideMenu();
|
||||||
cls.key_dest = key_console;
|
cls.key_dest = key_console;
|
||||||
|
|
||||||
if(Cvar_VariableValue ("maxclients") == 1 && Host_ServerState())
|
if(com.atoi(cl.configstrings[CS_MAXCLIENTS]) == 1 && Host_ServerState())
|
||||||
Cvar_SetValue("paused", 1 );
|
Cvar_SetValue( "paused", 1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,7 +221,7 @@ void CL_ParseFrame( sizebuf_t *msg )
|
|||||||
memset( &cl.frame, 0, sizeof(cl.frame));
|
memset( &cl.frame, 0, sizeof(cl.frame));
|
||||||
cl.frame.serverframe = MSG_ReadLong (msg);
|
cl.frame.serverframe = MSG_ReadLong (msg);
|
||||||
cl.frame.deltaframe = MSG_ReadLong (msg);
|
cl.frame.deltaframe = MSG_ReadLong (msg);
|
||||||
cl.frame.servertime = cl.frame.serverframe * HOST_FRAMETIME;
|
cl.frame.servertime = cl.frame.serverframe * Host_FrameTime();
|
||||||
cl.surpressCount = MSG_ReadByte( msg );
|
cl.surpressCount = MSG_ReadByte( msg );
|
||||||
|
|
||||||
// If the frame is delta compressed from data that we
|
// If the frame is delta compressed from data that we
|
||||||
@ -257,8 +257,8 @@ void CL_ParseFrame( sizebuf_t *msg )
|
|||||||
|
|
||||||
// clamp time
|
// clamp time
|
||||||
if( cl.time > cl.frame.servertime ) cl.time = cl.frame.servertime;
|
if( cl.time > cl.frame.servertime ) cl.time = cl.frame.servertime;
|
||||||
else if( cl.time < cl.frame.servertime - HOST_FRAMETIME )
|
else if( cl.time < cl.frame.servertime - Host_FrameTime())
|
||||||
cl.time = cl.frame.servertime - HOST_FRAMETIME;
|
cl.time = cl.frame.servertime - Host_FrameTime();
|
||||||
|
|
||||||
// read areabits
|
// read areabits
|
||||||
len = MSG_ReadByte( msg );
|
len = MSG_ReadByte( msg );
|
||||||
@ -289,7 +289,7 @@ void CL_ParseFrame( sizebuf_t *msg )
|
|||||||
cls.state = ca_active;
|
cls.state = ca_active;
|
||||||
cl.force_refdef = true;
|
cl.force_refdef = true;
|
||||||
// getting a valid frame message ends the connection process
|
// getting a valid frame message ends the connection process
|
||||||
VectorScale( cl.frame.ps.origin, CL_COORD_FRAC, cl.predicted_origin );
|
VectorCopy( cl.frame.ps.origin, cl.predicted_origin );
|
||||||
VectorCopy( cl.frame.ps.viewangles, cl.predicted_angles );
|
VectorCopy( cl.frame.ps.viewangles, cl.predicted_angles );
|
||||||
}
|
}
|
||||||
CL_CheckPredictionError();
|
CL_CheckPredictionError();
|
||||||
@ -473,11 +473,11 @@ void CL_CalcViewValues( void )
|
|||||||
cl.time = cl.frame.servertime;
|
cl.time = cl.frame.servertime;
|
||||||
cl.lerpfrac = 1.0f;
|
cl.lerpfrac = 1.0f;
|
||||||
}
|
}
|
||||||
else if (cl.time < cl.frame.servertime - HOST_FRAMETIME )
|
else if (cl.time < cl.frame.servertime - Host_FrameTime())
|
||||||
{
|
{
|
||||||
if (cl_showclamp->value)
|
if (cl_showclamp->value)
|
||||||
Msg ("low clamp %i\n", cl.frame.servertime - host_frametime->value - cl.time);
|
Msg( "low clamp %i\n", cl.frame.servertime - Host_FrameTime() - cl.time);
|
||||||
cl.time = cl.frame.servertime - HOST_FRAMETIME;
|
cl.time = cl.frame.servertime - Host_FrameTime();
|
||||||
cl.lerpfrac = 0.0f;
|
cl.lerpfrac = 0.0f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -514,13 +514,13 @@ void CL_CalcViewValues( void )
|
|||||||
|
|
||||||
// smooth out stair climbing
|
// smooth out stair climbing
|
||||||
delta = cls.realtime - cl.predicted_step_time;
|
delta = cls.realtime - cl.predicted_step_time;
|
||||||
if( delta < HOST_FRAMETIME ) cl.refdef.vieworg[2] -= cl.predicted_step * (HOST_FRAMETIME - delta) * 0.01f;
|
if( delta < Host_FrameTime()) cl.refdef.vieworg[2] -= cl.predicted_step * (Host_FrameTime() - delta) * 0.01f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// just use interpolated values
|
// just use interpolated values
|
||||||
for( i = 0; i < 3; i++ )
|
for( i = 0; i < 3; i++ )
|
||||||
cl.refdef.vieworg[i] = LerpView( ops->origin[i] * CL_COORD_FRAC, ps->origin[i] * CL_COORD_FRAC, ops->viewoffset[i], ps->viewoffset[i], lerp );
|
cl.refdef.vieworg[i] = LerpView( ops->origin[i], ps->origin[i], ops->viewoffset[i], ps->viewoffset[i], lerp );
|
||||||
}
|
}
|
||||||
|
|
||||||
// if not running a demo or on a locked frame, add the local angle movement
|
// if not running a demo or on a locked frame, add the local angle movement
|
||||||
|
@ -62,7 +62,7 @@ void CL_RunLightStyles (void)
|
|||||||
clightstyle_t *ls;
|
clightstyle_t *ls;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ofs = cl.time / HOST_FRAMETIME;
|
ofs = cl.time / Host_FrameTime();
|
||||||
if( ofs == lastofs ) return;
|
if( ofs == lastofs ) return;
|
||||||
lastofs = ofs;
|
lastofs = ofs;
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ void IN_KeyDown( kbutton_t *b )
|
|||||||
char *c;
|
char *c;
|
||||||
|
|
||||||
c = Cmd_Argv(1);
|
c = Cmd_Argv(1);
|
||||||
if (c[0]) k = atoi(c);
|
if (c[0]) k = com.atoi(c);
|
||||||
else k = -1; // typed manually at the console for continuous down
|
else k = -1; // typed manually at the console for continuous down
|
||||||
|
|
||||||
if (k == b->down[0] || k == b->down[1])
|
if (k == b->down[0] || k == b->down[1])
|
||||||
@ -156,7 +156,7 @@ void IN_KeyDown( kbutton_t *b )
|
|||||||
c = Cmd_Argv(2);
|
c = Cmd_Argv(2);
|
||||||
b->downtime = com.atoi(c);
|
b->downtime = com.atoi(c);
|
||||||
|
|
||||||
if (!b->downtime) b->downtime = host.frametime[0] - HOST_FRAMETIME;
|
if (!b->downtime) b->downtime = host.frametime[0] - Host_FrameTime();
|
||||||
b->state |= 1 + 2; // down + impulse down
|
b->state |= 1 + 2; // down + impulse down
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ static void FindMatches( const char *s, const char *unused1, const char *unused2
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if(com.strnicmp( s, completionString, strlen( completionString )))
|
if(com.strnicmp( s, completionString, com.strlen( completionString )))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
matchCount++;
|
matchCount++;
|
||||||
@ -145,7 +145,7 @@ static void FindMatches( const char *s, const char *unused1, const char *unused2
|
|||||||
// cut shortestMatch to the amount common with s
|
// cut shortestMatch to the amount common with s
|
||||||
for ( i = 0; s[i]; i++ )
|
for ( i = 0; s[i]; i++ )
|
||||||
{
|
{
|
||||||
if ( com.tolower(shortestMatch[i]) != tolower(s[i]))
|
if ( com.tolower(shortestMatch[i]) != com.tolower(s[i]))
|
||||||
shortestMatch[i] = 0;
|
shortestMatch[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -157,7 +157,7 @@ PrintMatches
|
|||||||
*/
|
*/
|
||||||
static void PrintMatches( const char *s, const char *unused1, const char *m, void *unused2 )
|
static void PrintMatches( const char *s, const char *unused1, const char *m, void *unused2 )
|
||||||
{
|
{
|
||||||
if(!com.strnicmp( s, shortestMatch, strlen( shortestMatch )))
|
if(!com.strnicmp( s, shortestMatch, com.strlen( shortestMatch )))
|
||||||
if(m && *m) Msg( " %s ^3\"%s\"\n", s, m );
|
if(m && *m) Msg( " %s ^3\"%s\"\n", s, m );
|
||||||
else Msg( " %s\n", s ); // variable or command without description
|
else Msg( " %s\n", s ); // variable or command without description
|
||||||
}
|
}
|
||||||
@ -169,19 +169,19 @@ static void keyConcatArgs( void )
|
|||||||
|
|
||||||
for ( i = 1; i < Cmd_Argc(); i++ )
|
for ( i = 1; i < Cmd_Argc(); i++ )
|
||||||
{
|
{
|
||||||
strncat( completionField->buffer, " ", sizeof( completionField->buffer ));
|
com.strncat( completionField->buffer, " ", sizeof( completionField->buffer ));
|
||||||
arg = Cmd_Argv( i );
|
arg = Cmd_Argv( i );
|
||||||
while (*arg)
|
while (*arg)
|
||||||
{
|
{
|
||||||
if (*arg == ' ')
|
if (*arg == ' ')
|
||||||
{
|
{
|
||||||
strncat( completionField->buffer, "\"", sizeof( completionField->buffer ));
|
com.strncat( completionField->buffer, "\"", sizeof( completionField->buffer ));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
arg++;
|
arg++;
|
||||||
}
|
}
|
||||||
strncat( completionField->buffer, Cmd_Argv( i ), sizeof( completionField->buffer ));
|
com.strncat( completionField->buffer, Cmd_Argv( i ), sizeof( completionField->buffer ));
|
||||||
if (*arg == ' ') strncat( completionField->buffer, "\"", sizeof( completionField->buffer ));
|
if (*arg == ' ') com.strncat( completionField->buffer, "\"", sizeof( completionField->buffer ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,15 +189,15 @@ static void ConcatRemaining( const char *src, const char *start )
|
|||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
str = strstr(src, start);
|
str = com.strstr(src, start);
|
||||||
if (!str)
|
if (!str)
|
||||||
{
|
{
|
||||||
keyConcatArgs();
|
keyConcatArgs();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
str += strlen(start);
|
str += com.strlen(start);
|
||||||
strncat( completionField->buffer, str, sizeof( completionField->buffer ));
|
com.strncat( completionField->buffer, str, sizeof( completionField->buffer ));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -224,7 +224,7 @@ void Field_CompleteCommand( field_t *field )
|
|||||||
matchCount = 0;
|
matchCount = 0;
|
||||||
shortestMatch[0] = 0;
|
shortestMatch[0] = 0;
|
||||||
|
|
||||||
if(!strlen( completionString)) return;
|
if(!com.strlen( completionString)) return;
|
||||||
|
|
||||||
Cmd_LookupCmds( NULL, NULL, FindMatches );
|
Cmd_LookupCmds( NULL, NULL, FindMatches );
|
||||||
Cvar_LookupVars( 0, NULL, NULL, FindMatches );
|
Cvar_LookupVars( 0, NULL, NULL, FindMatches );
|
||||||
@ -237,35 +237,35 @@ void Field_CompleteCommand( field_t *field )
|
|||||||
bool result = false;
|
bool result = false;
|
||||||
|
|
||||||
// autocomplete second arg
|
// autocomplete second arg
|
||||||
if(!stricmp(Cmd_Argv(0), "map" ) || !stricmp(Cmd_Argv(0), "\\map" ))
|
if(!com.stricmp(Cmd_Argv(0), "map" ) || !com.stricmp(Cmd_Argv(0), "\\map" ))
|
||||||
{
|
{
|
||||||
result = Cmd_GetMapList(Cmd_Argv(1), filename, MAX_STRING );
|
result = Cmd_GetMapList(Cmd_Argv(1), filename, MAX_STRING );
|
||||||
}
|
}
|
||||||
else if(!stricmp(Cmd_Argv(0), "playsound" ) || !stricmp(Cmd_Argv(0), "\\playsound" ))
|
else if(!com.stricmp(Cmd_Argv(0), "playsound" ) || !com.stricmp(Cmd_Argv(0), "\\playsound" ))
|
||||||
{
|
{
|
||||||
result = Cmd_GetSoundList(Cmd_Argv(1), filename, MAX_STRING );
|
result = Cmd_GetSoundList(Cmd_Argv(1), filename, MAX_STRING );
|
||||||
}
|
}
|
||||||
else if(!stricmp(Cmd_Argv(0), "playdemo" ) || !stricmp(Cmd_Argv(0), "\\playdemo" ))
|
else if(!com.stricmp(Cmd_Argv(0), "playdemo" ) || !com.stricmp(Cmd_Argv(0), "\\playdemo" ))
|
||||||
{
|
{
|
||||||
result = Cmd_GetDemoList(Cmd_Argv(1), filename, MAX_STRING );
|
result = Cmd_GetDemoList(Cmd_Argv(1), filename, MAX_STRING );
|
||||||
}
|
}
|
||||||
else if(!stricmp(Cmd_Argv(0), "movie" ) || !stricmp(Cmd_Argv(0), "\\movie" ))
|
else if(!com.stricmp(Cmd_Argv(0), "movie" ) || !com.stricmp(Cmd_Argv(0), "\\movie" ))
|
||||||
{
|
{
|
||||||
result = Cmd_GetMovieList(Cmd_Argv(1), filename, MAX_STRING );
|
result = Cmd_GetMovieList(Cmd_Argv(1), filename, MAX_STRING );
|
||||||
}
|
}
|
||||||
else if(!stricmp(Cmd_Argv(0), "changelevel" ) || !stricmp(Cmd_Argv(0), "\\changelevel" ))
|
else if(!com.stricmp(Cmd_Argv(0), "changelevel" ) || !com.stricmp(Cmd_Argv(0), "\\changelevel" ))
|
||||||
{
|
{
|
||||||
result = Cmd_GetMapList(Cmd_Argv(1), filename, MAX_STRING );
|
result = Cmd_GetMapList(Cmd_Argv(1), filename, MAX_STRING );
|
||||||
}
|
}
|
||||||
else if(!stricmp(Cmd_Argv(0), "setfont" ) || !stricmp(Cmd_Argv(0), "\\setfont" ))
|
else if(!com.stricmp(Cmd_Argv(0), "setfont" ) || !com.stricmp(Cmd_Argv(0), "\\setfont" ))
|
||||||
{
|
{
|
||||||
result = Cmd_GetFontList(Cmd_Argv(1), filename, MAX_STRING );
|
result = Cmd_GetFontList(Cmd_Argv(1), filename, MAX_STRING );
|
||||||
}
|
}
|
||||||
else if(!stricmp(Cmd_Argv(0), "music" ) || !stricmp(Cmd_Argv(0), "\\music" ))
|
else if(!com.stricmp(Cmd_Argv(0), "music" ) || !com.stricmp(Cmd_Argv(0), "\\music" ))
|
||||||
{
|
{
|
||||||
result = Cmd_GetMusicList(Cmd_Argv(1), filename, MAX_STRING );
|
result = Cmd_GetMusicList(Cmd_Argv(1), filename, MAX_STRING );
|
||||||
}
|
}
|
||||||
else if(!stricmp(Cmd_Argv(0), "compile" ) || !stricmp(Cmd_Argv(0), "\\compile" ))
|
else if(!com.stricmp(Cmd_Argv(0), "compile" ) || !com.stricmp(Cmd_Argv(0), "\\compile" ))
|
||||||
{
|
{
|
||||||
result = Cmd_GetSourceList(Cmd_Argv(1), filename, MAX_STRING );
|
result = Cmd_GetSourceList(Cmd_Argv(1), filename, MAX_STRING );
|
||||||
}
|
}
|
||||||
@ -289,7 +289,7 @@ void Field_CompleteCommand( field_t *field )
|
|||||||
|
|
||||||
// multiple matches, complete to shortest
|
// multiple matches, complete to shortest
|
||||||
com.sprintf( completionField->buffer, "\\%s", shortestMatch );
|
com.sprintf( completionField->buffer, "\\%s", shortestMatch );
|
||||||
completionField->cursor = strlen( completionField->buffer );
|
completionField->cursor = com.strlen( completionField->buffer );
|
||||||
ConcatRemaining( temp.buffer, completionString );
|
ConcatRemaining( temp.buffer, completionString );
|
||||||
|
|
||||||
Msg( "]%s\n", completionField->buffer );
|
Msg( "]%s\n", completionField->buffer );
|
||||||
@ -317,7 +317,7 @@ void Field_VariableSizeDraw( field_t *edit, int x, int y, int width, int size, b
|
|||||||
char str[MAX_SYSPATH];
|
char str[MAX_SYSPATH];
|
||||||
|
|
||||||
drawLen = edit->widthInChars;
|
drawLen = edit->widthInChars;
|
||||||
len = strlen( edit->buffer ) + 1;
|
len = com.strlen( edit->buffer ) + 1;
|
||||||
|
|
||||||
// guarantee that cursor will be visible
|
// guarantee that cursor will be visible
|
||||||
if ( len <= drawLen ) prestep = 0;
|
if ( len <= drawLen ) prestep = 0;
|
||||||
@ -451,12 +451,12 @@ void Field_KeyDownEvent( field_t *edit, int key )
|
|||||||
if ( edit->cursor < edit->scroll ) edit->scroll--;
|
if ( edit->cursor < edit->scroll ) edit->scroll--;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ( key == K_HOME || ( tolower(key) == 'a' && keys[K_CTRL].down ))
|
if ( key == K_HOME || ( com.tolower(key) == 'a' && keys[K_CTRL].down ))
|
||||||
{
|
{
|
||||||
edit->cursor = 0;
|
edit->cursor = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ( key == K_END || ( tolower(key) == 'e' && keys[K_CTRL].down ))
|
if ( key == K_END || ( com.tolower(key) == 'e' && keys[K_CTRL].down ))
|
||||||
{
|
{
|
||||||
edit->cursor = len;
|
edit->cursor = len;
|
||||||
return;
|
return;
|
||||||
@ -489,7 +489,7 @@ void Field_CharEvent( field_t *edit, int ch )
|
|||||||
Field_Clear( edit );
|
Field_Clear( edit );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
len = strlen( edit->buffer );
|
len = com.strlen( edit->buffer );
|
||||||
|
|
||||||
if ( ch == 'a' - 'a' + 1 )
|
if ( ch == 'a' - 'a' + 1 )
|
||||||
{
|
{
|
||||||
@ -595,7 +595,7 @@ void Key_Console(int key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// command history (ctrl-p ctrl-n for unix style)
|
// command history (ctrl-p ctrl-n for unix style)
|
||||||
if ( (key == K_MWHEELUP && keys[K_SHIFT].down) || ( key == K_UPARROW ) || ( key == K_KP_UPARROW ) || (( tolower(key) == 'p' ) && keys[K_CTRL].down ))
|
if ( (key == K_MWHEELUP && keys[K_SHIFT].down) || ( key == K_UPARROW ) || ( key == K_KP_UPARROW ) || (( com.tolower(key) == 'p' ) && keys[K_CTRL].down ))
|
||||||
{
|
{
|
||||||
if ( nextHistoryLine - historyLine < COMMAND_HISTORY && historyLine > 0 )
|
if ( nextHistoryLine - historyLine < COMMAND_HISTORY && historyLine > 0 )
|
||||||
{
|
{
|
||||||
@ -604,7 +604,7 @@ void Key_Console(int key)
|
|||||||
g_consoleField = historyEditLines[ historyLine % COMMAND_HISTORY ];
|
g_consoleField = historyEditLines[ historyLine % COMMAND_HISTORY ];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ( (key == K_MWHEELDOWN && keys[K_SHIFT].down) || ( key == K_DOWNARROW ) || ( key == K_KP_DOWNARROW ) || (( tolower(key) == 'n' ) && keys[K_CTRL].down ))
|
if ( (key == K_MWHEELDOWN && keys[K_SHIFT].down) || ( key == K_DOWNARROW ) || ( key == K_KP_DOWNARROW ) || (( com.tolower(key) == 'n' ) && keys[K_CTRL].down ))
|
||||||
{
|
{
|
||||||
if (historyLine == nextHistoryLine) return;
|
if (historyLine == nextHistoryLine) return;
|
||||||
historyLine++;
|
historyLine++;
|
||||||
@ -753,7 +753,7 @@ int Key_StringToKeynum( char *str )
|
|||||||
if ( !str[1] ) return str[0];
|
if ( !str[1] ) return str[0];
|
||||||
|
|
||||||
// check for hex code
|
// check for hex code
|
||||||
if ( str[0] == '0' && str[1] == 'x' && strlen( str ) == 4)
|
if ( str[0] == '0' && str[1] == 'x' && com.strlen( str ) == 4)
|
||||||
{
|
{
|
||||||
int n1, n2;
|
int n1, n2;
|
||||||
|
|
||||||
@ -785,7 +785,7 @@ int Key_StringToKeynum( char *str )
|
|||||||
// scan for a text match
|
// scan for a text match
|
||||||
for ( kn = keynames; kn->name; kn++ )
|
for ( kn = keynames; kn->name; kn++ )
|
||||||
{
|
{
|
||||||
if( !stricmp( str,kn->name ))
|
if( !com.stricmp( str,kn->name ))
|
||||||
return kn->keynum;
|
return kn->keynum;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
@ -882,7 +882,7 @@ int Key_GetKey(char *binding)
|
|||||||
|
|
||||||
for (i = 0; i < 256; i++)
|
for (i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
if (keys[i].binding && !stricmp(binding, keys[i].binding))
|
if (keys[i].binding && !com.stricmp(binding, keys[i].binding))
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -965,8 +965,8 @@ void Key_Bind_f (void)
|
|||||||
cmd[0] = 0; // start out with a null string
|
cmd[0] = 0; // start out with a null string
|
||||||
for (i = 2; i < c; i++)
|
for (i = 2; i < c; i++)
|
||||||
{
|
{
|
||||||
strcat (cmd, Cmd_Argv(i));
|
com.strcat (cmd, Cmd_Argv(i));
|
||||||
if (i != (c-1)) strcat (cmd, " ");
|
if (i != (c-1)) com.strcat (cmd, " ");
|
||||||
}
|
}
|
||||||
Key_SetBinding (b, cmd);
|
Key_SetBinding (b, cmd);
|
||||||
}
|
}
|
||||||
|
@ -128,12 +128,11 @@ void CL_Pause_f (void)
|
|||||||
return; // but allow pause in demos
|
return; // but allow pause in demos
|
||||||
|
|
||||||
// never pause in multiplayer
|
// never pause in multiplayer
|
||||||
if( Cvar_VariableValue ("maxclients") > 1 )
|
if(com.atoi(cl.configstrings[CS_MAXCLIENTS]) > 1 )
|
||||||
{
|
{
|
||||||
Cvar_SetValue ("paused", 0);
|
Cvar_SetValue( "paused", 0 );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Cvar_SetValue( "paused", !cl_paused->value );
|
Cvar_SetValue( "paused", !cl_paused->value );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,7 +257,7 @@ void CL_Connect_f (void)
|
|||||||
CL_Disconnect();
|
CL_Disconnect();
|
||||||
|
|
||||||
cls.state = ca_connecting;
|
cls.state = ca_connecting;
|
||||||
strncpy (cls.servername, server, sizeof(cls.servername)-1);
|
com.strncpy (cls.servername, server, sizeof(cls.servername)-1);
|
||||||
cls.connect_time = MAX_HEARTBEAT; // CL_CheckForResend() will fire immediately
|
cls.connect_time = MAX_HEARTBEAT; // CL_CheckForResend() will fire immediately
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,22 +289,22 @@ void CL_Rcon_f (void)
|
|||||||
message[3] = (char)255;
|
message[3] = (char)255;
|
||||||
message[4] = 0;
|
message[4] = 0;
|
||||||
|
|
||||||
strcat (message, "rcon ");
|
com.strcat (message, "rcon ");
|
||||||
|
|
||||||
strcat (message, rcon_client_password->string);
|
com.strcat (message, rcon_client_password->string);
|
||||||
strcat (message, " ");
|
com.strcat (message, " ");
|
||||||
|
|
||||||
for (i=1 ; i<Cmd_Argc() ; i++)
|
for (i=1 ; i<Cmd_Argc() ; i++)
|
||||||
{
|
{
|
||||||
strcat (message, Cmd_Argv(i));
|
com.strcat (message, Cmd_Argv(i));
|
||||||
strcat (message, " ");
|
com.strcat (message, " ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cls.state >= ca_connected)
|
if (cls.state >= ca_connected)
|
||||||
to = cls.netchan.remote_address;
|
to = cls.netchan.remote_address;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!strlen(rcon_address->string))
|
if (!com.strlen(rcon_address->string))
|
||||||
{
|
{
|
||||||
Msg ("You must either be connected,\n"
|
Msg ("You must either be connected,\n"
|
||||||
"or set the 'rcon_address' cvar\n"
|
"or set the 'rcon_address' cvar\n"
|
||||||
@ -318,7 +317,7 @@ void CL_Rcon_f (void)
|
|||||||
to.port = BigShort (PORT_SERVER);
|
to.port = BigShort (PORT_SERVER);
|
||||||
}
|
}
|
||||||
|
|
||||||
NET_SendPacket (NS_CLIENT, strlen(message)+1, message, to);
|
NET_SendPacket (NS_CLIENT, com.strlen(message)+1, message, to);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -366,9 +365,9 @@ void CL_Disconnect( void )
|
|||||||
// send a disconnect message to the server
|
// send a disconnect message to the server
|
||||||
final[0] = clc_stringcmd;
|
final[0] = clc_stringcmd;
|
||||||
com.strcpy ((char *)final+1, "disconnect");
|
com.strcpy ((char *)final+1, "disconnect");
|
||||||
Netchan_Transmit(&cls.netchan, strlen(final), final);
|
Netchan_Transmit(&cls.netchan, com.strlen(final), final);
|
||||||
Netchan_Transmit(&cls.netchan, strlen(final), final);
|
Netchan_Transmit(&cls.netchan, com.strlen(final), final);
|
||||||
Netchan_Transmit(&cls.netchan, strlen(final), final);
|
Netchan_Transmit(&cls.netchan, com.strlen(final), final);
|
||||||
|
|
||||||
CL_ClearState ();
|
CL_ClearState ();
|
||||||
|
|
||||||
@ -422,7 +421,7 @@ void CL_Packet_f (void)
|
|||||||
out = send+4;
|
out = send+4;
|
||||||
send[0] = send[1] = send[2] = send[3] = (char)0xff;
|
send[0] = send[1] = send[2] = send[3] = (char)0xff;
|
||||||
|
|
||||||
l = strlen (in);
|
l = com.strlen (in);
|
||||||
for (i=0 ; i<l ; i++)
|
for (i=0 ; i<l ; i++)
|
||||||
{
|
{
|
||||||
if (in[i] == '\\' && in[i+1] == 'n')
|
if (in[i] == '\\' && in[i+1] == 'n')
|
||||||
@ -720,7 +719,7 @@ void CL_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// remote command from gui front end
|
// remote command from gui front end
|
||||||
if(!strcmp(c, "cmd"))
|
if(!com.strcmp(c, "cmd"))
|
||||||
{
|
{
|
||||||
if(!NET_IsLocalAddress(from))
|
if(!NET_IsLocalAddress(from))
|
||||||
{
|
{
|
||||||
@ -735,7 +734,7 @@ void CL_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// print command from somewhere
|
// print command from somewhere
|
||||||
if (!strcmp(c, "print"))
|
if (!com.strcmp(c, "print"))
|
||||||
{
|
{
|
||||||
// print command from somewhere
|
// print command from somewhere
|
||||||
s = MSG_ReadString( msg );
|
s = MSG_ReadString( msg );
|
||||||
@ -745,14 +744,14 @@ void CL_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ping from somewhere
|
// ping from somewhere
|
||||||
if (!strcmp(c, "ping"))
|
if (!com.strcmp(c, "ping"))
|
||||||
{
|
{
|
||||||
Netchan_OutOfBandPrint( NS_CLIENT, from, "ack" );
|
Netchan_OutOfBandPrint( NS_CLIENT, from, "ack" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// challenge from the server we are connecting to
|
// challenge from the server we are connecting to
|
||||||
if (!strcmp(c, "challenge"))
|
if (!com.strcmp(c, "challenge"))
|
||||||
{
|
{
|
||||||
cls.challenge = com.atoi(Cmd_Argv(1));
|
cls.challenge = com.atoi(Cmd_Argv(1));
|
||||||
CL_SendConnectPacket();
|
CL_SendConnectPacket();
|
||||||
@ -760,7 +759,7 @@ void CL_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// echo request from server
|
// echo request from server
|
||||||
if (!strcmp(c, "echo"))
|
if (!com.strcmp(c, "echo"))
|
||||||
{
|
{
|
||||||
Netchan_OutOfBandPrint( NS_CLIENT, from, "%s", Cmd_Argv(1) );
|
Netchan_OutOfBandPrint( NS_CLIENT, from, "%s", Cmd_Argv(1) );
|
||||||
return;
|
return;
|
||||||
@ -999,16 +998,16 @@ void CL_RequestNextDownload (void)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((p = strchr(cl.configstrings[CS_PLAYERSKINS+i], '\\')) != NULL)
|
if ((p = com.strchr(cl.configstrings[CS_PLAYERSKINS+i], '\\')) != NULL)
|
||||||
p++;
|
p++;
|
||||||
else p = cl.configstrings[CS_PLAYERSKINS+i];
|
else p = cl.configstrings[CS_PLAYERSKINS+i];
|
||||||
strcpy(model, p);
|
com.strcpy(model, p);
|
||||||
p = strchr(model, '/');
|
p = com.strchr(model, '/');
|
||||||
if (!p) p = strchr(model, '\\');
|
if (!p) p = com.strchr(model, '\\');
|
||||||
if (p)
|
if (p)
|
||||||
{
|
{
|
||||||
*p++ = 0;
|
*p++ = 0;
|
||||||
strcpy(skin, p);
|
com.strcpy(skin, p);
|
||||||
}
|
}
|
||||||
else *skin = 0;
|
else *skin = 0;
|
||||||
|
|
||||||
@ -1210,33 +1209,6 @@ void CL_InitLocal (void)
|
|||||||
Cmd_AddCommand ("precache", CL_Precache_f, "precache specified resource (by index)" );
|
Cmd_AddCommand ("precache", CL_Precache_f, "precache specified resource (by index)" );
|
||||||
Cmd_AddCommand ("download", CL_Download_f, "download specified resource (by name)" );
|
Cmd_AddCommand ("download", CL_Download_f, "download specified resource (by name)" );
|
||||||
|
|
||||||
//
|
|
||||||
// forward to server commands
|
|
||||||
//
|
|
||||||
// the only thing this does is allow command completion
|
|
||||||
// to work -- all unknown commands are automatically
|
|
||||||
// forwarded to the server
|
|
||||||
Cmd_AddCommand ("wave", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("inven", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("kill", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("use", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("drop", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("say", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("say_team", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("enum_activity", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("info", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("prog", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("give", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("god", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("notarget", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("noclip", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("invuse", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("invprev", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("invnext", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("invdrop", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("weapnext", NULL, NULL );
|
|
||||||
Cmd_AddCommand ("weapprev", NULL, NULL );
|
|
||||||
|
|
||||||
UI_ShowMenu();
|
UI_ShowMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1315,7 +1287,7 @@ void CL_FixCvarCheats (void)
|
|||||||
int i;
|
int i;
|
||||||
cheatvar_t *var;
|
cheatvar_t *var;
|
||||||
|
|
||||||
if ( !strcmp(cl.configstrings[CS_MAXCLIENTS], "1")
|
if ( !com.strcmp(cl.configstrings[CS_MAXCLIENTS], "1")
|
||||||
|| !cl.configstrings[CS_MAXCLIENTS][0] )
|
|| !cl.configstrings[CS_MAXCLIENTS][0] )
|
||||||
return; // single player can cheat
|
return; // single player can cheat
|
||||||
|
|
||||||
@ -1333,7 +1305,7 @@ void CL_FixCvarCheats (void)
|
|||||||
// make sure they are all set to the proper values
|
// make sure they are all set to the proper values
|
||||||
for (i=0, var = cheatvars ; i<numcheatvars ; i++, var++)
|
for (i=0, var = cheatvars ; i<numcheatvars ; i++, var++)
|
||||||
{
|
{
|
||||||
if ( strcmp (var->var->string, var->value) )
|
if ( com.strcmp (var->var->string, var->value) )
|
||||||
{
|
{
|
||||||
Cvar_Set (var->name, var->value);
|
Cvar_Set (var->name, var->value);
|
||||||
}
|
}
|
||||||
|
@ -676,7 +676,7 @@ VM_ComStrlen, // #30 float strlen( string text )
|
|||||||
VM_TimeStamp, // #31 string Com_TimeStamp( float format )
|
VM_TimeStamp, // #31 string Com_TimeStamp( float format )
|
||||||
VM_LocalCmd, // #32 void LocalCmd( ... )
|
VM_LocalCmd, // #32 void LocalCmd( ... )
|
||||||
VM_SubString, // #33 string substring( string s, float start, float length )
|
VM_SubString, // #33 string substring( string s, float start, float length )
|
||||||
NULL, // #34 -- reserved --
|
VM_AddCommand, // #34 void Add_Command( string s )
|
||||||
NULL, // #35 -- reserved --
|
NULL, // #35 -- reserved --
|
||||||
NULL, // #36 -- reserved --
|
NULL, // #36 -- reserved --
|
||||||
NULL, // #37 -- reserved --
|
NULL, // #37 -- reserved --
|
||||||
|
@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||||||
|
|
||||||
void CL_DownloadFileName(char *dest, int destlen, char *fn)
|
void CL_DownloadFileName(char *dest, int destlen, char *fn)
|
||||||
{
|
{
|
||||||
strncpy(dest, fn, destlen );
|
com.strncpy(dest, fn, destlen );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -42,7 +42,7 @@ bool CL_CheckOrDownloadFile (char *filename)
|
|||||||
file_t *fp;
|
file_t *fp;
|
||||||
char name[MAX_SYSPATH];
|
char name[MAX_SYSPATH];
|
||||||
|
|
||||||
if (strstr (filename, ".."))
|
if (com.strstr (filename, ".."))
|
||||||
{
|
{
|
||||||
Msg ("Refusing to download a path with ..\n");
|
Msg ("Refusing to download a path with ..\n");
|
||||||
return true;
|
return true;
|
||||||
@ -54,8 +54,8 @@ bool CL_CheckOrDownloadFile (char *filename)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy (cls.downloadname, filename);
|
com.strcpy (cls.downloadname, filename);
|
||||||
strcpy (cls.downloadtempname, filename);
|
com.strcpy (cls.downloadtempname, filename);
|
||||||
|
|
||||||
// download to a temp name, and only rename
|
// download to a temp name, and only rename
|
||||||
// to the real name when done, so if interrupted
|
// to the real name when done, so if interrupted
|
||||||
@ -115,7 +115,7 @@ void CL_Download_f (void)
|
|||||||
|
|
||||||
com.sprintf(filename, "%s", Cmd_Argv(1));
|
com.sprintf(filename, "%s", Cmd_Argv(1));
|
||||||
|
|
||||||
if (strstr (filename, ".."))
|
if (com.strstr (filename, ".."))
|
||||||
{
|
{
|
||||||
Msg ("Refusing to download a path with ..\n");
|
Msg ("Refusing to download a path with ..\n");
|
||||||
return;
|
return;
|
||||||
@ -128,8 +128,8 @@ void CL_Download_f (void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy (cls.downloadname, filename);
|
com.strcpy (cls.downloadname, filename);
|
||||||
strcpy (cls.downloadtempname, filename);
|
com.strcpy (cls.downloadtempname, filename);
|
||||||
|
|
||||||
Msg ("Downloading %s\n", cls.downloadname);
|
Msg ("Downloading %s\n", cls.downloadname);
|
||||||
|
|
||||||
@ -344,13 +344,13 @@ void CL_LoadClientinfo (clientinfo_t *ci, char *s)
|
|||||||
char model_filename[MAX_QPATH];
|
char model_filename[MAX_QPATH];
|
||||||
char weapon_filename[MAX_QPATH];
|
char weapon_filename[MAX_QPATH];
|
||||||
|
|
||||||
strncpy(ci->cinfo, s, sizeof(ci->cinfo));
|
com.strncpy(ci->cinfo, s, sizeof(ci->cinfo));
|
||||||
ci->cinfo[sizeof(ci->cinfo)-1] = 0;
|
ci->cinfo[sizeof(ci->cinfo)-1] = 0;
|
||||||
|
|
||||||
// isolate the player's name
|
// isolate the player's name
|
||||||
strncpy(ci->name, s, sizeof(ci->name));
|
com.strncpy(ci->name, s, sizeof(ci->name));
|
||||||
ci->name[sizeof(ci->name)-1] = 0;
|
ci->name[sizeof(ci->name)-1] = 0;
|
||||||
t = strstr (s, "\\");
|
t = com.strstr (s, "\\");
|
||||||
if (t)
|
if (t)
|
||||||
{
|
{
|
||||||
ci->name[t-s] = 0;
|
ci->name[t-s] = 0;
|
||||||
@ -369,13 +369,13 @@ void CL_LoadClientinfo (clientinfo_t *ci, char *s)
|
|||||||
{
|
{
|
||||||
// isolate the model name
|
// isolate the model name
|
||||||
com.strcpy (model_name, s);
|
com.strcpy (model_name, s);
|
||||||
t = strstr(model_name, "/");
|
t = com.strstr(model_name, "/");
|
||||||
if (!t) t = strstr(model_name, "\\");
|
if (!t) t = com.strstr(model_name, "\\");
|
||||||
if (!t) t = model_name;
|
if (!t) t = model_name;
|
||||||
*t = 0;
|
*t = 0;
|
||||||
|
|
||||||
// isolate the skin name
|
// isolate the skin name
|
||||||
strcpy (skin_name, s + strlen(model_name) + 1);
|
com.strcpy (skin_name, s + com.strlen(model_name) + 1);
|
||||||
|
|
||||||
// model file
|
// model file
|
||||||
com.sprintf (model_filename, "models/players/%s/player.mdl", model_name);
|
com.sprintf (model_filename, "models/players/%s/player.mdl", model_name);
|
||||||
@ -389,7 +389,7 @@ void CL_LoadClientinfo (clientinfo_t *ci, char *s)
|
|||||||
|
|
||||||
// if we don't have the skin and the model wasn't male,
|
// if we don't have the skin and the model wasn't male,
|
||||||
// see if the male has it (this is for CTF's skins)
|
// see if the male has it (this is for CTF's skins)
|
||||||
if (!ci->skin && strcasecmp(model_name, "male"))
|
if (!ci->skin && com.stricmp(model_name, "male"))
|
||||||
{
|
{
|
||||||
// change model to male
|
// change model to male
|
||||||
com.strcpy(model_name, "male");
|
com.strcpy(model_name, "male");
|
||||||
@ -451,10 +451,10 @@ void CL_ParseConfigString( sizebuf_t *msg )
|
|||||||
if (i < 0 || i >= MAX_CONFIGSTRINGS) Host_Error("configstring > MAX_CONFIGSTRINGS\n");
|
if (i < 0 || i >= MAX_CONFIGSTRINGS) Host_Error("configstring > MAX_CONFIGSTRINGS\n");
|
||||||
s = MSG_ReadString( msg );
|
s = MSG_ReadString( msg );
|
||||||
|
|
||||||
strncpy (olds, cl.configstrings[i], sizeof(olds));
|
com.strncpy (olds, cl.configstrings[i], sizeof(olds));
|
||||||
olds[sizeof(olds) - 1] = 0;
|
olds[sizeof(olds) - 1] = 0;
|
||||||
|
|
||||||
strcpy (cl.configstrings[i], s);
|
com.strcpy (cl.configstrings[i], s);
|
||||||
|
|
||||||
// do something apropriate
|
// do something apropriate
|
||||||
|
|
||||||
@ -482,7 +482,7 @@ void CL_ParseConfigString( sizebuf_t *msg )
|
|||||||
}
|
}
|
||||||
else if (i >= CS_PLAYERSKINS && i < CS_PLAYERSKINS+MAX_CLIENTS)
|
else if (i >= CS_PLAYERSKINS && i < CS_PLAYERSKINS+MAX_CLIENTS)
|
||||||
{
|
{
|
||||||
if (cl.refresh_prepped && strcmp(olds, s))
|
if (cl.refresh_prepped && com.strcmp(olds, s))
|
||||||
CL_ParseClientinfo (i-CS_PLAYERSKINS);
|
CL_ParseClientinfo (i-CS_PLAYERSKINS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ void CL_CheckPredictionError (void)
|
|||||||
|
|
||||||
// save the prediction error for interpolation
|
// save the prediction error for interpolation
|
||||||
len = abs(delta[0]) + abs(delta[1]) + abs(delta[2]);
|
len = abs(delta[0]) + abs(delta[1]) + abs(delta[2]);
|
||||||
if( len > 640 * SV_COORD_FRAC ) // 80 world units
|
if( len > 640 ) // 80 world units
|
||||||
{ // a teleport or something
|
{ // a teleport or something
|
||||||
VectorClear (cl.prediction_error);
|
VectorClear (cl.prediction_error);
|
||||||
}
|
}
|
||||||
@ -57,7 +57,7 @@ void CL_CheckPredictionError (void)
|
|||||||
VectorCopy (cl.frame.ps.origin, cl.predicted_origins[frame]);
|
VectorCopy (cl.frame.ps.origin, cl.predicted_origins[frame]);
|
||||||
|
|
||||||
// save for error itnerpolation
|
// save for error itnerpolation
|
||||||
VectorScale( delta, CL_COORD_FRAC, cl.prediction_error );
|
VectorCopy( delta, cl.prediction_error );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,12 +316,12 @@ void CL_PredictMovement (void)
|
|||||||
step = pm.ps.origin[2] - oldz;
|
step = pm.ps.origin[2] - oldz;
|
||||||
if( step > 63 && step < 160 )
|
if( step > 63 && step < 160 )
|
||||||
{
|
{
|
||||||
cl.predicted_step = step * CL_COORD_FRAC;
|
cl.predicted_step = step;
|
||||||
cl.predicted_step_time = cls.realtime - cls.frametime * 500;
|
cl.predicted_step_time = cls.realtime - cls.frametime * 500;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy results out for rendering
|
// copy results out for rendering
|
||||||
VectorScale( pm.ps.origin, CL_COORD_FRAC, cl.predicted_origin );
|
VectorCopy( pm.ps.origin, cl.predicted_origin );
|
||||||
VectorCopy(pm.ps.viewangles, cl.predicted_angles);
|
VectorCopy(pm.ps.viewangles, cl.predicted_angles);
|
||||||
}
|
}
|
||||||
|
@ -500,7 +500,7 @@ VM_ComStrlen, // #30 float strlen( string text )
|
|||||||
VM_TimeStamp, // #31 string Com_TimeStamp( float format )
|
VM_TimeStamp, // #31 string Com_TimeStamp( float format )
|
||||||
VM_LocalCmd, // #32 void LocalCmd( ... )
|
VM_LocalCmd, // #32 void LocalCmd( ... )
|
||||||
VM_SubString, // #33 string substring( string s, float start, float length )
|
VM_SubString, // #33 string substring( string s, float start, float length )
|
||||||
NULL, // #34 -- reserved --
|
VM_AddCommand, // #34 void Add_Command( string s )
|
||||||
NULL, // #35 -- reserved --
|
NULL, // #35 -- reserved --
|
||||||
NULL, // #36 -- reserved --
|
NULL, // #36 -- reserved --
|
||||||
NULL, // #37 -- reserved --
|
NULL, // #37 -- reserved --
|
||||||
@ -592,8 +592,8 @@ void CL_InitClientProgs( void )
|
|||||||
{
|
{
|
||||||
Msg("\n");
|
Msg("\n");
|
||||||
PRVM_Begin;
|
PRVM_Begin;
|
||||||
PRVM_InitProg( PRVM_CLIENTPROG );
|
|
||||||
|
|
||||||
|
PRVM_InitProg( PRVM_CLIENTPROG );
|
||||||
if( !prog->loaded )
|
if( !prog->loaded )
|
||||||
{
|
{
|
||||||
prog->progs_mempool = Mem_AllocPool( "Client Progs" );
|
prog->progs_mempool = Mem_AllocPool( "Client Progs" );
|
||||||
|
@ -371,7 +371,7 @@ void *dpv_open( const char *filename, char **errorstring )
|
|||||||
|
|
||||||
if( s->info_framerate > 0.0f )
|
if( s->info_framerate > 0.0f )
|
||||||
{
|
{
|
||||||
s->videopixels = (uint *)Z_Malloc(s->info_imagewidth * s->info_imageheight * sizeof(*s->videopixels));
|
s->videopixels = (uint *)Mem_Alloc( cls.mempool, s->info_imagewidth * s->info_imageheight * sizeof(*s->videopixels));
|
||||||
s->videoframenum = MAX_HEARTBEAT;
|
s->videoframenum = MAX_HEARTBEAT;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
105
engine/common.c
105
engine/common.c
@ -729,6 +729,29 @@ void VM_LocalCmd( void )
|
|||||||
Cbuf_AddText(VM_VarArgs( 0 ));
|
Cbuf_AddText(VM_VarArgs( 0 ));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=========
|
||||||
|
VM_AddCommand
|
||||||
|
|
||||||
|
void Add_Command( string s )
|
||||||
|
=========
|
||||||
|
*/
|
||||||
|
void VM_AddCommand( void )
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
if(!VM_ValidateArgs( "Add_Command", 1 ))
|
||||||
|
return;
|
||||||
|
|
||||||
|
VM_ValidateString(PRVM_G_STRING(OFS_PARM0));
|
||||||
|
|
||||||
|
name = PRVM_G_STRING(OFS_PARM0);
|
||||||
|
|
||||||
|
// register new command
|
||||||
|
// NOTE: cmd without callback will be forwarded to server
|
||||||
|
Cmd_AddCommand( name, NULL, NULL );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=========
|
=========
|
||||||
VM_ComVA
|
VM_ComVA
|
||||||
@ -1633,8 +1656,8 @@ VM_ComVA, // #29 string va( ... )
|
|||||||
VM_ComStrlen, // #30 float strlen( string text )
|
VM_ComStrlen, // #30 float strlen( string text )
|
||||||
VM_TimeStamp, // #31 string Com_TimeStamp( float format )
|
VM_TimeStamp, // #31 string Com_TimeStamp( float format )
|
||||||
VM_LocalCmd, // #32 void LocalCmd( ... )
|
VM_LocalCmd, // #32 void LocalCmd( ... )
|
||||||
NULL, // #33 -- reserved --
|
VM_SubString, // #33 string substring( string s, float start, float length )
|
||||||
NULL, // #34 -- reserved --
|
VM_AddCommand, // #34 void Add_Command( string s )
|
||||||
NULL, // #35 -- reserved --
|
NULL, // #35 -- reserved --
|
||||||
NULL, // #36 -- reserved --
|
NULL, // #36 -- reserved --
|
||||||
NULL, // #37 -- reserved --
|
NULL, // #37 -- reserved --
|
||||||
@ -1795,7 +1818,7 @@ void Info_RemoveKey (char *s, char *key)
|
|||||||
char value[512];
|
char value[512];
|
||||||
char *o;
|
char *o;
|
||||||
|
|
||||||
if (strstr (key, "\\")) return;
|
if (com.strstr (key, "\\")) return;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
@ -1818,9 +1841,9 @@ void Info_RemoveKey (char *s, char *key)
|
|||||||
}
|
}
|
||||||
*o = 0;
|
*o = 0;
|
||||||
|
|
||||||
if (!strcmp (key, pkey) )
|
if (!com.strcmp (key, pkey) )
|
||||||
{
|
{
|
||||||
strcpy (start, s); // remove this part
|
com.strcpy (start, s); // remove this part
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!*s) return;
|
if (!*s) return;
|
||||||
@ -1837,8 +1860,8 @@ can mess up the server's parsing
|
|||||||
*/
|
*/
|
||||||
bool Info_Validate (char *s)
|
bool Info_Validate (char *s)
|
||||||
{
|
{
|
||||||
if (strstr (s, "\"")) return false;
|
if (com.strstr (s, "\"")) return false;
|
||||||
if (strstr (s, ";")) return false;
|
if (com.strstr (s, ";")) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1847,23 +1870,23 @@ void Info_SetValueForKey (char *s, char *key, char *value)
|
|||||||
char newi[MAX_INFO_STRING], *v;
|
char newi[MAX_INFO_STRING], *v;
|
||||||
int c, maxsize = MAX_INFO_STRING;
|
int c, maxsize = MAX_INFO_STRING;
|
||||||
|
|
||||||
if (strstr (key, "\\") || strstr (value, "\\") )
|
if (com.strstr (key, "\\") || com.strstr (value, "\\") )
|
||||||
{
|
{
|
||||||
Msg ("Can't use keys or values with a \\\n");
|
Msg ("Can't use keys or values with a \\\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strstr (key, ";") )
|
if (com.strstr (key, ";") )
|
||||||
{
|
{
|
||||||
Msg ("Can't use keys or values with a semicolon\n");
|
Msg ("Can't use keys or values with a semicolon\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (strstr (key, "\"") || strstr (value, "\"") )
|
if (com.strstr (key, "\"") || com.strstr (value, "\"") )
|
||||||
{
|
{
|
||||||
Msg ("Can't use keys or values with a \"\n");
|
Msg ("Can't use keys or values with a \"\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (strlen(key) > MAX_INFO_KEY - 1 || strlen(value) > MAX_INFO_KEY-1)
|
if (com.strlen(key) > MAX_INFO_KEY - 1 || com.strlen(value) > MAX_INFO_KEY-1)
|
||||||
{
|
{
|
||||||
Msg ("Keys and values must be < 64 characters.\n");
|
Msg ("Keys and values must be < 64 characters.\n");
|
||||||
return;
|
return;
|
||||||
@ -1936,7 +1959,7 @@ bool Cmd_GetMapList( const char *s, char *completedname, int length )
|
|||||||
if( !t ) return false;
|
if( !t ) return false;
|
||||||
|
|
||||||
FS_FileBase(t->filenames[0], matchbuf );
|
FS_FileBase(t->filenames[0], matchbuf );
|
||||||
strncpy( completedname, matchbuf, length );
|
com.strncpy( completedname, matchbuf, length );
|
||||||
if(t->numfilenames == 1) return true;
|
if(t->numfilenames == 1) return true;
|
||||||
|
|
||||||
for(i = 0, nummaps = 0; i < t->numfilenames; i++)
|
for(i = 0, nummaps = 0; i < t->numfilenames; i++)
|
||||||
@ -1949,7 +1972,7 @@ bool Cmd_GetMapList( const char *s, char *completedname, int length )
|
|||||||
|
|
||||||
if( com.stricmp(ext, "bsp" )) continue;
|
if( com.stricmp(ext, "bsp" )) continue;
|
||||||
|
|
||||||
strncpy(message, "^1error^7", sizeof(message));
|
com.strncpy(message, "^1error^7", sizeof(message));
|
||||||
f = FS_Open(t->filenames[i], "rb" );
|
f = FS_Open(t->filenames[i], "rb" );
|
||||||
|
|
||||||
if( f )
|
if( f )
|
||||||
@ -1975,7 +1998,7 @@ bool Cmd_GetMapList( const char *s, char *completedname, int length )
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
lump_t ents; // quake1 entity lump
|
lump_t ents; // quake1 entity lump
|
||||||
memcpy(&ents, buf + 4, sizeof(lump_t)); // skip first four bytes (version)
|
Mem_Copy(&ents, buf + 4, sizeof(lump_t)); // skip first four bytes (version)
|
||||||
ver = LittleLong(((int *)buf)[0]);
|
ver = LittleLong(((int *)buf)[0]);
|
||||||
|
|
||||||
switch( ver )
|
switch( ver )
|
||||||
@ -2012,13 +2035,13 @@ bool Cmd_GetMapList( const char *s, char *completedname, int length )
|
|||||||
data = entities;
|
data = entities;
|
||||||
while(Com_ParseToken(&data))
|
while(Com_ParseToken(&data))
|
||||||
{
|
{
|
||||||
if(!strcmp(com_token, "{" )) continue;
|
if(!com.strcmp(com_token, "{" )) continue;
|
||||||
else if(!strcmp(com_token, "}" )) break;
|
else if(!com.strcmp(com_token, "}" )) break;
|
||||||
else if(!strcmp(com_token, "message" ))
|
else if(!com.strcmp(com_token, "message" ))
|
||||||
{
|
{
|
||||||
// get the message contents
|
// get the message contents
|
||||||
Com_ParseToken(&data);
|
Com_ParseToken(&data);
|
||||||
strncpy(message, com_token, sizeof(message));
|
com.strncpy(message, com_token, sizeof(message));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2029,14 +2052,14 @@ bool Cmd_GetMapList( const char *s, char *completedname, int length )
|
|||||||
|
|
||||||
switch(ver)
|
switch(ver)
|
||||||
{
|
{
|
||||||
case 28: strncpy((char *)buf, "Quake1 beta", sizeof(buf)); break;
|
case 28: com.strncpy((char *)buf, "Quake1 beta", sizeof(buf)); break;
|
||||||
case 29: strncpy((char *)buf, "Quake1", sizeof(buf)); break;
|
case 29: com.strncpy((char *)buf, "Quake1", sizeof(buf)); break;
|
||||||
case 30: strncpy((char *)buf, "Half-Life", sizeof(buf)); break;
|
case 30: com.strncpy((char *)buf, "Half-Life", sizeof(buf)); break;
|
||||||
case 38: strncpy((char *)buf, "Quake 2", sizeof(buf)); break;
|
case 38: com.strncpy((char *)buf, "Quake 2", sizeof(buf)); break;
|
||||||
case 39: strncpy((char *)buf, "Xash 3D", sizeof(buf)); break;
|
case 39: com.strncpy((char *)buf, "Xash 3D", sizeof(buf)); break;
|
||||||
case 46: strncpy((char *)buf, "Quake 3", sizeof(buf)); break;
|
case 46: com.strncpy((char *)buf, "Quake 3", sizeof(buf)); break;
|
||||||
case 47: strncpy((char *)buf, "RTCW", sizeof(buf)); break;
|
case 47: com.strncpy((char *)buf, "RTCW", sizeof(buf)); break;
|
||||||
default: strncpy((char *)buf, "??", sizeof(buf)); break;
|
default: com.strncpy((char *)buf, "??", sizeof(buf)); break;
|
||||||
}
|
}
|
||||||
Msg("%16s (%s) ^3%s^7\n", matchbuf, buf, message);
|
Msg("%16s (%s) ^3%s^7\n", matchbuf, buf, message);
|
||||||
nummaps++;
|
nummaps++;
|
||||||
@ -2047,7 +2070,7 @@ bool Cmd_GetMapList( const char *s, char *completedname, int length )
|
|||||||
// cut shortestMatch to the amount common with s
|
// cut shortestMatch to the amount common with s
|
||||||
for( i = 0; matchbuf[i]; i++ )
|
for( i = 0; matchbuf[i]; i++ )
|
||||||
{
|
{
|
||||||
if(tolower(completedname[i]) != tolower(matchbuf[i]))
|
if(com.tolower(completedname[i]) != com.tolower(matchbuf[i]))
|
||||||
completedname[i] = 0;
|
completedname[i] = 0;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -2090,7 +2113,7 @@ bool Cmd_GetFontList( const char *s, char *completedname, int length )
|
|||||||
{
|
{
|
||||||
for( i = 0; matchbuf[i]; i++ )
|
for( i = 0; matchbuf[i]; i++ )
|
||||||
{
|
{
|
||||||
if(com.tolower(completedname[i]) != tolower(matchbuf[i]))
|
if(com.tolower(completedname[i]) != com.tolower(matchbuf[i]))
|
||||||
completedname[i] = 0;
|
completedname[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2135,7 +2158,7 @@ bool Cmd_GetDemoList( const char *s, char *completedname, int length )
|
|||||||
{
|
{
|
||||||
for( i = 0; matchbuf[i]; i++ )
|
for( i = 0; matchbuf[i]; i++ )
|
||||||
{
|
{
|
||||||
if(com.tolower(completedname[i]) != tolower(matchbuf[i]))
|
if(com.tolower(completedname[i]) != com.tolower(matchbuf[i]))
|
||||||
completedname[i] = 0;
|
completedname[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2182,7 +2205,7 @@ bool Cmd_GetSourceList( const char *s, char *completedname, int length )
|
|||||||
{
|
{
|
||||||
for( i = 0; matchbuf[i]; i++ )
|
for( i = 0; matchbuf[i]; i++ )
|
||||||
{
|
{
|
||||||
if(com.tolower(completedname[i]) != tolower(matchbuf[i]))
|
if(com.tolower(completedname[i]) != com.tolower(matchbuf[i]))
|
||||||
completedname[i] = 0;
|
completedname[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2206,7 +2229,7 @@ bool Cmd_GetMovieList( const char *s, char *completedname, int length )
|
|||||||
if(!t) return false;
|
if(!t) return false;
|
||||||
|
|
||||||
FS_FileBase(t->filenames[0], matchbuf );
|
FS_FileBase(t->filenames[0], matchbuf );
|
||||||
if(completedname && length) strncpy( completedname, matchbuf, length );
|
if(completedname && length) com.strncpy( completedname, matchbuf, length );
|
||||||
if(t->numfilenames == 1) return true;
|
if(t->numfilenames == 1) return true;
|
||||||
|
|
||||||
for(i = 0, nummovies = 0; i < t->numfilenames; i++)
|
for(i = 0, nummovies = 0; i < t->numfilenames; i++)
|
||||||
@ -2226,7 +2249,7 @@ bool Cmd_GetMovieList( const char *s, char *completedname, int length )
|
|||||||
{
|
{
|
||||||
for( i = 0; matchbuf[i]; i++ )
|
for( i = 0; matchbuf[i]; i++ )
|
||||||
{
|
{
|
||||||
if(com.tolower(completedname[i]) != tolower(matchbuf[i]))
|
if(com.tolower(completedname[i]) != com.tolower(matchbuf[i]))
|
||||||
completedname[i] = 0;
|
completedname[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2251,7 +2274,7 @@ bool Cmd_GetMusicList( const char *s, char *completedname, int length )
|
|||||||
if(!t) return false;
|
if(!t) return false;
|
||||||
|
|
||||||
FS_FileBase(t->filenames[0], matchbuf );
|
FS_FileBase(t->filenames[0], matchbuf );
|
||||||
if(completedname && length) strncpy( completedname, matchbuf, length );
|
if(completedname && length) com.strncpy( completedname, matchbuf, length );
|
||||||
if(t->numfilenames == 1) return true;
|
if(t->numfilenames == 1) return true;
|
||||||
|
|
||||||
for(i = 0, numtracks = 0; i < t->numfilenames; i++)
|
for(i = 0, numtracks = 0; i < t->numfilenames; i++)
|
||||||
@ -2271,7 +2294,7 @@ bool Cmd_GetMusicList( const char *s, char *completedname, int length )
|
|||||||
{
|
{
|
||||||
for( i = 0; matchbuf[i]; i++ )
|
for( i = 0; matchbuf[i]; i++ )
|
||||||
{
|
{
|
||||||
if(com.tolower(completedname[i]) != tolower(matchbuf[i]))
|
if(com.tolower(completedname[i]) != com.tolower(matchbuf[i]))
|
||||||
completedname[i] = 0;
|
completedname[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2377,7 +2400,7 @@ bool Cmd_CheckMapsList( void )
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
lump_t ents; // quake1 entity lump
|
lump_t ents; // quake1 entity lump
|
||||||
memcpy(&ents, buf + 4, sizeof(lump_t)); // skip first four bytes (version)
|
Mem_Copy(&ents, buf + 4, sizeof(lump_t)); // skip first four bytes (version)
|
||||||
ver = LittleLong(((int *)buf)[0]);
|
ver = LittleLong(((int *)buf)[0]);
|
||||||
|
|
||||||
switch( ver )
|
switch( ver )
|
||||||
@ -2414,16 +2437,16 @@ bool Cmd_CheckMapsList( void )
|
|||||||
|
|
||||||
while(Com_ParseToken(&data))
|
while(Com_ParseToken(&data))
|
||||||
{
|
{
|
||||||
if(!strcmp(com_token, "{" )) continue;
|
if(!com.strcmp(com_token, "{" )) continue;
|
||||||
else if(!strcmp(com_token, "}" )) break;
|
else if(!com.strcmp(com_token, "}" )) break;
|
||||||
else if(!strcmp(com_token, "message" ))
|
else if(!com.strcmp(com_token, "message" ))
|
||||||
{
|
{
|
||||||
// get the message contents
|
// get the message contents
|
||||||
Com_ParseToken(&data);
|
Com_ParseToken(&data);
|
||||||
if(!strcmp(com_token, "" )) continue;
|
if(!com.strcmp(com_token, "" )) continue;
|
||||||
com.strncpy(message, com_token, sizeof(message));
|
com.strncpy(message, com_token, sizeof(message));
|
||||||
}
|
}
|
||||||
else if(!strcmp(com_token, "classname" ))
|
else if(!com.strcmp(com_token, "classname" ))
|
||||||
{
|
{
|
||||||
Com_ParseToken(&data);
|
Com_ParseToken(&data);
|
||||||
if(!com.strcmp(com_token, "info_player_deatchmatch"))
|
if(!com.strcmp(com_token, "info_player_deatchmatch"))
|
||||||
@ -2446,7 +2469,7 @@ bool Cmd_CheckMapsList( void )
|
|||||||
if( t ) Mem_Free(t); // free search result
|
if( t ) Mem_Free(t); // free search result
|
||||||
|
|
||||||
// write generated maps.lst
|
// write generated maps.lst
|
||||||
if(FS_WriteFile("scripts/maps.lst", buffer, strlen(buffer)))
|
if(FS_WriteFile("scripts/maps.lst", buffer, com.strlen(buffer)))
|
||||||
{
|
{
|
||||||
if( buffer ) Mem_Free(buffer);
|
if( buffer ) Mem_Free(buffer);
|
||||||
return true;
|
return true;
|
||||||
|
@ -22,7 +22,6 @@ extern vsound_exp_t *se;
|
|||||||
|
|
||||||
#define MAX_ENTNUMBER 99999 // for server and client parsing
|
#define MAX_ENTNUMBER 99999 // for server and client parsing
|
||||||
#define MAX_HEARTBEAT -99999 // connection time
|
#define MAX_HEARTBEAT -99999 // connection time
|
||||||
#define HOST_FRAMETIME 100 // host.frametime in msecs (change with caution)
|
|
||||||
#define MAX_EVENTS 1024
|
#define MAX_EVENTS 1024
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -129,9 +128,7 @@ void IN_MouseEvent( int mstate );
|
|||||||
|
|
||||||
// cvars
|
// cvars
|
||||||
extern cvar_t *host_serverstate;
|
extern cvar_t *host_serverstate;
|
||||||
extern cvar_t *host_frametime;
|
|
||||||
extern cvar_t *host_cheats;
|
extern cvar_t *host_cheats;
|
||||||
extern cvar_t *cm_paused;
|
|
||||||
extern cvar_t *crosshair;
|
extern cvar_t *crosshair;
|
||||||
extern cvar_t *scr_loading;
|
extern cvar_t *scr_loading;
|
||||||
extern cvar_t *scr_width;
|
extern cvar_t *scr_width;
|
||||||
@ -198,7 +195,8 @@ void Host_Main ( void );
|
|||||||
void Host_Free ( void );
|
void Host_Free ( void );
|
||||||
void Host_SetServerState( int state );
|
void Host_SetServerState( int state );
|
||||||
int Host_ServerState( void );
|
int Host_ServerState( void );
|
||||||
float Host_FrameTime( void );
|
int Host_FrameTime( void );
|
||||||
|
int Host_MaxClients( void );
|
||||||
void Host_AbortCurrentFrame( void );
|
void Host_AbortCurrentFrame( void );
|
||||||
dword Host_EventLoop( void );
|
dword Host_EventLoop( void );
|
||||||
|
|
||||||
@ -352,6 +350,7 @@ void VM_CvarSetValue( void );
|
|||||||
void VM_CvarGetValue( void );
|
void VM_CvarGetValue( void );
|
||||||
void VM_CvarSetString( void );
|
void VM_CvarSetString( void );
|
||||||
void VM_CvarGetString( void );
|
void VM_CvarGetString( void );
|
||||||
|
void VM_AddCommand( void );
|
||||||
void VM_ComVA( void );
|
void VM_ComVA( void );
|
||||||
void VM_ComStrlen( void );
|
void VM_ComStrlen( void );
|
||||||
void VM_TimeStamp( void );
|
void VM_TimeStamp( void );
|
||||||
|
@ -7,6 +7,126 @@
|
|||||||
#include "byteorder.h"
|
#include "byteorder.h"
|
||||||
#include "mathlib.h"
|
#include "mathlib.h"
|
||||||
|
|
||||||
|
static net_field_t ent_fields[] =
|
||||||
|
{
|
||||||
|
{ ES_FIELD(ed_type), NET_BYTE, true },
|
||||||
|
{ ES_FIELD(soundindex), NET_WORD, false }, // 512 sounds ( OpenAL software limit is 255 )
|
||||||
|
{ ES_FIELD(origin[0]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(origin[1]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(origin[2]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(angles[0]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(angles[1]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(angles[2]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(velocity[0]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(velocity[1]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(velocity[2]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(old_origin[0]), NET_FLOAT, true }, // send always
|
||||||
|
{ ES_FIELD(old_origin[1]), NET_FLOAT, true },
|
||||||
|
{ ES_FIELD(old_origin[2]), NET_FLOAT, true },
|
||||||
|
{ ES_FIELD(old_velocity[0]), NET_FLOAT, false }, // client velocity
|
||||||
|
{ ES_FIELD(old_velocity[1]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(old_velocity[2]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(model.index), NET_WORD, false }, // 4096 models
|
||||||
|
{ ES_FIELD(model.colormap), NET_WORD, false }, // encoded as two shorts for top and bottom color
|
||||||
|
{ ES_FIELD(model.scale), NET_COLOR, false }, // 0-255 values
|
||||||
|
{ ES_FIELD(model.frame), NET_FLOAT, false }, // interpolate value
|
||||||
|
{ ES_FIELD(model.animtime), NET_FLOAT, false }, // auto-animating time
|
||||||
|
{ ES_FIELD(model.framerate), NET_FLOAT, false }, // custom framerate
|
||||||
|
{ ES_FIELD(model.sequence), NET_WORD, false }, // 1024 sequences
|
||||||
|
{ ES_FIELD(model.gaitsequence), NET_WORD, false }, // 1024 gaitsequences
|
||||||
|
{ ES_FIELD(model.skin), NET_BYTE, false }, // 255 skins
|
||||||
|
{ ES_FIELD(model.body), NET_BYTE, false }, // 255 bodies
|
||||||
|
{ ES_FIELD(model.blending[0]), NET_COLOR, false }, // animation blending
|
||||||
|
{ ES_FIELD(model.blending[1]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.blending[2]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.blending[3]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.blending[4]), NET_COLOR, false }, // send flags (first 4 bytes)
|
||||||
|
{ ES_FIELD(model.blending[5]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.blending[6]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.blending[7]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.blending[8]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[0]), NET_COLOR, false }, // bone controllers #
|
||||||
|
{ ES_FIELD(model.controller[1]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[2]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[3]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[4]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[5]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[6]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[7]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[8]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[9]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[10]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[11]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[12]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[13]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[14]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[15]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(model.controller[16]), NET_COLOR, false }, // FIXME: sending as array
|
||||||
|
{ ES_FIELD(solidtype), NET_BYTE, false },
|
||||||
|
{ ES_FIELD(movetype), NET_BYTE, false }, // send flags (second 4 bytes)
|
||||||
|
{ ES_FIELD(gravity), NET_SHORT, false }, // gravity multiplier
|
||||||
|
{ ES_FIELD(aiment), NET_WORD, false }, // entity index
|
||||||
|
{ ES_FIELD(solid), NET_LONG, false }, // encoded mins/maxs
|
||||||
|
{ ES_FIELD(mins[0]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(mins[1]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(mins[2]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(maxs[0]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(maxs[1]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(maxs[2]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(effects), NET_LONG, false }, // effect flags
|
||||||
|
{ ES_FIELD(renderfx), NET_LONG, false }, // renderfx flags
|
||||||
|
{ ES_FIELD(renderamt), NET_COLOR, false }, // alpha amount
|
||||||
|
{ ES_FIELD(rendercolor[0]), NET_COLOR, false }, // animation blending
|
||||||
|
{ ES_FIELD(rendercolor[1]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(rendercolor[2]), NET_COLOR, false },
|
||||||
|
{ ES_FIELD(rendermode), NET_BYTE, false }, // render mode (legacy stuff)
|
||||||
|
{ ES_FIELD(pm_type), NET_BYTE, false }, // 16 player movetypes allowed
|
||||||
|
{ ES_FIELD(pm_flags), NET_WORD, false }, // 16 movetype flags allowed
|
||||||
|
{ ES_FIELD(pm_time), NET_BYTE, false }, // each unit 8 msec
|
||||||
|
{ ES_FIELD(delta_angles[0]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(delta_angles[1]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(delta_angles[2]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(punch_angles[0]), NET_SCALE, false },
|
||||||
|
{ ES_FIELD(punch_angles[1]), NET_SCALE, false },
|
||||||
|
{ ES_FIELD(punch_angles[2]), NET_SCALE, false },
|
||||||
|
{ ES_FIELD(viewangles[0]), NET_FLOAT, false }, // for fixed views
|
||||||
|
{ ES_FIELD(viewangles[1]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(viewangles[2]), NET_FLOAT, false },
|
||||||
|
{ ES_FIELD(viewoffset[0]), NET_SCALE, false },
|
||||||
|
{ ES_FIELD(viewoffset[1]), NET_SCALE, false },
|
||||||
|
{ ES_FIELD(viewoffset[2]), NET_SCALE, false },
|
||||||
|
{ ES_FIELD(maxspeed), NET_WORD, false }, // send flags (third 4 bytes )
|
||||||
|
{ ES_FIELD(fov), NET_FLOAT, false }, // client horizontal field of view
|
||||||
|
{ ES_FIELD(health), NET_FLOAT, false }, // client health
|
||||||
|
{ ES_FIELD(vmodel.index), NET_WORD, false }, // 4096 models
|
||||||
|
{ ES_FIELD(vmodel.colormap), NET_LONG, false }, // 4096 models
|
||||||
|
{ ES_FIELD(vmodel.sequence), NET_WORD, false }, // 1024 sequences
|
||||||
|
{ ES_FIELD(vmodel.frame), NET_FLOAT, false }, // interpolate value
|
||||||
|
{ ES_FIELD(vmodel.body), NET_BYTE, false }, // 255 bodies
|
||||||
|
{ ES_FIELD(vmodel.skin), NET_BYTE, false }, // 255 skins
|
||||||
|
{ ES_FIELD(pmodel.index), NET_WORD, false }, // 4096 models
|
||||||
|
{ ES_FIELD(pmodel.colormap), NET_LONG, false }, // 4096 models
|
||||||
|
{ ES_FIELD(pmodel.sequence), NET_WORD, false }, // 1024 sequences
|
||||||
|
{ ES_FIELD(vmodel.frame), NET_FLOAT, false }, // interpolate value
|
||||||
|
{ NULL }, // terminator
|
||||||
|
};
|
||||||
|
|
||||||
|
// probably usercmd_t never reached 32 field integer limit (in theory of course)
|
||||||
|
static net_field_t cmd_fields[] =
|
||||||
|
{
|
||||||
|
{ CM_FIELD(msec), NET_BYTE, true },
|
||||||
|
{ CM_FIELD(angles[0]), NET_WORD, false },
|
||||||
|
{ CM_FIELD(angles[1]), NET_WORD, false },
|
||||||
|
{ CM_FIELD(angles[2]), NET_WORD, false },
|
||||||
|
{ CM_FIELD(forwardmove), NET_SHORT, false },
|
||||||
|
{ CM_FIELD(sidemove), NET_SHORT, false },
|
||||||
|
{ CM_FIELD(upmove), NET_SHORT, false },
|
||||||
|
{ CM_FIELD(buttons), NET_BYTE, false },
|
||||||
|
{ CM_FIELD(impulse), NET_BYTE, false },
|
||||||
|
{ CM_FIELD(lightlevel), NET_BYTE, false },
|
||||||
|
{ NULL },
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=============================================================================
|
=============================================================================
|
||||||
|
|
||||||
@ -168,14 +288,6 @@ void _MSG_WriteBits( sizebuf_t *msg, int value, int net_type, const char *filena
|
|||||||
buf[0] = value & 0xff;
|
buf[0] = value & 0xff;
|
||||||
buf[1] = value>>8;
|
buf[1] = value>>8;
|
||||||
break;
|
break;
|
||||||
case NET_COORD:
|
|
||||||
value *= SV_COORD_FRAC;
|
|
||||||
buf = MSG_GetSpace( msg, 4 );
|
|
||||||
buf[0] = (value>>0 ) & 0xff;
|
|
||||||
buf[1] = (value>>8 ) & 0xff;
|
|
||||||
buf[2] = (value>>16) & 0xff;
|
|
||||||
buf[3] = (value>>24);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
Host_Error( "MSG_WriteBits: bad net.type (called at %s:%i)\n", filename, fileline );
|
Host_Error( "MSG_WriteBits: bad net.type (called at %s:%i)\n", filename, fileline );
|
||||||
break;
|
break;
|
||||||
@ -231,11 +343,6 @@ long _MSG_ReadBits( sizebuf_t *msg, int net_type, const char *filename, const in
|
|||||||
value = SHORT2ANGLE( value );
|
value = SHORT2ANGLE( value );
|
||||||
msg->readcount += 2;
|
msg->readcount += 2;
|
||||||
break;
|
break;
|
||||||
case NET_COORD:
|
|
||||||
value = (long)BuffLittleLong(msg->data + msg->readcount);
|
|
||||||
value *= CL_COORD_FRAC;
|
|
||||||
msg->readcount += 4;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
Host_Error( "MSG_ReadBits: bad net.type (called at %s:%i)\n", filename, fileline );
|
Host_Error( "MSG_ReadBits: bad net.type (called at %s:%i)\n", filename, fileline );
|
||||||
break;
|
break;
|
||||||
|
@ -147,133 +147,12 @@ static const net_desc_t NWDesc[] =
|
|||||||
#define CS_GENERAL (CS_PLAYERSKINS+MAX_CLIENTS)
|
#define CS_GENERAL (CS_PLAYERSKINS+MAX_CLIENTS)
|
||||||
#define MAX_CONFIGSTRINGS (CS_GENERAL+MAX_GENERAL)
|
#define MAX_CONFIGSTRINGS (CS_GENERAL+MAX_GENERAL)
|
||||||
|
|
||||||
// sound flags
|
// sound flags (get rid of this)
|
||||||
#define SND_VOL (1<<0) // a scaled byte
|
#define SND_VOL (1<<0) // a scaled byte
|
||||||
#define SND_ATTN (1<<1) // a byte
|
#define SND_ATTN (1<<1) // a byte
|
||||||
#define SND_POS (1<<2) // three coordinates
|
#define SND_POS (1<<2) // three coordinates
|
||||||
#define SND_ENT (1<<3) // a short 0 - 2: channel, 3 - 12: entity
|
#define SND_ENT (1<<3) // a short 0 - 2: channel, 3 - 12: entity
|
||||||
|
|
||||||
static net_field_t ent_fields[] =
|
|
||||||
{
|
|
||||||
{ ES_FIELD(ed_type), NET_BYTE, true },
|
|
||||||
{ ES_FIELD(soundindex), NET_WORD, false }, // 512 sounds ( OpenAL software limit is 255 )
|
|
||||||
{ ES_FIELD(origin[0]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(origin[1]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(origin[2]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(angles[0]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(angles[1]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(angles[2]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(velocity[0]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(velocity[1]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(velocity[2]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(old_origin[0]), NET_FLOAT, true }, // send always
|
|
||||||
{ ES_FIELD(old_origin[1]), NET_FLOAT, true },
|
|
||||||
{ ES_FIELD(old_origin[2]), NET_FLOAT, true },
|
|
||||||
{ ES_FIELD(old_velocity[0]), NET_FLOAT, true }, // client velocity
|
|
||||||
{ ES_FIELD(old_velocity[1]), NET_FLOAT, true },
|
|
||||||
{ ES_FIELD(old_velocity[2]), NET_FLOAT, true },
|
|
||||||
{ ES_FIELD(model.index), NET_WORD, false }, // 4096 models
|
|
||||||
{ ES_FIELD(model.colormap), NET_WORD, false }, // encoded as two shorts for top and bottom color
|
|
||||||
{ ES_FIELD(model.scale), NET_COLOR, false }, // 0-255 values
|
|
||||||
{ ES_FIELD(model.frame), NET_FLOAT, false }, // interpolate value
|
|
||||||
{ ES_FIELD(model.animtime), NET_FLOAT, false }, // auto-animating time
|
|
||||||
{ ES_FIELD(model.framerate), NET_FLOAT, false }, // custom framerate
|
|
||||||
{ ES_FIELD(model.sequence), NET_WORD, false }, // 1024 sequences
|
|
||||||
{ ES_FIELD(model.gaitsequence), NET_WORD, false }, // 1024 gaitsequences
|
|
||||||
{ ES_FIELD(model.skin), NET_BYTE, false }, // 255 skins
|
|
||||||
{ ES_FIELD(model.body), NET_BYTE, false }, // 255 bodies
|
|
||||||
{ ES_FIELD(model.blending[0]), NET_COLOR, false }, // animation blending
|
|
||||||
{ ES_FIELD(model.blending[1]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.blending[2]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.blending[3]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.blending[4]), NET_COLOR, false }, // send flags (first 4 bytes)
|
|
||||||
{ ES_FIELD(model.blending[5]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.blending[6]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.blending[7]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.blending[8]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[0]), NET_COLOR, false }, // bone controllers #
|
|
||||||
{ ES_FIELD(model.controller[1]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[2]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[3]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[4]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[5]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[6]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[7]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[8]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[9]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[10]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[11]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[12]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[13]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[14]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[15]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(model.controller[16]), NET_COLOR, false }, // FIXME: sending as array
|
|
||||||
{ ES_FIELD(solidtype), NET_BYTE, false },
|
|
||||||
{ ES_FIELD(movetype), NET_BYTE, false }, // send flags (second 4 bytes)
|
|
||||||
{ ES_FIELD(gravity), NET_SHORT, false }, // gravity multiplier
|
|
||||||
{ ES_FIELD(aiment), NET_WORD, false }, // entity index
|
|
||||||
{ ES_FIELD(solid), NET_LONG, false }, // encoded mins/maxs
|
|
||||||
{ ES_FIELD(mins[0]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(mins[1]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(mins[2]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(maxs[0]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(maxs[1]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(maxs[2]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(effects), NET_LONG, false }, // effect flags
|
|
||||||
{ ES_FIELD(renderfx), NET_LONG, false }, // renderfx flags
|
|
||||||
{ ES_FIELD(renderamt), NET_COLOR, false }, // alpha amount
|
|
||||||
{ ES_FIELD(rendercolor[0]), NET_COLOR, false }, // animation blending
|
|
||||||
{ ES_FIELD(rendercolor[1]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(rendercolor[2]), NET_COLOR, false },
|
|
||||||
{ ES_FIELD(rendermode), NET_BYTE, false }, // render mode (legacy stuff)
|
|
||||||
{ ES_FIELD(pm_type), NET_BYTE, false }, // 16 player movetypes allowed
|
|
||||||
{ ES_FIELD(pm_flags), NET_WORD, true }, // 16 movetype flags allowed
|
|
||||||
{ ES_FIELD(pm_time), NET_BYTE, true }, // each unit 8 msec
|
|
||||||
{ ES_FIELD(delta_angles[0]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(delta_angles[1]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(delta_angles[2]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(punch_angles[0]), NET_SCALE, false },
|
|
||||||
{ ES_FIELD(punch_angles[1]), NET_SCALE, false },
|
|
||||||
{ ES_FIELD(punch_angles[2]), NET_SCALE, false },
|
|
||||||
{ ES_FIELD(viewangles[0]), NET_FLOAT, false }, // for fixed views
|
|
||||||
{ ES_FIELD(viewangles[1]), NET_FLOAT, false },
|
|
||||||
{ ES_FIELD(viewangles[2]), NET_FLOAT, false },
|
|
||||||
// FIXME: replace with viewoffset
|
|
||||||
//{ ES_FIELD(viewheight), NET_SHORT, false }, // client viewheight
|
|
||||||
{ ES_FIELD(viewoffset[0]), NET_SCALE, false }, // get rid of this
|
|
||||||
{ ES_FIELD(viewoffset[1]), NET_SCALE, false },
|
|
||||||
{ ES_FIELD(viewoffset[2]), NET_SCALE, false },
|
|
||||||
{ ES_FIELD(maxspeed), NET_WORD, false }, // send flags (third 4 bytes )
|
|
||||||
{ ES_FIELD(fov), NET_FLOAT, false }, // client horizontal field of view
|
|
||||||
{ ES_FIELD(vmodel.index), NET_WORD, false }, // 4096 models
|
|
||||||
{ ES_FIELD(vmodel.colormap), NET_LONG, false }, // 4096 models
|
|
||||||
{ ES_FIELD(vmodel.sequence), NET_WORD, false }, // 1024 sequences
|
|
||||||
{ ES_FIELD(vmodel.frame), NET_FLOAT, false }, // interpolate value
|
|
||||||
{ ES_FIELD(vmodel.body), NET_BYTE, false }, // 255 bodies
|
|
||||||
{ ES_FIELD(vmodel.skin), NET_BYTE, false }, // 255 skins
|
|
||||||
{ ES_FIELD(pmodel.index), NET_WORD, false }, // 4096 models
|
|
||||||
{ ES_FIELD(pmodel.colormap), NET_LONG, false }, // 4096 models
|
|
||||||
{ ES_FIELD(pmodel.sequence), NET_WORD, false }, // 1024 sequences
|
|
||||||
{ ES_FIELD(vmodel.frame), NET_FLOAT, false }, // interpolate value
|
|
||||||
{ NULL }, // terminator
|
|
||||||
};
|
|
||||||
|
|
||||||
// probably usercmd_t never reached 32 field integer limit (in theory of course)
|
|
||||||
static net_field_t cmd_fields[] =
|
|
||||||
{
|
|
||||||
{ CM_FIELD(msec), NET_BYTE, true },
|
|
||||||
{ CM_FIELD(angles[0]), NET_WORD, false },
|
|
||||||
{ CM_FIELD(angles[1]), NET_WORD, false },
|
|
||||||
{ CM_FIELD(angles[2]), NET_WORD, false },
|
|
||||||
{ CM_FIELD(forwardmove), NET_SHORT, false },
|
|
||||||
{ CM_FIELD(sidemove), NET_SHORT, false },
|
|
||||||
{ CM_FIELD(upmove), NET_SHORT, false },
|
|
||||||
{ CM_FIELD(buttons), NET_BYTE, false },
|
|
||||||
{ CM_FIELD(impulse), NET_BYTE, false },
|
|
||||||
{ CM_FIELD(lightlevel), NET_BYTE, false },
|
|
||||||
{ NULL },
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
|
@ -29,12 +29,16 @@ cvar_t *host_serverstate;
|
|||||||
cvar_t *host_frametime;
|
cvar_t *host_frametime;
|
||||||
cvar_t *host_cheats;
|
cvar_t *host_cheats;
|
||||||
cvar_t *host_maxfps;
|
cvar_t *host_maxfps;
|
||||||
|
cvar_t *host_maxclients;
|
||||||
cvar_t *r_fullscreen;
|
cvar_t *r_fullscreen;
|
||||||
cvar_t *r_xpos; // X coordinate of window position
|
cvar_t *r_xpos; // X coordinate of window position
|
||||||
cvar_t *r_ypos; // Y coordinate of window position
|
cvar_t *r_ypos; // Y coordinate of window position
|
||||||
cvar_t *vid_gamma;
|
cvar_t *vid_gamma;
|
||||||
|
|
||||||
cvar_t *cm_paused; // remove this
|
// these cvars will be duplicated on each client across network
|
||||||
|
int Host_FrameTime( void ) { return (int)(bound( 1, Cvar_VariableValue( "host_frametime" ) * 1000, 100 )); }
|
||||||
|
int Host_ServerState( void ) { return (int)Cvar_VariableValue( "host_serverstate" ); }
|
||||||
|
int Host_MaxClients( void ) { return (int)bound( 1, Cvar_VariableValue( "host_maxclients" ), 255 ); }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=======
|
=======
|
||||||
@ -210,26 +214,6 @@ void Host_AbortCurrentFrame( void )
|
|||||||
longjmp( host.abortframe, 1 );
|
longjmp( host.abortframe, 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
==================
|
|
||||||
Host_GetFrameTime
|
|
||||||
==================
|
|
||||||
*/
|
|
||||||
float Host_FrameTime( void )
|
|
||||||
{
|
|
||||||
return Cvar_VariableValue( "host_frametime" );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
==================
|
|
||||||
Host_GetServerState
|
|
||||||
==================
|
|
||||||
*/
|
|
||||||
int Host_ServerState( void )
|
|
||||||
{
|
|
||||||
return (int)Cvar_VariableValue( "host_serverstate" );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
Host_SetServerState
|
Host_SetServerState
|
||||||
@ -237,7 +221,7 @@ Host_SetServerState
|
|||||||
*/
|
*/
|
||||||
void Host_SetServerState( int state )
|
void Host_SetServerState( int state )
|
||||||
{
|
{
|
||||||
Cvar_SetValue("host_serverstate", state );
|
Cvar_SetValue( "host_serverstate", state );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -740,8 +724,6 @@ void Host_Init( int argc, char **argv)
|
|||||||
host.state = HOST_INIT; // initialzation started
|
host.state = HOST_INIT; // initialzation started
|
||||||
host.type = g_Instance;
|
host.type = g_Instance;
|
||||||
|
|
||||||
srand(time(NULL)); // init random generator
|
|
||||||
|
|
||||||
Host_InitCommon( argc, argv ); // loading common.dll
|
Host_InitCommon( argc, argv ); // loading common.dll
|
||||||
Key_Init();
|
Key_Init();
|
||||||
|
|
||||||
@ -756,7 +738,7 @@ void Host_Init( int argc, char **argv)
|
|||||||
Cbuf_Execute();
|
Cbuf_Execute();
|
||||||
|
|
||||||
// init commands and vars
|
// init commands and vars
|
||||||
if(host.developer)
|
if( host.developer )
|
||||||
{
|
{
|
||||||
Cmd_AddCommand ("error", Host_Error_f, "just throw a fatal error to test shutdown procedures" );
|
Cmd_AddCommand ("error", Host_Error_f, "just throw a fatal error to test shutdown procedures" );
|
||||||
Cmd_AddCommand ("crash", Host_Crash_f, "a way to force a bus error for development reasons");
|
Cmd_AddCommand ("crash", Host_Crash_f, "a way to force a bus error for development reasons");
|
||||||
@ -764,9 +746,9 @@ void Host_Init( int argc, char **argv)
|
|||||||
|
|
||||||
host_cheats = Cvar_Get("host_cheats", "1", CVAR_SYSTEMINFO, "allow cheat variables to enable" );
|
host_cheats = Cvar_Get("host_cheats", "1", CVAR_SYSTEMINFO, "allow cheat variables to enable" );
|
||||||
host_maxfps = Cvar_Get( "host_maxfps", "100", CVAR_ARCHIVE, "host fps upper limit" );
|
host_maxfps = Cvar_Get( "host_maxfps", "100", CVAR_ARCHIVE, "host fps upper limit" );
|
||||||
cm_paused = Cvar_Get("cm_paused", "0", 0, "physics module pause" );
|
host_frametime = Cvar_Get ("host_frametime", "0.1", CVAR_SERVERINFO, "host frametime" );
|
||||||
host_frametime = Cvar_Get ("host_frametime", "0.1", 0, "host frametime" );
|
host_maxclients = Cvar_Get ("host_maxclients", "1", CVAR_SERVERINFO|CVAR_LATCH, "server maxplayers limit" );
|
||||||
host_serverstate = Cvar_Get ("host_serverstate", "0", 0, "displays current server state" );
|
host_serverstate = Cvar_Get ("host_serverstate", "0", CVAR_SERVERINFO, "displays current server state" );
|
||||||
timescale = Cvar_Get ("timescale", "1", 0, "physics world timescale" );
|
timescale = Cvar_Get ("timescale", "1", 0, "physics world timescale" );
|
||||||
|
|
||||||
s = va("^1Xash %g ^3%s", GI->version, buildstring );
|
s = va("^1Xash %g ^3%s", GI->version, buildstring );
|
||||||
|
@ -77,6 +77,7 @@ typedef struct server_s
|
|||||||
|
|
||||||
float time; // always sv.framenum * 50 msec
|
float time; // always sv.framenum * 50 msec
|
||||||
float frametime;
|
float frametime;
|
||||||
|
dword timeleft;
|
||||||
int framenum;
|
int framenum;
|
||||||
|
|
||||||
char name[MAX_QPATH]; // map name, or cinematic name
|
char name[MAX_QPATH]; // map name, or cinematic name
|
||||||
@ -112,9 +113,7 @@ typedef struct sv_client_s
|
|||||||
{
|
{
|
||||||
cl_state_t state;
|
cl_state_t state;
|
||||||
|
|
||||||
entity_state_t ps; // communicated by server to clients
|
|
||||||
char userinfo[MAX_INFO_STRING]; // name, etc
|
char userinfo[MAX_INFO_STRING]; // name, etc
|
||||||
|
|
||||||
int lastframe; // for delta compression
|
int lastframe; // for delta compression
|
||||||
usercmd_t lastcmd; // for filling in big drops
|
usercmd_t lastcmd; // for filling in big drops
|
||||||
usercmd_t cmd; // current user commands
|
usercmd_t cmd; // current user commands
|
||||||
@ -125,6 +124,7 @@ typedef struct sv_client_s
|
|||||||
int ping;
|
int ping;
|
||||||
int rate;
|
int rate;
|
||||||
int surpressCount; // number of messages rate supressed
|
int surpressCount; // number of messages rate supressed
|
||||||
|
int sendtime; // time before send next packet
|
||||||
|
|
||||||
edict_t *edict; // EDICT_NUM(clientnum+1)
|
edict_t *edict; // EDICT_NUM(clientnum+1)
|
||||||
char name[32]; // extracted from userinfo, high bits masked
|
char name[32]; // extracted from userinfo, high bits masked
|
||||||
@ -223,8 +223,8 @@ typedef struct
|
|||||||
|
|
||||||
int spawncount; // incremented each server start
|
int spawncount; // incremented each server start
|
||||||
// used to check late spawns
|
// used to check late spawns
|
||||||
sv_client_t *clients; // [maxclients->value]
|
sv_client_t *clients; // [host_maxclients->integer]
|
||||||
int num_client_entities; // maxclients->value*UPDATE_BACKUP*MAX_PACKET_ENTITIES
|
int num_client_entities; // host_maxclients->integer*UPDATE_BACKUP
|
||||||
int next_client_entities; // next client_entity to use
|
int next_client_entities; // next client_entity to use
|
||||||
entity_state_t *client_entities; // [num_client_entities]
|
entity_state_t *client_entities; // [num_client_entities]
|
||||||
entity_state_t *baselines; // [host.max_edicts]
|
entity_state_t *baselines; // [host.max_edicts]
|
||||||
@ -243,7 +243,6 @@ extern server_static_t svs; // persistant server info
|
|||||||
extern server_t sv; // local server
|
extern server_t sv; // local server
|
||||||
|
|
||||||
extern cvar_t *sv_paused;
|
extern cvar_t *sv_paused;
|
||||||
extern cvar_t *maxclients;
|
|
||||||
extern cvar_t *sv_noreload; // don't reload level state when reentering
|
extern cvar_t *sv_noreload; // don't reload level state when reentering
|
||||||
extern cvar_t *sv_airaccelerate; // don't reload level state when reentering
|
extern cvar_t *sv_airaccelerate; // don't reload level state when reentering
|
||||||
extern cvar_t *sv_accelerate;
|
extern cvar_t *sv_accelerate;
|
||||||
@ -262,6 +261,7 @@ extern cvar_t *sv_playersonly;
|
|||||||
extern cvar_t *sv_rollangle;
|
extern cvar_t *sv_rollangle;
|
||||||
extern cvar_t *sv_rollspeed;
|
extern cvar_t *sv_rollspeed;
|
||||||
extern cvar_t *sv_maxspeed;
|
extern cvar_t *sv_maxspeed;
|
||||||
|
extern cvar_t *host_frametime;
|
||||||
|
|
||||||
extern sv_client_t *sv_client;
|
extern sv_client_t *sv_client;
|
||||||
|
|
||||||
@ -384,9 +384,7 @@ void SV_StartParticle (vec3_t org, vec3_t dir, int color, int count);
|
|||||||
void SV_FreeEdict (edict_t *ed);
|
void SV_FreeEdict (edict_t *ed);
|
||||||
void SV_InitEdict (edict_t *e);
|
void SV_InitEdict (edict_t *e);
|
||||||
edict_t *SV_Spawn (void);
|
edict_t *SV_Spawn (void);
|
||||||
void SV_RunFrame (void);
|
|
||||||
bool SV_ClientConnect (edict_t *ent, char *userinfo);
|
bool SV_ClientConnect (edict_t *ent, char *userinfo);
|
||||||
void ClientThink (edict_t *ent, usercmd_t *ucmd);
|
|
||||||
void SV_TouchTriggers (edict_t *ent);
|
void SV_TouchTriggers (edict_t *ent);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -90,7 +90,7 @@ void SV_DirectConnect( netadr_t from )
|
|||||||
userinfo[sizeof(userinfo) - 1] = 0;
|
userinfo[sizeof(userinfo) - 1] = 0;
|
||||||
|
|
||||||
// quick reject
|
// quick reject
|
||||||
for( i = 0, cl = svs.clients; i < maxclients->integer; i++, cl++ )
|
for( i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++ )
|
||||||
{
|
{
|
||||||
if( cl->state == cs_free ) continue;
|
if( cl->state == cs_free ) continue;
|
||||||
if( NET_CompareBaseAdr(from, cl->netchan.remote_address) && (cl->netchan.qport == qport || from.port == cl->netchan.remote_address.port))
|
if( NET_CompareBaseAdr(from, cl->netchan.remote_address) && (cl->netchan.qport == qport || from.port == cl->netchan.remote_address.port))
|
||||||
@ -136,7 +136,7 @@ void SV_DirectConnect( netadr_t from )
|
|||||||
memset( newcl, 0, sizeof(sv_client_t));
|
memset( newcl, 0, sizeof(sv_client_t));
|
||||||
|
|
||||||
// if there is already a slot for this ip, reuse it
|
// if there is already a slot for this ip, reuse it
|
||||||
for( i = 0, cl = svs.clients; i < maxclients->integer; i++, cl++ )
|
for( i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++ )
|
||||||
{
|
{
|
||||||
if( cl->state == cs_free ) continue;
|
if( cl->state == cs_free ) continue;
|
||||||
if( NET_CompareBaseAdr(from, cl->netchan.remote_address) && (cl->netchan.qport == qport || from.port == cl->netchan.remote_address.port))
|
if( NET_CompareBaseAdr(from, cl->netchan.remote_address) && (cl->netchan.qport == qport || from.port == cl->netchan.remote_address.port))
|
||||||
@ -149,7 +149,7 @@ void SV_DirectConnect( netadr_t from )
|
|||||||
|
|
||||||
// find a client slot
|
// find a client slot
|
||||||
newcl = NULL;
|
newcl = NULL;
|
||||||
for( i = 0, cl = svs.clients; i < maxclients->value; i++, cl++)
|
for( i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++)
|
||||||
{
|
{
|
||||||
if( cl->state == cs_free )
|
if( cl->state == cs_free )
|
||||||
{
|
{
|
||||||
@ -203,9 +203,9 @@ gotnewcl:
|
|||||||
|
|
||||||
// if this was the first client on the server, or the last client
|
// if this was the first client on the server, or the last client
|
||||||
// the server can hold, send a heartbeat to the master.
|
// the server can hold, send a heartbeat to the master.
|
||||||
for( i = 0, cl = svs.clients; i < maxclients->integer; i++, cl++ )
|
for( i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++ )
|
||||||
if( cl->state >= cs_connected ) count++;
|
if( cl->state >= cs_connected ) count++;
|
||||||
if( count == 1 || count == maxclients->integer )
|
if( count == 1 || count == Host_MaxClients())
|
||||||
svs.last_heartbeat = MAX_HEARTBEAT;
|
svs.last_heartbeat = MAX_HEARTBEAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,7 +223,6 @@ bool SV_ClientConnect( edict_t *ent, char *userinfo )
|
|||||||
|
|
||||||
// make sure we start with known default
|
// make sure we start with known default
|
||||||
ent->progs.sv->flags = 0;
|
ent->progs.sv->flags = 0;
|
||||||
ent->progs.sv->health = 100;
|
|
||||||
|
|
||||||
MsgDev(D_NOTE, "SV_ClientConnect()\n");
|
MsgDev(D_NOTE, "SV_ClientConnect()\n");
|
||||||
prog->globals.sv->time = sv.time;
|
prog->globals.sv->time = sv.time;
|
||||||
@ -266,12 +265,12 @@ void SV_DropClient( sv_client_t *drop )
|
|||||||
// to the master so it is known the server is empty
|
// to the master so it is known the server is empty
|
||||||
// send a heartbeat now so the master will get up to date info
|
// send a heartbeat now so the master will get up to date info
|
||||||
// if there is already a slot for this ip, reuse it
|
// if there is already a slot for this ip, reuse it
|
||||||
for( i = 0; i < maxclients->integer; i++ )
|
for( i = 0; i < Host_MaxClients(); i++ )
|
||||||
{
|
{
|
||||||
if( svs.clients[i].state >= cs_connected )
|
if( svs.clients[i].state >= cs_connected )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if( i == maxclients->integer ) svs.last_heartbeat = MAX_HEARTBEAT;
|
if( i == Host_MaxClients()) svs.last_heartbeat = MAX_HEARTBEAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -341,9 +340,9 @@ char *SV_StatusString( void )
|
|||||||
|
|
||||||
com.strcpy( status, Cvar_Serverinfo());
|
com.strcpy( status, Cvar_Serverinfo());
|
||||||
com.strcat( status, "\n" );
|
com.strcat( status, "\n" );
|
||||||
statusLength = strlen(status);
|
statusLength = com.strlen(status);
|
||||||
|
|
||||||
for( i = 0; i < maxclients->value; i++ )
|
for( i = 0; i < Host_MaxClients(); i++ )
|
||||||
{
|
{
|
||||||
cl = &svs.clients[i];
|
cl = &svs.clients[i];
|
||||||
if( cl->state == cs_connected || cl->state == cs_spawned )
|
if( cl->state == cs_connected || cl->state == cs_spawned )
|
||||||
@ -397,8 +396,7 @@ void SV_Info( netadr_t from )
|
|||||||
int version;
|
int version;
|
||||||
|
|
||||||
// ignore in single player
|
// ignore in single player
|
||||||
if( maxclients->value == 1 )
|
if(Host_MaxClients() == 1 ) return;
|
||||||
return;
|
|
||||||
|
|
||||||
version = com.atoi(Cmd_Argv( 1 ));
|
version = com.atoi(Cmd_Argv( 1 ));
|
||||||
|
|
||||||
@ -406,10 +404,10 @@ void SV_Info( netadr_t from )
|
|||||||
com.sprintf( string, "%s: wrong version\n", hostname->string, sizeof(string));
|
com.sprintf( string, "%s: wrong version\n", hostname->string, sizeof(string));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for( i = 0; i < maxclients->value; i++ )
|
for( i = 0; i < Host_MaxClients(); i++ )
|
||||||
if( svs.clients[i].state >= cs_connected )
|
if( svs.clients[i].state >= cs_connected )
|
||||||
count++;
|
count++;
|
||||||
com.sprintf( string, "%16s %8s %2i/%2i\n", hostname->string, sv.name, count, (int)maxclients->value );
|
com.sprintf( string, "%16s %8s %2i/%2i\n", hostname->string, sv.name, count, Host_MaxClients());
|
||||||
}
|
}
|
||||||
Netchan_OutOfBandPrint( NS_SERVER, from, "info\n%s", string );
|
Netchan_OutOfBandPrint( NS_SERVER, from, "info\n%s", string );
|
||||||
}
|
}
|
||||||
@ -490,6 +488,7 @@ void SV_PutClientInServer( edict_t *ent )
|
|||||||
|
|
||||||
ent->priv.sv->free = false;
|
ent->priv.sv->free = false;
|
||||||
(int)ent->progs.sv->flags &= ~FL_DEADMONSTER;
|
(int)ent->progs.sv->flags &= ~FL_DEADMONSTER;
|
||||||
|
ent->priv.sv->s.ed_type = ED_CLIENT; // init edict type
|
||||||
|
|
||||||
if( !sv.loadgame )
|
if( !sv.loadgame )
|
||||||
{
|
{
|
||||||
@ -499,17 +498,15 @@ void SV_PutClientInServer( edict_t *ent )
|
|||||||
ent->progs.sv->origin[2] += 1; // make sure off ground
|
ent->progs.sv->origin[2] += 1; // make sure off ground
|
||||||
VectorCopy( ent->progs.sv->origin, ent->progs.sv->old_origin );
|
VectorCopy( ent->progs.sv->origin, ent->progs.sv->old_origin );
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup playerstate
|
|
||||||
memset( &client->ps, 0, sizeof(client->ps));
|
|
||||||
|
|
||||||
client->ps.fov = 90;
|
ent->priv.sv->s.fov = 90; // FIXME: get from qc
|
||||||
client->ps.fov = bound(1, client->ps.fov, 160);
|
ent->priv.sv->s.fov = bound(1, ent->priv.sv->s.fov, 160);
|
||||||
client->ps.vmodel.index = SV_ModelIndex(PRVM_GetString(ent->progs.sv->v_model));
|
ent->priv.sv->s.health = ent->progs.sv->health;
|
||||||
client->ps.pmodel.index = SV_ModelIndex(PRVM_GetString(ent->progs.sv->p_model));
|
ent->priv.sv->s.vmodel.index = SV_ModelIndex(PRVM_GetString(ent->progs.sv->v_model));
|
||||||
VectorScale( ent->progs.sv->origin, SV_COORD_FRAC, client->ps.origin );
|
ent->priv.sv->s.pmodel.index = SV_ModelIndex(PRVM_GetString(ent->progs.sv->p_model));
|
||||||
VectorCopy( ent->progs.sv->v_angle, client->ps.viewangles );
|
VectorCopy( ent->progs.sv->origin, ent->priv.sv->s.origin );
|
||||||
for( i = 0; i < 3; i++ ) client->ps.delta_angles[i] = ANGLE2SHORT(ent->progs.sv->v_angle[i]);
|
VectorCopy( ent->progs.sv->v_angle, ent->priv.sv->s.viewangles );
|
||||||
|
for( i = 0; i < 3; i++ ) ent->priv.sv->s.delta_angles[i] = ANGLE2SHORT(ent->progs.sv->v_angle[i]);
|
||||||
|
|
||||||
SV_LinkEdict( ent ); // m_pmatrix calculated here, so we need call this before pe->CreatePlayer
|
SV_LinkEdict( ent ); // m_pmatrix calculated here, so we need call this before pe->CreatePlayer
|
||||||
ent->priv.sv->physbody = pe->CreatePlayer( ent->priv.sv, SV_GetModelPtr( ent ), ent->progs.sv->m_pmatrix );
|
ent->priv.sv->physbody = pe->CreatePlayer( ent->priv.sv, SV_GetModelPtr( ent ), ent->progs.sv->m_pmatrix );
|
||||||
@ -857,7 +854,7 @@ void SV_ExecuteClientCommand( sv_client_t *cl, char *s )
|
|||||||
{
|
{
|
||||||
if(!com.strcmp(Cmd_Argv(0), u->name))
|
if(!com.strcmp(Cmd_Argv(0), u->name))
|
||||||
{
|
{
|
||||||
Msg("ucmd->%s\n", u->name );
|
MsgDev( D_NOTE, "ucmd->%s()\n", u->name );
|
||||||
u->func( cl );
|
u->func( cl );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -903,7 +900,7 @@ void _MSG_Send( msgtype_t msg_type, vec3_t origin, edict_t *ent, const char *fil
|
|||||||
byte *mask = NULL;
|
byte *mask = NULL;
|
||||||
int leafnum = 0, cluster = 0;
|
int leafnum = 0, cluster = 0;
|
||||||
int area1 = 0, area2 = 0;
|
int area1 = 0, area2 = 0;
|
||||||
int j, numclients = maxclients->value;
|
int j, numclients = Host_MaxClients();
|
||||||
sv_client_t *cl, *current = svs.clients;
|
sv_client_t *cl, *current = svs.clients;
|
||||||
bool reliable = false;
|
bool reliable = false;
|
||||||
|
|
||||||
@ -1012,29 +1009,31 @@ void SV_ApplyClientMove( sv_client_t *cl, usercmd_t *cmd )
|
|||||||
{
|
{
|
||||||
short temp;
|
short temp;
|
||||||
int i;
|
int i;
|
||||||
|
edict_t *ent = cl->edict;
|
||||||
|
|
||||||
// set the edict fields
|
// set the edict fields
|
||||||
cl->edict->progs.sv->button0 = cmd->buttons & 1;
|
ent->progs.sv->button0 = cmd->buttons & 1;
|
||||||
cl->edict->progs.sv->button2 = (cmd->buttons & 2)>>1;
|
ent->progs.sv->button2 = (cmd->buttons & 2)>>1;
|
||||||
if( cmd->impulse ) cl->edict->progs.sv->impulse = cmd->impulse;
|
if( cmd->impulse ) ent->progs.sv->impulse = cmd->impulse;
|
||||||
// only send the impulse to qc once
|
// only send the impulse to qc once
|
||||||
cmd->impulse = 0;
|
cmd->impulse = 0;
|
||||||
|
|
||||||
// circularly clamp the angles with deltas
|
// circularly clamp the angles with deltas
|
||||||
for( i = 0; i < 3; i++ )
|
for( i = 0; i < 3; i++ )
|
||||||
{
|
{
|
||||||
temp = cmd->angles[i] + cl->ps.delta_angles[i];
|
temp = cmd->angles[i] + ent->priv.sv->s.delta_angles[i];
|
||||||
cl->ps.viewangles[i] = SHORT2ANGLE( temp );
|
ent->priv.sv->s.viewangles[i] = SHORT2ANGLE( temp );
|
||||||
}
|
}
|
||||||
|
|
||||||
// don't let the player look up or down more than 90 degrees
|
// don't let the player look up or down more than 90 degrees
|
||||||
if( cl->ps.viewangles[PITCH] > 89 && cl->ps.viewangles[PITCH] < 180 )
|
if( ent->priv.sv->s.viewangles[PITCH] > 89 && ent->priv.sv->s.viewangles[PITCH] < 180 )
|
||||||
cl->ps.viewangles[PITCH] = 89;
|
ent->priv.sv->s.viewangles[PITCH] = 89;
|
||||||
else if( cl->ps.viewangles[PITCH] < 271 && cl->ps.viewangles[PITCH] >= 180 )
|
else if( ent->priv.sv->s.viewangles[PITCH] < 271 && ent->priv.sv->s.viewangles[PITCH] >= 180 )
|
||||||
cl->ps.viewangles[PITCH] = 271;
|
ent->priv.sv->s.viewangles[PITCH] = 271;
|
||||||
|
|
||||||
VectorCopy( cl->ps.viewangles, cl->edict->progs.sv->v_angle );
|
VectorCopy( ent->priv.sv->s.viewangles, cl->edict->progs.sv->v_angle );
|
||||||
VectorCopy( cl->ps.viewangles, cl->edict->progs.sv->angles );
|
VectorCopy( ent->priv.sv->s.viewangles, cl->edict->progs.sv->angles );
|
||||||
|
VectorCopy( ent->progs.sv->view_ofs, cl->edict->priv.sv->s.viewoffset );
|
||||||
}
|
}
|
||||||
|
|
||||||
void SV_DropPunchAngle( sv_client_t *cl )
|
void SV_DropPunchAngle( sv_client_t *cl )
|
||||||
@ -1281,8 +1280,8 @@ void SV_ClientThink( sv_client_t *cl, usercmd_t *cmd )
|
|||||||
vec3_t v_angle;
|
vec3_t v_angle;
|
||||||
|
|
||||||
cl->cmd = *cmd;
|
cl->cmd = *cmd;
|
||||||
cl->skipframes = 0;
|
//cl->skipframes = 0;
|
||||||
#if 1
|
|
||||||
// may have been kicked during the last usercmd
|
// may have been kicked during the last usercmd
|
||||||
if( sv_paused->integer ) return;
|
if( sv_paused->integer ) return;
|
||||||
|
|
||||||
@ -1338,11 +1337,8 @@ void SV_ClientThink( sv_client_t *cl, usercmd_t *cmd )
|
|||||||
SV_AirMove( cl, &cl->cmd );
|
SV_AirMove( cl, &cl->cmd );
|
||||||
SV_CheckVelocity( cl->edict );
|
SV_CheckVelocity( cl->edict );
|
||||||
|
|
||||||
VectorCopy( cl->edict->progs.sv->origin, cl->ps.origin );
|
VectorCopy( cl->edict->progs.sv->origin, cl->edict->priv.sv->s.origin );
|
||||||
VectorCopy( cl->edict->progs.sv->velocity, cl->ps.velocity );
|
VectorCopy( cl->edict->progs.sv->velocity, cl->edict->priv.sv->s.velocity );
|
||||||
#else
|
|
||||||
ClientThink( cl->edict, cmd );
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1364,6 +1360,7 @@ static void SV_UserMove( sv_client_t *cl, sizebuf_t *msg )
|
|||||||
int latency, net_drop;
|
int latency, net_drop;
|
||||||
int checksumIndex, lastframe;
|
int checksumIndex, lastframe;
|
||||||
int checksum, calculatedChecksum;
|
int checksum, calculatedChecksum;
|
||||||
|
float frametime[2];
|
||||||
|
|
||||||
checksumIndex = msg->readcount;
|
checksumIndex = msg->readcount;
|
||||||
checksum = MSG_ReadByte( msg );
|
checksum = MSG_ReadByte( msg );
|
||||||
@ -1399,6 +1396,10 @@ static void SV_UserMove( sv_client_t *cl, sizebuf_t *msg )
|
|||||||
|
|
||||||
if( !sv_paused->value )
|
if( !sv_paused->value )
|
||||||
{
|
{
|
||||||
|
frametime[0] = sv.frametime;
|
||||||
|
frametime[1] = prog->globals.sv->frametime;
|
||||||
|
prog->globals.sv->frametime = sv.frametime = newcmd.msec * 0.001f;
|
||||||
|
|
||||||
net_drop = cl->netchan.dropped;
|
net_drop = cl->netchan.dropped;
|
||||||
if( net_drop < 20 )
|
if( net_drop < 20 )
|
||||||
{
|
{
|
||||||
@ -1412,6 +1413,8 @@ static void SV_UserMove( sv_client_t *cl, sizebuf_t *msg )
|
|||||||
}
|
}
|
||||||
SV_Physics_ClientMove( cl, &newcmd );
|
SV_Physics_ClientMove( cl, &newcmd );
|
||||||
}
|
}
|
||||||
|
sv.frametime = frametime[0];
|
||||||
|
prog->globals.sv->frametime = frametime[1];
|
||||||
cl->lastcmd = newcmd;
|
cl->lastcmd = newcmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,10 +52,8 @@ void SV_BroadcastPrintf( int level, char *fmt, ... )
|
|||||||
va_end( argptr );
|
va_end( argptr );
|
||||||
|
|
||||||
// echo to console
|
// echo to console
|
||||||
if( host.type == HOST_DEDICATED )
|
if( host.type == HOST_DEDICATED ) Msg( "%s", string );
|
||||||
Msg( "%s", string );
|
for( i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++ )
|
||||||
|
|
||||||
for( i = 0, cl = svs.clients; i < maxclients->value; i++, cl++ )
|
|
||||||
{
|
{
|
||||||
if( level < cl->messagelevel) continue;
|
if( level < cl->messagelevel) continue;
|
||||||
if( cl->state != cs_spawned ) continue;
|
if( cl->state != cs_spawned ) continue;
|
||||||
@ -108,25 +106,25 @@ void SV_SetMaster_f( void )
|
|||||||
// make sure the server is listed public
|
// make sure the server is listed public
|
||||||
Cvar_Set ("public", "1");
|
Cvar_Set ("public", "1");
|
||||||
|
|
||||||
for (i = 1; i < MAX_MASTERS; i++)
|
for( i = 1; i < MAX_MASTERS; i++ )
|
||||||
{
|
{
|
||||||
memset(&master_adr[i], 0, sizeof(master_adr[i]));
|
memset(&master_adr[i], 0, sizeof(master_adr[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
// slot 0 will always contain the id master
|
// slot 0 will always contain the id master
|
||||||
for (i = 1, slot = 1; i < Cmd_Argc(); i++)
|
for( i = 1, slot = 1; i < Cmd_Argc(); i++ )
|
||||||
{
|
{
|
||||||
if (slot == MAX_MASTERS) break;
|
if( slot == MAX_MASTERS ) break;
|
||||||
if (!NET_StringToAdr (Cmd_Argv(i), &master_adr[i]))
|
if(!NET_StringToAdr(Cmd_Argv(i), &master_adr[i]))
|
||||||
{
|
{
|
||||||
Msg ("Bad address: %s\n", Cmd_Argv(i));
|
Msg( "Bad address: %s\n", Cmd_Argv(i));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!master_adr[slot].port) master_adr[slot].port = BigShort (PORT_MASTER);
|
if(!master_adr[slot].port) master_adr[slot].port = BigShort (PORT_MASTER);
|
||||||
Msg ("Master server at %s\n", NET_AdrToString (master_adr[slot]));
|
Msg( "Master server at %s\n", NET_AdrToString (master_adr[slot]));
|
||||||
Msg ("Sending a ping.\n");
|
Msg( "Sending a ping.\n");
|
||||||
Netchan_OutOfBandPrint (NS_SERVER, master_adr[slot], "ping");
|
Netchan_OutOfBandPrint( NS_SERVER, master_adr[slot], "ping" );
|
||||||
slot++;
|
slot++;
|
||||||
}
|
}
|
||||||
svs.last_heartbeat = MAX_HEARTBEAT;
|
svs.last_heartbeat = MAX_HEARTBEAT;
|
||||||
@ -150,16 +148,16 @@ bool SV_SetPlayer( void )
|
|||||||
s = Cmd_Argv(1);
|
s = Cmd_Argv(1);
|
||||||
|
|
||||||
// numeric values are just slot numbers
|
// numeric values are just slot numbers
|
||||||
if (s[0] >= '0' && s[0] <= '9')
|
if( s[0] >= '0' && s[0] <= '9' )
|
||||||
{
|
{
|
||||||
idnum = atoi(Cmd_Argv(1));
|
idnum = com.atoi(Cmd_Argv(1));
|
||||||
if (idnum < 0 || idnum >= maxclients->integer)
|
if( idnum < 0 || idnum >= Host_MaxClients())
|
||||||
{
|
{
|
||||||
Msg("Bad client slot: %i\n", idnum);
|
Msg("Bad client slot: %i\n", idnum);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
sv_client = &svs.clients[idnum];
|
sv_client = &svs.clients[idnum];
|
||||||
if (!sv_client->state)
|
if( !sv_client->state )
|
||||||
{
|
{
|
||||||
Msg("Client %i is not active\n", idnum);
|
Msg("Client %i is not active\n", idnum);
|
||||||
return false;
|
return false;
|
||||||
@ -168,16 +166,16 @@ bool SV_SetPlayer( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check for a name match
|
// check for a name match
|
||||||
for (i = 0, cl = svs.clients; i < maxclients->integer; i++, cl++)
|
for( i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++ )
|
||||||
{
|
{
|
||||||
if (!cl->state) continue;
|
if( !cl->state ) continue;
|
||||||
if (!strcmp(cl->name, s))
|
if( !com.strcmp(cl->name, s))
|
||||||
{
|
{
|
||||||
sv_client = cl;
|
sv_client = cl;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Msg ("Userid %s is not on the server\n", s);
|
Msg( "Userid %s is not on the server\n", s );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,7 +191,7 @@ void SV_Map_f( void )
|
|||||||
{
|
{
|
||||||
char filename[MAX_QPATH];
|
char filename[MAX_QPATH];
|
||||||
|
|
||||||
if(Cmd_Argc() != 2)
|
if( Cmd_Argc() != 2 )
|
||||||
{
|
{
|
||||||
Msg("Usage: map <filename>\n");
|
Msg("Usage: map <filename>\n");
|
||||||
return;
|
return;
|
||||||
@ -208,13 +206,13 @@ void SV_Map_f( void )
|
|||||||
|
|
||||||
SV_InitGame(); // reset previous state
|
SV_InitGame(); // reset previous state
|
||||||
|
|
||||||
SV_BroadcastCommand("changing\n");
|
SV_BroadcastCommand( "changing\n" );
|
||||||
SV_SendClientMessages();
|
SV_SendClientMessages();
|
||||||
SV_SpawnServer( filename, NULL, ss_active );
|
SV_SpawnServer( filename, NULL, ss_active );
|
||||||
SV_BroadcastCommand ("reconnect\n");
|
SV_BroadcastCommand( "reconnect\n" );
|
||||||
|
|
||||||
// archive server state
|
// archive server state
|
||||||
com.strncpy (svs.mapcmd, filename, sizeof(svs.mapcmd) - 1);
|
com.strncpy( svs.mapcmd, filename, sizeof(svs.mapcmd) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -337,15 +335,15 @@ void SV_ChangeLevel_f( void )
|
|||||||
// clear all the client free flags before saving so that
|
// clear all the client free flags before saving so that
|
||||||
// when the level is re-entered, the clients will spawn
|
// when the level is re-entered, the clients will spawn
|
||||||
// at spawn points instead of occupying body shells
|
// at spawn points instead of occupying body shells
|
||||||
savedFree = Z_Malloc(maxclients->integer * sizeof(bool));
|
savedFree = Z_Malloc(Host_MaxClients() * sizeof(bool));
|
||||||
for (i = 0, cl = svs.clients; i < maxclients->integer; i++, cl++)
|
for (i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++)
|
||||||
{
|
{
|
||||||
savedFree[i] = cl->edict->priv.sv->free;
|
savedFree[i] = cl->edict->priv.sv->free;
|
||||||
cl->edict->priv.sv->free = true;
|
cl->edict->priv.sv->free = true;
|
||||||
}
|
}
|
||||||
SV_WriteSaveFile( "save0.bin" ); // autosave
|
SV_WriteSaveFile( "save0.bin" ); // autosave
|
||||||
// we must restore these for clients to transfer over correctly
|
// we must restore these for clients to transfer over correctly
|
||||||
for (i = 0, cl = svs.clients; i < maxclients->integer; i++, cl++)
|
for (i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++)
|
||||||
cl->edict->priv.sv->free = savedFree[i];
|
cl->edict->priv.sv->free = savedFree[i];
|
||||||
Mem_Free(savedFree);
|
Mem_Free(savedFree);
|
||||||
}
|
}
|
||||||
@ -373,7 +371,7 @@ void SV_Restart_f( void )
|
|||||||
|
|
||||||
if(sv.state != ss_active) return;
|
if(sv.state != ss_active) return;
|
||||||
|
|
||||||
strncpy( filename, svs.mapcmd, MAX_QPATH );
|
com.strncpy( filename, svs.mapcmd, MAX_QPATH );
|
||||||
FS_StripExtension( filename );
|
FS_StripExtension( filename );
|
||||||
|
|
||||||
// just sending console command
|
// just sending console command
|
||||||
@ -402,33 +400,12 @@ void SV_Kick_f( void )
|
|||||||
}
|
}
|
||||||
if(!SV_SetPlayer()) return;
|
if(!SV_SetPlayer()) return;
|
||||||
|
|
||||||
SV_BroadcastPrintf (PRINT_CONSOLE, "%s was kicked\n", sv_client->name);
|
SV_BroadcastPrintf( PRINT_CONSOLE, "%s was kicked\n", sv_client->name );
|
||||||
SV_ClientPrintf(sv_client, PRINT_CONSOLE, "You were kicked from the game\n");
|
SV_ClientPrintf(sv_client, PRINT_CONSOLE, "You were kicked from the game\n");
|
||||||
SV_DropClient(sv_client);
|
SV_DropClient(sv_client);
|
||||||
sv_client->lastmessage = svs.realtime; // min case there is a funny zombie
|
sv_client->lastmessage = svs.realtime; // min case there is a funny zombie
|
||||||
}
|
}
|
||||||
|
|
||||||
void SV_Noclip_f( void )
|
|
||||||
{
|
|
||||||
sv_client_t *cl;
|
|
||||||
|
|
||||||
if( maxclients->integer != 1 ) return;
|
|
||||||
|
|
||||||
cl = svs.clients; // use first client
|
|
||||||
if( !cl->state ) return;
|
|
||||||
|
|
||||||
if( cl->edict->progs.sv->movetype == MOVETYPE_WALK )
|
|
||||||
{
|
|
||||||
Msg("noclip on\n" );
|
|
||||||
cl->edict->progs.sv->movetype = MOVETYPE_NOCLIP;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Msg("noclip off\n" );
|
|
||||||
cl->edict->progs.sv->movetype = MOVETYPE_WALK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
SV_Status_f
|
SV_Status_f
|
||||||
@ -449,7 +426,7 @@ void SV_Status_f( void )
|
|||||||
Msg("num score ping name lastmsg address port \n");
|
Msg("num score ping name lastmsg address port \n");
|
||||||
Msg("--- ----- ------- --------------- ------- --------------------- ------\n");
|
Msg("--- ----- ------- --------------- ------- --------------------- ------\n");
|
||||||
|
|
||||||
for(i = 0, cl = svs.clients; i < maxclients->integer; i++, cl++)
|
for(i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++)
|
||||||
{
|
{
|
||||||
int j, l, ping;
|
int j, l, ping;
|
||||||
char *s;
|
char *s;
|
||||||
@ -473,7 +450,7 @@ void SV_Status_f( void )
|
|||||||
Msg ("%9i ", svs.realtime - cl->lastmessage );
|
Msg ("%9i ", svs.realtime - cl->lastmessage );
|
||||||
s = NET_AdrToString ( cl->netchan.remote_address);
|
s = NET_AdrToString ( cl->netchan.remote_address);
|
||||||
Msg ("%s", s);
|
Msg ("%s", s);
|
||||||
l = 22 - strlen(s);
|
l = 22 - com.strlen(s);
|
||||||
for (j = 0; j < l; j++) Msg (" ");
|
for (j = 0; j < l; j++) Msg (" ");
|
||||||
Msg("%5i", cl->netchan.qport);
|
Msg("%5i", cl->netchan.qport);
|
||||||
Msg("\n");
|
Msg("\n");
|
||||||
@ -494,7 +471,7 @@ void SV_ConSay_f( void )
|
|||||||
|
|
||||||
if(Cmd_Argc() < 2) return;
|
if(Cmd_Argc() < 2) return;
|
||||||
|
|
||||||
strncpy(text, "console: ", MAX_SYSPATH );
|
com.strncpy(text, "console: ", MAX_SYSPATH );
|
||||||
p = Cmd_Args();
|
p = Cmd_Args();
|
||||||
|
|
||||||
if(*p == '"')
|
if(*p == '"')
|
||||||
@ -504,10 +481,10 @@ void SV_ConSay_f( void )
|
|||||||
}
|
}
|
||||||
com.strncat(text, p, MAX_SYSPATH );
|
com.strncat(text, p, MAX_SYSPATH );
|
||||||
|
|
||||||
for (i = 0, client = svs.clients; i < maxclients->integer; i++, client++)
|
for (i = 0, client = svs.clients; i < Host_MaxClients(); i++, client++)
|
||||||
{
|
{
|
||||||
if (client->state != cs_spawned) continue;
|
if( client->state != cs_spawned ) continue;
|
||||||
SV_ClientPrintf(client, PRINT_CHAT, "%s\n", text );
|
SV_ClientPrintf( client, PRINT_CHAT, "%s\n", text );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -590,11 +567,6 @@ void SV_InitOperatorCommands( void )
|
|||||||
Cmd_AddCommand("restart", SV_Restart_f, "restarting current level" );
|
Cmd_AddCommand("restart", SV_Restart_f, "restarting current level" );
|
||||||
Cmd_AddCommand("sectorlist", SV_SectorList_f, "display pvs sectors" );
|
Cmd_AddCommand("sectorlist", SV_SectorList_f, "display pvs sectors" );
|
||||||
|
|
||||||
if( host_cheats->integer )
|
|
||||||
{
|
|
||||||
Cmd_AddCommand("noclip", SV_Noclip_f, "enable player noclip" );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( host.type == HOST_DEDICATED )
|
if( host.type == HOST_DEDICATED )
|
||||||
{
|
{
|
||||||
Cmd_AddCommand ("say", SV_ConSay_f, "send a chat message to everyone on the server" );
|
Cmd_AddCommand ("say", SV_ConSay_f, "send a chat message to everyone on the server" );
|
||||||
|
@ -72,14 +72,6 @@ void SV_UpdateEntityState( edict_t *ent )
|
|||||||
VectorCopy (ent->progs.sv->old_origin, ent->priv.sv->s.old_origin);
|
VectorCopy (ent->progs.sv->old_origin, ent->priv.sv->s.old_origin);
|
||||||
ent->priv.sv->s.model.index = (int)ent->progs.sv->modelindex;
|
ent->priv.sv->s.model.index = (int)ent->progs.sv->modelindex;
|
||||||
ent->priv.sv->s.health = ent->progs.sv->health;
|
ent->priv.sv->s.health = ent->progs.sv->health;
|
||||||
|
|
||||||
if( ent->priv.sv->client )
|
|
||||||
{
|
|
||||||
// attached weaponmodel
|
|
||||||
// FIXME: let any entity send weaponmodel
|
|
||||||
ent->priv.sv->s.pmodel.index = ent->priv.sv->client->ps.pmodel.index;
|
|
||||||
}
|
|
||||||
|
|
||||||
ent->priv.sv->s.model.skin = (short)ent->progs.sv->skin; // studio model skin
|
ent->priv.sv->s.model.skin = (short)ent->progs.sv->skin; // studio model skin
|
||||||
ent->priv.sv->s.model.body = (byte)ent->progs.sv->body; // studio model submodel
|
ent->priv.sv->s.model.body = (byte)ent->progs.sv->body; // studio model submodel
|
||||||
ent->priv.sv->s.model.frame = ent->progs.sv->frame; // any model current frame
|
ent->priv.sv->s.model.frame = ent->progs.sv->frame; // any model current frame
|
||||||
@ -88,6 +80,12 @@ void SV_UpdateEntityState( edict_t *ent )
|
|||||||
ent->priv.sv->s.renderfx = (int)ent->progs.sv->renderfx; // renderer flags
|
ent->priv.sv->s.renderfx = (int)ent->progs.sv->renderfx; // renderer flags
|
||||||
ent->priv.sv->s.renderamt = ent->progs.sv->alpha; // alpha value
|
ent->priv.sv->s.renderamt = ent->progs.sv->alpha; // alpha value
|
||||||
ent->priv.sv->s.model.animtime = ent->progs.sv->animtime; // auto-animating time
|
ent->priv.sv->s.model.animtime = ent->progs.sv->animtime; // auto-animating time
|
||||||
|
|
||||||
|
// copy viewmodel info
|
||||||
|
ent->priv.sv->s.vmodel.frame = ent->progs.sv->v_frame;
|
||||||
|
ent->priv.sv->s.vmodel.body = ent->progs.sv->v_body;
|
||||||
|
ent->priv.sv->s.vmodel.skin = ent->progs.sv->v_skin;
|
||||||
|
ent->priv.sv->s.vmodel.sequence = ent->progs.sv->v_sequence;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -141,7 +139,7 @@ void SV_EmitPacketEntities( client_frame_t *from, client_frame_t *to, sizebuf_t
|
|||||||
// in any bytes being emited if the entity has not changed at all
|
// in any bytes being emited if the entity has not changed at all
|
||||||
// note that players are always 'newentities', this updates their oldorigin always
|
// note that players are always 'newentities', this updates their oldorigin always
|
||||||
// and prevents warping
|
// and prevents warping
|
||||||
MSG_WriteDeltaEntity( oldent, newent, msg, false, newent->number <= maxclients->value );
|
MSG_WriteDeltaEntity( oldent, newent, msg, false, newent->number <= Host_MaxClients());
|
||||||
oldindex++;
|
oldindex++;
|
||||||
newindex++;
|
newindex++;
|
||||||
continue;
|
continue;
|
||||||
@ -252,8 +250,8 @@ void SV_BuildClientFrame( sv_client_t *cl )
|
|||||||
frame->msg_sent = svs.realtime; // save it for ping calc later
|
frame->msg_sent = svs.realtime; // save it for ping calc later
|
||||||
|
|
||||||
// find the client's PVS
|
// find the client's PVS
|
||||||
VectorScale( clent->priv.sv->client->ps.origin, CL_COORD_FRAC, org );
|
VectorCopy( clent->priv.sv->s.origin, org );
|
||||||
VectorAdd( org, clent->priv.sv->client->ps.viewoffset, org );
|
VectorAdd( org, clent->priv.sv->s.viewoffset, org );
|
||||||
|
|
||||||
// calculate fat pvs
|
// calculate fat pvs
|
||||||
if( sv_fatpvs->integer ) SV_FatPVS( org );
|
if( sv_fatpvs->integer ) SV_FatPVS( org );
|
||||||
@ -266,7 +264,7 @@ void SV_BuildClientFrame( sv_client_t *cl )
|
|||||||
frame->areabytes = pe->WriteAreaBits( frame->areabits, clientarea );
|
frame->areabytes = pe->WriteAreaBits( frame->areabits, clientarea );
|
||||||
|
|
||||||
// grab the current player state
|
// grab the current player state
|
||||||
frame->ps = clent->priv.sv->client->ps;
|
frame->ps = clent->priv.sv->s;
|
||||||
|
|
||||||
clientpvs = pe->ClusterPVS( clientcluster );
|
clientpvs = pe->ClusterPVS( clientcluster );
|
||||||
clientphs = pe->ClusterPHS( clientcluster );
|
clientphs = pe->ClusterPHS( clientcluster );
|
||||||
@ -460,7 +458,7 @@ void SV_SendClientMessages( void )
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
// send a message to each connected client
|
// send a message to each connected client
|
||||||
for( i = 0, cl = svs.clients; i < maxclients->value; i++, cl++ )
|
for( i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++ )
|
||||||
{
|
{
|
||||||
if( !cl->state ) continue;
|
if( !cl->state ) continue;
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ int SV_FindIndex (const char *name, int start, int end, bool create)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// register new resource
|
// register new resource
|
||||||
strncpy (sv.configstrings[start+i], name, sizeof(sv.configstrings[i]));
|
com.strncpy (sv.configstrings[start+i], name, sizeof(sv.configstrings[i]));
|
||||||
|
|
||||||
if (sv.state != ss_loading)
|
if (sv.state != ss_loading)
|
||||||
{
|
{
|
||||||
@ -157,9 +157,10 @@ void SV_SpawnServer( char *server, char *savename, sv_state_t serverstate )
|
|||||||
// wipe the entire per-level structure
|
// wipe the entire per-level structure
|
||||||
memset (&sv, 0, sizeof(sv));
|
memset (&sv, 0, sizeof(sv));
|
||||||
svs.realtime = 0;
|
svs.realtime = 0;
|
||||||
|
sv.timeleft = 0;
|
||||||
|
|
||||||
// save name for levels that don't set message
|
// save name for levels that don't set message
|
||||||
strcpy (sv.configstrings[CS_NAME], server);
|
com.strcpy (sv.configstrings[CS_NAME], server);
|
||||||
if( Cvar_VariableValue ("deathmatch") )
|
if( Cvar_VariableValue ("deathmatch") )
|
||||||
com.sprintf( sv.configstrings[CS_AIRACCEL], "%g", sv_airaccelerate->value );
|
com.sprintf( sv.configstrings[CS_AIRACCEL], "%g", sv_airaccelerate->value );
|
||||||
else com.strcpy( sv.configstrings[CS_AIRACCEL], "0" );
|
else com.strcpy( sv.configstrings[CS_AIRACCEL], "0" );
|
||||||
@ -170,7 +171,7 @@ void SV_SpawnServer( char *server, char *savename, sv_state_t serverstate )
|
|||||||
SV_VM_Begin();
|
SV_VM_Begin();
|
||||||
|
|
||||||
// leave slots at start for clients only
|
// leave slots at start for clients only
|
||||||
for (i = 0; i < maxclients->value; i++)
|
for (i = 0; i < Host_MaxClients(); i++)
|
||||||
{
|
{
|
||||||
// needs to reconnect
|
// needs to reconnect
|
||||||
if (svs.clients[i].state > cs_connected)
|
if (svs.clients[i].state > cs_connected)
|
||||||
@ -180,7 +181,7 @@ void SV_SpawnServer( char *server, char *savename, sv_state_t serverstate )
|
|||||||
|
|
||||||
sv.time = 1.0f;
|
sv.time = 1.0f;
|
||||||
|
|
||||||
strcpy(sv.name, server);
|
com.strcpy(sv.name, server);
|
||||||
FS_FileBase(server, sv.configstrings[CS_NAME]);
|
FS_FileBase(server, sv.configstrings[CS_NAME]);
|
||||||
|
|
||||||
if (serverstate != ss_active)
|
if (serverstate != ss_active)
|
||||||
@ -223,8 +224,11 @@ void SV_SpawnServer( char *server, char *savename, sv_state_t serverstate )
|
|||||||
}
|
}
|
||||||
|
|
||||||
// run two frames to allow everything to settle
|
// run two frames to allow everything to settle
|
||||||
SV_RunFrame();
|
for( i = 0; i < 2; i++ )
|
||||||
SV_RunFrame();
|
{
|
||||||
|
sv.frametime = 0.1f;
|
||||||
|
SV_Physics();
|
||||||
|
}
|
||||||
|
|
||||||
// all precaches are complete
|
// all precaches are complete
|
||||||
sv.state = serverstate;
|
sv.state = serverstate;
|
||||||
@ -275,31 +279,32 @@ void SV_InitGame( void )
|
|||||||
// so unless they explicity set coop, force it to deathmatch
|
// so unless they explicity set coop, force it to deathmatch
|
||||||
if( host.type == HOST_DEDICATED )
|
if( host.type == HOST_DEDICATED )
|
||||||
{
|
{
|
||||||
if (!Cvar_VariableValue ("coop"))
|
if(!Cvar_VariableValue( "coop" ))
|
||||||
Cvar_FullSet ("deathmatch", "1", CVAR_SERVERINFO | CVAR_LATCH);
|
Cvar_FullSet( "deathmatch", "1", CVAR_SERVERINFO|CVAR_LATCH );
|
||||||
}
|
}
|
||||||
|
|
||||||
// init clients
|
// init clients
|
||||||
if (Cvar_VariableValue ("deathmatch"))
|
if( Cvar_VariableValue( "deathmatch" ))
|
||||||
{
|
{
|
||||||
if (maxclients->value <= 1)
|
if(Host_MaxClients() <= 1)
|
||||||
Cvar_FullSet ("maxclients", "8", CVAR_SERVERINFO | CVAR_LATCH);
|
Cvar_FullSet( "host_maxclients", "8", CVAR_SERVERINFO|CVAR_LATCH );
|
||||||
else if (maxclients->value > MAX_CLIENTS)
|
else if(Host_MaxClients() > MAX_CLIENTS )
|
||||||
Cvar_FullSet ("maxclients", va("%i", MAX_CLIENTS), CVAR_SERVERINFO | CVAR_LATCH);
|
Cvar_FullSet( "host_maxclients", va("%i", MAX_CLIENTS), CVAR_SERVERINFO|CVAR_LATCH );
|
||||||
}
|
}
|
||||||
else if (Cvar_VariableValue ("coop"))
|
else if( Cvar_VariableValue( "coop" ))
|
||||||
{
|
{
|
||||||
if (maxclients->value <= 1 || maxclients->value > 4)
|
if( Host_MaxClients() <= 1 || Host_MaxClients() > 4 )
|
||||||
Cvar_FullSet ("maxclients", "4", CVAR_SERVERINFO | CVAR_LATCH);
|
Cvar_FullSet( "host_maxclients", "4", CVAR_SERVERINFO|CVAR_LATCH );
|
||||||
}
|
}
|
||||||
else // non-deathmatch, non-coop is one player
|
else
|
||||||
{
|
{
|
||||||
Cvar_FullSet ("maxclients", "1", CVAR_SERVERINFO | CVAR_LATCH);
|
// non-deathmatch, non-coop is one player
|
||||||
|
Cvar_FullSet( "host_maxclients", "1", CVAR_SERVERINFO|CVAR_LATCH );
|
||||||
}
|
}
|
||||||
|
|
||||||
svs.spawncount = RANDOM_LONG( 0, 65535 );
|
svs.spawncount = RANDOM_LONG( 0, 65535 );
|
||||||
svs.clients = Z_Malloc (sizeof(sv_client_t)*maxclients->value);
|
svs.clients = Z_Malloc( sizeof(sv_client_t) * Host_MaxClients());
|
||||||
svs.num_client_entities = maxclients->value * UPDATE_BACKUP * 64;
|
svs.num_client_entities = Host_MaxClients() * UPDATE_BACKUP;// * 64; g-cont: what a mem waster ???????
|
||||||
svs.client_entities = Z_Malloc( sizeof(entity_state_t) * svs.num_client_entities );
|
svs.client_entities = Z_Malloc( sizeof(entity_state_t) * svs.num_client_entities );
|
||||||
svs.baselines = Z_Malloc( sizeof(entity_state_t) * host.max_edicts );
|
svs.baselines = Z_Malloc( sizeof(entity_state_t) * host.max_edicts );
|
||||||
|
|
||||||
@ -313,7 +318,7 @@ void SV_InitGame( void )
|
|||||||
|
|
||||||
SV_VM_Begin();
|
SV_VM_Begin();
|
||||||
|
|
||||||
for (i = 0; i < maxclients->value; i++)
|
for (i = 0; i < Host_MaxClients(); i++)
|
||||||
{
|
{
|
||||||
ent = PRVM_EDICT_NUM(i + 1);
|
ent = PRVM_EDICT_NUM(i + 1);
|
||||||
ent->priv.sv->serialnumber = i + 1;
|
ent->priv.sv->serialnumber = i + 1;
|
||||||
|
@ -29,9 +29,6 @@ cvar_t *sv_rollspeed;
|
|||||||
cvar_t *sv_maxspeed;
|
cvar_t *sv_maxspeed;
|
||||||
cvar_t *sv_accelerate;
|
cvar_t *sv_accelerate;
|
||||||
cvar_t *sv_friction;
|
cvar_t *sv_friction;
|
||||||
|
|
||||||
|
|
||||||
cvar_t *maxclients; // FIXME: rename sv_maxclients
|
|
||||||
cvar_t *hostname;
|
cvar_t *hostname;
|
||||||
cvar_t *public_server; // should heartbeats be sent
|
cvar_t *public_server; // should heartbeats be sent
|
||||||
|
|
||||||
@ -50,25 +47,17 @@ Updates the cl->ping variables
|
|||||||
*/
|
*/
|
||||||
void SV_CalcPings (void)
|
void SV_CalcPings (void)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
sv_client_t *cl;
|
sv_client_t *cl;
|
||||||
int total, count;
|
int total, count;
|
||||||
|
|
||||||
for (i=0 ; i<maxclients->value ; i++)
|
// clamp fps counter
|
||||||
|
for( i = 0; i < Host_MaxClients(); i++ )
|
||||||
{
|
{
|
||||||
cl = &svs.clients[i];
|
cl = &svs.clients[i];
|
||||||
if (cl->state != cs_spawned )
|
if( cl->state != cs_spawned ) continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
#if 0
|
total = count = 0;
|
||||||
if (cl->lastframe > 0)
|
|
||||||
cl->frame_latency[sv.framenum&(LATENCY_COUNTS-1)] = sv.framenum - cl->lastframe + 1;
|
|
||||||
else
|
|
||||||
cl->frame_latency[sv.framenum&(LATENCY_COUNTS-1)] = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
total = 0;
|
|
||||||
count = 0;
|
|
||||||
for( j = 0; j < UPDATE_BACKUP; j++ )
|
for( j = 0; j < UPDATE_BACKUP; j++ )
|
||||||
{
|
{
|
||||||
if( cl->frames[j].latency > 0 )
|
if( cl->frames[j].latency > 0 )
|
||||||
@ -115,7 +104,7 @@ void SV_PacketEvent( netadr_t from, sizebuf_t *msg )
|
|||||||
qport = (int)MSG_ReadShort( msg ) & 0xffff;
|
qport = (int)MSG_ReadShort( msg ) & 0xffff;
|
||||||
|
|
||||||
// check for packets from connected clients
|
// check for packets from connected clients
|
||||||
for( i = 0, cl = svs.clients; i < maxclients->value; i++, cl++ )
|
for( i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++ )
|
||||||
{
|
{
|
||||||
if( cl->state == cs_free ) continue;
|
if( cl->state == cs_free ) continue;
|
||||||
if( !NET_CompareBaseAdr( from, cl->netchan.remote_address )) continue;
|
if( !NET_CompareBaseAdr( from, cl->netchan.remote_address )) continue;
|
||||||
@ -136,11 +125,11 @@ void SV_PacketEvent( netadr_t from, sizebuf_t *msg )
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if( i != maxclients->integer ) return;
|
if( i != Host_MaxClients()) return;
|
||||||
|
|
||||||
// if we received a sequenced packet from an address we don't recognize,
|
// if we received a sequenced packet from an address we don't recognize,
|
||||||
// send an out of band disconnect packet to it
|
// send an out of band disconnect packet to it
|
||||||
//Netchan_OutOfBandPrint( NS_SERVER, from, "disconnect\n" );
|
Netchan_OutOfBandPrint( NS_SERVER, from, "disconnect\n" );
|
||||||
SV_VM_End();
|
SV_VM_End();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,7 +156,10 @@ void SV_CheckTimeouts( void )
|
|||||||
droppoint = svs.realtime - 1000 * timeout->value;
|
droppoint = svs.realtime - 1000 * timeout->value;
|
||||||
zombiepoint = svs.realtime - 1000 * zombietime->value;
|
zombiepoint = svs.realtime - 1000 * zombietime->value;
|
||||||
|
|
||||||
for( i = 0, cl = svs.clients; i < maxclients->value; i++, cl++ )
|
if( host_frametime->modified )
|
||||||
|
Cvar_SetValue( "host_frametime", bound( 0.001f, host_frametime->value, 0.1f ));
|
||||||
|
|
||||||
|
for( i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++ )
|
||||||
{
|
{
|
||||||
// message times may be wrong across a changelevel
|
// message times may be wrong across a changelevel
|
||||||
if( cl->lastmessage > svs.realtime )
|
if( cl->lastmessage > svs.realtime )
|
||||||
@ -187,6 +179,7 @@ void SV_CheckTimeouts( void )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
SV_RunGameFrame
|
SV_RunGameFrame
|
||||||
@ -194,7 +187,7 @@ SV_RunGameFrame
|
|||||||
*/
|
*/
|
||||||
void SV_RunGameFrame (void)
|
void SV_RunGameFrame (void)
|
||||||
{
|
{
|
||||||
if( sv_paused->integer && maxclients->integer == 1 )
|
if( sv_paused->integer && Host_MaxClients() == 1 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// we always need to bump framenum, even if we
|
// we always need to bump framenum, even if we
|
||||||
@ -202,8 +195,8 @@ void SV_RunGameFrame (void)
|
|||||||
// compression can get confused when a client
|
// compression can get confused when a client
|
||||||
// has the "current" frame
|
// has the "current" frame
|
||||||
sv.framenum++;
|
sv.framenum++;
|
||||||
sv.frametime = HOST_FRAMETIME * 0.001f;
|
sv.frametime = Host_FrameTime() * 0.001f;
|
||||||
sv.time = sv.framenum * sv.frametime;
|
//sv.time = sv.framenum * sv.frametime;
|
||||||
|
|
||||||
SV_Physics();
|
SV_Physics();
|
||||||
|
|
||||||
@ -236,14 +229,16 @@ void SV_Frame( dword time )
|
|||||||
// check timeouts
|
// check timeouts
|
||||||
SV_CheckTimeouts ();
|
SV_CheckTimeouts ();
|
||||||
|
|
||||||
|
if( !sv_playersonly->integer ) pe->Frame( sv.frametime );
|
||||||
|
|
||||||
// move autonomous things around if enough time has passed
|
// move autonomous things around if enough time has passed
|
||||||
if( svs.realtime < (sv.time * 1000))
|
if( svs.realtime < (sv.time * 1000))
|
||||||
{
|
{
|
||||||
// never let the time get too far off
|
// never let the time get too far off
|
||||||
if((sv.time * 1000) - svs.realtime > HOST_FRAMETIME )
|
if((sv.time * 1000) - svs.realtime > Host_FrameTime())
|
||||||
{
|
{
|
||||||
Msg ("sv lowclamp\n");
|
Msg ("sv lowclamp\n");
|
||||||
svs.realtime = (sv.time * 1000 ) - HOST_FRAMETIME;
|
svs.realtime = (sv.time * 1000 ) - Host_FrameTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
NET_Sleep((sv.time*1000) - svs.realtime);
|
NET_Sleep((sv.time*1000) - svs.realtime);
|
||||||
@ -365,10 +360,9 @@ void SV_Init (void)
|
|||||||
Cvar_Get ("timelimit", "0", CVAR_SERVERINFO, "multiplayer timelimit" );
|
Cvar_Get ("timelimit", "0", CVAR_SERVERINFO, "multiplayer timelimit" );
|
||||||
Cvar_Get ("protocol", va("%i", PROTOCOL_VERSION), CVAR_SERVERINFO|CVAR_INIT, "displays server protocol version" );
|
Cvar_Get ("protocol", va("%i", PROTOCOL_VERSION), CVAR_SERVERINFO|CVAR_INIT, "displays server protocol version" );
|
||||||
|
|
||||||
sv_fps = Cvar_Get( "sv_fps", "60", CVAR_ARCHIVE|CVAR_LATCH, "running server at" );
|
sv_fps = Cvar_Get( "sv_fps", "60", CVAR_ARCHIVE, "running server at" );
|
||||||
sv_stepheight = Cvar_Get( "sv_stepheight", "18", CVAR_ARCHIVE|CVAR_LATCH, "how high you can step up" );
|
sv_stepheight = Cvar_Get( "sv_stepheight", "18", CVAR_ARCHIVE|CVAR_LATCH, "how high you can step up" );
|
||||||
sv_playersonly = Cvar_Get( "playersonly", "0", 0, "freezes time, except for players" );
|
sv_playersonly = Cvar_Get( "playersonly", "0", 0, "freezes time, except for players" );
|
||||||
maxclients = Cvar_Get ("maxclients", "1", CVAR_SERVERINFO | CVAR_LATCH, "max count of clients for current game" );
|
|
||||||
hostname = Cvar_Get ("hostname", "unnamed", CVAR_SERVERINFO | CVAR_ARCHIVE, "host name" );
|
hostname = Cvar_Get ("hostname", "unnamed", CVAR_SERVERINFO | CVAR_ARCHIVE, "host name" );
|
||||||
timeout = Cvar_Get ("timeout", "125", 0, "connection timeout" );
|
timeout = Cvar_Get ("timeout", "125", 0, "connection timeout" );
|
||||||
zombietime = Cvar_Get ("zombietime", "2", 0, "timeout for clients-zombie (who died but not respawned)" );
|
zombietime = Cvar_Get ("zombietime", "2", 0, "timeout for clients-zombie (who died but not respawned)" );
|
||||||
@ -423,11 +417,11 @@ void SV_FinalMessage (char *message, bool reconnect)
|
|||||||
|
|
||||||
// send it twice
|
// send it twice
|
||||||
// stagger the packets to crutch operating system limited buffers
|
// stagger the packets to crutch operating system limited buffers
|
||||||
for( i = 0, cl = svs.clients; i < maxclients->value; i++, cl++ )
|
for( i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++ )
|
||||||
if( cl->state >= cs_connected )
|
if( cl->state >= cs_connected )
|
||||||
Netchan_Transmit( &cl->netchan, msg.cursize, msg.data );
|
Netchan_Transmit( &cl->netchan, msg.cursize, msg.data );
|
||||||
|
|
||||||
for( i = 0, cl = svs.clients; i < maxclients->value; i++, cl++ )
|
for( i = 0, cl = svs.clients; i < Host_MaxClients(); i++, cl++ )
|
||||||
if( cl->state >= cs_connected )
|
if( cl->state >= cs_connected )
|
||||||
Netchan_Transmit( &cl->netchan, msg.cursize, msg.data );
|
Netchan_Transmit( &cl->netchan, msg.cursize, msg.data );
|
||||||
}
|
}
|
||||||
|
@ -446,15 +446,15 @@ void SV_PlayerMove( sv_edict_t *ed )
|
|||||||
memset( &pm, 0, sizeof(pm) );
|
memset( &pm, 0, sizeof(pm) );
|
||||||
|
|
||||||
if( player->progs.sv->movetype == MOVETYPE_NOCLIP )
|
if( player->progs.sv->movetype == MOVETYPE_NOCLIP )
|
||||||
client->ps.pm_type = PM_SPECTATOR;
|
player->priv.sv->s.pm_type = PM_SPECTATOR;
|
||||||
else client->ps.pm_type = PM_NORMAL;
|
else player->priv.sv->s.pm_type = PM_NORMAL;
|
||||||
client->ps.gravity = sv_gravity->value;
|
player->priv.sv->s.gravity = sv_gravity->value;
|
||||||
|
|
||||||
if( player->progs.sv->teleport_time )
|
if( player->progs.sv->teleport_time )
|
||||||
client->ps.pm_flags |= PMF_TIME_TELEPORT;
|
player->priv.sv->s.pm_flags |= PMF_TIME_TELEPORT;
|
||||||
else client->ps.pm_flags &= ~PMF_TIME_TELEPORT;
|
else player->priv.sv->s.pm_flags &= ~PMF_TIME_TELEPORT;
|
||||||
|
|
||||||
pm.ps = client->ps;
|
pm.ps = player->priv.sv->s;
|
||||||
pm.cmd = client->lastcmd;
|
pm.cmd = client->lastcmd;
|
||||||
pm.body = ed->physbody; // member body ptr
|
pm.body = ed->physbody; // member body ptr
|
||||||
|
|
||||||
@ -464,13 +464,13 @@ void SV_PlayerMove( sv_edict_t *ed )
|
|||||||
pe->PlayerMove( &pm, false ); // server move
|
pe->PlayerMove( &pm, false ); // server move
|
||||||
|
|
||||||
// save results of pmove
|
// save results of pmove
|
||||||
client->ps = pm.ps;
|
player->priv.sv->s = pm.ps;
|
||||||
|
|
||||||
VectorCopy(pm.ps.origin, player->progs.sv->origin);
|
VectorCopy(pm.ps.origin, player->progs.sv->origin);
|
||||||
VectorCopy(pm.ps.velocity, player->progs.sv->velocity);
|
VectorCopy(pm.ps.velocity, player->progs.sv->velocity);
|
||||||
VectorCopy(pm.mins, player->progs.sv->mins);
|
VectorCopy(pm.mins, player->progs.sv->mins);
|
||||||
VectorCopy(pm.maxs, player->progs.sv->maxs);
|
VectorCopy(pm.maxs, player->progs.sv->maxs);
|
||||||
VectorCopy(pm.ps.viewangles, client->ps.viewangles);
|
VectorCopy(pm.ps.viewangles, player->priv.sv->s.viewangles );
|
||||||
}
|
}
|
||||||
|
|
||||||
void SV_PlaySound( sv_edict_t *ed, float volume, const char *sample )
|
void SV_PlaySound( sv_edict_t *ed, float volume, const char *sample )
|
||||||
|
@ -115,7 +115,7 @@ trace_t SV_Trace( const vec3_t start, const vec3_t mins, const vec3_t maxs, cons
|
|||||||
traceowner = passedict ? PRVM_PROG_TO_EDICT(passedict->progs.sv->owner) : 0;
|
traceowner = passedict ? PRVM_PROG_TO_EDICT(passedict->progs.sv->owner) : 0;
|
||||||
|
|
||||||
// clip to entities
|
// clip to entities
|
||||||
// because this uses World_EntitiestoBox, we know all entity boxes overlap
|
// because this uses SV_AreaEdicts, we know all entity boxes overlap
|
||||||
// the clip region, so we can skip culling checks in the loop below
|
// the clip region, so we can skip culling checks in the loop below
|
||||||
numtouchedicts = SV_AreaEdicts( clipboxmins, clipboxmaxs, touchedicts, host.max_edicts );
|
numtouchedicts = SV_AreaEdicts( clipboxmins, clipboxmaxs, touchedicts, host.max_edicts );
|
||||||
if( numtouchedicts > host.max_edicts )
|
if( numtouchedicts > host.max_edicts )
|
||||||
@ -378,6 +378,42 @@ void SV_Impact( edict_t *e1, trace_t *trace )
|
|||||||
PRVM_POP_GLOBALS;
|
PRVM_POP_GLOBALS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
============
|
||||||
|
SV_TouchTriggers
|
||||||
|
|
||||||
|
called by player or monster
|
||||||
|
============
|
||||||
|
*/
|
||||||
|
void SV_TouchTriggers( edict_t *ent )
|
||||||
|
{
|
||||||
|
int i, num;
|
||||||
|
edict_t *touch[MAX_EDICTS];
|
||||||
|
|
||||||
|
// dead things don't activate triggers!
|
||||||
|
if(!((int)ent->progs.sv->flags & FL_CLIENT) && (ent->progs.sv->health <= 0))
|
||||||
|
return;
|
||||||
|
|
||||||
|
num = SV_AreaEdicts( ent->progs.sv->absmin, ent->progs.sv->absmax, touch, host.max_edicts );
|
||||||
|
|
||||||
|
PRVM_PUSH_GLOBALS;
|
||||||
|
|
||||||
|
// be careful, it is possible to have an entity in this
|
||||||
|
// list removed before we get to it (killtriggered)
|
||||||
|
for( i = 0; i < num; i++ )
|
||||||
|
{
|
||||||
|
if( touch[i]->priv.sv->free ) continue;
|
||||||
|
prog->globals.sv->pev = PRVM_EDICT_TO_PROG(touch[i]);
|
||||||
|
prog->globals.sv->other = PRVM_EDICT_TO_PROG(ent);
|
||||||
|
prog->globals.sv->time = sv.time;
|
||||||
|
if(touch[i]->progs.sv->touch)
|
||||||
|
PRVM_ExecuteProgram( touch[i]->progs.sv->touch, "pev->touch");
|
||||||
|
}
|
||||||
|
|
||||||
|
// restore state
|
||||||
|
PRVM_POP_GLOBALS;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
============
|
||||||
SV_ClampMove
|
SV_ClampMove
|
||||||
@ -386,18 +422,11 @@ clamp the move to 1/8 units, so the position will
|
|||||||
be accurate for client side prediction
|
be accurate for client side prediction
|
||||||
============
|
============
|
||||||
*/
|
*/
|
||||||
void SV_ClampCoord( vec3_t coord )
|
|
||||||
{
|
|
||||||
coord[0] -= SV_COORD_FRAC * floor(coord[0] * CL_COORD_FRAC);
|
|
||||||
coord[1] -= SV_COORD_FRAC * floor(coord[1] * CL_COORD_FRAC);
|
|
||||||
coord[2] -= SV_COORD_FRAC * floor(coord[2] * CL_COORD_FRAC);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SV_ClampAngle( vec3_t angle )
|
void SV_ClampAngle( vec3_t angle )
|
||||||
{
|
{
|
||||||
angle[0] -= SV_ANGLE_FRAC * floor(angle[0] * CL_ANGLE_FRAC);
|
angle[0] -= 360.0 * floor(angle[0] * (1.0 / 360.0));
|
||||||
angle[1] -= SV_ANGLE_FRAC * floor(angle[1] * CL_ANGLE_FRAC);
|
angle[1] -= 360.0 * floor(angle[1] * (1.0 / 360.0));
|
||||||
angle[2] -= SV_ANGLE_FRAC * floor(angle[2] * CL_ANGLE_FRAC);
|
angle[2] -= 360.0 * floor(angle[2] * (1.0 / 360.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -478,7 +507,7 @@ int SV_FlyMove( edict_t *ent, float time, float *stepnormal, int contentsmask )
|
|||||||
{
|
{
|
||||||
// floor
|
// floor
|
||||||
blocked |= 1;
|
blocked |= 1;
|
||||||
ent->progs.sv->aiflags = (int)ent->progs.sv->flags | AI_ONGROUND;
|
ent->progs.sv->aiflags = (int)ent->progs.sv->aiflags | AI_ONGROUND;
|
||||||
ent->progs.sv->groundentity = PRVM_EDICT_TO_PROG(trace.ent);
|
ent->progs.sv->groundentity = PRVM_EDICT_TO_PROG(trace.ent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -568,6 +597,7 @@ int SV_FlyMove( edict_t *ent, float time, float *stepnormal, int contentsmask )
|
|||||||
// this came from QW and allows you to get out of water more easily
|
// this came from QW and allows you to get out of water more easily
|
||||||
if(((int)ent->progs.sv->aiflags & AI_WATERJUMP))
|
if(((int)ent->progs.sv->aiflags & AI_WATERJUMP))
|
||||||
VectorCopy( primal_velocity, ent->progs.sv->velocity );
|
VectorCopy( primal_velocity, ent->progs.sv->velocity );
|
||||||
|
|
||||||
return blocked;
|
return blocked;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -579,7 +609,9 @@ SV_AddGravity
|
|||||||
*/
|
*/
|
||||||
void SV_AddGravity( edict_t *ent )
|
void SV_AddGravity( edict_t *ent )
|
||||||
{
|
{
|
||||||
ent->progs.sv->velocity[2] -= ent->progs.sv->gravity * sv_gravity->value * sv.frametime;
|
if( ent->progs.sv->gravity )
|
||||||
|
ent->progs.sv->velocity[2] -= ent->progs.sv->gravity * sv.frametime;
|
||||||
|
else ent->progs.sv->velocity[2] -= sv_gravity->value * sv.frametime;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -950,7 +982,7 @@ void SV_CheckStuck( edict_t *ent )
|
|||||||
{
|
{
|
||||||
if(!SV_TestEntityPosition( ent, unstickoffsets + i))
|
if(!SV_TestEntityPosition( ent, unstickoffsets + i))
|
||||||
{
|
{
|
||||||
MsgDev( D_INFO, "Unstuck player with offset %g %g %g.\n", unstickoffsets[i+0], unstickoffsets[i+1], unstickoffsets[i+2]);
|
MsgDev( D_NOTE, "Unstuck player with offset %g %g %g.\n", unstickoffsets[i+0], unstickoffsets[i+1], unstickoffsets[i+2]);
|
||||||
SV_LinkEdict( ent );
|
SV_LinkEdict( ent );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -959,11 +991,11 @@ void SV_CheckStuck( edict_t *ent )
|
|||||||
VectorSubtract( ent->progs.sv->old_origin, ent->progs.sv->origin, offset );
|
VectorSubtract( ent->progs.sv->old_origin, ent->progs.sv->origin, offset );
|
||||||
if(!SV_TestEntityPosition( ent, offset ))
|
if(!SV_TestEntityPosition( ent, offset ))
|
||||||
{
|
{
|
||||||
MsgDev( D_INFO, "Unstuck player by restoring oldorigin.\n" );
|
MsgDev( D_NOTE, "Unstuck player by restoring oldorigin.\n" );
|
||||||
SV_LinkEdict( ent );
|
SV_LinkEdict( ent );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
MsgDev( D_INFO, "Stuck player\n" );
|
MsgDev( D_NOTE, "Stuck player\n" );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SV_UnstickEntity( edict_t *ent )
|
bool SV_UnstickEntity( edict_t *ent )
|
||||||
@ -1053,7 +1085,7 @@ Only used by players
|
|||||||
*/
|
*/
|
||||||
void SV_WalkMove( edict_t *ent )
|
void SV_WalkMove( edict_t *ent )
|
||||||
{
|
{
|
||||||
int clip, oldonground, originalmove_clip, originalmove_flags;
|
int clip, oldonground, originalmove_clip, originalmove_aiflags;
|
||||||
int originalmove_groundentity, contentsmask;
|
int originalmove_groundentity, contentsmask;
|
||||||
vec3_t upmove, downmove, start_origin, start_velocity, stepnormal;
|
vec3_t upmove, downmove, start_origin, start_velocity, stepnormal;
|
||||||
vec3_t originalmove_origin, originalmove_velocity;
|
vec3_t originalmove_origin, originalmove_velocity;
|
||||||
@ -1063,15 +1095,13 @@ void SV_WalkMove( edict_t *ent )
|
|||||||
if( sv.frametime <= 0 ) return;
|
if( sv.frametime <= 0 ) return;
|
||||||
|
|
||||||
contentsmask = SV_ContentsMask( ent );
|
contentsmask = SV_ContentsMask( ent );
|
||||||
|
SV_CheckVelocity( ent );
|
||||||
SV_CheckVelocity( ent );
|
|
||||||
|
|
||||||
// do a regular slide move unless it looks like you ran into a step
|
// do a regular slide move unless it looks like you ran into a step
|
||||||
oldonground = (int)ent->progs.sv->aiflags & AI_ONGROUND;
|
oldonground = (int)ent->progs.sv->aiflags & AI_ONGROUND;
|
||||||
|
|
||||||
VectorCopy( ent->progs.sv->origin, start_origin );
|
VectorCopy( ent->progs.sv->origin, start_origin );
|
||||||
VectorCopy( ent->progs.sv->velocity, start_velocity );
|
VectorCopy( ent->progs.sv->velocity, start_velocity );
|
||||||
|
|
||||||
clip = SV_FlyMove( ent, sv.frametime, NULL, contentsmask );
|
clip = SV_FlyMove( ent, sv.frametime, NULL, contentsmask );
|
||||||
|
|
||||||
// if the move did not hit the ground at any point, we're not on ground
|
// if the move did not hit the ground at any point, we're not on ground
|
||||||
@ -1082,7 +1112,7 @@ void SV_WalkMove( edict_t *ent )
|
|||||||
VectorCopy( ent->progs.sv->origin, originalmove_origin );
|
VectorCopy( ent->progs.sv->origin, originalmove_origin );
|
||||||
VectorCopy( ent->progs.sv->velocity, originalmove_velocity );
|
VectorCopy( ent->progs.sv->velocity, originalmove_velocity );
|
||||||
originalmove_clip = clip;
|
originalmove_clip = clip;
|
||||||
originalmove_flags = (int)ent->progs.sv->flags;
|
originalmove_aiflags = (int)ent->progs.sv->aiflags;
|
||||||
originalmove_groundentity = ent->progs.sv->groundentity;
|
originalmove_groundentity = ent->progs.sv->groundentity;
|
||||||
|
|
||||||
if((int)ent->progs.sv->aiflags & AI_WATERJUMP)
|
if((int)ent->progs.sv->aiflags & AI_WATERJUMP)
|
||||||
@ -1131,7 +1161,7 @@ void SV_WalkMove( edict_t *ent )
|
|||||||
// stepping up didn't make any progress, revert to original move
|
// stepping up didn't make any progress, revert to original move
|
||||||
VectorCopy( originalmove_origin, ent->progs.sv->origin );
|
VectorCopy( originalmove_origin, ent->progs.sv->origin );
|
||||||
VectorCopy( originalmove_velocity, ent->progs.sv->velocity );
|
VectorCopy( originalmove_velocity, ent->progs.sv->velocity );
|
||||||
ent->progs.sv->flags = originalmove_flags;
|
ent->progs.sv->aiflags = originalmove_aiflags;
|
||||||
ent->progs.sv->groundentity = originalmove_groundentity;
|
ent->progs.sv->groundentity = originalmove_groundentity;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1157,7 +1187,7 @@ void SV_WalkMove( edict_t *ent )
|
|||||||
//if (ent->progs.sv->solid == SOLID_BSP)
|
//if (ent->progs.sv->solid == SOLID_BSP)
|
||||||
{
|
{
|
||||||
//Con_Printf("onground\n");
|
//Con_Printf("onground\n");
|
||||||
ent->progs.sv->flags = (int)ent->progs.sv->flags | FL_ONGROUND;
|
ent->progs.sv->aiflags = (int)ent->progs.sv->aiflags | AI_ONGROUND;
|
||||||
ent->progs.sv->groundentity = PRVM_EDICT_TO_PROG(downtrace.ent);
|
ent->progs.sv->groundentity = PRVM_EDICT_TO_PROG(downtrace.ent);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1169,7 +1199,7 @@ void SV_WalkMove( edict_t *ent )
|
|||||||
// cause the player to hop up higher on a slope too steep to climb
|
// cause the player to hop up higher on a slope too steep to climb
|
||||||
VectorCopy( originalmove_origin, ent->progs.sv->origin );
|
VectorCopy( originalmove_origin, ent->progs.sv->origin );
|
||||||
VectorCopy( originalmove_velocity, ent->progs.sv->velocity );
|
VectorCopy( originalmove_velocity, ent->progs.sv->velocity );
|
||||||
ent->progs.sv->flags = originalmove_flags;
|
ent->progs.sv->aiflags = originalmove_aiflags;
|
||||||
ent->progs.sv->groundentity = originalmove_groundentity;
|
ent->progs.sv->groundentity = originalmove_groundentity;
|
||||||
}
|
}
|
||||||
SV_CheckVelocity( ent );
|
SV_CheckVelocity( ent );
|
||||||
@ -1337,7 +1367,7 @@ void SV_Physics_Toss( edict_t *ent )
|
|||||||
VectorClear( ent->progs.sv->velocity );
|
VectorClear( ent->progs.sv->velocity );
|
||||||
VectorClear( ent->progs.sv->avelocity );
|
VectorClear( ent->progs.sv->avelocity );
|
||||||
}
|
}
|
||||||
else ent->progs.sv->flags = (int)ent->progs.sv->aiflags & ~AI_ONGROUND;
|
else ent->progs.sv->aiflags = (int)ent->progs.sv->aiflags & ~AI_ONGROUND;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1449,7 +1479,7 @@ void SV_Physics_Conveyor( edict_t *ent )
|
|||||||
VectorScale( ent->progs.sv->movedir, ent->progs.sv->speed, v );
|
VectorScale( ent->progs.sv->movedir, ent->progs.sv->speed, v );
|
||||||
VectorScale( v, 0.1f, move );
|
VectorScale( v, 0.1f, move );
|
||||||
|
|
||||||
for( i = 0; i < maxclients->integer; i++ )
|
for( i = 0; i < Host_MaxClients(); i++ )
|
||||||
{
|
{
|
||||||
player = PRVM_EDICT_NUM(i) + 1;
|
player = PRVM_EDICT_NUM(i) + 1;
|
||||||
if( player->priv.sv->free ) continue;
|
if( player->priv.sv->free ) continue;
|
||||||
@ -1498,7 +1528,7 @@ void SV_Physics_Noclip( edict_t *ent )
|
|||||||
VectorMA( ent->progs.sv->angles, sv.frametime, ent->progs.sv->avelocity, ent->progs.sv->angles );
|
VectorMA( ent->progs.sv->angles, sv.frametime, ent->progs.sv->avelocity, ent->progs.sv->angles );
|
||||||
VectorMA( ent->progs.sv->origin, sv.frametime, ent->progs.sv->velocity, ent->progs.sv->origin );
|
VectorMA( ent->progs.sv->origin, sv.frametime, ent->progs.sv->velocity, ent->progs.sv->origin );
|
||||||
}
|
}
|
||||||
SV_LinkEdict(ent);
|
SV_LinkEdict( ent );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1644,6 +1674,9 @@ void SV_Physics_ClientEntity( edict_t *ent )
|
|||||||
SV_LinkEdict( ent );
|
SV_LinkEdict( ent );
|
||||||
SV_CheckVelocity( ent );
|
SV_CheckVelocity( ent );
|
||||||
|
|
||||||
|
if( ent->progs.sv->movetype != MOVETYPE_NOCLIP )
|
||||||
|
SV_TouchTriggers( ent );
|
||||||
|
|
||||||
// call standard player post-think
|
// call standard player post-think
|
||||||
prog->globals.sv->time = sv.time;
|
prog->globals.sv->time = sv.time;
|
||||||
prog->globals.sv->pev = PRVM_EDICT_TO_PROG(ent);
|
prog->globals.sv->pev = PRVM_EDICT_TO_PROG(ent);
|
||||||
@ -1688,6 +1721,9 @@ void SV_Physics_ClientMove( sv_client_t *client, usercmd_t *cmd )
|
|||||||
SV_LinkEdict( ent );
|
SV_LinkEdict( ent );
|
||||||
SV_CheckVelocity( ent );
|
SV_CheckVelocity( ent );
|
||||||
|
|
||||||
|
if( ent->progs.sv->movetype != MOVETYPE_NOCLIP )
|
||||||
|
SV_TouchTriggers( ent );
|
||||||
|
|
||||||
// call standard player post-think, with frametime = 0
|
// call standard player post-think, with frametime = 0
|
||||||
prog->globals.sv->time = sv.time;
|
prog->globals.sv->time = sv.time;
|
||||||
prog->globals.sv->frametime = 0;
|
prog->globals.sv->frametime = 0;
|
||||||
@ -1730,18 +1766,10 @@ void SV_Physics( void )
|
|||||||
if( ent->priv.sv->free ) continue;
|
if( ent->priv.sv->free ) continue;
|
||||||
|
|
||||||
VectorCopy( ent->progs.sv->origin, ent->progs.sv->old_origin );
|
VectorCopy( ent->progs.sv->origin, ent->progs.sv->old_origin );
|
||||||
if(i <= maxclients->value) SV_Physics_ClientEntity( ent );
|
if(i <= Host_MaxClients());// SV_Physics_ClientEntity( ent );
|
||||||
else if(!sv_playersonly->integer)SV_Physics_Entity( ent );
|
else if(!sv_playersonly->integer)SV_Physics_Entity( ent );
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: calc frametime
|
|
||||||
for( i = 0; i < 6; i++ )
|
|
||||||
{
|
|
||||||
if( sv_playersonly->integer )
|
|
||||||
continue;
|
|
||||||
pe->Frame( sv.frametime * i );
|
|
||||||
}
|
|
||||||
|
|
||||||
prog->globals.sv->pev = PRVM_EDICT_TO_PROG(prog->edicts);
|
prog->globals.sv->pev = PRVM_EDICT_TO_PROG(prog->edicts);
|
||||||
prog->globals.sv->other = PRVM_EDICT_TO_PROG(prog->edicts);
|
prog->globals.sv->other = PRVM_EDICT_TO_PROG(prog->edicts);
|
||||||
prog->globals.sv->time = sv.time;
|
prog->globals.sv->time = sv.time;
|
||||||
|
@ -13,78 +13,72 @@ byte *sav_base;
|
|||||||
============
|
============
|
||||||
SV_CalcBBox
|
SV_CalcBBox
|
||||||
|
|
||||||
Returns the actual bounding box of a bmodel. This is a big improvement over
|
FIXME: get to work
|
||||||
what q2 normally does with rotating bmodels - q2 sets absmin, absmax to a cube
|
|
||||||
that will completely contain the bmodel at *any* rotation on *any* axis, whether
|
|
||||||
the bmodel can actually rotate to that angle or not. This leads to a lot of
|
|
||||||
false block tests in SV_Push if another bmodel is in the vicinity.
|
|
||||||
============
|
============
|
||||||
*/
|
*/
|
||||||
void SV_CalcBBox(edict_t *ent, vec3_t mins, vec3_t maxs)
|
void SV_CalcBBox( edict_t *ent, vec3_t mins, vec3_t maxs )
|
||||||
{
|
{
|
||||||
vec3_t forward, left, up, f1, l1, u1;
|
vec3_t rmin, rmax;
|
||||||
vec3_t p[8];
|
int i, j, k, l;
|
||||||
int i, j, k, j2, k4;
|
float a, *angles;
|
||||||
|
vec3_t bounds[2];
|
||||||
|
float xvector[2], yvector[2];
|
||||||
|
vec3_t base, transformed;
|
||||||
|
|
||||||
for(k = 0; k < 2; k++)
|
// find min / max for rotations
|
||||||
|
angles = ent->progs.sv->angles;
|
||||||
|
|
||||||
|
a = angles[1]/180 * M_PI;
|
||||||
|
|
||||||
|
xvector[0] = cos(a);
|
||||||
|
xvector[1] = sin(a);
|
||||||
|
yvector[0] = -sin(a);
|
||||||
|
yvector[1] = cos(a);
|
||||||
|
|
||||||
|
VectorCopy( mins, bounds[0] );
|
||||||
|
VectorCopy( maxs, bounds[1] );
|
||||||
|
|
||||||
|
rmin[0] = rmin[1] = rmin[2] = 9999;
|
||||||
|
rmax[0] = rmax[1] = rmax[2] = -9999;
|
||||||
|
|
||||||
|
for( i = 0; i <= 1; i++ )
|
||||||
{
|
{
|
||||||
k4 = k * 4;
|
base[0] = bounds[i][0];
|
||||||
if(k) p[k4][2] = maxs[2];
|
for( j = 0; j <= 1; j++ )
|
||||||
else p[k4][2] = mins[2];
|
|
||||||
|
|
||||||
p[k4 + 1][2] = p[k4][2];
|
|
||||||
p[k4 + 2][2] = p[k4][2];
|
|
||||||
p[k4 + 3][2] = p[k4][2];
|
|
||||||
|
|
||||||
for(j = 0; j < 2; j++)
|
|
||||||
{
|
{
|
||||||
j2 = j * 2;
|
base[1] = bounds[j][1];
|
||||||
if(j) p[j2+k4][1] = maxs[1];
|
for( k = 0; k <= 1; k++ )
|
||||||
else p[j2+k4][1] = mins[1];
|
|
||||||
p[j2 + k4 + 1][1] = p[j2 + k4][1];
|
|
||||||
|
|
||||||
for(i = 0; i < 2; i++)
|
|
||||||
{
|
{
|
||||||
if(i) p[i + j2 + k4][0] = maxs[0];
|
base[2] = bounds[k][2];
|
||||||
else p[i + j2 + k4][0] = mins[0];
|
|
||||||
|
// transform the point
|
||||||
|
transformed[0] = xvector[0] * base[0] + yvector[0] * base[1];
|
||||||
|
transformed[1] = xvector[1] * base[0] + yvector[1] * base[1];
|
||||||
|
transformed[2] = base[2];
|
||||||
|
|
||||||
|
for( l = 0; l < 3; l++ )
|
||||||
|
{
|
||||||
|
if( transformed[l] < rmin[l] ) rmin[l] = transformed[l];
|
||||||
|
if( transformed[l] > rmax[l] ) rmax[l] = transformed[l];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AngleVectors(ent->progs.sv->angles, forward, left, up);
|
VectorCopy( rmin, ent->progs.sv->mins );
|
||||||
|
VectorCopy( rmax, ent->progs.sv->maxs );
|
||||||
for(i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
VectorScale(forward, p[i][0], f1);
|
|
||||||
VectorScale(left, -p[i][1], l1);
|
|
||||||
VectorScale(up, p[i][2], u1);
|
|
||||||
VectorAdd(ent->progs.sv->origin, f1, p[i]);
|
|
||||||
VectorAdd(p[i], l1, p[i]);
|
|
||||||
VectorAdd(p[i], u1, p[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
VectorCopy(p[0], ent->progs.sv->mins);
|
|
||||||
VectorCopy(p[0], ent->progs.sv->maxs);
|
|
||||||
|
|
||||||
for(i = 1; i < 8; i++)
|
|
||||||
{
|
|
||||||
ent->progs.sv->mins[0] = min(ent->progs.sv->mins[0], p[i][0]);
|
|
||||||
ent->progs.sv->mins[1] = min(ent->progs.sv->mins[1], p[i][1]);
|
|
||||||
ent->progs.sv->mins[2] = min(ent->progs.sv->mins[2], p[i][2]);
|
|
||||||
ent->progs.sv->maxs[0] = max(ent->progs.sv->maxs[0], p[i][0]);
|
|
||||||
ent->progs.sv->maxs[1] = max(ent->progs.sv->maxs[1], p[i][1]);
|
|
||||||
ent->progs.sv->maxs[2] = max(ent->progs.sv->maxs[2], p[i][2]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SV_SetMinMaxSize (edict_t *e, float *min, float *max, bool rotate)
|
void SV_SetMinMaxSize( edict_t *e, float *min, float *max, bool rotate )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 3; i++)
|
for( i = 0; i < 3; i++ )
|
||||||
if( min[i] > max[i] )
|
if( min[i] > max[i] )
|
||||||
PRVM_ERROR("SV_SetMinMaxSize: backwards mins/maxs");
|
PRVM_ERROR("SV_SetMinMaxSize: backwards mins/maxs");
|
||||||
|
|
||||||
|
rotate = false; // FIXME
|
||||||
|
|
||||||
// set derived values
|
// set derived values
|
||||||
if( rotate && e->progs.sv->solid == SOLID_BBOX )
|
if( rotate && e->progs.sv->solid == SOLID_BBOX )
|
||||||
{
|
{
|
||||||
@ -95,7 +89,7 @@ void SV_SetMinMaxSize (edict_t *e, float *min, float *max, bool rotate)
|
|||||||
VectorCopy( min, e->progs.sv->mins);
|
VectorCopy( min, e->progs.sv->mins);
|
||||||
VectorCopy( max, e->progs.sv->maxs);
|
VectorCopy( max, e->progs.sv->maxs);
|
||||||
}
|
}
|
||||||
VectorSubtract (max, min, e->progs.sv->size );
|
VectorSubtract( max, min, e->progs.sv->size );
|
||||||
|
|
||||||
// TODO: fill also mass and density
|
// TODO: fill also mass and density
|
||||||
SV_LinkEdict (e);
|
SV_LinkEdict (e);
|
||||||
@ -371,12 +365,12 @@ void SV_WriteSaveFile( char *name )
|
|||||||
if( sv.state != ss_active )
|
if( sv.state != ss_active )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(Cvar_VariableValue("deathmatch"))
|
if(Cvar_VariableValue("deathmatch") || Cvar_VariableValue("coop"))
|
||||||
{
|
{
|
||||||
MsgDev(D_ERROR, "SV_WriteSaveFile: can't savegame in a deathmatch\n");
|
MsgDev(D_ERROR, "SV_WriteSaveFile: can't savegame in a multiplayer\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if( maxclients->integer == 1 && svs.clients[0].edict->progs.sv->health <= 0 )
|
if(Host_MaxClients() == 1 && svs.clients[0].edict->progs.sv->health <= 0 )
|
||||||
{
|
{
|
||||||
MsgDev(D_ERROR, "SV_WriteSaveFile: can't savegame while dead!\n");
|
MsgDev(D_ERROR, "SV_WriteSaveFile: can't savegame while dead!\n");
|
||||||
return;
|
return;
|
||||||
@ -1809,7 +1803,7 @@ void PF_clientcmd( void )
|
|||||||
VM_ValidateString(PRVM_G_STRING(OFS_PARM1));
|
VM_ValidateString(PRVM_G_STRING(OFS_PARM1));
|
||||||
|
|
||||||
i = (int)PRVM_G_FLOAT(OFS_PARM0);
|
i = (int)PRVM_G_FLOAT(OFS_PARM0);
|
||||||
if( sv.state != ss_active || i < 0 || i >= maxclients->integer || svs.clients[i].state != cs_spawned)
|
if( sv.state != ss_active || i < 0 || i >= Host_MaxClients() || svs.clients[i].state != cs_spawned)
|
||||||
{
|
{
|
||||||
VM_Warning( "ClientCommand: client/server is not active!\n" );
|
VM_Warning( "ClientCommand: client/server is not active!\n" );
|
||||||
return;
|
return;
|
||||||
@ -1977,7 +1971,7 @@ void PF_ClientPrint( void )
|
|||||||
|
|
||||||
num = PRVM_G_EDICTNUM( OFS_PARM1 );
|
num = PRVM_G_EDICTNUM( OFS_PARM1 );
|
||||||
type = (int)PRVM_G_FLOAT( OFS_PARM0 );
|
type = (int)PRVM_G_FLOAT( OFS_PARM0 );
|
||||||
if( num < 1 || num > maxclients->value || svs.clients[num - 1].state != cs_spawned )
|
if( num < 1 || num > Host_MaxClients() || svs.clients[num - 1].state != cs_spawned )
|
||||||
{
|
{
|
||||||
VM_Warning("ClientPrint: tired print to a non-client!\n");
|
VM_Warning("ClientPrint: tired print to a non-client!\n");
|
||||||
return;
|
return;
|
||||||
@ -2051,7 +2045,7 @@ void PF_InfoPrint( void )
|
|||||||
|
|
||||||
if(!VM_ValidateArgs( "Info_Print", 1 )) return;
|
if(!VM_ValidateArgs( "Info_Print", 1 )) return;
|
||||||
num = PRVM_G_EDICTNUM(OFS_PARM0);
|
num = PRVM_G_EDICTNUM(OFS_PARM0);
|
||||||
if( num < 1 || num > maxclients->integer )
|
if( num < 1 || num > Host_MaxClients())
|
||||||
{
|
{
|
||||||
VM_Warning( "Info_Print: not a client\n" );
|
VM_Warning( "Info_Print: not a client\n" );
|
||||||
return;
|
return;
|
||||||
@ -2077,7 +2071,7 @@ void PF_InfoValueForKey( void )
|
|||||||
VM_ValidateString(PRVM_G_STRING(OFS_PARM1));
|
VM_ValidateString(PRVM_G_STRING(OFS_PARM1));
|
||||||
|
|
||||||
num = PRVM_G_EDICTNUM(OFS_PARM0);
|
num = PRVM_G_EDICTNUM(OFS_PARM0);
|
||||||
if( num < 1 || num > maxclients->integer )
|
if( num < 1 || num > Host_MaxClients())
|
||||||
{
|
{
|
||||||
VM_Warning("Info_ValueForKey: not a client\n" );
|
VM_Warning("Info_ValueForKey: not a client\n" );
|
||||||
return;
|
return;
|
||||||
@ -2105,7 +2099,7 @@ void PF_InfoRemoveKey( void )
|
|||||||
VM_ValidateString(PRVM_G_STRING(OFS_PARM1));
|
VM_ValidateString(PRVM_G_STRING(OFS_PARM1));
|
||||||
|
|
||||||
num = PRVM_G_EDICTNUM(OFS_PARM0);
|
num = PRVM_G_EDICTNUM(OFS_PARM0);
|
||||||
if( num < 1 || num > maxclients->integer )
|
if( num < 1 || num > Host_MaxClients())
|
||||||
{
|
{
|
||||||
VM_Warning("Info_RemoveKey: not a client\n" );
|
VM_Warning("Info_RemoveKey: not a client\n" );
|
||||||
return;
|
return;
|
||||||
@ -2134,7 +2128,7 @@ void PF_InfoSetValueForKey( void )
|
|||||||
VM_ValidateString(PRVM_G_STRING(OFS_PARM2));
|
VM_ValidateString(PRVM_G_STRING(OFS_PARM2));
|
||||||
|
|
||||||
num = PRVM_G_EDICTNUM(OFS_PARM0);
|
num = PRVM_G_EDICTNUM(OFS_PARM0);
|
||||||
if( num < 1 || num > maxclients->integer )
|
if( num < 1 || num > Host_MaxClients())
|
||||||
{
|
{
|
||||||
VM_Warning("InfoSetValueForKey: not a client\n" );
|
VM_Warning("InfoSetValueForKey: not a client\n" );
|
||||||
return;
|
return;
|
||||||
@ -2173,7 +2167,7 @@ void PF_dropclient( void )
|
|||||||
{
|
{
|
||||||
int clientnum = PRVM_G_EDICTNUM(OFS_PARM0) - 1;
|
int clientnum = PRVM_G_EDICTNUM(OFS_PARM0) - 1;
|
||||||
|
|
||||||
if( clientnum < 0 || clientnum >= maxclients->integer )
|
if( clientnum < 0 || clientnum >= Host_MaxClients())
|
||||||
{
|
{
|
||||||
VM_Warning("dropclient: not a client\n");
|
VM_Warning("dropclient: not a client\n");
|
||||||
return;
|
return;
|
||||||
@ -2229,7 +2223,7 @@ VM_ComStrlen, // #30 float strlen( string text )
|
|||||||
VM_TimeStamp, // #31 string Com_TimeStamp( float format )
|
VM_TimeStamp, // #31 string Com_TimeStamp( float format )
|
||||||
VM_LocalCmd, // #32 void LocalCmd( ... )
|
VM_LocalCmd, // #32 void LocalCmd( ... )
|
||||||
VM_SubString, // #33 string substring( string s, float start, float length )
|
VM_SubString, // #33 string substring( string s, float start, float length )
|
||||||
NULL, // #34 -- reserved --
|
VM_AddCommand, // #34 void Add_Command( string s )
|
||||||
NULL, // #35 -- reserved --
|
NULL, // #35 -- reserved --
|
||||||
NULL, // #36 -- reserved --
|
NULL, // #36 -- reserved --
|
||||||
NULL, // #37 -- reserved --
|
NULL, // #37 -- reserved --
|
||||||
@ -2388,14 +2382,14 @@ void SV_SpawnEntities( const char *mapname, const char *entities )
|
|||||||
ent->progs.sv->solid = SOLID_BSP;
|
ent->progs.sv->solid = SOLID_BSP;
|
||||||
ent->progs.sv->movetype = MOVETYPE_PUSH;
|
ent->progs.sv->movetype = MOVETYPE_PUSH;
|
||||||
|
|
||||||
SV_ConfigString (CS_MAXCLIENTS, va("%i", maxclients->integer ));
|
SV_ConfigString (CS_MAXCLIENTS, va("%i", Host_MaxClients()));
|
||||||
prog->globals.sv->mapname = PRVM_SetEngineString( sv.name );
|
prog->globals.sv->mapname = PRVM_SetEngineString( sv.name );
|
||||||
|
|
||||||
// spawn the rest of the entities on the map
|
// spawn the rest of the entities on the map
|
||||||
*prog->time = sv.time;
|
*prog->time = sv.time;
|
||||||
|
|
||||||
// set client fields on player ents
|
// set client fields on player ents
|
||||||
for( i = 0; i < maxclients->value; i++ )
|
for( i = 0; i < Host_MaxClients(); i++ )
|
||||||
{
|
{
|
||||||
// setup all clients
|
// setup all clients
|
||||||
ent = PRVM_EDICT_NUM( i );
|
ent = PRVM_EDICT_NUM( i );
|
||||||
@ -2419,7 +2413,7 @@ void SV_InitServerProgs( void )
|
|||||||
PRVM_Begin;
|
PRVM_Begin;
|
||||||
PRVM_InitProg( PRVM_SERVERPROG );
|
PRVM_InitProg( PRVM_SERVERPROG );
|
||||||
|
|
||||||
prog->reserved_edicts = maxclients->integer;
|
prog->reserved_edicts = Host_MaxClients();
|
||||||
prog->loadintoworld = true;
|
prog->loadintoworld = true;
|
||||||
|
|
||||||
if( !prog->loaded )
|
if( !prog->loaded )
|
||||||
|
@ -1,226 +1,6 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
|
|
||||||
edict_t *pm_passent;
|
|
||||||
|
|
||||||
// pmove doesn't need to know about passent and contentmask
|
|
||||||
void PM_trace( vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, trace_t *tr )
|
|
||||||
{
|
|
||||||
if( pm_passent->progs.sv->health > 0 )
|
|
||||||
*tr = SV_Trace (start, mins, maxs, end, MOVE_NORMAL, pm_passent, MASK_PLAYERSOLID );
|
|
||||||
*tr = SV_Trace (start, mins, maxs, end, MOVE_NORMAL, pm_passent, MASK_DEADSOLID );
|
|
||||||
}
|
|
||||||
|
|
||||||
int PM_pointcontents( vec3_t point )
|
|
||||||
{
|
|
||||||
return SV_PointContents( point );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
============
|
|
||||||
SV_TouchTriggers
|
|
||||||
|
|
||||||
============
|
|
||||||
*/
|
|
||||||
void SV_TouchTriggers (edict_t *ent)
|
|
||||||
{
|
|
||||||
int i, num;
|
|
||||||
edict_t *touch[MAX_EDICTS], *hit;
|
|
||||||
|
|
||||||
// dead things don't activate triggers!
|
|
||||||
if ((ent->priv.sv->client || ((int)ent->progs.sv->flags & FL_MONSTER)) && (ent->progs.sv->health <= 0))
|
|
||||||
return;
|
|
||||||
|
|
||||||
num = SV_AreaEdicts(ent->progs.sv->absmin, ent->progs.sv->absmax, touch, host.max_edicts );
|
|
||||||
|
|
||||||
PRVM_PUSH_GLOBALS;
|
|
||||||
|
|
||||||
// be careful, it is possible to have an entity in this
|
|
||||||
// list removed before we get to it (killtriggered)
|
|
||||||
for (i = 0; i < num; i++)
|
|
||||||
{
|
|
||||||
hit = touch[i];
|
|
||||||
if (hit->priv.sv->free) continue;
|
|
||||||
|
|
||||||
prog->globals.sv->pev = PRVM_EDICT_TO_PROG(hit);
|
|
||||||
prog->globals.sv->other = PRVM_EDICT_TO_PROG(ent);
|
|
||||||
prog->globals.sv->time = sv.time;
|
|
||||||
if( hit->progs.sv->touch )
|
|
||||||
{
|
|
||||||
PRVM_ExecuteProgram (hit->progs.sv->touch, "pev->touch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// restore state
|
|
||||||
PRVM_POP_GLOBALS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static edict_t *current_player;
|
|
||||||
static sv_client_t *current_client;
|
|
||||||
static vec3_t forward, right, up;
|
|
||||||
float xyspeed, bobmove, bobfracsin; // sin(bobfrac*M_PI)
|
|
||||||
int bobcycle; // odd cycles are right foot going forward
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
===============
|
|
||||||
SV_CalcRoll
|
|
||||||
|
|
||||||
===============
|
|
||||||
*/
|
|
||||||
static float SV_CalcRoll (vec3_t angles, vec3_t velocity)
|
|
||||||
{
|
|
||||||
float sign;
|
|
||||||
float side;
|
|
||||||
float value;
|
|
||||||
|
|
||||||
side = DotProduct (velocity, right);
|
|
||||||
sign = side < 0 ? -1 : 1;
|
|
||||||
side = fabs(side);
|
|
||||||
|
|
||||||
value = 2;
|
|
||||||
|
|
||||||
if (side < 200) side = side * value / 200;
|
|
||||||
else side = value;
|
|
||||||
|
|
||||||
return side*sign;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void SV_CalcViewOffset (edict_t *ent)
|
|
||||||
{
|
|
||||||
float *angles;
|
|
||||||
float bob;
|
|
||||||
float delta;
|
|
||||||
vec3_t v;
|
|
||||||
|
|
||||||
// base angles
|
|
||||||
angles = ent->priv.sv->client->ps.punch_angles;
|
|
||||||
|
|
||||||
VectorCopy(ent->progs.sv->punchangle, angles);
|
|
||||||
// add angles based on velocity
|
|
||||||
delta = DotProduct (ent->progs.sv->velocity, forward);
|
|
||||||
angles[PITCH] += delta * 0.002;
|
|
||||||
|
|
||||||
delta = DotProduct (ent->progs.sv->velocity, right);
|
|
||||||
angles[ROLL] += delta * 0.005;
|
|
||||||
|
|
||||||
// add angles based on bob
|
|
||||||
delta = bobfracsin * 0.002 * xyspeed;
|
|
||||||
if (ent->priv.sv->client->ps.pm_flags & PMF_DUCKED)
|
|
||||||
delta *= 6; // crouching
|
|
||||||
angles[PITCH] += delta;
|
|
||||||
delta = bobfracsin * 0.002 * xyspeed;
|
|
||||||
|
|
||||||
if (ent->priv.sv->client->ps.pm_flags & PMF_DUCKED)
|
|
||||||
delta *= 6; // crouching
|
|
||||||
if (bobcycle & 1) delta = -delta;
|
|
||||||
angles[ROLL] += delta;
|
|
||||||
|
|
||||||
VectorCopy( ent->progs.sv->view_ofs, v ); // base origin
|
|
||||||
if( ent->priv.sv->client->ps.pm_flags & PMF_DUCKED )
|
|
||||||
v[2] = -2;
|
|
||||||
|
|
||||||
// add bob height
|
|
||||||
bob = bobfracsin * xyspeed * 0.005;
|
|
||||||
if( bob > 6 ) bob = 6;
|
|
||||||
v[2] += bob;
|
|
||||||
|
|
||||||
v[0] = bound( -14, v[0], 14 );
|
|
||||||
v[1] = bound( -14, v[1], 14 );
|
|
||||||
v[2] = bound( -22, v[2], 48 );
|
|
||||||
VectorCopy( v, ent->priv.sv->client->ps.viewoffset );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClientEndServerFrame (edict_t *ent)
|
|
||||||
{
|
|
||||||
float bobtime = 0;
|
|
||||||
|
|
||||||
current_player = ent;
|
|
||||||
current_client = ent->priv.sv->client;
|
|
||||||
|
|
||||||
//
|
|
||||||
// If the origin or velocity have changed since ClientThink(),
|
|
||||||
// update the pmove values. This will happen when the client
|
|
||||||
// is pushed by a bmodel or kicked by an explosion.
|
|
||||||
//
|
|
||||||
// If it wasn't updated here, the view position would lag a frame
|
|
||||||
// behind the body position when pushed -- "sinking into plats"
|
|
||||||
//
|
|
||||||
VectorScale(ent->progs.sv->origin, SV_COORD_FRAC, current_client->ps.origin );
|
|
||||||
VectorScale(ent->progs.sv->velocity, SV_COORD_FRAC, current_client->ps.velocity );
|
|
||||||
AngleVectors (ent->priv.sv->client->ps.viewangles, forward, right, up);
|
|
||||||
|
|
||||||
//
|
|
||||||
// set model angles from view angles so other things in
|
|
||||||
// the world can tell which direction you are looking
|
|
||||||
//
|
|
||||||
if (ent->priv.sv->client->ps.viewangles[PITCH] > 180)
|
|
||||||
ent->progs.sv->angles[PITCH] = (-360 + ent->priv.sv->client->ps.viewangles[PITCH])/3;
|
|
||||||
else ent->progs.sv->angles[PITCH] = ent->priv.sv->client->ps.viewangles[PITCH]/3;
|
|
||||||
|
|
||||||
ent->progs.sv->angles[YAW] = ent->priv.sv->client->ps.viewangles[YAW];
|
|
||||||
ent->progs.sv->angles[ROLL] = 0;
|
|
||||||
ent->progs.sv->angles[ROLL] = SV_CalcRoll (ent->progs.sv->angles, ent->progs.sv->velocity)*4;
|
|
||||||
|
|
||||||
//
|
|
||||||
// calculate speed and cycle to be used for
|
|
||||||
// all cyclic walking effects
|
|
||||||
//
|
|
||||||
xyspeed = sqrt(ent->progs.sv->velocity[0] * ent->progs.sv->velocity[0] + ent->progs.sv->velocity[1] * ent->progs.sv->velocity[1]);
|
|
||||||
|
|
||||||
if( xyspeed < 5 ) bobmove = 0;
|
|
||||||
else if (ent->progs.sv->groundentity)
|
|
||||||
{
|
|
||||||
// so bobbing only cycles when on ground
|
|
||||||
if (xyspeed > 210) bobmove = 0.25;
|
|
||||||
else if (xyspeed > 100) bobmove = 0.125;
|
|
||||||
else bobmove = 0.0625;
|
|
||||||
}
|
|
||||||
|
|
||||||
bobtime += bobmove;
|
|
||||||
|
|
||||||
if (current_client->ps.pm_flags & PMF_DUCKED)
|
|
||||||
bobtime *= 4;
|
|
||||||
|
|
||||||
bobcycle = (int)bobtime;
|
|
||||||
bobfracsin = fabs(sin(bobtime*M_PI));
|
|
||||||
|
|
||||||
// determine the view offsets
|
|
||||||
SV_CalcViewOffset (ent);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
ClientEndServerFrames
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void ClientEndServerFrames (void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
// calc the player views now that all pushing
|
|
||||||
// and damage has been added
|
|
||||||
for (i = 0; i < maxclients->value; i++)
|
|
||||||
{
|
|
||||||
if(svs.clients[i].state != cs_spawned) continue;
|
|
||||||
ClientEndServerFrame (svs.clients[i].edict);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
================
|
|
||||||
SV_RunFrame
|
|
||||||
|
|
||||||
Advances the world by 0.1 seconds
|
|
||||||
================
|
|
||||||
*/
|
|
||||||
void SV_RunFrame( void )
|
|
||||||
{
|
|
||||||
;
|
|
||||||
//ClientEndServerFrames();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============
|
==============
|
||||||
ClientThink
|
ClientThink
|
||||||
@ -231,83 +11,10 @@ usually be a couple times for each server frame.
|
|||||||
*/
|
*/
|
||||||
void ClientThink (edict_t *ent, usercmd_t *ucmd)
|
void ClientThink (edict_t *ent, usercmd_t *ucmd)
|
||||||
{
|
{
|
||||||
sv_client_t *client;
|
|
||||||
edict_t *other;
|
edict_t *other;
|
||||||
pmove_t pm;
|
|
||||||
vec3_t view;
|
|
||||||
vec3_t oldorigin, oldvelocity;
|
|
||||||
int i, j;
|
int i, j;
|
||||||
|
pmove_t pm;
|
||||||
|
|
||||||
client = ent->priv.sv->client;
|
|
||||||
|
|
||||||
// call standard client pre-think
|
|
||||||
prog->globals.sv->time = sv.time;
|
|
||||||
prog->globals.sv->pev = PRVM_EDICT_TO_PROG(ent);
|
|
||||||
PRVM_ExecuteProgram (prog->globals.sv->PlayerPreThink, "PlayerPreThink");
|
|
||||||
|
|
||||||
VectorCopy(ent->progs.sv->origin, oldorigin);
|
|
||||||
VectorCopy(ent->progs.sv->velocity, oldvelocity);
|
|
||||||
|
|
||||||
ent->priv.sv->client->ps.pm_flags &= ~PMF_NO_PREDICTION;
|
|
||||||
|
|
||||||
VectorCopy(ent->progs.sv->origin, view);
|
|
||||||
|
|
||||||
pm_passent = ent;
|
|
||||||
|
|
||||||
// set up for pmove
|
|
||||||
memset (&pm, 0, sizeof(pm));
|
|
||||||
|
|
||||||
if (ent->progs.sv->movetype == MOVETYPE_NOCLIP) client->ps.pm_type = PM_SPECTATOR;
|
|
||||||
else client->ps.pm_type = PM_NORMAL;
|
|
||||||
client->ps.gravity = sv_gravity->value;
|
|
||||||
|
|
||||||
if(ent->progs.sv->teleport_time)
|
|
||||||
{
|
|
||||||
// next frame will be cleared teleport flag
|
|
||||||
client->ps.pm_flags |= PMF_TIME_TELEPORT;
|
|
||||||
ent->progs.sv->teleport_time = 0;
|
|
||||||
}
|
|
||||||
else client->ps.pm_flags &= ~PMF_TIME_TELEPORT;
|
|
||||||
|
|
||||||
pm.ps = client->ps;
|
|
||||||
memcpy( &client->lastcmd, ucmd, sizeof(usercmd_t));//IMPORTANT!!!
|
|
||||||
|
|
||||||
VectorScale(ent->progs.sv->origin, SV_COORD_FRAC, pm.ps.origin );
|
|
||||||
VectorScale(ent->progs.sv->velocity, SV_COORD_FRAC, pm.ps.velocity );
|
|
||||||
|
|
||||||
pm.cmd = *ucmd;
|
|
||||||
|
|
||||||
pm.trace = PM_trace; // adds default parms
|
|
||||||
pm.pointcontents = PM_pointcontents;
|
|
||||||
|
|
||||||
// perform a pmove
|
|
||||||
pe->PlayerMove( &pm, false );
|
|
||||||
|
|
||||||
// save results of pmove
|
|
||||||
client->ps = pm.ps;
|
|
||||||
|
|
||||||
VectorScale(pm.ps.origin, CL_COORD_FRAC, ent->progs.sv->origin);
|
|
||||||
VectorScale(pm.ps.velocity, CL_COORD_FRAC, ent->progs.sv->velocity);
|
|
||||||
VectorCopy(pm.mins, ent->progs.sv->mins);
|
|
||||||
VectorCopy(pm.maxs, ent->progs.sv->maxs);
|
|
||||||
VectorCopy(pm.ps.viewangles, ent->progs.sv->v_angle);
|
|
||||||
VectorCopy(pm.ps.viewangles, ent->progs.sv->angles);
|
|
||||||
if( pm.groundentity )
|
|
||||||
ent->progs.sv->groundentity = PRVM_EDICT_TO_PROG( pm.groundentity );
|
|
||||||
else ent->progs.sv->groundentity = 0;
|
|
||||||
|
|
||||||
// copy viewmodel info
|
|
||||||
client->ps.vmodel.frame = ent->progs.sv->v_frame;
|
|
||||||
client->ps.vmodel.body = ent->progs.sv->v_body;
|
|
||||||
client->ps.vmodel.skin = ent->progs.sv->v_skin;
|
|
||||||
client->ps.vmodel.sequence = ent->progs.sv->v_sequence;
|
|
||||||
|
|
||||||
SV_LinkEdict(ent);
|
|
||||||
|
|
||||||
if (ent->progs.sv->movetype != MOVETYPE_NOCLIP)
|
|
||||||
SV_TouchTriggers (ent);
|
|
||||||
|
|
||||||
PRVM_PUSH_GLOBALS;
|
|
||||||
for (i = 0; i < pm.numtouch; i++)
|
for (i = 0; i < pm.numtouch; i++)
|
||||||
{
|
{
|
||||||
other = pm.touchents[i];
|
other = pm.touchents[i];
|
||||||
@ -327,12 +34,6 @@ void ClientThink (edict_t *ent, usercmd_t *ucmd)
|
|||||||
PRVM_ExecuteProgram (other->progs.sv->touch, "pev->touch");
|
PRVM_ExecuteProgram (other->progs.sv->touch, "pev->touch");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PRVM_POP_GLOBALS;
|
|
||||||
|
|
||||||
// call standard player post-think
|
|
||||||
prog->globals.sv->time = sv.time;
|
|
||||||
prog->globals.sv->pev = PRVM_EDICT_TO_PROG(ent);
|
|
||||||
PRVM_ExecuteProgram (prog->globals.sv->PlayerPostThink, "PlayerPostThink");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -184,17 +184,17 @@ void SV_LinkEdict( edict_t *ent )
|
|||||||
if (ent->progs.sv->solid == SOLID_BBOX && !((int)ent->progs.sv->flags & FL_DEADMONSTER))
|
if (ent->progs.sv->solid == SOLID_BBOX && !((int)ent->progs.sv->flags & FL_DEADMONSTER))
|
||||||
{
|
{
|
||||||
// assume that x/y are equal and symetric
|
// assume that x/y are equal and symetric
|
||||||
i = ent->progs.sv->maxs[0] / SV_COORD_FRAC;
|
i = ent->progs.sv->maxs[0]/8;
|
||||||
i = bound( 1, i, 255 );
|
i = bound( 1, i, 255 );
|
||||||
|
|
||||||
// z is not symetric
|
// z is not symetric
|
||||||
j = (-ent->progs.sv->mins[2]) / SV_COORD_FRAC;
|
j = (-ent->progs.sv->mins[2])/8;
|
||||||
j = bound( 1, j, 255 );
|
j = bound( 1, j, 255 );
|
||||||
|
|
||||||
// and z maxs can be negative...
|
// and z maxs can be negative...
|
||||||
k = (ent->progs.sv->maxs[2] + 32)/SV_COORD_FRAC;
|
k = (ent->progs.sv->maxs[2] + 32)/8;
|
||||||
k = bound( 1, k, 255 );
|
k = bound( 1, k, 255 );
|
||||||
sv_ent->solid = (k<<16) | (j<<8) | i;
|
sv_ent->solid = (k<<16)|(j<<8)|i;
|
||||||
}
|
}
|
||||||
else if (ent->progs.sv->solid == SOLID_BSP)
|
else if (ent->progs.sv->solid == SOLID_BSP)
|
||||||
{
|
{
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#define PACKFILE_FLAG_DEFLATED (1<<1) // file compressed using the deflate algorithm
|
#define PACKFILE_FLAG_DEFLATED (1<<1) // file compressed using the deflate algorithm
|
||||||
#define FILE_BUFF_SIZE 2048
|
#define FILE_BUFF_SIZE 2048
|
||||||
|
|
||||||
|
// filesystem flags
|
||||||
#define FS_READONLY_PATH 1
|
#define FS_READONLY_PATH 1
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -645,8 +646,6 @@ void FS_FileBase( const char *in, char *out )
|
|||||||
start = 0;
|
start = 0;
|
||||||
else start++;
|
else start++;
|
||||||
|
|
||||||
if(in[start] == '#') start++;
|
|
||||||
|
|
||||||
// Length of new sting
|
// Length of new sting
|
||||||
len = end - start + 1;
|
len = end - start + 1;
|
||||||
|
|
||||||
@ -1491,7 +1490,6 @@ FS_Init
|
|||||||
*/
|
*/
|
||||||
void FS_Init( void )
|
void FS_Init( void )
|
||||||
{
|
{
|
||||||
char szTemp[4096];
|
|
||||||
stringlist_t dirs;
|
stringlist_t dirs;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -1518,8 +1516,7 @@ void FS_Init( void )
|
|||||||
{
|
{
|
||||||
if( Sys.app_name == COMP_BSPLIB )
|
if( Sys.app_name == COMP_BSPLIB )
|
||||||
com_strcpy( gs_basedir, fs_defaultdir->string );
|
com_strcpy( gs_basedir, fs_defaultdir->string );
|
||||||
else if(GetModuleFileName( NULL, szTemp, MAX_SYSPATH ))
|
else if(Sys_GetModuleName( gs_basedir, MAX_SYSPATH ));
|
||||||
FS_FileBase( szTemp, gs_basedir );
|
|
||||||
else com_strcpy( gs_basedir, fs_defaultdir->string ); // default dir
|
else com_strcpy( gs_basedir, fs_defaultdir->string ); // default dir
|
||||||
}
|
}
|
||||||
// checked nasty path: "bin" it's a reserved word
|
// checked nasty path: "bin" it's a reserved word
|
||||||
|
@ -512,7 +512,7 @@ void *_mem_get_array_element( byte *arrayptr, size_t index )
|
|||||||
return (void *)(l->arrays[i].data + j * l->recordsize);
|
return (void *)(l->arrays[i].data + j * l->recordsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _mem_checkheadersentinels(void *data, const char *filename, int fileline)
|
void _mem_checkheadersentinels( void *data, const char *filename, int fileline )
|
||||||
{
|
{
|
||||||
memheader_t *mem;
|
memheader_t *mem;
|
||||||
|
|
||||||
@ -524,7 +524,7 @@ void _mem_checkheadersentinels(void *data, const char *filename, int fileline)
|
|||||||
Sys_Error("Mem_CheckSentinels: trashed header sentinel 2 (block allocated at %s:%i, sentinel check at %s:%i)\n", mem->filename, mem->fileline, filename, fileline);
|
Sys_Error("Mem_CheckSentinels: trashed header sentinel 2 (block allocated at %s:%i, sentinel check at %s:%i)\n", mem->filename, mem->fileline, filename, fileline);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _mem_checkclumpsentinels(memclump_t *clump, const char *filename, int fileline)
|
static void _mem_checkclumpsentinels( memclump_t *clump, const char *filename, int fileline )
|
||||||
{
|
{
|
||||||
// this isn't really very useful
|
// this isn't really very useful
|
||||||
if (clump->sentinel1 != MEMCLUMP_SENTINEL)
|
if (clump->sentinel1 != MEMCLUMP_SENTINEL)
|
||||||
@ -583,13 +583,13 @@ void _mem_printlist( size_t minallocationsize )
|
|||||||
{
|
{
|
||||||
Msg("%5luk (%5luk actual) %s (%+3li byte change)\n", (dword) ((pool->totalsize + 1023) / 1024), (dword)((pool->realsize + 1023) / 1024), pool->name, (long)pool->totalsize - pool->lastchecksize );
|
Msg("%5luk (%5luk actual) %s (%+3li byte change)\n", (dword) ((pool->totalsize + 1023) / 1024), (dword)((pool->realsize + 1023) / 1024), pool->name, (long)pool->totalsize - pool->lastchecksize );
|
||||||
pool->lastchecksize = pool->totalsize;
|
pool->lastchecksize = pool->totalsize;
|
||||||
for (mem = pool->chain; mem; mem = mem->next)
|
for( mem = pool->chain; mem; mem = mem->next )
|
||||||
if (mem->size >= minallocationsize)
|
if( mem->size >= minallocationsize )
|
||||||
Msg("%10lu bytes allocated at %s:%i\n", (dword)mem->size, mem->filename, mem->fileline);
|
Msg("%10lu bytes allocated at %s:%i\n", (dword)mem->size, mem->filename, mem->fileline );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemList_f(void)
|
void MemList_f( void )
|
||||||
{
|
{
|
||||||
switch(Cmd_Argc())
|
switch(Cmd_Argc())
|
||||||
{
|
{
|
||||||
@ -598,7 +598,7 @@ void MemList_f(void)
|
|||||||
_mem_printstats();
|
_mem_printstats();
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
_mem_printlist(atoi(Cmd_Argv(1)) * 1024);
|
_mem_printlist(com.atoi(Cmd_Argv(1)) * 1024);
|
||||||
_mem_printstats();
|
_mem_printstats();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -627,5 +627,5 @@ void Memory_Shutdown( void )
|
|||||||
|
|
||||||
void Memory_Init_Commands( void )
|
void Memory_Init_Commands( void )
|
||||||
{
|
{
|
||||||
Cmd_AddCommand("memlist", MemList_f, "prints memory pool information (or if used as memlist 5 lists individual allocations of 5K or larger, 0 lists all allocations)");
|
Cmd_AddCommand( "memlist", MemList_f, "prints memory pool information (or if used as memlist 5 lists individual allocations of 5K or larger, 0 lists all allocations)");
|
||||||
}
|
}
|
@ -453,6 +453,17 @@ const char* com_timestamp( int format )
|
|||||||
return timestamp;
|
return timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
============
|
||||||
|
strstr
|
||||||
|
|
||||||
|
search case - sensitive for string2 in string
|
||||||
|
============
|
||||||
|
*/
|
||||||
|
char *com_strstr( const char *string, const char *string2 )
|
||||||
|
{
|
||||||
|
return strstr( string, string2 ); //FIXME
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
============
|
============
|
||||||
|
@ -16,6 +16,7 @@ launch_exp_t *Host; // callback to mainframe
|
|||||||
sys_event_t event_que[MAX_QUED_EVENTS];
|
sys_event_t event_que[MAX_QUED_EVENTS];
|
||||||
int event_head, event_tail;
|
int event_head, event_tail;
|
||||||
FILE *logfile;
|
FILE *logfile;
|
||||||
|
FILE *memfile;
|
||||||
|
|
||||||
dll_info_t common_dll = { "common.dll", NULL, "CreateAPI", NULL, NULL, true, sizeof(launch_exp_t) };
|
dll_info_t common_dll = { "common.dll", NULL, "CreateAPI", NULL, NULL, true, sizeof(launch_exp_t) };
|
||||||
dll_info_t engine_dll = { "engine.dll", NULL, "CreateAPI", NULL, NULL, true, sizeof(launch_exp_t) };
|
dll_info_t engine_dll = { "engine.dll", NULL, "CreateAPI", NULL, NULL, true, sizeof(launch_exp_t) };
|
||||||
@ -202,7 +203,7 @@ void Sys_GetStdAPI( void )
|
|||||||
com.strncmp = com_strncmp;
|
com.strncmp = com_strncmp;
|
||||||
com.strcmp = com_strcmp;
|
com.strcmp = com_strcmp;
|
||||||
com.stristr = com_stristr;
|
com.stristr = com_stristr;
|
||||||
com.strstr = com_stristr; // FIXME
|
com.strstr = com_strstr;
|
||||||
com.strpack = com_strpack;
|
com.strpack = com_strpack;
|
||||||
com.strunpack = com_strunpack;
|
com.strunpack = com_strunpack;
|
||||||
com.vsprintf = com_vsprintf;
|
com.vsprintf = com_vsprintf;
|
||||||
@ -219,42 +220,56 @@ void Sys_GetStdAPI( void )
|
|||||||
==================
|
==================
|
||||||
Parse program name to launch and determine work style
|
Parse program name to launch and determine work style
|
||||||
|
|
||||||
NOTE: at this day we have eleven instances
|
NOTE: at this day we have ten instances
|
||||||
|
|
||||||
1. "host_shared" - normal game launch
|
1. "normal" - normal or dedicated game launch
|
||||||
2. "host_dedicated" - dedicated server
|
2. "viewer" - resource editor
|
||||||
3. "host_editor" - resource editor
|
3. "bsplib" - three BSP compilers in one
|
||||||
4. "bsplib" - three BSP compilers in one
|
4. "imglib" - convert old formats (mip, pcx, lmp) to 32-bit tga
|
||||||
5. "imglib" - convert old formats (mip, pcx, lmp) to 32-bit tga
|
5. "qcclib" - quake c complier
|
||||||
6. "qcclib" - quake c complier
|
6. "roqlib" - roq video file maker
|
||||||
7. "roqlib" - roq video file maker
|
7. "sprite" - sprite creator (requires qc. script)
|
||||||
8. "sprite" - sprite creator (requires qc. script)
|
8. "studio" - Half-Life style models creator (requires qc. script)
|
||||||
9. "studio" - Half-Life style models creator (requires qc. script)
|
9. "credits" - display credits of engine developers
|
||||||
10. "credits" - display credits of engine developers
|
10. "host_setup" - write current path into registry (silently)
|
||||||
11. "host_setup" - write current path into registry (silently)
|
|
||||||
|
|
||||||
This list will be expnaded in future
|
This list will be expnaded in future
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
void Sys_LookupInstance( void )
|
void Sys_LookupInstance( void )
|
||||||
{
|
{
|
||||||
|
char szTemp[4096];
|
||||||
|
bool dedicated_mode = false;
|
||||||
|
|
||||||
Sys.app_name = HOST_OFFLINE;
|
Sys.app_name = HOST_OFFLINE;
|
||||||
|
|
||||||
|
if(GetModuleFileName( NULL, szTemp, MAX_SYSPATH ))
|
||||||
|
FS_FileBase( szTemp, Sys.ModuleName );
|
||||||
|
|
||||||
|
// determine host type
|
||||||
|
if( Sys.ModuleName[0] == '#' )
|
||||||
|
{
|
||||||
|
// cutoff '#'
|
||||||
|
com_strncpy( szTemp, Sys.ModuleName + 1, MAX_SYSPATH );
|
||||||
|
com_strncpy( Sys.ModuleName, szTemp, MAX_SYSPATH );
|
||||||
|
dedicated_mode = true;
|
||||||
|
}
|
||||||
|
|
||||||
// lookup all instances
|
// lookup all instances
|
||||||
if(!com_strcmp(Sys.progname, "normal"))
|
if(!com_strcmp(Sys.progname, "normal"))
|
||||||
{
|
{
|
||||||
Sys.app_name = HOST_NORMAL;
|
if( dedicated_mode )
|
||||||
Sys.con_readonly = true;
|
{
|
||||||
// don't show console as default
|
Sys.app_name = HOST_DEDICATED;
|
||||||
if(!Sys.debug) Sys.con_showalways = false;
|
Sys.con_readonly = false;
|
||||||
Sys.linked_dll = &engine_dll; // pointer to engine.dll info
|
}
|
||||||
com_sprintf(Sys.log_path, "engine.log", com_timestamp(TIME_NO_SECONDS)); // logs folder
|
else
|
||||||
com_strcpy(Sys.caption, va("Xash3D ver.%g", XASH_VERSION ));
|
{
|
||||||
}
|
Sys.app_name = HOST_NORMAL;
|
||||||
else if(!com_strcmp(Sys.progname, "dedicated"))
|
Sys.con_readonly = true;
|
||||||
{
|
// don't show console as default
|
||||||
Sys.app_name = HOST_DEDICATED;
|
if(!Sys.debug) Sys.con_showalways = false;
|
||||||
Sys.con_readonly = false;
|
}
|
||||||
Sys.linked_dll = &engine_dll; // pointer to engine.dll info
|
Sys.linked_dll = &engine_dll; // pointer to engine.dll info
|
||||||
com_sprintf(Sys.log_path, "engine.log", com_timestamp(TIME_NO_SECONDS)); // logs folder
|
com_sprintf(Sys.log_path, "engine.log", com_timestamp(TIME_NO_SECONDS)); // logs folder
|
||||||
com_strcpy(Sys.caption, va("Xash3D ver.%g", XASH_VERSION ));
|
com_strcpy(Sys.caption, va("Xash3D ver.%g", XASH_VERSION ));
|
||||||
@ -266,7 +281,7 @@ void Sys_LookupInstance( void )
|
|||||||
//don't show console as default
|
//don't show console as default
|
||||||
if(!Sys.debug) Sys.con_showalways = false;
|
if(!Sys.debug) Sys.con_showalways = false;
|
||||||
Sys.linked_dll = &viewer_dll; // pointer to viewer.dll info
|
Sys.linked_dll = &viewer_dll; // pointer to viewer.dll info
|
||||||
Sys.log_active = Sys.developer = Sys.debug = 0; // clear all dbg states
|
com_sprintf(Sys.log_path, "%s/editor.log", sys_rootdir ); // logs folder
|
||||||
com_strcpy(Sys.caption, va("Xash3D Resource Viewer ver.%g", XASH_VERSION ));
|
com_strcpy(Sys.caption, va("Xash3D Resource Viewer ver.%g", XASH_VERSION ));
|
||||||
}
|
}
|
||||||
else if(!com_strcmp(Sys.progname, "splash"))
|
else if(!com_strcmp(Sys.progname, "splash"))
|
||||||
@ -397,8 +412,8 @@ void Sys_CreateInstance( void )
|
|||||||
// export
|
// export
|
||||||
launch_t CreateHost, CreateBaserc;
|
launch_t CreateHost, CreateBaserc;
|
||||||
|
|
||||||
|
srand(time(NULL)); // init random generator
|
||||||
Sys_LoadLibrary( Sys.linked_dll ); // loading library if need
|
Sys_LoadLibrary( Sys.linked_dll ); // loading library if need
|
||||||
|
|
||||||
// pre initializations
|
// pre initializations
|
||||||
switch( Sys.app_name )
|
switch( Sys.app_name )
|
||||||
@ -542,22 +557,35 @@ void Sys_ParseCommandLine (LPSTR lpCmdLine)
|
|||||||
|
|
||||||
void Sys_InitLog( void )
|
void Sys_InitLog( void )
|
||||||
{
|
{
|
||||||
// create log if needed
|
string path;
|
||||||
if(!Sys.log_active || !com_strlen(Sys.log_path) || Sys.con_silentmode) return;
|
|
||||||
logfile = fopen( Sys.log_path, "w");
|
|
||||||
if(!logfile) Sys_Error("Sys_InitLog: can't create log file %s\n", Sys.log_path );
|
|
||||||
|
|
||||||
fprintf(logfile, "=======================================================================\n" );
|
if( Sys.developer == D_MEMORY )
|
||||||
fprintf(logfile, "\t%s started at %s\n", Sys.caption, com_timestamp(TIME_FULL));
|
{
|
||||||
fprintf(logfile, "=======================================================================\n");
|
com_snprintf( path, MAX_STRING, "%s/memhistory.log", sys_rootdir );
|
||||||
|
memfile = fopen( path, "w" );
|
||||||
|
if(!memfile) Sys_Error("Sys_InitLog: can't create memhistory log file %s\n", path );
|
||||||
|
|
||||||
|
fprintf(memfile, "=======================================================================\n" );
|
||||||
|
fprintf(memfile, "\t%s started at %s\n", Sys.caption, com_timestamp(TIME_FULL));
|
||||||
|
fprintf(memfile, "=======================================================================\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// create log if needed
|
||||||
|
if( Sys.log_active && !Sys.con_silentmode )
|
||||||
|
{
|
||||||
|
logfile = fopen( Sys.log_path, "w");
|
||||||
|
if(!logfile) Sys_Error("Sys_InitLog: can't create log file %s\n", Sys.log_path );
|
||||||
|
|
||||||
|
fprintf(logfile, "=======================================================================\n" );
|
||||||
|
fprintf(logfile, "\t%s started at %s\n", Sys.caption, com_timestamp(TIME_FULL));
|
||||||
|
fprintf(logfile, "=======================================================================\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sys_CloseLog( void )
|
void Sys_CloseLog( void )
|
||||||
{
|
{
|
||||||
string event_name;
|
string event_name;
|
||||||
|
|
||||||
if(!logfile) return;
|
|
||||||
|
|
||||||
switch( Sys.app_state )
|
switch( Sys.app_state )
|
||||||
{
|
{
|
||||||
case SYS_CRASH: com_strncpy( event_name, "crashed", MAX_STRING ); break;
|
case SYS_CRASH: com_strncpy( event_name, "crashed", MAX_STRING ); break;
|
||||||
@ -566,13 +594,26 @@ void Sys_CloseLog( void )
|
|||||||
default: com_strncpy( event_name, "stopped", MAX_STRING ); break;
|
default: com_strncpy( event_name, "stopped", MAX_STRING ); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(logfile, "\n");
|
if( logfile )
|
||||||
fprintf(logfile, "=======================================================================");
|
{
|
||||||
fprintf(logfile, "\n\t%s %s at %s\n", Sys.caption, event_name, com_timestamp(TIME_FULL));
|
fprintf(logfile, "\n");
|
||||||
fprintf(logfile, "=======================================================================");
|
fprintf(logfile, "=======================================================================");
|
||||||
|
fprintf(logfile, "\n\t%s %s at %s\n", Sys.caption, event_name, com_timestamp(TIME_FULL));
|
||||||
|
fprintf(logfile, "=======================================================================");
|
||||||
|
|
||||||
fclose(logfile);
|
fclose( logfile );
|
||||||
logfile = NULL;
|
logfile = NULL;
|
||||||
|
}
|
||||||
|
if( memfile )
|
||||||
|
{
|
||||||
|
fprintf(memfile, "\n");
|
||||||
|
fprintf(memfile, "=======================================================================");
|
||||||
|
fprintf(memfile, "\n\t%s %s at %s\n", Sys.caption, event_name, com_timestamp(TIME_FULL));
|
||||||
|
fprintf(memfile, "=======================================================================");
|
||||||
|
|
||||||
|
fclose( memfile );
|
||||||
|
memfile = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sys_PrintLog( const char *pMsg )
|
void Sys_PrintLog( const char *pMsg )
|
||||||
@ -581,6 +622,12 @@ void Sys_PrintLog( const char *pMsg )
|
|||||||
fprintf(logfile, "%s", pMsg );
|
fprintf(logfile, "%s", pMsg );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Sys_PrintMem( const char *pMsg )
|
||||||
|
{
|
||||||
|
if(!memfile) return;
|
||||||
|
fprintf(memfile, "%s", pMsg );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
Sys_Print
|
Sys_Print
|
||||||
@ -654,7 +701,7 @@ formatted message
|
|||||||
*/
|
*/
|
||||||
void Sys_Msg( const char *pMsg, ... )
|
void Sys_Msg( const char *pMsg, ... )
|
||||||
{
|
{
|
||||||
va_list argptr;
|
va_list argptr;
|
||||||
char text[MAX_MSGLEN];
|
char text[MAX_MSGLEN];
|
||||||
|
|
||||||
va_start (argptr, pMsg);
|
va_start (argptr, pMsg);
|
||||||
@ -671,8 +718,8 @@ void Sys_MsgDev( int level, const char *pMsg, ... )
|
|||||||
|
|
||||||
if(Sys.developer < level) return;
|
if(Sys.developer < level) return;
|
||||||
|
|
||||||
va_start (argptr, pMsg);
|
va_start( argptr, pMsg );
|
||||||
com_vsprintf (text, pMsg, argptr);
|
com_vsprintf( text, pMsg, argptr );
|
||||||
va_end (argptr);
|
va_end (argptr);
|
||||||
|
|
||||||
switch( level )
|
switch( level )
|
||||||
@ -693,7 +740,10 @@ void Sys_MsgDev( int level, const char *pMsg, ... )
|
|||||||
Sys_Print( text );
|
Sys_Print( text );
|
||||||
break;
|
break;
|
||||||
case D_MEMORY:
|
case D_MEMORY:
|
||||||
Sys_Print( text );
|
Sys_PrintMem( text );
|
||||||
|
break;
|
||||||
|
case D_STRING:
|
||||||
|
Sys_Print(va("^6AllocString: ^7%s", text));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1376,6 +1426,15 @@ sys_event_t Sys_GetEvent( void )
|
|||||||
return ev;
|
return ev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Sys_GetModuleName( char *buffer, size_t length )
|
||||||
|
{
|
||||||
|
if(Sys.ModuleName[0] == '\0' )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
com_strncpy( buffer, Sys.ModuleName, length + 1 );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
// REGISTRY COMMON TOOLS
|
// REGISTRY COMMON TOOLS
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
@ -47,6 +47,7 @@ typedef struct system_s
|
|||||||
bool stuffcmdsrun;
|
bool stuffcmdsrun;
|
||||||
byte packet_received[MAX_MSGLEN]; // network data
|
byte packet_received[MAX_MSGLEN]; // network data
|
||||||
uint msg_time; // GetMessage time
|
uint msg_time; // GetMessage time
|
||||||
|
char ModuleName[4096]; // exe.filename
|
||||||
|
|
||||||
HINSTANCE hInstance;
|
HINSTANCE hInstance;
|
||||||
LPTOP_LEVEL_EXCEPTION_FILTER oldFilter;
|
LPTOP_LEVEL_EXCEPTION_FILTER oldFilter;
|
||||||
@ -120,6 +121,7 @@ double Sys_DoubleTime( void );
|
|||||||
dword Sys_Milliseconds( void );
|
dword Sys_Milliseconds( void );
|
||||||
char *Sys_GetClipboardData( void );
|
char *Sys_GetClipboardData( void );
|
||||||
char *Sys_GetCurrentUser( void );
|
char *Sys_GetCurrentUser( void );
|
||||||
|
bool Sys_GetModuleName( char *buffer, size_t length );
|
||||||
void Sys_Sleep( int msec );
|
void Sys_Sleep( int msec );
|
||||||
void Sys_Init( void );
|
void Sys_Init( void );
|
||||||
void Sys_Exit( void );
|
void Sys_Exit( void );
|
||||||
@ -134,6 +136,7 @@ void Sys_CloseLog( void );
|
|||||||
void Sys_Error(const char *error, ...);
|
void Sys_Error(const char *error, ...);
|
||||||
void Sys_Break(const char *error, ...);
|
void Sys_Break(const char *error, ...);
|
||||||
void Sys_PrintLog( const char *pMsg );
|
void Sys_PrintLog( const char *pMsg );
|
||||||
|
void Sys_PrintMem( const char *pMsg );
|
||||||
void Sys_Print(const char *pMsg);
|
void Sys_Print(const char *pMsg);
|
||||||
void Sys_Msg( const char *pMsg, ... );
|
void Sys_Msg( const char *pMsg, ... );
|
||||||
void Sys_MsgDev( int level, const char *pMsg, ... );
|
void Sys_MsgDev( int level, const char *pMsg, ... );
|
||||||
@ -195,6 +198,7 @@ int com_strncmp (const char *s1, const char *s2, int n);
|
|||||||
int com_strcmp (const char *s1, const char *s2);
|
int com_strcmp (const char *s1, const char *s2);
|
||||||
const char* com_timestamp( int format );
|
const char* com_timestamp( int format );
|
||||||
char *com_stristr( const char *string, const char *string2 );
|
char *com_stristr( const char *string, const char *string2 );
|
||||||
|
char *com_strstr( const char *string, const char *string2 );
|
||||||
size_t com_strpack( byte *buffer, size_t pos, char *string, int n );
|
size_t com_strpack( byte *buffer, size_t pos, char *string, int n );
|
||||||
size_t com_strunpack( byte *buffer, size_t pos, char *string );
|
size_t com_strunpack( byte *buffer, size_t pos, char *string );
|
||||||
int com_vsnprintf(char *buffer, size_t buffersize, const char *format, va_list args);
|
int com_vsnprintf(char *buffer, size_t buffersize, const char *format, va_list args);
|
||||||
|
@ -20,11 +20,11 @@ cvar_t *cm_leavenudge;
|
|||||||
cvar_t *cm_prefernudgedfraction;
|
cvar_t *cm_prefernudgedfraction;
|
||||||
static uint brushforbox_index = 0;
|
static uint brushforbox_index = 0;
|
||||||
|
|
||||||
static cpointf_t polyf_points[256];
|
static cpointf_t polyf_points[512];
|
||||||
static cplanef_t polyf_planes[256 + 2];
|
static cplanef_t polyf_planes[512 + 2];
|
||||||
static cbrushf_t polyf_brush;
|
static cbrushf_t polyf_brush;
|
||||||
static cpointf_t polyf_pointsstart[256], polyf_pointsend[256];
|
static cpointf_t polyf_pointsstart[512], polyf_pointsend[512];
|
||||||
static cplanef_t polyf_planesstart[256 + 2], polyf_planesend[256 + 2];
|
static cplanef_t polyf_planesstart[512 + 2], polyf_planesend[512 + 2];
|
||||||
static cbrushf_t polyf_brushstart, polyf_brushend;
|
static cbrushf_t polyf_brushstart, polyf_brushend;
|
||||||
static cpointf_t brushforbox_point[MAX_BRUSHFORBOX*8];
|
static cpointf_t brushforbox_point[MAX_BRUSHFORBOX*8];
|
||||||
static cplanef_t brushforbox_plane[MAX_BRUSHFORBOX*6];
|
static cplanef_t brushforbox_plane[MAX_BRUSHFORBOX*6];
|
||||||
@ -143,17 +143,17 @@ cbrushf_t *CM_CollisionNewBrushFromPlanes( byte *mempool, int numoriginalplanes,
|
|||||||
{
|
{
|
||||||
// TODO: planesbuf could be replaced by a remapping table
|
// TODO: planesbuf could be replaced by a remapping table
|
||||||
int j, k, m, w, xyzflags;
|
int j, k, m, w, xyzflags;
|
||||||
int numpointsbuf = 0, maxpointsbuf = 256, numplanesbuf = 0;
|
int numpointsbuf = 0, maxpointsbuf = 512, numplanesbuf = 0;
|
||||||
int maxplanesbuf = 256, numelementsbuf = 0, maxelementsbuf = 256;
|
int maxplanesbuf = 512, numelementsbuf = 0, maxelementsbuf = 512;
|
||||||
double maxdist;
|
double maxdist;
|
||||||
cbrushf_t *brush;
|
cbrushf_t *brush;
|
||||||
cpointf_t pointsbuf[256];
|
cpointf_t pointsbuf[512];
|
||||||
cplanef_t planesbuf[256];
|
cplanef_t planesbuf[512];
|
||||||
int elementsbuf[1024];
|
int elementsbuf[2048];
|
||||||
int polypointbuf[256];
|
int polypointbuf[512];
|
||||||
int pmaxpoints = 64;
|
int pmaxpoints = 128;
|
||||||
int pnumpoints;
|
int pnumpoints;
|
||||||
double p[2][192];
|
double p[2][384];
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// enable these if debugging to avoid seeing garbage in unused data
|
// enable these if debugging to avoid seeing garbage in unused data
|
||||||
@ -555,10 +555,10 @@ void CM_CollisionTraceBrushBrushFloat( trace_t *trace, const cbrushf_t *thisbrus
|
|||||||
|
|
||||||
VectorClear( newimpactnormal );
|
VectorClear( newimpactnormal );
|
||||||
|
|
||||||
for (nplane = 0;nplane < thatbrush_start->numplanes + thisbrush_start->numplanes;nplane++)
|
for( nplane = 0; nplane < thatbrush_start->numplanes + thisbrush_start->numplanes; nplane++ )
|
||||||
{
|
{
|
||||||
nplane2 = nplane;
|
nplane2 = nplane;
|
||||||
if (nplane2 >= thatbrush_start->numplanes)
|
if( nplane2 >= thatbrush_start->numplanes )
|
||||||
{
|
{
|
||||||
nplane2 -= thatbrush_start->numplanes;
|
nplane2 -= thatbrush_start->numplanes;
|
||||||
startplane = thisbrush_start->planes + nplane2;
|
startplane = thisbrush_start->planes + nplane2;
|
||||||
@ -834,9 +834,9 @@ void CM_CollisionSnapCopyPoints( int numpoints, const cpointf_t *in, cpointf_t *
|
|||||||
|
|
||||||
void CM_CollisionTraceBrushPolygonFloat( trace_t *trace, const cbrushf_t *thisbrush_start, const cbrushf_t *thisbrush_end, int numpoints, const float *points, int supercontents )
|
void CM_CollisionTraceBrushPolygonFloat( trace_t *trace, const cbrushf_t *thisbrush_start, const cbrushf_t *thisbrush_end, int numpoints, const float *points, int supercontents )
|
||||||
{
|
{
|
||||||
if( numpoints > 256 )
|
if( numpoints > 512 )
|
||||||
{
|
{
|
||||||
MsgDev( D_ERROR, "Polygon with more than 256 points not supported yet (fixme!)\n" );
|
MsgDev( D_ERROR, "Polygon with more than 512 points not supported\n" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
polyf_brush.numpoints = numpoints;
|
polyf_brush.numpoints = numpoints;
|
||||||
@ -881,9 +881,9 @@ void CM_CollisionTraceBrushTriangleMeshFloat( trace_t *trace, const cbrushf_t *t
|
|||||||
|
|
||||||
void CM_CollisionTraceLinePolygonFloat( trace_t *trace, const vec3_t linestart, const vec3_t lineend, int numpoints, const float *points, int supercontents )
|
void CM_CollisionTraceLinePolygonFloat( trace_t *trace, const vec3_t linestart, const vec3_t lineend, int numpoints, const float *points, int supercontents )
|
||||||
{
|
{
|
||||||
if( numpoints > 256 )
|
if( numpoints > 512 )
|
||||||
{
|
{
|
||||||
MsgDev( D_ERROR, "Polygon with more than 256 points not supported yet (fixme!)\n" );
|
MsgDev( D_ERROR, "Polygon with more than 512 points not supported\n" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -937,9 +937,9 @@ void CM_CollisionTraceBrushPolygonTransformFloat( trace_t *trace, const cbrushf_
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if( numpoints > 256 )
|
if( numpoints > 512 )
|
||||||
{
|
{
|
||||||
MsgDev( D_ERROR, "Polygon with more than 256 points not supported yet (fixme!)\n" );
|
MsgDev( D_ERROR, "Polygon with more than 512 points not supported\n" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,8 +161,8 @@ typedef struct clipmap_s
|
|||||||
csurface_t *surfdesc;
|
csurface_t *surfdesc;
|
||||||
cbrush_t *brushes;
|
cbrush_t *brushes;
|
||||||
cbrushside_t *brushsides;
|
cbrushside_t *brushsides;
|
||||||
byte *visibility;
|
byte *visbase; // vis offset
|
||||||
dvis_t *vis; // vis offset
|
dvis_t *vis;
|
||||||
NewtonCollision *collision;
|
NewtonCollision *collision;
|
||||||
char *stringdata;
|
char *stringdata;
|
||||||
int *stringtable;
|
int *stringtable;
|
||||||
|
@ -117,7 +117,7 @@ void BSP_CreateMeshBuffer( int modelnum )
|
|||||||
|
|
||||||
loadmodel = &cm.bmodels[modelnum];
|
loadmodel = &cm.bmodels[modelnum];
|
||||||
if( modelnum ) loadmodel->type = mod_brush;
|
if( modelnum ) loadmodel->type = mod_brush;
|
||||||
loadmodel->type = mod_static; // level static geometry
|
else loadmodel->type = mod_world; // level static geometry
|
||||||
loadmodel->TraceBox = CM_TraceBmodel;
|
loadmodel->TraceBox = CM_TraceBmodel;
|
||||||
loadmodel->PointContents = CM_PointContents;
|
loadmodel->PointContents = CM_PointContents;
|
||||||
|
|
||||||
@ -180,6 +180,12 @@ void BSP_LoadModels( lump_t *l )
|
|||||||
out->maxs[j] = LittleFloat(in->maxs[j]) + 1;
|
out->maxs[j] = LittleFloat(in->maxs[j]) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out->firstface = n = LittleLong( in->firstface );
|
||||||
|
out->numfaces = c = LittleLong( in->numfaces );
|
||||||
|
|
||||||
|
// skip other stuff, not using for building collision tree
|
||||||
|
if( app_name == COMP_BSPLIB ) continue;
|
||||||
|
|
||||||
// FIXME: calc bounding box right
|
// FIXME: calc bounding box right
|
||||||
VectorCopy( out->mins, out->normalmins );
|
VectorCopy( out->mins, out->normalmins );
|
||||||
VectorCopy( out->maxs, out->normalmaxs );
|
VectorCopy( out->maxs, out->normalmaxs );
|
||||||
@ -188,8 +194,6 @@ void BSP_LoadModels( lump_t *l )
|
|||||||
VectorCopy( out->mins, out->yawmins );
|
VectorCopy( out->mins, out->yawmins );
|
||||||
VectorCopy( out->maxs, out->yawmaxs );
|
VectorCopy( out->maxs, out->yawmaxs );
|
||||||
|
|
||||||
out->firstface = n = LittleLong( in->firstface );
|
|
||||||
out->numfaces = c = LittleLong( in->numfaces );
|
|
||||||
if( n < 0 || n + c > cm.numfaces )
|
if( n < 0 || n + c > cm.numfaces )
|
||||||
Host_Error("BSP_LoadModels: invalid face range %i : %i (%i faces)\n", n, n+c, cm.numfaces );
|
Host_Error("BSP_LoadModels: invalid face range %i : %i (%i faces)\n", n, n+c, cm.numfaces );
|
||||||
out->firstbrush = n = LittleLong( in->firstbrush );
|
out->firstbrush = n = LittleLong( in->firstbrush );
|
||||||
@ -197,7 +201,7 @@ void BSP_LoadModels( lump_t *l )
|
|||||||
if( n < 0 || n + c > cm.numbrushes )
|
if( n < 0 || n + c > cm.numbrushes )
|
||||||
Host_Error("BSP_LoadModels: invalid brush range %i : %i (%i brushes)\n", n, n+c, cm.numfaces );
|
Host_Error("BSP_LoadModels: invalid brush range %i : %i (%i brushes)\n", n, n+c, cm.numfaces );
|
||||||
com.strncpy( out->name, va("*%i", i ), sizeof(out->name));
|
com.strncpy( out->name, va("*%i", i ), sizeof(out->name));
|
||||||
out->mempool = Mem_AllocPool( out->name );
|
out->mempool = Mem_AllocPool( va("^2%s", out->name )); // difference with render and cm pools
|
||||||
BSP_CreateMeshBuffer( i ); // bsp physic
|
BSP_CreateMeshBuffer( i ); // bsp physic
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -554,15 +558,16 @@ void BSP_LoadVisibility( lump_t *l )
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if(!l->filelen)
|
if( !l->filelen )
|
||||||
{
|
{
|
||||||
cm.vis = NULL;
|
cm.vis = (dvis_t *)Mem_Alloc( cmappool, MAX_MAP_VISIBILITY );
|
||||||
|
cm.visbase = NULL; // invalidate
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
cm.visibility = (byte *)Mem_Alloc( cmappool, l->filelen );
|
cm.visbase = (byte *)Mem_Alloc( cmappool, l->filelen );
|
||||||
Mem_Copy( cm.visibility, cm.mod_base + l->fileofs, l->filelen );
|
Mem_Copy( cm.visbase, cm.mod_base + l->fileofs, l->filelen );
|
||||||
cm.vis = (dvis_t *)cm.visibility; // conversion
|
cm.vis = (dvis_t *)cm.visbase; // conversion
|
||||||
cm.vis->numclusters = LittleLong( cm.vis->numclusters );
|
cm.vis->numclusters = LittleLong( cm.vis->numclusters );
|
||||||
for (i = 0; i < cm.vis->numclusters; i++)
|
for (i = 0; i < cm.vis->numclusters; i++)
|
||||||
{
|
{
|
||||||
@ -741,6 +746,8 @@ static void BSP_RecursiveFindNumLeafs( cnode_t *node )
|
|||||||
node = node->children[1];
|
node = node->children[1];
|
||||||
}
|
}
|
||||||
numleafs = ((cleaf_t *)node - cm.leafs) + 1;
|
numleafs = ((cleaf_t *)node - cm.leafs) + 1;
|
||||||
|
|
||||||
|
// these never happens
|
||||||
if( cm.numleafs < numleafs ) cm.numleafs = numleafs;
|
if( cm.numleafs < numleafs ) cm.numleafs = numleafs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1031,12 +1038,8 @@ cmodel_t *CM_BeginRegistration( const char *name, bool clientload, uint *checksu
|
|||||||
BSP_LoadModels(&hdr->lumps[LUMP_MODELS]);
|
BSP_LoadModels(&hdr->lumps[LUMP_MODELS]);
|
||||||
BSP_LoadCollision(&hdr->lumps[LUMP_COLLISION]);
|
BSP_LoadCollision(&hdr->lumps[LUMP_COLLISION]);
|
||||||
|
|
||||||
|
|
||||||
// test, these probably unneeded
|
|
||||||
Msg("cm.numleafs %i\n", cm.numleafs );
|
|
||||||
BSP_RecursiveFindNumLeafs( cm.nodes );
|
BSP_RecursiveFindNumLeafs( cm.nodes );
|
||||||
BSP_RecursiveSetParent( cm.nodes, NULL );
|
BSP_RecursiveSetParent( cm.nodes, NULL );
|
||||||
Msg("cm.numleafs %i\n", cm.numleafs );
|
|
||||||
|
|
||||||
CM_LoadWorld( buf );// load physics collision
|
CM_LoadWorld( buf );// load physics collision
|
||||||
Mem_Free( buf ); // release map buffer
|
Mem_Free( buf ); // release map buffer
|
||||||
@ -1449,7 +1452,7 @@ cmodel_t *CM_RegisterModel( const char *name )
|
|||||||
}
|
}
|
||||||
|
|
||||||
MsgDev(D_NOTE, "CM_LoadModel: load %s\n", name );
|
MsgDev(D_NOTE, "CM_LoadModel: load %s\n", name );
|
||||||
mod->mempool = Mem_AllocPool(mod->name);
|
mod->mempool = Mem_AllocPool( va("^2%s", mod->name ));
|
||||||
loadmodel = mod;
|
loadmodel = mod;
|
||||||
|
|
||||||
// call the apropriate loader
|
// call the apropriate loader
|
||||||
|
@ -229,7 +229,6 @@ void CM_ServerMove( pmove_t *pmove )
|
|||||||
m_isAirBorne = true;
|
m_isAirBorne = true;
|
||||||
VectorSet( m_stepContact, 0.0f, -m_size[2], 0.0f );
|
VectorSet( m_stepContact, 0.0f, -m_size[2], 0.0f );
|
||||||
|
|
||||||
pm->ps.viewheight = 22;
|
|
||||||
NewtonUpVectorSetPin( cm.upVector, &vec3_up[0] );
|
NewtonUpVectorSetPin( cm.upVector, &vec3_up[0] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -61,14 +61,14 @@ void CM_DecompressVis( byte *in, byte *out )
|
|||||||
byte *CM_ClusterPVS( int cluster )
|
byte *CM_ClusterPVS( int cluster )
|
||||||
{
|
{
|
||||||
if( cluster == -1 || !cm.vis ) memset( cm.pvsrow, 0, (cm.numclusters + 7)>>3 );
|
if( cluster == -1 || !cm.vis ) memset( cm.pvsrow, 0, (cm.numclusters + 7)>>3 );
|
||||||
else CM_DecompressVis( cm.visibility + cm.vis->bitofs[cluster][DVIS_PVS], cm.pvsrow );
|
else CM_DecompressVis( cm.visbase + cm.vis->bitofs[cluster][DVIS_PVS], cm.pvsrow );
|
||||||
return cm.pvsrow;
|
return cm.pvsrow;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte *CM_ClusterPHS (int cluster)
|
byte *CM_ClusterPHS (int cluster)
|
||||||
{
|
{
|
||||||
if( cluster == -1 || !cm.vis ) memset( cm.phsrow, 0, (cm.numclusters + 7)>>3 );
|
if( cluster == -1 || !cm.vis ) memset( cm.phsrow, 0, (cm.numclusters + 7)>>3 );
|
||||||
else CM_DecompressVis( cm.visibility + cm.vis->bitofs[cluster][DVIS_PHS], cm.phsrow );
|
else CM_DecompressVis( cm.visbase + cm.vis->bitofs[cluster][DVIS_PHS], cm.phsrow );
|
||||||
return cm.phsrow;
|
return cm.phsrow;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,7 +118,7 @@ void CM_FloodAreaConnections( void )
|
|||||||
for( i = 1; i < cm.numareas; i++ )
|
for( i = 1; i < cm.numareas; i++ )
|
||||||
{
|
{
|
||||||
area = &cm.areas[i];
|
area = &cm.areas[i];
|
||||||
if (area->floodvalid == cm.floodvalid)
|
if( area->floodvalid == cm.floodvalid )
|
||||||
continue; // already flooded into
|
continue; // already flooded into
|
||||||
floodnum++;
|
floodnum++;
|
||||||
FloodArea_r( area, floodnum );
|
FloodArea_r( area, floodnum );
|
||||||
|
@ -279,7 +279,7 @@ void CM_TraceBmodel( const vec3_t start, const vec3_t end, const vec3_t mins, co
|
|||||||
if( surface->numtriangles ) CM_CollisionTraceLineTriangleMeshFloat( trace, start, end, surface->numtriangles, surface->indices, surface->vertices, surface->contentflags, surface->surfaceflags, surface, segmentmins, segmentmaxs );
|
if( surface->numtriangles ) CM_CollisionTraceLineTriangleMeshFloat( trace, start, end, surface->numtriangles, surface->indices, surface->vertices, surface->contentflags, surface->surfaceflags, surface, segmentmins, segmentmaxs );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else CM_TraceBrush_r( trace, model, cm.nodes, thisbrush_start, thisbrush_end, ++markframe, segmentmins, segmentmaxs);
|
else CM_TraceBrush_r( trace, model, cm.nodes, thisbrush_start, thisbrush_end, ++markframe, segmentmins, segmentmaxs );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ enum host_state
|
|||||||
{ // paltform states
|
{ // paltform states
|
||||||
HOST_OFFLINE = 0, // host_init( g_Instance ) same much as:
|
HOST_OFFLINE = 0, // host_init( g_Instance ) same much as:
|
||||||
HOST_NORMAL, // "normal"
|
HOST_NORMAL, // "normal"
|
||||||
HOST_DEDICATED, // "dedicated"
|
HOST_DEDICATED, // "#normal"
|
||||||
HOST_VIEWER, // "viewer"
|
HOST_VIEWER, // "viewer"
|
||||||
HOST_CREDITS, // "splash" (easter egg)
|
HOST_CREDITS, // "splash" (easter egg)
|
||||||
HOST_INSTALL, // "install"
|
HOST_INSTALL, // "install"
|
||||||
@ -40,21 +40,6 @@ enum host_state
|
|||||||
#define bound(min, num, max) ((num) >= (min) ? ((num) < (max) ? (num) : (max)) : (min))
|
#define bound(min, num, max) ((num) >= (min) ? ((num) < (max) ? (num) : (max)) : (min))
|
||||||
#define DLLEXPORT __declspec(dllexport)
|
#define DLLEXPORT __declspec(dllexport)
|
||||||
|
|
||||||
|
|
||||||
//#define USE_COORD_FRAC //FIXME: disable this
|
|
||||||
|
|
||||||
// network precision coords factor
|
|
||||||
#ifdef USE_COORD_FRAC
|
|
||||||
#define SV_COORD_FRAC (8.0f / 1.0f)
|
|
||||||
#define CL_COORD_FRAC (1.0f / 8.0f)
|
|
||||||
#else
|
|
||||||
#define SV_COORD_FRAC 1.0f
|
|
||||||
#define CL_COORD_FRAC 1.0f
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SV_ANGLE_FRAC (360.0f / 1.0f )
|
|
||||||
#define CL_ANGLE_FRAC (1.0f / 360.0f )
|
|
||||||
|
|
||||||
typedef long fs_offset_t;
|
typedef long fs_offset_t;
|
||||||
typedef enum { NA_BAD, NA_LOOPBACK, NA_BROADCAST, NA_IP, NA_IPX, NA_BROADCAST_IPX } netadrtype_t;
|
typedef enum { NA_BAD, NA_LOOPBACK, NA_BROADCAST, NA_IP, NA_IPX, NA_BROADCAST_IPX } netadrtype_t;
|
||||||
typedef enum { NS_CLIENT, NS_SERVER } netsrc_t;
|
typedef enum { NS_CLIENT, NS_SERVER } netsrc_t;
|
||||||
@ -64,7 +49,7 @@ typedef struct { byte r; byte g; byte b; byte a; } color32;
|
|||||||
typedef struct { const char *name; void **func; } dllfunc_t; // Sys_LoadLibrary stuff
|
typedef struct { const char *name; void **func; } dllfunc_t; // Sys_LoadLibrary stuff
|
||||||
typedef struct { int ofs; int type; const char *name; } fields_t; // prvm custom fields
|
typedef struct { int ofs; int type; const char *name; } fields_t; // prvm custom fields
|
||||||
typedef void (*cmread_t) (void* handle, void* buffer, size_t size);
|
typedef void (*cmread_t) (void* handle, void* buffer, size_t size);
|
||||||
typedef enum { mod_bad, mod_static, mod_brush, mod_studio, mod_sprite } modtype_t;
|
typedef enum { mod_bad, mod_world, mod_brush, mod_studio, mod_sprite } modtype_t;
|
||||||
typedef void (*cmsave_t) (void* handle, const void* buffer, size_t size);
|
typedef void (*cmsave_t) (void* handle, const void* buffer, size_t size);
|
||||||
typedef void (*cmdraw_t)( int color, int numpoints, const float *points );
|
typedef void (*cmdraw_t)( int color, int numpoints, const float *points );
|
||||||
typedef struct { int numfilenames; char **filenames; char *filenamesbuffer; } search_t;
|
typedef struct { int numfilenames; char **filenames; char *filenamesbuffer; } search_t;
|
||||||
@ -178,7 +163,6 @@ typedef struct model_state_s
|
|||||||
int body; // sub-model selection for studiomodels
|
int body; // sub-model selection for studiomodels
|
||||||
float blending[8]; // studio animation blending
|
float blending[8]; // studio animation blending
|
||||||
float controller[32]; // studio bone controllers
|
float controller[32]; // studio bone controllers
|
||||||
vec3_t calcbonepos[128]; // too hard: ragdoll or like it, animated by physic engine
|
|
||||||
} model_state_t;
|
} model_state_t;
|
||||||
|
|
||||||
// entity_state_t communication
|
// entity_state_t communication
|
||||||
@ -218,8 +202,7 @@ typedef struct entity_state_s
|
|||||||
vec3_t delta_angles; // add to command angles to get view direction
|
vec3_t delta_angles; // add to command angles to get view direction
|
||||||
vec3_t punch_angles; // add to view direction to get render angles
|
vec3_t punch_angles; // add to view direction to get render angles
|
||||||
vec3_t viewangles; // already calculated view angles on server-side
|
vec3_t viewangles; // already calculated view angles on server-side
|
||||||
vec3_t viewoffset; // FIXME: replace with viewheight
|
vec3_t viewoffset; // viewoffset over ground
|
||||||
int viewheight; // height over ground
|
|
||||||
int maxspeed; // sv_maxspeed will be duplicate on all clients
|
int maxspeed; // sv_maxspeed will be duplicate on all clients
|
||||||
float health; // client health (other parms can be send by custom messages)
|
float health; // client health (other parms can be send by custom messages)
|
||||||
float fov; // horizontal field of view
|
float fov; // horizontal field of view
|
||||||
@ -320,12 +303,11 @@ typedef struct dll_info_s
|
|||||||
const char *entry; // entrypoint name (internal libs only)
|
const char *entry; // entrypoint name (internal libs only)
|
||||||
void *link; // hinstance of loading library
|
void *link; // hinstance of loading library
|
||||||
|
|
||||||
// xash dlls entrypoint
|
// xash interface
|
||||||
void *(*main)( void*, void* );
|
void *(*main)( void*, void* );
|
||||||
bool crash; // crash if dll not found
|
bool crash; // crash if dll not found
|
||||||
|
|
||||||
// xash dlls validator
|
size_t api_size; // interface size
|
||||||
size_t api_size; // generic interface size
|
|
||||||
|
|
||||||
} dll_info_t;
|
} dll_info_t;
|
||||||
|
|
||||||
@ -421,6 +403,7 @@ enum dev_level
|
|||||||
D_LOAD, // "-dev 4", show messages about loading resources
|
D_LOAD, // "-dev 4", show messages about loading resources
|
||||||
D_NOTE, // "-dev 5", show system notifications for engine develeopers
|
D_NOTE, // "-dev 5", show system notifications for engine develeopers
|
||||||
D_MEMORY, // "-dev 6", show memory allocation
|
D_MEMORY, // "-dev 6", show memory allocation
|
||||||
|
D_STRING, // "-dev 7", show tempstrings allocation
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -845,10 +828,6 @@ stdlib function names that not across with windows stdlib
|
|||||||
*/
|
*/
|
||||||
#define timestamp com.timestamp
|
#define timestamp com.timestamp
|
||||||
#define copystring( str ) com.stralloc( NULL, str, __FILE__, __LINE__ )
|
#define copystring( str ) com.stralloc( NULL, str, __FILE__, __LINE__ )
|
||||||
#define strcasecmp com.stricmp
|
|
||||||
#define strncasecmp com.strnicmp
|
|
||||||
#define strlower com.strlwr
|
|
||||||
#define stristr com.stristr
|
|
||||||
#define va com.va
|
#define va com.va
|
||||||
|
|
||||||
#endif//LAUNCH_DLL
|
#endif//LAUNCH_DLL
|
||||||
|
@ -446,7 +446,6 @@ void GL_InitBackend( void )
|
|||||||
glw_state.wndproc = ri.WndProc;
|
glw_state.wndproc = ri.WndProc;
|
||||||
glw_state.hInst = GetModuleHandle( NULL );
|
glw_state.hInst = GetModuleHandle( NULL );
|
||||||
r_temppool = Mem_AllocPool( "Render Memory" );
|
r_temppool = Mem_AllocPool( "Render Memory" );
|
||||||
if( !r_framebuffer ) r_framebuffer = Z_Malloc( r_width->integer * r_height->integer * 3 );
|
|
||||||
|
|
||||||
// init tables
|
// init tables
|
||||||
for( i = 0; i < 256; i++ ) r_turbsin[i] *= 0.5f;
|
for( i = 0; i < 256; i++ ) r_turbsin[i] *= 0.5f;
|
||||||
@ -546,6 +545,7 @@ void GL_InitExtensions( void )
|
|||||||
|
|
||||||
// initialize gl extensions
|
// initialize gl extensions
|
||||||
GL_CheckExtension( "OpenGL 1.1.0", opengl_110funcs, NULL, R_OPENGL_110 );
|
GL_CheckExtension( "OpenGL 1.1.0", opengl_110funcs, NULL, R_OPENGL_110 );
|
||||||
|
if( !r_framebuffer ) r_framebuffer = Z_Malloc( r_width->integer * r_height->integer * 3 );
|
||||||
|
|
||||||
// get our various GL strings
|
// get our various GL strings
|
||||||
gl_config.vendor_string = pglGetString( GL_VENDOR );
|
gl_config.vendor_string = pglGetString( GL_VENDOR );
|
||||||
@ -765,7 +765,7 @@ void GL_TextureMode( char *string )
|
|||||||
|
|
||||||
for (i=0 ; i< NUM_GL_MODES ; i++)
|
for (i=0 ; i< NUM_GL_MODES ; i++)
|
||||||
{
|
{
|
||||||
if ( !strcasecmp( modes[i].name, string ) )
|
if ( !com.stricmp( modes[i].name, string ) )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -801,7 +801,7 @@ void GL_TextureAlphaMode( char *string )
|
|||||||
|
|
||||||
for (i=0 ; i< NUM_GL_ALPHA_MODES ; i++)
|
for (i=0 ; i< NUM_GL_ALPHA_MODES ; i++)
|
||||||
{
|
{
|
||||||
if ( !strcasecmp( gl_alpha_modes[i].name, string ) )
|
if ( !com.stricmp( gl_alpha_modes[i].name, string ) )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -825,7 +825,7 @@ void GL_TextureSolidMode( char *string )
|
|||||||
|
|
||||||
for (i=0 ; i< NUM_GL_SOLID_MODES ; i++)
|
for (i=0 ; i< NUM_GL_SOLID_MODES ; i++)
|
||||||
{
|
{
|
||||||
if ( !strcasecmp( gl_solid_modes[i].name, string ) )
|
if ( !com.stricmp( gl_solid_modes[i].name, string ) )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ image_t *Draw_FindPic( const char *name )
|
|||||||
size_t bufsize = 0;
|
size_t bufsize = 0;
|
||||||
|
|
||||||
//HACKHACK: use default font
|
//HACKHACK: use default font
|
||||||
if(stristr(name, "fonts" ))
|
if(com.stristr(name, "fonts" ))
|
||||||
buffer = FS_LoadInternal( "default.dds", &bufsize );
|
buffer = FS_LoadInternal( "default.dds", &bufsize );
|
||||||
|
|
||||||
com.snprintf( fullname, MAX_STRING, "gfx/%s", name );
|
com.snprintf( fullname, MAX_STRING, "gfx/%s", name );
|
||||||
|
@ -200,7 +200,7 @@ model_t *Mod_ForName(char *name, bool crash)
|
|||||||
for (i = 0, mod = mod_known; i < mod_numknown; i++, mod++)
|
for (i = 0, mod = mod_known; i < mod_numknown; i++, mod++)
|
||||||
{
|
{
|
||||||
if (!mod->name[0]) continue;
|
if (!mod->name[0]) continue;
|
||||||
if (!strcmp (mod->name, name))
|
if (!com.strcmp (mod->name, name))
|
||||||
{
|
{
|
||||||
// prolonge registration
|
// prolonge registration
|
||||||
mod->registration_sequence = registration_sequence;
|
mod->registration_sequence = registration_sequence;
|
||||||
@ -233,7 +233,7 @@ model_t *Mod_ForName(char *name, bool crash)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mod->mempool = Mem_AllocPool(mod->name);
|
mod->mempool = Mem_AllocPool(va("^1%s", mod->name ));
|
||||||
|
|
||||||
loadmodel = mod;
|
loadmodel = mod;
|
||||||
|
|
||||||
@ -242,7 +242,7 @@ model_t *Mod_ForName(char *name, bool crash)
|
|||||||
//
|
//
|
||||||
|
|
||||||
// call the apropriate loader
|
// call the apropriate loader
|
||||||
switch (LittleLong(*(unsigned *)buf))
|
switch (LittleLong(*(uint *)buf))
|
||||||
{
|
{
|
||||||
case IDBSPMODHEADER:
|
case IDBSPMODHEADER:
|
||||||
Mod_LoadBrushModel (mod, buf);
|
Mod_LoadBrushModel (mod, buf);
|
||||||
@ -878,7 +878,7 @@ void Mod_LoadBrushModel (model_t *mod, void *buffer)
|
|||||||
dheader_t *header;
|
dheader_t *header;
|
||||||
|
|
||||||
|
|
||||||
loadmodel->type = mod_static;
|
loadmodel->type = mod_world;
|
||||||
if (loadmodel != mod_known)
|
if (loadmodel != mod_known)
|
||||||
{
|
{
|
||||||
Msg("Warning: loaded a brush model after the world\n");
|
Msg("Warning: loaded a brush model after the world\n");
|
||||||
|
@ -981,7 +981,7 @@ int R_Init( void *hinstance )
|
|||||||
R_StudioInit();
|
R_StudioInit();
|
||||||
R_CheckForErrors();
|
R_CheckForErrors();
|
||||||
|
|
||||||
return 1;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -107,7 +107,7 @@ Doom1
|
|||||||
bool Conv_ShaderGetFlags1( const char *imagename, const char *shadername, const char *ext, int *flags, int *contents )
|
bool Conv_ShaderGetFlags1( const char *imagename, const char *shadername, const char *ext, int *flags, int *contents )
|
||||||
{
|
{
|
||||||
if(!com.strnicmp(imagename, "sky", 3 )) *flags |= SURF_SKY;
|
if(!com.strnicmp(imagename, "sky", 3 )) *flags |= SURF_SKY;
|
||||||
if(stristr(imagename, "lit" )) *flags |= SURF_LIGHT;
|
if(com.stristr(imagename, "lit" )) *flags |= SURF_LIGHT;
|
||||||
|
|
||||||
if(!com.strnicmp( "sw", imagename, 2 ))
|
if(!com.strnicmp( "sw", imagename, 2 ))
|
||||||
{
|
{
|
||||||
@ -178,17 +178,17 @@ bool Conv_ShaderGetFlags2( const char *imagename, const char *shadername, const
|
|||||||
// light definition
|
// light definition
|
||||||
if(com.strchr(imagename, '~')) *flags |= SURF_LIGHT;
|
if(com.strchr(imagename, '~')) *flags |= SURF_LIGHT;
|
||||||
|
|
||||||
if(stristr( imagename, "water" ))
|
if(com.stristr( imagename, "water" ))
|
||||||
{
|
{
|
||||||
*contents |= CONTENTS_WATER;
|
*contents |= CONTENTS_WATER;
|
||||||
*flags |= SURF_WARP; // liquids
|
*flags |= SURF_WARP; // liquids
|
||||||
}
|
}
|
||||||
else if(stristr( imagename, "slime" ))
|
else if(com.stristr( imagename, "slime" ))
|
||||||
{
|
{
|
||||||
*contents |= CONTENTS_SLIME;
|
*contents |= CONTENTS_SLIME;
|
||||||
*flags |= SURF_WARP; // liquids
|
*flags |= SURF_WARP; // liquids
|
||||||
}
|
}
|
||||||
else if(stristr( imagename, "lava" ))
|
else if(com.stristr( imagename, "lava" ))
|
||||||
{
|
{
|
||||||
*contents |= CONTENTS_LAVA;
|
*contents |= CONTENTS_LAVA;
|
||||||
*flags |= SURF_WARP; // liquids
|
*flags |= SURF_WARP; // liquids
|
||||||
@ -220,7 +220,7 @@ bool Conv_CreateShader( const char *name, rgbdata_t *pic, const char *ext, const
|
|||||||
FS_FileBase( shadername, shadername ); // remove "textures" from path
|
FS_FileBase( shadername, shadername ); // remove "textures" from path
|
||||||
FS_FileBase( name, imagename );
|
FS_FileBase( name, imagename );
|
||||||
com.snprintf( shaderpath, MAX_STRING, "%s/scripts/shaders/%s.txt", gs_gamedir, shadername );
|
com.snprintf( shaderpath, MAX_STRING, "%s/scripts/shaders/%s.txt", gs_gamedir, shadername );
|
||||||
if(stristr(name, "textures")) com.snprintf( imagepath, MAX_STRING, "%s", name ); // full path
|
if(com.stristr(name, "textures")) com.snprintf( imagepath, MAX_STRING, "%s", name ); // full path
|
||||||
else com.snprintf( imagepath, MAX_STRING, "textures/%s", name ); // build full path
|
else com.snprintf( imagepath, MAX_STRING, "textures/%s", name ); // build full path
|
||||||
nextanimchain[0] = 0; // clear chain
|
nextanimchain[0] = 0; // clear chain
|
||||||
|
|
||||||
@ -229,7 +229,7 @@ bool Conv_CreateShader( const char *name, rgbdata_t *pic, const char *ext, const
|
|||||||
flags |= surf; // .wal can transmit flags here
|
flags |= surf; // .wal can transmit flags here
|
||||||
contents |= cnt;
|
contents |= cnt;
|
||||||
|
|
||||||
if(!strnicmp(ext, "flt", 3 )) // doom definitions
|
if(!com.strnicmp(ext, "flt", 3 )) // doom definitions
|
||||||
Conv_ShaderGetFlags1( imagename, shadername, ext, &flags, &contents );
|
Conv_ShaderGetFlags1( imagename, shadername, ext, &flags, &contents );
|
||||||
else Conv_ShaderGetFlags2( imagename, shadername, ext, &flags, &contents );
|
else Conv_ShaderGetFlags2( imagename, shadername, ext, &flags, &contents );
|
||||||
|
|
||||||
|
13
todo.log
13
todo.log
@ -10,9 +10,6 @@ SprExplorer
|
|||||||
fopen завешивает приложение, при попытке создать файл в несуществующей директории. Ну вылетал бы чтоли, или ошибку
|
fopen завешивает приложение, при попытке создать файл в несуществующей директории. Ну вылетал бы чтоли, или ошибку
|
||||||
возвращал.
|
возвращал.
|
||||||
|
|
||||||
Замеченные баги:
|
|
||||||
0. viewer ничего не пишет в лог (сцуко)
|
|
||||||
|
|
||||||
Отложенные задачи:
|
Отложенные задачи:
|
||||||
1. Поддержка loop для ogg vorbis
|
1. Поддержка loop для ogg vorbis
|
||||||
2. dpvencoder в common.dll
|
2. dpvencoder в common.dll
|
||||||
@ -21,14 +18,10 @@ fopen
|
|||||||
|
|
||||||
Текущие задачи:
|
Текущие задачи:
|
||||||
0. Исправить отрисовку bbox
|
0. Исправить отрисовку bbox
|
||||||
1. Нормальная линковка OpenGL32.dll OK
|
1. Настроить время на сервере
|
||||||
2. Убить лишние расширения OK
|
2. Server 60 FPS
|
||||||
3. Навести порядок в public OK
|
3. cl.time синхронизировать с sv.time
|
||||||
4. Навести порядок в basetypes.h OK
|
|
||||||
5. Собрать все ресурсы в builtin.h OK
|
|
||||||
6. r_backend.c
|
|
||||||
|
|
||||||
0. Новый сетевой протоколб смена entity_state_t
|
|
||||||
|
|
||||||
Физика игрока:
|
Физика игрока:
|
||||||
1. Убрать отскоки от стен
|
1. Убрать отскоки от стен
|
||||||
|
@ -144,9 +144,9 @@ void GUI_AddMenuItem( HMENU menu, const char *name, uint itemId, uint hotkey )
|
|||||||
int length = strlen(name) - 1;
|
int length = strlen(name) - 1;
|
||||||
|
|
||||||
//parse modifiers
|
//parse modifiers
|
||||||
if (stristr (name, "ctrl")) style |= FCONTROL;
|
if (com.stristr (name, "ctrl")) style |= FCONTROL;
|
||||||
if (stristr (name, "shift")) style |= FSHIFT;
|
if (com.stristr (name, "shift")) style |= FSHIFT;
|
||||||
if (stristr (name, "alt")) style |= FALT;
|
if (com.stristr (name, "alt")) style |= FALT;
|
||||||
|
|
||||||
GUI_AddAccelerator(hotkey, style, itemId);
|
GUI_AddAccelerator(hotkey, style, itemId);
|
||||||
}
|
}
|
||||||
|
@ -1918,7 +1918,7 @@ int PRVM_SetEngineString( const char *s )
|
|||||||
if (vm.prog->knownstrings[i] == s)
|
if (vm.prog->knownstrings[i] == s)
|
||||||
return -1 - i;
|
return -1 - i;
|
||||||
// new unknown engine string
|
// new unknown engine string
|
||||||
MsgDev(D_MEMORY, "new engine string %p\n", s );
|
MsgDev(D_STRING, "new engine string %p\n", s );
|
||||||
for (i = vm.prog->firstfreeknownstring;i < vm.prog->numknownstrings;i++)
|
for (i = vm.prog->firstfreeknownstring;i < vm.prog->numknownstrings;i++)
|
||||||
if (!vm.prog->knownstrings[i])
|
if (!vm.prog->knownstrings[i])
|
||||||
break;
|
break;
|
||||||
@ -1961,7 +1961,7 @@ int PRVM_SetTempString( const char *s )
|
|||||||
if (!s) return 0;
|
if (!s) return 0;
|
||||||
|
|
||||||
size = (int)com.strlen(s) + 1;
|
size = (int)com.strlen(s) + 1;
|
||||||
MsgDev( D_MEMORY, "PRVM_SetTempString: cursize %i, size %i\n", vm_tempstringsbuf.cursize, size);
|
MsgDev( D_STRING, "PRVM_SetTempString: cursize %i, size %i\n", vm_tempstringsbuf.cursize, size);
|
||||||
if (vm_tempstringsbuf.maxsize < vm_tempstringsbuf.cursize + size)
|
if (vm_tempstringsbuf.maxsize < vm_tempstringsbuf.cursize + size)
|
||||||
{
|
{
|
||||||
size_t old_maxsize = vm_tempstringsbuf.maxsize;
|
size_t old_maxsize = vm_tempstringsbuf.maxsize;
|
||||||
|
Reference in New Issue
Block a user