mirror of
https://github.com/UberGames/EF2GameSource.git
synced 2024-11-30 15:10:51 +00:00
919 lines
31 KiB
C++
919 lines
31 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Logfile:: /Code/DLLs/game/weapon.h $
|
|
// $Revision:: 121 $
|
|
// $Author:: Steven $
|
|
// $Date:: 10/13/03 9:43a $
|
|
//
|
|
// 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.
|
|
//
|
|
//
|
|
// DESCRIPTION:
|
|
// Header file for Weapon class. The weapon class is the base class for
|
|
// all weapons in the game. Any entity created from a class derived from the weapon
|
|
// class will be usable by any Sentient (players and monsters) as a weapon.
|
|
//
|
|
class Weapon;
|
|
|
|
#ifndef __WEAPON_H__
|
|
#define __WEAPON_H__
|
|
|
|
#include "g_local.h"
|
|
#include "item.h"
|
|
#include "ammo.h"
|
|
#include "sentient.h"
|
|
|
|
extern Event EV_Weapon_GiveStartingAmmo;
|
|
extern Event EV_Weapon_GiveAmmoBoost;
|
|
|
|
typedef enum
|
|
{
|
|
FT_NONE,
|
|
FT_BULLET,
|
|
FT_PROJECTILE,
|
|
FT_MELEE,
|
|
FT_SPECIAL_PROJECTILE,
|
|
FT_EXPLOSION,
|
|
FT_TRIGGER_PROJECTILE,
|
|
FT_CONTROL_PROJECTILE,
|
|
FT_CONTROL_ZOOM
|
|
} firetype_t;
|
|
|
|
typedef enum
|
|
{
|
|
WEAPON_ANIMATING,
|
|
WEAPON_READY,
|
|
WEAPON_FIRING,
|
|
WEAPON_LOWERING,
|
|
WEAPON_RAISING,
|
|
WEAPON_HOLSTERED,
|
|
WEAPON_RELOADING,
|
|
WEAPON_CHANGING,
|
|
WEAPON_SWITCHINGMODE
|
|
} weaponstate_t;
|
|
|
|
typedef enum
|
|
{
|
|
ACCURACY_STOPPED,
|
|
ACCURACY_CHANGE,
|
|
ACCURACY_WALK,
|
|
ACCURACY_RUN,
|
|
ACCURACY_CROUCH,
|
|
MAX_ACCURACYTYPES
|
|
} weaponaccuracy_t;
|
|
|
|
|
|
typedef enum
|
|
{
|
|
ZOOM_NORMAL_FOV = 0,
|
|
ZOOM_STAGE_1,
|
|
ZOOM_STAGE_2,
|
|
NUM_ZOOM_STAGES
|
|
} ZoomStage;
|
|
|
|
//========================================
|
|
// Bones used by weapon
|
|
//========================================
|
|
typedef enum
|
|
{
|
|
WEAPONBONE_BARREL_TAG
|
|
} weaponbones_t;
|
|
|
|
#define INITIALIZE_WEAPONMODE_VAR(var,value) \
|
|
{ \
|
|
int _ii; \
|
|
for( _ii=0; _ii<MAX_FIREMODES; _ii++ ) \
|
|
{ \
|
|
var[_ii] = value; \
|
|
} \
|
|
}
|
|
|
|
class Player;
|
|
|
|
//------------------------- CLASS ------------------------------
|
|
//
|
|
// Name: ActiveWeapon
|
|
// Base Class: Class
|
|
//
|
|
// Description: This is an active weapon.
|
|
//
|
|
// Method of Use:
|
|
//--------------------------------------------------------------
|
|
class ActiveWeapon : public Class
|
|
{
|
|
public:
|
|
WeaponPtr weapon;
|
|
weaponhand_t hand;
|
|
|
|
ActiveWeapon();
|
|
void Archive( Archiver &arc );
|
|
};
|
|
|
|
inline ActiveWeapon::ActiveWeapon()
|
|
{
|
|
weapon = NULL;
|
|
hand = WEAPON_ERROR;
|
|
}
|
|
|
|
inline void ActiveWeapon::Archive( Archiver &arc )
|
|
{
|
|
arc.ArchiveSafePointer( &weapon );
|
|
ArchiveEnum( hand, weaponhand_t );
|
|
}
|
|
|
|
class WeaponProperty : public Class
|
|
{
|
|
public:
|
|
WeaponProperty( const str &property ) : _property( property ) { }
|
|
~WeaponProperty() { }
|
|
|
|
const str& getStringValue() { return _stringValue ; }
|
|
float getFloatValue() { return _floatValue ; }
|
|
|
|
void setStringValue( const str &value ) { _stringValue = value ; }
|
|
void setFloatValue( float value ) { _floatValue = value ; }
|
|
|
|
private:
|
|
str _property ;
|
|
str _stringValue ;
|
|
float _floatValue ;
|
|
};
|
|
|
|
|
|
class WeaponProperties : public Class
|
|
{
|
|
public:
|
|
WeaponProperties();
|
|
~WeaponProperties() { }
|
|
|
|
WeaponProperty getWeaponProperty( const str &name );
|
|
|
|
void addWeaponProperty ( const str &weaponProperty );
|
|
|
|
private:
|
|
Container<WeaponProperty> _weaponProperties ;
|
|
};
|
|
|
|
|
|
class Weapon : public Item
|
|
{
|
|
protected:
|
|
friend class Player;
|
|
friend class WeaponDualWield;
|
|
|
|
private:
|
|
qboolean attached; // Is this weapon attached to something?
|
|
float nextweaponsoundtime; // The next time this weapon should sound off
|
|
str current_attachToTag; // The current name of the tag to attach itself to on the owner
|
|
str left_attachToTag; // Tag to use when weapon is wielded in the left hand
|
|
str right_attachToTag; // ...right hand
|
|
str dual_attachToTag; // ...dual handed
|
|
str leftholster_attachToTag; // Tag to use when weapon is put away from left hand
|
|
str rightholster_attachToTag; // ...right hand
|
|
str dualholster_attachToTag; // ...dual handed
|
|
float lastScale; // Used for attaching to holster
|
|
Vector lastAngles; // Used for attaching to holster
|
|
qboolean lastValid; // Used for attaching to holster
|
|
qboolean auto_putaway; // Weapon will put itself away when out of ammo
|
|
qboolean use_no_ammo; // Weapon will be able to be used when it has no ammo
|
|
qboolean crosshair; // Whether or not to display a crosshair with this weapon
|
|
qboolean torsoaim; // Whether or not to torso aim with this weapon
|
|
qboolean special_move; // Allows special movement or not
|
|
EntityPtr aim_target; // Current target of the weapon
|
|
firemode_t curmode; // The current weapon mode
|
|
firemode_t maxmode; // The maximum valid mode for this weapon
|
|
qboolean switchmode; // Speicifies that this is a switch mode weapon
|
|
qboolean targetidleflag; // Flag to specify if we have just left a target idle
|
|
int chx; // x screen coord crosshair offset
|
|
int chy; // y screen coord crosshair offset
|
|
Vector realvieworg; // real view origin (third person camera loc)
|
|
qboolean thirdperson; // whether or not the player is in 3rd person
|
|
bool useActorAiming;
|
|
float _powerRating; // how much damage per second the weapon will do
|
|
float _projectileDamage; // how much the projectile launched from this weapon will do -- needs to match the damage in the projectile .tik file ( used by AI )
|
|
float _projectileSpeed; // how fast the projectile launched from the weapon will move -- needs to match the damage in the projectile .tik file ( used by AI )
|
|
bool _arcProjectile; // whether or not to arc the projectile
|
|
float _lowArcRange; // range at which the projectile will switch from high trajectory to normal
|
|
bool _playMissSound; //Play snd_ricochet if the bullet impact hits a non-damagable entity
|
|
|
|
Container<EntityPtr> meleeVictims; // Melee victim list
|
|
|
|
protected:
|
|
float maxrange; // maximum effective firing distance (for AI)
|
|
float minrange; // minimum safe firing distance (for AI)
|
|
str viewmodel; // the viewmodel of the weapon
|
|
weaponstate_t weaponstate; // current state of the weapon
|
|
int rank; // rank of the weapon (relative to other weapons)
|
|
int order; // The order of this weapon in the inventory
|
|
SentientPtr last_owner; // The last owner of the weapon
|
|
float last_owner_trigger_time; // The time when the last owner may re-pickup this weapon
|
|
qboolean notdroppable; // makes the weapon not able to be dropped
|
|
int aimanim; // The aim animation to use for this weapon (so it shoots straight)
|
|
int aimframe; // The aim frame to use for this weapon (so it shoots straight)
|
|
Vector leftHolsterAngles; // Angles to set the weapon to when it's holstered
|
|
Vector rightHolsterAngles; // Angles to set the weapon to when it's holstered
|
|
Vector dualHolsterAngles; // Angles to set the weapon to when it's holstered
|
|
float holsterScale; // Scale the weapon should be set to when it's holstered
|
|
float _weildedScale;
|
|
qboolean quiet; // Makes the weapon not alert actors
|
|
float next_noise_time; // next time weapon will alert actors
|
|
float next_noammo_time; // next time we can play out of ammo sound
|
|
int burstcount; // The current amount of burst ammo used
|
|
int burstcountmax; // Max amount of ammo for a burst
|
|
|
|
// Each of these arrays is used to describe the properties of the weapon
|
|
// in its primary(index 0) and alternate(index 1) mode
|
|
|
|
str ammo_type[MAX_FIREMODES]; // The type of ammo used
|
|
int ammorequired[MAX_FIREMODES]; // The amount of ammo required to fire this weapon
|
|
int startammo[MAX_FIREMODES]; // The starting amount of ammo when the weapon is picked up
|
|
int _ammoBoost[ MAX_FIREMODES ];
|
|
str projectileModel[MAX_FIREMODES]; // The model of the projectile fired
|
|
float bulletdamage[MAX_FIREMODES]; // The amount of damate a single bullet causes
|
|
float bulletcount[MAX_FIREMODES]; // The number of bullets the weapon fires
|
|
float bulletrange[MAX_FIREMODES]; // The range of the bullet
|
|
float bulletknockback[MAX_FIREMODES]; // The amount of knockback a bullet causes
|
|
float projectilespeed[MAX_FIREMODES]; // The speed of the projectile fired
|
|
Vector bulletspread[MAX_FIREMODES]; // The amount of spread bullets can have
|
|
Vector endbulletspread[MAX_FIREMODES]; // The final bullet spread (if different from initial) and time interval (in .z)
|
|
firetype_t firetype[MAX_FIREMODES]; // The type of fire (projectile or bullet)
|
|
int ammo_clip_size[MAX_FIREMODES]; // The amount of rounds the clip can hold
|
|
int ammo_in_clip[MAX_FIREMODES]; // The current amount of ammo in the clip
|
|
float max_charge_time[MAX_FIREMODES]; // The max amount of time the weapon may be charged.
|
|
meansOfDeath_t meansofdeath[MAX_FIREMODES]; // The means of death for this mode
|
|
qboolean loopfire[MAX_FIREMODES]; // The weapon loopfires and will not idle when shooting
|
|
//qboolean fullanimfire[MAX_FIREMODES]; // The weapon will play full fire anim even if key is released
|
|
int action_level_increment[MAX_FIREMODES]; // Increments the action level everytime the weapon is fired
|
|
str worldhitspawn[MAX_FIREMODES]; // The models to spawn when the weapon strikes the world
|
|
float next_fire_time[MAX_FIREMODES]; // The next time the weapon can fire
|
|
float fire_timer[MAX_FIREMODES]; // The times for each fire mode
|
|
float accuracy[MAX_FIREMODES][MAX_ACCURACYTYPES]; // Accuracy values for this weapon
|
|
qboolean burstmode[MAX_FIREMODES]; // This mode is a burst fire mode
|
|
float _burstModeDelay[MAX_FIREMODES];
|
|
float shootingMoveSpeedModifier[MAX_FIREMODES]; // Move speed modifier while shooting
|
|
|
|
float _viewShakeMagnitude[MAX_FIREMODES];
|
|
float _viewShakeDuration[MAX_FIREMODES];
|
|
Vector _viewMinShake[MAX_FIREMODES];
|
|
Vector _viewMaxShake[MAX_FIREMODES];
|
|
bool _viewShakeOverride[ MAX_FIREMODES ];
|
|
bool _noAmmoMode[MAX_FIREMODES];
|
|
|
|
bool _noDelay[MAX_FIREMODES];
|
|
int _chargedModels[MAX_FIREMODES];
|
|
|
|
int _spreadAnims[ MAX_FIREMODES ];
|
|
float _spreadTime[ MAX_FIREMODES ];
|
|
|
|
float _meleeWidth[ MAX_FIREMODES ];
|
|
float _meleeHeight[ MAX_FIREMODES ];
|
|
float _meleeLength[ MAX_FIREMODES ];
|
|
|
|
Vector _fireOffset[ MAX_FIREMODES ];
|
|
|
|
int _regenAmount[ MAX_FIREMODES ];
|
|
float _regenTime[ MAX_FIREMODES ];
|
|
bool _regenOnlyWhenIdle[ MAX_FIREMODES ];
|
|
float _nextRegenTime[ MAX_FIREMODES ];
|
|
|
|
float _maxViewShakeChange;
|
|
|
|
float startfiretime; // The time that the trigger was first depressed in an anim
|
|
int autoAimTargetSelectionAngle; // Whether or not the weapon will autoaim ( and the angle used to determine autoaiming)
|
|
int autoAimLockonAngle; // Angle within which a target will be locked on to, allowing
|
|
float charge_fraction; // Fraction of a charge up time
|
|
qboolean putaway; // This is set to true by the state system to signal a weapon to be putaway
|
|
firemode_t firemodeindex; // This is used as an internal index to indicate which mode to apply commands to
|
|
weaponhand_t hand; // which hand the weapon may be wielded in
|
|
|
|
float reticuletime; // Time it takes the reticule to settle.
|
|
float zoomfov; // zoomfov for this weapon
|
|
float _lastZoomFov;
|
|
float startzoom; // the zoom fov to start at.
|
|
float endzoom; // the zoom fov to end at
|
|
float zoomtime; // the amount of time to go from start zoom to end zoom
|
|
float startzoomtime; // the start time of the zoom
|
|
int aimtype; // What accuracy modifiers we are using
|
|
qboolean usesameclip; // Use the same clip for both fire modes
|
|
float chargetime; // Current charge time
|
|
qboolean targetidle; // Weapon has a specific target idle anim
|
|
qboolean donefiring; // Whether or not the weapon is done firing;
|
|
|
|
qboolean zoomed;
|
|
int targetingSkin;
|
|
int shootingSkin;
|
|
int _fullAmmoSkin;
|
|
firemode_t _fullAmmoMode;
|
|
float defaultMoveSpeedModifier;
|
|
|
|
Vector viewShake;
|
|
|
|
bool _controllingProjectile;
|
|
bool _controllingProjectileHidden;
|
|
str _controlEmitterName;
|
|
str _controlSoundName;
|
|
bool _canInterruptFiringState;
|
|
|
|
ZoomStage _zoomStage;
|
|
|
|
bool _autoReload;
|
|
|
|
bool _allowAutoSwitch;
|
|
|
|
float _nextSwitchTime;
|
|
|
|
|
|
void SetMaxRangeEvent( Event *ev );
|
|
void SetMinRangeEvent( Event *ev );
|
|
void SetSecondaryAmmo( const char *type, int amount, int startamount );
|
|
virtual void DetachGun( void );
|
|
virtual void AttachGun( weaponhand_t hand, qboolean holstering = false );
|
|
void PickupWeapon( Event *ev );
|
|
void DoneRaising( Event *ev );
|
|
void DoneFiring( Event *ev );
|
|
void DoneAnimating( Event *ev );
|
|
void Idle( Event *ev );
|
|
qboolean CheckReload( void );
|
|
qboolean CheckReload( firemode_t mode );
|
|
void DoneReloading( Event *ev );
|
|
void DoneReloadingBurst( Event *ev );
|
|
void SetAimAnim( Event *ev );
|
|
virtual void Shoot( Event *ev );
|
|
void ModeSet( Event *ev );
|
|
void SetFireType( Event *ev );
|
|
void SetProjectile( Event *ev );
|
|
void SetBulletDamage( Event *ev );
|
|
void SetBulletRange( Event *ev );
|
|
void SetBulletKnockback( Event *ev );
|
|
void SetBulletCount( Event *ev );
|
|
void SetBulletSpread( Event *ev );
|
|
void SetAutoPutaway( Event *ev );
|
|
void SetRange( Event *ev );
|
|
void SetSpecialMove( Event *ev );
|
|
void SetUseNoAmmo( Event *ev );
|
|
void LeftAttachToTag( Event *ev );
|
|
void RightAttachToTag( Event *ev );
|
|
void DualAttachToTag( Event *ev );
|
|
void LeftHolsterAttachToTag( Event *ev );
|
|
void RightHolsterAttachToTag( Event *ev );
|
|
void DualHolsterAttachToTag( Event *ev );
|
|
void SetLeftHolsterAngles( Event *ev );
|
|
void SetRightHolsterAngles( Event *ev );
|
|
void SetDualHolsterAngles( Event *ev );
|
|
void SetHolsterScale( Event *ev );
|
|
void setWeildedScale( Event *ev );
|
|
void SetWorldHitSpawn( Event *ev );
|
|
void SetViewModel( Event *ev );
|
|
void DonePutaway( Event *ev );
|
|
void SetRegenAmmo( Event *ev );
|
|
void SetRegenOnlyWhenIdle( Event *ev );
|
|
void ChangeIdle( Event *ev );
|
|
void DrawBowStrain( Event *ev );
|
|
void AltDrawBowStrain( Event *ev );
|
|
void SetAccuracy( Event *ev );
|
|
void SetReticuleTime( Event *ev );
|
|
void SetZoomFOV( Event *ev );
|
|
void IncrementZoom(Event *ev);
|
|
void setZoomStage( Event* ev );
|
|
void changeZoomStage( float firstZoom, float secondZoom );
|
|
|
|
void SetStartZoom(Event *ev);
|
|
void SetEndZoom(Event *ev);
|
|
void SetZoomTime(Event *ev);
|
|
void SetAimType( Event *ev );
|
|
void SetFireTimer( Event *ev );
|
|
void UseSameClip( Event *ev );
|
|
void SetMaxModes( Event *ev );
|
|
void SetSwitchMode( Event *ev );
|
|
void DoneSwitching( Event *ev );
|
|
void DoneSwitchToMiddle( Event *ev );
|
|
void TargetIdle( Event *ev );
|
|
void TargetIdleThink( Event *ev );
|
|
void SetBurstMode( Event *ev );
|
|
void setBurstModeDelay( Event *ev );
|
|
void UseActorAiming( Event *ev );
|
|
void PassToAnimate( Event *ev );
|
|
void SetArcProjectile( Event *ev );
|
|
void SetLowArcRange( Event *ev );
|
|
void SetPlayMissSound(Event *ev );
|
|
virtual void processGameplayData( Event *ev );
|
|
|
|
public:
|
|
CLASS_PROTOTYPE( Weapon );
|
|
|
|
Weapon();
|
|
Weapon( const char *file );
|
|
~Weapon();
|
|
|
|
bool shouldArcProjectile();
|
|
bool shouldPlayMissSound();
|
|
float GetLowArcRange();
|
|
int GetRank( void );
|
|
int GetOrder( void );
|
|
void SetRank( int order, int rank );
|
|
float GetMaxRange( void );
|
|
float GetMinRange( void );
|
|
inline qboolean GetPutaway( void ){ return putaway; };
|
|
inline void SetPutAway( qboolean p ){ putaway = p; };
|
|
void SetMaxRange( float val );
|
|
void SetMinRange( float val );
|
|
void SetHand( Event *ev );
|
|
inline weaponhand_t GetHand( void ){ return hand; };
|
|
void ForceIdle( void );
|
|
void SetAmmoRequired( Event *ev );
|
|
void SetStartAmmo( Event *ev );
|
|
void setAmmoBoost( Event *ev );
|
|
int GetStartAmmo( firemode_t mode );
|
|
int getAmmoBoost( firemode_t mode );
|
|
int GetMaxAmmo( firemode_t mode );
|
|
str GetAmmoType( firemode_t mode );
|
|
firetype_t GetFireType( firemode_t mode );
|
|
void SetAmmoType( Event *ev );
|
|
void SetAmmoAmount( int amount, firemode_t mode );
|
|
void UseAmmo( int amount, firemode_t mode );
|
|
void SetAmmoClipSize( Event *ev );
|
|
void SetAmmoInClip( Event *ev );
|
|
void SetModels( const char *world, const char *view );
|
|
void SetOwner( Sentient *ent );
|
|
void SetMaxChargeTime( Event *ev );
|
|
void SetAnim( const str &animName, Event *endevent = NULL, bodypart_t part = legs );
|
|
void SetAnim( const str &animName, const Event &endevent, bodypart_t part = legs );
|
|
int AmmoAvailable( firemode_t mode );
|
|
qboolean UnlimitedAmmo( firemode_t mode );
|
|
qboolean HasAmmo( firemode_t mode, int numShots = 1 );
|
|
|
|
qboolean HasInvAmmo( firemode_t mode );
|
|
qboolean HasAmmoInClip( firemode_t mode, int numShots = 1 );
|
|
int GetClipSize( firemode_t mode );
|
|
int GetRequiredAmmo( firemode_t mode );
|
|
qboolean ReadyToFire( firemode_t mode, qboolean playsound = true );
|
|
virtual void PutAway( void );
|
|
qboolean Drop( void );
|
|
void Fire( firemode_t mode );
|
|
void Charge( firemode_t mode );
|
|
void ReleaseFire( firemode_t mode, float chargetime );
|
|
void ClientFireDone( void );
|
|
qboolean Removable( void );
|
|
qboolean Pickupable( Entity *other );
|
|
void DetachFromOwner( void );
|
|
virtual void AttachToOwner( weaponhand_t hand );
|
|
void WeaponSound( Event *ev );
|
|
void GetMuzzlePosition( Vector *position, Vector *forward = NULL, Vector *right = NULL, Vector *up = NULL );
|
|
void GetActorMuzzlePosition( Vector *position, Vector *forward = NULL, Vector *right = NULL, Vector *up = NULL, const char* tagname = NULL);
|
|
qboolean AutoChange( void );
|
|
int ClipAmmo( firemode_t mode );
|
|
void ProcessWeaponCommandsEvent(Event *ev);
|
|
qboolean IsDroppable( void );
|
|
int ActionLevelIncrement( firemode_t mode );
|
|
void SetActionLevelIncrement( Event *ev );
|
|
void ForceState( weaponstate_t state );
|
|
void NotDroppableEvent( Event *ev );
|
|
void GiveStartingAmmo( Event *ev );
|
|
void giveAmmoBoost( Event *ev );
|
|
void AutoAim( Event *ev );
|
|
void Crosshair( Event *ev );
|
|
void TorsoAim( Event *ev );
|
|
void AttachToTag( Event *ev );
|
|
void SetQuiet( Event *ev );
|
|
void SetLoopFire( Event *ev );
|
|
void AddEffectsAnims( void );
|
|
//void SetFullAnimFire( Event *ev );
|
|
|
|
// Apparently the special_projectile stuff is no longer used
|
|
//inline virtual void SpecialFireProjectile( const Vector &pos, const Vector &forward, const Vector &right, const Vector &up, Entity *owner, str projectileModel, float charge_fraction ) {};
|
|
void AttachToHolster( weaponhand_t hand );
|
|
inline str GetCurrentAttachToTag( void ){ return current_attachToTag; };
|
|
inline void SetCurrentAttachToTag( const str &s ){ current_attachToTag = s; };
|
|
inline str GetLeftHolsterTag( void ){ return leftholster_attachToTag; };
|
|
inline str GetRightHolsterTag( void ){ return rightholster_attachToTag; };
|
|
inline str GetDualHolsterTag( void ){ return dualholster_attachToTag; };
|
|
inline qboolean GetUseNoAmmo( void ){ return use_no_ammo; };
|
|
void SetMeansOfDeath( Event *ev );
|
|
meansOfDeath_t GetMeansOfDeath( firemode_t mode );
|
|
void SetAimTarget( Entity * );
|
|
void WorldHitSpawn( firemode_t mode, const Vector &org, const Vector &angles, float life );
|
|
void MakeNoise( Event *ev );
|
|
virtual void Archive( Archiver &arc );
|
|
inline void SetAimType ( int aim ) { aimtype = aim; }
|
|
inline float GetFireTime ( firemode_t mode ) { return next_fire_time[mode]; }
|
|
inline qboolean GetSwitchMode() { return switchmode; }
|
|
inline firemode_t GetCurMode() { return curmode; }
|
|
qboolean ForceReload( );
|
|
qboolean HasFullClip();
|
|
void SwitchMode( );
|
|
void SetCHOffset(int chx, int chy);
|
|
void CheckForTargetedEntity();
|
|
Vector GetViewEndPoint();
|
|
void SetRealViewOrigin( const Vector &rv );
|
|
void SetThirdPerson( qboolean tp );
|
|
qboolean IsDoneFiring();
|
|
void StartFiring(Event *ev);
|
|
void FinishedFiring( Event *ev );
|
|
void Zoom( Event *ev );
|
|
void endZoom( Event *ev );
|
|
void rezoom( Event *ev );
|
|
void endZoom( void );
|
|
virtual void ProcessTargetedEntity(EntityPtr entity);
|
|
virtual void Uninitialize(void);
|
|
void SetTargetingSkin( Event *ev );
|
|
void SetShootingSkin( Event *ev );
|
|
void setFullAmmoSkin( Event *ev );
|
|
void setMoveSpeedModifier( Event *ev );
|
|
void setShootingMoveSpeedModifier( Event *ev );
|
|
float getMoveSpeedModifier( void );
|
|
void playAnim( const str &animName, bool animatingFlag = true );
|
|
|
|
void setViewShakeInfo( Event *ev );
|
|
void setAdvancedViewShakeInfo( Event *ev );
|
|
void startViewShake( Event *ev );
|
|
void startViewShake( void );
|
|
void updateViewShake( void );
|
|
void reduceViewShake( Event *ev );
|
|
void clearViewShake( Event *ev );
|
|
Vector getViewShake( void );
|
|
|
|
void SetPowerRating( Event *ev );
|
|
void SetPowerRating( float damage );
|
|
|
|
void SetProjectileSpeed( Event *ev );
|
|
void SetProjectileSpeed( float speed );
|
|
void SetProjectileDamage( Event *ev );
|
|
void SetProjectileDamage( float damage );
|
|
void SetBulletSpread( float spreadX , float spreadY );
|
|
|
|
float GetPowerRating();
|
|
float GetBulletSpreadX(firemode_t idx);
|
|
float GetRange(firemode_t idx);
|
|
float GetProjectileDamage();
|
|
float GetProjectileSpeed();
|
|
|
|
|
|
void ClearMeleeVictims() { meleeVictims.ClearObjectList(); }
|
|
void AdvancedMeleeAttack(const char* tag1, const char* tag2, bool critical=false);
|
|
float GetBulletDamage(firemode_t idx = FIRE_MODE1);
|
|
|
|
Vector getSpread( void );
|
|
void applySpread( Vector *forward, Vector *right, Vector *up );
|
|
|
|
// Need a way to trick the weapon into thinking it's attached so
|
|
// that it will drop properly from the player.
|
|
void setAttached(bool flag) { attached = flag; }
|
|
|
|
/* virtual */ float RespawnTime( void );
|
|
|
|
void noAmmoMode( Event *ev );
|
|
bool hasNoAmmoMode( firemode_t mode );
|
|
|
|
void setNoDelay( Event *ev );
|
|
bool isModeNoDelay( firemode_t mode );
|
|
|
|
void pauseRegen( Event *ev );
|
|
void setChargedModels( Event *ev );
|
|
|
|
void setControllingProjectile( Event *ev );
|
|
bool getControllingProjectile( void );
|
|
|
|
void setCanInterruptFiringState( Event *ev );
|
|
|
|
void setSpreadAnimData( Event *ev );
|
|
|
|
bool canReload( void );
|
|
|
|
int getAmmoInClip( firemode_t mode );
|
|
|
|
void setMaxViewShakeChange( Event *ev );
|
|
|
|
void setControlParms( Event *ev );
|
|
void toggleProjectileControl( void );
|
|
void setProjectileControlHidden( Event *ev );
|
|
|
|
void setMeleeParms( Event *ev );
|
|
|
|
void setFireOffset( Event *ev );
|
|
|
|
/* virtual */ void cacheStrings( void );
|
|
|
|
void setAutoReload( Event *ev );
|
|
void setAllowAutoSwitch( Event *ev );
|
|
void forceReload( Event *ev );
|
|
|
|
/* virtual */ void Think( void );
|
|
|
|
bool shouldAutoSwitch( firemode_t mode );
|
|
|
|
virtual int getStat( int statNum ) { return 0; }
|
|
|
|
void autoSwitch();
|
|
|
|
str getWeaponByPriority( int priority );
|
|
int getWeaponPriority();
|
|
|
|
void setNextSwitchTime( Event *ev );
|
|
void setNextSwitchTime( float time );
|
|
|
|
/* virtual */ void ArchivePersistantData( Archiver &arc );
|
|
};
|
|
|
|
inline bool Weapon::shouldArcProjectile()
|
|
{
|
|
return _arcProjectile;
|
|
}
|
|
|
|
inline float Weapon::GetLowArcRange()
|
|
{
|
|
return _lowArcRange;
|
|
}
|
|
|
|
inline bool Weapon::shouldPlayMissSound()
|
|
{
|
|
return _playMissSound;
|
|
}
|
|
inline float Weapon::GetBulletDamage(firemode_t idx)
|
|
{
|
|
return bulletdamage[idx];
|
|
}
|
|
|
|
inline void Weapon::SetPowerRating( float damage )
|
|
{
|
|
_powerRating = damage;
|
|
}
|
|
|
|
inline float Weapon::GetPowerRating()
|
|
{
|
|
if ( world && world->isThingBroken( item_name.c_str() ) )
|
|
return 0.0f;
|
|
|
|
return _powerRating;
|
|
}
|
|
|
|
inline void Weapon::SetProjectileSpeed( float speed )
|
|
{
|
|
_projectileSpeed = speed;
|
|
}
|
|
|
|
inline float Weapon::GetProjectileSpeed()
|
|
{
|
|
return _projectileSpeed;
|
|
}
|
|
|
|
inline void Weapon::SetProjectileDamage( float damage )
|
|
{
|
|
_projectileDamage = damage;
|
|
}
|
|
|
|
inline float Weapon::GetProjectileDamage()
|
|
{
|
|
return _projectileDamage;
|
|
}
|
|
|
|
inline float Weapon::GetBulletSpreadX( firemode_t idx )
|
|
{
|
|
return bulletspread[idx].x;
|
|
}
|
|
|
|
inline float Weapon::GetRange( firemode_t idx )
|
|
{
|
|
return bulletrange[idx];
|
|
}
|
|
|
|
inline void Weapon::Archive( Archiver &arc )
|
|
{
|
|
int i,j;
|
|
|
|
Item::Archive( arc );
|
|
|
|
arc.ArchiveBoolean( &attached );
|
|
|
|
arc.ArchiveFloat( &nextweaponsoundtime );
|
|
arc.ArchiveString( ¤t_attachToTag );
|
|
|
|
arc.ArchiveString( &left_attachToTag );
|
|
arc.ArchiveString( &right_attachToTag );
|
|
arc.ArchiveString( &dual_attachToTag );
|
|
arc.ArchiveString( &leftholster_attachToTag );
|
|
arc.ArchiveString( &rightholster_attachToTag );
|
|
arc.ArchiveString( &dualholster_attachToTag );
|
|
|
|
arc.ArchiveFloat( &lastScale );
|
|
arc.ArchiveVector( &lastAngles );
|
|
arc.ArchiveBoolean( &lastValid );
|
|
arc.ArchiveBoolean( &auto_putaway );
|
|
arc.ArchiveBoolean( &use_no_ammo );
|
|
arc.ArchiveBoolean( &crosshair );
|
|
arc.ArchiveBoolean( &torsoaim );
|
|
|
|
arc.ArchiveBoolean( &special_move );
|
|
arc.ArchiveSafePointer( &aim_target );
|
|
|
|
ArchiveEnum( curmode, firemode_t );
|
|
ArchiveEnum( maxmode, firemode_t );
|
|
|
|
arc.ArchiveBoolean( &switchmode );
|
|
arc.ArchiveBoolean( &targetidleflag );
|
|
|
|
arc.ArchiveInteger( &chx );
|
|
arc.ArchiveInteger( &chy );
|
|
|
|
arc.ArchiveVector( &realvieworg );
|
|
arc.ArchiveBoolean( &thirdperson );
|
|
|
|
arc.ArchiveBool( &useActorAiming );
|
|
|
|
arc.ArchiveFloat( &_powerRating );
|
|
arc.ArchiveFloat( &_projectileDamage );
|
|
arc.ArchiveFloat( &_projectileSpeed );
|
|
|
|
arc.ArchiveBool( &_arcProjectile );
|
|
arc.ArchiveFloat( &_lowArcRange );
|
|
arc.ArchiveBool( &_playMissSound );
|
|
|
|
int numEntries;
|
|
if ( arc.Saving() )
|
|
{
|
|
numEntries = meleeVictims.NumObjects();
|
|
arc.ArchiveInteger( &numEntries );
|
|
|
|
EntityPtr eptr;
|
|
for ( int i = 1 ; i <= numEntries ; i++ )
|
|
{
|
|
eptr = meleeVictims.ObjectAt( i );
|
|
arc.ArchiveSafePointer( &eptr );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
EntityPtr eptr;
|
|
EntityPtr *eptrptr;
|
|
arc.ArchiveInteger( &numEntries );
|
|
|
|
meleeVictims.Resize( numEntries );
|
|
|
|
for ( int i = 1 ; i <= numEntries ; i++ )
|
|
{
|
|
meleeVictims.AddObject( eptr );
|
|
eptrptr = &meleeVictims.ObjectAt( i );
|
|
arc.ArchiveSafePointer( eptrptr );
|
|
}
|
|
}
|
|
|
|
arc.ArchiveFloat( &maxrange );
|
|
arc.ArchiveFloat( &minrange );
|
|
arc.ArchiveString( &viewmodel );
|
|
|
|
if ( arc.Loading() )
|
|
gi.setviewmodel( edict, viewmodel.c_str() );
|
|
|
|
ArchiveEnum( weaponstate, weaponstate_t );
|
|
arc.ArchiveInteger( &rank );
|
|
arc.ArchiveInteger( &order );
|
|
|
|
arc.ArchiveSafePointer( &last_owner );
|
|
arc.ArchiveFloat( &last_owner_trigger_time );
|
|
arc.ArchiveBoolean( ¬droppable );
|
|
arc.ArchiveInteger( &aimanim );
|
|
arc.ArchiveInteger( &aimframe );
|
|
arc.ArchiveVector( &leftHolsterAngles );
|
|
arc.ArchiveVector( &rightHolsterAngles );
|
|
arc.ArchiveVector( &dualHolsterAngles );
|
|
arc.ArchiveFloat( &holsterScale );
|
|
arc.ArchiveFloat( &_weildedScale );
|
|
arc.ArchiveBoolean( &quiet );
|
|
arc.ArchiveFloat( &next_noise_time );
|
|
arc.ArchiveFloat( &next_noammo_time );
|
|
|
|
arc.ArchiveInteger( &burstcount );
|
|
arc.ArchiveInteger( &burstcountmax );
|
|
|
|
|
|
for ( i=0;i<MAX_FIREMODES;i++ )
|
|
{
|
|
arc.ArchiveString( &ammo_type[i] );
|
|
arc.ArchiveInteger( &ammorequired[i] );
|
|
arc.ArchiveInteger( &startammo[i] );
|
|
arc.ArchiveInteger( &_ammoBoost[ i ] );
|
|
arc.ArchiveString( &projectileModel[i] );
|
|
arc.ArchiveFloat( &bulletdamage[i] );
|
|
arc.ArchiveFloat( &bulletcount[i] );
|
|
arc.ArchiveFloat( &bulletrange[i] );
|
|
arc.ArchiveFloat( &bulletknockback[i] );
|
|
arc.ArchiveFloat( &projectilespeed[i] );
|
|
arc.ArchiveVector( &bulletspread[i] );
|
|
arc.ArchiveVector( &endbulletspread[i] );
|
|
ArchiveEnum( firetype[i], firetype_t );
|
|
arc.ArchiveInteger( &ammo_clip_size[i] );
|
|
arc.ArchiveInteger( &ammo_in_clip[i] );
|
|
arc.ArchiveFloat( &max_charge_time[i] );
|
|
ArchiveEnum( meansofdeath[i], meansOfDeath_t );
|
|
arc.ArchiveBoolean( &loopfire[ i ] );
|
|
|
|
arc.ArchiveInteger( &action_level_increment[i] );
|
|
|
|
arc.ArchiveString( &worldhitspawn[i] );
|
|
|
|
arc.ArchiveFloat( &next_fire_time[i] );
|
|
arc.ArchiveFloat( &fire_timer[i] );
|
|
|
|
for ( j=0;j<MAX_ACCURACYTYPES;j++ )
|
|
{
|
|
arc.ArchiveFloat( &accuracy[i][j] );
|
|
arc.ArchiveFloat( &accuracy[i][j] );
|
|
arc.ArchiveFloat( &accuracy[i][j] );
|
|
arc.ArchiveFloat( &accuracy[i][j] );
|
|
arc.ArchiveFloat( &accuracy[i][j] );
|
|
}
|
|
|
|
arc.ArchiveBoolean( &burstmode[ i ] );
|
|
arc.ArchiveFloat( &_burstModeDelay[ i ] );
|
|
arc.ArchiveFloat( &shootingMoveSpeedModifier[i] );
|
|
arc.ArchiveFloat( &_viewShakeMagnitude[i] );
|
|
arc.ArchiveFloat( &_viewShakeDuration[i] );
|
|
arc.ArchiveVector( &_viewMinShake[i] );
|
|
arc.ArchiveVector( &_viewMaxShake[i] );
|
|
arc.ArchiveBool( &_viewShakeOverride[i] );
|
|
arc.ArchiveBool( &_noAmmoMode[i] );
|
|
arc.ArchiveBool( &_noDelay[i] );
|
|
arc.ArchiveInteger( &_chargedModels[i] );
|
|
|
|
arc.ArchiveInteger( &_spreadAnims[i] );
|
|
arc.ArchiveFloat( &_spreadTime[i] );
|
|
arc.ArchiveFloat( &_meleeWidth[i] );
|
|
arc.ArchiveFloat( &_meleeHeight[i] );
|
|
arc.ArchiveFloat( &_meleeLength[i] );
|
|
|
|
arc.ArchiveVector( &_fireOffset[ i ] );
|
|
|
|
arc.ArchiveInteger( &_regenAmount[ i ] );
|
|
arc.ArchiveFloat( &_regenTime[ i ] );
|
|
arc.ArchiveBool( &_regenOnlyWhenIdle[ i ] );
|
|
arc.ArchiveFloat( &_nextRegenTime[ i ] );
|
|
}
|
|
|
|
arc.ArchiveFloat( &_maxViewShakeChange );
|
|
|
|
arc.ArchiveFloat( &startfiretime );
|
|
arc.ArchiveInteger( &autoAimTargetSelectionAngle );
|
|
arc.ArchiveInteger( &autoAimLockonAngle );
|
|
arc.ArchiveFloat( &charge_fraction );
|
|
arc.ArchiveBoolean( &putaway );
|
|
ArchiveEnum( firemodeindex, firemode_t );
|
|
ArchiveEnum( hand, weaponhand_t );
|
|
|
|
arc.ArchiveFloat( &reticuletime );
|
|
arc.ArchiveFloat( &zoomfov );
|
|
arc.ArchiveFloat( &_lastZoomFov );
|
|
|
|
arc.ArchiveFloat( &startzoom );
|
|
arc.ArchiveFloat( &endzoom );
|
|
arc.ArchiveFloat( &zoomtime );
|
|
arc.ArchiveFloat( &startzoomtime );
|
|
|
|
arc.ArchiveInteger( &aimtype );
|
|
arc.ArchiveBoolean( &usesameclip );
|
|
arc.ArchiveFloat( &chargetime );
|
|
arc.ArchiveBoolean( &targetidle );
|
|
|
|
arc.ArchiveBoolean( &donefiring );
|
|
|
|
arc.ArchiveBoolean( &zoomed );
|
|
|
|
arc.ArchiveInteger( &targetingSkin );
|
|
arc.ArchiveInteger( &shootingSkin );
|
|
arc.ArchiveInteger( &_fullAmmoSkin );
|
|
ArchiveEnum( _fullAmmoMode, firemode_t );
|
|
|
|
arc.ArchiveFloat( &defaultMoveSpeedModifier );
|
|
|
|
arc.ArchiveVector( &viewShake );
|
|
|
|
arc.ArchiveBool( &_controllingProjectile );
|
|
arc.ArchiveBool( &_controllingProjectileHidden );
|
|
arc.ArchiveString( &_controlEmitterName );
|
|
arc.ArchiveString( &_controlSoundName );
|
|
arc.ArchiveBool( &_canInterruptFiringState );
|
|
|
|
ArchiveEnum( _zoomStage, ZoomStage );
|
|
|
|
arc.ArchiveBool( &_autoReload );
|
|
|
|
arc.ArchiveBool( &_allowAutoSwitch );
|
|
|
|
arc.ArchiveFloat( &_nextSwitchTime );
|
|
}
|
|
|
|
inline void Weapon::ArchivePersistantData( Archiver &arc )
|
|
{
|
|
int i;
|
|
|
|
for ( i = 0 ; i < MAX_FIREMODES ; i++ )
|
|
{
|
|
arc.ArchiveInteger( &ammo_in_clip[i] );
|
|
}
|
|
}
|
|
|
|
typedef SafePtr<Weapon> WeaponPtr;
|
|
|
|
#endif /* weapon.h */
|