sin-sdk/rocketlauncher.cpp
1999-11-02 00:00:00 +00:00

482 lines
11 KiB
C++

//-----------------------------------------------------------------------------
//
// $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();
}
}