Seaside/SpyCustom/weapon_parse.h
2021-06-16 16:13:22 +03:00

216 lines
5.9 KiB
C++

#ifndef WEAPON_PARSE_H
#define WEAPON_PARSE_H
#ifdef _WIN32
#pragma once
#endif
#include "shareddefs.h"
#include "GameEventListener.h"
#include "utlsortvector.h"
#include "gamestringpool.h"
#ifdef CLIENT_DLL
#define CEconItemView C_EconItemView
#endif
class IFileSystem;
class CEconItemView;
typedef unsigned short WEAPON_FILE_INFO_HANDLE;
enum WeaponSound_t {
EMPTY,
SINGLE,
SINGLE_ACCURATE,
SINGLE_NPC,
WPN_DOUBLE,
DOUBLE_NPC,
BURST,
RELOAD,
RELOAD_NPC,
MELEE_MISS,
MELEE_HIT,
MELEE_HIT_WORLD,
SPECIAL1,
SPECIAL2,
SPECIAL3,
TAUNT,
NEARLYEMPTY,
FAST_RELOAD,
NUM_SHOOT_SOUND_TYPES,
};
int GetWeaponSoundFromString(const char* pszString);
#define MAX_SHOOT_SOUNDS 16
#define MAX_WEAPON_STRING 80
#define MAX_WEAPON_PREFIX 16
#define MAX_WEAPON_AMMO_NAME 32
#define WEAPON_PRINTNAME_MISSING "!!! Missing printname on weapon"
class CHudTexture;
class KeyValues;
struct WeaponInfoLookup
{
size_t m_nWeaponParseDataOffset;
_fieldtypes m_fieldType;
CGameString m_iszAttribClassName;
WeaponInfoLookup(void) {}
WeaponInfoLookup(size_t offset, _fieldtypes p_fieldType, const char* szAttribClassName);
WeaponInfoLookup(const WeaponInfoLookup& WepInfoLookup);
};
class CWeaponInfoLookupListLess
{
public:
bool Less(WeaponInfoLookup* const& src1, WeaponInfoLookup* const& src2, void* pCtx)
{
if (src1->m_iszAttribClassName.Get() < src2->m_iszAttribClassName.Get())
return true;
return false;
}
};
class FileWeaponInfo_t
{
public:
FileWeaponInfo_t();
virtual ~FileWeaponInfo_t() {}
virtual void Parse(KeyValues* pKeyValuesData, const char* szWeaponName);
virtual void RefreshDynamicParameters() {};
public:
bool bParsedScript;
bool bLoadedHudElements;
char szClassName[MAX_WEAPON_STRING];
char szPrintName[MAX_WEAPON_STRING];
int GetIndexofAttribute(string_t iszAttribClassName) const;
static CUtlSortVector< WeaponInfoLookup*, CWeaponInfoLookupListLess > ms_vecWeaponInfoLookup;
protected:
char szViewModel[MAX_WEAPON_STRING];
char szWorldModel[MAX_WEAPON_STRING];
char szAmmo1[MAX_WEAPON_AMMO_NAME];
char szWorldDroppedModel[MAX_WEAPON_STRING];
static bool ms_bWeaponInfoLookupInitialized;
public:
char szAnimationPrefix[MAX_WEAPON_PREFIX];
int iSlot;
int iPosition;
int iMaxClip1;
int iMaxClip2;
int iDefaultClip1;
int iDefaultClip2;
int iWeight;
int iRumbleEffect;
bool bAutoSwitchTo;
bool bAutoSwitchFrom;
int iFlags;
char szAmmo2[MAX_WEAPON_AMMO_NAME];
char szAIAddOn[MAX_WEAPON_STRING];
char aShootSounds[NUM_SHOOT_SOUND_TYPES][MAX_WEAPON_STRING];
private:
int iAmmoType;
int iAmmo2Type;
public:
bool m_bMeleeWeapon;
bool m_bBuiltRightHanded;
bool m_bAllowFlipping;
virtual int GetPrimaryClipSize(const CEconItemView* pWepView = NULL, int nAlt = 0, float flScale = 1.0f) const { return 0; }
virtual int GetSecondaryClipSize(const CEconItemView* pWepView = NULL, int nAlt = 0, float flScale = 1.0f) const { return 0; }
virtual int GetDefaultPrimaryClipSize(const CEconItemView* pWepView = NULL, int nAlt = 0, float flScale = 1.0f) const { return 0; }
virtual int GetDefaultSecondaryClipSize(const CEconItemView* pWepView = NULL, int nAlt = 0, float flScale = 1.0f) const { return 0; }
virtual int GetPrimaryReserveAmmoMax(const CEconItemView* pWepView = NULL, int nAlt = 0, float flScale = 1.0f) const { return 0; }
virtual int GetSecondaryReserveAmmoMax(const CEconItemView* pWepView = NULL, int nAlt = 0, float flScale = 1.0f) const { return 0; }
const char* GetWorldModel(const CEconItemView* pWepView = NULL, int iTeam = 0) const;
const char* GetViewModel(const CEconItemView* pWepView = NULL, int iTeam = 0) const;
const char* GetWorldDroppedModel(const CEconItemView* pWepView = NULL, int iTeam = 0) const;
const char* GetPrimaryAmmo(const CEconItemView* pWepView = NULL) const;
int GetPrimaryAmmoType(const CEconItemView* pWepView = NULL) const;
int iSpriteCount;
CHudTexture* iconActive;
CHudTexture* iconInactive;
CHudTexture* iconAmmo;
CHudTexture* iconAmmo2;
CHudTexture* iconCrosshair;
CHudTexture* iconAutoaim;
CHudTexture* iconZoomedCrosshair;
CHudTexture* iconZoomedAutoaim;
CHudTexture* iconSmall;
bool bShowUsageHint;
};
WEAPON_FILE_INFO_HANDLE LookupWeaponInfoSlot(const char* name);
FileWeaponInfo_t* GetFileWeaponInfoFromHandle(WEAPON_FILE_INFO_HANDLE handle);
WEAPON_FILE_INFO_HANDLE GetInvalidWeaponInfoHandle(void);
void PrecacheFileWeaponInfoDatabase();
KeyValues* ReadEncryptedKVFile(IFileSystem* filesystem, const char* szFilenameWithoutExtension, const unsigned char* pICEKey, bool bForceReadEncryptedFile = false);
extern FileWeaponInfo_t* CreateWeaponInfo();
extern void LoadEquipmentData();
class CWeaponDatabase : public CAutoGameSystem, public CGameEventListener
{
public:
CWeaponDatabase();
void Reset();
bool LoadManifest();
void PrecacheAllWeapons();
void RefreshAllWeapons();
WEAPON_FILE_INFO_HANDLE FindWeaponInfo(const char* name);
FileWeaponInfo_t* GetFileWeaponInfoFromHandle(WEAPON_FILE_INFO_HANDLE handle);
protected:
friend void LoadEquipmentData();
virtual bool Init();
WEAPON_FILE_INFO_HANDLE FindOrCreateWeaponInfo(const char* name);
bool LoadWeaponDataFromFile(IFileSystem* filesystem, const char* szWeaponName, const unsigned char* pICEKey);
void FireGameEvent(IGameEvent* event);
private:
CUtlDict< FileWeaponInfo_t*, unsigned short > m_WeaponInfoDatabase;
bool m_bPreCached;
};
extern CWeaponDatabase g_WeaponDatabase;
#endif