sin-2015/stungun.cpp

157 lines
3.4 KiB
C++
Raw Permalink Normal View History

1999-04-22 00:00:00 +00:00
// 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 );
}