22 Apr 2011
This commit is contained in:
parent
98a6e67ffd
commit
3efa573411
|
@ -1865,7 +1865,7 @@ client_textmessage_t *CL_TextMessageGet( const char *pName )
|
||||||
// find desired message
|
// find desired message
|
||||||
for( i = 0; i < clgame.numTitles; i++ )
|
for( i = 0; i < clgame.numTitles; i++ )
|
||||||
{
|
{
|
||||||
if( !Q_strcmp( pName, clgame.titles[i].pName ))
|
if( !Q_stricmp( pName, clgame.titles[i].pName ))
|
||||||
return clgame.titles + i;
|
return clgame.titles + i;
|
||||||
}
|
}
|
||||||
return NULL; // found nothing
|
return NULL; // found nothing
|
||||||
|
|
|
@ -2397,9 +2397,9 @@ void CL_UpdateFlashlight( cl_entity_t *pEnt )
|
||||||
falloff *= falloff;
|
falloff *= falloff;
|
||||||
|
|
||||||
// update flashlight endpos
|
// update flashlight endpos
|
||||||
dl = CL_AllocDlight( cl.playernum + 1 );
|
dl = CL_AllocDlight( pEnt->index );
|
||||||
VectorCopy( trace.endpos, dl->origin );
|
VectorCopy( trace.endpos, dl->origin );
|
||||||
dl->die = cl.time; // die on next frame
|
dl->die = cl.time + 0.01f; // die on next frame
|
||||||
dl->color.r = 255 * falloff;
|
dl->color.r = 255 * falloff;
|
||||||
dl->color.g = 255 * falloff;
|
dl->color.g = 255 * falloff;
|
||||||
dl->color.b = 255 * falloff;
|
dl->color.b = 255 * falloff;
|
||||||
|
|
|
@ -418,6 +418,8 @@ void S_StartSound( const vec3_t pos, int ent, int chan, sound_t handle, float fv
|
||||||
channel_t *target_chan, *check;
|
channel_t *target_chan, *check;
|
||||||
int vol, ch_idx;
|
int vol, ch_idx;
|
||||||
|
|
||||||
|
if( pitch <= 1 ) pitch = PITCH_NORM; // Invasion issues
|
||||||
|
|
||||||
if( !dma.initialized ) return;
|
if( !dma.initialized ) return;
|
||||||
sfx = S_GetSfxByHandle( handle );
|
sfx = S_GetSfxByHandle( handle );
|
||||||
if( !sfx ) return;
|
if( !sfx ) return;
|
||||||
|
|
|
@ -331,6 +331,7 @@ typedef struct
|
||||||
// used to check late spawns
|
// used to check late spawns
|
||||||
sv_client_t *clients; // [sv_maxclients->integer]
|
sv_client_t *clients; // [sv_maxclients->integer]
|
||||||
sv_client_t *currentPlayer; // current client who network message sending on
|
sv_client_t *currentPlayer; // current client who network message sending on
|
||||||
|
int currentPlayerNum; // for esay acess to some global arrays
|
||||||
int num_client_entities; // sv_maxclients->integer*UPDATE_BACKUP*MAX_PACKET_ENTITIES
|
int num_client_entities; // sv_maxclients->integer*UPDATE_BACKUP*MAX_PACKET_ENTITIES
|
||||||
int next_client_entities; // next client_entity to use
|
int next_client_entities; // next client_entity to use
|
||||||
entity_state_t *packet_entities; // [num_client_entities]
|
entity_state_t *packet_entities; // [num_client_entities]
|
||||||
|
|
|
@ -196,7 +196,8 @@ gotnewcl:
|
||||||
Q_strncpy( newcl->physinfo, physinfo, sizeof( physinfo ));
|
Q_strncpy( newcl->physinfo, physinfo, sizeof( physinfo ));
|
||||||
|
|
||||||
svs.currentPlayer = newcl;
|
svs.currentPlayer = newcl;
|
||||||
edictnum = (newcl - svs.clients) + 1;
|
svs.currentPlayerNum = (newcl - svs.clients);
|
||||||
|
edictnum = svs.currentPlayerNum + 1;
|
||||||
|
|
||||||
ent = EDICT_NUM( edictnum );
|
ent = EDICT_NUM( edictnum );
|
||||||
newcl->edict = ent;
|
newcl->edict = ent;
|
||||||
|
@ -292,7 +293,8 @@ edict_t *SV_FakeConnect( const char *netname )
|
||||||
// this is the only place a sv_client_t is ever initialized
|
// this is the only place a sv_client_t is ever initialized
|
||||||
*newcl = temp;
|
*newcl = temp;
|
||||||
svs.currentPlayer = newcl;
|
svs.currentPlayer = newcl;
|
||||||
edictnum = (newcl - svs.clients) + 1;
|
svs.currentPlayerNum = (newcl - svs.clients);
|
||||||
|
edictnum = svs.currentPlayerNum + 1;
|
||||||
|
|
||||||
if( newcl->frames )
|
if( newcl->frames )
|
||||||
Mem_Free( newcl->frames ); // fakeclients doesn't have frames
|
Mem_Free( newcl->frames ); // fakeclients doesn't have frames
|
||||||
|
@ -1693,6 +1695,8 @@ void SV_ExecuteClientCommand( sv_client_t *cl, char *s )
|
||||||
ucmd_t *u;
|
ucmd_t *u;
|
||||||
|
|
||||||
svs.currentPlayer = cl;
|
svs.currentPlayer = cl;
|
||||||
|
svs.currentPlayerNum = (cl - svs.clients);
|
||||||
|
|
||||||
Cmd_TokenizeString( s );
|
Cmd_TokenizeString( s );
|
||||||
|
|
||||||
for( u = ucmds; u->name; u++ )
|
for( u = ucmds; u->name; u++ )
|
||||||
|
|
|
@ -148,6 +148,7 @@ qboolean SV_SetPlayer( void )
|
||||||
{
|
{
|
||||||
// special case for local client
|
// special case for local client
|
||||||
svs.currentPlayer = svs.clients;
|
svs.currentPlayer = svs.clients;
|
||||||
|
svs.currentPlayerNum = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,6 +165,8 @@ qboolean SV_SetPlayer( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
svs.currentPlayer = &svs.clients[idnum];
|
svs.currentPlayer = &svs.clients[idnum];
|
||||||
|
svs.currentPlayerNum = idnum;
|
||||||
|
|
||||||
if( !svs.currentPlayer->state )
|
if( !svs.currentPlayer->state )
|
||||||
{
|
{
|
||||||
Msg( "Client %i is not active\n", idnum );
|
Msg( "Client %i is not active\n", idnum );
|
||||||
|
@ -179,12 +182,14 @@ qboolean SV_SetPlayer( void )
|
||||||
if( !Q_strcmp( cl->name, s ))
|
if( !Q_strcmp( cl->name, s ))
|
||||||
{
|
{
|
||||||
svs.currentPlayer = cl;
|
svs.currentPlayer = cl;
|
||||||
|
svs.currentPlayerNum = (cl - svs.clients);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Msg( "Userid %s is not on the server\n", s );
|
Msg( "Userid %s is not on the server\n", s );
|
||||||
svs.currentPlayer = NULL;
|
svs.currentPlayer = NULL;
|
||||||
|
svs.currentPlayerNum = 0;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -503,6 +503,7 @@ void SV_SendClientDatagram( sv_client_t *cl )
|
||||||
sizebuf_t msg;
|
sizebuf_t msg;
|
||||||
|
|
||||||
svs.currentPlayer = cl;
|
svs.currentPlayer = cl;
|
||||||
|
svs.currentPlayerNum = (cl - svs.clients);
|
||||||
|
|
||||||
BF_Init( &msg, "Datagram", msg_buf, sizeof( msg_buf ));
|
BF_Init( &msg, "Datagram", msg_buf, sizeof( msg_buf ));
|
||||||
|
|
||||||
|
@ -617,6 +618,7 @@ void SV_SendClientMessages( void )
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
svs.currentPlayer = NULL;
|
svs.currentPlayer = NULL;
|
||||||
|
svs.currentPlayerNum = 0;
|
||||||
|
|
||||||
if( sv.state == ss_dead )
|
if( sv.state == ss_dead )
|
||||||
return;
|
return;
|
||||||
|
@ -703,6 +705,7 @@ void SV_SendClientMessages( void )
|
||||||
|
|
||||||
// reset current client
|
// reset current client
|
||||||
svs.currentPlayer = NULL;
|
svs.currentPlayer = NULL;
|
||||||
|
svs.currentPlayerNum = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
#define DEBUG_NEW_CLIENTPVS_CHECK
|
#define DEBUG_NEW_CLIENTPVS_CHECK
|
||||||
|
|
||||||
// fatpvs stuff
|
// fatpvs stuff
|
||||||
static byte fatpvs[MAX_MAP_LEAFS/8];
|
static byte fatpvs[MAX_CLIENTS][MAX_MAP_LEAFS/8];
|
||||||
static byte fatphs[MAX_MAP_LEAFS/8];
|
static byte fatphs[MAX_CLIENTS][MAX_MAP_LEAFS/8];
|
||||||
static byte *bitvector;
|
static byte *bitvector;
|
||||||
static int fatbytes;
|
static int fatbytes;
|
||||||
|
|
||||||
|
@ -215,14 +215,12 @@ MSG_PHS send to clients potentially hearable from org
|
||||||
*/
|
*/
|
||||||
qboolean SV_Send( int dest, const vec3_t origin, const edict_t *ent )
|
qboolean SV_Send( int dest, const vec3_t origin, const edict_t *ent )
|
||||||
{
|
{
|
||||||
byte *mask = NULL;
|
|
||||||
int j, numclients = sv_maxclients->integer;
|
int j, numclients = sv_maxclients->integer;
|
||||||
sv_client_t *cl, *current = svs.clients;
|
sv_client_t *cl, *current = svs.clients;
|
||||||
qboolean reliable = false;
|
qboolean reliable = false;
|
||||||
qboolean specproxy = false;
|
qboolean specproxy = false;
|
||||||
float *viewOrg = NULL;
|
qboolean use_mask = false;
|
||||||
int numsends = 0;
|
int numsends = 0;
|
||||||
mleaf_t *leaf;
|
|
||||||
|
|
||||||
switch( dest )
|
switch( dest )
|
||||||
{
|
{
|
||||||
|
@ -246,16 +244,14 @@ qboolean SV_Send( int dest, const vec3_t origin, const edict_t *ent )
|
||||||
// intentional fallthrough
|
// intentional fallthrough
|
||||||
case MSG_PAS:
|
case MSG_PAS:
|
||||||
if( origin == NULL ) return false;
|
if( origin == NULL ) return false;
|
||||||
leaf = Mod_PointInLeaf( origin, sv.worldmodel->nodes );
|
use_mask = true;
|
||||||
mask = Mod_LeafPHS( leaf, sv.worldmodel );
|
|
||||||
break;
|
break;
|
||||||
case MSG_PVS_R:
|
case MSG_PVS_R:
|
||||||
reliable = true;
|
reliable = true;
|
||||||
// intentional fallthrough
|
// intentional fallthrough
|
||||||
case MSG_PVS:
|
case MSG_PVS:
|
||||||
if( origin == NULL ) return false;
|
if( origin == NULL ) return false;
|
||||||
leaf = Mod_PointInLeaf( origin, sv.worldmodel->nodes );
|
use_mask = true;
|
||||||
mask = Mod_LeafPVS( leaf, sv.worldmodel );
|
|
||||||
break;
|
break;
|
||||||
case MSG_ONE:
|
case MSG_ONE:
|
||||||
reliable = true;
|
reliable = true;
|
||||||
|
@ -296,34 +292,24 @@ qboolean SV_Send( int dest, const vec3_t origin, const edict_t *ent )
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// simple PAS checking in singleplayer (QW legacy)
|
if( use_mask )
|
||||||
if( sv_maxclients->integer == 1 && ( dest == MSG_PAS_R || dest == MSG_PAS ))
|
|
||||||
{
|
{
|
||||||
vec3_t delta;
|
int leafnum, clientnum;
|
||||||
|
byte *mask;
|
||||||
if( SV_IsValidEdict( cl->pViewEntity ))
|
|
||||||
viewOrg = cl->pViewEntity->v.origin;
|
|
||||||
else viewOrg = cl->edict->v.origin;
|
|
||||||
|
|
||||||
VectorSubtract( origin, viewOrg, delta );
|
|
||||||
if( VectorLength( delta ) <= 1534.0f )
|
|
||||||
goto inrange;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( mask )
|
|
||||||
{
|
|
||||||
int leafnum;
|
|
||||||
|
|
||||||
if( SV_IsValidEdict( cl->pViewEntity ))
|
|
||||||
viewOrg = cl->pViewEntity->v.origin;
|
|
||||||
else viewOrg = cl->edict->v.origin;
|
|
||||||
|
|
||||||
// -1 is because pvs rows are 1 based, not 0 based like leafs
|
// -1 is because pvs rows are 1 based, not 0 based like leafs
|
||||||
leafnum = Mod_PointLeafnum( viewOrg ) - 1;
|
leafnum = Mod_PointLeafnum( origin ) - 1;
|
||||||
if( mask && (!(mask[leafnum>>3] & (1<<( leafnum & 7 )))))
|
clientnum = cl - svs.clients;
|
||||||
|
|
||||||
|
if( dest == MSG_PAS_R || dest == MSG_PAS )
|
||||||
|
mask = fatphs[clientnum];
|
||||||
|
else if( dest == MSG_PVS_R || dest == MSG_PVS )
|
||||||
|
mask = fatpvs[clientnum];
|
||||||
|
|
||||||
|
if( !(mask[leafnum>>3] & (1<<( leafnum & 7 ))))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
inrange:
|
|
||||||
if( specproxy ) BF_WriteBits( &sv.spectator_datagram, BF_GetData( &sv.multicast ), BF_GetNumBitsWritten( &sv.multicast ));
|
if( specproxy ) BF_WriteBits( &sv.spectator_datagram, BF_GetData( &sv.multicast ), BF_GetNumBitsWritten( &sv.multicast ));
|
||||||
else if( reliable ) BF_WriteBits( &cl->netchan.message, BF_GetData( &sv.multicast ), BF_GetNumBitsWritten( &sv.multicast ));
|
else if( reliable ) BF_WriteBits( &cl->netchan.message, BF_GetData( &sv.multicast ), BF_GetNumBitsWritten( &sv.multicast ));
|
||||||
else BF_WriteBits( &cl->datagram, BF_GetData( &sv.multicast ), BF_GetNumBitsWritten( &sv.multicast ));
|
else BF_WriteBits( &cl->datagram, BF_GetData( &sv.multicast ), BF_GetNumBitsWritten( &sv.multicast ));
|
||||||
|
@ -3595,7 +3581,9 @@ byte *pfnSetFatPVS( const float *org )
|
||||||
if( !sv.worldmodel->visdata || sv_novis->integer || !org )
|
if( !sv.worldmodel->visdata || sv_novis->integer || !org )
|
||||||
return Mod_DecompressVis( NULL );
|
return Mod_DecompressVis( NULL );
|
||||||
|
|
||||||
bitvector = fatpvs;
|
ASSERT( svs.currentPlayerNum >= 0 && svs.currentPlayerNum < MAX_CLIENTS );
|
||||||
|
|
||||||
|
bitvector = fatpvs[svs.currentPlayerNum];
|
||||||
fatbytes = (sv.worldmodel->numleafs+31)>>3;
|
fatbytes = (sv.worldmodel->numleafs+31)>>3;
|
||||||
if(!( sv.hostflags & SVF_PORTALPASS ))
|
if(!( sv.hostflags & SVF_PORTALPASS ))
|
||||||
Q_memset( bitvector, 0, fatbytes );
|
Q_memset( bitvector, 0, fatbytes );
|
||||||
|
@ -3617,7 +3605,9 @@ byte *pfnSetFatPAS( const float *org )
|
||||||
if( !sv.worldmodel->visdata || sv_novis->integer || !org )
|
if( !sv.worldmodel->visdata || sv_novis->integer || !org )
|
||||||
return Mod_DecompressVis( NULL );
|
return Mod_DecompressVis( NULL );
|
||||||
|
|
||||||
bitvector = fatphs;
|
ASSERT( svs.currentPlayerNum >= 0 && svs.currentPlayerNum < MAX_CLIENTS );
|
||||||
|
|
||||||
|
bitvector = fatphs[svs.currentPlayerNum];
|
||||||
fatbytes = (sv.worldmodel->numleafs+31)>>3;
|
fatbytes = (sv.worldmodel->numleafs+31)>>3;
|
||||||
if(!( sv.hostflags & SVF_PORTALPASS ))
|
if(!( sv.hostflags & SVF_PORTALPASS ))
|
||||||
Q_memset( bitvector, 0, fatbytes );
|
Q_memset( bitvector, 0, fatbytes );
|
||||||
|
|
|
@ -1119,7 +1119,7 @@ static void SV_ClipToLinks( areanode_t *node, moveclip_t *clip )
|
||||||
// never collide items and player (because call "give" always stuck item in player
|
// never collide items and player (because call "give" always stuck item in player
|
||||||
// and total trace returns fail (old half-life bug)
|
// and total trace returns fail (old half-life bug)
|
||||||
// items touch should be done in SV_TouchLinks not here
|
// items touch should be done in SV_TouchLinks not here
|
||||||
if( touch->v.flags & ( FL_CLIENT|FL_FAKECLIENT|FL_MONSTER ))
|
if( touch->v.flags & ( FL_CLIENT|FL_FAKECLIENT ))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1247,7 +1247,7 @@ trace_t SV_MoveHull( const vec3_t start, int hullNumber, const vec3_t end, int t
|
||||||
clip.type = (type & 0xFF);
|
clip.type = (type & 0xFF);
|
||||||
clip.flags = (type & 0xFF00);
|
clip.flags = (type & 0xFF00);
|
||||||
clip.passedict = e;
|
clip.passedict = e;
|
||||||
clip.hull = hullNumber = bound( 0, hullNumber, 3 );
|
clip.hull = bound( 0, hullNumber, 3 );
|
||||||
clip.mins = sv.worldmodel->hulls[clip.hull].clip_mins;
|
clip.mins = sv.worldmodel->hulls[clip.hull].clip_mins;
|
||||||
clip.maxs = sv.worldmodel->hulls[clip.hull].clip_maxs;
|
clip.maxs = sv.worldmodel->hulls[clip.hull].clip_maxs;
|
||||||
clip.flags |= FMOVE_SIMPLEBOX; // completely ignore hitboxes, trace hulls only
|
clip.flags |= FMOVE_SIMPLEBOX; // completely ignore hitboxes, trace hulls only
|
||||||
|
|
Reference in New Issue