157 lines
3.4 KiB
C++
157 lines
3.4 KiB
C++
|
// Copyright (C) 1998 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.
|
||
|
//
|
||
|
// DESCRIPTION:
|
||
|
// Stungun
|
||
|
//
|
||
|
|
||
|
#include "g_local.h"
|
||
|
#include "bullet.h"
|
||
|
#include "stungun.h"
|
||
|
#include "specialfx.h"
|
||
|
#include "misc.h"
|
||
|
#include "explosion.h"
|
||
|
#include "surface.h"
|
||
|
|
||
|
CLASS_DECLARATION( BulletWeapon, Stungun, "weapon_stungun" );
|
||
|
|
||
|
ResponseDef Stungun::Responses[] =
|
||
|
{
|
||
|
{ &EV_Weapon_Shoot, ( Response )Stungun::Shoot },
|
||
|
{ NULL, NULL }
|
||
|
};
|
||
|
|
||
|
Stungun::Stungun()
|
||
|
{
|
||
|
SetModels( "stun.def", "stun.def" );
|
||
|
SetType( WEAPON_2HANDED_LO );
|
||
|
notdroppable = true;
|
||
|
SetMaxRange( 480 );
|
||
|
}
|
||
|
|
||
|
|
||
|
// This is the trace that the laser portion of this weapon does.
|
||
|
void Stungun::TraceAttack
|
||
|
(
|
||
|
Vector start,
|
||
|
Vector end,
|
||
|
int damage,
|
||
|
trace_t *trace,
|
||
|
int numricochets,
|
||
|
int kick,
|
||
|
int dflags
|
||
|
)
|
||
|
|
||
|
{
|
||
|
Vector org;
|
||
|
Vector dir;
|
||
|
int surfflags;
|
||
|
int surftype;
|
||
|
Entity *ent;
|
||
|
|
||
|
if ( HitSky( trace ) )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
dir = end - start;
|
||
|
dir.normalize();
|
||
|
|
||
|
org = end - dir * 4;
|
||
|
|
||
|
if ( !trace->surface )
|
||
|
{
|
||
|
surfflags = 0;
|
||
|
surftype = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
surfflags = trace->surface->flags;
|
||
|
surftype = SURFACETYPE_FROM_FLAGS( surfflags );
|
||
|
surfaceManager.DamageSurface( trace, damage, owner );
|
||
|
}
|
||
|
|
||
|
ent = trace->ent->entity;
|
||
|
|
||
|
if ( ent && ent->takedamage )
|
||
|
{
|
||
|
if ( trace->intersect.valid )
|
||
|
{
|
||
|
// We hit a valid group so send in location based damage
|
||
|
ent->Damage( this,
|
||
|
owner,
|
||
|
damage,
|
||
|
trace->endpos,
|
||
|
dir,
|
||
|
trace->plane.normal,
|
||
|
kick,
|
||
|
dflags,
|
||
|
MOD_PULSELASER,
|
||
|
trace->intersect.parentgroup,
|
||
|
-1,
|
||
|
trace->intersect.damage_multiplier );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// We didn't hit any groups, so send in generic damage
|
||
|
ent->Damage( this,
|
||
|
owner,
|
||
|
damage,
|
||
|
trace->endpos,
|
||
|
dir,
|
||
|
trace->plane.normal,
|
||
|
kick,
|
||
|
dflags,
|
||
|
MOD_PULSELASER,
|
||
|
-1,
|
||
|
-1,
|
||
|
1 );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Stungun::Shoot
|
||
|
(
|
||
|
Event *ev
|
||
|
)
|
||
|
|
||
|
{
|
||
|
|
||
|
Vector pos;
|
||
|
Vector end;
|
||
|
Vector dir;
|
||
|
Vector delta;
|
||
|
trace_t trace;
|
||
|
float dist;
|
||
|
float length;
|
||
|
float damg;
|
||
|
|
||
|
assert( owner );
|
||
|
if ( !owner )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
GetMuzzlePosition( &pos, &dir );
|
||
|
|
||
|
// Fire the beam
|
||
|
length = ev->GetInteger( 1 );
|
||
|
end = pos + dir * length;
|
||
|
trace = G_Trace( pos, vec_zero, vec_zero, end, owner, MASK_SHOT, "Stungun::Shoot" );
|
||
|
delta = trace.endpos - pos;
|
||
|
dist = delta.length();
|
||
|
|
||
|
// Set the pitch of this weapon so the client can use it to fire bullets in the right directions
|
||
|
dir = Vector( owner->orientation[ 0 ] );
|
||
|
angles = dir.toAngles();
|
||
|
setAngles( angles );
|
||
|
|
||
|
damg = 35;
|
||
|
TraceAttack( pos, trace.endpos, damg, &trace, 0, 0, 0 );
|
||
|
NextAttack( 0 );
|
||
|
}
|
||
|
|