diff --git a/dlls/gravgunmod.cpp b/dlls/gravgunmod.cpp index edc6f4ed..6c48c01f 100644 --- a/dlls/gravgunmod.cpp +++ b/dlls/gravgunmod.cpp @@ -28,6 +28,8 @@ cvar_t mp_maxbmodeldist = { "mp_maxbmodeldist", "4096", FCVAR_SERVER}; cvar_t mp_maxtrashdist = { "mp_maxtrashdist", "4096", FCVAR_SERVER}; cvar_t mp_maxwaterdist = { "mp_maxwaterdist", "4096", FCVAR_SERVER}; cvar_t mp_maxotherdist = { "mp_maxotherdist", "4096", FCVAR_SERVER}; +cvar_t mp_servercliptents = { "mp_servercliptents", "0", FCVAR_SERVER}; +cvar_t mp_maxtentdist = { "mp_maxtentdist", "4096", FCVAR_SERVER}; void Ent_RunGC_f( void ); @@ -101,6 +103,8 @@ void GGM_RegisterCVars( void ) CVAR_REGISTER( &mp_maxtrashdist ); CVAR_REGISTER( &mp_maxwaterdist ); CVAR_REGISTER( &mp_maxotherdist ); + CVAR_REGISTER( &mp_servercliptents ); + CVAR_REGISTER( &mp_maxtentdist ); g_engfuncs.pfnAddServerCommand( "ent_rungc", Ent_RunGC_f ); } diff --git a/dlls/gravgunmod.h b/dlls/gravgunmod.h index 71a749f6..b333692c 100644 --- a/dlls/gravgunmod.h +++ b/dlls/gravgunmod.h @@ -25,6 +25,8 @@ extern cvar_t mp_maxbmodeldist; extern cvar_t mp_maxtrashdist; extern cvar_t mp_maxwaterdist; extern cvar_t mp_maxotherdist; +extern cvar_t mp_servercliptents; +extern cvar_t mp_maxtentdist; void GGM_RegisterCVars( void ); void Ent_RunGC( bool common, bool enttools, const char *userid, const char *pattern = NULL ); diff --git a/dlls/util.cpp b/dlls/util.cpp index c7feab31..68ea0865 100644 --- a/dlls/util.cpp +++ b/dlls/util.cpp @@ -1102,18 +1102,54 @@ void UTIL_BloodStream( const Vector &origin, const Vector &direction, int color, if( g_Language == LANGUAGE_GERMAN && color == BLOOD_COLOR_RED ) color = 0; - - MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, origin ); - WRITE_BYTE( TE_BLOODSTREAM ); - WRITE_COORD( origin.x ); - WRITE_COORD( origin.y ); - WRITE_COORD( origin.z ); - WRITE_COORD( direction.x ); - WRITE_COORD( direction.y ); - WRITE_COORD( direction.z ); - WRITE_BYTE( color ); - WRITE_BYTE( Q_min( amount, 255 ) ); - MESSAGE_END(); + if( mp_serverdistclip.value && mp_servercliptents.value ) + { + // loop through all players + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBaseEntity *pPlayer = UTIL_PlayerByIndex( i ); + if( pPlayer ) + { + Vector delta = origin - pPlayer->edict()->v.origin; + float dist = 0; + + if( abs(delta.x) > dist ) + dist = abs(delta.x); + if( abs(delta.y) > dist ) + dist = abs(delta.y); + if( abs(delta.z) > dist ) + dist = abs(delta.z); + if( dist > mp_maxtentdist.value) + continue; + + MESSAGE_BEGIN( MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, NULL, pPlayer->edict() ); + WRITE_BYTE( TE_BLOODSTREAM ); + WRITE_COORD( origin.x ); + WRITE_COORD( origin.y ); + WRITE_COORD( origin.z ); + WRITE_COORD( direction.x ); + WRITE_COORD( direction.y ); + WRITE_COORD( direction.z ); + WRITE_BYTE( color ); + WRITE_BYTE( Q_min( amount, 255 ) ); + MESSAGE_END(); + } + } + } + else + { + MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, origin ); + WRITE_BYTE( TE_BLOODSTREAM ); + WRITE_COORD( origin.x ); + WRITE_COORD( origin.y ); + WRITE_COORD( origin.z ); + WRITE_COORD( direction.x ); + WRITE_COORD( direction.y ); + WRITE_COORD( direction.z ); + WRITE_BYTE( color ); + WRITE_BYTE( Q_min( amount, 255 ) ); + MESSAGE_END(); + } } void UTIL_BloodDrips( const Vector &origin, const Vector &direction, int color, int amount ) @@ -1136,16 +1172,52 @@ void UTIL_BloodDrips( const Vector &origin, const Vector &direction, int color, if( amount > 255 ) amount = 255; - MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, origin ); - WRITE_BYTE( TE_BLOODSPRITE ); - WRITE_COORD( origin.x); // pos - WRITE_COORD( origin.y); - WRITE_COORD( origin.z); - WRITE_SHORT( g_sModelIndexBloodSpray ); // initial sprite model - WRITE_SHORT( g_sModelIndexBloodDrop ); // droplet sprite models - WRITE_BYTE( color ); // color index into host_basepal - WRITE_BYTE( Q_min( Q_max( 3, amount / 10 ), 16 ) ); // size - MESSAGE_END(); + if( mp_serverdistclip.value && mp_servercliptents.value ) + { + // loop through all players + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBaseEntity *pPlayer = UTIL_PlayerByIndex( i ); + if( pPlayer ) + { + Vector delta = origin - pPlayer->edict()->v.origin; + float dist = 0; + + if( abs(delta.x) > dist ) + dist = abs(delta.x); + if( abs(delta.y) > dist ) + dist = abs(delta.y); + if( abs(delta.z) > dist ) + dist = abs(delta.z); + if( dist > mp_maxtentdist.value) + continue; + + MESSAGE_BEGIN( MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, NULL, pPlayer->edict() ); + WRITE_BYTE( TE_BLOODSPRITE ); + WRITE_COORD( origin.x); // pos + WRITE_COORD( origin.y); + WRITE_COORD( origin.z); + WRITE_SHORT( g_sModelIndexBloodSpray ); // initial sprite model + WRITE_SHORT( g_sModelIndexBloodDrop ); // droplet sprite models + WRITE_BYTE( color ); // color index into host_basepal + WRITE_BYTE( Q_min( Q_max( 3, amount / 10 ), 16 ) ); // size + MESSAGE_END(); + } + } + } + else + { + MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, origin ); + WRITE_BYTE( TE_BLOODSPRITE ); + WRITE_COORD( origin.x); // pos + WRITE_COORD( origin.y); + WRITE_COORD( origin.z); + WRITE_SHORT( g_sModelIndexBloodSpray ); // initial sprite model + WRITE_SHORT( g_sModelIndexBloodDrop ); // droplet sprite models + WRITE_BYTE( color ); // color index into host_basepal + WRITE_BYTE( Q_min( Q_max( 3, amount / 10 ), 16 ) ); // size + MESSAGE_END(); + } } Vector UTIL_RandomBloodVector( void ) @@ -1217,15 +1289,50 @@ void UTIL_DecalTrace( TraceResult *pTrace, int decalNumber ) } } - MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); - WRITE_BYTE( message ); - WRITE_COORD( pTrace->vecEndPos.x ); - WRITE_COORD( pTrace->vecEndPos.y ); - WRITE_COORD( pTrace->vecEndPos.z ); - WRITE_BYTE( index ); - if( entityIndex ) - WRITE_SHORT( entityIndex ); - MESSAGE_END(); + if( mp_serverdistclip.value && mp_servercliptents.value ) + { + // loop through all players + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBaseEntity *pPlayer = UTIL_PlayerByIndex( i ); + if( pPlayer ) + { + Vector delta = pTrace->vecEndPos - pPlayer->edict()->v.origin; + float dist = 0; + + if( abs(delta.x) > dist ) + dist = abs(delta.x); + if( abs(delta.y) > dist ) + dist = abs(delta.y); + if( abs(delta.z) > dist ) + dist = abs(delta.z); + if( dist > mp_maxtentdist.value) + continue; + + MESSAGE_BEGIN( MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, NULL, pPlayer->edict() ); + WRITE_BYTE( message ); + WRITE_COORD( pTrace->vecEndPos.x ); + WRITE_COORD( pTrace->vecEndPos.y ); + WRITE_COORD( pTrace->vecEndPos.z ); + WRITE_BYTE( index ); + if( entityIndex ) + WRITE_SHORT( entityIndex ); + MESSAGE_END(); + } + } + } + else + { + MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); + WRITE_BYTE( message ); + WRITE_COORD( pTrace->vecEndPos.x ); + WRITE_COORD( pTrace->vecEndPos.y ); + WRITE_COORD( pTrace->vecEndPos.z ); + WRITE_BYTE( index ); + if( entityIndex ) + WRITE_SHORT( entityIndex ); + MESSAGE_END(); + } } /* @@ -1256,15 +1363,50 @@ void UTIL_PlayerDecalTrace( TraceResult *pTrace, int playernum, int decalNumber, if( pTrace->flFraction == 1.0 ) return; - MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); - WRITE_BYTE( TE_PLAYERDECAL ); - WRITE_BYTE( playernum ); - WRITE_COORD( pTrace->vecEndPos.x ); - WRITE_COORD( pTrace->vecEndPos.y ); - WRITE_COORD( pTrace->vecEndPos.z ); - WRITE_SHORT( (short)ENTINDEX( pTrace->pHit ) ); - WRITE_BYTE( index ); - MESSAGE_END(); + if( mp_serverdistclip.value && mp_servercliptents.value ) + { + // loop through all players + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBaseEntity *pPlayer = UTIL_PlayerByIndex( i ); + if( pPlayer ) + { + Vector delta = pTrace->vecEndPos - pPlayer->edict()->v.origin; + float dist = 0; + + if( abs(delta.x) > dist ) + dist = abs(delta.x); + if( abs(delta.y) > dist ) + dist = abs(delta.y); + if( abs(delta.z) > dist ) + dist = abs(delta.z); + if( dist > mp_maxtentdist.value) + continue; + + MESSAGE_BEGIN( MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, NULL, pPlayer->edict() ); + WRITE_BYTE( TE_PLAYERDECAL ); + WRITE_BYTE( playernum ); + WRITE_COORD( pTrace->vecEndPos.x ); + WRITE_COORD( pTrace->vecEndPos.y ); + WRITE_COORD( pTrace->vecEndPos.z ); + WRITE_SHORT( (short)ENTINDEX( pTrace->pHit ) ); + WRITE_BYTE( index ); + MESSAGE_END(); + } + } + } + else + { + MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); + WRITE_BYTE( TE_PLAYERDECAL ); + WRITE_BYTE( playernum ); + WRITE_COORD( pTrace->vecEndPos.x ); + WRITE_COORD( pTrace->vecEndPos.y ); + WRITE_COORD( pTrace->vecEndPos.z ); + WRITE_SHORT( (short)ENTINDEX( pTrace->pHit ) ); + WRITE_BYTE( index ); + MESSAGE_END(); + } } void UTIL_GunshotDecalTrace( TraceResult *pTrace, int decalNumber ) @@ -1279,35 +1421,135 @@ void UTIL_GunshotDecalTrace( TraceResult *pTrace, int decalNumber ) if( pTrace->flFraction == 1.0 ) return; - MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pTrace->vecEndPos ); - WRITE_BYTE( TE_GUNSHOTDECAL ); - WRITE_COORD( pTrace->vecEndPos.x ); - WRITE_COORD( pTrace->vecEndPos.y ); - WRITE_COORD( pTrace->vecEndPos.z ); - WRITE_SHORT( (short)ENTINDEX( pTrace->pHit ) ); - WRITE_BYTE( index ); - MESSAGE_END(); + if( mp_serverdistclip.value && mp_servercliptents.value ) + { + // loop through all players + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBaseEntity *pPlayer = UTIL_PlayerByIndex( i ); + if( pPlayer ) + { + Vector delta = pTrace->vecEndPos - pPlayer->edict()->v.origin; + float dist = 0; + + if( abs(delta.x) > dist ) + dist = abs(delta.x); + if( abs(delta.y) > dist ) + dist = abs(delta.y); + if( abs(delta.z) > dist ) + dist = abs(delta.z); + if( dist > mp_maxtentdist.value) + continue; + + MESSAGE_BEGIN( MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, NULL, pPlayer->edict()); + WRITE_BYTE( TE_GUNSHOTDECAL ); + WRITE_COORD( pTrace->vecEndPos.x ); + WRITE_COORD( pTrace->vecEndPos.y ); + WRITE_COORD( pTrace->vecEndPos.z ); + WRITE_SHORT( (short)ENTINDEX( pTrace->pHit ) ); + WRITE_BYTE( index ); + MESSAGE_END(); + } + } + } + else + { + MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pTrace->vecEndPos ); + WRITE_BYTE( TE_GUNSHOTDECAL ); + WRITE_COORD( pTrace->vecEndPos.x ); + WRITE_COORD( pTrace->vecEndPos.y ); + WRITE_COORD( pTrace->vecEndPos.z ); + WRITE_SHORT( (short)ENTINDEX( pTrace->pHit ) ); + WRITE_BYTE( index ); + MESSAGE_END(); + } } void UTIL_Sparks( const Vector &position ) { - MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, position ); - WRITE_BYTE( TE_SPARKS ); - WRITE_COORD( position.x ); - WRITE_COORD( position.y ); - WRITE_COORD( position.z ); - MESSAGE_END(); + + if( mp_serverdistclip.value && mp_servercliptents.value ) + { + // loop through all players + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBaseEntity *pPlayer = UTIL_PlayerByIndex( i ); + if( pPlayer ) + { + Vector delta = position - pPlayer->edict()->v.origin; + float dist = 0; + + if( abs(delta.x) > dist ) + dist = abs(delta.x); + if( abs(delta.y) > dist ) + dist = abs(delta.y); + if( abs(delta.z) > dist ) + dist = abs(delta.z); + if( dist > mp_maxtentdist.value) + continue; + + MESSAGE_BEGIN( MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, NULL, pPlayer->edict() ); + WRITE_BYTE( TE_SPARKS ); + WRITE_COORD( position.x ); + WRITE_COORD( position.y ); + WRITE_COORD( position.z ); + MESSAGE_END(); + } + } + } + else + { + MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, position ); + WRITE_BYTE( TE_SPARKS ); + WRITE_COORD( position.x ); + WRITE_COORD( position.y ); + WRITE_COORD( position.z ); + MESSAGE_END(); + } } void UTIL_Ricochet( const Vector &position, float scale ) { - MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, position ); - WRITE_BYTE( TE_ARMOR_RICOCHET ); - WRITE_COORD( position.x ); - WRITE_COORD( position.y ); - WRITE_COORD( position.z ); - WRITE_BYTE( (int)( scale * 10 ) ); - MESSAGE_END(); + if( mp_serverdistclip.value && mp_servercliptents.value ) + { + // loop through all players + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBaseEntity *pPlayer = UTIL_PlayerByIndex( i ); + if( pPlayer ) + { + Vector delta = position - pPlayer->edict()->v.origin; + float dist = 0; + + if( abs(delta.x) > dist ) + dist = abs(delta.x); + if( abs(delta.y) > dist ) + dist = abs(delta.y); + if( abs(delta.z) > dist ) + dist = abs(delta.z); + if( dist > mp_maxtentdist.value) + continue; + + MESSAGE_BEGIN( MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, NULL, pPlayer->edict() ); + WRITE_BYTE( TE_ARMOR_RICOCHET ); + WRITE_COORD( position.x ); + WRITE_COORD( position.y ); + WRITE_COORD( position.z ); + WRITE_BYTE( (int)( scale * 10 ) ); + MESSAGE_END(); + } + } + } + else + { + MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, position ); + WRITE_BYTE( TE_ARMOR_RICOCHET ); + WRITE_COORD( position.x ); + WRITE_COORD( position.y ); + WRITE_COORD( position.z ); + WRITE_BYTE( (int)( scale * 10 ) ); + MESSAGE_END(); + } } BOOL UTIL_TeamsMatch( const char *pTeamName1, const char *pTeamName2 )