diff options
Diffstat (limited to 'src/game/g_missile.c')
-rw-r--r-- | src/game/g_missile.c | 803 |
1 files changed, 0 insertions, 803 deletions
diff --git a/src/game/g_missile.c b/src/game/g_missile.c deleted file mode 100644 index 4f019f41..00000000 --- a/src/game/g_missile.c +++ /dev/null @@ -1,803 +0,0 @@ -// Copyright (C) 1999-2000 Id Software, Inc. -// - -/* - * Portions Copyright (C) 2000-2001 Tim Angus - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the OSML - Open Source Modification License v1.0 as - * described in the file COPYING which is distributed with this source - * code. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - */ - -#include "g_local.h" - -#define MISSILE_PRESTEP_TIME 50 - -/* -================ -G_BounceMissile - -================ -*/ -void G_BounceMissile( gentity_t *ent, trace_t *trace ) -{ - vec3_t velocity; - float dot; - int hitTime; - - // reflect the velocity on the trace plane - hitTime = level.previousTime + ( level.time - level.previousTime ) * trace->fraction; - BG_EvaluateTrajectoryDelta( &ent->s.pos, hitTime, velocity ); - dot = DotProduct( velocity, trace->plane.normal ); - VectorMA( velocity, -2 * dot, trace->plane.normal, ent->s.pos.trDelta ); - - if( ent->s.eFlags & EF_BOUNCE_HALF ) - { - VectorScale( ent->s.pos.trDelta, 0.65, ent->s.pos.trDelta ); - // check for stop - if( trace->plane.normal[ 2 ] > 0.2 && VectorLength( ent->s.pos.trDelta ) < 40 ) - { - G_SetOrigin( ent, trace->endpos ); - return; - } - } - - VectorAdd( ent->r.currentOrigin, trace->plane.normal, ent->r.currentOrigin ); - VectorCopy( ent->r.currentOrigin, ent->s.pos.trBase ); - ent->s.pos.trTime = level.time; -} - - -/* -================ -G_ExplodeMissile - -Explode a missile without an impact -================ -*/ -void G_ExplodeMissile( gentity_t *ent ) -{ - vec3_t dir; - vec3_t origin; - - BG_EvaluateTrajectory( &ent->s.pos, level.time, origin ); - SnapVector( origin ); - G_SetOrigin( ent, origin ); - - // we don't have a valid direction, so just point straight up - dir[ 0 ] = dir[ 1 ] = 0; - dir[ 2 ] = 1; - - ent->s.eType = ET_GENERAL; - - //TA: tired... can't be fucked... hack - if( ent->s.weapon != WP_LOCKBLOB_LAUNCHER && - ent->s.weapon != WP_FLAMER ) - G_AddEvent( ent, EV_MISSILE_MISS, DirToByte( dir ) ); - - ent->freeAfterEvent = qtrue; - - // splash damage - if( ent->splashDamage ) - G_RadiusDamage( ent->r.currentOrigin, ent->parent, ent->splashDamage, - ent->splashRadius, ent, ent->splashMethodOfDeath ); - - trap_LinkEntity( ent ); -} - -void AHive_ReturnToHive( gentity_t *self ); - -/* -================ -G_MissileImpact - -================ -*/ -void G_MissileImpact( gentity_t *ent, trace_t *trace ) -{ - gentity_t *other, *attacker; - qboolean returnAfterDamage = qfalse; - vec3_t dir; - - other = &g_entities[ trace->entityNum ]; - attacker = &g_entities[ ent->r.ownerNum ]; - - // check for bounce - if( !other->takedamage && - ( ent->s.eFlags & ( EF_BOUNCE | EF_BOUNCE_HALF ) ) ) - { - G_BounceMissile( ent, trace ); - - //only play a sound if requested - if( !( ent->s.eFlags & EF_NO_BOUNCE_SOUND ) ) - G_AddEvent( ent, EV_GRENADE_BOUNCE, 0 ); - - return; - } - - if( !strcmp( ent->classname, "grenade" ) ) - { - //grenade doesn't explode on impact - G_BounceMissile( ent, trace ); - - //only play a sound if requested - if( !( ent->s.eFlags & EF_NO_BOUNCE_SOUND ) ) - G_AddEvent( ent, EV_GRENADE_BOUNCE, 0 ); - - return; - } - else if( !strcmp( ent->classname, "lockblob" ) ) - { - if( other->client && other->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS ) - { - other->client->ps.stats[ STAT_STATE ] |= SS_BLOBLOCKED; - other->client->lastLockTime = level.time; - AngleVectors( other->client->ps.viewangles, dir, NULL, NULL ); - other->client->ps.stats[ STAT_VIEWLOCK ] = DirToByte( dir ); - } - } - else if( !strcmp( ent->classname, "slowblob" ) ) - { - if( other->client && other->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS ) - { - other->client->ps.stats[ STAT_STATE ] |= SS_SLOWLOCKED; - other->client->lastSlowTime = level.time; - AngleVectors( other->client->ps.viewangles, dir, NULL, NULL ); - other->client->ps.stats[ STAT_VIEWLOCK ] = DirToByte( dir ); - } - } - else if( !strcmp( ent->classname, "hive" ) ) - { - if( other->s.eType == ET_BUILDABLE && other->s.modelindex == BA_A_HIVE ) - { - if( !ent->parent ) - G_Printf( S_COLOR_YELLOW "WARNING: hive entity has no parent in G_MissileImpact\n" ); - else - ent->parent->active = qfalse; - - G_FreeEntity( ent ); - return; - } - else - { - //prevent collision with the client when returning - ent->r.ownerNum = other->s.number; - - ent->think = AHive_ReturnToHive; - ent->nextthink = level.time + FRAMETIME; - - //only damage humans - if( other->client && other->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS ) - returnAfterDamage = qtrue; - else - return; - } - } - - // impact damage - if( other->takedamage ) - { - // FIXME: wrong damage direction? - if( ent->damage ) - { - vec3_t velocity; - - BG_EvaluateTrajectoryDelta( &ent->s.pos, level.time, velocity ); - if( VectorLength( velocity ) == 0 ) - velocity[ 2 ] = 1; // stepped on a grenade - - G_Damage( other, ent, attacker, velocity, ent->s.origin, ent->damage, - 0, ent->methodOfDeath ); - } - } - - if( returnAfterDamage ) - return; - - // is it cheaper in bandwidth to just remove this ent and create a new - // one, rather than changing the missile into the explosion? - - if( other->takedamage && other->client ) - { - G_AddEvent( ent, EV_MISSILE_HIT, DirToByte( trace->plane.normal ) ); - ent->s.otherEntityNum = other->s.number; - } - else if( trace->surfaceFlags & SURF_METALSTEPS ) - G_AddEvent( ent, EV_MISSILE_MISS_METAL, DirToByte( trace->plane.normal ) ); - else - G_AddEvent( ent, EV_MISSILE_MISS, DirToByte( trace->plane.normal ) ); - - ent->freeAfterEvent = qtrue; - - // change over to a normal entity right at the point of impact - ent->s.eType = ET_GENERAL; - - SnapVectorTowards( trace->endpos, ent->s.pos.trBase ); // save net bandwidth - - G_SetOrigin( ent, trace->endpos ); - - // splash damage (doesn't apply to person directly hit) - if( ent->splashDamage ) - G_RadiusDamage( trace->endpos, ent->parent, ent->splashDamage, ent->splashRadius, - other, ent->splashMethodOfDeath ); - - trap_LinkEntity( ent ); -} - - -/* -================ -G_RunMissile - -================ -*/ -void G_RunMissile( gentity_t *ent ) -{ - vec3_t origin; - trace_t tr; - int passent; - - // get current position - BG_EvaluateTrajectory( &ent->s.pos, level.time, origin ); - - // ignore interactions with the missile owner - passent = ent->r.ownerNum; - - // trace a line from the previous position to the current position - trap_Trace( &tr, ent->r.currentOrigin, ent->r.mins, ent->r.maxs, origin, passent, ent->clipmask ); - - if( tr.startsolid || tr.allsolid ) - { - // make sure the tr.entityNum is set to the entity we're stuck in - trap_Trace( &tr, ent->r.currentOrigin, ent->r.mins, ent->r.maxs, ent->r.currentOrigin, passent, ent->clipmask ); - tr.fraction = 0; - } - else - VectorCopy( tr.endpos, ent->r.currentOrigin ); - - ent->r.contents = CONTENTS_SOLID; //trick trap_LinkEntity into... - trap_LinkEntity( ent ); - ent->r.contents = 0; //...encoding bbox information - - if( tr.fraction != 1 ) - { - // never explode or bounce on sky - if( tr.surfaceFlags & SURF_NOIMPACT ) - { - // If grapple, reset owner - if( ent->parent && ent->parent->client && ent->parent->client->hook == ent ) - ent->parent->client->hook = NULL; - - G_FreeEntity( ent ); - return; - } - - G_MissileImpact( ent, &tr ); - if( ent->s.eType != ET_MISSILE ) - return; // exploded - } - - // check think function after bouncing - G_RunThink( ent ); -} - - -//============================================================================= - -/* -================= -fire_flamer - -================= -*/ -gentity_t *fire_flamer( gentity_t *self, vec3_t start, vec3_t dir ) -{ - gentity_t *bolt; - vec3_t pvel; - - VectorNormalize (dir); - - bolt = G_Spawn(); - bolt->classname = "flame"; - bolt->nextthink = level.time + FLAMER_LIFETIME; - bolt->think = G_ExplodeMissile; - bolt->s.eType = ET_MISSILE; - bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; - bolt->s.weapon = WP_FLAMER; - bolt->s.generic1 = self->s.generic1; //weaponMode - bolt->r.ownerNum = self->s.number; - bolt->parent = self; - bolt->damage = FLAMER_DMG; - bolt->splashDamage = FLAMER_DMG; - bolt->splashRadius = FLAMER_RADIUS; - bolt->methodOfDeath = MOD_FLAMER; - bolt->splashMethodOfDeath = MOD_FLAMER_SPLASH; - bolt->clipmask = MASK_SHOT; - bolt->target_ent = NULL; - bolt->r.mins[ 0 ] = bolt->r.mins[ 1 ] = bolt->r.mins[ 2 ] = -15.0f; - bolt->r.maxs[ 0 ] = bolt->r.maxs[ 1 ] = bolt->r.maxs[ 2 ] = 15.0f; - - bolt->s.pos.trType = TR_LINEAR; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame - VectorCopy( start, bolt->s.pos.trBase ); - VectorScale( self->client->ps.velocity, FLAMER_LAG, pvel ); - VectorMA( pvel, FLAMER_SPEED, dir, bolt->s.pos.trDelta ); - SnapVector( bolt->s.pos.trDelta ); // save net bandwidth - - VectorCopy( start, bolt->r.currentOrigin ); - - return bolt; -} - -//============================================================================= - -/* -================= -fire_blaster - -================= -*/ -gentity_t *fire_blaster( gentity_t *self, vec3_t start, vec3_t dir ) -{ - gentity_t *bolt; - - VectorNormalize (dir); - - bolt = G_Spawn(); - bolt->classname = "blaster"; - bolt->nextthink = level.time + 10000; - bolt->think = G_ExplodeMissile; - bolt->s.eType = ET_MISSILE; - bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; - bolt->s.weapon = WP_BLASTER; - bolt->s.generic1 = self->s.generic1; //weaponMode - bolt->r.ownerNum = self->s.number; - bolt->parent = self; - bolt->damage = BLASTER_DMG; - bolt->splashDamage = 0; - bolt->splashRadius = 0; - bolt->methodOfDeath = MOD_BLASTER; - bolt->splashMethodOfDeath = MOD_BLASTER; - bolt->clipmask = MASK_SHOT; - bolt->target_ent = NULL; - - bolt->s.pos.trType = TR_LINEAR; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame - VectorCopy( start, bolt->s.pos.trBase ); - VectorScale( dir, BLASTER_SPEED, bolt->s.pos.trDelta ); - SnapVector( bolt->s.pos.trDelta ); // save net bandwidth - - VectorCopy( start, bolt->r.currentOrigin ); - - return bolt; -} - -//============================================================================= - -/* -================= -fire_pulseRifle - -================= -*/ -gentity_t *fire_pulseRifle( gentity_t *self, vec3_t start, vec3_t dir ) -{ - gentity_t *bolt; - - VectorNormalize (dir); - - bolt = G_Spawn(); - bolt->classname = "pulse"; - bolt->nextthink = level.time + 10000; - bolt->think = G_ExplodeMissile; - bolt->s.eType = ET_MISSILE; - bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; - bolt->s.weapon = WP_PULSE_RIFLE; - bolt->s.generic1 = self->s.generic1; //weaponMode - bolt->r.ownerNum = self->s.number; - bolt->parent = self; - bolt->damage = PRIFLE_DMG; - bolt->splashDamage = 0; - bolt->splashRadius = 0; - bolt->methodOfDeath = MOD_PRIFLE; - bolt->splashMethodOfDeath = MOD_PRIFLE; - bolt->clipmask = MASK_SHOT; - bolt->target_ent = NULL; - - bolt->s.pos.trType = TR_LINEAR; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame - VectorCopy( start, bolt->s.pos.trBase ); - VectorScale( dir, PRIFLE_SPEED, bolt->s.pos.trDelta ); - SnapVector( bolt->s.pos.trDelta ); // save net bandwidth - - VectorCopy( start, bolt->r.currentOrigin ); - - return bolt; -} - -//============================================================================= - -/* -================= -fire_luciferCannon - -================= -*/ -gentity_t *fire_luciferCannon( gentity_t *self, vec3_t start, vec3_t dir, int damage, int radius ) -{ - gentity_t *bolt; - int localDamage = (int)( ceil( ( (float)damage / - (float)LCANNON_TOTAL_CHARGE ) * (float)LCANNON_DAMAGE ) ); - - VectorNormalize( dir ); - - bolt = G_Spawn( ); - bolt->classname = "lcannon"; - - if( damage == LCANNON_TOTAL_CHARGE ) - bolt->nextthink = level.time; - else - bolt->nextthink = level.time + 10000; - - bolt->think = G_ExplodeMissile; - bolt->s.eType = ET_MISSILE; - bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; - bolt->s.weapon = WP_LUCIFER_CANNON; - bolt->s.generic1 = self->s.generic1; //weaponMode - bolt->r.ownerNum = self->s.number; - bolt->parent = self; - bolt->damage = localDamage; - bolt->splashDamage = localDamage / 2; - bolt->splashRadius = radius; - bolt->methodOfDeath = MOD_LCANNON; - bolt->splashMethodOfDeath = MOD_LCANNON_SPLASH; - bolt->clipmask = MASK_SHOT; - bolt->target_ent = NULL; - - bolt->s.pos.trType = TR_LINEAR; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame - VectorCopy( start, bolt->s.pos.trBase ); - VectorScale( dir, LCANNON_SPEED, bolt->s.pos.trDelta ); - SnapVector( bolt->s.pos.trDelta ); // save net bandwidth - - VectorCopy( start, bolt->r.currentOrigin ); - - return bolt; -} - -/* -================= -launch_grenade - -================= -*/ -gentity_t *launch_grenade( gentity_t *self, vec3_t start, vec3_t dir ) -{ - gentity_t *bolt; - - VectorNormalize( dir ); - - bolt = G_Spawn( ); - bolt->classname = "grenade"; - bolt->nextthink = level.time + 5000; - bolt->think = G_ExplodeMissile; - bolt->s.eType = ET_MISSILE; - bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; - bolt->s.weapon = WP_GRENADE; - bolt->s.eFlags = EF_BOUNCE_HALF; - bolt->s.generic1 = WPM_PRIMARY; //weaponMode - bolt->r.ownerNum = self->s.number; - bolt->parent = self; - bolt->damage = GRENADE_DAMAGE; - bolt->splashDamage = GRENADE_DAMAGE; - bolt->splashRadius = GRENADE_RANGE; - bolt->methodOfDeath = MOD_GRENADE; - bolt->splashMethodOfDeath = MOD_GRENADE; - bolt->clipmask = MASK_SHOT; - bolt->target_ent = NULL; - bolt->r.mins[ 0 ] = bolt->r.mins[ 1 ] = bolt->r.mins[ 2 ] = -3.0f; - bolt->r.maxs[ 0 ] = bolt->r.maxs[ 1 ] = bolt->r.maxs[ 2 ] = 3.0f; - bolt->s.time = level.time; - - bolt->s.pos.trType = TR_GRAVITY; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame - VectorCopy( start, bolt->s.pos.trBase ); - VectorScale( dir, GRENADE_SPEED, bolt->s.pos.trDelta ); - SnapVector( bolt->s.pos.trDelta ); // save net bandwidth - - VectorCopy( start, bolt->r.currentOrigin ); - - return bolt; -} -//============================================================================= - -/* -================ -AHive_ReturnToHive - -Adjust the trajectory to point towards the hive -================ -*/ -void AHive_ReturnToHive( gentity_t *self ) -{ - vec3_t dir; - trace_t tr; - - if( !self->parent ) - { - G_Printf( S_COLOR_YELLOW "WARNING: AHive_ReturnToHive called with no self->parent\n" ); - return; - } - - trap_UnlinkEntity( self->parent ); - trap_Trace( &tr, self->r.currentOrigin, self->r.mins, self->r.maxs, - self->parent->r.currentOrigin, self->r.ownerNum, self->clipmask ); - trap_LinkEntity( self->parent ); - - if( tr.fraction < 1.0f ) - { - //if can't see hive then disperse - VectorCopy( self->r.currentOrigin, self->s.pos.trBase ); - self->s.pos.trType = TR_STATIONARY; - self->s.pos.trTime = level.time; - - self->think = G_ExplodeMissile; - self->nextthink = level.time + 2000; - self->parent->active = qfalse; //allow the parent to start again - } - else - { - VectorSubtract( self->parent->r.currentOrigin, self->r.currentOrigin, dir ); - VectorNormalize( dir ); - - //change direction towards the hive - VectorScale( dir, HIVE_SPEED, self->s.pos.trDelta ); - SnapVector( self->s.pos.trDelta ); // save net bandwidth - VectorCopy( self->r.currentOrigin, self->s.pos.trBase ); - self->s.pos.trTime = level.time; - - self->think = G_ExplodeMissile; - self->nextthink = level.time + 15000; - } -} - -/* -================ -AHive_SearchAndDestroy - -Adjust the trajectory to point towards the target -================ -*/ -void AHive_SearchAndDestroy( gentity_t *self ) -{ - vec3_t dir; - trace_t tr; - - trap_Trace( &tr, self->r.currentOrigin, self->r.mins, self->r.maxs, - self->target_ent->r.currentOrigin, self->r.ownerNum, self->clipmask ); - - //if there is no LOS or the parent hive is too far away or the target is dead, return - if( tr.entityNum == ENTITYNUM_WORLD || - Distance( self->r.currentOrigin, self->parent->r.currentOrigin ) > ( HIVE_RANGE * 5 ) || - self->target_ent->health <= 0 ) - { - self->r.ownerNum = ENTITYNUM_WORLD; - - self->think = AHive_ReturnToHive; - self->nextthink = level.time + FRAMETIME; - } - else - { - VectorSubtract( self->target_ent->r.currentOrigin, self->r.currentOrigin, dir ); - VectorNormalize( dir ); - - //change direction towards the player - VectorScale( dir, HIVE_SPEED, self->s.pos.trDelta ); - SnapVector( self->s.pos.trDelta ); // save net bandwidth - VectorCopy( self->r.currentOrigin, self->s.pos.trBase ); - self->s.pos.trTime = level.time; - - self->nextthink = level.time + HIVE_DIR_CHANGE_PERIOD; - } -} - -/* -================= -fire_hive -================= -*/ -gentity_t *fire_hive( gentity_t *self, vec3_t start, vec3_t dir ) -{ - gentity_t *bolt; - - VectorNormalize ( dir ); - - bolt = G_Spawn( ); - bolt->classname = "hive"; - bolt->nextthink = level.time + HIVE_DIR_CHANGE_PERIOD; - bolt->think = AHive_SearchAndDestroy; - bolt->s.eType = ET_MISSILE; - bolt->s.eFlags |= EF_BOUNCE|EF_NO_BOUNCE_SOUND; - bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; - bolt->s.weapon = WP_HIVE; - bolt->s.generic1 = WPM_PRIMARY; //weaponMode - bolt->r.ownerNum = self->s.number; - bolt->parent = self; - bolt->damage = HIVE_DMG; - bolt->splashDamage = 0; - bolt->splashRadius = 0; - bolt->methodOfDeath = MOD_SWARM; - bolt->clipmask = MASK_SHOT; - bolt->target_ent = self->target_ent; - - bolt->s.pos.trType = TR_LINEAR; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame - VectorCopy( start, bolt->s.pos.trBase ); - VectorScale( dir, HIVE_SPEED, bolt->s.pos.trDelta ); - SnapVector( bolt->s.pos.trDelta ); // save net bandwidth - VectorCopy( start, bolt->r.currentOrigin ); - - return bolt; -} - -//============================================================================= - -/* -================= -fire_lockblob -================= -*/ -gentity_t *fire_lockblob( gentity_t *self, vec3_t start, vec3_t dir ) -{ - gentity_t *bolt; - - VectorNormalize ( dir ); - - bolt = G_Spawn( ); - bolt->classname = "lockblob"; - bolt->nextthink = level.time + 15000; - bolt->think = G_ExplodeMissile; - bolt->s.eType = ET_MISSILE; - bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; - bolt->s.weapon = WP_LOCKBLOB_LAUNCHER; - bolt->s.generic1 = WPM_PRIMARY; //weaponMode - bolt->r.ownerNum = self->s.number; - bolt->parent = self; - bolt->damage = 0; - bolt->splashDamage = 0; - bolt->splashRadius = 0; - bolt->methodOfDeath = MOD_UNKNOWN; //doesn't do damage so will never kill - bolt->clipmask = MASK_SHOT; - bolt->target_ent = NULL; - - bolt->s.pos.trType = TR_LINEAR; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame - VectorCopy( start, bolt->s.pos.trBase ); - VectorScale( dir, 500, bolt->s.pos.trDelta ); - SnapVector( bolt->s.pos.trDelta ); // save net bandwidth - VectorCopy( start, bolt->r.currentOrigin ); - - return bolt; -} - -/* -================= -fire_slowBlob -================= -*/ -gentity_t *fire_slowBlob( gentity_t *self, vec3_t start, vec3_t dir ) -{ - gentity_t *bolt; - - VectorNormalize ( dir ); - - bolt = G_Spawn( ); - bolt->classname = "slowblob"; - bolt->nextthink = level.time + 15000; - bolt->think = G_ExplodeMissile; - bolt->s.eType = ET_MISSILE; - bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; - bolt->s.weapon = WP_ABUILD2; - bolt->s.generic1 = self->s.generic1; //weaponMode - bolt->r.ownerNum = self->s.number; - bolt->parent = self; - bolt->damage = ABUILDER_BLOB_DMG; - bolt->splashDamage = 0; - bolt->splashRadius = 0; - bolt->methodOfDeath = MOD_SLOWBLOB; - bolt->splashMethodOfDeath = MOD_SLOWBLOB; - bolt->clipmask = MASK_SHOT; - bolt->target_ent = NULL; - - bolt->s.pos.trType = TR_GRAVITY; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame - VectorCopy( start, bolt->s.pos.trBase ); - VectorScale( dir, ABUILDER_BLOB_SPEED, bolt->s.pos.trDelta ); - SnapVector( bolt->s.pos.trDelta ); // save net bandwidth - VectorCopy( start, bolt->r.currentOrigin ); - - return bolt; -} - -/* -================= -fire_paraLockBlob -================= -*/ -gentity_t *fire_paraLockBlob( gentity_t *self, vec3_t start, vec3_t dir ) -{ - gentity_t *bolt; - - VectorNormalize ( dir ); - - bolt = G_Spawn( ); - bolt->classname = "lockblob"; - bolt->nextthink = level.time + 15000; - bolt->think = G_ExplodeMissile; - bolt->s.eType = ET_MISSILE; - bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; - bolt->s.weapon = WP_LOCKBLOB_LAUNCHER; - bolt->s.generic1 = self->s.generic1; //weaponMode - bolt->r.ownerNum = self->s.number; - bolt->parent = self; - bolt->damage = 0; - bolt->splashDamage = 0; - bolt->splashRadius = 0; - bolt->clipmask = MASK_SHOT; - bolt->target_ent = NULL; - - bolt->s.pos.trType = TR_GRAVITY; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame - VectorCopy( start, bolt->s.pos.trBase ); - VectorScale( dir, LOCKBLOB_SPEED, bolt->s.pos.trDelta ); - SnapVector( bolt->s.pos.trDelta ); // save net bandwidth - VectorCopy( start, bolt->r.currentOrigin ); - - return bolt; -} - -/* -================= -fire_bounceBall -================= -*/ -gentity_t *fire_bounceBall( gentity_t *self, vec3_t start, vec3_t dir ) -{ - gentity_t *bolt; - - VectorNormalize ( dir ); - - bolt = G_Spawn( ); - bolt->classname = "bounceball"; - bolt->nextthink = level.time + 3000; - bolt->think = G_ExplodeMissile; - bolt->s.eType = ET_MISSILE; - bolt->r.svFlags = SVF_USE_CURRENT_ORIGIN; - bolt->s.weapon = WP_ALEVEL3_UPG; - bolt->s.generic1 = self->s.generic1; //weaponMode - bolt->r.ownerNum = self->s.number; - bolt->parent = self; - bolt->damage = LEVEL3_BOUNCEBALL_DMG; - bolt->splashDamage = 0; - bolt->splashRadius = 0; - bolt->methodOfDeath = MOD_LEVEL3_BOUNCEBALL; - bolt->splashMethodOfDeath = MOD_LEVEL3_BOUNCEBALL; - bolt->clipmask = MASK_SHOT; - bolt->target_ent = NULL; - - bolt->s.pos.trType = TR_GRAVITY; - bolt->s.pos.trTime = level.time - MISSILE_PRESTEP_TIME; // move a bit on the very first frame - VectorCopy( start, bolt->s.pos.trBase ); - VectorScale( dir, LEVEL3_BOUNCEBALL_SPEED, bolt->s.pos.trDelta ); - SnapVector( bolt->s.pos.trDelta ); // save net bandwidth - VectorCopy( start, bolt->r.currentOrigin ); - /*bolt->s.eFlags |= EF_BOUNCE;*/ - - return bolt; -} - |