1227 lines
30 KiB
C++
1227 lines
30 KiB
C++
/***
|
|
*
|
|
* Copyright (c) 1996-2001, Valve LLC. All rights reserved.
|
|
*
|
|
* This product contains software technology licensed from Id
|
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
|
* All Rights Reserved.
|
|
*
|
|
* Use, distribution, and modification of this source code and/or resulting
|
|
* object code is restricted to non-commercial enhancements to products from
|
|
* Valve LLC. All other use, distribution, or modification is prohibited
|
|
* without written permission from Valve LLC.
|
|
*
|
|
****/
|
|
|
|
#pragma once
|
|
|
|
#include "effects.h"
|
|
#include "weaponinfo.h"
|
|
|
|
class CBasePlayer;
|
|
class CBasePlayerWeapon;
|
|
|
|
void DeactivateSatchels(CBasePlayer* pOwner);
|
|
|
|
// Contact Grenade / Timed grenade / Satchel Charge
|
|
class CGrenade : public CBaseMonster
|
|
{
|
|
public:
|
|
void Spawn() override;
|
|
|
|
typedef enum
|
|
{
|
|
SATCHEL_DETONATE = 0,
|
|
SATCHEL_RELEASE
|
|
} SATCHELCODE;
|
|
|
|
static CGrenade* ShootTimed(entvars_t* pevOwner, Vector vecStart, Vector vecVelocity, float time);
|
|
static CGrenade* ShootContact(entvars_t* pevOwner, Vector vecStart, Vector vecVelocity);
|
|
static CGrenade* ShootSatchelCharge(entvars_t* pevOwner, Vector vecStart, Vector vecVelocity);
|
|
static void UseSatchelCharges(entvars_t* pevOwner, SATCHELCODE code);
|
|
|
|
void Explode(Vector vecSrc, Vector vecAim);
|
|
void Explode(TraceResult* pTrace, int bitsDamageType);
|
|
void EXPORT Smoke();
|
|
|
|
void EXPORT BounceTouch(CBaseEntity* pOther);
|
|
void EXPORT SlideTouch(CBaseEntity* pOther);
|
|
void EXPORT ExplodeTouch(CBaseEntity* pOther);
|
|
void EXPORT DangerSoundThink();
|
|
void EXPORT PreDetonate();
|
|
void EXPORT Detonate();
|
|
void EXPORT DetonateUse(CBaseEntity* pActivator, CBaseEntity* pCaller, USE_TYPE useType, float value);
|
|
void EXPORT TumbleThink();
|
|
|
|
virtual void BounceSound();
|
|
int BloodColor() override { return DONT_BLEED; }
|
|
void Killed(entvars_t* pevAttacker, int iGib) override;
|
|
|
|
bool m_fRegisteredSound; // whether or not this grenade has issued its DANGER sound to the world sound list yet.
|
|
};
|
|
|
|
|
|
// constant items
|
|
#define ITEM_HEALTHKIT 1
|
|
#define ITEM_ANTIDOTE 2
|
|
#define ITEM_SECURITY 3
|
|
#define ITEM_BATTERY 4
|
|
|
|
#define MAX_NORMAL_BATTERY 100
|
|
|
|
|
|
// weapon weight factors (for auto-switching) (-1 = noswitch)
|
|
#define CROWBAR_WEIGHT 0
|
|
#define GLOCK_WEIGHT 10
|
|
#define PYTHON_WEIGHT 15
|
|
#define MP5_WEIGHT 15
|
|
#define SHOTGUN_WEIGHT 15
|
|
#define CROSSBOW_WEIGHT 10
|
|
#define RPG_WEIGHT 20
|
|
#define GAUSS_WEIGHT 20
|
|
#define EGON_WEIGHT 20
|
|
#define HORNETGUN_WEIGHT 15
|
|
#define HANDGRENADE_WEIGHT 5
|
|
#define SNARK_WEIGHT 5
|
|
#define SATCHEL_WEIGHT -10
|
|
#define TRIPMINE_WEIGHT -10
|
|
|
|
|
|
// weapon clip/carry ammo capacities
|
|
#define URANIUM_MAX_CARRY 100
|
|
#define _9MM_MAX_CARRY 250
|
|
#define _357_MAX_CARRY 36
|
|
#define BUCKSHOT_MAX_CARRY 125
|
|
#define BOLT_MAX_CARRY 50
|
|
#define ROCKET_MAX_CARRY 5
|
|
#define HANDGRENADE_MAX_CARRY 10
|
|
#define SATCHEL_MAX_CARRY 5
|
|
#define TRIPMINE_MAX_CARRY 5
|
|
#define SNARK_MAX_CARRY 15
|
|
#define HORNET_MAX_CARRY 8
|
|
#define M203_GRENADE_MAX_CARRY 10
|
|
|
|
// the maximum amount of ammo each weapon's clip can hold
|
|
#define WEAPON_NOCLIP -1
|
|
|
|
//#define CROWBAR_MAX_CLIP WEAPON_NOCLIP
|
|
#define GLOCK_MAX_CLIP 17
|
|
#define PYTHON_MAX_CLIP 6
|
|
#define MP5_MAX_CLIP 50
|
|
#define MP5_DEFAULT_AMMO 25
|
|
#define SHOTGUN_MAX_CLIP 8
|
|
#define CROSSBOW_MAX_CLIP 5
|
|
#define RPG_MAX_CLIP 1
|
|
#define GAUSS_MAX_CLIP WEAPON_NOCLIP
|
|
#define EGON_MAX_CLIP WEAPON_NOCLIP
|
|
#define HORNETGUN_MAX_CLIP WEAPON_NOCLIP
|
|
#define HANDGRENADE_MAX_CLIP WEAPON_NOCLIP
|
|
#define SATCHEL_MAX_CLIP WEAPON_NOCLIP
|
|
#define TRIPMINE_MAX_CLIP WEAPON_NOCLIP
|
|
#define SNARK_MAX_CLIP WEAPON_NOCLIP
|
|
|
|
|
|
// the default amount of ammo that comes with each gun when it spawns
|
|
#define GLOCK_DEFAULT_GIVE 17
|
|
#define PYTHON_DEFAULT_GIVE 6
|
|
#define MP5_DEFAULT_GIVE 25
|
|
#define MP5_DEFAULT_AMMO 25
|
|
#define MP5_M203_DEFAULT_GIVE 0
|
|
#define SHOTGUN_DEFAULT_GIVE 12
|
|
#define CROSSBOW_DEFAULT_GIVE 5
|
|
#define RPG_DEFAULT_GIVE 1
|
|
#define GAUSS_DEFAULT_GIVE 20
|
|
#define EGON_DEFAULT_GIVE 20
|
|
#define HANDGRENADE_DEFAULT_GIVE 5
|
|
#define SATCHEL_DEFAULT_GIVE 1
|
|
#define TRIPMINE_DEFAULT_GIVE 1
|
|
#define SNARK_DEFAULT_GIVE 5
|
|
#define HIVEHAND_DEFAULT_GIVE 8
|
|
|
|
// The amount of ammo given to a player by an ammo item.
|
|
#define AMMO_URANIUMBOX_GIVE 20
|
|
#define AMMO_GLOCKCLIP_GIVE GLOCK_MAX_CLIP
|
|
#define AMMO_357BOX_GIVE PYTHON_MAX_CLIP
|
|
#define AMMO_MP5CLIP_GIVE MP5_MAX_CLIP
|
|
#define AMMO_CHAINBOX_GIVE 200
|
|
#define AMMO_M203BOX_GIVE 2
|
|
#define AMMO_BUCKSHOTBOX_GIVE 12
|
|
#define AMMO_CROSSBOWCLIP_GIVE CROSSBOW_MAX_CLIP
|
|
#define AMMO_RPGCLIP_GIVE RPG_MAX_CLIP
|
|
#define AMMO_URANIUMBOX_GIVE 20
|
|
#define AMMO_SNARKBOX_GIVE 5
|
|
|
|
// bullet types
|
|
typedef enum
|
|
{
|
|
BULLET_NONE = 0,
|
|
BULLET_PLAYER_9MM, // glock
|
|
BULLET_PLAYER_MP5, // mp5
|
|
BULLET_PLAYER_357, // python
|
|
BULLET_PLAYER_BUCKSHOT, // shotgun
|
|
BULLET_PLAYER_CROWBAR, // crowbar swipe
|
|
|
|
BULLET_MONSTER_9MM,
|
|
BULLET_MONSTER_MP5,
|
|
BULLET_MONSTER_12MM,
|
|
} Bullet;
|
|
|
|
|
|
#define ITEM_FLAG_SELECTONEMPTY 1
|
|
#define ITEM_FLAG_NOAUTORELOAD 2
|
|
#define ITEM_FLAG_NOAUTOSWITCHEMPTY 4
|
|
#define ITEM_FLAG_LIMITINWORLD 8
|
|
#define ITEM_FLAG_EXHAUSTIBLE 16 // A player can totally exhaust their ammo supply and lose this weapon
|
|
#define ITEM_FLAG_NOAUTOSWITCHTO 32
|
|
|
|
#define WEAPON_IS_ONTARGET 0x40
|
|
|
|
typedef struct
|
|
{
|
|
int iSlot;
|
|
int iPosition;
|
|
const char* pszAmmo1; // ammo 1 type
|
|
int iMaxAmmo1; // max ammo 1
|
|
const char* pszAmmo2; // ammo 2 type
|
|
int iMaxAmmo2; // max ammo 2
|
|
const char* pszName;
|
|
int iMaxClip;
|
|
int iId;
|
|
int iFlags;
|
|
int iWeight; // this value used to determine this weapon's importance in autoselection.
|
|
} ItemInfo;
|
|
|
|
struct AmmoInfo
|
|
{
|
|
const char* pszName;
|
|
int iId;
|
|
|
|
/**
|
|
* @brief For exhaustible weapons. If provided, and the player does not have this weapon in their inventory yet it will be given to them.
|
|
*/
|
|
const char* WeaponName = nullptr;
|
|
};
|
|
|
|
inline int giAmmoIndex = 0;
|
|
|
|
void AddAmmoNameToAmmoRegistry(const char* szAmmoname, const char* weaponName);
|
|
|
|
// Items that the player has in their inventory that they can use
|
|
class CBasePlayerItem : public CBaseAnimating
|
|
{
|
|
public:
|
|
void SetObjectCollisionBox() override;
|
|
|
|
bool Save(CSave& save) override;
|
|
bool Restore(CRestore& restore) override;
|
|
|
|
static TYPEDESCRIPTION m_SaveData[];
|
|
|
|
virtual bool CanAddToPlayer(CBasePlayer* player) { return true; } // return true if the item you want the item added to the player inventory
|
|
|
|
virtual void AddToPlayer(CBasePlayer* pPlayer);
|
|
virtual bool AddDuplicate(CBasePlayerItem* pItem) { return false; } // return true if you want your duplicate removed from world
|
|
void EXPORT DestroyItem();
|
|
void EXPORT DefaultTouch(CBaseEntity* pOther); // default weapon touch
|
|
void EXPORT FallThink(); // when an item is first spawned, this think is run to determine when the object has hit the ground.
|
|
void EXPORT Materialize(); // make a weapon visible and tangible
|
|
void EXPORT AttemptToMaterialize(); // the weapon desires to become visible and tangible, if the game rules allow for it
|
|
CBaseEntity* Respawn() override; // copy a weapon
|
|
void FallInit();
|
|
void CheckRespawn();
|
|
virtual bool GetItemInfo(ItemInfo* p) { return false; } // returns false if struct not filled out
|
|
virtual bool CanDeploy() { return true; }
|
|
virtual bool Deploy() // returns is deploy was successful
|
|
{
|
|
return true;
|
|
}
|
|
|
|
virtual bool CanHolster() { return true; } // can this weapon be put away right now?
|
|
virtual void Holster();
|
|
virtual void UpdateItemInfo() {}
|
|
|
|
virtual void ItemPreFrame() {} // called each frame by the player PreThink
|
|
virtual void ItemPostFrame() {} // called each frame by the player PostThink
|
|
|
|
virtual void Drop();
|
|
virtual void Kill();
|
|
virtual void AttachToPlayer(CBasePlayer* pPlayer);
|
|
|
|
virtual int PrimaryAmmoIndex() { return -1; }
|
|
virtual int SecondaryAmmoIndex() { return -1; }
|
|
|
|
virtual bool UpdateClientData(CBasePlayer* pPlayer) { return false; }
|
|
|
|
virtual CBasePlayerWeapon* GetWeaponPtr() { return NULL; }
|
|
|
|
virtual void GetWeaponData(weapon_data_t& data) {}
|
|
|
|
virtual void SetWeaponData(const weapon_data_t& data) {}
|
|
|
|
virtual void DecrementTimers() {}
|
|
|
|
static inline ItemInfo ItemInfoArray[MAX_WEAPONS];
|
|
static inline AmmoInfo AmmoInfoArray[MAX_AMMO_SLOTS];
|
|
|
|
CBasePlayer* m_pPlayer;
|
|
CBasePlayerItem* m_pNext;
|
|
int m_iId; // WEAPON_???
|
|
|
|
virtual int iItemSlot() { return 0; } // return 0 to MAX_ITEMS_SLOTS, used in hud
|
|
|
|
int iItemPosition() { return ItemInfoArray[m_iId].iPosition; }
|
|
const char* pszAmmo1() { return ItemInfoArray[m_iId].pszAmmo1; }
|
|
int iMaxAmmo1() { return ItemInfoArray[m_iId].iMaxAmmo1; }
|
|
const char* pszAmmo2() { return ItemInfoArray[m_iId].pszAmmo2; }
|
|
int iMaxAmmo2() { return ItemInfoArray[m_iId].iMaxAmmo2; }
|
|
const char* pszName() { return ItemInfoArray[m_iId].pszName; }
|
|
int iMaxClip() { return ItemInfoArray[m_iId].iMaxClip; }
|
|
int iWeight() { return ItemInfoArray[m_iId].iWeight; }
|
|
int iFlags() { return ItemInfoArray[m_iId].iFlags; }
|
|
|
|
// int m_iIdPrimary; // Unique Id for primary ammo
|
|
// int m_iIdSecondary; // Unique Id for secondary ammo
|
|
|
|
//Hack so deploy animations work when weapon prediction is enabled.
|
|
bool m_ForceSendAnimations = false;
|
|
};
|
|
|
|
|
|
// inventory items that
|
|
class CBasePlayerWeapon : public CBasePlayerItem
|
|
{
|
|
public:
|
|
bool Save(CSave& save) override;
|
|
bool Restore(CRestore& restore) override;
|
|
|
|
static TYPEDESCRIPTION m_SaveData[];
|
|
|
|
// generic weapon versions of CBasePlayerItem calls
|
|
void AddToPlayer(CBasePlayer* pPlayer) override;
|
|
bool AddDuplicate(CBasePlayerItem* pItem) override;
|
|
|
|
virtual bool ExtractAmmo(CBasePlayerWeapon* pWeapon); //{ return true; } // Return true if you can add ammo to yourself when picked up
|
|
virtual bool ExtractClipAmmo(CBasePlayerWeapon* pWeapon); // { return true; } // Return true if you can add ammo to yourself when picked up
|
|
|
|
// generic "shared" ammo handlers
|
|
bool AddPrimaryAmmo(CBasePlayerWeapon* origin, int iCount, char* szName, int iMaxClip, int iMaxCarry);
|
|
bool AddSecondaryAmmo(int iCount, char* szName, int iMaxCarry);
|
|
|
|
void UpdateItemInfo() override {} // updates HUD state
|
|
|
|
bool m_iPlayEmptySound;
|
|
bool m_fFireOnEmpty; // True when the gun is empty and the player is still holding down the
|
|
// attack key(s)
|
|
virtual bool PlayEmptySound();
|
|
virtual void ResetEmptySound();
|
|
|
|
virtual void SendWeaponAnim(int iAnim, int body = 0);
|
|
|
|
bool CanDeploy() override;
|
|
virtual bool IsUseable();
|
|
bool DefaultDeploy(const char* szViewModel, const char* szWeaponModel, int iAnim, const char* szAnimExt, int body = 0);
|
|
bool DefaultReload(int iClipSize, int iAnim, float fDelay, int body = 0);
|
|
|
|
void ItemPostFrame() override; // called each frame by the player PostThink
|
|
// called by CBasePlayerWeapons ItemPostFrame()
|
|
virtual void PrimaryAttack() {} // do "+ATTACK"
|
|
virtual void SecondaryAttack() {} // do "+ATTACK2"
|
|
virtual void Reload() {} // do "+RELOAD"
|
|
virtual void WeaponIdle() {} // called when no buttons pressed
|
|
bool UpdateClientData(CBasePlayer* pPlayer) override; // sends hud info to client dll, if things have changed
|
|
void RetireWeapon();
|
|
|
|
// Can't use virtual functions as think functions so this wrapper is needed.
|
|
void EXPORT CallDoRetireWeapon()
|
|
{
|
|
DoRetireWeapon();
|
|
}
|
|
|
|
virtual void DoRetireWeapon();
|
|
virtual bool ShouldWeaponIdle() { return false; }
|
|
void Holster() override;
|
|
virtual bool UseDecrement() { return false; }
|
|
|
|
int PrimaryAmmoIndex() override;
|
|
int SecondaryAmmoIndex() override;
|
|
|
|
void PrintState();
|
|
|
|
CBasePlayerWeapon* GetWeaponPtr() override { return this; }
|
|
float GetNextAttackDelay(float delay);
|
|
|
|
float m_flPumpTime;
|
|
int m_fInSpecialReload; // Are we in the middle of a reload for the shotguns
|
|
float m_flNextPrimaryAttack; // soonest time ItemPostFrame will call PrimaryAttack
|
|
float m_flNextSecondaryAttack; // soonest time ItemPostFrame will call SecondaryAttack
|
|
float m_flTimeWeaponIdle; // soonest time ItemPostFrame will call WeaponIdle
|
|
int m_iPrimaryAmmoType; // "primary" ammo index into players m_rgAmmo[]
|
|
int m_iSecondaryAmmoType; // "secondary" ammo index into players m_rgAmmo[]
|
|
int m_iClip; // number of shots left in the primary weapon clip, -1 it not used
|
|
int m_iClientClip; // the last version of m_iClip sent to hud dll
|
|
int m_iClientWeaponState; // the last version of the weapon state sent to hud dll (is current weapon, is on target)
|
|
bool m_fInReload; // Are we in the middle of a reload;
|
|
|
|
int m_iDefaultAmmo; // how much ammo you get when you pick up this weapon as placed by a level designer.
|
|
|
|
// hle time creep vars
|
|
float m_flPrevPrimaryAttack;
|
|
float m_flLastFireTime;
|
|
};
|
|
|
|
|
|
class CBasePlayerAmmo : public CBaseEntity
|
|
{
|
|
public:
|
|
void Spawn() override;
|
|
void EXPORT DefaultTouch(CBaseEntity* pOther); // default weapon touch
|
|
virtual bool AddAmmo(CBaseEntity* pOther) { return true; }
|
|
|
|
CBaseEntity* Respawn() override;
|
|
void EXPORT Materialize();
|
|
};
|
|
|
|
|
|
inline DLL_GLOBAL short g_sModelIndexLaser; // holds the index for the laser beam
|
|
constexpr DLL_GLOBAL const char* g_pModelNameLaser = "sprites/laserbeam.spr";
|
|
|
|
inline DLL_GLOBAL short g_sModelIndexLaserDot; // holds the index for the laser beam dot
|
|
inline DLL_GLOBAL short g_sModelIndexFireball; // holds the index for the fireball
|
|
inline DLL_GLOBAL short g_sModelIndexSmoke; // holds the index for the smoke cloud
|
|
inline DLL_GLOBAL short g_sModelIndexWExplosion; // holds the index for the underwater explosion
|
|
inline DLL_GLOBAL short g_sModelIndexBubbles; // holds the index for the bubbles model
|
|
inline DLL_GLOBAL short g_sModelIndexBloodDrop; // holds the sprite index for blood drops
|
|
inline DLL_GLOBAL short g_sModelIndexBloodSpray; // holds the sprite index for blood spray (bigger)
|
|
|
|
extern void ClearMultiDamage();
|
|
extern void ApplyMultiDamage(entvars_t* pevInflictor, entvars_t* pevAttacker);
|
|
extern void AddMultiDamage(entvars_t* pevInflictor, CBaseEntity* pEntity, float flDamage, int bitsDamageType);
|
|
|
|
extern void DecalGunshot(TraceResult* pTrace, int iBulletType);
|
|
extern void SpawnBlood(Vector vecSpot, int bloodColor, float flDamage);
|
|
extern int DamageDecal(CBaseEntity* pEntity, int bitsDamageType);
|
|
extern void RadiusDamage(Vector vecSrc, entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType);
|
|
|
|
typedef struct
|
|
{
|
|
CBaseEntity* pEntity;
|
|
float amount;
|
|
int type;
|
|
} MULTIDAMAGE;
|
|
|
|
inline MULTIDAMAGE gMultiDamage;
|
|
|
|
|
|
#define LOUD_GUN_VOLUME 1000
|
|
#define NORMAL_GUN_VOLUME 600
|
|
#define QUIET_GUN_VOLUME 200
|
|
|
|
#define BRIGHT_GUN_FLASH 512
|
|
#define NORMAL_GUN_FLASH 256
|
|
#define DIM_GUN_FLASH 128
|
|
|
|
#define BIG_EXPLOSION_VOLUME 2048
|
|
#define NORMAL_EXPLOSION_VOLUME 1024
|
|
#define SMALL_EXPLOSION_VOLUME 512
|
|
|
|
#define WEAPON_ACTIVITY_VOLUME 64
|
|
|
|
#define VECTOR_CONE_1DEGREES Vector(0.00873, 0.00873, 0.00873)
|
|
#define VECTOR_CONE_2DEGREES Vector(0.01745, 0.01745, 0.01745)
|
|
#define VECTOR_CONE_3DEGREES Vector(0.02618, 0.02618, 0.02618)
|
|
#define VECTOR_CONE_4DEGREES Vector(0.03490, 0.03490, 0.03490)
|
|
#define VECTOR_CONE_5DEGREES Vector(0.04362, 0.04362, 0.04362)
|
|
#define VECTOR_CONE_6DEGREES Vector(0.05234, 0.05234, 0.05234)
|
|
#define VECTOR_CONE_7DEGREES Vector(0.06105, 0.06105, 0.06105)
|
|
#define VECTOR_CONE_8DEGREES Vector(0.06976, 0.06976, 0.06976)
|
|
#define VECTOR_CONE_9DEGREES Vector(0.07846, 0.07846, 0.07846)
|
|
#define VECTOR_CONE_10DEGREES Vector(0.08716, 0.08716, 0.08716)
|
|
#define VECTOR_CONE_15DEGREES Vector(0.13053, 0.13053, 0.13053)
|
|
#define VECTOR_CONE_20DEGREES Vector(0.17365, 0.17365, 0.17365)
|
|
|
|
//=========================================================
|
|
// CWeaponBox - a single entity that can store weapons
|
|
// and ammo.
|
|
//=========================================================
|
|
class CWeaponBox : public CBaseEntity
|
|
{
|
|
void Precache() override;
|
|
void Spawn() override;
|
|
void Touch(CBaseEntity* pOther) override;
|
|
bool KeyValue(KeyValueData* pkvd) override;
|
|
bool IsEmpty();
|
|
int GiveAmmo(int iCount, const char* szName, int iMax, int* pIndex = NULL);
|
|
void SetObjectCollisionBox() override;
|
|
|
|
public:
|
|
void EXPORT Kill();
|
|
bool Save(CSave& save) override;
|
|
bool Restore(CRestore& restore) override;
|
|
static TYPEDESCRIPTION m_SaveData[];
|
|
|
|
bool HasWeapon(CBasePlayerItem* pCheckItem);
|
|
bool PackWeapon(CBasePlayerItem* pWeapon);
|
|
bool PackAmmo(int iszName, int iCount);
|
|
|
|
CBasePlayerItem* m_rgpPlayerItems[MAX_ITEM_TYPES]; // one slot for each
|
|
|
|
int m_rgiszAmmo[MAX_AMMO_SLOTS]; // ammo names
|
|
int m_rgAmmo[MAX_AMMO_SLOTS]; // ammo quantities
|
|
|
|
int m_cAmmoTypes; // how many ammo types packed into this box (if packed by a level designer)
|
|
};
|
|
|
|
#ifdef CLIENT_DLL
|
|
bool bIsMultiplayer();
|
|
void LoadVModel(const char* szViewModel, CBasePlayer* m_pPlayer);
|
|
#endif
|
|
|
|
enum glock_e
|
|
{
|
|
GLOCK_IDLE1 = 0,
|
|
GLOCK_IDLE2,
|
|
GLOCK_IDLE3,
|
|
GLOCK_SHOOT,
|
|
GLOCK_SHOOT_EMPTY,
|
|
GLOCK_RELOAD,
|
|
GLOCK_RELOAD_NOT_EMPTY,
|
|
GLOCK_DRAW,
|
|
GLOCK_HOLSTER,
|
|
GLOCK_ADD_SILENCER
|
|
};
|
|
|
|
class CGlock : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 2; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
|
|
void PrimaryAttack() override;
|
|
void SecondaryAttack() override;
|
|
void GlockFire(float flSpread, float flCycleTime, bool fUseAutoAim);
|
|
bool Deploy() override;
|
|
void Reload() override;
|
|
void WeaponIdle() override;
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
int m_iShell;
|
|
|
|
|
|
unsigned short m_usFireGlock1;
|
|
unsigned short m_usFireGlock2;
|
|
};
|
|
|
|
enum crowbar_e
|
|
{
|
|
CROWBAR_IDLE = 0,
|
|
CROWBAR_DRAW,
|
|
CROWBAR_HOLSTER,
|
|
CROWBAR_ATTACK1HIT,
|
|
CROWBAR_ATTACK1MISS,
|
|
CROWBAR_ATTACK2MISS,
|
|
CROWBAR_ATTACK2HIT,
|
|
CROWBAR_ATTACK3MISS,
|
|
CROWBAR_ATTACK3HIT
|
|
};
|
|
|
|
class CCrowbar : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 1; }
|
|
void EXPORT SwingAgain();
|
|
void EXPORT Smack();
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
|
|
void PrimaryAttack() override;
|
|
bool Swing(bool fFirst);
|
|
bool Deploy() override;
|
|
void Holster() override;
|
|
int m_iSwing;
|
|
TraceResult m_trHit;
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
unsigned short m_usCrowbar;
|
|
};
|
|
|
|
enum python_e
|
|
{
|
|
PYTHON_IDLE1 = 0,
|
|
PYTHON_FIDGET,
|
|
PYTHON_FIRE1,
|
|
PYTHON_RELOAD,
|
|
PYTHON_HOLSTER,
|
|
PYTHON_DRAW,
|
|
PYTHON_IDLE2,
|
|
PYTHON_IDLE3
|
|
};
|
|
|
|
class CPython : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 2; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
void PrimaryAttack() override;
|
|
void SecondaryAttack() override;
|
|
bool Deploy() override;
|
|
void Holster() override;
|
|
void Reload() override;
|
|
void WeaponIdle() override;
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
unsigned short m_usFirePython;
|
|
};
|
|
|
|
enum mp5_e
|
|
{
|
|
MP5_LONGIDLE = 0,
|
|
MP5_IDLE1,
|
|
MP5_LAUNCH,
|
|
MP5_RELOAD,
|
|
MP5_DEPLOY,
|
|
MP5_FIRE1,
|
|
MP5_FIRE2,
|
|
MP5_FIRE3,
|
|
};
|
|
|
|
class CMP5 : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 3; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
|
|
void PrimaryAttack() override;
|
|
void SecondaryAttack() override;
|
|
bool Deploy() override;
|
|
void Reload() override;
|
|
void WeaponIdle() override;
|
|
float m_flNextAnimTime;
|
|
int m_iShell;
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
unsigned short m_usMP5;
|
|
unsigned short m_usMP52;
|
|
};
|
|
|
|
enum crossbow_e
|
|
{
|
|
CROSSBOW_IDLE1 = 0, // full
|
|
CROSSBOW_IDLE2, // empty
|
|
CROSSBOW_FIDGET1, // full
|
|
CROSSBOW_FIDGET2, // empty
|
|
CROSSBOW_FIRE1, // full
|
|
CROSSBOW_FIRE2, // reload
|
|
CROSSBOW_FIRE3, // empty
|
|
CROSSBOW_RELOAD, // from empty
|
|
CROSSBOW_DRAW1, // full
|
|
CROSSBOW_DRAW2, // empty
|
|
CROSSBOW_HOLSTER1, // full
|
|
CROSSBOW_HOLSTER2, // empty
|
|
};
|
|
|
|
class CCrossbow : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 3; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
|
|
void FireBolt();
|
|
void FireSniperBolt();
|
|
void PrimaryAttack() override;
|
|
void SecondaryAttack() override;
|
|
bool Deploy() override;
|
|
void Holster() override;
|
|
void Reload() override;
|
|
void WeaponIdle() override;
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
unsigned short m_usCrossbow;
|
|
unsigned short m_usCrossbow2;
|
|
};
|
|
|
|
enum shotgun_e
|
|
{
|
|
SHOTGUN_IDLE = 0,
|
|
SHOTGUN_FIRE,
|
|
SHOTGUN_FIRE2,
|
|
SHOTGUN_RELOAD,
|
|
SHOTGUN_PUMP,
|
|
SHOTGUN_START_RELOAD,
|
|
SHOTGUN_DRAW,
|
|
SHOTGUN_HOLSTER,
|
|
SHOTGUN_IDLE4,
|
|
SHOTGUN_IDLE_DEEP
|
|
};
|
|
|
|
class CShotgun : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
#ifndef CLIENT_DLL
|
|
bool Save(CSave& save) override;
|
|
bool Restore(CRestore& restore) override;
|
|
static TYPEDESCRIPTION m_SaveData[];
|
|
#endif
|
|
|
|
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 3; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
|
|
void PrimaryAttack() override;
|
|
void SecondaryAttack() override;
|
|
bool Deploy() override;
|
|
void Reload() override;
|
|
void WeaponIdle() override;
|
|
void ItemPostFrame() override;
|
|
int m_fInReload; //TODO: not used, remove
|
|
float m_flNextReload;
|
|
int m_iShell;
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
unsigned short m_usDoubleFire;
|
|
unsigned short m_usSingleFire;
|
|
};
|
|
|
|
class CLaserSpot : public CBaseEntity
|
|
{
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
|
|
int ObjectCaps() override { return FCAP_DONT_SAVE; }
|
|
|
|
public:
|
|
void Suspend(float flSuspendTime);
|
|
void EXPORT Revive();
|
|
|
|
static CLaserSpot* CreateSpot();
|
|
};
|
|
|
|
enum rpg_e
|
|
{
|
|
RPG_IDLE = 0,
|
|
RPG_FIDGET,
|
|
RPG_RELOAD, // to reload
|
|
RPG_FIRE2, // to empty
|
|
RPG_HOLSTER1, // loaded
|
|
RPG_DRAW1, // loaded
|
|
RPG_HOLSTER2, // unloaded
|
|
RPG_DRAW_UL, // unloaded
|
|
RPG_IDLE_UL, // unloaded idle
|
|
RPG_FIDGET_UL, // unloaded fidget
|
|
};
|
|
|
|
class CRpg : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
#ifndef CLIENT_DLL
|
|
bool Save(CSave& save) override;
|
|
bool Restore(CRestore& restore) override;
|
|
static TYPEDESCRIPTION m_SaveData[];
|
|
#endif
|
|
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
void Reload() override;
|
|
int iItemSlot() override { return 4; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
|
|
bool Deploy() override;
|
|
bool CanHolster() override;
|
|
void Holster() override;
|
|
|
|
void PrimaryAttack() override;
|
|
void SecondaryAttack() override;
|
|
void WeaponIdle() override;
|
|
|
|
void UpdateSpot();
|
|
bool ShouldWeaponIdle() override { return true; }
|
|
|
|
CLaserSpot* m_pSpot;
|
|
bool m_fSpotActive;
|
|
int m_cActiveRockets; // how many missiles in flight from this launcher right now?
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
unsigned short m_usRpg;
|
|
};
|
|
|
|
class CRpgRocket : public CGrenade
|
|
{
|
|
public:
|
|
~CRpgRocket() override;
|
|
|
|
bool Save(CSave& save) override;
|
|
bool Restore(CRestore& restore) override;
|
|
static TYPEDESCRIPTION m_SaveData[];
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
void EXPORT FollowThink();
|
|
void EXPORT IgniteThink();
|
|
void EXPORT RocketTouch(CBaseEntity* pOther);
|
|
static CRpgRocket* CreateRpgRocket(Vector vecOrigin, Vector vecAngles, CBaseEntity* pOwner, CRpg* pLauncher);
|
|
|
|
CRpg* GetLauncher();
|
|
|
|
int m_iTrail;
|
|
float m_flIgniteTime;
|
|
EHANDLE m_hLauncher; // handle back to the launcher that fired me.
|
|
};
|
|
|
|
#define GAUSS_PRIMARY_CHARGE_VOLUME 256 // how loud gauss is while charging
|
|
#define GAUSS_PRIMARY_FIRE_VOLUME 450 // how loud gauss is when discharged
|
|
|
|
enum gauss_e
|
|
{
|
|
GAUSS_IDLE = 0,
|
|
GAUSS_IDLE2,
|
|
GAUSS_FIDGET,
|
|
GAUSS_SPINUP,
|
|
GAUSS_SPIN,
|
|
GAUSS_FIRE,
|
|
GAUSS_FIRE2,
|
|
GAUSS_HOLSTER,
|
|
GAUSS_DRAW
|
|
};
|
|
|
|
class CGauss : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
#ifndef CLIENT_DLL
|
|
bool Save(CSave& save) override;
|
|
bool Restore(CRestore& restore) override;
|
|
static TYPEDESCRIPTION m_SaveData[];
|
|
#endif
|
|
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 4; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
|
|
bool Deploy() override;
|
|
void Holster() override;
|
|
|
|
void PrimaryAttack() override;
|
|
void SecondaryAttack() override;
|
|
void WeaponIdle() override;
|
|
|
|
void StartFire();
|
|
void Fire(Vector vecOrigSrc, Vector vecDirShooting, float flDamage);
|
|
float GetFullChargeTime();
|
|
int m_iBalls;
|
|
int m_iGlow;
|
|
int m_iBeam;
|
|
int m_iSoundState; // don't save this
|
|
|
|
// was this weapon just fired primary or secondary?
|
|
// we need to know so we can pick the right set of effects.
|
|
bool m_fPrimaryFire;
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
void SendStopEvent(bool sendToHost);
|
|
|
|
private:
|
|
unsigned short m_usGaussFire;
|
|
unsigned short m_usGaussSpin;
|
|
};
|
|
|
|
enum egon_e
|
|
{
|
|
EGON_IDLE1 = 0,
|
|
EGON_FIDGET1,
|
|
EGON_ALTFIREON,
|
|
EGON_ALTFIRECYCLE,
|
|
EGON_ALTFIREOFF,
|
|
EGON_FIRE1,
|
|
EGON_FIRE2,
|
|
EGON_FIRE3,
|
|
EGON_FIRE4,
|
|
EGON_DRAW,
|
|
EGON_HOLSTER
|
|
};
|
|
|
|
enum EGON_FIRESTATE
|
|
{
|
|
FIRE_OFF,
|
|
FIRE_CHARGE
|
|
};
|
|
|
|
enum EGON_FIREMODE
|
|
{
|
|
FIRE_NARROW,
|
|
FIRE_WIDE
|
|
};
|
|
|
|
#define EGON_PRIMARY_VOLUME 450
|
|
#define EGON_BEAM_SPRITE "sprites/xbeam1.spr"
|
|
#define EGON_FLARE_SPRITE "sprites/XSpark1.spr"
|
|
#define EGON_SOUND_OFF "weapons/egon_off1.wav"
|
|
#define EGON_SOUND_RUN "weapons/egon_run3.wav"
|
|
#define EGON_SOUND_STARTUP "weapons/egon_windup2.wav"
|
|
|
|
class CEgon : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
#ifndef CLIENT_DLL
|
|
bool Save(CSave& save) override;
|
|
bool Restore(CRestore& restore) override;
|
|
static TYPEDESCRIPTION m_SaveData[];
|
|
#endif
|
|
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 4; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
|
|
bool Deploy() override;
|
|
void Holster() override;
|
|
|
|
void UpdateEffect(const Vector& startPoint, const Vector& endPoint, float timeBlend);
|
|
|
|
void CreateEffect();
|
|
void DestroyEffect();
|
|
|
|
void EndAttack();
|
|
void Attack();
|
|
void PrimaryAttack() override;
|
|
bool ShouldWeaponIdle() override { return true; }
|
|
void WeaponIdle() override;
|
|
|
|
float m_flAmmoUseTime; // since we use < 1 point of ammo per update, we subtract ammo on a timer.
|
|
|
|
float GetPulseInterval();
|
|
float GetDischargeInterval();
|
|
|
|
void Fire(const Vector& vecOrigSrc, const Vector& vecDir);
|
|
|
|
bool HasAmmo();
|
|
bool CanHolster();
|
|
|
|
void UseAmmo(int count);
|
|
|
|
CBeam* m_pBeam;
|
|
CBeam* m_pNoise;
|
|
CSprite* m_pSprite;
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
unsigned short m_usEgonStop;
|
|
|
|
private:
|
|
float m_shootTime;
|
|
EGON_FIREMODE m_fireMode;
|
|
float m_shakeTime;
|
|
bool m_deployed;
|
|
|
|
unsigned short m_usEgonFire;
|
|
};
|
|
|
|
enum hgun_e
|
|
{
|
|
HGUN_IDLE1 = 0,
|
|
HGUN_FIDGETSWAY,
|
|
HGUN_FIDGETSHAKE,
|
|
HGUN_DOWN,
|
|
HGUN_UP,
|
|
HGUN_SHOOT
|
|
};
|
|
|
|
class CHgun : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
#ifndef CLIENT_DLL
|
|
bool Save(CSave& save) override;
|
|
bool Restore(CRestore& restore) override;
|
|
static TYPEDESCRIPTION m_SaveData[];
|
|
#endif
|
|
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 4; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
void AddToPlayer(CBasePlayer* pPlayer) override;
|
|
|
|
void PrimaryAttack() override;
|
|
void SecondaryAttack() override;
|
|
bool Deploy() override;
|
|
bool IsUseable() override;
|
|
void Holster() override;
|
|
void Reload() override;
|
|
void WeaponIdle() override;
|
|
float m_flNextAnimTime;
|
|
|
|
float m_flRechargeTime;
|
|
|
|
int m_iFirePhase; // don't save me.
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
unsigned short m_usHornetFire;
|
|
};
|
|
|
|
enum handgrenade_e
|
|
{
|
|
HANDGRENADE_IDLE = 0,
|
|
HANDGRENADE_FIDGET,
|
|
HANDGRENADE_PINPULL,
|
|
HANDGRENADE_THROW1, // toss
|
|
HANDGRENADE_THROW2, // medium
|
|
HANDGRENADE_THROW3, // hard
|
|
HANDGRENADE_HOLSTER,
|
|
HANDGRENADE_DRAW
|
|
};
|
|
|
|
class CHandGrenade : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 5; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
|
|
void PrimaryAttack() override;
|
|
bool Deploy() override;
|
|
bool CanHolster() override;
|
|
void Holster() override;
|
|
void WeaponIdle() override;
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
};
|
|
|
|
enum satchel_e
|
|
{
|
|
SATCHEL_IDLE1 = 0,
|
|
SATCHEL_FIDGET1,
|
|
SATCHEL_DRAW,
|
|
SATCHEL_DROP
|
|
};
|
|
|
|
enum satchel_radio_e
|
|
{
|
|
SATCHEL_RADIO_IDLE1 = 0,
|
|
SATCHEL_RADIO_FIDGET1,
|
|
SATCHEL_RADIO_DRAW,
|
|
SATCHEL_RADIO_FIRE,
|
|
SATCHEL_RADIO_HOLSTER
|
|
};
|
|
|
|
class CSatchel : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
#ifndef CLIENT_DLL
|
|
bool Save(CSave& save) override;
|
|
bool Restore(CRestore& restore) override;
|
|
static TYPEDESCRIPTION m_SaveData[];
|
|
#endif
|
|
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 5; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
void AddToPlayer(CBasePlayer* pPlayer) override;
|
|
void PrimaryAttack() override;
|
|
void SecondaryAttack() override;
|
|
bool AddDuplicate(CBasePlayerItem* pOriginal) override;
|
|
bool CanDeploy() override;
|
|
bool Deploy() override;
|
|
bool IsUseable() override;
|
|
|
|
void Holster() override;
|
|
void WeaponIdle() override;
|
|
void Throw();
|
|
void Detonate();
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
};
|
|
|
|
enum tripmine_e
|
|
{
|
|
TRIPMINE_IDLE1 = 0,
|
|
TRIPMINE_IDLE2,
|
|
TRIPMINE_ARM1,
|
|
TRIPMINE_ARM2,
|
|
TRIPMINE_FIDGET,
|
|
TRIPMINE_HOLSTER,
|
|
TRIPMINE_DRAW,
|
|
TRIPMINE_WORLD,
|
|
TRIPMINE_GROUND,
|
|
};
|
|
|
|
class CTripmine : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 5; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
void SetObjectCollisionBox() override
|
|
{
|
|
//!!!BUGBUG - fix the model!
|
|
pev->absmin = pev->origin + Vector(-16, -16, -5);
|
|
pev->absmax = pev->origin + Vector(16, 16, 28);
|
|
}
|
|
|
|
void PrimaryAttack() override;
|
|
bool Deploy() override;
|
|
void Holster() override;
|
|
void WeaponIdle() override;
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
unsigned short m_usTripFire;
|
|
};
|
|
|
|
enum squeak_e
|
|
{
|
|
SQUEAK_IDLE1 = 0,
|
|
SQUEAK_FIDGETFIT,
|
|
SQUEAK_FIDGETNIP,
|
|
SQUEAK_DOWN,
|
|
SQUEAK_UP,
|
|
SQUEAK_THROW
|
|
};
|
|
|
|
class CSqueak : public CBasePlayerWeapon
|
|
{
|
|
public:
|
|
void Spawn() override;
|
|
void Precache() override;
|
|
int iItemSlot() override { return 5; }
|
|
bool GetItemInfo(ItemInfo* p) override;
|
|
|
|
void PrimaryAttack() override;
|
|
void SecondaryAttack() override;
|
|
bool Deploy() override;
|
|
void Holster() override;
|
|
void WeaponIdle() override;
|
|
bool m_fJustThrown;
|
|
|
|
bool UseDecrement() override
|
|
{
|
|
#if defined(CLIENT_WEAPONS)
|
|
return true;
|
|
#else
|
|
return false;
|
|
#endif
|
|
}
|
|
|
|
private:
|
|
unsigned short m_usSnarkFire;
|
|
};
|