/* =============== CL_ParticleBurst =============== */ void CL_ParticleBurst( const vec3_t org, int size, int color, float life ) { particle_t *p; float vel; vec3_t dir; int i, j, k; for( i = -size; i < size; i++ ) { for( j = -size; j < size; j++ ) { for( k = 0; k < 1; k++ ) { p = CL_AllocParticle( NULL ); if( !p ) return; p->die += life + Com_RandomFloat( 0.0f, 0.1f ); p->color = color; p->type = pt_slowgrav; dir[0] = j * 8 + Com_RandomLong( 0, 8 ); dir[1] = i * 8 + Com_RandomLong( 0, 8 ); dir[2] = 256; p->org[0] = org[0] + dir[0]; p->org[1] = org[1] + dir[1]; p->org[2] = org[2] + Com_RandomLong( 0, 64 ); VectorNormalize( dir ); vel = 50 + Com_RandomLong( 0, 64 ); VectorScale( dir, vel, p->vel ); } } } }
/* =============== CL_LavaSplash =============== */ void CL_LavaSplash( const vec3_t org ) { particle_t *p; float vel; vec3_t dir; int i, j, k; for( i = -16; i < 16; i++ ) { for( j = -16; j <16; j++ ) { for( k = 0; k < 1; k++ ) { p = CL_AllocParticle( NULL ); if( !p ) return; p->die += 2.0f + Com_RandomFloat( 0.0f, 0.65f ); p->color = 224 + Com_RandomLong( 0, 8 ); p->type = pt_slowgrav; dir[0] = j * 8 + Com_RandomLong( 0, 8 ); dir[1] = i * 8 + Com_RandomLong( 0, 8 ); dir[2] = 256; p->org[0] = org[0] + dir[0]; p->org[1] = org[1] + dir[1]; p->org[2] = org[2] + Com_RandomLong( 0, 64 ); VectorNormalize( dir ); vel = 50 + Com_RandomLong( 0, 64 ); VectorScale( dir, vel, p->vel ); } } } }
/* =============== CL_TeleportSplash =============== */ void CL_TeleportSplash( const vec3_t org ) { particle_t *p; vec3_t dir; int i, j, k; for( i = -16; i < 16; i += 4 ) { for( j = -16; j < 16; j += 4 ) { for( k = -24; k < 32; k += 4 ) { p = CL_AllocParticle( NULL ); if( !p ) return; p->die += Com_RandomFloat( 0.2f, 0.36f ); p->color = Com_RandomLong( 7, 14 ); p->type = pt_slowgrav; dir[0] = j * 8; dir[1] = i * 8; dir[2] = k * 8; p->org[0] = org[0] + i + Com_RandomFloat( -4.0f, 4.0f ); p->org[1] = org[1] + j + Com_RandomFloat( -4.0f, 4.0f ); p->org[2] = org[2] + k + Com_RandomFloat( -4.0f, 4.0f ); VectorNormalize( dir ); VectorScale( dir, Com_RandomLong( 50, 114 ), p->vel ); } } } }
void EV_FireGALIL( event_args_t *args ) { vec3_t ShellVelocity; vec3_t ShellOrigin; vec3_t vecSrc, vecAiming; int idx = args->entindex; Vector origin( args->origin ); Vector angles( args->iparam1 / 100.0f + args->angles[0], args->iparam2 / 100.0f + args->angles[1], args->angles[2] ); Vector velocity( args->velocity ); Vector forward, right, up; AngleVectors( angles, forward, right, up ); if ( EV_IsLocal( idx ) ) { ++g_iShotsFired; EV_MuzzleFlash(); gEngfuncs.pEventAPI->EV_WeaponAnimation(GALIL_SHOOT1 + Com_RandomLong(0,2), 2); if( !gHUD.cl_righthand->value ) { EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20.0, -8.0, -10.0, 0); } else { EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20.0, -8.0, 10.0, 0); } } else { EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20.0, -12.0, 4.0, 0); } EV_EjectBrass(ShellOrigin, ShellVelocity, angles[ YAW ], g_iRShell, TE_BOUNCE_SHELL); PLAY_EVENT_SOUND( SOUNDS_NAME[Com_RandomLong( 0, 1 )] ); EV_GetGunPosition( args, vecSrc, origin ); VectorCopy( forward, vecAiming ); Vector vSpread; vSpread.x = args->fparam1; vSpread.y = args->fparam2; EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, vSpread, 8192.0, BULLET_PLAYER_556MM, 2 ); }
/* =============== ParticleEffect PARTICLE_EFFECT on server =============== */ void CL_RunParticleEffect( const vec3_t org, const vec3_t dir, int color, int count ) { particle_t *p; int i, j; if( count == 1024 ) { // Quake hack: count == 255 it's a RocketExplode CL_ParticleExplosion( org ); return; } for( i = 0; i < count; i++ ) { p = CL_AllocParticle( NULL ); if( !p ) return; p->die += Com_RandomFloat( 0.0f, 0.5f ); p->color = ( color & ~7 ) + Com_RandomLong( 0, 8 ); p->type = pt_slowgrav; for( j = 0; j < 3; j++ ) { p->org[j] = org[j] + Com_RandomFloat( -8, 8 ); p->vel[j] = dir[j] * 15; } } }
void CStudioModelRenderer::StudioFxTransform(cl_entity_t *ent, float transform[3][4]) { switch (ent->curstate.renderfx) { case kRenderFxDistort: case kRenderFxHologram: { if (Com_RandomLong(0, 49) == 0) { int axis = Com_RandomLong(0, 1); if (axis == 1) axis = 2; VectorScale( transform[axis], gEngfuncs.pfnRandomFloat(1,1.484), transform[axis] ); } else if (Com_RandomLong(0, 49) == 0) { float offset; int axis = Com_RandomLong(0, 1); if (axis == 1) axis = 2; offset = gEngfuncs.pfnRandomFloat(-10, 10); transform[Com_RandomLong(0, 2)][3] += offset; } break; } case kRenderFxExplode: { float scale; scale = 1.0 + (m_clTime - ent->curstate.animtime) * 10.0; if (scale > 2) scale = 2; transform[0][1] *= scale; transform[1][1] *= scale; transform[2][1] *= scale; break; } } }
int CHudNVG::Draw(float flTime) { if( gEngfuncs.IsSpectateOnly() ) { return 1; } gEngfuncs.pfnFillRGBABlend(0, 0, ScreenWidth, ScreenHeight, 50, 225, 50, m_iAlpha); // draw a dynamic light on player's origin if( cl_fancy_nvg->value ) { // recreate new dlight every frame dlight_t *dl = gEngfuncs.pEfxAPI->CL_AllocDlight ( 0 ); dl->origin = gHUD.m_vecOrigin; dl->radius = Com_RandomLong( 750, 800 ); dl->die = flTime + 0.1f; dl->color.r = 50; dl->color.g = 255; dl->color.b = 50; } else { // recreate if died if( !m_pLight || m_pLight->die < flTime ) { m_pLight = gEngfuncs.pEfxAPI->CL_AllocDlight( 0 ); // I hope no one is crazy so much to keep NVG for 9999 seconds m_pLight->die = flTime + 9999.0f; m_pLight->color.r = 50; m_pLight->color.g = 255; m_pLight->color.b = 50; } // just update origin if( m_pLight ) { m_pLight->origin = gHUD.m_vecOrigin; m_pLight->radius = Com_RandomLong( 750, 800 ); } } return 1; }
/* ================ CL_InitParticles ================ */ void CL_InitParticles( void ) { int i; cl_particles = Mem_Alloc( cls.mempool, sizeof( particle_t ) * GI->max_particles ); CL_ClearParticles (); // this is used for EF_BRIGHTFIELD for( i = 0; i < NUMVERTEXNORMALS; i++ ) { cl_avelocities[i][0] = Com_RandomLong( 0, 255 ) * 0.01f; cl_avelocities[i][1] = Com_RandomLong( 0, 255 ) * 0.01f; cl_avelocities[i][2] = Com_RandomLong( 0, 255 ) * 0.01f; } tracerred = Cvar_Get( "tracerred", "0.8", 0, "tracer red component weight ( 0 - 1.0 )" ); tracergreen = Cvar_Get( "tracergreen", "0.8", 0, "tracer green component weight ( 0 - 1.0 )" ); tracerblue = Cvar_Get( "tracerblue", "0.4", 0, "tracer blue component weight ( 0 - 1.0 )" ); traceralpha = Cvar_Get( "traceralpha", "0.5", 0, "tracer alpha amount ( 0 - 1.0 )" ); tracerspeed = Cvar_Get( "tracerspeed", "6000", 0, "tracer speed" ); tracerlength = Cvar_Get( "tracerlength", "0.8", 0, "tracer length factor" ); traceroffset = Cvar_Get( "traceroffset", "30", 0, "tracer starting offset" ); }
/* =============== Netchan_Init =============== */ void Netchan_Init( void ) { int port; // pick a port value that should be nice and random port = Com_RandomLong( 1, 65535 ); net_showpackets = Cvar_Get ("net_showpackets", "0", 0, "show network packets" ); net_chokeloopback = Cvar_Get( "net_chokeloop", "0", 0, "apply bandwidth choke to loopback packets" ); net_drawslider = Cvar_Get( "net_drawslider", "0", CVAR_ARCHIVE, "draw completion slider during signon" ); net_blocksize = Cvar_Get( "net_blocksize", "1024", 0, "network file fragmentation block size" ); net_showdrop = Cvar_Get( "net_showdrop", "0", 0, "show packets that are dropped" ); net_speeds = Cvar_Get( "net_speeds", "0", CVAR_ARCHIVE, "show network packets" ); net_qport = Cvar_Get( "net_qport", va( "%i", port ), CVAR_INIT, "current quake netport" ); net_mempool = Mem_AllocPool( "Network Pool" ); Huff_Init (); // initialize huffman compression BF_InitMasks (); // initialize bit-masks }
/* =============== CL_ParticleExplosion =============== */ void CL_ParticleExplosion( const vec3_t org ) { particle_t *p; int i, j; int hSound; if( !org ) return; hSound = S_RegisterSound( "weapons/explode3.wav" ); S_StartSound( org, 0, CHAN_AUTO, hSound, VOL_NORM, ATTN_NORM, PITCH_NORM, 0 ); for( i = 0; i < 1024; i++ ) { p = CL_AllocParticle( NULL ); if( !p ) return; p->die += 5.0f; p->color = ramp1[0]; p->ramp = Com_RandomLong( 0, 4 ); if( i & 1 ) { p->type = pt_explode; for( j = 0; j < 3; j++ ) { p->org[j] = org[j] + Com_RandomFloat( -16.0f, 16.0f ); p->vel[j] = Com_RandomFloat( -256.0f, 256.0f ); } } else { p->type = pt_explode2; for( j = 0; j < 3; j++ ) { p->org[j] = org[j] + Com_RandomFloat( -16.0f, 16.0f ); p->vel[j] = Com_RandomFloat( -256.0f, 256.0f ); } } } }
void EV_FireAWP( event_args_t *args ) { vec3_t vecSrc, vecAiming; int idx = args->entindex; Vector origin( args->origin ); Vector angles( args->iparam1 / 100.0f + args->angles[0], args->iparam2 / 100.0f + args->angles[1], args->angles[2] ); Vector forward, right, up; AngleVectors( angles, forward, right, up ); if ( EV_IsLocal( idx ) ) { ++g_iShotsFired; EV_MuzzleFlash(); gEngfuncs.pEventAPI->EV_WeaponAnimation( Com_RandomLong(AWP_SHOOT1, AWP_SHOOT3), 2 ); } PLAY_EVENT_SOUND( SOUNDS_NAME ); EV_GetGunPosition( args, vecSrc, origin ); VectorCopy( forward, vecAiming ); Vector vSpread; int tracerCount; vSpread.x = args->fparam1; vSpread.y = args->fparam2; EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, vSpread, 8192.0, BULLET_PLAYER_338MAG, 0, &tracerCount, 3 ); }
void SV_NewChaseDir( edict_t *actor, vec3_t destination, float dist ) { float deltax, deltay; float tempdir, olddir, turnaround; vec3_t d; olddir = anglemod(((int)( actor->v.ideal_yaw / 45.0f )) * 45.0f ); turnaround = anglemod( olddir - 180 ); deltax = destination[0] - actor->v.origin[0]; deltay = destination[1] - actor->v.origin[1]; if( deltax > 10 ) d[1] = 0.0f; else if( deltax < -10 ) d[1] = 180.0f; else d[1] = -1; if( deltay < -10 ) d[2] = 270.0f; else if( deltay > 10 ) d[2] = 90.0f; else d[2] = -1; // try direct route if( d[1] != -1 && d[2] != -1 ) { if( d[1] == 0.0f ) tempdir = ( d[2] == 90.0f ) ? 45.0f : 315.0f; else tempdir = ( d[2] == 90.0f ) ? 135.0f : 215.0f; if( tempdir != turnaround && SV_StepDirection( actor, tempdir, dist )) return; } // try other directions if( Com_RandomLong( 0, 1 ) != 0 || fabs( deltay ) > fabs( deltax )) { tempdir = d[1]; d[1] = d[2]; d[2] = tempdir; } if( d[1] != -1 && d[1] != turnaround && SV_StepDirection( actor, d[1], dist )) return; if( d[2] != -1 && d[2] != turnaround && SV_StepDirection( actor, d[2], dist )) return; // there is no direct path to the player, so pick another direction if( olddir != -1 && SV_StepDirection( actor, olddir, dist )) return; // fine, just run somewhere. if( Com_RandomLong( 0, 1 ) != 1 ) { for( tempdir = 0; tempdir <= 315; tempdir += 45 ) { if( tempdir != turnaround && SV_StepDirection( actor, tempdir, dist )) return; } } else { for( tempdir = 315; tempdir >= 0; tempdir -= 45 ) { if( tempdir != turnaround && SV_StepDirection( actor, tempdir, dist )) return; } } // we tried. run backwards. that ought to work... if( turnaround != -1 && SV_StepDirection( actor, turnaround, dist )) return; // well, we're stuck somehow. actor->v.ideal_yaw = olddir; // if a bridge was pulled out from underneath a monster, it may not have // a valid standing position at all. if( !SV_CheckBottom( actor, MOVE_NORMAL )) { actor->v.flags |= FL_PARTIALGROUND; } }
qboolean CL_AddVisibleEntity( cl_entity_t *ent, int entityType ) { if( !ent || !ent->model ) return false; if( entityType == ET_TEMPENTITY ) { // copy actual origin and angles back to let StudioModelRenderer // get actual value directly from curstate VectorCopy( ent->origin, ent->curstate.origin ); VectorCopy( ent->angles, ent->curstate.angles ); } if( CL_IsInMenu( ) && ( !cl.background || ent->player )) { // menu entities ignores client filter if( !R_AddEntity( ent, entityType )) return false; } else { // check for adding this entity if( !clgame.dllFuncs.pfnAddEntity( entityType, ent, ent->model->name )) return false; // don't add himself on firstperson if( RP_LOCALCLIENT( ent ) && !cl.thirdperson && cls.key_dest != key_menu && cl.refdef.viewentity == ( cl.playernum + 1 )) { if( gl_allow_mirrors->integer && world.has_mirrors ) { if( !R_AddEntity( ent, entityType )) return false; } // otherwise just pass to player effects like flashlight, particles etc } else if( entityType == ET_BEAM ) { CL_AddCustomBeam( ent ); return true; } else if( !R_AddEntity( ent, entityType )) { return false; } } // set actual entity type ent->curstate.entityType = entityType; // apply effects if( ent->curstate.effects & EF_BRIGHTFIELD ) CL_EntityParticles( ent ); // add in muzzleflash effect if( ent->curstate.effects & EF_MUZZLEFLASH ) { dlight_t *dl; if( ent == &clgame.viewent ) ent->curstate.effects &= ~EF_MUZZLEFLASH; dl = CL_AllocElight( 0 ); VectorCopy( ent->attachment[0], dl->origin ); dl->die = cl.time + 0.05f; dl->color.r = 255; dl->color.g = 180; dl->color.b = 64; dl->radius = 100; } // add light effect if( ent->curstate.effects & EF_LIGHT ) { dlight_t *dl = CL_AllocDlight( ent->curstate.number ); VectorCopy( ent->origin, dl->origin ); dl->die = cl.time; // die at next frame dl->color.r = 100; dl->color.g = 100; dl->color.b = 100; dl->radius = 200; CL_RocketFlare( ent->origin ); } // add dimlight if( ent->curstate.effects & EF_DIMLIGHT ) { if( entityType == ET_PLAYER ) { CL_UpdateFlashlight( ent ); } else { dlight_t *dl = CL_AllocDlight( ent->curstate.number ); VectorCopy( ent->origin, dl->origin ); dl->die = cl.time; // die at next frame dl->color.r = 255; dl->color.g = 255; dl->color.b = 255; dl->radius = Com_RandomLong( 200, 230 ); } } if( ent->curstate.effects & EF_BRIGHTLIGHT ) { dlight_t *dl = CL_AllocDlight( 0 ); VectorSet( dl->origin, ent->origin[0], ent->origin[1], ent->origin[2] + 16.0f ); dl->die = cl.time + 0.001f; // die at next frame dl->color.r = 255; dl->color.g = 255; dl->color.b = 255; if( entityType == ET_PLAYER ) dl->radius = 430; else dl->radius = Com_RandomLong( 400, 430 ); } if( ent->model->type == mod_studio ) { if( ent->model->flags & STUDIO_ROTATE ) ent->angles[1] = anglemod( 100.0f * cl.time ); if( ent->model->flags & STUDIO_GIB ) CL_RocketTrail( ent->prevstate.origin, ent->curstate.origin, 2 ); else if( ent->model->flags & STUDIO_ZOMGIB ) CL_RocketTrail( ent->prevstate.origin, ent->curstate.origin, 4 ); else if( ent->model->flags & STUDIO_TRACER ) CL_RocketTrail( ent->prevstate.origin, ent->curstate.origin, 3 ); else if( ent->model->flags & STUDIO_TRACER2 ) CL_RocketTrail( ent->prevstate.origin, ent->curstate.origin, 5 ); else if( ent->model->flags & STUDIO_ROCKET ) { dlight_t *dl = CL_AllocDlight( ent->curstate.number ); VectorCopy( ent->origin, dl->origin ); dl->color.r = 255; dl->color.g = 255; dl->color.b = 255; // HACKHACK: get radius from head entity if( ent->curstate.rendermode != kRenderNormal ) dl->radius = max( 0, ent->curstate.renderamt - 55 ); else dl->radius = 200; dl->die = cl.time + 0.01f; CL_RocketTrail( ent->prevstate.origin, ent->curstate.origin, 0 ); } else if( ent->model->flags & STUDIO_GRENADE ) CL_RocketTrail( ent->prevstate.origin, ent->curstate.origin, 1 ); else if( ent->model->flags & STUDIO_TRACER3 ) CL_RocketTrail( ent->prevstate.origin, ent->curstate.origin, 6 ); } return true; }
/* =============== CL_RocketTrail =============== */ void CL_RocketTrail( vec3_t start, vec3_t end, int type ) { vec3_t vec; float len; particle_t *p; int j, dec; static int tracercount; VectorSubtract( end, start, vec ); len = VectorNormalizeLength( vec ); if( type < 128 ) { dec = 3; } else { dec = 1; type -= 128; } while( len > 0 ) { len -= dec; p = CL_AllocParticle( NULL ); if( !p ) return; p->die += 2.0f; switch( type ) { case 0: // rocket trail p->ramp = Com_RandomLong( 0, 4 ); p->color = ramp3[(int)p->ramp]; p->type = pt_fire; for( j = 0; j < 3; j++ ) p->org[j] = start[j] + ((rand() % 6 ) - 3 ); break; case 1: // smoke smoke p->ramp = Com_RandomLong( 2, 6 ); p->color = ramp3[(int)p->ramp]; p->type = pt_fire; for( j = 0; j < 3; j++ ) p->org[j] = start[j] + ((rand() % 6 ) - 3 ); break; case 2: // blood p->type = pt_grav; p->color = Com_RandomLong( 67, 71 ); for( j = 0; j < 3; j++ ) p->org[j] = start[j] + ((rand() % 6 ) - 3 ); break; case 3: case 5: // tracer p->die += 0.5f; p->type = pt_static; if( type == 3 ) p->color = 52 + (( tracercount & 4 )<<1 ); else p->color = 230 + (( tracercount & 4 )<<1 ); tracercount++; VectorCopy( start, p->org ); if( tracercount & 1 ) { p->vel[0] = 30 * vec[1]; p->vel[1] = 30 * -vec[0]; } else { p->vel[0] = 30 * -vec[1]; p->vel[1] = 30 * vec[0]; } break; case 4: // slight blood p->type = pt_grav; p->color = Com_RandomLong( 67, 71 ); for( j = 0; j < 3; j++ ) p->org[j] = start[j] + Com_RandomFloat( -3.0f, 3.0f ); len -= 3; break; case 6: // voor trail p->color = Com_RandomLong( 152, 156 ); p->type = pt_static; p->die += 0.3f; for( j = 0; j < 3; j++ ) p->org[j] = start[j] + Com_RandomFloat( -16.0f, 16.0f ); break; } VectorAdd( start, vec, start ); } }
void SV_WaterMove( edict_t *ent ) { float drownlevel; int waterlevel; int watertype; int flags; if( ent->v.movetype == MOVETYPE_NOCLIP ) { ent->v.air_finished = sv.time + 12.0f; return; } // no watermove for monsters but pushables if(( ent->v.flags & FL_MONSTER ) && ent->v.health <= 0.0f ) return; drownlevel = (ent->v.deadflag == DEAD_NO) ? 3.0 : 1.0; waterlevel = ent->v.waterlevel; watertype = ent->v.watertype; flags = ent->v.flags; if( !( flags & ( FL_IMMUNE_WATER|FL_GODMODE ))) { if((( flags & FL_SWIM ) && waterlevel > drownlevel ) || waterlevel <= drownlevel ) { if( ent->v.air_finished > sv.time && ent->v.pain_finished > sv.time ) { ent->v.dmg += 2; if( ent->v.dmg < 15 ) ent->v.dmg = 10; // quake1 original code ent->v.pain_finished = sv.time + 1.0f; } } else { ent->v.air_finished = sv.time + 12.0f; ent->v.dmg = 2; } } if( !waterlevel ) { if( flags & FL_INWATER ) { // leave the water. switch( Com_RandomLong( 0, 3 )) { case 0: SV_StartSound( ent, CHAN_BODY, "player/pl_wade1.wav", 1.0f, ATTN_NORM, 0, 100 ); break; case 1: SV_StartSound( ent, CHAN_BODY, "player/pl_wade2.wav", 1.0f, ATTN_NORM, 0, 100 ); break; case 2: SV_StartSound( ent, CHAN_BODY, "player/pl_wade3.wav", 1.0f, ATTN_NORM, 0, 100 ); break; case 3: SV_StartSound( ent, CHAN_BODY, "player/pl_wade4.wav", 1.0f, ATTN_NORM, 0, 100 ); break; } ent->v.flags = flags & ~FL_INWATER; } ent->v.air_finished = sv.time + 12.0f; return; } if( watertype == CONTENTS_LAVA ) { if((!( flags & ( FL_IMMUNE_LAVA|FL_GODMODE ))) && ent->v.dmgtime < sv.time ) { if( ent->v.radsuit_finished < sv.time ) ent->v.dmgtime = sv.time + 0.2f; else ent->v.dmgtime = sv.time + 1.0f; } } else if( watertype == CONTENTS_SLIME ) { if((!( flags & ( FL_IMMUNE_SLIME|FL_GODMODE ))) && ent->v.dmgtime < sv.time ) { if( ent->v.radsuit_finished < sv.time ) ent->v.dmgtime = sv.time + 1.0; // otherwise radsuit is fully protect entity from slime } } if( !( flags & FL_INWATER )) { if( watertype == CONTENTS_WATER ) { // entering the water switch( Com_RandomLong( 0, 3 )) { case 0: SV_StartSound( ent, CHAN_BODY, "player/pl_wade1.wav", 1.0f, ATTN_NORM, 0, 100 ); break; case 1: SV_StartSound( ent, CHAN_BODY, "player/pl_wade2.wav", 1.0f, ATTN_NORM, 0, 100 ); break; case 2: SV_StartSound( ent, CHAN_BODY, "player/pl_wade3.wav", 1.0f, ATTN_NORM, 0, 100 ); break; case 3: SV_StartSound( ent, CHAN_BODY, "player/pl_wade4.wav", 1.0f, ATTN_NORM, 0, 100 ); break; } } ent->v.flags = flags | FL_INWATER; ent->v.dmgtime = 0.0f; } if( !( flags & FL_WATERJUMP )) { VectorMA( ent->v.velocity, ( ent->v.waterlevel * -0.8f * host.frametime ), ent->v.velocity, ent->v.velocity ); } }
void EV_FireUSP( event_args_t *args ) { vec3_t ShellVelocity; vec3_t ShellOrigin; vec3_t vecSrc, vecAiming; bool silencer_on = !args->bparam2; bool empty = !args->bparam1; int idx = args->entindex; Vector origin( args->origin ); Vector angles( args->iparam1 / 100.0f + args->angles[0], args->iparam2 / 100.0f + args->angles[1], args->angles[2] ); Vector velocity( args->velocity ); Vector forward, right, up; AngleVectors( angles, forward, right, up ); if ( EV_IsLocal( idx ) ) { ++g_iShotsFired; int seq; if( g_bHoldingShield ) { if( !empty ) seq = Com_RandomLong(USP_SHIELD_SHOOT1, USP_SHIELD_SHOOT2); else seq = USP_SHIELD_SHOOT_EMPTY; } else if ( silencer_on ) { if( !empty ) seq = Com_RandomLong(USP_UNSIL_SHOOT1, USP_UNSIL_SHOOT3); else seq = USP_UNSIL_SHOOT_EMPTY; } else { EV_MuzzleFlash(); if( !empty ) seq = Com_RandomLong(USP_SHOOT1, USP_SHOOT3); else seq = USP_SHOOT_EMPTY; } gEngfuncs.pEventAPI->EV_WeaponAnimation(seq, 2); if( !gHUD.cl_righthand->value ) { EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 36.0, -14.0, -14.0, 0); } else { EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 36.0, -14.0, 14.0, 0); } } else { EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20.0, -12.0, 4.0, 0); } EV_EjectBrass(ShellOrigin, ShellVelocity, angles[ YAW ], g_iPShell, TE_BOUNCE_SHELL); PLAY_EVENT_SOUND( silencer_on? SOUNDS_NAME[2] : SOUNDS_NAME[Com_RandomLong(0, 1)] ); EV_GetGunPosition( args, vecSrc, origin ); VectorCopy( forward, vecAiming ); Vector vSpread; int tracerCount; vSpread.x = args->fparam1; vSpread.y = args->fparam2; EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, vSpread, 8192.0, BULLET_PLAYER_45ACP, 0, &tracerCount, 2 ); }
static const char *R_DetailTextureForName( const char *name ) { const dmaterial_t *table; if( !name || !*name ) return NULL; if( !Q_strnicmp( name, "sky", 3 )) return NULL; // never details for sky // never apply details for liquids if( !Q_strnicmp( name + 1, "!lava", 5 )) return NULL; if( !Q_strnicmp( name + 1, "!slime", 6 )) return NULL; if( !Q_strnicmp( name, "!cur_90", 7 )) return NULL; if( !Q_strnicmp( name, "!cur_0", 6 )) return NULL; if( !Q_strnicmp( name, "!cur_270", 8 )) return NULL; if( !Q_strnicmp( name, "!cur_180", 8 )) return NULL; if( !Q_strnicmp( name, "!cur_up", 7 )) return NULL; if( !Q_strnicmp( name, "!cur_dwn", 8 )) return NULL; if( name[0] == '!' ) return NULL; // never apply details to the special textures if( !Q_strnicmp( name, "origin", 6 )) return NULL; if( !Q_strnicmp( name, "clip", 4 )) return NULL; if( !Q_strnicmp( name, "hint", 4 )) return NULL; if( !Q_strnicmp( name, "skip", 4 )) return NULL; if( !Q_strnicmp( name, "translucent", 11 )) return NULL; if( !Q_strnicmp( name, "3dsky", 5 )) // xash-mod support :-) return NULL; if( !Q_strnicmp( name, "scroll", 6 )) return NULL; if( name[0] == '@' ) return NULL; // last check ... if( !Q_strnicmp( name, "null", 4 )) return NULL; for( table = detail_table; table && table->texname; table++ ) { if( Q_stristr( name, table->texname )) { if(( table->lMin + table->lMax ) > 0 ) return va( table->detail, Com_RandomLong( table->lMin, table->lMax )); return table->detail; } } return NULL; }
/* ================ CL_UpdateParticle update particle color, position etc ================ */ void CL_UpdateParticle( particle_t *p, float ft ) { float time3 = 15.0 * ft; float time2 = 10.0 * ft; float time1 = 5.0 * ft; float dvel = 4 * ft; float grav = ft * clgame.movevars.gravity * 0.05f; float size = 1.5f; int i, iRamp, alpha = 255; vec3_t right, up; rgb_t color; r_stats.c_particle_count++; switch( p->type ) { case pt_static: break; case pt_tracer: case pt_clientcustom: if( p->callback ) { p->callback( p, ft ); } if( p->type == pt_tracer ) return; // already drawed break; case pt_fire: p->ramp += time1; if( p->ramp >= 6 ) p->die = -1; else p->color = ramp3[(int)p->ramp]; p->vel[2] += grav; break; case pt_explode: p->ramp += time2; if( p->ramp >= 8 ) p->die = -1; else p->color = ramp1[(int)p->ramp]; for( i = 0; i < 3; i++ ) p->vel[i] += p->vel[i] * dvel; p->vel[2] -= grav; break; case pt_explode2: p->ramp += time3; if( p->ramp >= 8 ) p->die = -1; else p->color = ramp2[(int)p->ramp]; for( i = 0; i < 3; i++ ) p->vel[i] -= p->vel[i] * ft; p->vel[2] -= grav; break; case pt_blob: case pt_blob2: p->ramp += time2; iRamp = (int)p->ramp >> SIMSHIFT; if( iRamp >= SPARK_COLORCOUNT ) { p->ramp = 0.0f; iRamp = 0; } p->color = CL_LookupColor( gSparkRamp[iRamp][0], gSparkRamp[iRamp][1], gSparkRamp[iRamp][2] ); for( i = 0; i < 2; i++ ) p->vel[i] -= p->vel[i] * 0.5f * ft; p->vel[2] -= grav * 5.0f; if( Com_RandomLong( 0, 3 )) { p->type = pt_blob; alpha = 0; } else { p->type = pt_blob2; alpha = 255; } break; case pt_grav: p->vel[2] -= grav * 20; break; case pt_slowgrav: p->vel[2] -= grav; break; case pt_vox_grav: p->vel[2] -= grav * 8; break; case pt_vox_slowgrav: p->vel[2] -= grav * 4; break; } #if 0 // HACKHACK a scale up to keep particles from disappearing size += (p->org[0] - RI.vieworg[0]) * RI.vforward[0]; size += (p->org[1] - RI.vieworg[1]) * RI.vforward[1]; size += (p->org[2] - RI.vieworg[2]) * RI.vforward[2]; if( size < 20.0f ) size = 1.0f; else size = 1.0f + size * 0.004f; #endif // scale the axes by radius VectorScale( RI.vright, size, right ); VectorScale( RI.vup, size, up ); p->color = bound( 0, p->color, 255 ); VectorSet( color, clgame.palette[p->color][0], clgame.palette[p->color][1], clgame.palette[p->color][2] ); GL_SetRenderMode( kRenderTransTexture ); pglColor4ub( color[0], color[1], color[2], alpha ); GL_Bind( GL_TEXTURE0, cls.particleImage ); // add the 4 corner vertices. pglBegin( GL_QUADS ); pglTexCoord2f( 0.0f, 1.0f ); pglVertex3f( p->org[0] - right[0] + up[0], p->org[1] - right[1] + up[1], p->org[2] - right[2] + up[2] ); pglTexCoord2f( 0.0f, 0.0f ); pglVertex3f( p->org[0] + right[0] + up[0], p->org[1] + right[1] + up[1], p->org[2] + right[2] + up[2] ); pglTexCoord2f( 1.0f, 0.0f ); pglVertex3f( p->org[0] + right[0] - up[0], p->org[1] + right[1] - up[1], p->org[2] + right[2] - up[2] ); pglTexCoord2f( 1.0f, 1.0f ); pglVertex3f( p->org[0] - right[0] - up[0], p->org[1] - right[1] - up[1], p->org[2] - right[2] - up[2] ); pglEnd(); if( p->type != pt_clientcustom ) { // update position. VectorMA( p->org, ft, p->vel, p->org ); } }
/* ======================= SV_UpdateToReliableMessages ======================= */ void SV_UpdateToReliableMessages( void ) { int i; sv_client_t *cl; // check for changes to be sent over the reliable streams to all clients for( i = 0, cl = svs.clients; i < sv_maxclients->integer; i++, cl++ ) { if( !cl->edict ) continue; // not in game yet if( cl->state != cs_spawned ) continue; if( cl->sendinfo ) { cl->sendinfo = false; SV_FullClientUpdate( cl, &sv.reliable_datagram ); } if( cl->sendmovevars ) { cl->sendmovevars = false; SV_FullUpdateMovevars( cl, &cl->netchan.message ); } } // 1% chanse for simulate random network bugs if( sv.write_bad_message && Com_RandomLong( 0, 512 ) == 404 ) { // just for network debugging (send only for local client) BF_WriteByte( &sv.datagram, svc_bad ); BF_WriteLong( &sv.datagram, rand( )); // send some random data BF_WriteString( &sv.datagram, host.finalmsg ); // send final message sv.write_bad_message = false; } // clear the server datagram if it overflowed. if( BF_CheckOverflow( &sv.datagram )) { MsgDev( D_ERROR, "sv.datagram overflowed!\n" ); BF_Clear( &sv.datagram ); } // clear the server datagram if it overflowed. if( BF_CheckOverflow( &sv.spectator_datagram )) { MsgDev( D_ERROR, "sv.spectator_datagram overflowed!\n" ); BF_Clear( &sv.spectator_datagram ); } // now send the reliable and server datagrams to all clients. for( i = 0, cl = svs.clients; i < sv_maxclients->integer; i++, cl++ ) { if( cl->state < cs_connected || cl->fakeclient ) continue; // reliables go to all connected or spawned BF_WriteBits( &cl->netchan.message, BF_GetData( &sv.reliable_datagram ), BF_GetNumBitsWritten( &sv.reliable_datagram )); BF_WriteBits( &cl->datagram, BF_GetData( &sv.datagram ), BF_GetNumBitsWritten( &sv.datagram )); if( cl->hltv_proxy ) { BF_WriteBits( &cl->datagram, BF_GetData( &sv.spectator_datagram ), BF_GetNumBitsWritten( &sv.spectator_datagram )); } } // now clear the reliable and datagram buffers. BF_Clear( &sv.spectator_datagram ); BF_Clear( &sv.reliable_datagram ); BF_Clear( &sv.datagram ); }
/* =============== R_ComputeFxBlend =============== */ int R_ComputeFxBlend( cl_entity_t *e ) { int blend = 0, renderAmt; float offset, dist; vec3_t tmp; offset = ((int)e->index ) * 363.0f; // Use ent index to de-sync these fx renderAmt = e->curstate.renderamt; switch( e->curstate.renderfx ) { case kRenderFxPulseSlowWide: blend = renderAmt + 0x40 * sin( RI.refdef.time * 2 + offset ); break; case kRenderFxPulseFastWide: blend = renderAmt + 0x40 * sin( RI.refdef.time * 8 + offset ); break; case kRenderFxPulseSlow: blend = renderAmt + 0x10 * sin( RI.refdef.time * 2 + offset ); break; case kRenderFxPulseFast: blend = renderAmt + 0x10 * sin( RI.refdef.time * 8 + offset ); break; // JAY: HACK for now -- not time based case kRenderFxFadeSlow: if( renderAmt > 0 ) renderAmt -= 1; else renderAmt = 0; blend = renderAmt; break; case kRenderFxFadeFast: if( renderAmt > 3 ) renderAmt -= 4; else renderAmt = 0; blend = renderAmt; break; case kRenderFxSolidSlow: if( renderAmt < 255 ) renderAmt += 1; else renderAmt = 255; blend = renderAmt; break; case kRenderFxSolidFast: if( renderAmt < 252 ) renderAmt += 4; else renderAmt = 255; blend = renderAmt; break; case kRenderFxStrobeSlow: blend = 20 * sin( RI.refdef.time * 4 + offset ); if( blend < 0 ) blend = 0; else blend = renderAmt; break; case kRenderFxStrobeFast: blend = 20 * sin( RI.refdef.time * 16 + offset ); if( blend < 0 ) blend = 0; else blend = renderAmt; break; case kRenderFxStrobeFaster: blend = 20 * sin( RI.refdef.time * 36 + offset ); if( blend < 0 ) blend = 0; else blend = renderAmt; break; case kRenderFxFlickerSlow: blend = 20 * (sin( RI.refdef.time * 2 ) + sin( RI.refdef.time * 17 + offset )); if( blend < 0 ) blend = 0; else blend = renderAmt; break; case kRenderFxFlickerFast: blend = 20 * (sin( RI.refdef.time * 16 ) + sin( RI.refdef.time * 23 + offset )); if( blend < 0 ) blend = 0; else blend = renderAmt; break; case kRenderFxHologram: case kRenderFxDistort: VectorCopy( e->origin, tmp ); VectorSubtract( tmp, RI.refdef.vieworg, tmp ); dist = DotProduct( tmp, RI.refdef.forward ); // Turn off distance fade if( e->curstate.renderfx == kRenderFxDistort ) dist = 1; if( dist <= 0 ) { blend = 0; } else { renderAmt = 180; if( dist <= 100 ) blend = renderAmt; else blend = (int) ((1.0f - ( dist - 100 ) * ( 1.0f / 400.0f )) * renderAmt ); blend += Com_RandomLong( -32, 31 ); } break; case kRenderFxGlowShell: // safe current renderamt because it's shell scale! case kRenderFxDeadPlayer: // safe current renderamt because it's player index! blend = renderAmt; break; case kRenderFxNone: case kRenderFxClampMinScale: default: if( e->curstate.rendermode == kRenderNormal ) blend = 255; else blend = renderAmt; break; } if( e->model && e->model->type != mod_brush ) { // NOTE: never pass sprites with rendercolor '0 0 0' it's a stupid Valve Hammer Editor bug if( !e->curstate.rendercolor.r && !e->curstate.rendercolor.g && !e->curstate.rendercolor.b ) e->curstate.rendercolor.r = e->curstate.rendercolor.g = e->curstate.rendercolor.b = 255; // apply scale to studiomodels and sprites only if( !e->curstate.scale ) e->curstate.scale = 1.0f; } blend = bound( 0, blend, 255 ); return blend; }