1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Weapon data file parsing, shared by game & client dlls.
//
// $NoKeywords: $
//=============================================================================//
#ifndef WEAPON_PARSE_H
#define WEAPON_PARSE_H
#ifdef _WIN32
#pragma once
#endif
#include "shareddefs.h"
class IFileSystem;
typedef unsigned short WEAPON_FILE_INFO_HANDLE;
// -----------------------------------------------------------
// Weapon sound types
// Used to play sounds defined in the weapon's classname.txt file
// This needs to match pWeaponSoundCategories in weapon_parse.cpp
// ------------------------------------------------------------
typedef enum {
EMPTY,
SINGLE,
SINGLE_NPC,
WPN_DOUBLE, // Can't be "DOUBLE" because windows.h uses it.
DOUBLE_NPC,
BURST,
RELOAD,
RELOAD_NPC,
MELEE_MISS,
MELEE_HIT,
MELEE_HIT_WORLD,
SPECIAL1,
SPECIAL2,
SPECIAL3,
TAUNT,
DEPLOY,
// Add new shoot sound types here
NUM_SHOOT_SOUND_TYPES,
} WeaponSound_t;
int GetWeaponSoundFromString( const char *pszString );
#define MAX_SHOOT_SOUNDS 16 // Maximum number of shoot sounds per shoot type
#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;
//-----------------------------------------------------------------------------
// Purpose: Contains the data read from the weapon's script file.
// It's cached so we only read each weapon's script file once.
// Each game provides a CreateWeaponInfo function so it can have game-specific
// data (like CS move speeds) in the weapon script.
//-----------------------------------------------------------------------------
class FileWeaponInfo_t
{
public:
FileWeaponInfo_t();
// Each game can override this to get whatever values it wants from the script.
virtual void Parse( KeyValues *pKeyValuesData, const char *szWeaponName );
public:
bool bParsedScript;
bool bLoadedHudElements;
// SHARED
char szClassName[MAX_WEAPON_STRING];
char szPrintName[MAX_WEAPON_STRING]; // Name for showing in HUD, etc.
char szViewModel[MAX_WEAPON_STRING]; // View model of this weapon
char szWorldModel[MAX_WEAPON_STRING]; // Model of this weapon seen carried by the player
char szAnimationPrefix[MAX_WEAPON_PREFIX]; // Prefix of the animations that should be used by the player carrying this weapon
int iSlot; // inventory slot.
int iPosition; // position in the inventory slot.
int iMaxClip1; // max primary clip size (-1 if no clip)
int iMaxClip2; // max secondary clip size (-1 if no clip)
int iDefaultClip1; // amount of primary ammo in the gun when it's created
int iDefaultClip2; // amount of secondary ammo in the gun when it's created
int iWeight; // this value used to determine this weapon's importance in autoselection.
int iRumbleEffect; // Which rumble effect to use when fired? (xbox)
bool bAutoSwitchTo; // whether this weapon should be considered for autoswitching to
bool bAutoSwitchFrom; // whether this weapon can be autoswitched away from when picking up another weapon or ammo
int iFlags; // miscellaneous weapon flags
char szAmmo1[MAX_WEAPON_AMMO_NAME]; // "primary" ammo type
char szAmmo2[MAX_WEAPON_AMMO_NAME]; // "secondary" ammo type
// Sound blocks
char aShootSounds[NUM_SHOOT_SOUND_TYPES][MAX_WEAPON_STRING];
int iAmmoType;
int iAmmo2Type;
bool m_bMeleeWeapon; // Melee weapons can always "fire" regardless of ammo.
// This tells if the weapon was built right-handed (defaults to true).
// This helps cl_righthand make the decision about whether to flip the model or not.
bool m_bBuiltRightHanded;
bool m_bAllowFlipping; // False to disallow flipping the model, regardless of whether
// it is built left or right handed.
// CLIENT DLL
// Sprite data, read from the data file
int iSpriteCount;
CHudTexture *iconActive;
CHudTexture *iconInactive;
CHudTexture *iconAmmo;
CHudTexture *iconAmmo2;
CHudTexture *iconCrosshair;
CHudTexture *iconAutoaim;
CHudTexture *iconZoomedCrosshair;
CHudTexture *iconZoomedAutoaim;
CHudTexture *iconSmall;
// TF2 specific
bool bShowUsageHint; // if true, then when you receive the weapon, show a hint about it
// SERVER DLL
};
// The weapon parse function
bool ReadWeaponDataFromFileForSlot( IFileSystem* filesystem, const char *szWeaponName,
WEAPON_FILE_INFO_HANDLE *phandle, const unsigned char *pICEKey = NULL );
// If weapon info has been loaded for the specified class name, this returns it.
WEAPON_FILE_INFO_HANDLE LookupWeaponInfoSlot( const char *name );
FileWeaponInfo_t *GetFileWeaponInfoFromHandle( WEAPON_FILE_INFO_HANDLE handle );
WEAPON_FILE_INFO_HANDLE GetInvalidWeaponInfoHandle( void );
void PrecacheFileWeaponInfoDatabase( IFileSystem *filesystem, const unsigned char *pICEKey );
//
// Read a possibly-encrypted KeyValues file in.
// If pICEKey is NULL, then it appends .txt to the filename and loads it as an unencrypted file.
// If pICEKey is non-NULL, then it appends .ctx to the filename and loads it as an encrypted file.
//
// (This should be moved into a more appropriate place).
//
KeyValues* ReadEncryptedKVFile( IFileSystem *filesystem, const char *szFilenameWithoutExtension, const unsigned char *pICEKey, bool bForceReadEncryptedFile = false );
// Each game implements this. It can return a derived class and override Parse() if it wants.
extern FileWeaponInfo_t* CreateWeaponInfo();
#endif // WEAPON_PARSE_H
|