From 4ebd5a54a81b878827a6ed2f52174e6841a4616c Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Fri, 12 Oct 2001 17:06:11 +0000 Subject: Tesla Gen and effects --- src/cgame/cg_event.c | 11 ++++++++ src/cgame/cg_local.h | 4 +++ src/cgame/cg_main.c | 6 ++++ src/cgame/cg_weapons.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 92 insertions(+), 6 deletions(-) (limited to 'src/cgame') diff --git a/src/cgame/cg_event.c b/src/cgame/cg_event.c index 29b77974..adf51128 100644 --- a/src/cgame/cg_event.c +++ b/src/cgame/cg_event.c @@ -889,6 +889,17 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) } break; + case EV_TESLATRAIL: + DEBUGNAME("EV_TESLATRAIL"); + cent->currentState.weapon = WP_TESLAGEN; + // if the end was on a nomark surface, don't make an explosion + CG_TeslaTrail( es->origin2, es->pos.trBase ); + if ( es->eventParm != 255 ) { + ByteToDir( es->eventParm, dir ); + CG_MissileHitWall( es->weapon, es->clientNum, position, dir, IMPACTSOUND_DEFAULT ); + } + break; + case EV_BULLET_HIT_WALL: DEBUGNAME("EV_BULLET_HIT_WALL"); ByteToDir( es->eventParm, dir ); diff --git a/src/cgame/cg_local.h b/src/cgame/cg_local.h index d98039ec..12bdff50 100644 --- a/src/cgame/cg_local.h +++ b/src/cgame/cg_local.h @@ -1160,6 +1160,9 @@ extern vmCvar_t cg_animSpeed; extern vmCvar_t cg_debugAnim; extern vmCvar_t cg_debugPosition; extern vmCvar_t cg_debugEvents; +extern vmCvar_t cg_teslaTrailTime; +extern vmCvar_t cg_teslaSegments; +extern vmCvar_t cg_teslaDeviation; extern vmCvar_t cg_railTrailTime; extern vmCvar_t cg_errorDecay; extern vmCvar_t cg_nopredict; @@ -1428,6 +1431,7 @@ void CG_ShotgunFire( entityState_t *es ); void CG_Bullet( vec3_t origin, int sourceEntityNum, vec3_t normal, qboolean flesh, int fleshEntityNum ); void CG_RailTrail( vec3_t start, vec3_t end ); +void CG_TeslaTrail( vec3_t start, vec3_t end ); void CG_GrappleTrail( centity_t *ent, const weaponInfo_t *wi ); void CG_AddViewWeapon (playerState_t *ps); void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent ); diff --git a/src/cgame/cg_main.c b/src/cgame/cg_main.c index d10ed749..ace52e56 100644 --- a/src/cgame/cg_main.c +++ b/src/cgame/cg_main.c @@ -90,6 +90,9 @@ itemInfo_t cg_items[MAX_ITEMS]; cgItemPos_t cgIP; +vmCvar_t cg_teslaTrailTime; +vmCvar_t cg_teslaSegments; +vmCvar_t cg_teslaDeviation; vmCvar_t cg_railTrailTime; vmCvar_t cg_centertime; vmCvar_t cg_runpitch; @@ -226,6 +229,9 @@ static cvarTable_t cvarTable[] = { { &cg_simpleItems, "cg_simpleItems", "0", CVAR_ARCHIVE }, { &cg_addMarks, "cg_marks", "1", CVAR_ARCHIVE }, { &cg_lagometer, "cg_lagometer", "1", CVAR_ARCHIVE }, + { &cg_teslaTrailTime, "cg_teslaTrailTime", "400", CVAR_ARCHIVE }, + { &cg_teslaSegments, "cg_teslaSegments", "8", CVAR_ARCHIVE }, + { &cg_teslaDeviation, "cg_teslaDeviation", "8", CVAR_ARCHIVE }, { &cg_railTrailTime, "cg_railTrailTime", "400", CVAR_ARCHIVE }, { &cg_gun_x, "cg_gunX", "0", CVAR_CHEAT }, { &cg_gun_y, "cg_gunY", "0", CVAR_CHEAT }, diff --git a/src/cgame/cg_weapons.c b/src/cgame/cg_weapons.c index fc425d7f..64b36c96 100644 --- a/src/cgame/cg_weapons.c +++ b/src/cgame/cg_weapons.c @@ -289,6 +289,71 @@ void CG_RailTrail( vec3_t start, vec3_t end ) } } +/* +========================== +CG_TeslaTrail +========================== +*/ +void CG_TeslaTrail( vec3_t start, vec3_t end ) +{ + int i; + vec3_t seg_start, seg_end, delta, dir, perpen, tangent; + float distance; + + localEntity_t *le; + refEntity_t *re; + + start[ 2 ] += 12; //nudge up a bit so the bolt comes from the sphere + + VectorCopy( start, seg_start ); + VectorSubtract( end, start, delta ); + distance = VectorLength( delta ); + VectorNormalize2( delta, dir ); + PerpendicularVector( perpen, dir ); + + //add a bunch of bolt segments + for( i = 1; i <= cg_teslaSegments.integer; i++ ) + { + le = CG_AllocLocalEntity(); + re = &le->refEntity; + + le->leType = LE_FADE_RGB; + le->startTime = cg.time; + le->endTime = cg.time + cg_teslaTrailTime.value; + le->lifeRate = 1.0 / ( le->endTime - le->startTime ); + + re->shaderTime = cg.time / 1000.0f; + re->reType = RT_RAIL_CORE; + re->customShader = cgs.media.lightningShader; + + VectorCopy( seg_start, re->origin ); + + if( i != cg_teslaSegments.integer ) + { + VectorMA( start, i * ( distance / cg_teslaSegments.integer ), dir, seg_end ); + RotatePointAroundVector( tangent, dir, perpen, rand( ) % 360 ); + VectorMA( seg_end, cg_teslaDeviation.value * random( ), tangent, seg_end ); + } + else + VectorCopy( end, seg_end ); + + VectorCopy( seg_end, re->oldorigin ); + VectorCopy( seg_end, seg_start ); + + re->shaderRGBA[0] = 255; + re->shaderRGBA[1] = 255; + re->shaderRGBA[2] = 255; + re->shaderRGBA[3] = 255; + + le->color[0] = 1.0f; + le->color[1] = 1.0f; + le->color[2] = 1.0f; + le->color[3] = 1.0f; + + AxisClear( re->axis ); + } +} + /* ========================== CG_RocketTrail @@ -626,13 +691,13 @@ void CG_RegisterWeapon( int weaponNum ) { weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/melee/fstatck.wav", qfalse ); break; - case WP_LIGHTNING: + case WP_TESLAGEN: MAKERGB( weaponInfo->flashDlightColor, 0.6f, 0.6f, 1.0f ); weaponInfo->readySound = trap_S_RegisterSound( "sound/weapons/melee/fsthum.wav", qfalse ); weaponInfo->firingSound = trap_S_RegisterSound( "sound/weapons/lightning/lg_hum.wav", qfalse ); weaponInfo->flashSound[0] = trap_S_RegisterSound( "sound/weapons/lightning/lg_fire.wav", qfalse ); - cgs.media.lightningShader = trap_R_RegisterShader( "lightningBoltNew"); + cgs.media.lightningShader = trap_R_RegisterShader( "models/ammo/tesla/tesla_bolt"); cgs.media.lightningExplosionModel = trap_R_RegisterModel( "models/weaphits/crackle.md3" ); cgs.media.sfx_lghit1 = trap_S_RegisterSound( "sound/weapons/lightning/lg_hit.wav", qfalse ); cgs.media.sfx_lghit2 = trap_S_RegisterSound( "sound/weapons/lightning/lg_hit2.wav", qfalse ); @@ -955,7 +1020,7 @@ static void CG_LightningBolt( centity_t *cent, vec3_t origin ) { vec3_t forward; vec3_t muzzlePoint, endPoint; - if ( cent->currentState.weapon != WP_LIGHTNING ) { + if ( cent->currentState.weapon != WP_TESLAGEN ) { return; } @@ -1233,7 +1298,7 @@ void CG_AddPlayerWeapon( refEntity_t *parent, playerState_t *ps, centity_t *cent } // add the flash - if ( ( weaponNum == WP_LIGHTNING || weaponNum == WP_GAUNTLET || weaponNum == WP_GRAPPLING_HOOK ) + if ( ( weaponNum == WP_TESLAGEN || weaponNum == WP_GAUNTLET || weaponNum == WP_GRAPPLING_HOOK ) && ( nonPredictedCent->currentState.eFlags & EF_FIRING ) ) { // continuous flash @@ -1727,7 +1792,7 @@ void CG_FireWeapon( centity_t *cent ) { cent->muzzleFlashTime = cg.time; // lightning gun only does this this on initial press - if ( ent->weapon == WP_LIGHTNING ) { + if ( ent->weapon == WP_TESLAGEN ) { if ( cent->pe.lightningFiring ) { return; } @@ -1798,7 +1863,7 @@ void CG_MissileHitWall( int weapon, int clientNum, vec3_t origin, vec3_t dir, im switch ( weapon ) { default: - case WP_LIGHTNING: + case WP_TESLAGEN: // no explosion at LG impact, it is added with the beam r = rand() & 3; if ( r < 2 ) { -- cgit