ef2gamesource/dlls/game/weaputils.h

352 lines
8.9 KiB
C
Raw Normal View History

2012-12-30 16:37:54 +00:00
//-----------------------------------------------------------------------------
//
// $Logfile:: /Code/DLLs/game/weaputils.h $
// $Revision:: 43 $
// $Author:: Steven $
// $Date:: 4/09/03 2:32p $
//
// Copyright (C) 1998 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
//
// DESCRIPTION:
//
#ifndef __WEAPUTILS_H__
#define __WEAPUTILS_H__
#include "g_local.h"
#include "animate.h"
#include "beam.h"
#define P_BOUNCE_TOUCH (1 << 0)
#define P_CHARGE_LIFE (1 << 1)
#define P_CHARGE_SPEED (1 << 2)
#define P_BOUNCE_ALL (1 << 3) // projectile bounces off of *everything*
#define P_QUIET_EXPIRE (1 << 4) // projectile expires (from time) quietly (no explosion)
extern Event EV_Projectile_Explode;
extern Event EV_Projectile_UpdateBeam;
extern Event EV_Actor_ProjectileClose;
//------------------------- CLASS ------------------------------
//
// Name: Projectile
// Base Class: Entity
//
// Description: Projectile Entity
//
// Method of Use: Spawned into the world
//--------------------------------------------------------------
class Projectile : public Entity
{
public:
CLASS_PROTOTYPE( Projectile );
float fov;
int owner;
float speed;
float minspeed;
float bouncefactor;
float damage;
float knockback;
float life;
float minlife;
float dlight_radius;
float charge_fraction;
bool firstTimeOwnerControl;
Vector prevPlayerAngles;
Vector originalPlayerAngles;
Vector dlight_color;
Vector addvelocity;
meansOfDeath_t meansofdeath;
FuncBeam *m_beam;
int projFlags;
str bouncesound;
str impactmarkshader;
str impactmarkorientation;
float impactmarkradius;
str explosionmodel;
EntityPtr target;
bool addownervelocity;
bool drunk;
bool can_hit_owner;
bool remove_when_stopped;
bool stick_on_touch;
bool ownercontrol;
bool _ownerControlLaser;
bool _ownerControlUsed;
float _controlTurnSpeed;
bool triggerdetonate;
float startTime;
float drunkAngleModifier;
bool _scaleByCharge;
float _minScaleFromCharge;
float _maxScaleFromCharge;
bool _scaleExplosion;
bool _notifyActors;
bool _notShootable;
bool _hitsProjectiles;
float _minOnGroundTime;
bool _onGround;
float _startOnGroundTime;
bool _heatSeek;
bool _damagedSomething;
Projectile();
virtual ~Projectile();
virtual void Archive( Archiver &arc );
virtual void Touch( Event *ev );
virtual void Think( void );
virtual void Explode( Event *ev );
virtual void DoDecal( void );
void SetAvelocity( Event *ev );
void SetAddVelocity( Event *ev );
void SetDLight( Event *ev );
void SetLife( Event *ev );
void SetMinLife( Event *ev );
void SetBounceFactor( Event *ev );
void SetChargeLife( Event *ev );
void SetSpeed( Event *ev );
void SetMinSpeed( Event *ev );
void SetChargeSpeed( Event *ev );
void SetDamage( Event *ev );
void SetKnockback( Event *ev );
void SetProjectileDLight( Event *ev );
void SetMeansOfDeath( Event *ev );
void SetQuietExpire( Event *ev );
void SetBounceTouch( Event *ev );
void SetBounceSound( Event *ev );
void SetImpactMarkShader( Event *ev );
void SetImpactMarkRadius( Event *ev );
void SetImpactMarkOrientation( Event *ev );
void SetExplosionModel( Event *ev );
void UpdateBeam( Event *ev );
void BeamCommand( Event *ev );
void HeatSeek( Event *ev );
void Drunk( Event *ev );
void AddOwnerVelocity( Event *ev );
float ResolveMinimumDistance( Entity *potential_target, float currmin );
float AdjustAngle( float maxadjust, float currangle, float targetangle );
void SetCanHitOwner( Event *ev );
void ClearOwner( Event *ev );
Entity * getOwner( void );
void RemoveWhenStopped( Event *ev );
void StickOnTouch( Event *ev );
void Stopped( Event *ev );
void SetOwnerControl( Event *ev );
void setOwnerControlLaser( Event *ev );
void setControlTurnSpeed( Event *ev );
void TriggerDetonate( Event *ev );
void AngleThink( Event *ev );
void setScaleByCharge( Event *ev );
void setScaleExplosion( Event *ev );
void setNotifyActors( Event *ev );
void NotifyActors();
void setNotShootable( Event *ev );
void setHitsProjectiles( Event *ev );
void setMinOnGroundTime( Event *ev );
void destroyed( Event *ev );
void didDamage( void );
};
inline void Projectile::Archive ( Archiver &arc )
{
Entity::Archive( arc );
arc.ArchiveFloat( &fov );
arc.ArchiveInteger( &owner );
arc.ArchiveFloat( &speed );
arc.ArchiveFloat( &minspeed );
arc.ArchiveFloat( &bouncefactor );
arc.ArchiveFloat( &damage );
arc.ArchiveFloat( &knockback );
arc.ArchiveFloat( &life );
arc.ArchiveFloat( &minlife );
arc.ArchiveFloat( &dlight_radius );
arc.ArchiveFloat( &charge_fraction );
arc.ArchiveBool( &firstTimeOwnerControl );
arc.ArchiveVector( &prevPlayerAngles );
arc.ArchiveVector( &originalPlayerAngles );
arc.ArchiveVector( &dlight_color );
arc.ArchiveVector( &addvelocity );
ArchiveEnum( meansofdeath, meansOfDeath_t );
arc.ArchiveObjectPointer( ( Class ** )&m_beam );
arc.ArchiveInteger( &projFlags );
arc.ArchiveString( &bouncesound );
arc.ArchiveString( &impactmarkshader );
arc.ArchiveString( &impactmarkorientation );
arc.ArchiveFloat( &impactmarkradius );
arc.ArchiveString( &explosionmodel );
arc.ArchiveSafePointer( &target );
arc.ArchiveBool( &addownervelocity );
arc.ArchiveBool( &drunk );
arc.ArchiveBool( &can_hit_owner );
arc.ArchiveBool( &remove_when_stopped );
arc.ArchiveBool( &stick_on_touch );
arc.ArchiveBool( &ownercontrol );
arc.ArchiveBool( &_ownerControlLaser );
arc.ArchiveBool( &_ownerControlUsed );
arc.ArchiveFloat( &_controlTurnSpeed );
arc.ArchiveBool( &triggerdetonate );
arc.ArchiveFloat( &startTime );
arc.ArchiveFloat( &drunkAngleModifier );
arc.ArchiveBool( &_scaleByCharge );
arc.ArchiveFloat( &_minScaleFromCharge );
arc.ArchiveFloat( &_maxScaleFromCharge );
arc.ArchiveBool( &_scaleExplosion );
arc.ArchiveBool( &_notifyActors );
arc.ArchiveBool( &_notShootable );
arc.ArchiveBool( &_hitsProjectiles );
arc.ArchiveFloat( &_minOnGroundTime );
arc.ArchiveBool( &_onGround );
arc.ArchiveFloat( &_startOnGroundTime );
arc.ArchiveBool( &_heatSeek );
arc.ArchiveBool( &_damagedSomething );
}
class Explosion : public Projectile
{
public:
float flash_r;
float flash_g;
float flash_b;
float flash_a;
float flash_minradius;
float flash_radius;
float flash_mintime;
float flash_time;
int flash_type;
float radius_damage;
float radius;
qboolean constant_damage;
qboolean damage_every_frame;
CLASS_PROTOTYPE( Explosion );
Explosion();
void SetRadius( Event *ev );
void SetRadiusDamage( Event *ev );
void SetConstantDamage( Event *ev );
void SetDamageEveryFrame( Event *ev );
void SetFlash( Event *ev );
void DamageAgain( Event *ev );
virtual void Archive( Archiver &arc );
};
inline void Explosion::Archive( Archiver &arc )
{
Projectile::Archive( arc );
arc.ArchiveFloat( &flash_r );
arc.ArchiveFloat( &flash_g );
arc.ArchiveFloat( &flash_b );
arc.ArchiveFloat( &flash_a );
arc.ArchiveFloat( &flash_minradius );
arc.ArchiveFloat( &flash_radius );
arc.ArchiveFloat( &flash_mintime );
arc.ArchiveFloat( &flash_time );
arc.ArchiveInteger( &flash_type );
arc.ArchiveFloat( &radius_damage );
}
qboolean MeleeAttack
(
const Vector &pos,
const Vector &end,
float damage,
Entity *attacker,
meansOfDeath_t means_of_death,
float attack_width,
float attack_min_height,
float attack_max_height,
float knockback = 0,
qboolean hit_dead = true,
Container<EntityPtr>*victimlist=NULL,
Weapon *weapon = NULL,
bool critical = false
);
Projectile *ProjectileAttack
(
const Vector &start,
Vector &dir,
Entity *owner,
const str &projectileModel,
float speedfraction,
float real_speed = 0
);
void ExplosionAttack
(
const Vector &pos,
Entity *owner,
const str &projectileModel,
Vector dir = Vector( 0.0f, 0.0f, 0.0f ),
Entity *ignore = NULL,
float scale=1.0f
);
void StunAttack
(
const Vector &pos,
Entity *attacker,
Entity *inflictor,
float radius,
float time,
Entity *ignore
);
float BulletAttack
(
const Vector &start,
const Vector &dir,
const Vector &right,
const Vector &up,
float range,
float damage,
float knockback,
int dflags,
int meansofdeath,
const Vector &spread,
int count,
Entity *owner,
Entity *weap = 0
);
float RadiusDamage
(
Entity *inflictor,
Entity *attacker,
float damage,
Entity *ignore,
int mod,
float radius = 0,
float knockback = 0,
qboolean constant_damage = false
);
#endif // __WEAPUTILS_H__