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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
|
#if defined _smlib_weapons_included
#endinput
#endif
#define _smlib_weapons_included
#include <sourcemod>
#include <sdktools_functions>
#include <smlib/entities>
#define MAX_WEAPON_OFFSET 64
#define MAX_WEAPON_SLOTS 6 // hud item selection slots
#define MAX_WEAPON_POSITIONS 20 // max number of items within a slot
#define MAX_WEAPONS 48 // Max number of weapons availabl
#define WEAPON_NOCLIP -1 // clip sizes set to this tell the weapon it doesn't use a clip
#define MAX_AMMO_TYPES 32
#define MAX_AMMO_SLOTS 32 // not really slots
#define MAX_WEAPON_STRING 80
#define MAX_WEAPON_PREFIX 16
#define MAX_WEAPON_AMMO_NAME 32
/*
* Gets the owner (usually a client) of the weapon
*
* @param weapon Weapon Entity.
* @return Owner of the weapon or INVALID_ENT_REFERENCE if the weapon has no owner.
*/
stock Weapon_GetOwner(weapon)
{
return GetEntPropEnt(weapon, Prop_Data, "m_hOwner");
}
/*
* Sets the owner (usually a client) of the weapon
*
* @param weapon Weapon Entity.
* @param entity Entity Index.
* @noreturn
*/
stock Weapon_SetOwner(weapon, entity)
{
SetEntPropEnt(weapon, Prop_Data, "m_hOwner", entity);
}
/*
* Checks whether the entity is a valid weapon or not.
*
* @param weapon Weapon Entity.
* @return True if the entity is a valid weapon, false otherwise.
*/
stock Weapon_IsValid(weapon)
{
if (!IsValidEdict(weapon)) {
return false;
}
return Entity_ClassNameMatches(weapon, "weapon_", true);
}
/*
* Create's a weapon and spawns it in the world at the specified location.
*
* @param className Classname String of the weapon to spawn
* @param absOrigin Absolute Origin Vector where to spawn the weapon.
* @param absAngles Absolute Angles Vector.
* @return Weapon Index of the created weapon or INVALID_ENT_REFERENCE on error.
*/
stock Weapon_Create(const String:className[], Float:absOrigin[3], Float:absAngles[3])
{
new weapon = Entity_Create(className);
if (weapon == INVALID_ENT_REFERENCE) {
return INVALID_ENT_REFERENCE;
}
Entity_SetAbsOrigin(weapon, absOrigin);
Entity_SetAbsAngles(weapon, absAngles);
DispatchSpawn(weapon);
return weapon;
}
/*
* Create's a weapon and spawns it in the world at the specified location.
*
* @param className Classname String of the weapon to spawn
* @param absOrigin Absolute Origin Vector where to spawn the weapon.
* @param absAngles Absolute Angles Vector.
* @return Weapon Index of the created weapon or INVALID_ENT_REFERENCE on error.
*/
stock Weapon_CreateForOwner(client, const String:className[])
{
decl Float:absOrigin[3], Float:absAngles[3];
Entity_GetAbsOrigin(client, absOrigin);
Entity_GetAbsAngles(client, absAngles);
new weapon = Weapon_Create(className, absOrigin, absAngles);
if (weapon == INVALID_ENT_REFERENCE) {
return INVALID_ENT_REFERENCE;
}
Entity_SetOwner(weapon, client);
return weapon;
}
/*
* Gets the weapon's subtype.
* The subtype is only used when a player has multiple weapons of the same type.
*
* @param weapon Weapon Entity.
* @return Subtype of the weapon.
*/
stock Weapon_GetSubType(weapon)
{
return GetEntProp(weapon, Prop_Data, "m_iSubType");
}
/*
* Is the weapon currently reloading ?
*
* @param weapon Weapon Entity.
* @return True if weapon is currently reloading, false if not.
*/
stock bool:Weapon_IsReloading(weapon)
{
return bool:GetEntProp(weapon, Prop_Data, "m_bInReload");
}
/*
* Weapon m_iState
*/
#define WEAPON_IS_ONTARGET 0x40
#define WEAPON_NOT_CARRIED 0 // Weapon is on the ground
#define WEAPON_IS_CARRIED_BY_PLAYER 1 // This client is carrying this weapon.
#define WEAPON_IS_ACTIVE 2 // This client is carrying this weapon and it's the currently held weapon
/*
* Get's the state of the weapon.
* This returns whether the weapon is currently carried by a client,
* if it is active and if it is on a target.
*
* @param weapon Weapon Entity.
* @return Weapon State.
*/
stock Weapon_GetState(weapon)
{
return GetEntProp(weapon, Prop_Data, "m_iState");
}
/*
* Returns whether the weapon can fire primary ammo under water.
*
* @param weapon Weapon Entity.
* @return True or False.
*/
stock bool:Weapon_FiresUnderWater(weapon)
{
return bool:GetEntProp(weapon, Prop_Data, "m_bFiresUnderwater");
}
/*
* Sets if the weapon can fire primary ammo under water.
*
* @param weapon Weapon Entity.
* @param can True or False.
* @noreturn
*/
stock Weapon_SetFiresUnderWater(weapon, bool:can=true)
{
SetEntProp(weapon, Prop_Data, "m_bFiresUnderwater", _:can);
}
/*
* Returns whether the weapon can fire secondary ammo under water.
*
* @param weapon Weapon Entity.
* @return True or False.
*/
stock bool:Weapon_FiresUnderWaterAlt(weapon)
{
return bool:GetEntProp(weapon, Prop_Data, "m_bAltFiresUnderwater");
}
/*
* Sets if the weapon can fire secondary ammo under water.
*
* @param weapon Weapon Entity.
* @param can True or False.
* @noreturn
*/
stock Weapon_SetFiresUnderWaterAlt(weapon, bool:can=true)
{
SetEntProp(weapon, Prop_Data, "m_bAltFiresUnderwater", _:can);
}
/*
* Gets the primary ammo Type (int offset)
*
* @param weapon Weapon Entity.
* @return Primary ammo type value.
*/
stock Weapon_GetPrimaryAmmoType(weapon)
{
return GetEntProp(weapon, Prop_Data, "m_iPrimaryAmmoType");
}
/*
* Sets the primary ammo Type (int offset)
*
* @param weapon Weapon Entity.
* @param type Primary ammo type value.
*/
stock Weapon_SetPrimaryAmmoType(weapon,type)
{
return SetEntProp(weapon, Prop_Data, "m_iPrimaryAmmoType", type);
}
/*
* Gets the secondary ammo Type (int offset)
*
* @param weapon Weapon Entity.
* @return Secondary ammo type value.
*/
stock Weapon_GetSecondaryAmmoType(weapon)
{
return GetEntProp(weapon, Prop_Data, "m_iSecondaryAmmoType");
}
/*
* Sets the secondary ammo Type (int offset)
*
* @param weapon Weapon Entity.
* @param type Secondary ammo type value.
*/
stock Weapon_SetSecondaryAmmoType(weapon,type)
{
return SetEntProp(weapon, Prop_Data, "m_iSecondaryAmmoType", type);
}
/*
* Gets the primary clip count of a weapon.
*
* @param weapon Weapon Entity.
* @return Primary Clip count.
*/
stock Weapon_GetPrimaryClip(weapon)
{
return GetEntProp(weapon, Prop_Data, "m_iClip1");
}
/*
* Sets the primary clip count of a weapon.
*
* @param weapon Weapon Entity.
* @param value Clip Count value.
*/
stock Weapon_SetPrimaryClip(weapon, value)
{
SetEntProp(weapon, Prop_Data, "m_iClip1", value);
}
/*
* Gets the secondary clip count of a weapon.
*
* @param weapon Weapon Entity.
* @return Secondy Clip count.
*/
stock Weapon_GetSecondaryClip(weapon)
{
return GetEntProp(weapon, Prop_Data, "m_iClip2");
}
/*
* Sets the secondary clip count of a weapon.
*
* @param weapon Weapon Entity.
* @param value Clip Count value.
*/
stock Weapon_SetSecondaryClip(weapon, value)
{
SetEntProp(weapon, Prop_Data, "m_iClip2", value);
}
/*
* Sets the primary & secondary clip count of a weapon.
*
* @param weapon Weapon Entity.
* @param primary Primary Clip Count value.
* @param secondary Primary Clip Count value.
*/
stock Weapon_SetClips(weapon, primary, secondary)
{
Weapon_SetPrimaryClip(weapon, primary);
Weapon_SetSecondaryClip(weapon, secondary);
}
/*
* Gets the primary ammo count of a weapon.
* This is only used when the weapon is not carried
* by a player to give a player ammo when he picks up
* the weapon.
*
* @param weapon Weapon Entity.
* @return Primary Ammo Count.
*/
stock Weapon_GetPrimaryAmmoCount(weapon)
{
return GetEntProp(weapon, Prop_Data, "m_iPrimaryAmmoCount");
}
/*
* Sets the primary ammo count of a weapon.
* This is only used when the weapon is not carried
* by a player to give a player ammo when he picks up
* the weapon.
*
* @param weapon Weapon Entity.
* @param value Primary Ammo Count.
* @noreturn
*/
stock Weapon_SetPrimaryAmmoCount(weapon, value)
{
SetEntProp(weapon, Prop_Data, "m_iPrimaryAmmoCount", value);
}
/*
* Gets the secondary ammo count of a weapon.
* This is only used when the weapon is not carried
* by a player to give a player ammo when he picks up
* the weapon.
*
* @param weapon Weapon Entity.
* @return Secondary Ammo Count.
*/
stock Weapon_GetSecondaryAmmoCount(weapon)
{
return GetEntProp(weapon, Prop_Data, "m_iSecondaryAmmoCount");
}
/*
* Sets the secodary ammo count of a weapon.
* This is only used when the weapon is not carried
* by a player to give a player ammo when he picks up
* the weapon.
*
* @param weapon Weapon Entity.
* @param value Secondary Ammo Count.
* @noreturn
*/
stock Weapon_SetSecondaryAmmoCount(weapon, value)
{
SetEntProp(weapon, Prop_Data, "m_iSecondaryAmmoCount", value);
}
/*
* Sets both, the primary & the secondary ammo count of a weapon.
* This is only used when the weapon is not carried
* by a player to give a player ammo when he picks up
* the weapon.
*
* @param weapon Weapon Entity.
* @value primary Primary Ammo Count.
* @value secondary Secondary Ammo Count.
* @noreturn
*/
stock Weapon_SetAmmoCounts(weapon, primary, secondary)
{
Weapon_SetPrimaryAmmoCount(weapon, primary);
Weapon_SetSecondaryAmmoCount(weapon, secondary);
}
/*
* Gets the Model Index of the weapon's view model.
*
* @param weapon Weapon Entity.
* @return View Model Index.
*/
stock Weapon_GetViewModelIndex(weapon)
{
return GetEntProp(weapon, Prop_Data, "m_nViewModelIndex");
}
/*
* Sets the Model Index of the weapon's view model.
* You can get the Model Index by precaching a model with PrecacheModel().
*
* @param weapon Weapon Entity.
* @param index Model Index.
* @noreturn
*/
stock Weapon_SetViewModelIndex(weapon, index)
{
SetEntProp(weapon, Prop_Data, "m_nViewModelIndex", index);
ChangeEdictState(weapon, FindDataMapOffs(weapon, "m_nViewModelIndex"));
}
|