493 lines
14 KiB
C
493 lines
14 KiB
C
|
// RAVEN BEGIN
|
||
|
// bdube: note that this file is no longer merged with Doom3 updates
|
||
|
//
|
||
|
// MERGE_DATE 9/30/2004
|
||
|
|
||
|
#ifndef __GAME_WEAPON_H__
|
||
|
#define __GAME_WEAPON_H__
|
||
|
|
||
|
/*
|
||
|
===============================================================================
|
||
|
|
||
|
Player Weapon
|
||
|
|
||
|
===============================================================================
|
||
|
*/
|
||
|
|
||
|
typedef enum {
|
||
|
WP_READY,
|
||
|
WP_OUTOFAMMO,
|
||
|
WP_RELOAD,
|
||
|
WP_HOLSTERED,
|
||
|
WP_RISING,
|
||
|
WP_LOWERING,
|
||
|
WP_FLASHLIGHT,
|
||
|
} weaponStatus_t;
|
||
|
|
||
|
static const int MAX_WEAPONMODS = 4;
|
||
|
static const int MAX_AMMOTYPES = 16;
|
||
|
|
||
|
class idPlayer;
|
||
|
class idItem;
|
||
|
class idAnimatedEntity;
|
||
|
class idProjectile;
|
||
|
class rvWeapon;
|
||
|
|
||
|
class rvViewWeapon : public idAnimatedEntity {
|
||
|
public:
|
||
|
|
||
|
CLASS_PROTOTYPE( rvViewWeapon );
|
||
|
|
||
|
rvViewWeapon( void );
|
||
|
virtual ~rvViewWeapon( void );
|
||
|
|
||
|
// Init
|
||
|
void Spawn ( void );
|
||
|
|
||
|
// save games
|
||
|
void Save ( idSaveGame *savefile ) const; // archives object for save game file
|
||
|
void Restore ( idRestoreGame *savefile ); // unarchives object from save game file
|
||
|
|
||
|
|
||
|
// Weapon definition management
|
||
|
void Clear ( void );
|
||
|
|
||
|
// GUIs
|
||
|
void PostGUIEvent ( const char* event );
|
||
|
|
||
|
virtual void SetModel ( const char *modelname, int mods = 0 );
|
||
|
void SetPowerUpSkin ( const char *name );
|
||
|
void UpdateSkin ( void );
|
||
|
|
||
|
// State control/player interface
|
||
|
void Think ( void );
|
||
|
|
||
|
// Visual presentation
|
||
|
void PresentWeapon ( bool showViewModel );
|
||
|
|
||
|
// Networking
|
||
|
virtual void WriteToSnapshot ( idBitMsgDelta &msg ) const;
|
||
|
virtual void ReadFromSnapshot ( const idBitMsgDelta &msg );
|
||
|
virtual bool ClientReceiveEvent ( int event, int time, const idBitMsg &msg );
|
||
|
virtual void ClientPredictionThink ( void );
|
||
|
virtual bool ClientStale ( void );
|
||
|
|
||
|
virtual void ConvertLocalToWorldTransform( idVec3 &offset, idMat3 &axis );
|
||
|
virtual void UpdateModelTransform ( void );
|
||
|
|
||
|
// Debugging
|
||
|
virtual void GetDebugInfo ( debugInfoProc_t proc, void* userData );
|
||
|
|
||
|
|
||
|
void SetSkin ( const char *skinname );
|
||
|
void SetSkin ( const idDeclSkin* skin );
|
||
|
|
||
|
void SetOverlayShader ( const idMaterial* material );
|
||
|
|
||
|
virtual void GetPosition ( idVec3& origin, idMat3& axis ) const;
|
||
|
|
||
|
private:
|
||
|
|
||
|
idStrList pendingGUIEvents;
|
||
|
|
||
|
// effects
|
||
|
const idDeclSkin * saveSkin;
|
||
|
const idDeclSkin * invisSkin;
|
||
|
const idDeclSkin * saveWorldSkin;
|
||
|
const idDeclSkin * worldInvisSkin;
|
||
|
const idDeclSkin * saveHandsSkin;
|
||
|
const idDeclSkin * handsSkin;
|
||
|
|
||
|
void Event_CallFunction ( const char* function );
|
||
|
|
||
|
friend class rvWeapon;
|
||
|
rvWeapon* weapon;
|
||
|
};
|
||
|
|
||
|
class rvWeapon : public idClass {
|
||
|
public:
|
||
|
|
||
|
CLASS_PROTOTYPE( rvWeapon );
|
||
|
|
||
|
rvWeapon( void );
|
||
|
virtual ~rvWeapon( void );
|
||
|
|
||
|
enum {
|
||
|
WPLIGHT_MUZZLEFLASH,
|
||
|
WPLIGHT_MUZZLEFLASH_WORLD,
|
||
|
WPLIGHT_FLASHLIGHT,
|
||
|
WPLIGHT_FLASHLIGHT_WORLD,
|
||
|
WPLIGHT_GUI,
|
||
|
WPLIGHT_MAX
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
EVENT_RELOAD = idEntity::EVENT_MAXEVENTS,
|
||
|
EVENT_ENDRELOAD,
|
||
|
EVENT_CHANGESKIN,
|
||
|
EVENT_MAXEVENTS
|
||
|
};
|
||
|
|
||
|
void Init ( idPlayer* _owner, const idDeclEntityDef* def, int weaponIndex, bool isStrogg = false );
|
||
|
|
||
|
// Virtual overrides
|
||
|
void Spawn ( void );
|
||
|
virtual void Think ( void );
|
||
|
virtual void CleanupWeapon ( void ) {}
|
||
|
virtual void WriteToSnapshot ( idBitMsgDelta &msg ) const;
|
||
|
virtual void ReadFromSnapshot ( const idBitMsgDelta &msg );
|
||
|
virtual bool ClientReceiveEvent ( int event, int time, const idBitMsg &msg );
|
||
|
virtual void ClientStale ( void );
|
||
|
virtual void ClientUnstale ( void ) { }
|
||
|
virtual void Attack ( bool altFire, int num_attacks, float spread, float fuseOffset, float power );
|
||
|
virtual void GetDebugInfo ( debugInfoProc_t proc, void* userData );
|
||
|
virtual void SpectatorCycle ( void ) { }
|
||
|
virtual bool NoFireWhileSwitching ( void ) const { return false; }
|
||
|
|
||
|
void Save ( idSaveGame *savefile ) const;
|
||
|
void Restore ( idRestoreGame *savefile );
|
||
|
virtual void PreSave ( void );
|
||
|
virtual void PostSave ( void );
|
||
|
|
||
|
|
||
|
// Visual presentation
|
||
|
bool BloodSplat ( float size );
|
||
|
void MuzzleFlash ( void );
|
||
|
void MuzzleRise ( idVec3 &origin, idMat3 &axis );
|
||
|
float GetMuzzleFlashLightParm ( int parm );
|
||
|
void SetMuzzleFlashLightParm ( int parm, float value );
|
||
|
void GetAngleOffsets ( int *average, float *scale, float *max );
|
||
|
void GetTimeOffsets ( float *time, float *scale );
|
||
|
bool GetGlobalJointTransform ( bool viewModel, const jointHandle_t jointHandle, idVec3 &origin, idMat3 &axis, const idVec3& offset = vec3_origin );
|
||
|
|
||
|
// State control/player interface
|
||
|
void LowerWeapon ( void );
|
||
|
void RaiseWeapon ( void );
|
||
|
void Raise ( void );
|
||
|
void PutAway ( void );
|
||
|
void Hide ( void );
|
||
|
void Show ( void );
|
||
|
void HideWorldModel ( void );
|
||
|
void ShowWorldModel ( void );
|
||
|
void SetFlashlight ( bool on = true );
|
||
|
void Flashlight ( void );
|
||
|
void SetPushVelocity ( const idVec3 &pushVelocity );
|
||
|
void Reload ( void );
|
||
|
void OwnerDied ( void );
|
||
|
void BeginAttack ( void );
|
||
|
void EndAttack ( void );
|
||
|
bool IsReady ( void ) const;
|
||
|
bool IsReloading ( void ) const;
|
||
|
bool IsHolstered ( void ) const;
|
||
|
bool ShowCrosshair ( void ) const;
|
||
|
bool CanDrop ( void ) const;
|
||
|
bool CanZoom ( void ) const;
|
||
|
void CancelReload ( void );
|
||
|
void SetStatus ( weaponStatus_t status );
|
||
|
bool AutoReload ( void );
|
||
|
bool IsHidden ( void ) const;
|
||
|
void EjectBrass ( void );
|
||
|
|
||
|
// Network helpers
|
||
|
void NetReload ( void );
|
||
|
void NetEndReload ( void );
|
||
|
void NetCatchup ( void );
|
||
|
|
||
|
// Ammo
|
||
|
static int GetAmmoIndexForName ( const char *ammoname );
|
||
|
static const char* GetAmmoNameForIndex ( int index );
|
||
|
int GetAmmoType ( void ) const;
|
||
|
int AmmoAvailable ( void ) const;
|
||
|
int AmmoInClip ( void ) const;
|
||
|
void ResetAmmoClip ( void );
|
||
|
int ClipSize ( void ) const;
|
||
|
int LowAmmo ( void ) const;
|
||
|
int AmmoRequired ( void ) const;
|
||
|
void AddToClip ( int amount );
|
||
|
void UseAmmo ( int amount );
|
||
|
void SetClip ( int amount );
|
||
|
int TotalAmmoCount ( void ) const;
|
||
|
|
||
|
// Attack
|
||
|
bool PerformAttack ( idVec3& muzzleOrigin, idMat3& muzzleAxis, float dmgPower );
|
||
|
void LaunchProjectiles ( idDict& dict, const idVec3& muzzleOrigin, const idMat3& muzzleAxis, int num_projectiles, float spread, float fuseOffset, float power );
|
||
|
void Hitscan ( const idDict& dict, const idVec3& muzzleOrigin, const idMat3& muzzleAxis, int num_hitscans, float spread, float power );
|
||
|
void AlertMonsters ( void );
|
||
|
|
||
|
// Mods
|
||
|
int GetMods ( void ) const;
|
||
|
|
||
|
// Zoom
|
||
|
idUserInterface* GetZoomGui ( void ) const;
|
||
|
float GetZoomTime ( void ) const;
|
||
|
int GetZoomFov ( void ) const;
|
||
|
|
||
|
rvViewWeapon* GetViewModel ( void ) const;
|
||
|
idAnimatedEntity* GetWorldModel ( void ) const;
|
||
|
idPlayer* GetOwner ( void ) const;
|
||
|
const char * GetIcon ( void ) const;
|
||
|
renderLight_t& GetLight ( int light );
|
||
|
const idAngles& GetViewModelAngles ( void ) const;
|
||
|
const idVec3& GetViewModelOffset ( void ) const;
|
||
|
|
||
|
static void CacheWeapon ( const char *weaponName );
|
||
|
static void SkipFromSnapshot ( const idBitMsgDelta &msg );
|
||
|
|
||
|
void EnterCinematic ( void );
|
||
|
void ExitCinematic ( void );
|
||
|
|
||
|
protected:
|
||
|
|
||
|
virtual void OnLaunchProjectile ( idProjectile* proj );
|
||
|
|
||
|
void SetState ( const char *statename, int blendFrames );
|
||
|
void PostState ( const char *statename, int blendFrames );
|
||
|
void ExecuteState ( const char *statename );
|
||
|
|
||
|
void PlayAnim ( int channel, const char *animname, int blendFrames );
|
||
|
void PlayCycle ( int channel, const char *animname, int blendFrames );
|
||
|
bool AnimDone ( int channel, int blendFrames );
|
||
|
bool StartSound ( const char *soundName, const s_channelType channel, int soundShaderFlags, bool broadcast, int *length );
|
||
|
void StopSound ( const s_channelType channel, bool broadcast );
|
||
|
rvClientEffect* PlayEffect ( const char* effectName, jointHandle_t joint, bool loop = false, const idVec3& endOrigin = vec3_origin, bool broadcast = false );
|
||
|
|
||
|
void FindViewModelPositionStyle ( idVec3& viewOffset, idAngles& viewAngles ) const;
|
||
|
|
||
|
public:
|
||
|
|
||
|
void InitLights ( void );
|
||
|
void InitWorldModel ( void );
|
||
|
void InitViewModel ( void );
|
||
|
void InitDefs ( void );
|
||
|
|
||
|
void FreeLight ( int lightID );
|
||
|
void UpdateLight ( int lightID );
|
||
|
|
||
|
void UpdateMuzzleFlash ( void );
|
||
|
void UpdateFlashlight ( void );
|
||
|
|
||
|
void UpdateGUI ( void );
|
||
|
void UpdateCrosshairGUI ( idUserInterface* gui ) const;
|
||
|
|
||
|
idMat3 ForeshortenAxis ( const idMat3& axis ) const;
|
||
|
|
||
|
// Script state management
|
||
|
struct weaponStateFlags_s {
|
||
|
bool attack :1;
|
||
|
bool reload :1;
|
||
|
bool netReload :1;
|
||
|
bool netEndReload :1;
|
||
|
bool raiseWeapon :1;
|
||
|
bool lowerWeapon :1;
|
||
|
bool flashlight :1;
|
||
|
bool zoom :1;
|
||
|
} wsfl;
|
||
|
|
||
|
// Generic flags
|
||
|
struct weaponFlags_s {
|
||
|
bool attackAltHitscan :1;
|
||
|
bool attackHitscan :1;
|
||
|
bool hide :1;
|
||
|
bool disabled :1;
|
||
|
bool hasBloodSplat :1;
|
||
|
bool silent_fire :1;
|
||
|
bool zoomHideCrosshair :1;
|
||
|
bool flashlightOn :1;
|
||
|
bool hasWindupAnim :1;
|
||
|
} wfl;
|
||
|
|
||
|
// joints from models
|
||
|
jointHandle_t barrelJointView;
|
||
|
jointHandle_t flashJointView;
|
||
|
jointHandle_t ejectJointView;
|
||
|
jointHandle_t guiLightJointView;
|
||
|
jointHandle_t flashlightJointView;
|
||
|
|
||
|
jointHandle_t flashJointWorld;
|
||
|
jointHandle_t ejectJointWorld;
|
||
|
jointHandle_t flashlightJointWorld;
|
||
|
|
||
|
weaponStatus_t status;
|
||
|
int lastAttack;
|
||
|
|
||
|
// hiding weapon
|
||
|
int hideTime;
|
||
|
float hideDistance;
|
||
|
int hideStartTime;
|
||
|
float hideStart;
|
||
|
float hideEnd;
|
||
|
float hideOffset;
|
||
|
|
||
|
// Attack
|
||
|
idVec3 pushVelocity;
|
||
|
int kick_endtime;
|
||
|
int muzzle_kick_time;
|
||
|
int muzzle_kick_maxtime;
|
||
|
idAngles muzzle_kick_angles;
|
||
|
idVec3 muzzle_kick_offset;
|
||
|
idVec3 muzzleOrigin;
|
||
|
idMat3 muzzleAxis;
|
||
|
float muzzleOffset;
|
||
|
idEntityPtr<idEntity> projectileEnt;
|
||
|
idVec3 ejectOffset;
|
||
|
|
||
|
int fireRate;
|
||
|
int altFireRate;
|
||
|
float spread;
|
||
|
int nextAttackTime;
|
||
|
|
||
|
// we maintain local copies of the projectile and brass dictionaries so they
|
||
|
// do not have to be copied across the DLL boundary when entities are spawned
|
||
|
idDict attackAltDict;
|
||
|
idDict attackDict;
|
||
|
idDict brassDict;
|
||
|
|
||
|
// Melee
|
||
|
const idDeclEntityDef * meleeDef;
|
||
|
float meleeDistance;
|
||
|
|
||
|
// zoom
|
||
|
int zoomFov; // variable zoom fov per weapon (-1 is no zoom)
|
||
|
idUserInterface* zoomGui; // whether or not to overlay a zoom scope
|
||
|
float zoomTime; // time it takes to zoom in
|
||
|
|
||
|
// lights
|
||
|
renderLight_t lights[WPLIGHT_MAX];
|
||
|
int lightHandles[WPLIGHT_MAX];
|
||
|
idVec3 guiLightOffset;
|
||
|
int muzzleFlashEnd;
|
||
|
int muzzleFlashTime;
|
||
|
idVec3 muzzleFlashViewOffset;
|
||
|
bool flashlightOn;
|
||
|
idVec3 flashlightViewOffset;
|
||
|
|
||
|
// ammo management
|
||
|
int ammoType;
|
||
|
int ammoRequired; // amount of ammo to use each shot. 0 means weapon doesn't need ammo.
|
||
|
int clipSize; // 0 means no reload
|
||
|
int ammoClip;
|
||
|
int lowAmmo; // if ammo in clip hits this threshold, snd_
|
||
|
int maxAmmo;
|
||
|
|
||
|
// multiplayer
|
||
|
int clipPredictTime;
|
||
|
|
||
|
// these are the player render view parms, which include bobbing
|
||
|
idVec3 playerViewOrigin;
|
||
|
idMat3 playerViewAxis;
|
||
|
|
||
|
|
||
|
// View Model
|
||
|
idVec3 viewModelOrigin;
|
||
|
idMat3 viewModelAxis;
|
||
|
idAngles viewModelAngles;
|
||
|
idVec3 viewModelOffset;
|
||
|
|
||
|
// weighting for viewmodel offsets
|
||
|
int weaponAngleOffsetAverages;
|
||
|
float weaponAngleOffsetScale;
|
||
|
float weaponAngleOffsetMax;
|
||
|
float weaponOffsetTime;
|
||
|
float weaponOffsetScale;
|
||
|
|
||
|
// General
|
||
|
idStr icon;
|
||
|
bool isStrogg;
|
||
|
|
||
|
bool forceGUIReload;
|
||
|
|
||
|
public:
|
||
|
|
||
|
idDict spawnArgs;
|
||
|
|
||
|
protected:
|
||
|
|
||
|
idEntityPtr<rvViewWeapon> viewModel;
|
||
|
idAnimator* viewAnimator;
|
||
|
idEntityPtr<idAnimatedEntity> worldModel;
|
||
|
idAnimator* worldAnimator;
|
||
|
const idDeclEntityDef* weaponDef;
|
||
|
idScriptObject* scriptObject;
|
||
|
idPlayer * owner;
|
||
|
int weaponIndex;
|
||
|
int mods;
|
||
|
|
||
|
float viewModelForeshorten;
|
||
|
|
||
|
rvStateThread stateThread;
|
||
|
int animDoneTime[ANIM_NumAnimChannels];
|
||
|
|
||
|
private:
|
||
|
|
||
|
stateResult_t State_Raise ( const stateParms_t& parms );
|
||
|
stateResult_t State_Lower ( const stateParms_t& parms );
|
||
|
stateResult_t State_ExitCinematic ( const stateParms_t& parms );
|
||
|
stateResult_t State_NetCatchup ( const stateParms_t& parms );
|
||
|
|
||
|
stateResult_t Frame_EjectBrass ( const stateParms_t& parms );
|
||
|
|
||
|
// store weapon index information for death messages
|
||
|
int methodOfDeath;
|
||
|
|
||
|
// multiplayer hitscans
|
||
|
int hitscanAttackDef;
|
||
|
|
||
|
CLASS_STATES_PROTOTYPE ( rvWeapon );
|
||
|
};
|
||
|
|
||
|
ID_INLINE rvViewWeapon* rvWeapon::GetViewModel ( void ) const {
|
||
|
return viewModel.GetEntity();
|
||
|
}
|
||
|
|
||
|
ID_INLINE idAnimatedEntity* rvWeapon::GetWorldModel ( void ) const {
|
||
|
return worldModel;
|
||
|
}
|
||
|
|
||
|
ID_INLINE idPlayer* rvWeapon::GetOwner ( void ) const {
|
||
|
return owner;
|
||
|
}
|
||
|
|
||
|
ID_INLINE const char* rvWeapon::GetIcon ( void ) const {
|
||
|
return icon;
|
||
|
}
|
||
|
|
||
|
ID_INLINE renderLight_t& rvWeapon::GetLight ( int light ) {
|
||
|
assert ( light < WPLIGHT_MAX );
|
||
|
return lights[light];
|
||
|
}
|
||
|
|
||
|
ID_INLINE const idAngles& rvWeapon::GetViewModelAngles( void ) const {
|
||
|
return viewModelAngles;
|
||
|
}
|
||
|
|
||
|
ID_INLINE const idVec3& rvWeapon::GetViewModelOffset ( void ) const {
|
||
|
return viewModelOffset;
|
||
|
}
|
||
|
|
||
|
ID_INLINE int rvWeapon::GetZoomFov ( void ) const {
|
||
|
return zoomFov;
|
||
|
}
|
||
|
|
||
|
ID_INLINE idUserInterface* rvWeapon::GetZoomGui ( void ) const {
|
||
|
return zoomGui;
|
||
|
}
|
||
|
|
||
|
ID_INLINE float rvWeapon::GetZoomTime ( void ) const {
|
||
|
return zoomTime;
|
||
|
}
|
||
|
|
||
|
ID_INLINE int rvWeapon::GetMods ( void ) const {
|
||
|
return mods;
|
||
|
}
|
||
|
|
||
|
ID_INLINE void rvWeapon::PreSave ( void ) {
|
||
|
}
|
||
|
|
||
|
ID_INLINE void rvWeapon::PostSave ( void ) {
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif /* !__GAME_WEAPON_H__ */
|
||
|
|
||
|
// RAVEN END
|