265 lines
7 KiB
C++
265 lines
7 KiB
C++
|
//-----------------------------------------------------------------------------
|
||
|
//
|
||
|
// $Logfile:: /Quake 2 Engine/Sin/code/game/fists.cpp $
|
||
|
// $Revision:: 34 $
|
||
|
// $Author:: Markd $
|
||
|
// $Date:: 11/17/98 1:31a $
|
||
|
//
|
||
|
// 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.
|
||
|
//
|
||
|
// $Log:: /Quake 2 Engine/Sin/code/game/fists.cpp $
|
||
|
//
|
||
|
// 34 11/17/98 1:31a Markd
|
||
|
// took out damage multiplier for fists
|
||
|
//
|
||
|
// 33 11/12/98 11:31p Jimdose
|
||
|
// changed impact_bodyimpact to impact_goryimpact
|
||
|
// increased kick from melee
|
||
|
//
|
||
|
// 32 10/20/98 8:26p Markd
|
||
|
// Added Attacker to DamageSurface stuff
|
||
|
//
|
||
|
// 31 10/20/98 3:59p Aldie
|
||
|
// Tweaked fist radius
|
||
|
//
|
||
|
// 30 10/14/98 12:12a Aldie
|
||
|
// Tweak damage
|
||
|
//
|
||
|
// 29 10/11/98 5:35p Aldie
|
||
|
// Added meansofdeath
|
||
|
//
|
||
|
// 28 10/05/98 10:23p Aldie
|
||
|
// Fixed rank
|
||
|
//
|
||
|
// 27 10/01/98 3:35p Onethumb
|
||
|
//
|
||
|
// 26 9/18/98 10:12p Markd
|
||
|
// made fists not use MASK_SHOT, MASK_PROJECTILE instead
|
||
|
//
|
||
|
// 25 9/18/98 8:14p Markd
|
||
|
// rewrote surface system so that surfaces are now damaged by surface name instead
|
||
|
// of by surfinfo
|
||
|
//
|
||
|
// 24 8/31/98 7:45p Aldie
|
||
|
// Updated surface data structure and removed surfinfo field
|
||
|
//
|
||
|
// 23 8/31/98 4:33p Markd
|
||
|
// Made fists use fulltrace
|
||
|
//
|
||
|
// 22 8/29/98 9:40p Jimdose
|
||
|
// Added call info to G_Trace
|
||
|
//
|
||
|
// 21 8/29/98 5:27p Markd
|
||
|
// added specialfx, replaced misc with specialfx where appropriate
|
||
|
//
|
||
|
// 20 8/18/98 11:08p Markd
|
||
|
// Added new Alias System
|
||
|
//
|
||
|
// 19 8/17/98 3:16p Aldie
|
||
|
// Made fists not ignore armor
|
||
|
//
|
||
|
// 18 8/06/98 6:58p Jimdose
|
||
|
// Added min/max range, and projectile speed
|
||
|
//
|
||
|
// 17 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
|
||
|
//
|
||
|
// 16 7/22/98 9:57p Markd
|
||
|
// Defined weapon type
|
||
|
//
|
||
|
// 15 7/21/98 1:10p Aldie
|
||
|
// Added meansofdeath to obituaries
|
||
|
//
|
||
|
// 14 7/19/98 10:33p Aldie
|
||
|
// Update fist damage
|
||
|
//
|
||
|
// 13 6/19/98 9:29p Jimdose
|
||
|
// Moved gun orientation code to Weapon
|
||
|
//
|
||
|
// 12 6/10/98 10:03p Markd
|
||
|
// Got working with reach and damage
|
||
|
//
|
||
|
// 11 6/10/98 4:00p Aldie
|
||
|
// Updated fists to do damage skins
|
||
|
//
|
||
|
// 10 6/10/98 2:10p Aldie
|
||
|
// Updated damage function.
|
||
|
//
|
||
|
// 9 5/27/98 5:21a Markd
|
||
|
// changed ranking of fists
|
||
|
//
|
||
|
// 8 5/26/98 5:42p Markd
|
||
|
// Made fists more realistic damage wise
|
||
|
//
|
||
|
// 7 5/25/98 7:58p Markd
|
||
|
// Moved TakeDamage a bit
|
||
|
//
|
||
|
// 6 5/25/98 5:38p Markd
|
||
|
// Put in strike sound and stuff
|
||
|
//
|
||
|
// 5 5/25/98 1:00a Markd
|
||
|
// Fixed Fists
|
||
|
//
|
||
|
// 4 5/23/98 5:38p Markd
|
||
|
// slowed down firing rate
|
||
|
//
|
||
|
// 3 5/20/98 10:43p Markd
|
||
|
// made fists into bullets
|
||
|
//
|
||
|
// 2 5/11/98 11:24a Markd
|
||
|
// First time
|
||
|
//
|
||
|
// DESCRIPTION:
|
||
|
// Normal Hands
|
||
|
//
|
||
|
|
||
|
#include "g_local.h"
|
||
|
#include "fists.h"
|
||
|
#include "misc.h"
|
||
|
#include "specialfx.h"
|
||
|
#include "surface.h"
|
||
|
|
||
|
CLASS_DECLARATION( Weapon, Fists, NULL);
|
||
|
|
||
|
ResponseDef Fists::Responses[] =
|
||
|
{
|
||
|
{ &EV_Weapon_Shoot, ( Response )Fists::Shoot },
|
||
|
{ NULL, NULL }
|
||
|
};
|
||
|
|
||
|
Fists::Fists()
|
||
|
{
|
||
|
SetModels( NULL, "view_punch.def" );
|
||
|
SetAmmo( NULL, 0, 0 );
|
||
|
SetRank( 10, 10 );
|
||
|
strike_reach = 64;
|
||
|
strike_damage = 20;
|
||
|
SetMaxRange( strike_reach );
|
||
|
SetType( WEAPON_MELEE );
|
||
|
kick = 40;
|
||
|
meansofdeath = MOD_FISTS;
|
||
|
}
|
||
|
|
||
|
void Fists::Shoot( Event * ev )
|
||
|
{
|
||
|
trace_t trace;
|
||
|
Vector start;
|
||
|
Vector end;
|
||
|
float damage;
|
||
|
Vector org;
|
||
|
Vector dir;
|
||
|
int surfflags;
|
||
|
int surftype;
|
||
|
|
||
|
assert( owner );
|
||
|
if ( !owner )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
NextAttack( 1 );
|
||
|
|
||
|
damage = G_Random(strike_damage)+strike_damage;
|
||
|
|
||
|
GetMuzzlePosition( &start, &dir );
|
||
|
end = start + dir * strike_reach;
|
||
|
|
||
|
trace = G_FullTrace( start, vec_zero, vec_zero, end, 64, owner, MASK_PROJECTILE, "Fists::Shoot" );
|
||
|
|
||
|
if ( !trace.surface )
|
||
|
{
|
||
|
surfflags = 0;
|
||
|
surftype = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
surfflags = trace.surface->flags;
|
||
|
surftype = SURFACETYPE_FROM_FLAGS( surfflags );
|
||
|
surfaceManager.DamageSurface( &trace, damage, owner );
|
||
|
}
|
||
|
dir = Vector(trace.endpos) - start;
|
||
|
dir.normalize();
|
||
|
|
||
|
org = Vector(trace.endpos) - dir;
|
||
|
|
||
|
if ( (trace.fraction < 1.0f) )
|
||
|
{
|
||
|
if ( trace.ent->entity && trace.ent->entity->takedamage )
|
||
|
{
|
||
|
if ( trace.ent->entity->flags & FL_BLOOD )
|
||
|
{
|
||
|
if ( ( meansofdeath == MOD_MUTANTHANDS ) || ( trace.ent->entity->health < -500 ) )
|
||
|
{
|
||
|
owner->RandomGlobalSound("impact_goryimpact");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
owner->RandomGlobalSound("impact_bodyimpact");
|
||
|
}
|
||
|
SpawnBlood( org, trace.plane.normal, damage );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
gi.WriteByte( svc_temp_entity );
|
||
|
gi.WriteByte( TE_STRIKE );
|
||
|
gi.WritePosition( org.vec3() );
|
||
|
gi.WriteDir( trace.plane.normal );
|
||
|
gi.WriteByte( 120 );
|
||
|
gi.WriteByte( surftype );
|
||
|
gi.multicast( org.vec3(), MULTICAST_PVS );
|
||
|
}
|
||
|
if ( trace.intersect.valid )
|
||
|
{
|
||
|
// take the ground out so that the kick works
|
||
|
trace.ent->entity->groundentity = NULL;
|
||
|
|
||
|
// We hit a valid group so send in location based damage
|
||
|
trace.ent->entity->Damage( this,
|
||
|
owner,
|
||
|
damage,
|
||
|
trace.endpos,
|
||
|
dir,
|
||
|
trace.plane.normal,
|
||
|
kick,
|
||
|
0,
|
||
|
meansofdeath,
|
||
|
trace.intersect.parentgroup,
|
||
|
-1,
|
||
|
1 );
|
||
|
//trace.intersect.damage_multiplier );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// We didn't hit any groups, so send in generic damage
|
||
|
trace.ent->entity->Damage( this,
|
||
|
owner,
|
||
|
damage,
|
||
|
trace.endpos,
|
||
|
dir,
|
||
|
trace.plane.normal,
|
||
|
kick,
|
||
|
0,
|
||
|
meansofdeath,
|
||
|
-1,
|
||
|
-1,
|
||
|
1 );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
gi.WriteByte( svc_temp_entity );
|
||
|
gi.WriteByte( TE_STRIKE );
|
||
|
gi.WritePosition( org.vec3() );
|
||
|
gi.WriteDir( trace.plane.normal );
|
||
|
gi.WriteByte( 120 );
|
||
|
gi.WriteByte( surftype );
|
||
|
gi.multicast( org.vec3(), MULTICAST_PVS );
|
||
|
}
|
||
|
}
|
||
|
}
|