21 Feb 2011

This commit is contained in:
g-cont 2011-02-21 00:00:00 +03:00 committed by Alibek Omarov
parent e338065cc2
commit f8e7311c7f
44 changed files with 393 additions and 477 deletions

View File

@ -29,12 +29,10 @@ FRAME PARSING
*/
void CL_UpdateEntityFields( cl_entity_t *ent )
{
// FIXME: this very-very temporary stuffffffff
// make me lerping
VectorCopy( ent->curstate.origin, ent->origin );
VectorCopy( ent->curstate.angles, ent->angles );
ent->model = CM_ClipHandleToModel( ent->curstate.modelindex );
ent->model = Mod_Handle( ent->curstate.modelindex );
ent->curstate.msg_time = cl.time;
// apply scale to studiomodels and sprites only
@ -130,7 +128,7 @@ qboolean CL_AddVisibleEntity( cl_entity_t *ent, int entityType )
{
model_t *mod;
mod = CM_ClipHandleToModel( ent->curstate.modelindex );
mod = Mod_Handle( ent->curstate.modelindex );
if( !mod ) return false;
// if entity is beam add it here
@ -366,20 +364,18 @@ void CL_DeltaEntity( sizebuf_t *msg, frame_t *frame, int newnum, entity_state_t
if( newent ) Host_Error( "Cl_DeltaEntity: tried to release new entity\n" );
CL_KillDeadBeams( ent ); // release dead beams
/*
#if 0
// this is for reference
if( state->number == -1 )
{
Msg( "Entity %i was removed from server\n", newnum );
}
else
{
Msg( "Entity %i was removed from delta-message\n", newnum );
}
*/
// FIXME: waiting for static entity implimentation
// if( state->number == -1 )
// R_RemoveEfrags( ent );
else Msg( "Entity %i was removed from delta-message\n", newnum );
#endif
#if 0
// waiting for static entity implimentation
if( state->number == -1 )
R_RemoveEfrags( ent );
#endif
// entity was delta removed
return;
}

View File

@ -267,13 +267,13 @@ void CL_FadeAlpha( int starttime, int endtime, byte *alpha )
{
int time, fade_time;
if( starttime == 0 )
if( !starttime )
{
*alpha = 255;
return;
}
time = (host.realtime * 1000) - starttime; // FIXME; convert it to float properly
time = (cl.time * 1000) - starttime;
if( time >= endtime )
{
@ -2191,11 +2191,8 @@ pfnIsSpectateOnly
*/
static int pfnIsSpectateOnly( void )
{
cl_entity_t *pl = CL_GetLocalPlayer();
if( !pl ) return false;
return pl->curstate.spectator;
// FIXME: check for proxie and dev_overview 2
return 0;
}
/*
@ -2451,7 +2448,7 @@ pfnSetUpPlayerPrediction
*/
void pfnSetUpPlayerPrediction( int dopred, int bIncludeLocalClient )
{
// FIXME: implement
// TODO: implement
}
/*
@ -2553,7 +2550,7 @@ model_t *CL_LoadModel( const char *modelname, int *index )
if( !idx ) return NULL;
if( index ) *index = idx;
return CM_ClipHandleToModel( idx );
return Mod_Handle( idx );
}
int CL_AddEntity( int entityType, cl_entity_t *pEnt )
@ -2698,7 +2695,7 @@ PlayerInfo_SetValueForKey
*/
void PlayerInfo_SetValueForKey( const char *key, const char *value )
{
// FIXME: implement
// TODO: implement
}
/*
@ -2709,7 +2706,7 @@ pfnGetPlayerUniqueID
*/
qboolean pfnGetPlayerUniqueID( int iPlayer, char playerID[16] )
{
// FIXME: implement
// TODO: implement
return false;
}
@ -3112,7 +3109,7 @@ Demo_WriteBuffer
*/
static void Demo_WriteBuffer( int size, byte *buffer )
{
// FIXME: implement
// TODO: implement
}
/*
@ -3129,7 +3126,7 @@ NetAPI_InitNetworking
*/
void NetAPI_InitNetworking( void )
{
// FIXME: implement
// TODO: implement
}
/*
@ -3140,7 +3137,7 @@ NetAPI_InitNetworking
*/
void NetAPI_Status( net_status_t *status )
{
// FIXME: implement
// TODO: implement
}
/*
@ -3151,7 +3148,7 @@ NetAPI_SendRequest
*/
void NetAPI_SendRequest( int context, int request, int flags, double timeout, netadr_t *remote_address, net_api_response_func_t response )
{
// FIXME: implement
// TODO: implement
}
/*
@ -3162,7 +3159,7 @@ NetAPI_CancelRequest
*/
void NetAPI_CancelRequest( int context )
{
// FIXME: implement
// TODO: implement
}
/*
@ -3173,7 +3170,7 @@ NetAPI_CancelAllRequests
*/
void NetAPI_CancelAllRequests( void )
{
// FIXME: implement
// TODO: implement
}
/*
@ -3271,7 +3268,7 @@ Voice_EndVoiceTweakMode
*/
void Voice_EndVoiceTweakMode( void )
{
// FIXME: implement
// TODO: implement
}
/*
@ -3282,7 +3279,7 @@ Voice_SetControlFloat
*/
void Voice_SetControlFloat( VoiceTweakControl iControl, float value )
{
// FIXME: implement
// TODO: implement
}
/*
@ -3293,7 +3290,7 @@ Voice_GetControlFloat
*/
float Voice_GetControlFloat( VoiceTweakControl iControl )
{
// FIXME: implement
// TODO: implement
return 1.0f;
}

View File

@ -248,15 +248,10 @@ CL_CreateCmd
usercmd_t CL_CreateCmd( void )
{
usercmd_t cmd;
static double extramsec = 0;
color24 color;
int ms;
// send milliseconds of time to apply the move
// extramsec += ( cl.time - cl.oldtime ) * 1000;
extramsec += ( host.frametime * 1000 );
ms = extramsec;
extramsec -= ms; // fractional part is left for next frame
ms = host.frametime * 1000;
if( ms > 250 ) ms = 100; // time was unreasonable
Mem_Set( &cmd, 0, sizeof( cmd ));
@ -284,9 +279,6 @@ usercmd_t CL_CreateCmd( void )
R_LightForPoint( cl.frame.local.client.origin, &color, false, 128.0f );
cmd.lightlevel = (color.r + color.g + color.b) / 3;
// random seed for predictable random values
cl.random_seed = Com_RandomLong( 0, 0x7fffffff ); // full range
// never let client.dll calc frametime for player
// because is potential backdoor for cheating
cmd.msec = ms;
@ -392,14 +384,14 @@ void CL_WritePacket( void )
{
cl.validsequence = 0;
}
// send a userinfo update if needed
if( userinfo->modified )
{
BF_WriteByte( &cls.netchan.message, clc_userinfo );
BF_WriteString( &cls.netchan.message, Cvar_Userinfo( ));
}
if( send_command )
{
int outgoing_sequence;
@ -442,16 +434,14 @@ void CL_WritePacket( void )
for( i = numcmds - 1; i >= 0; i-- )
{
cmdnumber = ( cls.netchan.outgoing_sequence - i ) & CL_UPDATE_MASK;
cmdnumber = ( outgoing_sequence - i ) & CL_UPDATE_MASK;
to = cmdnumber;
CL_WriteUsercmd( &buf, from, to );
from = to;
if( BF_CheckOverflow( &buf ))
{
Host_Error( "CL_Move, overflowed command buffer (%i bytes)\n", MAX_CMD_BUFFER );
}
}
// calculate a checksum over the move commands
@ -1033,7 +1023,7 @@ void CL_PrepVideo( void )
// let the render dll load the map
com.strncpy( mapname, cl.model_precache[1], MAX_STRING );
Mod_LoadWorld( mapname, &map_checksum );
cl.worldmodel = CM_ClipHandleToModel( 1 ); // get world pointer
cl.worldmodel = Mod_Handle( 1 ); // get world pointer
Cvar_SetFloat( "scr_loading", 25.0f );
SCR_RegisterShaders(); // update with new sequence
@ -1341,6 +1331,7 @@ void CL_Userinfo_f( void )
{
Msg( "User info settings:\n" );
Info_Print( Cvar_Userinfo( ));
Msg( "Total %i symbols\n", com.strlen( Cvar_Userinfo( )));
}
/*
@ -1439,6 +1430,7 @@ void CL_InitLocal( void )
Cvar_Get( "hud_scale", "0", CVAR_ARCHIVE|CVAR_LATCH, "scale hud at current resolution" );
Cvar_Get( "skin", "", CVAR_USERINFO, "player skin" ); // XDM 3.3 want this cvar
Cvar_Get( "spectator", "0", CVAR_USERINFO|CVAR_ARCHIVE, "1 is enable spectator mode" );
// server commands
Cmd_AddCommand ("noclip", NULL, "enable or disable no clipping mode" );
@ -1447,7 +1439,6 @@ void CL_InitLocal( void )
Cmd_AddCommand ("give", NULL, "give specified item or weapon" );
Cmd_AddCommand ("drop", NULL, "drop current/specified item or weapon" );
Cmd_AddCommand ("intermission", NULL, "go to intermission" );
Cmd_AddCommand ("spectate", NULL, "enable spectator mode" );
Cmd_AddCommand ("gametitle", NULL, "show game logo" );
Cmd_AddCommand ("god", NULL, "enable godmode" );
Cmd_AddCommand ("fov", NULL, "set client field of view" );
@ -1592,10 +1583,6 @@ void CL_Init( void )
cls.initialized = true;
cl.maxclients = 1; // allow to drawing player in menu
// g-cont. disable for now
Cvar_SetFloat( "cl_lw", 0 );
Cvar_SetFloat( "cl_predict", 0 );
}
@ -1603,8 +1590,6 @@ void CL_Init( void )
===============
CL_Shutdown
FIXME: this is a callback from Sys_Quit and Host_Error. It would be better
to run quit through here before the final handoff to the sys code.
===============
*/
void CL_Shutdown( void )

View File

@ -613,7 +613,7 @@ static void pfnSetPlayerModel( cl_entity_t *ent, const char *path )
{
Mod_RegisterModel( path, MAX_MODELS - 1 );
ent->curstate.modelindex = MAX_MODELS - 1;
ent->model = CM_ClipHandleToModel( MAX_MODELS - 1 );
ent->model = Mod_Handle( MAX_MODELS - 1 );
}
/*

View File

@ -306,7 +306,7 @@ void CL_ParseDownload( sizebuf_t *msg )
if( !cls.download )
{
msg->iCurBit += size << 3; // FIXME!!!
msg->iCurBit += size << 3;
MsgDev( D_ERROR, "failed to open %s\n", cls.downloadtempname );
CL_RequestNextDownload();
return;
@ -496,7 +496,7 @@ void CL_ParseStaticEntity( sizebuf_t *msg )
// R_AddEfrags( ent );
// FIXME: allocate client entity, add new static...
// TODO: allocate client entity, add new static...
MsgDev( D_ERROR, "Static entities are not implemented\n" );
}
@ -549,7 +549,7 @@ void CL_ParseReliableEvent( sizebuf_t *msg, int flags )
Mem_Set( &nullargs, 0, sizeof( nullargs ));
event_index = BF_ReadWord( msg ); // read event index
delay = BF_ReadWord( msg ) / 100.0f; // read event delay
MSG_ReadDeltaEvent( msg, &nullargs, &args ); // FIXME: zero-compressing
MSG_ReadDeltaEvent( msg, &nullargs, &args ); // TODO: delta-compressing
CL_QueueEvent( flags, event_index, delay, &args );
}
@ -605,6 +605,14 @@ void CL_ParseServerData( sizebuf_t *msg )
clgame.maxEntities = BF_ReadWord( msg );
com.strncpy( clgame.mapname, BF_ReadString( msg ), MAX_STRING );
com.strncpy( clgame.maptitle, BF_ReadString( msg ), MAX_STRING );
if( cl.playernum & 128 )
{
cl.spectator = true;
cl.playernum &= ~128;
}
else cl.spectator = false;
cl.refdef.viewentity = cl.playernum + 1; // always keep viewent an actual
menu.globals->maxClients = cl.maxclients;
@ -694,7 +702,6 @@ void CL_ParseClientData( sizebuf_t *msg )
}
}
cl.parsecount = i; // ack'd incoming messages.
cl.parsecountmod = cl.parsecount & CL_UPDATE_MASK; // index into window.
frame = &cl.frames[cl.parsecountmod]; // frame at index.
@ -702,7 +709,7 @@ void CL_ParseClientData( sizebuf_t *msg )
frame->time = cl.mtime[0]; // mark network received time
frame->receivedtime = host.realtime; // time now that we are parsing.
// Fixme, do this after all packets read for this frame?
// do this after all packets read for this frame?
cl.last_incoming_sequence = cls.netchan.incoming_sequence;
to_cd = &frame->local.client;
@ -1263,7 +1270,7 @@ void CL_ParseServerMessage( sizebuf_t *msg )
case svc_print:
i = BF_ReadByte( msg );
if( i == PRINT_CHAT ) // chat
S_StartLocalSound( "common/menu2.wav" ); // FIXME: INTRESOURCE
S_StartLocalSound( "common/menu2.wav" );
MsgDev( D_INFO, "^6%s\n", BF_ReadString( msg ));
break;
case svc_stufftext:

View File

@ -8,6 +8,7 @@
#include "const.h"
#include "cl_tent.h"
#include "pm_local.h"
#include "particledef.h"
void CL_ClearPhysEnts( void )
{
@ -19,12 +20,10 @@ void CL_ClearPhysEnts( void )
qboolean CL_CopyEntityToPhysEnt( physent_t *pe, cl_entity_t *ent )
{
model_t *mod = CM_ClipHandleToModel( ent->curstate.modelindex );
model_t *mod = Mod_Handle( ent->curstate.modelindex );
// NOTE: player never collide with sprites (even with solid sprites)
if( !mod || mod->type == mod_bad || mod->type == mod_sprite )
return false;
if( !mod ) return false;
pe->player = ent->player;
if( pe->player )
@ -65,10 +64,10 @@ qboolean CL_CopyEntityToPhysEnt( physent_t *pe, cl_entity_t *ent )
Mem_Copy( &pe->blending[0], &ent->curstate.blending[0], 2 * sizeof( byte ));
pe->movetype = ent->curstate.movetype;
pe->takedamage = ( pe->player ) ? DAMAGE_AIM : DAMAGE_YES; // FIXME: this right
pe->takedamage = ( pe->player ) ? DAMAGE_AIM : DAMAGE_YES;
pe->team = ent->curstate.team;
pe->classnumber = ent->curstate.playerclass;
pe->blooddecal = 0; // FIXME: what i'm do write here ???
pe->blooddecal = 0; // unused in GoldSrc
// for mods
pe->iuser1 = ent->curstate.iuser1;
@ -107,7 +106,17 @@ void CL_AddLinksToPmove( void )
check = CL_GetEntityByIndex( idx );
// don't add the world and clients here
if( !check || check == &clgame.entities[0] || check->player )
if( !check || check == &clgame.entities[0] )
continue;
if( clgame.pmove->numvisent < MAX_PHYSENTS )
{
pe = &clgame.pmove->visents[clgame.pmove->numvisent];
if( CL_CopyEntityToPhysEnt( pe, check ))
clgame.pmove->numvisent++;
}
if( check->player )
continue;
// can't collide with zeroed hull
@ -116,23 +125,22 @@ void CL_AddLinksToPmove( void )
if( check->curstate.solid == SOLID_BSP || check->curstate.solid == SOLID_BBOX || check->curstate.solid == SOLID_SLIDEBOX )
{
if( clgame.pmove->numphysent == MAX_PHYSENTS )
return;
pe = &clgame.pmove->physents[clgame.pmove->numphysent];
if( CL_CopyEntityToPhysEnt( pe, check ))
clgame.pmove->numphysent++;
// reserve slots for all the clients
if( clgame.pmove->numphysent < ( MAX_PHYSENTS - cl.maxclients ))
{
pe = &clgame.pmove->physents[clgame.pmove->numphysent];
if( CL_CopyEntityToPhysEnt( pe, check ))
clgame.pmove->numphysent++;
}
}
else if( check->curstate.solid == SOLID_NOT && check->curstate.skin != CONTENTS_NONE )
{
if( clgame.pmove->nummoveent >= MAX_MOVEENTS )
continue;
pe = &clgame.pmove->moveents[clgame.pmove->nummoveent];
if( CL_CopyEntityToPhysEnt( pe, check ))
clgame.pmove->nummoveent++;
if( clgame.pmove->nummoveent < MAX_MOVEENTS )
{
pe = &clgame.pmove->moveents[clgame.pmove->nummoveent];
if( CL_CopyEntityToPhysEnt( pe, check ))
clgame.pmove->nummoveent++;
}
}
}
}
@ -158,7 +166,6 @@ void CL_SetSolidPlayers( int playernum )
if( !cl_solid_players->integer )
return;
// FIXME: create predicted_players array
for( j = 0; j < cl.maxclients; j++ )
{
// the player object never gets added
@ -175,6 +182,12 @@ void CL_SetSolidPlayers( int playernum )
}
}
/*
=============
CL_TruePointContents
=============
*/
int CL_TruePointContents( const vec3_t p )
{
int i, contents;
@ -281,18 +294,23 @@ model_t *CL_GetWaterModel( const float *rgflPos )
static void pfnParticle( float *origin, int color, float life, int zpos, int zvel )
{
vec3_t dir;
particle_t *p;
if( !origin )
{
MsgDev( D_ERROR, "CL_StartParticle: NULL origin. Ignored\n" );
return;
}
// FIXME: send lifetime too
p = CL_AllocParticle( NULL );
if( !p ) return;
VectorSet( dir, 0.0f, 0.0f, ( zpos * zvel ));
CL_RunParticleEffect( origin, dir, color, 1 );
p->die += life;
p->color = color;
p->type = pt_static;
VectorCopy( origin, p->org );
VectorSet( p->vel, 0.0f, 0.0f, ( zpos * zvel ));
}
static int pfnTestPlayerPosition( float *pos, pmtrace_t *ptrace )
@ -309,10 +327,37 @@ static double Sys_FloatTime( void )
return Sys_DoubleTime();
}
static void pfnStuckTouch( int hitent, pmtrace_t *ptraceresult )
static void pfnStuckTouch( int hitent, pmtrace_t *tr )
{
// empty for now
// FIXME: write some code
physent_t *pe;
float *mins, *maxs;
int i;
ASSERT( hitent >= 0 && hitent < clgame.pmove->numphysent );
pe = &clgame.pmove->physents[hitent];
mins = clgame.pmove->player_mins[clgame.pmove->usehull];
maxs = clgame.pmove->player_maxs[clgame.pmove->usehull];
if( !PM_TraceModel( pe, clgame.pmove->origin, mins, maxs, clgame.pmove->origin, tr, 0 ))
return; // not stuck
tr->ent = hitent;
for( i = 0; i < clgame.pmove->numtouch; i++ )
{
if( clgame.pmove->touchindex[i].ent == tr->ent )
break;
}
if( i != clgame.pmove->numtouch ) return;
VectorCopy( clgame.pmove->velocity, tr->deltavelocity );
if( clgame.pmove->numtouch >= MAX_PHYSENTS )
{
MsgDev( D_ERROR, "PM_StuckTouch: MAX_TOUCHENTS limit exceeded\n" );
return;
}
clgame.pmove->touchindex[clgame.pmove->numtouch++] = *tr;
}
static int pfnPointContents( float *p, int *truecontents )
@ -419,7 +464,7 @@ static byte *pfnCOM_LoadFile( const char *path, int usehunk, int *pLength )
static void pfnCOM_FreeFile( void *buffer )
{
Mem_Free( buffer );
if( buffer ) Mem_Free( buffer );
}
static void pfnPlaySound( int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch )
@ -543,21 +588,23 @@ void CL_SetSolidEntities( void )
if( !cl.frame.valid ) return;
// setup physents
clgame.pmove->numvisent = 0; // FIXME: add visents for debugging
clgame.pmove->numvisent = 0;
clgame.pmove->numphysent = 0;
clgame.pmove->nummoveent = 0;
CL_CopyEntityToPhysEnt( &clgame.pmove->physents[0], &clgame.entities[0] );
clgame.pmove->visents[0] = clgame.pmove->physents[0];
clgame.pmove->numphysent = 1; // always have world
clgame.pmove->numvisent = 1;
CL_AddLinksToPmove();
}
static void PM_SetupMove( playermove_t *pmove, clientdata_t *cd, entity_state_t *state, usercmd_t *ucmd )
void CL_SetupPMove( playermove_t *pmove, clientdata_t *cd, entity_state_t *state, usercmd_t *ucmd )
{
pmove->player_index = cl.playernum;
pmove->multiplayer = (cl.maxclients > 1) ? true : false;
pmove->time = cl_time(); // probably never used
pmove->time = cl.time; // probably never used
VectorCopy( cd->origin, pmove->origin );
VectorCopy( cl.refdef.cl_viewangles, pmove->angles );
VectorCopy( cl.refdef.cl_viewangles, pmove->oldangles );
@ -583,7 +630,7 @@ static void PM_SetupMove( playermove_t *pmove, clientdata_t *cd, entity_state_t
pmove->waterjumptime = cd->waterjumptime;
pmove->dead = (cd->health <= 0.0f ) ? true : false;
pmove->deadflag = cd->deadflag;
pmove->spectator = 0; // FIXME: implement
pmove->spectator = cl.spectator;
pmove->movetype = state->movetype;
pmove->onground = -1; // will be set by PM_ code
pmove->waterlevel = cd->waterlevel;
@ -605,10 +652,4 @@ static void PM_SetupMove( playermove_t *pmove, clientdata_t *cd, entity_state_t
pmove->cmd = *ucmd; // setup current cmds
com.strncpy( pmove->physinfo, cd->physinfo, MAX_INFO_STRING );
}
static void PM_FinishMove( playermove_t *pmove, clientdata_t *cd, entity_state_t *state )
{
cd->waterjumptime = pmove->waterjumptime;
state->onground = pmove->onground;
}

View File

@ -29,11 +29,6 @@ qboolean CL_IsPredicted( void )
return true;
}
void CL_PreRunCmd( cl_entity_t *clent, usercmd_t *ucmd )
{
clgame.pmove->runfuncs = (( clent->index - 1 ) == cl.playernum ) ? true : false;
}
/*
===========
CL_PostRunCmd
@ -41,16 +36,14 @@ CL_PostRunCmd
Done after running a player command.
===========
*/
void CL_PostRunCmd( cl_entity_t *clent, usercmd_t *ucmd )
void CL_PostRunCmd( usercmd_t *ucmd, int random_seed )
{
local_state_t *from, *to;
if( !clent ) return;
from = &cl.frames[cl.delta_sequence & CL_UPDATE_MASK].local;
to = &cl.frame.local;
clgame.dllFuncs.pfnPostRunCmd( from, to, ucmd, clgame.pmove->runfuncs, cl.time, cl.random_seed );
clgame.dllFuncs.pfnPostRunCmd( from, to, ucmd, clgame.pmove->runfuncs, cl.time, random_seed );
}
/*
@ -60,22 +53,18 @@ CL_CheckPredictionError
*/
void CL_CheckPredictionError( void )
{
int frame;
vec3_t delta;
cl_entity_t *player;
float flen;
int frame;
vec3_t delta;
float flen;
if( !CL_IsPredicted( )) return;
player = CL_GetLocalPlayer();
if( !player ) return;
// calculate the last usercmd_t we sent that the server has processed
frame = cls.netchan.incoming_acknowledged;
frame &= CL_UPDATE_MASK;
// compare what the server returned with what we had predicted it to be
VectorSubtract( player->curstate.origin, cl.predicted_origins[frame], delta );
VectorSubtract( cl.frame.local.client.origin, cl.predicted_origins[frame], delta );
// save the prediction error for interpolation
flen = fabs( delta[0] ) + fabs( delta[1] ) + fabs( delta[2] );
@ -88,7 +77,7 @@ void CL_CheckPredictionError( void )
else
{
if( cl_showmiss->integer && flen > 0.1f ) Msg( "prediction miss: %g\n", flen );
VectorCopy( player->curstate.origin, cl.predicted_origins[frame] );
VectorCopy( cl.frame.local.client.origin, cl.predicted_origins[frame] );
// save for error itnerpolation
VectorCopy( delta, cl.prediction_error );
@ -169,11 +158,12 @@ Sets cl.predicted_origin and cl.predicted_angles
*/
void CL_PredictMovement( void )
{
int frame = 0;
int ack, current;
int frame = 1;
int ack, outgoing_command;
int current_command;
int current_command_mod;
cl_entity_t *player, *viewent;
clientdata_t *cd;
usercmd_t *cmd;
if( cls.state != ca_active ) return;
if( cl.refdef.paused || cls.key_dest == key_menu ) return;
@ -195,59 +185,58 @@ void CL_PredictMovement( void )
// unpredicted pure angled values converted into axis
AngleVectors( cl.refdef.cl_viewangles, cl.refdef.forward, cl.refdef.right, cl.refdef.up );
if( 1 )//// disabled for now!!!!!!!!!!!!!!!!!!!!!!!!! ///////!CL_IsPredicted( ))
if( !CL_IsPredicted( ))
{
cmd = cl.refdef.cmd; // use current command
// run commands even if client predicting is disabled - client expected it
CL_PreRunCmd( player, cmd );
clgame.pmove->runfuncs = true;
VectorCopy( cl.refdef.cl_viewangles, cl.predicted_angles );
VectorCopy( cd->view_ofs, cl.predicted_viewofs );
CL_PostRunCmd( player, cmd );
CL_PostRunCmd( cl.refdef.cmd, cls.netchan.outgoing_sequence );
return;
}
ack = cls.netchan.incoming_acknowledged;
current = cls.netchan.outgoing_sequence;
outgoing_command = cls.netchan.outgoing_sequence;
ASSERT( cl.refdef.cmd != NULL );
// if we are too far out of date, just freeze
if( current - ack >= CMD_BACKUP )
{
if( cl_showmiss->value )
MsgDev( D_ERROR, "CL_Predict: exceeded CMD_BACKUP\n" );
return;
}
#if 0
// setup initial pmove state
// FIXME!!!!...
// VectorCopy( player->v.movedir, clgame.pmove->movedir );
VectorCopy( cd->origin, clgame.pmove->origin );
VectorCopy( cd->velocity, clgame.pmove->velocity );
VectorCopy( player->curstate.basevelocity, clgame.pmove->basevelocity );
clgame.pmove->flWaterJumpTime = cd->waterjumptime;
clgame.pmove->onground = (edict_t *)CL_GetEntityByIndex( player->curstate.onground );
clgame.pmove->usehull = (player->curstate.flags & FL_DUCKING) ? 1 : 0; // reset hull
// run frames
while( ++ack < current )
{
frame = ack & CL_UPDATE_MASK;
cmd = &cl.cmds[frame];
CL_SetupPMove( clgame.pmove, cd, &player->curstate, cl.refdef.cmd );
clgame.pmove->runfuncs = false;
CL_PreRunCmd( player, cmd );
CL_RunCmd( player, cmd );
CL_PostRunCmd( player, cmd );
while( 1 )
{
// we've run too far forward
if( frame >= CL_UPDATE_BACKUP - 1 )
break;
// Incoming_acknowledged is the last usercmd the server acknowledged having acted upon
current_command = ack + frame;
current_command_mod = current_command & CL_UPDATE_MASK;
// we've caught up to the current command.
if( current_command > outgoing_command )
break;
clgame.pmove->cmd = cl.cmds[frame];
// motor!
clgame.dllFuncs.pfnPlayerMove( clgame.pmove, false ); // run frames
// save for debug checking
VectorCopy( clgame.pmove->origin, cl.predicted_origins[frame] );
VectorCopy( clgame.pmove->origin, cl.predicted_origins[frame-1] );
clgame.pmove->runfuncs = true;
frame++;
}
CL_PostRunCmd( cl.refdef.cmd, frame );
// copy results out for rendering
VectorCopy( player->v.view_ofs, cl.predicted_viewofs );
VectorCopy( clgame.pmove->view_ofs, cl.predicted_viewofs );
VectorCopy( clgame.pmove->origin, cl.predicted_origin );
VectorCopy( clgame.pmove->angles, cl.predicted_angles );
VectorCopy( clgame.pmove->velocity, cl.predicted_velocity );
#endif
}
}

View File

@ -6,7 +6,6 @@
#include "common.h"
#include "client.h"
#include "r_efx.h"
#include "event_flags.h"
#include "entity_types.h"
#include "triangleapi.h"
#include "cl_tent.h"
@ -430,7 +429,7 @@ void CL_FizzEffect( cl_entity_t *pent, int modelIndex, int density )
Mod_GetBounds( pent->curstate.modelindex, mins, maxs );
maxHeight = ( maxs[2] - mins[2] ) * 0.5f;
maxHeight = maxs[2] - mins[2];
width = maxs[0] - mins[0];
depth = maxs[1] - mins[1];
speed = ( pent->curstate.rendercolor.r<<8 | pent->curstate.rendercolor.g );
@ -455,7 +454,7 @@ void CL_FizzEffect( cl_entity_t *pent, int modelIndex, int density )
origin[0] = mins[0] + Com_RandomLong( 0, width - 1 );
origin[1] = mins[1] + Com_RandomLong( 0, depth - 1 );
origin[2] = mins[2];
pTemp = CL_TempEntAlloc( origin, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAlloc( origin, Mod_Handle( modelIndex ));
if ( !pTemp ) return;
@ -500,7 +499,7 @@ void CL_Bubbles( const vec3_t mins, const vec3_t maxs, float height, int modelIn
origin[0] = Com_RandomLong( mins[0], maxs[0] );
origin[1] = Com_RandomLong( mins[1], maxs[1] );
origin[2] = Com_RandomLong( mins[2], maxs[2] );
pTemp = CL_TempEntAlloc( origin, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAlloc( origin, Mod_Handle( modelIndex ));
if( !pTemp ) return;
pTemp->flags |= FTENT_SINEWAVE;
@ -546,7 +545,7 @@ void CL_BubbleTrail( const vec3_t start, const vec3_t end, float flWaterZ, int m
{
dist = Com_RandomFloat( 0, 1.0 );
VectorLerp( start, dist, end, origin );
pTemp = CL_TempEntAlloc( origin, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAlloc( origin, Mod_Handle( modelIndex ));
if( !pTemp ) return;
pTemp->flags |= FTENT_SINEWAVE;
@ -601,7 +600,7 @@ void CL_AttachTentToPlayer( int client, int modelIndex, float zoffset, float lif
VectorCopy( pClient->origin, position );
position[2] += zoffset;
pTemp = CL_TempEntAllocHigh( position, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAllocHigh( position, Mod_Handle( modelIndex ));
if( !pTemp )
{
@ -709,7 +708,7 @@ void CL_RocketFlare( const vec3_t pos )
int nframeCount;
modelIndex = CL_FindModelIndex( "sprites/animglow01.spr" );
pmodel = CM_ClipHandleToModel( modelIndex );
pmodel = Mod_Handle( modelIndex );
if( !pmodel ) return;
Mod_GetFrames( modelIndex, &nframeCount );
@ -751,7 +750,7 @@ void CL_MuzzleFlash( const vec3_t pos, int type )
Mod_GetFrames( modelIndex, &frameCount );
// must set position for right culling on render
pTemp = CL_TempEntAllocHigh( pos, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAllocHigh( pos, Mod_Handle( modelIndex ));
if( !pTemp ) return;
pTemp->entity.curstate.rendermode = kRenderTransAdd;
pTemp->entity.curstate.renderamt = 255;
@ -791,7 +790,7 @@ void CL_BloodSprite( const vec3_t org, int colorIndex, int modelIndex, int model
return;
// Large, single blood sprite is a high-priority tent
if(( pTemp = CL_TempEntAllocHigh( org, CM_ClipHandleToModel( modelIndex ))) != NULL )
if(( pTemp = CL_TempEntAllocHigh( org, Mod_Handle( modelIndex ))) != NULL )
{
int i, frameCount;
vec3_t offset, dir;
@ -826,7 +825,7 @@ void CL_BloodSprite( const vec3_t org, int colorIndex, int modelIndex, int model
VectorMA( offset, Com_RandomFloat( -0.5f, 0.5f ) * size, right, offset );
VectorMA( offset, Com_RandomFloat( -0.5f, 0.5f ) * size, up, offset );
pTemp = CL_TempEntAllocHigh( org, CM_ClipHandleToModel( modelIndex2 ));
pTemp = CL_TempEntAllocHigh( org, Mod_Handle( modelIndex2 ));
if( !pTemp ) return;
pTemp->flags = FTENT_SPRANIMATELOOP|FTENT_COLLIDEWORLD|FTENT_SLOWGRAVITY;
@ -892,7 +891,7 @@ void CL_BreakModel( const vec3_t pos, const vec3_t size, const vec3_t dir, float
vecSpot[1] = pos[1] + Com_RandomFloat( -0.5f, 0.5f ) * size[1];
vecSpot[2] = pos[2] + Com_RandomFloat( -0.5f, 0.5f ) * size[2];
pTemp = CL_TempEntAlloc( vecSpot, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAlloc( vecSpot, Mod_Handle( modelIndex ));
if( !pTemp ) return;
// keep track of break_type, so we know how to play sound on collision
@ -947,7 +946,7 @@ TEMPENTITY *CL_TempModel( const vec3_t pos, const vec3_t dir, const vec3_t angle
// alloc a new tempent
TEMPENTITY *pTemp;
pTemp = CL_TempEntAlloc( pos, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAlloc( pos, Mod_Handle( modelIndex ));
if( !pTemp ) return NULL;
// keep track of shell type
@ -997,7 +996,7 @@ TEMPENTITY *CL_DefaultSprite( const vec3_t pos, int spriteIndex, float framerate
Mod_GetFrames( spriteIndex, &frameCount );
pTemp = CL_TempEntAlloc( pos, CM_ClipHandleToModel( spriteIndex ));
pTemp = CL_TempEntAlloc( pos, Mod_Handle( spriteIndex ));
if( !pTemp ) return NULL;
pTemp->frameMax = frameCount - 1;
@ -1035,7 +1034,7 @@ TEMPENTITY *CL_TempSprite( const vec3_t pos, const vec3_t dir, float scale, int
Mod_GetFrames( modelIndex, &frameCount );
pTemp = CL_TempEntAlloc( pos, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAlloc( pos, Mod_Handle( modelIndex ));
if( !pTemp ) return NULL;
pTemp->frameMax = frameCount - 1;
@ -1159,7 +1158,7 @@ void CL_Spray( const vec3_t pos, const vec3_t dir, int modelIndex, int count, in
vec3_t velocity;
float scale;
pTemp = CL_TempEntAlloc( pos, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAlloc( pos, Mod_Handle( modelIndex ));
if( !pTemp ) return;
pTemp->entity.curstate.rendermode = renderMode;
@ -1226,7 +1225,7 @@ void CL_Sprite_Trail( int type, const vec3_t vecStart, const vec3_t vecEnd, int
if( i == 0 ) VectorCopy( vecStart, vecPos );
else VectorMA( vecStart, ( i / ( nCount - 1.0f )), vecDelta, vecPos );
pTemp = CL_TempEntAlloc( vecPos, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAlloc( vecPos, Mod_Handle( modelIndex ));
if( !pTemp ) return;
pTemp->flags |= FTENT_COLLIDEWORLD | FTENT_SPRCYCLE | FTENT_FADEOUT | FTENT_SLOWGRAVITY;
@ -1290,7 +1289,7 @@ void CL_FunnelSprite( const vec3_t pos, int spriteIndex, int flags )
}
else
{
pTemp = CL_TempEntAlloc( pos, CM_ClipHandleToModel( spriteIndex ));
pTemp = CL_TempEntAlloc( pos, Mod_Handle( spriteIndex ));
pPart = NULL;
}
@ -1366,7 +1365,7 @@ void CL_SparkEffect( const vec3_t pos, int count, int velocityMin, int velocityM
model_t *pmodel;
int i;
pmodel = CM_ClipHandleToModel( CL_FindModelIndex( "sprites/richo1.spr" ));
pmodel = Mod_Handle( CL_FindModelIndex( "sprites/richo1.spr" ));
CL_RicochetSprite( pos, pmodel, 0.0f, Com_RandomFloat( 0.4f, 0.6f ));
for( i = 0; i < Com_RandomLong( 1, count ); i++ )
@ -1464,7 +1463,7 @@ void CL_Projectile( const vec3_t origin, const vec3_t velocity, int modelIndex,
// alloc a new tempent
TEMPENTITY *pTemp;
pTemp = CL_TempEntAlloc( origin, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAlloc( origin, Mod_Handle( modelIndex ));
if( !pTemp ) return;
VectorAngles( velocity, pTemp->entity.angles );
@ -1497,7 +1496,7 @@ void CL_TempSphereModel( const vec3_t pos, float speed, float life, int count, i
// create temp models
for( i = 0; i < count; i++ )
{
pTemp = CL_TempEntAlloc( pos, CM_ClipHandleToModel( modelIndex ));
pTemp = CL_TempEntAlloc( pos, Mod_Handle( modelIndex ));
if( !pTemp ) return;
dir[0] = forward[0] + Com_RandomFloat( -0.3f, 0.3f );
@ -1577,7 +1576,7 @@ Client version of shotgun shot
*/
void CL_MultiGunshot( const vec3_t org, const vec3_t dir, const vec3_t noise, int count, int decalCount, int *decalIndices )
{
// FIXME: implement
// TODO: implement
}
/*
@ -1589,7 +1588,7 @@ Makes a field of fire
*/
void CL_FireField( float *org, int radius, int modelIndex, int count, int flags, float life )
{
// FIXME: implement
// TODO: implement
}
/*
@ -1601,7 +1600,7 @@ Create a wallpuff
*/
void CL_Sprite_WallPuff( TEMPENTITY *pTemp, float scale )
{
// FIXME: implement
// TODO: implement
}
/*
@ -1613,7 +1612,16 @@ Unknown effect
*/
void CL_PlayerSprites( int client, int modelIndex, int count, int size )
{
// in GoldSrc any trying to create this effect will invoke immediately crash
#if 0
// TODO: implement
MESSAGE_BEGIN( MSG_ONE, SVC_TEMPENTITY, g_vecZero, pev );
WRITE_BYTE( TE_PLAYERSPRITES );
WRITE_SHORT( ENTINDEX( ENT( pev ) ) );
WRITE_SHORT( g_sModelIndexFire );
WRITE_BYTE( 20 );
WRITE_BYTE( 10 );
MESSAGE_END( );
#endif
}
/*
@ -1980,7 +1988,7 @@ void CL_ParseTempEntity( sizebuf_t *msg )
pos[2] = BF_ReadCoord( &buf );
scale = (float)(BF_ReadByte( &buf ) * 0.1f);
modelIndex = CL_FindModelIndex( "sprites/richo1.spr" );
CL_RicochetSprite( pos, CM_ClipHandleToModel( modelIndex ), 0.0f, scale );
CL_RicochetSprite( pos, Mod_Handle( modelIndex ), 0.0f, scale );
CL_RicochetSound( pos );
break;
case TE_PLAYERDECAL:
@ -2341,21 +2349,8 @@ void CL_UpadteFlashlight( cl_entity_t *pEnt )
VectorClear( view_ofs );
// FIXME: grab viewheight from other place
view_ofs[2] = 28.0f;
if( pEnt->player )
{
if(( pEnt->index - 1 ) == cl.playernum )
{
VectorCopy( cl.predicted_viewofs, view_ofs );
}
else if( pEnt->curstate.usehull == 1 )
{
// FIXME: grab ducked viewheight from other place
view_ofs[2] = 12.0f;
}
}
if(( pEnt->index - 1 ) == cl.playernum )
VectorCopy( cl.predicted_viewofs, view_ofs );
VectorAdd( pEnt->origin, view_ofs, vecSrc );
VectorMA( vecSrc, FLASHLIGHT_DISTANCE, forward, vecEnd );
@ -2366,7 +2361,7 @@ void CL_UpadteFlashlight( cl_entity_t *pEnt )
if( falloff < 250.0f ) falloff = 1.0f;
else falloff = 250.0f / falloff;
falloff *= falloff;
falloff *= falloff;
// update flashlight endpos
dl = CL_AllocDlight( cl.playernum + 1 );

View File

@ -36,7 +36,7 @@ void V_SetupRefDef( void )
VectorCopy( cl.frame.local.client.punchangle, cl.refdef.punchangle );
clgame.viewent.curstate.modelindex = cl.frame.local.client.viewmodel;
clgame.viewent.model = CM_ClipHandleToModel( clgame.viewent.curstate.modelindex );
clgame.viewent.model = Mod_Handle( clgame.viewent.curstate.modelindex );
clgame.viewent.curstate.entityType = ET_NORMAL;
clgame.viewent.index = cl.playernum + 1;
@ -52,8 +52,9 @@ void V_SetupRefDef( void )
cl.refdef.smoothing = cl_smooth->integer;
cl.refdef.waterlevel = cl.frame.local.client.waterlevel;
cl.refdef.onlyClientDraw = 0; // reset clientdraw
cl.refdef.viewsize = 120; // FIXME if you can
cl.refdef.viewsize = 120; // probably was 'scr_viewsize' or somewhat
cl.refdef.hardware = true; // always true
cl.refdef.spectator = cl.spectator;
cl.refdef.nextView = 0;
// setup default viewport

View File

@ -86,6 +86,7 @@ typedef struct
qboolean force_send_usercmd;
qboolean thirdperson;
qboolean spectator; // true for spectators
uint checksum; // for catching cheater maps
@ -110,7 +111,6 @@ typedef struct
event_state_t events;
// predicting stuff
uint random_seed; // for predictable random values
vec3_t predicted_origins[CMD_BACKUP]; // for debug comparing against server
vec3_t predicted_origin; // generated by CL_PredictMovement
vec3_t predicted_viewofs;
@ -628,6 +628,7 @@ int CL_TruePointContents( const vec3_t p );
int CL_PointContents( const vec3_t p );
int CL_WaterEntity( const float *rgflPos );
model_t *CL_GetWaterModel( const float *rgflPos );
void CL_SetupPMove( playermove_t *pmove, clientdata_t *cd, entity_state_t *state, usercmd_t *ucmd );
//
// cl_studio.c

View File

@ -173,7 +173,7 @@ static void CL_DrawSegs( int modelIndex, float frame, int rendermode, const vec3
if( !cl_draw_beams->integer )
return;
m_hSprite = R_GetSpriteTexture( CM_ClipHandleToModel( modelIndex ), frame );
m_hSprite = R_GetSpriteTexture( Mod_Handle( modelIndex ), frame );
if( !m_hSprite || segments < 2 )
return;
@ -388,7 +388,7 @@ static void CL_DrawDisk( int modelIndex, float frame, int rendermode, const vec3
vec3_t point;
int i;
m_hSprite = R_GetSpriteTexture( CM_ClipHandleToModel( modelIndex ), frame );
m_hSprite = R_GetSpriteTexture( Mod_Handle( modelIndex ), frame );
if( !m_hSprite || segments < 2 )
return;
@ -459,7 +459,7 @@ static void CL_DrawCylinder( int modelIndex, float frame, int rendermode, const
vec3_t point;
int i;
m_hSprite = R_GetSpriteTexture( CM_ClipHandleToModel( modelIndex ), frame );
m_hSprite = R_GetSpriteTexture( Mod_Handle( modelIndex ), frame );
if( !m_hSprite || segments < 2 )
return;
@ -534,7 +534,7 @@ void CL_DrawRing( int modelIndex, float frame, int rendermode, const vec3_t sour
HSPRITE m_hSprite;
vec3_t d;
m_hSprite = R_GetSpriteTexture( CM_ClipHandleToModel( modelIndex ), frame );
m_hSprite = R_GetSpriteTexture( Mod_Handle( modelIndex ), frame );
if( !m_hSprite || segments < 2 )
return;
@ -740,7 +740,7 @@ static void DrawBeamFollow( int modelIndex, particle_t *pHead, int frame, int re
HSPRITE m_hSprite;
rgb_t nColor;
m_hSprite = R_GetSpriteTexture( CM_ClipHandleToModel( modelIndex ), frame );
m_hSprite = R_GetSpriteTexture( Mod_Handle( modelIndex ), frame );
if( !m_hSprite )
return;

View File

@ -23,7 +23,6 @@ typedef struct
vec2_t m_LMCoords; // lightmap texcoords for the decal.
} decalvert_t;
// FIXME: move this out to the r_math.c ?
typedef struct
{
qboolean (*pfnInside)( decalvert_t *pVert );
@ -731,8 +730,8 @@ void R_DecalShoot( int textureIndex, int entityIndex, int modelIndex, vec3_t pos
{
ent = CL_GetEntityByIndex( entityIndex );
if( modelIndex > 0 ) model = CM_ClipHandleToModel( modelIndex );
else if( ent != NULL ) model = CM_ClipHandleToModel( ent->curstate.modelindex );
if( modelIndex > 0 ) model = Mod_Handle( modelIndex );
else if( ent != NULL ) model = Mod_Handle( ent->curstate.modelindex );
else
{
Msg( "ent = NULL, model = NULL on entity %i, model %i\n", entityIndex, modelIndex );
@ -740,7 +739,7 @@ void R_DecalShoot( int textureIndex, int entityIndex, int modelIndex, vec3_t pos
}
}
else if( modelIndex > 0 )
model = CM_ClipHandleToModel( modelIndex );
model = Mod_Handle( modelIndex );
else model = cl.worldmodel;
if( !model || model->type != mod_brush )
@ -800,7 +799,6 @@ void R_DecalShoot( int textureIndex, int entityIndex, int modelIndex, vec3_t pos
if(( height >> 1 ) > decalInfo.m_Size )
decalInfo.m_Size = height >> 1;
// FIXME: grab scale from shader ?
decalInfo.m_scale = 1.0f;
// compute the decal dimensions in world space

View File

@ -800,7 +800,8 @@ static void GL_UploadTexture( rgbdata_t *pic, gltexture_t *tex, qboolean subImag
buf = pic->buffer;
bufend = pic->buffer + pic->size;
offset = pic->width * pic->height * PFDesc( pic->type )->bpp;
// FIXME: probably this code relies when gl_compressed_textures is enabled
// NOTE: probably this code relies when gl_compressed_textures is enabled
texsize = tex->width * tex->height * samples;
// determine some texTypes

View File

@ -157,7 +157,6 @@ void R_AddEfrags( cl_entity_t *ent )
================
R_StoreEfrags
FIXME: a lot of this goes away with edge-based
================
*/
void R_StoreEfrags( efrag_t **ppefrag )

View File

@ -454,7 +454,7 @@ void R_LightDir( const vec3_t origin, vec3_t lightDir, float radius )
}
}
// FIXME: should we normalize final direction ?
// normalize final direction
// VectorNormalize( lightDir );
}

View File

@ -167,7 +167,7 @@ qboolean R_WorldToScreen( const vec3_t point, vec3_t screen )
void R_ScreenToWorld( const vec3_t screen, vec3_t point )
{
// FIXME: implement
// TODO: implement
}
/*
@ -832,7 +832,6 @@ void R_DrawEntitiesOnList( void )
clgame.dllFuncs.pfnDrawTransparentTriangles ();
// FIXME: allow to brush and sprite viewmodel ?
R_DrawViewModel();
}

View File

@ -18,7 +18,6 @@ void R_NewMap( void )
R_SetupSky( cl.refdef.movevars->skyName );
// clear out efrags in case the level hasn't been reloaded
// FIXME: is this one short?
for( i = 0; i < cl.worldmodel->numleafs; i++ )
cl.worldmodel->leafs[i].efrags = NULL;

View File

@ -23,7 +23,7 @@ PARTICLES MANAGEMENT
#define NUMVERTEXNORMALS 162
#define SPARK_COLORCOUNT 9
#define TRACER_WIDTH 0.5f // FIXME: tune this
#define TRACER_WIDTH 0.5f
#define SIMSHIFT 10
// particle velocities
@ -1421,7 +1421,7 @@ void CL_SparkShower( const vec3_t org )
pos[1] = org[1] + Com_RandomFloat( -2.0f, 2.0f );
pos[2] = org[2] + Com_RandomFloat( -2.0f, 2.0f );
pmodel = CM_ClipHandleToModel( CL_FindModelIndex( "sprites/richo1.spr" ));
pmodel = Mod_Handle( CL_FindModelIndex( "sprites/richo1.spr" ));
CL_RicochetSprite( pos, pmodel, 0.0f, Com_RandomFloat( 0.4, 0.6f ));
// create a 8 random spakle tracers

View File

@ -998,7 +998,6 @@ void R_DrawBrushModel( cl_entity_t *e )
case kRenderTransTexture:
case kRenderTransInverse:
need_sort = true;
case kRenderTransAlpha:
case kRenderGlow:
pglColor4ub( 255, 255, 255, e->curstate.renderamt );
break;
@ -1007,7 +1006,8 @@ void R_DrawBrushModel( cl_entity_t *e )
pglColor4ub( e->curstate.rendercolor.r, e->curstate.rendercolor.g,
e->curstate.rendercolor.b, e->curstate.renderamt );
break;
default:
case kRenderTransAlpha:
default:
pglColor4ub( 255, 255, 255, 255 );
break;
}
@ -1530,7 +1530,7 @@ void GL_BuildLightmaps( void )
for( i = 1; i < MAX_MODELS; i++ )
{
if(( m = CM_ClipHandleToModel( i )) == NULL )
if(( m = Mod_Handle( i )) == NULL )
continue;
if( m->name[0] == '*' || m->type != mod_brush )
@ -1574,7 +1574,7 @@ void GL_BuildLightmaps( void )
r_lightmap.height = BLOCK_HEIGHT;
r_lightmap.type = PF_RGBA_32;
r_lightmap.size = r_lightmap.width * r_lightmap.height * 4;
r_lightmap.flags = IMAGE_HAS_COLOR; // FIXME: detecting grayscale lightmaps for quake1
r_lightmap.flags = ( world.version == Q1BSP_VERSION ) ? 0 : IMAGE_HAS_COLOR;
r_lightmap.buffer = (byte *)&r_lmState.lightmaps[r_lightmap.size*i];
tr.lightmapTextures[i] = GL_LoadTextureInternal( lmName, &r_lightmap, TF_FONT|TF_LIGHTMAP, false );
GL_SetTextureType( tr.lightmapTextures[i], TEX_LIGHTMAP );

View File

@ -949,7 +949,6 @@ void R_StudioCalcRotations( cl_entity_t *e, float pos[][3], vec4_t *q, mstudiose
if( pseqdesc->motiontype & STUDIO_Y ) pos[pseqdesc->motionbone][1] = 0.0f;
if( pseqdesc->motiontype & STUDIO_Z ) pos[pseqdesc->motionbone][2] = 0.0f;
// FIXME: enable this ? Half-Life 2 get rid of this code
s = 0 * ((1.0f - (f - (int)(f))) / (pseqdesc->numframes)) * e->curstate.framerate;
if( pseqdesc->motiontype & STUDIO_LX ) pos[pseqdesc->motionbone][0] += s * pseqdesc->linearmovement[0];
@ -1278,8 +1277,6 @@ static void R_StudioCalcAttachments( void )
VectorSubtract( localOrg, bonepos, forward ); // make forward
VectorNormalizeFast( forward );
VectorAngles( forward, localAng );
// FIXME: store attachment angles
}
}
@ -1561,7 +1558,6 @@ void R_StudioLighting( float *lv, int bone, int flags, vec3_t normal )
===============
R_StudioSetupSkin
FIXME: this is correct ?
===============
*/
static void R_StudioSetupSkin( mstudiotexture_t *ptexture, int index )
@ -1626,7 +1622,6 @@ static void R_StudioDrawPoints( void )
{
R_StudioLighting( lv, *pnormbone, flags, (float *)pstudionorms );
// FIXME: move this check out of the inner loop
if(( flags & STUDIO_NF_CHROME ) || ( g_nFaceFlags & STUDIO_NF_CHROME ))
R_StudioSetupChrome( g_chrome[(float (*)[3])lv - g_lightvalues], *pnormbone, (float *)pstudionorms );
}
@ -1719,7 +1714,7 @@ R_StudioDrawHulls
*/
static void R_StudioDrawHulls( void )
{
// FIXME: implement
// TODO: implement
}
/*
@ -1774,7 +1769,7 @@ R_StudioDrawBones
*/
static void R_StudioDrawBones( void )
{
// FIXME: implement
// TODO: implement
}
static void R_StudioDrawAttachments( void )
@ -1830,7 +1825,7 @@ R_StudioSetRemapColors
*/
void R_StudioSetRemapColors( int top, int bottom )
{
// FIXME: implement
// TODO: implement
}
/*
@ -2038,7 +2033,7 @@ R_StudioSetChromeOrigin
*/
void R_StudioSetChromeOrigin( void )
{
// FIXME: implement
// TODO: implement
}
/*
@ -2066,7 +2061,7 @@ static void GL_StudioDrawShadow( void )
// this code is for HL compatibility.
return;
// FIXME: implement
// TODO: implement
MsgDev( D_INFO, "GL_StudioDrawShadow()\n" ); // just a debug
}
@ -2417,7 +2412,7 @@ static int R_StudioDrawPlayer( int flags, entity_state_t *pplayer )
if( pplayer->weaponmodel )
{
cl_entity_t saveent = *RI.currententity;
model_t *pweaponmodel = CM_ClipHandleToModel( pplayer->weaponmodel );
model_t *pweaponmodel = Mod_Handle( pplayer->weaponmodel );
m_pStudioHeader = (studiohdr_t *)Mod_Extradata( pweaponmodel );
@ -2788,7 +2783,7 @@ static engine_studio_api_t gStudioAPI =
Mod_LoadCacheFile,
Mod_ForName,
Mod_Extradata,
CM_ClipHandleToModel,
Mod_Handle,
pfnGetCurrentEntity,
pfnPlayerInfo,
R_StudioGetPlayerState,

View File

@ -714,7 +714,7 @@ static int VID_ChoosePFD( PIXELFORMATDESCRIPTOR *pfd, int colorBits, int alphaBi
pfd->dwVisibleMask = 0;
pfd->dwDamageMask = 0;
// Count PFDs
// count PFDs
if( glw_state.minidriver )
pixelFormat = pwglChoosePixelFormat( glw_state.hDC, pfd );
else pixelFormat = ChoosePixelFormat( glw_state.hDC, pfd );
@ -1242,7 +1242,8 @@ qboolean R_Init_OpenGL( void )
Sys_LoadLibrary( NULL, &opengl_dll ); // load opengl32.dll
if( !opengl_dll.link ) return false;
glw_state.minidriver = false; // FIXME: allow 3dfx drivers too
// TODO: allow 3dfx drivers too
glw_state.minidriver = false;
return VID_SetMode();
}

View File

@ -96,6 +96,6 @@ void Mod_AmbientLevels( const vec3_t p, byte *pvolumes );
byte *Mod_CompressVis( const byte *in, size_t *size );
byte *Mod_DecompressVis( const byte *in );
modtype_t Mod_GetType( int handle );
model_t *CM_ClipHandleToModel( int handle );
model_t *Mod_Handle( int handle );
#endif//CM_LOCAL_H

View File

@ -644,12 +644,12 @@ void Con_Print( const char *txt )
void Con_NPrintf( int idx, char *fmt, ... )
{
// FIXME: implement
// TODO: implement
}
void Con_NXPrintf( con_nprint_t *info, char *fmt, ... )
{
// FIXME: imeplemnt
// TODO: imeplemnt
}
/*

View File

@ -377,7 +377,7 @@ int pfnAddCommand( const char *cmd_name, xcommand_t func )
return 0;
// NOTE: if( func == NULL ) cmd will be forwarded to a server
Cmd_AddCommand( cmd_name, func, "" );
Cmd_AddCommand( cmd_name, func, "game command" );
return 1;
}

View File

@ -315,35 +315,6 @@ void Host_EventLoop( void )
}
}
/*
===================
Host_RestartAmbientSounds
Restarts the sounds to let demo writing them
===================
*/
void Host_RestartAmbientSounds( void )
{
soundlist_t soundInfo[100];
int i, nSounds;
if( !SV_Active( )) return;
nSounds = S_GetCurrentStaticSounds( soundInfo, 100 );
for( i = 0; i < nSounds; i++)
{
if( soundInfo[i].looping && soundInfo[i].entnum != -1 )
{
S_StopSound( soundInfo[i].entnum, CHAN_STATIC, soundInfo[i].name );
// FIXME: replace with SV_StartAmbientSound
SV_StartSound( pfnPEntityOfEntIndex( soundInfo[i].entnum ), CHAN_STATIC,
soundInfo[i].name, soundInfo[i].volume, soundInfo[i].attenuation, 0, soundInfo[i].pitch );
}
}
}
/*
===================
Host_FilterTime

View File

@ -471,9 +471,9 @@ long IN_WndProc( void *hWnd, uint uMsg, uint wParam, long lParam )
else fActivate = true; // video sucessfully restarted
wnd_caption = GetSystemMetrics( SM_CYCAPTION ) + WND_BORDER;
S_Activate( fActivate, host.hWnd );
Key_ClearStates(); // FIXME!!!
S_Activate( fActivate, host.hWnd );
Key_ClearStates();
VGui_SetBounds();
if( host.state == HOST_FRAME )

View File

@ -309,7 +309,6 @@ qboolean Mod_BoxVisible( const vec3_t mins, const vec3_t maxs, const byte *visbi
if( !visbits || !mins || !maxs )
return true;
// FIXME: Could save a loop here by traversing the tree in this routine like the code above
count = Mod_BoxLeafnums( mins, maxs, leafList, MAX_BOX_LEAFS, NULL );
for( i = 0; i < count; i++ )
@ -1294,7 +1293,7 @@ void Mod_CalcPHS( void )
// NOTE: first leaf is skipped becuase is a outside leaf. Now all leafs have shift up by 1.
// and last leaf (which equal worldmodel->numleafs) has no visdata! Add extra one leaf
// to avoid this situation. FIXME: this is need to be detail tested
// to avoid this situation.
num = worldmodel->numleafs + 1;
rowwords = (num + 31)>>5;
rowbytes = rowwords * 4;
@ -1492,7 +1491,7 @@ static void Mod_LoadBrushModel( model_t *mod, const void *buffer )
loadmodel->numframes = 2; // regular and alternate animation
// set up the submodels (FIXME: this is confusing)
// set up the submodels
for( i = 0; i < mod->numsubmodels; i++ )
{
bm = &mod->submodels[i];
@ -1761,7 +1760,7 @@ Mod_GetType
*/
modtype_t Mod_GetType( int handle )
{
model_t *mod = CM_ClipHandleToModel( handle );
model_t *mod = Mod_Handle( handle );
if( !mod ) return mod_bad;
return mod->type;
@ -1774,7 +1773,7 @@ Mod_GetFrames
*/
void Mod_GetFrames( int handle, int *numFrames )
{
model_t *mod = CM_ClipHandleToModel( handle );
model_t *mod = Mod_Handle( handle );
if( !numFrames ) return;
if( !mod )
@ -1797,7 +1796,7 @@ void Mod_GetBounds( int handle, vec3_t mins, vec3_t maxs )
model_t *cmod;
if( handle <= 0 ) return;
cmod = CM_ClipHandleToModel( handle );
cmod = Mod_Handle( handle );
if( cmod )
{
@ -1903,16 +1902,15 @@ void *Mod_Extradata( model_t *mod )
/*
==================
CM_ClipHandleToModel
Mod_Handle
FIXME: rename to Mod_Handle
==================
*/
model_t *CM_ClipHandleToModel( int handle )
model_t *Mod_Handle( int handle )
{
if( handle < 0 || handle > MAX_MODELS )
{
Host_Error( "CM_ClipHandleToModel: bad handle #%i\n", handle );
Host_Error( "Mod_Handle: bad handle #%i\n", handle );
return NULL;
}
return com_models[handle];

View File

@ -375,12 +375,6 @@ void BF_WriteBitVec3Normal( sizebuf_t *bf, const float *fa )
BF_WriteOneBit( bf, signbit );
}
void BF_WriteBitAngles( sizebuf_t *bf, const float *fa )
{
// FIXME: uses WriteBitAngle instead ?
BF_WriteBitVec3Coord( bf, fa );
}
void BF_WriteChar( sizebuf_t *bf, int val )
{
BF_WriteSBitLong( bf, val, sizeof( char ) << 3 );

View File

@ -69,7 +69,6 @@ void BF_WriteBitFloat( sizebuf_t *bf, float val );
void BF_WriteBitVec3Coord( sizebuf_t *bf, const float *fa );
void BF_WriteBitNormal( sizebuf_t *bf, float f );
void BF_WriteBitVec3Normal( sizebuf_t *bf, const float *fa );
void BF_WriteBitAngles( sizebuf_t *bf, const float *fa );
// Byte-write functions
void BF_WriteChar( sizebuf_t *bf, int val );

View File

@ -91,7 +91,6 @@ static void PM_StudioSetUpTransform( physent_t *pe, qboolean allow_scale )
if( allow_scale && pe->fuser1 > 0.0f )
scale = pe->fuser1;
// FIXME: apply scale to studiomodels
Matrix3x4_CreateFromEntity( pm_studiomatrix, ang, pe->origin, scale );
}
@ -101,7 +100,7 @@ StudioCalcBoneAdj
====================
*/
static void PM_StudioCalcBoneAdj( float dadt, float *adj, const byte *pcontroller1, const byte *pcontroller2 )
static void PM_StudioCalcBoneAdj( float *adj, const byte *pcontroller )
{
int i, j;
float value;
@ -119,25 +118,14 @@ static void PM_StudioCalcBoneAdj( float dadt, float *adj, const byte *pcontrolle
// check for 360% wrapping
if( pbonecontroller[j].type & STUDIO_RLOOP )
{
if( abs( pcontroller1[i] - pcontroller2[i] ) > 128 )
{
int a, b;
a = (pcontroller1[j] + 128) % 256;
b = (pcontroller2[j] + 128) % 256;
value = ((a * dadt) + (b * (1 - dadt)) - 128) * (360.0/256.0) + pbonecontroller[j].start;
}
else
{
value = ((pcontroller1[i] * dadt + (pcontroller2[i]) * (1.0 - dadt))) * (360.0/256.0) + pbonecontroller[j].start;
}
value = pcontroller[i] * (360.0/256.0) + pbonecontroller[j].start;
}
else
{
value = (pcontroller1[i] * dadt + pcontroller2[i] * (1.0 - dadt)) / 255.0;
if( value < 0 ) value = 0;
if( value > 1.0 ) value = 1.0;
value = (1.0 - value) * pbonecontroller[j].start + value * pbonecontroller[j].end;
value = pcontroller[i] / 255.0f;
if( value < 0.0f ) value = 0.0f;
if( value > 1.0f ) value = 1.0f;
value = (1.0f - value) * pbonecontroller[j].start + value * pbonecontroller[j].end;
}
}
@ -324,7 +312,7 @@ static void PM_StudioCalcRotations( physent_t *pe, float pos[][3], vec4_t *q, ms
int i, frame;
mstudiobone_t *pbone;
float adj[MAXSTUDIOCONTROLLERS];
float s, dadt = 1.0f; // noInterp
float s;
if( f > pseqdesc->numframes - 1 )
f = 0;
@ -337,7 +325,7 @@ static void PM_StudioCalcRotations( physent_t *pe, float pos[][3], vec4_t *q, ms
// add in programtic controllers
pbone = (mstudiobone_t *)((byte *)pm_studiohdr + pm_studiohdr->boneindex);
PM_StudioCalcBoneAdj( dadt, adj, pe->controller, pe->controller );
PM_StudioCalcBoneAdj( adj, pe->controller );
for( i = 0; i < pm_studiohdr->numbones; i++, pbone++, panim++ )
{
@ -499,12 +487,11 @@ static void PM_StudioSetupBones( physent_t *pe )
if( pseqdesc->numblends > 1 )
{
float s;
float dadt = 1.0f;
panim += pm_studiohdr->numbones;
PM_StudioCalcRotations( pe, pos2, q2, pseqdesc, panim, f );
s = (pe->blending[0] * dadt + pe->blending[0] * ( 1.0f - dadt )) / 255.0f;
s = (float)pe->blending[0] / 255.0f;
PM_StudioSlerpBones( q, pos, q2, pos2, s );
@ -516,10 +503,10 @@ static void PM_StudioSetupBones( physent_t *pe )
panim += pm_studiohdr->numbones;
PM_StudioCalcRotations( pe, pos4, q4, pseqdesc, panim, f );
s = ( pe->blending[0] * dadt + pe->blending[0] * ( 1.0f - dadt )) / 255.0f;
s = (float)pe->blending[0] / 255.0f;
PM_StudioSlerpBones( q3, pos3, q4, pos4, s );
s = ( pe->blending[1] * dadt + pe->blending[1] * ( 1.0f - dadt )) / 255.0f;
s = (float)pe->blending[1] / 255.0f;
PM_StudioSlerpBones( q, pos, q3, pos3, s );
}
}

View File

@ -67,10 +67,9 @@
#define clc_stringcmd 3 // [string] message
#define clc_delta 4 // [byte] sequence number, requests delta compression of message
#define clc_resourcelist 5
#define clc_userinfo 6 // [[userinfo string] // FIXME: remove
#define clc_userinfo 6 // [[userinfo string]
#define clc_fileconsistency 7
#define clc_voicedata 8
#define clc_random_seed 9 // [long] random seed // FIXME: remove
#define MAX_VISIBLE_PACKET 512 // 512 visible entities per frame (hl1 has 256)
@ -93,7 +92,6 @@
#define MAX_CUSTOM 1024 // max custom resources per level
#define MAX_USER_MESSAGES 191 // another 63 messages reserved for engine routines
// FIXME: tune this
#define MAX_DLIGHTS 32 // dynamic lights (rendered per one frame)
#define MAX_ELIGHTS 64 // entity only point lights

View File

@ -265,7 +265,6 @@ void VGui_ViewportPaintBackground( int extents[4] )
{
if( !rootpanel ) return;
Msg( "ViewportPaintBackground()\n" );
Panel *pVPanel = surface->getPanel();
if( !pVPanel ) return;

View File

@ -156,6 +156,7 @@ typedef struct sv_client_s
qboolean local_weapons; // enable weapon predicting
qboolean lag_compensation; // enable lag compensation
qboolean hltv_proxy; // this is spectator proxy (hltv)
qboolean spectator; // this is spectator (not a real client)
netchan_t netchan;
int chokecount; // number of messages rate supressed
@ -175,7 +176,6 @@ typedef struct sv_client_s
qboolean fakeclient; // This client is a fake player controlled by the game DLL
int random_seed; // fpr predictable random values
usercmd_t lastcmd; // for filling in big drops
double last_cmdtime;
@ -502,7 +502,7 @@ void SV_PlaybackEventFull( int flags, const edict_t *pInvoker, word eventindex,
void SV_PlaybackEvent( sizebuf_t *msg, event_info_t *info );
void SV_BaselineForEntity( edict_t *pEdict );
void SV_WriteEntityPatch( const char *filename );
script_t *SV_GetEntityScript( const char *filename, int *flags );
script_t *SV_ReadEntityScript( const char *filename, int *flags );
float SV_AngleMod( float ideal, float current, float speed );
void SV_SpawnEntities( const char *mapname, script_t *entities );
edict_t* SV_AllocPrivateData( edict_t *ent, string_t className );
@ -547,11 +547,6 @@ void SV_StudioGetAttachment( edict_t *e, int iAttachment, float *org, float *ang
trace_t SV_TraceHitbox( edict_t *ent, const vec3_t start, vec3_t mins, vec3_t maxs, const vec3_t end );
void SV_GetBonePosition( edict_t *e, int iBone, float *org, float *ang );
//
// sv_pmove.c
//
qboolean SV_CopyEdictToPhysEnt( physent_t *pe, edict_t *ed, qboolean player_trace );
//
// sv_world.c
//

View File

@ -8,7 +8,7 @@
#include "server.h"
#include "net_encode.h"
const char *clc_strings[10] =
const char *clc_strings[9] =
{
"clc_bad",
"clc_nop",
@ -19,7 +19,6 @@ const char *clc_strings[10] =
"clc_userinfo",
"clc_fileconsistency",
"clc_voicedata",
"clc_random_seed",
};
typedef struct ucmd_s
@ -82,10 +81,11 @@ A connection request that did not come from the master
*/
void SV_DirectConnect( netadr_t from )
{
char physinfo[512];
char *s, physinfo[512];
char userinfo[MAX_INFO_STRING];
sv_client_t temp, *cl, *newcl;
edict_t *ent;
qboolean spectator = false;
int i, edictnum;
int qport, version;
int count = 0;
@ -147,6 +147,15 @@ void SV_DirectConnect( netadr_t from )
newcl = &temp;
Mem_Set( newcl, 0, sizeof( sv_client_t ));
// check for spectators
s = Info_ValueForKey( userinfo, "spectator" );
if( s && com.strcmp( s, "0" ) && sv_maxclients->integer > 1 )
{
// FXIME: we can create listen server with spectator instead of client ?
spectator = true;
}
// if there is already a slot for this ip, reuse it
for( i = 0, cl = svs.clients; i < sv_maxclients->integer; i++, cl++ )
{
@ -177,9 +186,9 @@ void SV_DirectConnect( netadr_t from )
return;
}
gotnewcl:
// build a new connection
// accept the new client
gotnewcl:
// this is the only place a sv_client_t is ever initialized
if( sv_maxclients->integer == 1 ) // save physinfo for singleplayer
com.strncpy( physinfo, newcl->physinfo, sizeof( physinfo ));
@ -197,6 +206,7 @@ gotnewcl:
newcl->challenge = challenge; // save challenge for checksumming
newcl->frames = (client_frame_t *)Z_Malloc( sizeof( client_frame_t ) * SV_UPDATE_BACKUP );
newcl->userid = g_userid++; // create unique userid
newcl->spectator = spectator;
// get the game a chance to reject this connection or modify the userinfo
if( !( SV_ClientConnect( ent, userinfo )))
@ -361,7 +371,7 @@ void SV_DropClient( sv_client_t *drop )
}
// let the game known about client state
if( drop->edict->v.flags & FL_SPECTATOR )
if( drop->spectator )
svgame.dllFuncs.pfnSpectatorDisconnect( drop->edict );
else svgame.dllFuncs.pfnClientDisconnect( drop->edict );
@ -868,7 +878,7 @@ void SV_PutClientInServer( edict_t *ent )
if( !sv.loadgame )
{
if( ent->v.flags & FL_SPECTATOR )
if( client->spectator )
{
svgame.globals->time = sv.time;
svgame.dllFuncs.pfnSpectatorConnect( ent );
@ -993,7 +1003,7 @@ void SV_New_f( sv_client_t *cl )
BF_WriteLong( &cl->netchan.message, PROTOCOL_VERSION );
BF_WriteLong( &cl->netchan.message, svs.spawncount );
BF_WriteLong( &cl->netchan.message, sv.checksum );
BF_WriteByte( &cl->netchan.message, playernum );
BF_WriteByte( &cl->netchan.message, playernum|( cl->spectator ? 128 : 0 ));
BF_WriteByte( &cl->netchan.message, svgame.globals->maxClients );
BF_WriteWord( &cl->netchan.message, svgame.globals->maxEntities );
BF_WriteString( &cl->netchan.message, sv.name );
@ -1490,7 +1500,7 @@ void SV_Pause_f( sv_client_t *cl )
return;
}
if( cl->edict->v.flags & FL_SPECTATOR )
if( cl->spectator )
{
SV_ClientPrintf( cl, PRINT_HIGH, "Spectators can not pause.\n" );
return;
@ -1729,7 +1739,7 @@ void SV_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
/*
==================
SV_ReadClientMove
SV_ParseClientMove
The message usually contains all the movement commands
that were in the last three packets, so that the information
@ -1739,61 +1749,6 @@ On very fast clients, there may be multiple usercmd packed into
each of the backup packets.
==================
*/
static void SV_ReadClientMove( sv_client_t *cl, sizebuf_t *msg )
{
int key, size;
int checksum1, checksum2;
usercmd_t oldest, oldcmd, newcmd, nulcmd;
key = BF_GetNumBytesRead( msg );
checksum1 = BF_ReadByte( msg );
cl->packet_loss = SV_CalcPacketLoss( cl );
Mem_Set( &nulcmd, 0, sizeof( nulcmd ));
MSG_ReadDeltaUsercmd( msg, &nulcmd, &oldest );
MSG_ReadDeltaUsercmd( msg, &oldest, &oldcmd );
MSG_ReadDeltaUsercmd( msg, &oldcmd, &newcmd );
if( cl->state != cs_spawned )
{
cl->delta_sequence = -1;
return;
}
// if the checksum fails, ignore the rest of the packet
size = BF_GetNumBytesRead( msg ) - key - 1;
checksum2 = CRC32_Sequence( BF_GetData( msg ) + key + 1, size, cl->netchan.incoming_sequence );
if( checksum2 != checksum1 )
{
MsgDev( D_ERROR, "SV_UserMove: failed command checksum for %s (%d != %d)\n", cl->name, checksum2, checksum1 );
return;
}
if( !sv.paused )
{
SV_PreRunCmd( cl, &newcmd, cl->random_seed ); // get random_seed from newcmd
if( net_drop < 20 )
{
while( net_drop > 2 )
{
SV_RunCmd( cl, &cl->lastcmd, cl->random_seed );
net_drop--;
}
if( net_drop > 1 ) SV_RunCmd( cl, &oldest, cl->random_seed );
if( net_drop > 0 ) SV_RunCmd( cl, &oldcmd, cl->random_seed );
}
SV_RunCmd( cl, &newcmd, cl->random_seed );
SV_PostRunCmd( cl );
}
cl->lastcmd = newcmd;
cl->lastcmd.buttons = 0; // avoid multiple fires on lag
}
static void SV_ParseClientMove( sv_client_t *cl, sizebuf_t *msg )
{
client_frame_t *frame;
@ -1984,7 +1939,6 @@ void SV_ExecuteClientMessage( sv_client_t *cl, sizebuf_t *msg )
case clc_move:
if( move_issued ) return; // someone is trying to cheat...
move_issued = true;
// SV_ReadClientMove( cl, msg );
SV_ParseClientMove( cl, msg );
break;
case clc_stringcmd:
@ -1993,9 +1947,6 @@ void SV_ExecuteClientMessage( sv_client_t *cl, sizebuf_t *msg )
if( ++stringCmdCount < 8 ) SV_ExecuteClientCommand( cl, s );
if( cl->state == cs_zombie ) return; // disconnect command
break;
case clc_random_seed:
cl->random_seed = BF_ReadUBitLong( msg, 32 );
break;
default:
MsgDev( D_ERROR, "SV_ReadClientMessage: clc_bad\n" );
SV_DropClient( cl );

View File

@ -21,13 +21,13 @@ typedef struct
int CustomDecal_Init( cachewad_t *wad, byte *data, int size, int playernum )
{
// FIXME: implement
// TODO: implement
return 0;
}
void *CustomDecal_Validate( byte *data, int size )
{
// FIXME: implement
// TODO: implement
return NULL;
}

View File

@ -782,7 +782,7 @@ void SV_InactivateClients( void )
{
if( !cl->state || !cl->edict ) continue;
if( !cl->edict || (cl->edict->v.flags & ( FL_FAKECLIENT|FL_SPECTATOR )))
if( !cl->edict || (cl->edict->v.flags & FL_FAKECLIENT))
continue;
if( svs.clients[i].state > cs_connected )

View File

@ -475,7 +475,7 @@ void SV_WriteEntityPatch( const char *filename )
FS_Close( f );
}
script_t *SV_GetEntityScript( const char *filename, int *flags )
script_t *SV_ReadEntityScript( const char *filename, int *flags )
{
file_t *f;
dheader_t *header;
@ -542,7 +542,7 @@ int SV_MapIsValid( const char *filename, const char *spawn_entity, const char *l
script_t *ents = NULL;
int flags = 0;
ents = SV_GetEntityScript( filename, &flags );
ents = SV_ReadEntityScript( filename, &flags );
if( ents )
{
@ -742,7 +742,7 @@ void SV_PlaybackEvent( sizebuf_t *msg, event_info_t *info )
BF_WriteWord( msg, info->index ); // send event index
BF_WriteWord( msg, (int)( info->fire_time * 100.0f )); // send event delay
MSG_WriteDeltaEvent( msg, &nullargs, &info->args ); // FIXME: zero-compressing
MSG_WriteDeltaEvent( msg, &nullargs, &info->args ); // TODO: delta-compressing
}
const char *SV_ClassName( const edict_t *e )
@ -1950,7 +1950,7 @@ trace sphere instead of bbox
*/
void pfnTraceSphere( const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr )
{
// FIXME: implement
// never was implemented in GoldSrc
}
/*
@ -1968,7 +1968,7 @@ static int pfnBoxVisible( const float *mins, const float *maxs, const byte *pset
=============
pfnGetAimVector
FIXME: use speed for reduce aiming accuracy
NOTE: speed is unused
=============
*/
void pfnGetAimVector( edict_t* ent, float speed, float *rgflReturn )
@ -2750,7 +2750,7 @@ static void *pfnGetModelPtr( edict_t *pEdict )
if( !SV_IsValidEdict( pEdict ))
return NULL;
mod = CM_ClipHandleToModel( pEdict->v.modelindex );
mod = Mod_Handle( pEdict->v.modelindex );
return Mod_Extradata( mod );
}
@ -3240,6 +3240,7 @@ void pfnRunPlayerMove( edict_t *pClient, const float *v_angle, float fmove, floa
{
sv_client_t *cl;
usercmd_t cmd;
uint seed;
if( sv.paused ) return;
@ -3261,10 +3262,10 @@ void pfnRunPlayerMove( edict_t *pClient, const float *v_angle, float fmove, floa
cmd.impulse = impulse;
cmd.msec = msec;
cl->random_seed = Com_RandomLong( 0, 0x7fffffff ); // full range
seed = Com_RandomLong( 0, 0x7fffffff ); // full range
SV_PreRunCmd( cl, &cmd, cl->random_seed );
SV_RunCmd( cl, &cmd, cl->random_seed );
SV_PreRunCmd( cl, &cmd, seed );
SV_RunCmd( cl, &cmd, seed );
SV_PostRunCmd( cl );
cl->lastcmd = cmd;

View File

@ -148,7 +148,6 @@ int SV_GenericIndex( const char *name )
SV_EntityScript
get entity script for current map
FIXME: merge with SV_GetEntityScript
================
*/
script_t *SV_EntityScript( void )
@ -462,7 +461,7 @@ qboolean SV_SpawnServer( const char *mapname, const char *startspot )
com.snprintf( sv.model_precache[1], sizeof( sv.model_precache[0] ), "maps/%s.bsp", sv.name );
Mod_LoadWorld( sv.model_precache[1], &sv.checksum );
sv.worldmodel = CM_ClipHandleToModel( 1 ); // get world pointer
sv.worldmodel = Mod_Handle( 1 ); // get world pointer
for( i = 1; i < sv.worldmodel->numsubmodels; i++ )
{

View File

@ -23,17 +23,11 @@ void SV_CopyPmtraceToGlobal( pmtrace_t *trace )
svgame.globals->trace_hitgroup = trace->hitgroup;
}
qboolean SV_CopyEdictToPhysEnt( physent_t *pe, edict_t *ed, qboolean player_trace )
qboolean SV_CopyEdictToPhysEnt( physent_t *pe, edict_t *ed )
{
model_t *mod = CM_ClipHandleToModel( ed->v.modelindex );
model_t *mod = Mod_Handle( ed->v.modelindex );
// NOTE: player never collide with sprites (even with solid sprites)
if( !mod || mod->type == mod_bad || mod->type == mod_sprite )
return false;
// this is monsterclip brush, player ignore it
if( player_trace && mod->type == mod_brush && ed->v.flags & FL_MONSTERCLIP )
return false;
if( !mod ) return false;
pe->player = false;
@ -121,23 +115,48 @@ void SV_AddLinksToPmove( areanode_t *node, const vec3_t pmove_mins, const vec3_t
next = l->next;
check = EDICT_FROM_AREA( l );
if( check == pl || check->v.owner == pl )
if( check->v.groupinfo != 0 )
{
if(( !svs.groupop && (check->v.groupinfo & pl->v.groupinfo ) == 0) ||
( svs.groupop == 1 && ( check->v.groupinfo & pl->v.groupinfo ) != 0 ))
continue;
}
if( check->v.owner == pl || check->v.solid == SOLID_TRIGGER )
continue; // player or player's own missile
if( check->v.deadflag == DEAD_DEAD )
continue;
if( check->v.solid == SOLID_BSP || check->v.solid == SOLID_BBOX || check->v.solid == SOLID_SLIDEBOX )
if( svgame.pmove->numvisent < MAX_PHYSENTS )
{
if( !BoundsIntersect( pmove_mins, pmove_maxs, check->v.absmin, check->v.absmax ))
continue;
pe = &svgame.pmove->visents[svgame.pmove->numvisent];
if( SV_CopyEdictToPhysEnt( pe, check ))
svgame.pmove->numvisent++;
}
if( svgame.pmove->numphysent == MAX_PHYSENTS )
return;
if( check->v.solid == SOLID_NOT && ( check->v.skin == 0 || check->v.modelindex == 0 ))
continue;
// ignore monsterclip brushes
if(( check->v.flags & FL_MONSTERCLIP ) && check->v.solid == SOLID_BSP )
continue;
if( check == pl ) continue; // himself
if((( check->v.flags & FL_CLIENT ) && check->v.health <= 0 ) || check->v.deadflag == DEAD_DEAD )
continue; // dead body
if( check->v.mins[2] == 0 && check->v.maxs[2] == 1 )
continue;
if( VectorIsNull( check->v.size )) continue;
if( !BoundsIntersect( pmove_mins, pmove_maxs, check->v.absmin, check->v.absmax ))
continue;
if( svgame.pmove->numphysent < MAX_PHYSENTS )
{
pe = &svgame.pmove->physents[svgame.pmove->numphysent];
if( SV_CopyEdictToPhysEnt( pe, check, true ))
if( SV_CopyEdictToPhysEnt( pe, check ))
svgame.pmove->numphysent++;
}
}
@ -182,8 +201,7 @@ void SV_AddLaddersToPmove( areanode_t *node, const vec3_t pmove_mins, const vec3
return;
pe = &svgame.pmove->moveents[svgame.pmove->nummoveent];
if( SV_CopyEdictToPhysEnt( pe, check, true ))
if( SV_CopyEdictToPhysEnt( pe, check ))
svgame.pmove->nummoveent++;
}
@ -368,7 +386,7 @@ static byte *pfnCOM_LoadFile( const char *path, int usehunk, int *pLength )
static void pfnCOM_FreeFile( void *buffer )
{
Mem_Free( buffer );
if( buffer ) Mem_Free( buffer );
}
static void pfnPlaySound( int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch )
@ -491,7 +509,7 @@ static void PM_CheckMovingGround( edict_t *ent, float frametime )
ent->v.flags &= ~FL_BASEVELOCITY;
}
static void PM_SetupMove( playermove_t *pmove, edict_t *clent, usercmd_t *ucmd, const char *physinfo )
static void SV_SetupPMove( playermove_t *pmove, edict_t *clent, usercmd_t *ucmd, const char *physinfo )
{
vec3_t absmin, absmax;
int i;
@ -526,7 +544,7 @@ static void PM_SetupMove( playermove_t *pmove, edict_t *clent, usercmd_t *ucmd,
pmove->waterjumptime = clent->v.teleport_time;
pmove->dead = (clent->v.health <= 0.0f ) ? true : false;
pmove->deadflag = clent->v.deadflag;
pmove->spectator = 0; // FIXME: implement
pmove->spectator = 0; // spectator physic all execute on client
pmove->movetype = clent->v.movetype;
if( pmove->multiplayer ) pmove->onground = -1;
pmove->waterlevel = clent->v.waterlevel;
@ -550,7 +568,7 @@ static void PM_SetupMove( playermove_t *pmove, edict_t *clent, usercmd_t *ucmd,
com.strncpy( pmove->physinfo, physinfo, MAX_INFO_STRING );
// setup physents
pmove->numvisent = 0; // FIXME: add visents for debugging
pmove->numvisent = 0;
pmove->numphysent = 0;
pmove->nummoveent = 0;
@ -560,14 +578,16 @@ static void PM_SetupMove( playermove_t *pmove, edict_t *clent, usercmd_t *ucmd,
absmax[i] = clent->v.origin[i] + 256;
}
SV_CopyEdictToPhysEnt( &svgame.pmove->physents[0], &svgame.edicts[0], true );
SV_CopyEdictToPhysEnt( &svgame.pmove->physents[0], &svgame.edicts[0] );
svgame.pmove->visents[0] = svgame.pmove->physents[0];
svgame.pmove->numphysent = 1; // always have world
svgame.pmove->numvisent = 1;
SV_AddLinksToPmove( sv_areanodes, absmin, absmax );
SV_AddLaddersToPmove( sv_areanodes, absmin, absmax );
}
static void PM_FinishMove( playermove_t *pmove, edict_t *clent )
static void SV_FinishPMove( playermove_t *pmove, edict_t *clent )
{
clent->v.teleport_time = pmove->waterjumptime;
VectorCopy( pmove->angles, clent->v.v_angle );
@ -818,7 +838,7 @@ void SV_SetupMoveInterpolant( sv_client_t *cl )
void SV_PreRunCmd( sv_client_t *cl, usercmd_t *ucmd, int random_seed )
{
svgame.pmove->runfuncs = true; // FIXME: check cl_lc ?
svgame.pmove->runfuncs = true;
svgame.dllFuncs.pfnCmdStart( cl->edict, ucmd, random_seed );
}
@ -884,7 +904,7 @@ void SV_RunCmd( sv_client_t *cl, usercmd_t *ucmd, int random_seed )
SV_SetMinMaxSize( clent, svgame.pmove->player_mins[1], svgame.pmove->player_maxs[1] );
else SV_SetMinMaxSize( clent, svgame.pmove->player_mins[0], svgame.pmove->player_maxs[0] );
if(!( clent->v.flags & FL_SPECTATOR ))
if( !cl->spectator )
{
svgame.globals->time = sv.time + host.frametime;
svgame.dllFuncs.pfnPlayerPreThink( clent );
@ -899,15 +919,15 @@ void SV_RunCmd( sv_client_t *cl, usercmd_t *ucmd, int random_seed )
ucmd->msec = 0; // pause
// setup playermove state
PM_SetupMove( svgame.pmove, clent, ucmd, cl->physinfo );
SV_SetupPMove( svgame.pmove, clent, ucmd, cl->physinfo );
// motor!
svgame.dllFuncs.pfnPM_Move( svgame.pmove, true );
// copy results back to client
PM_FinishMove( svgame.pmove, clent );
SV_FinishPMove( svgame.pmove, clent );
if(!( clent->v.flags & FL_SPECTATOR ))
if( !cl->spectator )
{
int i;
edict_t *touch;
@ -954,7 +974,7 @@ void SV_PostRunCmd( sv_client_t *cl )
svgame.pmove->runfuncs = false; // all next calls ignore footstep sounds
// run post-think
if( clent->v.flags & FL_SPECTATOR )
if( cl->spectator )
svgame.dllFuncs.pfnSpectatorThink( clent );
else svgame.dllFuncs.pfnPlayerPostThink( clent );

View File

@ -413,8 +413,6 @@ void ReapplyDecal( SAVERESTOREDATA *pSaveData, decallist_t *entry, qboolean adja
{
entityIndex = pfnIndexOfEdict( tr.ent );
if( entityIndex > 0 ) modelIndex = tr.ent->v.modelindex;
// FIXME: probably some rotating or moving objects can't receive decal properly
SV_CreateDecal( tr.endpos, decalIndex, entityIndex, modelIndex, flags );
}
}

View File

@ -3,8 +3,6 @@
// sv_studio.c - server studio utilities
//=======================================================================
// FIXME: these code needs to be some cleanup from lerping code
#include "common.h"
#include "server.h"
#include "studio.h"
@ -101,7 +99,7 @@ StudioCalcBoneAdj
====================
*/
static void SV_StudioCalcBoneAdj( float dadt, float *adj, const byte *pcontroller1, const byte *pcontroller2 )
static void SV_StudioCalcBoneAdj( float *adj, const byte *pcontroller )
{
int i, j;
float value;
@ -119,22 +117,11 @@ static void SV_StudioCalcBoneAdj( float dadt, float *adj, const byte *pcontrolle
// check for 360% wrapping
if( pbonecontroller[j].type & STUDIO_RLOOP )
{
if( abs( pcontroller1[i] - pcontroller2[i] ) > 128 )
{
int a, b;
a = (pcontroller1[j] + 128) % 256;
b = (pcontroller2[j] + 128) % 256;
value = ((a * dadt) + (b * (1.0f - dadt)) - 128) * (360.0f / 256.0f) + pbonecontroller[j].start;
}
else
{
value = ((pcontroller1[i] * dadt + (pcontroller2[i]) * (1.0 - dadt))) * (360.0/256.0) + pbonecontroller[j].start;
}
value = pcontroller[i] * (360.0/256.0) + pbonecontroller[j].start;
}
else
{
value = (pcontroller1[i] * dadt + pcontroller2[i] * (1.0f - dadt)) / 255.0f;
value = pcontroller[i] / 255.0f;
if( value < 0.0f ) value = 0.0f;
if( value > 1.0f ) value = 1.0f;
value = (1.0f - value) * pbonecontroller[j].start + value * pbonecontroller[j].end;
@ -337,7 +324,7 @@ static void SV_StudioCalcRotations( const edict_t *ent, int boneused[], int numb
// add in programtic controllers
pbone = (mstudiobone_t *)((byte *)sv_studiohdr + sv_studiohdr->boneindex);
SV_StudioCalcBoneAdj( 1.0f, adj, pcontroller, pcontroller );
SV_StudioCalcBoneAdj( adj, pcontroller );
for( j = numbones - 1; j >= 0; j-- )
{
@ -527,7 +514,6 @@ static void SV_StudioSetupBones( model_t *pModel, float frame, int sequence, con
if( pseqdesc->numblends > 1 )
{
float s;
float dadt = 1.0f;
panim += sv_studiohdr->numbones;
SV_StudioCalcRotations( pEdict, boneused, numbones, pcontroller, pos2, q2, pseqdesc, panim, f );
@ -570,7 +556,7 @@ StudioSetupModel
*/
static qboolean SV_StudioSetupModel( edict_t *ent, int iBone )
{
model_t *mod = CM_ClipHandleToModel( ent->v.modelindex );
model_t *mod = Mod_Handle( ent->v.modelindex );
void *hdr = Mod_Extradata( mod );
if( !hdr ) return false;
@ -821,9 +807,7 @@ static qboolean SV_StudioIntersect( edict_t *ent, const vec3_t start, vec3_t min
{
vec3_t trace_mins, trace_maxs;
vec3_t anim_mins, anim_maxs;
model_t *mod = CM_ClipHandleToModel( ent->v.modelindex );
if( !mod ) return false; // FIXME: Xash 0.45 crash at this point (model == NULL)
model_t *mod = Mod_Handle( ent->v.modelindex );
// create the bounding box of the entire move
World_MoveBounds( start, mins, maxs, end, trace_mins, trace_maxs );
@ -933,7 +917,7 @@ void SV_StudioGetAttachment( edict_t *e, int iAttachment, float *org, float *ang
vec3_t localOrg, localAng;
void *hdr;
hdr = Mod_Extradata( CM_ClipHandleToModel( e->v.modelindex ));
hdr = Mod_Extradata( Mod_Handle( e->v.modelindex ));
if( !hdr ) return;
sv_studiohdr = (studiohdr_t *)hdr;

View File

@ -112,7 +112,7 @@ hull_t *SV_HullForEntity( edict_t *ent, int hullNumber, vec3_t mins, vec3_t maxs
vec3_t hullmins, hullmaxs;
vec3_t size;
model = CM_ClipHandleToModel( ent->v.modelindex );
model = Mod_Handle( ent->v.modelindex );
// decide which clipping hull to use, based on the size
if( model && ( ent->v.solid == SOLID_BSP || ent->v.skin == CONTENTS_LADDER ))
@ -190,7 +190,7 @@ hull_t *SV_HullForEntity( edict_t *ent, int hullNumber, vec3_t mins, vec3_t maxs
// hullNumber is force to use hull from brushmodel (even if solid == SOLID_NOT)
if( hullNumber != -1 && Mod_GetType( ent->v.modelindex ) == mod_brush )
{
model = CM_ClipHandleToModel( ent->v.modelindex );
model = Mod_Handle( ent->v.modelindex );
if( !model ) Host_Error( "SV_HullForEntity: using custom hull on bad bsp model\n" );
// TraceHull stuff
@ -229,7 +229,7 @@ hull_t *SV_HullForBsp( edict_t *ent, const vec3_t mins, const vec3_t maxs, float
int i = 0, hullNumber = 0;
// decide which clipping hull to use, based on the size
model = CM_ClipHandleToModel( ent->v.modelindex );
model = Mod_Handle( ent->v.modelindex );
if( !model || model->type != mod_brush )
Host_Error( "Entity %i SOLID_BSP with a non bsp model %i\n", NUM_FOR_EDICT( ent ), model->type );
@ -1049,7 +1049,7 @@ const char *SV_TraceTexture( edict_t *ent, const vec3_t start, const vec3_t end
vec3_t start_l, end_l;
vec3_t temp, offset;
bmodel = CM_ClipHandleToModel( ent->v.modelindex );
bmodel = Mod_Handle( ent->v.modelindex );
if( !bmodel || bmodel->type != mod_brush )
return NULL;
@ -1176,7 +1176,7 @@ static void SV_ClipToLinks( areanode_t *node, moveclip_t *clip )
continue; // don't clip against owner
}
model = CM_ClipHandleToModel( touch->v.modelindex );
model = Mod_Handle( touch->v.modelindex );
bSimpleBox = (clip->flags & FMOVE_SIMPLEBOX) ? true : false;
bSimpleBox = World_UseSimpleBox( bSimpleBox, touch->v.solid, clip->isPoint, model );

View File

@ -733,7 +733,7 @@ void UI_CloseMenu( void )
memset( uiStatic.serverAddresses, 0, sizeof( uiStatic.serverAddresses ));
memset( uiStatic.serverNames, 0, sizeof( uiStatic.serverNames ));
KEY_ClearStates ();
// KEY_ClearStates ();
KEY_SetDest ( KEY_GAME );
}

View File

@ -40,6 +40,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define ID_TOPCOLOR 7
#define ID_BOTTOMCOLOR 8
#define ID_HIMODELS 9
#define ID_SPECTATOR 10
#define MAX_PLAYERMODELS 100
@ -64,6 +65,7 @@ typedef struct
menuCheckBox_s hiModels;
menuSlider_s topColor;
menuSlider_s bottomColor;
menuCheckBox_s spectator;
menuField_s name;
menuSpinControl_s model;
@ -150,6 +152,9 @@ static void UI_PlayerSetup_GetConfig( void )
if( CVAR_GET_FLOAT( "cl_himodels" ))
uiPlayerSetup.hiModels.enabled = 1;
if( CVAR_GET_FLOAT( "spectator" ))
uiPlayerSetup.spectator.enabled = 1;
}
/*
@ -164,6 +169,7 @@ static void UI_PlayerSetup_SetConfig( void )
CVAR_SET_FLOAT( "topcolor", uiPlayerSetup.topColor.curValue * 255 );
CVAR_SET_FLOAT( "bottomcolor", uiPlayerSetup.bottomColor.curValue * 255 );
CVAR_SET_FLOAT( "cl_himodels", uiPlayerSetup.hiModels.enabled );
CVAR_SET_FLOAT( "spectator", uiPlayerSetup.spectator.enabled );
}
/*
@ -190,6 +196,7 @@ static void UI_PlayerSetup_UpdateConfig( void )
CVAR_SET_STRING( "model", uiPlayerSetup.currentModel );
CVAR_SET_FLOAT( "cl_himodels", uiPlayerSetup.hiModels.enabled );
CVAR_SET_FLOAT( "spectator", uiPlayerSetup.spectator.enabled );
// IMPORTANT: always set default model becuase we need to have something valid here
// if you wish draw your playermodel as normal studiomodel please change "models/player.mdl" to path
@ -209,6 +216,7 @@ static void UI_PlayerSetup_Callback( void *self, int event )
switch( item->id )
{
case ID_HIMODELS:
case ID_SPECTATOR:
if( event == QM_PRESSED )
((menuCheckBox_s *)self)->focusPic = UI_CHECKBOX_PRESSED;
else ((menuCheckBox_s *)self)->focusPic = UI_CHECKBOX_FOCUS;
@ -349,7 +357,7 @@ static void UI_PlayerSetup_Init( void )
uiPlayerSetup.topColor.generic.flags = QMF_PULSEIFFOCUS|QMF_DROPSHADOW;
uiPlayerSetup.topColor.generic.name = "Top color";
uiPlayerSetup.topColor.generic.x = 350;
uiPlayerSetup.topColor.generic.y = 500;
uiPlayerSetup.topColor.generic.y = 550;
uiPlayerSetup.topColor.generic.callback = UI_PlayerSetup_Callback;
uiPlayerSetup.topColor.generic.statusText = "Set a player model top color";
uiPlayerSetup.topColor.minValue = 0.0;
@ -361,7 +369,7 @@ static void UI_PlayerSetup_Init( void )
uiPlayerSetup.bottomColor.generic.flags = QMF_PULSEIFFOCUS|QMF_DROPSHADOW;
uiPlayerSetup.bottomColor.generic.name = "Bottom color";
uiPlayerSetup.bottomColor.generic.x = 350;
uiPlayerSetup.bottomColor.generic.y = 570;
uiPlayerSetup.bottomColor.generic.y = 620;
uiPlayerSetup.bottomColor.generic.callback = UI_PlayerSetup_Callback;
uiPlayerSetup.bottomColor.generic.statusText = "Set a player model bottom color";
uiPlayerSetup.bottomColor.minValue = 0.0;
@ -377,6 +385,15 @@ static void UI_PlayerSetup_Init( void )
uiPlayerSetup.hiModels.generic.callback = UI_PlayerSetup_Callback;
uiPlayerSetup.hiModels.generic.statusText = "show hi-res models in multiplayer";
uiPlayerSetup.spectator.generic.id = ID_SPECTATOR;
uiPlayerSetup.spectator.generic.type = QMTYPE_CHECKBOX;
uiPlayerSetup.spectator.generic.flags = QMF_HIGHLIGHTIFFOCUS|QMF_ACT_ONRELEASE|QMF_MOUSEONLY|QMF_DROPSHADOW;
uiPlayerSetup.spectator.generic.name = "Play as a spectator";
uiPlayerSetup.spectator.generic.x = 72;
uiPlayerSetup.spectator.generic.y = 430;
uiPlayerSetup.spectator.generic.callback = UI_PlayerSetup_Callback;
uiPlayerSetup.spectator.generic.statusText = "enable spectator mode in multiplayer";
UI_PlayerSetup_GetConfig();
UI_AddItem( &uiPlayerSetup.menu, (void *)&uiPlayerSetup.background );
@ -389,6 +406,7 @@ static void UI_PlayerSetup_Init( void )
UI_AddItem( &uiPlayerSetup.menu, (void *)&uiPlayerSetup.topColor );
UI_AddItem( &uiPlayerSetup.menu, (void *)&uiPlayerSetup.bottomColor );
UI_AddItem( &uiPlayerSetup.menu, (void *)&uiPlayerSetup.hiModels );
UI_AddItem( &uiPlayerSetup.menu, (void *)&uiPlayerSetup.spectator );
// setup render and actor
uiPlayerSetup.refdef.fov_x = 40;