//----------------------------------------------------------------------------- // // $Logfile:: /Quake 2 Engine/Sin/code/game/rocketlauncher.cpp $ // $Revision:: 84 $ // $Author:: Aldie $ // $Date:: 3/02/99 9:14p $ // // Copyright (C) 1997 by Ritual Entertainment, Inc. // All rights reserved. // // This source is may not be distributed and/or modified without // expressly written permission by Ritual Entertainment, Inc. // // $Log:: /Quake 2 Engine/Sin/code/game/rocketlauncher.cpp $ // // 84 3/02/99 9:14p Aldie // Added CTF game code // // 2 2/16/99 4:09p Aldie // // 1 2/11/99 1:39p Aldie // // 83 11/15/98 12:22a Markd // Fixed pre-caching issues // // 82 11/13/98 3:30p Markd // put in more precaching on weapons // // 81 10/26/98 2:50p Aldie // Fixed a bug with checking of NULL owners // // 80 10/24/98 12:42a Markd // changed origins to worldorigins where appropriate // // 79 10/23/98 5:38a Jimdose // Added SpawnBlastDamage // // 78 10/22/98 7:57p Markd // put in proper pre-caching in all the classes // // 77 10/20/98 8:26p Markd // Added Attacker to DamageSurface stuff // // 76 10/19/98 12:07a Jimdose // made all code use fast checks for inheritance (no text lookups when // possible) // isSubclassOf no longer requires ::_classinfo() // // 75 10/16/98 10:22p Aldie // Updated single player damage settings // // 74 10/12/98 8:55p Aldie // Tweak damage // // 73 10/05/98 10:43p Aldie // Updated rank // // 72 10/05/98 10:20p Aldie // Removed flash - changed rank // // 71 10/04/98 10:28p Aldie // Added multiple weapon changes. Damage, flashes, quantum stuff // // 70 9/18/98 8:14p Markd // rewrote surface system so that surfaces are now damaged by surface name // instead of by surfinfo // // 69 9/01/98 3:05p Markd // Rewrote explosion code // // 68 8/29/98 5:27p Markd // added specialfx, replaced misc with specialfx where appropriate // // 67 8/10/98 6:53p Aldie // Increased the knockback for the rocket direct hit. // // 66 8/06/98 6:58p Jimdose // Added min/max range, and projectile speed // // 65 8/01/98 3:03p Aldie // Client side muzzle flash (dynamic light) // // 64 7/25/98 8:00p Aldie // Spawn explosion offset of origin // // 63 7/25/98 7:19p Aldie // Client side explosion // // 62 7/23/98 6:17p Aldie // Updated damage system and fixed some damage related bugs. Also put tracers // back to the way they were, and added gib event to funcscriptmodels // // 61 7/23/98 4:39p Markd // got rid of smoke trail // // 60 7/22/98 9:57p Markd // Defined weapon type // // 59 7/21/98 1:10p Aldie // Added meansofdeath to obituaries // // 58 7/01/98 4:38p Aldie // changed explsion mods // // 57 6/30/98 12:40p Aldie // New explosion effect // // 56 6/29/98 8:19p Aldie // Updated effect // // 55 6/19/98 9:30p Jimdose // Moved gun orientation code to Weapon // // 54 6/11/98 12:40a Markd // made rocketlauncher use new MuzzlePosition functions // // 53 6/10/98 2:10p Aldie // Updated damage function. // // 52 5/28/98 1:24p Aldie // Added particles to rocket explosion // // 51 5/27/98 7:00p Aldie // Added rocket trails // // 50 5/27/98 4:55p Markd // spruced it up // // 49 5/27/98 5:33a Markd // Re-added smoke trails // // 48 5/24/98 1:04a Jimdose // Made rocket use MASK_PROJECTILE // // 47 5/23/98 10:39p Markd // fixed it up a bunch, temprorarily commented out smoke trail // // 46 5/06/98 10:17a Markd // Removed sound precache // // 45 5/05/98 8:37p Aldie // Fixed oldorigin. // // 44 5/05/98 5:34p Aldie // Updated damage surfaces. // // 43 5/03/98 8:13p Markd // Took out TE_BLAster crap // // 42 5/03/98 4:36p Jimdose // Changed Vector class // // 41 4/28/98 6:24p Jimdose // upped rocket speed // // 40 4/28/98 5:32p Jimdose // Changed speed and damage of rocket. Got rid of unused vars. // // 39 4/20/98 1:56p Markd // SINED decelration is now in def file // // 38 4/18/98 3:12p Markd // Changed view weapon naming convention // // 37 4/10/98 1:23a Markd // Blastmarks are only left if FL_BLASTMARK is flagged // // 36 4/09/98 3:26p Jimdose // took out randomsound from shoot // // 35 4/07/98 9:18p Jimdose // Added new ammo // // 34 4/07/98 6:43p Jimdose // Rewrote weapon code. // Added order to rank // // 33 4/05/98 5:05a Jimdose // Fixed null surface bug in rocket Explode // // 32 4/04/98 7:28p Jimdose // Rockets don't explode against sky anymore // // 31 4/04/98 6:07p Jimdose // Moved Smoke to misc.cpp // // 30 4/02/98 4:20p Jimdose // Tweaked for DM // // 29 3/31/98 1:52p Jimdose // fixed rocket start position // // 28 3/30/98 11:39p Markd // Added modelIndex stuff // // 27 3/30/98 9:55p Jimdose // Changed location of .def files // // 26 3/30/98 2:59p Jimdose // Fixed problem where missiles flew through people // // 25 3/30/98 2:34p Jimdose // Added ammo // Changed blast radius // // 24 3/29/98 9:40p Jimdose // Made rockets use MASK_SHOT // // 23 3/28/98 8:55p Jimdose // Testing smoke trail // // 22 3/27/98 11:03p Jimdose // Added muzzle flash // // 21 3/27/98 6:35p Jimdose // Added new rocket model // Rocket no longer spawns beyond gun position // // 20 3/26/98 8:17p Jimdose // Precached sounds // // 19 3/23/98 1:31p Jimdose // Revamped event and command system // // 18 3/18/98 7:20p Jimdose // Made work with new animation system // added model // // 17 3/07/98 2:04p Markd // Commented out animate // // 16 3/05/98 3:48p Aldie // Added a small effect when a surface gets damaged. // // 15 3/04/98 8:00p Aldie // More support for damage surfaces. // // 14 3/02/98 8:49p Jimdose // Changed the classid parameter of CLASS_DECLARATION to a quoted string so // that you could have a NULL classid. // // 13 2/19/98 2:35p Jimdose // Updated to work with Q2 based progs // // 11 12/15/97 4:37p Aldie // Added support for gunoffset. // // 10 12/15/97 12:47p Markd // Changed aiming of rocket launcher // // 9 12/14/97 7:43p Markd // fixed missile angle setting // // 8 12/14/97 7:36p Markd // Fixed "vanishing point" issues // // 7 12/14/97 5:34p Markd // Tweaked Rocket // // 6 12/13/97 5:42p Markd // Added acceleration to rocketlauncher // // 5 12/12/97 2:10p Markd // Changed RocketLauncher to new rocket launcher // // 4 10/31/97 4:28p Jimdose // Removed redefinition of owner in base class Weapon, so any reference to // gunoffset through owner had to use type overriding. // // 3 10/27/97 3:30p Jimdose // Removed dependency on quakedef.h // // 2 9/26/97 4:46p Jimdose // Added standard Ritual header // // DESCRIPTION: // Standard rocketlauncher, similar to the Quake and Doom rocketlaunchers. // #include "g_local.h" #include "explosion.h" #include "rocketlauncher.h" #include "worldspawn.h" #include "specialfx.h" #include "misc.h" #include "surface.h" #include "thrall.h" #include "ctf.h" #define ROCKET_SPEED 1000 #define ROCKET_RADIUS 150 // FIXME: max damage (90 +rand(20)) + 40 == 150... hard coded. gotta pass this in CLASS_DECLARATION( Projectile, Rocket, NULL ); Event EV_Rocket_Explode( "explode" ); ResponseDef Rocket::Responses[] = { { &EV_Touch, ( Response )Rocket::Explode }, { &EV_Rocket_Explode, ( Response )Rocket::Explode }, { NULL, NULL } }; EXPORT_FROM_DLL void Rocket::Explode ( Event *ev ) { int damg; Vector v; Entity *other; Entity *owner; other = ev->GetEntity( 1 ); assert( other ); if ( other->isSubclassOf( Teleporter ) ) { return; } if ( other->entnum == this->owner ) { return; } stopsound( CHAN_VOICE ); setSolidType( SOLID_NOT ); hideModel(); if ( HitSky() ) { PostEvent( EV_Remove, 0 ); return; } damg = 90 + ( int )G_Random( 25 ); owner = G_GetEntity( this->owner ); if ( !owner ) owner = world; // Single player packs a bigger punch if ( !deathmatch->value && owner->isClient() ) damg *= 1.5; if (other->takedamage) other->Damage( this, owner, damg, worldorigin, velocity, level.impact_trace.plane.normal, 200, 0, MOD_ROCKET, -1, -1, 1.0f ); SpawnBlastDamage( &level.impact_trace, damg, owner ); v = velocity; v.normalize(); // don't do radius damage to the other, because all the damage // was done in the impact v = worldorigin - v * 36; CreateExplosion( v, damg, 1.0f, true, this, owner, other ); PostEvent( EV_Remove, 0.1 ); } EXPORT_FROM_DLL void Rocket::Setup ( Entity *owner, Vector pos, Vector dir ) { Event *ev; this->owner = owner->entnum; edict->owner = owner->edict; setMoveType( MOVETYPE_FLYMISSILE ); setSolidType( SOLID_BBOX ); edict->clipmask = MASK_PROJECTILE; angles = dir.toAngles(); angles[ PITCH ] = - angles[ PITCH ]; setAngles( angles ); speed = ROCKET_SPEED; velocity = dir * ROCKET_SPEED; // set missile duration ev = new Event( EV_Remove ); ev->AddEntity( world ); PostEvent( ev, 20 ); takedamage = DAMAGE_YES; health = 10; setModel( "rocket.def" ); edict->s.renderfx |= RF_DLIGHT; edict->s.effects |= EF_ROCKET; edict->s.effects |= EF_EVERYFRAME; edict->s.angles[ROLL] = rand() % 360; avelocity = "0 0 90"; gravity = 0; edict->s.color_r = 0.8; edict->s.color_g = 0.4; edict->s.color_b = 0; edict->s.radius = 200; // setup ambient thrust ev = new Event( EV_RandomEntitySound ); ev->AddString( "thrust" ); ProcessEvent( ev ); setSize( "-1 -1 -1", "1 1 1" ); setOrigin( pos ); worldorigin.copyTo(edict->s.old_origin); } CLASS_DECLARATION( Weapon, RocketLauncher, "weapon_rocketlauncher" ); ResponseDef RocketLauncher::Responses[] = { { &EV_Weapon_Shoot, ( Response )RocketLauncher::Shoot }, { NULL, NULL } }; RocketLauncher::RocketLauncher() { SetModels( "rlaunch.def", "view_rlaunch.def" ); modelIndex( "rocket.def" ); modelIndex( "rockets.def" ); modelIndex( "sprites/blastmark.spr" ); gi.soundindex( "weapons/rlaunch/stmmchn.wav" ); SetAmmo( "Rockets", 1, 5 ); SetRank( 70, 70 ); SetType( WEAPON_2HANDED_LO ); SetMinRange( ROCKET_RADIUS ); SetProjectileSpeed( ROCKET_SPEED ); if ( ctf->value ) { // CTF rocketlauncher has alternate fire mode modelIndex( "sprites/thrallpulse.spr" ); SetSecondaryAmmo( "Rockets", 10, 0); dualmode = true; alternate_fire = true; } } void RocketLauncher::Shoot ( Event *ev ) { Rocket *rocket; ThrallPulse *pulse; Vector pos; Vector dir; assert( owner ); if ( !owner ) { return; } GetMuzzlePosition( &pos, &dir ); if ( weaponmode == PRIMARY ) { rocket = new Rocket; rocket->Setup( owner, pos, dir ); NextAttack( 1.0 ); } else { pulse = new ThrallPulse; pulse->Setup( owner, pos, dir ); NextAttack( 1.0 ); SetPrimaryMode(); } }