1 /*
2 ===========================================================================
3 
4 Return to Castle Wolfenstein single player GPL Source Code
5 Copyright (C) 1999-2010 id Software LLC, a ZeniMax Media company.
6 
7 This file is part of the Return to Castle Wolfenstein single player GPL Source Code (“RTCW SP Source Code”).
8 
9 RTCW SP Source Code is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13 
14 RTCW SP Source Code is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with RTCW SP Source Code.  If not, see <http://www.gnu.org/licenses/>.
21 
22 In addition, the RTCW SP Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the RTCW SP Source Code.  If not, please request a copy in writing from id Software at the address below.
23 
24 If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
25 
26 ===========================================================================
27 */
28 
29 /*
30  * name:		bg_misc.c
31  *
32  * desc:		both games misc functions, all completely stateless
33  *
34 */
35 
36 
37 #include "../qcommon/q_shared.h"
38 #include "bg_public.h"
39 
40 
41 #ifdef CGAMEDLL
42 extern vmCvar_t cg_gameType;
43 #endif
44 #ifdef GAMEDLL
45 extern vmCvar_t g_gametype;
46 #endif
47 
48 
49 // NOTE: weapons that share ammo (ex. colt/thompson) need to share max ammo, but not necessarily uses or max clip
50 #define MAX_AMMO_45     300
51 #define MAX_AMMO_9MM    300
52 #define MAX_AMMO_VENOM  1000
53 #define MAX_AMMO_MAUSER 200
54 #define MAX_AMMO_GARAND 10
55 #define MAX_AMMO_FG42   MAX_AMMO_MAUSER
56 #define MAX_AMMO_BAR    200
57 
58 
59 // these defines are matched with the character torso animations
60 #define DELAY_LOW       100 // machineguns, tesla, spear, flame
61 #define DELAY_HIGH      100 // mauser, garand
62 #define DELAY_PISTOL    100 // colt, luger, sp5, cross
63 #define DELAY_SHOULDER  50  // rl
64 #define DELAY_THROW     250 // grenades, dynamite
65 
66 // [0] = maxammo		-	max player ammo carrying capacity.
67 // [1] = uses			-	how many 'rounds' it takes/costs to fire one cycle.
68 // [2] = maxclip		-	max 'rounds' in a clip.
69 // [3] = reloadTime		-	time from start of reload until ready to fire.
70 // [4] = fireDelayTime	-	time from pressing 'fire' until first shot is fired. (used for delaying fire while weapon is 'readied' in animation)
71 // [5] = nextShotTime	-	when firing continuously, this is the time between shots
72 // [6] = maxHeat		-	max active firing time before weapon 'overheats' (at which point the weapon will fail for a moment)
73 // [7] = coolRate		-	how fast the weapon cools down.
74 // [8] = mod			-	means of death
75 
76 // potential inclusions in the table:
77 // damage			-
78 // splashDamage		-
79 // soundRange		-	distance which ai can hear the weapon
80 // ammoWarning		-	amount we give the player a 'low on ammo' warning (just a HUD color change or something)
81 // clipWarning		-	amount we give the player a 'low in clip' warning (just a HUD color change or something)
82 // maxclip2			-	allow the player to (mod/powerup) upgrade clip size when aplicable (luger has 8 round standard clip and 32 round snail magazine, for ex.)
83 //
84 //
85 //
86 
87 ammotable_t ammoTable[] = {
88 	//	MAX				USES	MAX		RELOAD	FIRE			NEXT	HEAT,	COOL,	MOD,	...
89 	//	AMMO			AMT.	CLIP	TIME	DELAY			SHOT
90 	{   0,              0,      0,      0,      50,             0,      0,      0,      0                       },  //	WP_NONE					// 0
91 
92 	{   999,            0,      999,    0,      50,             200,    0,      0,      MOD_KNIFE               },  //	WP_KNIFE				// 1
93 
94 	{   MAX_AMMO_9MM,   1,      8,      1500,   DELAY_PISTOL,   400,    0,      0,      MOD_LUGER               },  //	WP_LUGER				// 2	// NOTE: also 32 round 'snail' magazine
95 	{   MAX_AMMO_9MM,   1,      32,     2600,   DELAY_LOW,      100,    0,      0,      MOD_MP40                },  //	WP_MP40					// 3
96 	{   MAX_AMMO_MAUSER,1,      10,     2500,   DELAY_HIGH,     1200,   0,      0,      MOD_MAUSER              },  //	WP_MAUSER				// 4	// NOTE: authentic clips are 5/10/25 rounds
97 	{   MAX_AMMO_FG42,  1,      20,     2000,   DELAY_LOW,      200,    0,      0,      MOD_FG42                },  //	WP_FG42					// 5
98 	{   15,             1,      15,     1000,   DELAY_THROW,    1600,   0,      0,      MOD_GRENADE_LAUNCHER    },  //	WP_GRENADE_LAUNCHER		// 6
99 	{   5,              1,      1,      1000,   DELAY_SHOULDER, 2000,   0,      0,      MOD_PANZERFAUST         },  //	WP_PANZERFAUST			// 7
100 //	{	MAX_AMMO_VENOM,	1,		500,	3000,	750,			30,		5000,	200,	MOD_VENOM				},	//	WP_VENOM				// -
101 	{   MAX_AMMO_VENOM, 1,      500,    3000,   750,            45,     5000,   200,    MOD_VENOM               },  //	WP_VENOM				// 8	// JPW NOTE: changed next_shot 50->45 to genlock firing to every server frame (fire rate shouldn't be framerate dependent now)
102 	{   150,            1,      150,    1000,   DELAY_LOW,      50,     0,      0,      MOD_FLAMETHROWER        },  //	WP_FLAMETHROWER			// 9
103 	{   300,            1,      300,    1000,   DELAY_LOW,      0,      0,      0,      MOD_TESLA               },  //	WP_TESLA				// 10
104 //	{	50,				1,		50,		1000,	DELAY_LOW,		1200,	0,		0,		MOD_SPEARGUN			},	//	WP_SPEARGUN				// 11
105 
106 //	{	999,			0,		999,	0,		50,				200,	0,		0,		MOD_KNIFE2				},	//	WP_KNIFE2				// 12
107 	{   MAX_AMMO_45,    1,      8,      1500,   DELAY_PISTOL,   400,    0,      0,      MOD_COLT                },  //	WP_COLT					// 13
108 	{   MAX_AMMO_45,    1,      30,     2400,   DELAY_LOW,      120,    0,      0,      MOD_THOMPSON            },  //	WP_THOMPSON				// 14	// NOTE: also 50 round drum magazine
109 	{   MAX_AMMO_GARAND,1,      5,      2500,   DELAY_HIGH,     1200,   0,      0,      MOD_GARAND              },  //	WP_GARAND				// 15	// NOTE: always 5 round clips
110 //	{	MAX_AMMO_BAR,	1,		20,		2000,	DELAY_LOW,		200,	0,		0,		MOD_BAR					},	//	WP_BAR					// 16
111 	{   15,             1,      15,     1000,   DELAY_THROW,    1600,   0,      0,      MOD_GRENADE_PINEAPPLE   },  //	WP_GRENADE_PINEAPPLE	// 17
112 //	{	5,				1,		5,		1000,	DELAY_SHOULDER,	1200,	0,		0,		MOD_ROCKET_LAUNCHER		},	//	WP_ROCKET_LAUNCHER		// 18
113 
114 	{   MAX_AMMO_MAUSER,1,      10,     3000,   0,              1700,   0,      0,      MOD_SNIPERRIFLE         },  //	WP_SNIPER_GER			// 19
115 	{   MAX_AMMO_GARAND,1,      5,      3000,   0,              1200,   0,      0,      MOD_SNOOPERSCOPE        },  //	WP_SNIPER_AM			// 20
116 //	{	MAX_AMMO_VENOM,	10,		300,	3000,	1200,			1200,	0,		0,		MOD_VENOM_FULL			},	//	WP_VENOM_FULL			// -
117 //	{	MAX_AMMO_VENOM,	10,		300,	3000,	1000,			1000,	0,		0,		MOD_VENOM_FULL			},	//	WP_VENOM_FULL			// 21
118 //	{	20,				1,		20,		1000,	DELAY_LOW,		1200,	0,		0,		MOD_SPEARGUN_CO2		},	//	WP_SPEARGUN_CO2			// 22
119 
120 	{   MAX_AMMO_FG42,  1,      20,     2000,   DELAY_LOW,      200,    0,      0,      MOD_FG42SCOPE           },  //	WP_FG42SCOPE			// 23
121 //	{	MAX_AMMO_BAR,	1,		20,		2000,	DELAY_LOW,		90,		0,		0,		MOD_BAR					},	//	WP_BAR2					// 24
122 	{   MAX_AMMO_9MM,   1,      32,     3100,   DELAY_LOW,      110,    700,    300,    MOD_STEN                },  //	WP_STEN					// 25
123 	{   MAX_AMMO_9MM,   1,      8,      1500,   DELAY_PISTOL,   400,    0,      0,      MOD_SILENCER            },  //	WP_SILENCER				// 26
124 	{   MAX_AMMO_45,    1,      8,      2700,   DELAY_PISTOL,   200,    0,      0,      MOD_AKIMBO              },  //	WP_AKIMBO				// 27
125 
126 	{   999,            0,      999,    0,      50,             0,      0,      0,      0                       },  //	WP_CLASS_SPECIAL		// 28	//	class_special
127 //	{	100,			1,		100,	1000,	DELAY_PISTOL,	900,	0,		0,		MOD_CROSS				},	//	WP_CROSS				// 29
128 	{   10,             1,      10,     1000,   DELAY_THROW,    1600,   0,      0,      MOD_DYNAMITE            },  //	WP_DYNAMITE				// 30
129 //	{	10,				1,		10,		1000,	DELAY_THROW,	1600,	0,		0,		MOD_DYNAMITE			},	//	WP_DYNAMITE2			// 31
130 
131 // stubs for some "not-real" weapons (so they always return "yes, you have enough ammo for that gauntlet", etc.)
132 //	{	5,				1,		5,		1000,	DELAY_SHOULDER,	1200,	0,		0,		0 /*mod_prox*/			},	//	WP_PROX					// 32
133 	{   999,            0,      999,    0,      50,             0,      0,      0,      0                       },  //	WP_MONSTER_ATTACK1		// 33
134 	{   999,            0,      999,    0,      50,             0,      0,      0,      0                       },  //	WP_MONSTER_ATTACK2		// 34
135 	{   999,            0,      999,    0,      50,             0,      0,      0,      0                       },  //	WP_MONSTER_ATTACK3		// 35
136 	{   999,            0,      999,    0,      50,             0,      0,      0,      0                       }   //	WP_GAUNTLET				// 36
137 };
138 
139 
140 //----(SA)	moved in here so both games can get to it
141 int weapAlts[] = {
142 	WP_NONE,            // 0 WP_NONE
143 	WP_NONE,            // 1 WP_KNIFE
144 	WP_SILENCER,        // 2 WP_LUGER
145 	WP_NONE,            // 3 WP_MP40
146 	WP_SNIPERRIFLE,     // 4 WP_MAUSER
147 	WP_FG42SCOPE,       // 5 WP_FG42	// was SP5
148 	WP_NONE,            // 6 WP_GRENADE_LAUNCHER
149 	WP_NONE,            // 7 WP_PANZERFAUST
150 	WP_NONE,            // 8 WP_VENOM
151 	WP_NONE,            // 9 WP_FLAMETHROWER
152 	WP_NONE,            // 10 WP_TESLA
153 //	WP_SPEARGUN_CO2,	// 11 WP_SPEARGUN
154 //	WP_NONE,			// 12 WP_KNIFE2
155 	WP_AKIMBO,          // 13 WP_COLT		//----(SA)	new
156 	WP_NONE,            // 14 WP_THOMPSON
157 	WP_SNOOPERSCOPE,    // 15 WP_GARAND
158 //	WP_BAR2,			// 16 WP_BAR		//----(SA)	modified
159 	WP_NONE,            // 17 WP_GRENADE_PINEAPPLE
160 //	WP_NONE,			// 18 WP_ROCKET_LAUNCHER
161 	WP_MAUSER,          // 19 WP_SNIPERRIFLE
162 	WP_GARAND,          // 20 WP_SNOOPERSCOPE
163 //	WP_VENOM,			// 21 WP_VENOM_FULL
164 //	WP_SPEARGUN,		// 22 WP_SPEARGUN_CO2
165 	WP_FG42,            // 23 WP_FG42SCOPE
166 //	WP_BAR,				// 24 WP_BAR2		//----(SA)	new
167 	WP_NONE,            // 25 WP_STEN
168 	WP_LUGER,           // 26 WP_SILENCER	//----(SA)	was sp5
169 	WP_COLT,            // 27 WP_AKIMBO		//----(SA)	new
170 	WP_NONE,            // 28 WP_CLASS_SPECIAL
171 //	WP_NONE,			// 29 WP_CROSS
172 	WP_NONE             // 30 WP_DYNAMITE	//----(SA)	modified (not in rotation yet)
173 //	WP_DYNAMITE			// 31 WP_DYNAMITE2	//----(SA)	new
174 };
175 
176 
177 // new (10/18/00)
178 char *animStrings[] = {
179 	"BOTH_DEATH1",
180 	"BOTH_DEAD1",
181 	"BOTH_DEAD1_WATER",
182 	"BOTH_DEATH2",
183 	"BOTH_DEAD2",
184 	"BOTH_DEAD2_WATER",
185 	"BOTH_DEATH3",
186 	"BOTH_DEAD3",
187 	"BOTH_DEAD3_WATER",
188 
189 	"BOTH_CLIMB",
190 	"BOTH_CLIMB_DOWN",
191 	"BOTH_CLIMB_DISMOUNT",
192 
193 	"BOTH_SALUTE",
194 
195 	"BOTH_PAIN1",
196 	"BOTH_PAIN2",
197 	"BOTH_PAIN3",
198 	"BOTH_PAIN4",
199 	"BOTH_PAIN5",
200 	"BOTH_PAIN6",
201 	"BOTH_PAIN7",
202 	"BOTH_PAIN8",
203 
204 	"BOTH_GRAB_GRENADE",
205 
206 	"BOTH_ATTACK1",
207 	"BOTH_ATTACK2",
208 	"BOTH_ATTACK3",
209 	"BOTH_ATTACK4",
210 	"BOTH_ATTACK5",
211 
212 	"BOTH_EXTRA1",
213 	"BOTH_EXTRA2",
214 	"BOTH_EXTRA3",
215 	"BOTH_EXTRA4",
216 	"BOTH_EXTRA5",
217 	"BOTH_EXTRA6",
218 	"BOTH_EXTRA7",
219 	"BOTH_EXTRA8",
220 	"BOTH_EXTRA9",
221 	"BOTH_EXTRA10",
222 	"BOTH_EXTRA11",
223 	"BOTH_EXTRA12",
224 	"BOTH_EXTRA13",
225 	"BOTH_EXTRA14",
226 	"BOTH_EXTRA15",
227 	"BOTH_EXTRA16",
228 	"BOTH_EXTRA17",
229 	"BOTH_EXTRA18",
230 	"BOTH_EXTRA19",
231 	"BOTH_EXTRA20",
232 
233 	"TORSO_GESTURE",
234 	"TORSO_GESTURE2",
235 	"TORSO_GESTURE3",
236 	"TORSO_GESTURE4",
237 
238 	"TORSO_DROP",
239 
240 	"TORSO_RAISE",   // (low)
241 	"TORSO_ATTACK",
242 	"TORSO_STAND",
243 	"TORSO_STAND_ALT1",
244 	"TORSO_STAND_ALT2",
245 	"TORSO_READY",
246 	"TORSO_RELAX",
247 
248 	"TORSO_RAISE2",  // (high)
249 	"TORSO_ATTACK2",
250 	"TORSO_STAND2",
251 	"TORSO_STAND2_ALT1",
252 	"TORSO_STAND2_ALT2",
253 	"TORSO_READY2",
254 	"TORSO_RELAX2",
255 
256 	"TORSO_RAISE3",  // (pistol)
257 	"TORSO_ATTACK3",
258 	"TORSO_STAND3",
259 	"TORSO_STAND3_ALT1",
260 	"TORSO_STAND3_ALT2",
261 	"TORSO_READY3",
262 	"TORSO_RELAX3",
263 
264 	"TORSO_RAISE4",  // (shoulder)
265 	"TORSO_ATTACK4",
266 	"TORSO_STAND4",
267 	"TORSO_STAND4_ALT1",
268 	"TORSO_STAND4_ALT2",
269 	"TORSO_READY4",
270 	"TORSO_RELAX4",
271 
272 	"TORSO_RAISE5",  // (throw)
273 	"TORSO_ATTACK5",
274 	"TORSO_ATTACK5B",
275 	"TORSO_STAND5",
276 	"TORSO_STAND5_ALT1",
277 	"TORSO_STAND5_ALT2",
278 	"TORSO_READY5",
279 	"TORSO_RELAX5",
280 
281 	"TORSO_RELOAD1", // (low)
282 	"TORSO_RELOAD2", // (high)
283 	"TORSO_RELOAD3", // (pistol)
284 	"TORSO_RELOAD4", // (shoulder)
285 
286 	"TORSO_MG42",        // firing tripod mounted weapon animation
287 
288 	"TORSO_MOVE",        // torso anim to play while moving and not firing (swinging arms type thing)
289 	"TORSO_MOVE_ALT",        // torso anim to play while moving and not firing (swinging arms type thing)
290 
291 	"TORSO_EXTRA",
292 	"TORSO_EXTRA2",
293 	"TORSO_EXTRA3",
294 	"TORSO_EXTRA4",
295 	"TORSO_EXTRA5",
296 	"TORSO_EXTRA6",
297 	"TORSO_EXTRA7",
298 	"TORSO_EXTRA8",
299 	"TORSO_EXTRA9",
300 	"TORSO_EXTRA10",
301 
302 	"LEGS_WALKCR",
303 	"LEGS_WALKCR_BACK",
304 	"LEGS_WALK",
305 	"LEGS_RUN",
306 	"LEGS_BACK",
307 	"LEGS_SWIM",
308 	"LEGS_SWIM_IDLE",
309 
310 	"LEGS_JUMP",
311 	"LEGS_JUMPB",
312 	"LEGS_LAND",
313 
314 	"LEGS_IDLE",
315 	"LEGS_IDLE_ALT", //	"LEGS_IDLE2"
316 	"LEGS_IDLECR",
317 
318 	"LEGS_TURN",
319 
320 	"LEGS_BOOT",     // kicking animation
321 
322 	"LEGS_EXTRA1",
323 	"LEGS_EXTRA2",
324 	"LEGS_EXTRA3",
325 	"LEGS_EXTRA4",
326 	"LEGS_EXTRA5",
327 	"LEGS_EXTRA6",
328 	"LEGS_EXTRA7",
329 	"LEGS_EXTRA8",
330 	"LEGS_EXTRA9",
331 	"LEGS_EXTRA10",
332 };
333 
334 
335 // old
336 char *animStringsOld[] = {
337 	"BOTH_DEATH1",
338 	"BOTH_DEAD1",
339 	"BOTH_DEATH2",
340 	"BOTH_DEAD2",
341 	"BOTH_DEATH3",
342 	"BOTH_DEAD3",
343 
344 	"BOTH_CLIMB",
345 	"BOTH_CLIMB_DOWN",
346 	"BOTH_CLIMB_DISMOUNT",
347 
348 	"BOTH_SALUTE",
349 
350 	"BOTH_PAIN1",
351 	"BOTH_PAIN2",
352 	"BOTH_PAIN3",
353 	"BOTH_PAIN4",
354 	"BOTH_PAIN5",
355 	"BOTH_PAIN6",
356 	"BOTH_PAIN7",
357 	"BOTH_PAIN8",
358 
359 	"BOTH_EXTRA1",
360 	"BOTH_EXTRA2",
361 	"BOTH_EXTRA3",
362 	"BOTH_EXTRA4",
363 	"BOTH_EXTRA5",
364 
365 	"TORSO_GESTURE",
366 	"TORSO_GESTURE2",
367 	"TORSO_GESTURE3",
368 	"TORSO_GESTURE4",
369 
370 	"TORSO_DROP",
371 
372 	"TORSO_RAISE",   // (low)
373 	"TORSO_ATTACK",
374 	"TORSO_STAND",
375 	"TORSO_READY",
376 	"TORSO_RELAX",
377 
378 	"TORSO_RAISE2",  // (high)
379 	"TORSO_ATTACK2",
380 	"TORSO_STAND2",
381 	"TORSO_READY2",
382 	"TORSO_RELAX2",
383 
384 	"TORSO_RAISE3",  // (pistol)
385 	"TORSO_ATTACK3",
386 	"TORSO_STAND3",
387 	"TORSO_READY3",
388 	"TORSO_RELAX3",
389 
390 	"TORSO_RAISE4",  // (shoulder)
391 	"TORSO_ATTACK4",
392 	"TORSO_STAND4",
393 	"TORSO_READY4",
394 	"TORSO_RELAX4",
395 
396 	"TORSO_RAISE5",  // (throw)
397 	"TORSO_ATTACK5",
398 	"TORSO_ATTACK5B",
399 	"TORSO_STAND5",
400 	"TORSO_READY5",
401 	"TORSO_RELAX5",
402 
403 	"TORSO_RELOAD1", // (low)
404 	"TORSO_RELOAD2", // (high)
405 	"TORSO_RELOAD3", // (pistol)
406 	"TORSO_RELOAD4", // (shoulder)
407 
408 	"TORSO_MG42",        // firing tripod mounted weapon animation
409 
410 	"TORSO_MOVE",        // torso anim to play while moving and not firing (swinging arms type thing)
411 
412 	"TORSO_EXTRA2",
413 	"TORSO_EXTRA3",
414 	"TORSO_EXTRA4",
415 	"TORSO_EXTRA5",
416 
417 	"LEGS_WALKCR",
418 	"LEGS_WALKCR_BACK",
419 	"LEGS_WALK",
420 	"LEGS_RUN",
421 	"LEGS_BACK",
422 	"LEGS_SWIM",
423 
424 	"LEGS_JUMP",
425 	"LEGS_LAND",
426 
427 	"LEGS_IDLE",
428 	"LEGS_IDLE2",
429 	"LEGS_IDLECR",
430 
431 	"LEGS_TURN",
432 
433 	"LEGS_BOOT",     // kicking animation
434 
435 	"LEGS_EXTRA1",
436 	"LEGS_EXTRA2",
437 	"LEGS_EXTRA3",
438 	"LEGS_EXTRA4",
439 	"LEGS_EXTRA5",
440 };
441 
442 /*QUAKED item_***** ( 0 0 0 ) (-16 -16 -16) (16 16 16) SUSPENDED SPIN PERSISTANT
443 DO NOT USE THIS CLASS, IT JUST HOLDS GENERAL INFORMATION.
444 SUSPENDED - will allow items to hang in the air, otherwise they are dropped to the next surface.
445 SPIN - will allow items to spin in place.
446 PERSISTANT - some items (ex. clipboards) can be picked up, but don't disappear
447 
448 If an item is the target of another entity, it will not spawn in until fired.
449 
450 An item fires all of its targets when it is picked up.  If the toucher can't carry it, the targets won't be fired.
451 
452 "notfree" if set to 1, don't spawn in free for all games
453 "notteam" if set to 1, don't spawn in team games
454 "notsingle" if set to 1, don't spawn in single player games
455 "wait"	override the default wait before respawning.  -1 = never respawn automatically, which can be used with targeted spawning.
456 "random" random number of plus or minus seconds varied from the respawn time
457 "count" override quantity or duration on most items.
458 "stand" if the item has a stand (ex: mp40_stand.md3) this specifies which stand tag to attach the weapon to ("stand":"4" would mean "tag_stand4" for example)  only weapons support stands currently
459 */
460 
461 // JOSEPH 5-2-00
462 //----(SA) the addition of the 'ammotype' field was added by me, not removed by id (SA)
463 gitem_t bg_itemlist[] =
464 {
465 	{
466 		NULL,
467 		NULL,
468 		{ NULL,
469 		  NULL,
470 		  0, 0, 0},
471 		NULL,   // icon
472 		NULL,   // ammo icon
473 		NULL,   // pickup
474 		0,
475 		0,
476 		0,
477 		0,          // ammotype
478 		0,          // cliptype
479 		"",          // precache
480 		"",          // sounds
481 		{0,0,0,0}
482 	},  // leave index 0 alone
483 
484 
485 
486 /*QUAKED item_clipboard (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN PERSISTANT
487 "model" - model to display in the world.  defaults to 'models/powerups/clipboard/clipboard.md3' (the clipboard laying flat is 'clipboard2.md3')
488 "popup" - menu to popup.  no default since you won't want the same clipboard laying around. (clipboard will display a 'put popup here' message)
489 "notebookpage" - when clipboard is picked up, this page (menu) will be added to your notebook (FIXME: TODO: more info goes here)
490 
491 We currently use:
492 clip_interrogation
493 clip_codeddispatch
494 clip_alertstatus
495 
496 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
497 model="models/powerups/clipboard/clipboard.md3"
498 */
499 /*
500 "scriptName"
501 */
502 	{
503 		"item_clipboard",
504 		"sound/pickup/armor/body_pickup.wav",
505 		{   "models/powerups/clipboard/clipboard.md3",
506 			0,
507 			0,
508 			0, 0 },
509 		"icons/iconh_small",
510 		NULL,                   // ammo icon
511 		"",
512 		1,
513 		IT_CLIPBOARD,
514 		0,
515 		0,
516 		0,
517 		"",
518 		"",
519 		{0,0,0,0}
520 	},
521 
522 /*QUAKED item_treasure (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN
523 Items the player picks up that are just used to tally a score at end-level
524 "model" defaults to 'models/powerups/treasure/goldbar.md3'
525 "noise" sound to play on pickup.  defaults to 'sound/pickup/treasure/gold.wav'
526 "message" what to call the item when it's picked up.  defaults to "Treasure Item" (SA: temp)
527 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
528 model="models/powerups/treasure/goldbar.md3"
529 */
530 /*
531 "scriptName"
532 */
533 	{
534 		"item_treasure",
535 		"sound/pickup/treasure/gold.wav",
536 		{   "models/powerups/treasure/goldbar.md3",
537 			0,
538 			0,
539 			0, 0 },
540 		"icons/iconh_small", // (SA) placeholder
541 		NULL,                   // ammo icon
542 		"Treasure Item",     // (SA) placeholder
543 		5,
544 		IT_TREASURE,
545 		0,
546 		0,
547 		0,
548 		"",
549 		"",
550 		{0,0,0,0}
551 	},
552 
553 
554 	//
555 	// ARMOR/HEALTH/STAMINA
556 	//
557 
558 
559 /*QUAKED item_health_small (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
560 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
561 model="models/powerups/health/health_s.md3"
562 */
563 	{
564 		"item_health_small",
565 		"sound/pickup/health/health_pickup.wav",
566 		{   "models/powerups/health/health_s.md3",
567 			0,
568 			0, 0,  0 },
569 		"icons/iconh_small",
570 		NULL,   // ammo icon
571 		"Small Health",
572 		5,
573 		IT_HEALTH,
574 		0,
575 		0,
576 		0,
577 		"",
578 		"",
579 		{10,10,5,5}
580 	},
581 
582 /*QUAKED item_health (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
583 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
584 model="models/powerups/health/health_m.md3"
585 */
586 	{
587 		"item_health",
588 		"sound/pickup/health/health_pickup.wav",
589 		{   "models/powerups/health/health_m.md3",
590 			0,
591 			0, 0,  0 },
592 		"icons/iconh_med",
593 		NULL,   // ammo icon
594 		"Med Health",
595 		25,
596 		IT_HEALTH,
597 		0,
598 		0,
599 		0,
600 		"",
601 		"",
602 		{25,25,15,15}
603 	},
604 
605 /*QUAKED item_health_large (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
606 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
607 model="models/powerups/health/health_l.md3"
608 */
609 	{
610 		"item_health_large",
611 		"sound/pickup/health/health_pickup.wav",
612 		{   "models/powerups/health/health_l.md3",
613 			0, 0, 0,   0 },
614 		"icons/iconh_large",
615 		NULL,   // ammo icon
616 		"Large Health",
617 		50,
618 		IT_HEALTH,
619 		0,
620 		0,
621 		0,
622 		"",
623 		"",
624 		{50,50,30,20}
625 	},
626 
627 /*QUAKED item_health_turkey (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
628 multi-stage health item.
629 gives amount on first use based on skill:
630 skill 1: 50
631 skill 2: 50
632 skill 3: 50
633 skill 4: 40
634 skill 5: 30
635 
636 then gives 15 on "finishing up"
637 
638 player will only eat what he needs.  health at 90, turkey fills up and leaves remains (leaving 15).  health at 5 you eat the whole thing.
639 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
640 model="models/powerups/health/health_t1.md3"
641 */
642 	{
643 		"item_health_turkey",
644 		"sound/pickup/health/hot_pickup.wav",
645 		{   "models/powerups/health/health_t3.md3",  // just plate (should now be destructable)
646 			"models/powerups/health/health_t2.md3",  // half eaten
647 			"models/powerups/health/health_t1.md3",  // whole turkey
648 			0, 0 },
649 		"icons/iconh_turkey",
650 		NULL,   // ammo icon
651 		"Hot Meal",
652 		15,                 // amount given in last stage
653 		IT_HEALTH,
654 		0,
655 		0,
656 		0,
657 		"",
658 		"",
659 		{45,35,25,15}   // amount given in first stage based on gameskill level
660 	},
661 
662 /*QUAKED item_health_breadandmeat (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
663 multi-stage health item.
664 gives amount on first use based on skill:
665 skill 1: 30
666 skill 2: 30
667 skill 3: 30
668 skill 4: 20
669 skill 5: 10
670 
671 then gives 10 on "finishing up"
672 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
673 model="models/powerups/health/health_b1.md3"
674 */
675 	{
676 		"item_health_breadandmeat",
677 		"sound/pickup/health/cold_pickup.wav",
678 		{   "models/powerups/health/health_b3.md3",  // just plate (should now be destructable)
679 			"models/powerups/health/health_b2.md3",  // half eaten
680 			"models/powerups/health/health_b1.md3",  // whole turkey
681 			0, 0 },
682 		"icons/iconh_breadandmeat",
683 		NULL,   // ammo icon
684 		"Cold Meal",
685 		10,                 // amount given in last stage
686 		IT_HEALTH,
687 		0,
688 		0,
689 		0,
690 		"",
691 		"",
692 		{30,30,20,15}   // amount given in first stage based on gameskill level
693 	},
694 
695 /*QUAKED item_health_wall_box (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED - - RESPAWN
696 single use health with dual state model.
697 please set the suspended flag to keep it from falling on the ground
698 defaults to 50 pts health
699 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
700 model="models/powerups/health/health_wallbox.md3"
701 */
702 	{
703 		"item_health_wall_box",
704 		"sound/pickup/health/health_pickup.wav",
705 		{   "models/powerups/health/health_wallbox2.md3",
706 			"models/powerups/health/health_wallbox1.md3",
707 			0, 0, 0},
708 		"icons/iconh_wall",
709 		NULL,   // ammo icon
710 		"Health",
711 		25,
712 		IT_HEALTH,
713 		0,
714 		0,
715 		0,
716 		"",
717 		"",
718 		{25,25,25,25}
719 	},
720 
721 /*QUAKED item_health_wall (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED - - RESPAWN
722 defaults to 50 pts health
723 you will probably want to check the 'suspended' box to keep it from falling to the ground
724 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
725 model="models/powerups/health/health_w.md3"
726 */
727 	{
728 		"item_health_wall",
729 		"sound/pickup/health/health_pickup.wav",
730 		{   "models/powerups/health/health_w.md3",
731 			0, 0, 0,   0 },
732 		"icons/iconh_wall",
733 		NULL,   // ammo icon
734 		"Health",
735 		25,
736 		IT_HEALTH,
737 		0,
738 		0,
739 		0,
740 		"",
741 		"",
742 		{25,25,15,15}
743 	},
744 
745 	//
746 	// STAMINA
747 	//
748 
749 
750 /*QUAKED item_stamina_stein (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
751 defaults to 30 sec stamina boost
752 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
753 model="models/powerups/instant/stamina_stein.md3"
754 */
755 
756 	{
757 		"item_stamina_stein",
758 		"sound/pickup/health/stamina_pickup.wav",
759 		{   "models/powerups/instant/stamina_stein.md3",
760 			0, 0, 0,   0 },
761 		"icons/icons_stein",
762 		NULL,   // ammo icon
763 		"Stamina",
764 		25,
765 		IT_POWERUP,
766 		PW_NOFATIGUE,
767 		0,
768 		0,
769 		"",
770 		"",
771 		{30,25,20,15}
772 	},
773 
774 
775 /*QUAKED item_stamina_brandy (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
776 defaults to 30 sec stamina boost
777 
778 multi-stage health item.
779 gives amount on first use based on skill:
780 skill 1: 50
781 skill 2: 50
782 skill 3: 50
783 skill 4: 40
784 skill 5: 30
785 
786 then gives 15 on "finishing up"
787 
788 player will only eat what he needs.  health at 90, turkey fills up and leaves remains (leaving 15).  health at 5 you eat the whole thing.
789 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
790 model="models/powerups/instant/stamina_brandy1.md3"
791 */
792 
793 	{
794 		"item_stamina_brandy",
795 		"sound/sound/pickup/health/stamina_pickup.wav",
796 		{   "models/powerups/instant/stamina_brandy2.md3",
797 			"models/powerups/instant/stamina_brandy1.md3",
798 			0, 0,  0 },
799 		"icons/icons_brandy",
800 		NULL,   // ammo icon
801 		"Stamina",
802 		25,
803 		IT_POWERUP,
804 		PW_NOFATIGUE,
805 		0,
806 		0,
807 		"",
808 		"",
809 		{30,25,20,15}
810 	},
811 
812 
813 	//
814 	// ARMOR
815 	//
816 
817 
818 /*QUAKED item_armor_body (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
819 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
820 model="models/powerups/armor/armor_body1.md3"
821 */
822 	{
823 		"item_armor_body",
824 		"sound/pickup/armor/body_pickup.wav",
825 		{   "models/powerups/armor/armor_body1.md3",
826 			0, 0, 0,   0 },
827 		"icons/iconr_body",
828 		NULL,   // ammo icon
829 		"Flak Jacket",
830 		75,
831 		IT_ARMOR,
832 		0,
833 		0,
834 		0,
835 		"",
836 		"",
837 		{75,75,75,75}
838 	},
839 
840 /*QUAKED item_armor_body_hang (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED - - RESPAWN
841 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
842 model="models/powerups/armor/armor_body2.md3"
843 */
844 	{
845 		"item_armor_body_hang",
846 		"sound/pickup/armor/body_pickup.wav",
847 		{   "models/powerups/armor/armor_body2.md3",
848 			0, 0, 0,   0 },
849 		"icons/iconr_bodyh",
850 		NULL,   // ammo icon
851 		"Flak Jacket",
852 		75,
853 		IT_ARMOR,
854 		0,
855 		0,
856 		0,
857 		"",
858 		"",
859 		{75,75,75,75}
860 	},
861 
862 /*QUAKED item_armor_head (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
863 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
864 model="models/powerups/armor/armor_head1.md3"
865 */
866 	{
867 		"item_armor_head",
868 		"sound/pickup/armor/head_pickup.wav",
869 		{   "models/powerups/armor/armor_head1.md3",
870 			0, 0, 0,   0 },
871 		"icons/iconr_head",
872 		NULL,   // ammo icon
873 		"Armored Helmet",
874 		25,
875 		IT_ARMOR,
876 		0,
877 		0,
878 		0,
879 		"",
880 		"",
881 		{25,25,25,25}
882 	},
883 
884 
885 
886 	//
887 	// WEAPONS
888 	//
889 
890 /*
891 weapon_gauntlet
892 */
893 	{
894 		"weapon_gauntlet",
895 		"sound/misc/w_pkup.wav",
896 		{   "models/weapons2/gauntlet/gauntlet.md3",
897 			0, 0, 0,    0 },
898 		"",  // icon
899 		"icons/ammo1",           // ammo icon
900 		"Gauntlet",              // pickup
901 		0,
902 		IT_WEAPON,
903 		WP_GAUNTLET,
904 		WP_GAUNTLET,
905 		WP_GAUNTLET,
906 		"",                      // precache
907 		"",                      // sounds
908 		{0,0,0,0}
909 	},
910 
911 
912 
913 	// wolf weapons (SA)
914 
915 /*QUAKED weapon_knife (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
916 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
917 model="models/weapons2/knife/knife.md3"
918 */
919 	{
920 		"weapon_knife",
921 		"sound/misc/w_pkup.wav",
922 		{   "models/weapons2/knife/knife.md3",
923 			"models/weapons2/knife/v_knife.md3",
924 			"models/weapons2/knife/pu_knife.md3",
925 			0, 0 },
926 
927 		"icons/iconw_knife_1",   // icon
928 		"icons/ammo2",           // ammo icon
929 		"Knife",             // pickup
930 		50,
931 		IT_WEAPON,
932 		WP_KNIFE,
933 		WP_KNIFE,
934 		WP_KNIFE,
935 		"",                      // precache
936 		"",                      // sounds
937 		{0,0,0,0}
938 	},
939 
940 
941 /* weapon_knife2 (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
942 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
943 model="models/weapons2/knife2/knife2.md3"
944 */
945 /*
946 	{
947 		"weapon_knife2",
948 		"sound/misc/w_pkup.wav",
949 		{	"models/weapons2/knife2/knife2.md3",
950 			"models/weapons2/knife2/v_knife2.md3",
951 			"models/weapons2/knife2/pu_knife2.md3",
952 			0, 0 },
953 
954 		"icons/iconw_knife2_1",	// icon
955 		"icons/ammo2",			// ammo icon
956 		"Other Knife",			// pickup
957 		50,
958 		IT_WEAPON,
959 		WP_KNIFE2,
960 		WP_KNIFE2,
961 		WP_KNIFE2,
962 		"",						// precache
963 		"",						// sounds
964 		{0,0,0,0}
965 	},
966 */
967 
968 
969 /*QUAKED weapon_luger (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
970 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
971 model="models/weapons2/luger/luger.md3"
972 */
973 	{
974 		"weapon_luger",
975 		"sound/misc/w_pkup.wav",
976 		{   "models/weapons2/luger/luger.md3",
977 			"models/weapons2/luger/v_luger.md3",
978 			"models/weapons2/luger/pu_luger.md3",
979 			0, 0 },
980 
981 		"icons/iconw_luger_1",   // icon
982 		"icons/ammo2",           // ammo icon
983 		"Luger",             // pickup
984 		50,
985 		IT_WEAPON,
986 		WP_LUGER,
987 		WP_LUGER,
988 		WP_LUGER,
989 		"",                      // precache
990 		"",                      // sounds
991 		{0,0,0,0}
992 	},
993 
994 
995 /*QUAKED weapon_mauserRifle (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
996 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
997 model="models/weapons2/mauser/mauser.md3"
998 */
999 	{
1000 		"weapon_mauserRifle",
1001 		"sound/misc/w_pkup.wav",
1002 		{   "models/weapons2/mauser/mauser.md3",
1003 			"models/weapons2/mauser/v_mauser.md3",
1004 			"models/weapons2/mauser/pu_mauser.md3",
1005 			0, 0  },
1006 
1007 		"icons/iconw_mauser_1",  // icon
1008 		"icons/ammo3",           // ammo icon
1009 		"Mauser Rifle",          // pickup
1010 		50,
1011 		IT_WEAPON,
1012 		WP_MAUSER,
1013 		WP_MAUSER,
1014 		WP_MAUSER,
1015 		"",                      // precache
1016 		"",                      // sounds
1017 		{0,0,0,0}
1018 	},
1019 
1020 /*QUAKED weapon_thompson (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1021 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1022 model="models/weapons2/thompson/thompson.md3"
1023 */
1024 	{
1025 		"weapon_thompson",
1026 		"sound/misc/w_pkup.wav",
1027 		{   "models/weapons2/thompson/thompson.md3",
1028 			"models/weapons2/thompson/v_thompson.md3",
1029 			"models/weapons2/thompson/pu_thompson.md3",
1030 			0, 0 },
1031 
1032 		"icons/iconw_thompson_1",    // icon
1033 		"icons/ammo2",           // ammo icon
1034 		"Thompson",              // pickup
1035 		30,
1036 		IT_WEAPON,
1037 		WP_THOMPSON,
1038 		WP_COLT,
1039 		WP_THOMPSON,
1040 		"",                  // precache
1041 		"",                  // sounds
1042 		{0,0,0,0}
1043 	},
1044 
1045 /*QUAKED weapon_sten (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1046 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1047 model="models/weapons2/sten/sten.md3"
1048 */
1049 	{
1050 		"weapon_sten",
1051 		"sound/misc/w_pkup.wav",
1052 		{   "models/weapons2/sten/sten.md3",
1053 			"models/weapons2/sten/v_sten.md3",
1054 			"models/weapons2/sten/pu_sten.md3",
1055 			0,0 },
1056 		"icons/iconw_sten_1",    // icon
1057 		"icons/ammo2",           // ammo icon
1058 		"Sten",                  // pickup
1059 		30,
1060 		IT_WEAPON,
1061 		WP_STEN,
1062 		WP_LUGER,
1063 		WP_STEN,
1064 		"",                  // precache
1065 		"",                  // sounds
1066 		{0,0,0,0}
1067 	},
1068 
1069 /*weapon_akimbo
1070 dual colts
1071 */
1072 	{
1073 		"weapon_akimbo",
1074 		"sound/misc/w_pkup.wav",
1075 		{   "models/weapons2/colt2/colt2.md3",
1076 			"models/weapons2/colt2/v_colt2.md3",
1077 			"models/weapons2/colt2/pu_colt2.md3",
1078 			0, 0 },
1079 
1080 		"icons/iconw_colt_1",    // icon
1081 		"icons/ammo2",           // ammo icon
1082 		"Dual Colts",            // pickup
1083 		50,
1084 		IT_WEAPON,
1085 		WP_AKIMBO,
1086 		WP_COLT,
1087 //		WP_COLT,
1088 		WP_AKIMBO,
1089 		"",                      // precache
1090 		"",                      // sounds
1091 		{0,0,0,0}
1092 	},
1093 
1094 /*QUAKED weapon_colt (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1095 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1096 model="models/weapons2/colt/colt.md3"
1097 */
1098 	{
1099 		"weapon_colt",
1100 		"sound/misc/w_pkup.wav",
1101 		{   "models/weapons2/colt/colt.md3",
1102 			"models/weapons2/colt/v_colt.md3",
1103 			"models/weapons2/colt/pu_colt.md3",
1104 			0, 0 },
1105 
1106 		"icons/iconw_colt_1",    // icon
1107 		"icons/ammo2",           // ammo icon
1108 		"Colt",                  // pickup
1109 		50,
1110 		IT_WEAPON,
1111 		WP_COLT,
1112 		WP_COLT,
1113 		WP_COLT,
1114 		"",                      // precache
1115 		"",                      // sounds
1116 		{0,0,0,0}
1117 	},
1118 
1119 
1120 // (SA) snooper is the parent, so 'garand' is no longer available as a stand-alone weap w/ an optional scope
1121 /*
1122 weapon_garandRifle (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1123 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1124 model="models/weapons2/garand/garand.md3"
1125 */
1126 	{
1127 		"NOT_weapon_garandRifle",    //----(SA)	modified so it can no longer be given individually
1128 		"sound/misc/w_pkup.wav",
1129 		{   "models/weapons2/garand/garand.md3",
1130 			"models/weapons2/garand/v_garand.md3",
1131 			"models/weapons2/garand/pu_garand.md3",
1132 			0, 0 },
1133 
1134 		"icons/iconw_garand_1",  // icon
1135 		"icons/ammo3",           // ammo icon
1136 		"",                      // pickup			//----(SA)	modified so it can no longer be given individually
1137 		50,
1138 		IT_WEAPON,
1139 		WP_GARAND,
1140 		WP_GARAND,
1141 		WP_GARAND,
1142 		"",                      // precache
1143 		"",                      // sounds
1144 		{0,0,0,0}
1145 	},
1146 
1147 /*QUAKED weapon_mp40 (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1148 "stand" values:
1149 	no value:	laying in a default position on it's side (default)
1150 	2:			upright, barrel pointing up, slightly angled (rack mount)
1151 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1152 model="models\weapons2\mp40\mp40.md3"
1153 */
1154 	{
1155 		"weapon_mp40",
1156 		"sound/misc/w_pkup.wav",
1157 		{   "models/weapons2/mp40/mp40.md3",
1158 			"models/weapons2/mp40/v_mp40.md3",
1159 			"models/weapons2/mp40/pu_mp40.md3",
1160 			0, 0 },
1161 
1162 		"icons/iconw_mp40_1",    // icon
1163 		"icons/ammo2",       // ammo icon
1164 		"MP40",              // pickup
1165 		30,
1166 		IT_WEAPON,
1167 		WP_MP40,
1168 		WP_LUGER,
1169 		WP_MP40,
1170 		"",                  // precache
1171 		"",                  // sounds
1172 		{0,0,0,0}
1173 	},
1174 
1175 
1176 
1177 /*QUAKED weapon_fg42 (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1178 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1179 model="models/weapons2/fg42/fg42.md3"
1180 */
1181 	{
1182 		"weapon_fg42",
1183 		"sound/misc/w_pkup.wav",
1184 		{   "models/weapons2/fg42/fg42.md3",
1185 			"models/weapons2/fg42/v_fg42.md3",
1186 			"models/weapons2/fg42/pu_fg42.md3",
1187 			0, 0 },
1188 
1189 		"icons/iconw_fg42_1",    // icon
1190 		"icons/ammo5",          // ammo icon
1191 		"FG42 Paratroop Rifle",      // pickup
1192 		10,
1193 		IT_WEAPON,
1194 		WP_FG42,
1195 		WP_MAUSER,
1196 		WP_FG42,
1197 		"",                  // precache
1198 		"",                  // sounds
1199 		{0,0,0,0}
1200 	},
1201 
1202 //----(SA)	added
1203 
1204 /* weapon_bar (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1205 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1206 model="models/weapons2/bar/bar.md3"
1207 */
1208 /*
1209 	{
1210 		"weapon_bar",
1211 		"sound/misc/w_pkup.wav",
1212 		{	"models/weapons2/bar/bar.md3",
1213 			"models/weapons2/bar/v_bar.md3",
1214 			"models/weapons2/bar/pu_bar.md3",
1215 			0, 0 },
1216 
1217 		"icons/iconw_bar_1",	// icon
1218 			"icons/ammo5",		// ammo icon
1219 		"BAR",		// pickup
1220 		10,
1221 		IT_WEAPON,
1222 		WP_BAR,
1223 		WP_BAR,
1224 		WP_BAR,
1225 		"",					// precache
1226 		"",					// sounds
1227 		{0,0,0,0}
1228 	},
1229 
1230 */
1231 /* weapon_bar2
1232 */
1233 /*
1234 	{
1235 		"weapon_bar2",
1236 		"sound/misc/w_pkup.wav",
1237 		{	"models/weapons2/bar/bar.md3",
1238 			"models/weapons2/bar/v_bar.md3",
1239 			"models/weapons2/bar/pu_bar.md3",
1240 			0, 0 },
1241 
1242 		"icons/iconw_bar_1",	// icon
1243 			"icons/ammo5",		// ammo icon
1244 		"BAR",		// pickup
1245 		10,
1246 		IT_WEAPON,
1247 		WP_BAR2,
1248 		WP_BAR,
1249 		WP_BAR,
1250 		"",					// precache
1251 		"",					// sounds
1252 		{0,0,0,0}
1253 	},
1254 */
1255 
1256 //----(SA)	end
1257 
1258 
1259 //----(SA)	modified sp5 to be silencer mod for luger
1260 /*QUAKED weapon_silencer (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1261 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1262 model="models/weapons2/sp5/sp5.md3"
1263 */
1264 	{
1265 		"weapon_silencer",
1266 		"sound/misc/w_pkup.wav",
1267 		{   "models/weapons2/silencer/silencer.md3", //----(SA)	changed 10/25
1268 			"models/weapons2/silencer/v_silencer.md3",
1269 			"models/weapons2/silencer/pu_silencer.md3",
1270 			0, 0},
1271 
1272 		"icons/iconw_silencer_1",    // icon
1273 		"icons/ammo5",       // ammo icon
1274 //		"Silencer",		// pickup
1275 		"sp5 pistol",
1276 		10,
1277 		IT_WEAPON,
1278 		WP_SILENCER,
1279 		WP_LUGER,
1280 		WP_LUGER,
1281 		"",                  // precache
1282 		"",                  // sounds
1283 		{0,0,0,0}
1284 	},
1285 
1286 /*QUAKED weapon_panzerfaust (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1287 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1288 model="models/weapons2/panzerfaust/pf.md3"
1289 */
1290 	{
1291 		"weapon_panzerfaust",
1292 		"sound/misc/w_pkup.wav",
1293 		{   "models/weapons2/panzerfaust/pf.md3",
1294 			"models/weapons2/panzerfaust/v_pf.md3",
1295 			"models/weapons2/panzerfaust/pu_pf.md3",
1296 			0, 0 },
1297 
1298 		"icons/iconw_panzerfaust_1", // icon
1299 		"icons/ammo6",       // ammo icon
1300 		"Panzerfaust",               // pickup
1301 		1,
1302 		IT_WEAPON,
1303 		WP_PANZERFAUST,
1304 		WP_PANZERFAUST,
1305 		WP_PANZERFAUST,
1306 		"",                      // precache
1307 		"",                      // sounds
1308 		{0,0,0,0}
1309 	},
1310 
1311 /* weapon_rocketlauncher (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1312 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1313 model="models/weapons2/rocketl/rocketl.md3"
1314 */
1315 /*
1316 	{
1317 		"weapon_rocketlauncher",
1318 		"sound/misc/w_pkup.wav",
1319 		{	"models/weapons2/rocketl/rocketl.md3",
1320 			"models/weapons2/rocketl/v_rocketl.md3",
1321 			"models/weapons2/rocketl/pu_rocketl.md3",
1322 			0, 0 },
1323 
1324 		"icons/iconw_rocket_1",	// icon
1325 		"icons/ammo6",		// ammo icon
1326 		"Bazooka",				// pickup
1327 		5,
1328 		IT_WEAPON,
1329 		WP_ROCKET_LAUNCHER,
1330 		WP_ROCKET_LAUNCHER,
1331 		WP_ROCKET_LAUNCHER,
1332 		"",						// precache
1333 		"",						// sounds
1334 		{0,0,0,0}
1335 	},
1336 */
1337 
1338 /* weapon_proxlauncher (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1339 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1340 model="models/weapons2/prox/prox.md3"
1341 */
1342 
1343 /*
1344 	{
1345 		"weapon_proxlauncher",
1346 		"sound/misc/w_pkup.wav",
1347 		{	"models/weapons2/rocketl/rocketl.md3",
1348 			"models/weapons2/rocketl/v_rocketl.md3",
1349 			"models/weapons2/rocketl/pu_rocketl.md3",
1350 			0, 0 },
1351 
1352 		"icons/iconw_rocket_1",	// icon
1353 		"icons/ammo6",		// ammo icon
1354 		"Bazooka",				// pickup
1355 		5,
1356 		IT_WEAPON,
1357 		WP_PROX,
1358 		WP_PROX,
1359 		WP_PROX,
1360 		"",						// precache
1361 		"",						// sounds
1362 		{0,0,0,0}
1363 	},
1364 */
1365 
1366 //----(SA)	removed the quaked for this.  we don't actually have a grenade launcher as such.  It's given implicitly
1367 //			by virtue of getting grenade ammo.  So we don't need to have them in maps
1368 /*
1369 weapon_grenadelauncher
1370 */
1371 	{
1372 		"weapon_grenadelauncher",
1373 		"sound/misc/w_pkup.wav",
1374 		{   "models/weapons2/grenade/grenade.md3",
1375 			"models/weapons2/grenade/v_grenade.md3",
1376 			"models/weapons2/grenade/pu_grenade.md3",
1377 			0, 0 },
1378 
1379 		"icons/iconw_grenade_1", // icon
1380 		"icons/icona_grenade",   // ammo icon
1381 		"Grenade",               // pickup
1382 		6,
1383 		IT_WEAPON,
1384 		WP_GRENADE_LAUNCHER,
1385 		WP_GRENADE_LAUNCHER,
1386 		WP_GRENADE_LAUNCHER,
1387 		"",                      // precache
1388 		"sound/weapons/grenade/hgrenb1a.wav sound/weapons/grenade/hgrenb2a.wav",             // sounds
1389 		{0,0,0,0}
1390 	},
1391 
1392 /*
1393 weapon_grenadePineapple
1394 */
1395 	{
1396 		"weapon_grenadepineapple",
1397 		"sound/misc/w_pkup.wav",
1398 		{   "models/weapons2/grenade/pineapple.md3",
1399 			"models/weapons2/grenade/v_pineapple.md3",
1400 			"models/weapons2/grenade/pu_pineapple.md3",
1401 			0, 0 },
1402 
1403 		"icons/iconw_pineapple_1",   // icon
1404 		"icons/icona_pineapple", // ammo icon
1405 		"Pineapple",             // pickup
1406 		6,
1407 		IT_WEAPON,
1408 		WP_GRENADE_PINEAPPLE,
1409 		WP_GRENADE_PINEAPPLE,
1410 		WP_GRENADE_PINEAPPLE,
1411 		"",                      // precache
1412 		"sound/weapons/grenade/hgrenb1a.wav sound/weapons/grenade/hgrenb2a.wav",             // sounds
1413 		{0,0,0,0}
1414 	},
1415 
1416 /* JPW NERVE
1417 weapon_grenadesmoke
1418 */
1419 /*	// just commented out to remove the registration errors in SP (we register every weapon in every map in SP)
1420 	{
1421 		"weapon_grenadesmoke",
1422 		"sound/misc/w_pkup.wav",
1423 		{	"models/multiplayer/smokegrenade/smokegrenade.md3",
1424 			"models/multiplayer/smokegrenade/v_smokegrenade.md3",
1425 			"models/multiplayer/smokegrenade/pu_smokegrenade.md3",
1426 			0, 0},
1427 
1428 		"icons/iconw_smokegrenade_1",	// icon
1429 		"icons/ammo2",	// ammo icon
1430 		"smokeGrenade",				// pickup
1431 		50,
1432 		IT_WEAPON,
1433 		WP_GRENADE_SMOKE,
1434 		WP_GRENADE_SMOKE,
1435 		WP_GRENADE_SMOKE,
1436 		"",						// precache
1437 		"sound/weapons/grenade/hgrenb1a.wav sound/weapons/grenade/hgrenb2a.wav",				// sounds
1438 		{0,0,0,0}
1439 	},
1440 // jpw
1441 */
1442 // DHM - Nerve
1443 /*
1444 weapon_medic_heal
1445 */
1446 /*	{
1447 		"weapon_medic_heal",
1448 		"sound/misc/w_pkup.wav",
1449 		{	"models/multiplayer/medpack/medpack.md3",
1450 			"models/multiplayer/medpack/v_medpack.md3",
1451 			"models/multiplayer/medpack/pu_medpack.md3",
1452 			0, 0 },
1453 
1454 		"icons/iconw_medheal_1",	// icon
1455 		"icons/ammo2",			// ammo icon
1456 		"Medic Heal",			// pickup
1457 		50,
1458 		IT_WEAPON,
1459 		WP_MEDIC_HEAL,
1460 		WP_MEDIC_HEAL,
1461 		WP_MEDIC_HEAL,
1462 		"",						// precache
1463 		"",						// sounds
1464 		{0,0,0,0}
1465 	},
1466 // dhm
1467 */
1468 /*
1469 weapon_dynamite
1470 */
1471 	{
1472 		"weapon_dynamite",
1473 		"sound/misc/w_pkup.wav",
1474 		{   "models/weapons2/dynamite/dynamite.md3",
1475 			"models/weapons2/dynamite/v_dynamite.md3",
1476 			"models/weapons2/dynamite/pu_dynamite.md3",
1477 			0, 0 },
1478 
1479 		"icons/iconw_dynamite_1",    // icon
1480 		"icons/ammo9",           // ammo icon
1481 		"Dynamite Weapon",       // pickup
1482 		7,
1483 		IT_WEAPON,
1484 		WP_DYNAMITE,
1485 		WP_DYNAMITE,
1486 		WP_DYNAMITE,
1487 		"",                      // precache
1488 		"",                      // sounds
1489 		{0,0,0,0}
1490 	},
1491 
1492 
1493 /*
1494 weapon_dynamite2
1495 */
1496 /*
1497 	{
1498 		"weapon_dynamite2",
1499 		"sound/misc/w_pkup.wav",
1500 		{	"models/weapons2/dynamite/dynamite.md3",
1501 			"models/weapons2/dynamite/v_dynamite.md3",
1502 			"models/weapons2/dynamite/pu_dynamite.md3",
1503 			0, 0 },
1504 
1505 		"icons/iconw_dynamite_1",	// icon
1506 		"icons/ammo9",			// ammo icon
1507 		"Dynamite Weapon",		// pickup
1508 		7,
1509 		IT_WEAPON,
1510 		WP_DYNAMITE2,
1511 		WP_DYNAMITE,
1512 		WP_DYNAMITE,
1513 		"",						// precache
1514 		"",						// sounds
1515 		{0,0,0,0}
1516 	},
1517 */
1518 
1519 
1520 
1521 /*QUAKED weapon_venom (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1522 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1523 model="models/weapons2/venom/pu_venom.md3"
1524 */
1525 	{
1526 		"weapon_venom",
1527 		"sound/misc/w_pkup.wav",
1528 		{   "models/weapons2/venom/venom.md3",
1529 			"models/weapons2/venom/v_venom.md3",
1530 			"models/weapons2/venom/pu_venom.md3",
1531 			0, 0 },
1532 
1533 		"icons/iconw_venom_1",   // icon
1534 		"icons/ammo8",           // ammo icon
1535 		"Venom",             // pickup
1536 		700,
1537 		IT_WEAPON,
1538 		WP_VENOM,
1539 		WP_VENOM,
1540 		WP_VENOM,
1541 		"",                      // precache
1542 		"",                      // sounds
1543 		{0,0,0,0}
1544 	},
1545 
1546 /* weapon_venom_shotgun (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1547 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1548 model="models/weapons2/venom/pu_venom.md3"
1549 */
1550 /*
1551 	{
1552 		"weapon_venom_shotgun",
1553 		"sound/misc/w_pkup.wav",
1554 		{	"models/weapons2/venom/venom.md3",
1555 			"models/weapons2/venom/v_venom.md3",
1556 			"models/weapons2/venom/pu_venom.md3",
1557 			0, 0 },
1558 
1559 		"icons/iconw_venom_1",	// icon
1560 		"icons/ammo8",			// ammo icon
1561 		"Venom Shotgun",		// pickup
1562 		700,
1563 		IT_WEAPON,
1564 		WP_VENOM_FULL,
1565 		WP_VENOM,
1566 		WP_VENOM_FULL,
1567 		"",						// precache
1568 		"",						// sounds
1569 		{0,0,0,0}
1570 	},
1571 */
1572 
1573 /* weapon_cross(.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1574 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1575 model="models/weapons2/cross/cross.md3"
1576 */
1577 /*
1578 	{
1579 		"weapon_cross",
1580 		"sound/misc/w_pkup.wav",
1581 		{	"models/weapons2/cross/cross.md3",
1582 			"models/weapons2/cross/v_cross.md3",
1583 			"models/weapons2/cross/pu_cross.md3",
1584 			0, 0 },
1585 
1586 		"icons/iconw_cross_1",	// icon
1587 		"icons/ammo9",			// ammo icon
1588 		"This dont exist",	// pickup
1589 		7,
1590 		IT_WEAPON,
1591 		WP_CROSS,
1592 		WP_CROSS,
1593 		WP_CROSS,
1594 		"",						// precache
1595 		"",						// sounds
1596 		{0,0,0,0}
1597 	},
1598 */
1599 
1600 
1601 /*QUAKED weapon_flamethrower (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1602 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1603 model="models/weapons2/flamethrower/pu_flamethrower.md3"
1604 */
1605 	{
1606 		"weapon_flamethrower",
1607 		"sound/misc/w_pkup.wav",
1608 		{   "models/weapons2/flamethrower/flamethrower.md3",
1609 			"models/weapons2/flamethrower/v_flamethrower.md3",
1610 			"models/weapons2/flamethrower/pu_flamethrower.md3",
1611 			0, 0 },
1612 
1613 		"icons/iconw_flamethrower_1",    // icon
1614 		"icons/ammo10",              // ammo icon
1615 		"Flamethrower",              // pickup
1616 		200,
1617 		IT_WEAPON,
1618 		WP_FLAMETHROWER,
1619 		WP_FLAMETHROWER,
1620 		WP_FLAMETHROWER,
1621 		"",                          // precache
1622 		"",                          // sounds
1623 		{0,0,0,0}
1624 	},
1625 
1626 
1627 /*QUAKED weapon_tesla (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1628 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1629 model="models/weapons2/tesla/pu_tesla.md3"
1630 */
1631 	{
1632 		"weapon_tesla",
1633 		"sound/misc/w_pkup.wav",
1634 
1635 		{   "models/weapons2/tesla/tesla.md3",
1636 			"models/weapons2/tesla/v_tesla.md3",
1637 			"models/weapons2/tesla/pu_tesla.md3",
1638 			0, 0 },
1639 
1640 		"icons/iconw_tesla_1",   // icon
1641 		"icons/ammo10",              // ammo icon
1642 		"Tesla Gun",             // pickup
1643 		200,
1644 		IT_WEAPON,
1645 		WP_TESLA,
1646 		WP_TESLA,
1647 		WP_TESLA,
1648 		"",                          // precache
1649 		"",                          // sounds
1650 		{0,0,0,0}
1651 	},
1652 
1653 
1654 //----(SA)	new weaps
1655 
1656 /* weapon_speargun (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1657 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1658 model="models/weapons2/speargun/pu_speargun.md3"
1659 */
1660 /*
1661 	{
1662 		"weapon_speargun",
1663 		"sound/misc/w_pkup.wav",
1664 		{	"models/weapons2/speargun/speargun.md3",
1665 			"models/weapons2/speargun/v_speargun.md3",
1666 			"models/weapons2/speargun/pu_speargun.md3",
1667 			0, 0 },
1668 		"icons/iconw_speargun_1",	// icon
1669 		"icons/ammo10",				// ammo icon
1670 		"Speargun",					// pickup
1671 		50,
1672 		IT_WEAPON,
1673 		WP_SPEARGUN,
1674 		WP_SPEARGUN,
1675 		WP_SPEARGUN,
1676 		"",							// precache
1677 		"",							// sounds
1678 		{0,0,0,0}
1679 	},
1680 	*/
1681 
1682 /* weapon_speargun_c02 (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1683 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1684 model="models/weapons2/speargun/pu_speargun.md3"
1685 */
1686 /*
1687 	{
1688 		"weapon_speargun_co2",
1689 		"sound/misc/w_pkup.wav",
1690 		{	"models/weapons2/speargun/speargun.md3",
1691 			"models/weapons2/speargun/v_speargun.md3",
1692 			"models/weapons2/speargun/pu_speargun.md3",
1693 			0, 0 },
1694 
1695 		"icons/iconw_speargun_1",	// icon
1696 		"icons/ammo10",				// ammo icon
1697 		"CO2 Spears",					// pickup
1698 		50,
1699 		IT_WEAPON,
1700 		WP_SPEARGUN_CO2,
1701 		WP_SPEARGUN_CO2,
1702 		WP_SPEARGUN_CO2,
1703 		"",							// precache
1704 		"",							// sounds
1705 		{0,0,0,0}
1706 	},
1707 */
1708 
1709 /*QUAKED weapon_sniperScope (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1710 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1711 model="models/weapons2/mauser/pu_mauser_scope.md3"
1712 */
1713 	{
1714 		"weapon_sniperScope",
1715 		"sound/misc/w_pkup.wav",
1716 		{   "models/weapons2/mauser/mauser.md3",
1717 			"models/weapons2/mauser/v_mauser.md3",
1718 //			"models/weapons2/mauser/v_mauser_scope.md3",
1719 			"models/weapons2/mauser/pu_mauser_scope.md3",
1720 			0, 0 },
1721 
1722 //		"icons/iconw_sniper_1",	// icon
1723 		"icons/iconw_mauser_1",  // icon
1724 		"icons/ammo10",              // ammo icon
1725 		"Sniper Scope",              // pickup
1726 		200,
1727 		IT_WEAPON,
1728 		WP_SNIPERRIFLE,
1729 		WP_MAUSER,
1730 		WP_MAUSER,
1731 		"",                          // precache
1732 		"",                          // sounds
1733 		{0,0,0,0}
1734 	},
1735 
1736 /*QUAKED weapon_snooperrifle (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1737 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1738 model="models/weapons2/garand/garand.md3"
1739 */
1740 	{
1741 		"weapon_snooperrifle",   //----(SA)	modified
1742 		"sound/misc/w_pkup.wav",
1743 		{   "models/weapons2/garand/garand.md3",
1744 			"models/weapons2/garand/v_garand.md3",
1745 			"models/weapons2/garand/pu_garand.md3",
1746 			0, 0 },
1747 
1748 		"icons/iconw_garand_1",  // icon
1749 		"icons/ammo10",              // ammo icon
1750 		"Snooper Rifle",             // pickup		//----(SA)	modified
1751 		20,
1752 		IT_WEAPON,
1753 		WP_SNOOPERSCOPE,
1754 		WP_GARAND,
1755 		WP_GARAND,
1756 		"",                          // precache
1757 		"",                          // sounds
1758 		{0,0,0,0}
1759 	},
1760 
1761 /* weapon_fg42scope
1762 */
1763 	{
1764 		"weapon_fg42scope",  //----(SA)	modified
1765 		"sound/misc/w_pkup.wav",
1766 		{   "models/weapons2/fg42/fg42.md3",
1767 			"models/weapons2/fg42/v_fg42.md3",
1768 			"models/weapons2/fg42/pu_fg42.md3",
1769 			0, 0},
1770 
1771 		"icons/iconw_fg42_1",    // icon
1772 		"icons/ammo5",               // ammo icon
1773 		"FG42 Scope",                // pickup		//----(SA)	modified
1774 		0,
1775 		IT_WEAPON,
1776 		WP_FG42SCOPE,   // this weap
1777 		WP_MAUSER,      // shares ammo w/
1778 		WP_FG42,        // shares clip w/
1779 		"",                          // precache
1780 		"",                          // sounds
1781 		{0,0,0,0}
1782 	},
1783 
1784 
1785 // Ridah, need this for the scripting
1786 /*
1787 weapon_monster_attack1 (.3 .3 1) (-16 -16 -16) (16 16 16) suspended
1788 */
1789 	{
1790 		"weapon_monster_attack1",
1791 		"",
1792 		{   "",
1793 			"",
1794 			0, 0},
1795 		"",  // icon
1796 		NULL,   // ammo icon
1797 		"MonsterAttack1",            // pickup
1798 		100,
1799 		IT_WEAPON,
1800 		WP_MONSTER_ATTACK1,
1801 		WP_MONSTER_ATTACK1,         // ammo
1802 		WP_MONSTER_ATTACK1,         //
1803 		"",                          // precache
1804 		"",                          // sounds
1805 		{0,0,0,0}
1806 	},
1807 /*
1808 weapon_monster_attack2 (.3 .3 1) (-16 -16 -16) (16 16 16) suspended
1809 */
1810 	{
1811 		"weapon_monster_attack2",
1812 		"",
1813 		{   "",
1814 			"",
1815 			0, 0},
1816 		"",  // icon
1817 		NULL,   // ammo icon
1818 		"MonsterAttack2",            // pickup
1819 		100,
1820 		IT_WEAPON,
1821 		WP_MONSTER_ATTACK2,
1822 		WP_MONSTER_ATTACK2,         // ammo
1823 		WP_MONSTER_ATTACK2,         //
1824 		"",                          // precache
1825 		"",                          // sounds
1826 		{0,0,0,0}
1827 	},
1828 /*
1829 weapon_monster_attack3 (.3 .3 1) (-16 -16 -16) (16 16 16) suspended
1830 */
1831 	{
1832 		"weapon_monster_attack3",
1833 		"",
1834 		{   "",
1835 			"",
1836 			0, 0},
1837 		"",  // icon
1838 		NULL,   // ammo icon
1839 		"MonsterAttack3",            // pickup
1840 		100,
1841 		IT_WEAPON,
1842 		WP_MONSTER_ATTACK3,
1843 		WP_MONSTER_ATTACK3,         // ammo
1844 		WP_MONSTER_ATTACK3,
1845 		"",                          // precache
1846 		"",                          // sounds
1847 		{0,0,0,0}
1848 	},
1849 
1850 /*
1851 weapon_mortar (.3 .3 1) (-16 -16 -16) (16 16 16) suspended
1852 */
1853 	{
1854 		"weapon_mortar",
1855 		"sound/misc/w_pkup.wav",
1856 		{   "models/weapons2/grenade/grenade.md3",
1857 			"models/weapons2/grenade/v_grenade.md3",
1858 			"models/weapons2/grenade/pu_grenade.md3",
1859 			0, 0},
1860 		"icons/iconw_grenade_1", // icon
1861 		"icons/icona_grenade",   // ammo icon
1862 		"nopickup(WP_MORTAR)",       // pickup
1863 		6,
1864 		IT_WEAPON,
1865 		WP_MORTAR,
1866 		WP_MORTAR,
1867 		WP_MORTAR,
1868 		"",                      // precache
1869 		"sound/weapons/mortar/mortarf1.wav",             // sounds
1870 		{0,0,0,0}
1871 	},
1872 
1873 
1874 // JPW NERVE -- class-specific multiplayer weapon, can't be picked up, dropped, or placed in map
1875 /*
1876 weapon_class_special (.3 .3 1) (-16 -16 -16) (16 16 16) suspended
1877 */
1878 /*
1879 	{
1880 		"weapon_class_special",
1881 		"sound/misc/w_pkup.wav",
1882 		{	"models/multiplayer/hammer/hammer.md3",
1883 			"models/multiplayer/hammer/v_hammer.md3",
1884 			"models/multiplayer/hammer/pu_hammer.md3",
1885 			0, 0, },
1886 
1887 		"icons/iconw_hammer_1",	// icon
1888 		"icons/ammo2",			// ammo icon
1889 		"Special",				// pickup
1890 		50, // this should never be picked up
1891 		IT_WEAPON,
1892 		WP_CLASS_SPECIAL,
1893 		WP_CLASS_SPECIAL,
1894 		WP_CLASS_SPECIAL,
1895 		"",						// precache
1896 		"",						// sounds
1897 		{0,0,0,0}
1898 	},
1899 // jpw
1900 */
1901 
1902 
1903 
1904 
1905 	//
1906 	// AMMO ITEMS
1907 	//
1908 
1909 
1910 
1911 /*QUAKED ammo_9mm_small (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1912 used by: Luger pistol, MP40 machinegun
1913 
1914 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1915 model="models/powerups/ammo/am9mm_s.md3"
1916 */
1917 	{
1918 		"ammo_9mm_small",
1919 		"sound/misc/am_pkup.wav",
1920 		{ "models/powerups/ammo/am9mm_s.md3",
1921 		  0, 0, 0, 0 },
1922 		"icons/iconw_luger_1", // icon
1923 		NULL,               // ammo icon
1924 		"9mm Rounds",        // pickup
1925 		30,
1926 		IT_AMMO,
1927 		WP_LUGER,
1928 		WP_LUGER,
1929 		WP_LUGER,
1930 		"",                  // precache
1931 		"",                  // sounds
1932 		{32,24,16,16}
1933 	},
1934 /*QUAKED ammo_9mm (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1935 used by: Luger pistol, MP40 machinegun
1936 
1937 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1938 model="models/powerups/ammo/am9mm_m.md3"
1939 */
1940 	{
1941 		"ammo_9mm",
1942 		"sound/misc/am_pkup.wav",
1943 		{ "models/powerups/ammo/am9mm_m.md3",
1944 		  0, 0, 0,    0 },
1945 		"icons/iconw_luger_1", // icon
1946 		NULL,               // ammo icon
1947 		"9mm",           // pickup			//----(SA)	changed
1948 		60,
1949 		IT_AMMO,
1950 		WP_LUGER,
1951 		WP_LUGER,
1952 		WP_LUGER,
1953 		"",                  // precache
1954 		"",                  // sounds
1955 		{64,48,32,32}
1956 	},
1957 /*QUAKED ammo_9mm_large (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1958 used by: Luger pistol, MP40 machinegun
1959 
1960 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1961 model="models/powerups/ammo/am9mm_l.md3"
1962 */
1963 	{
1964 		"ammo_9mm_large",
1965 		"sound/misc/am_pkup.wav",
1966 		{ "models/powerups/ammo/am9mm_l.md3",
1967 		  0, 0, 0,    0 },
1968 		"icons/iconw_luger_1", // icon
1969 		NULL,               // ammo icon
1970 		"9mm Box",           // pickup
1971 		100,
1972 		IT_AMMO,
1973 		WP_LUGER,
1974 		WP_LUGER,
1975 		WP_LUGER,
1976 		"",                  // precache
1977 		"",                  // sounds
1978 		{96,64,48,48}
1979 	},
1980 
1981 
1982 /*QUAKED ammo_45cal_small (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
1983 used by: Thompson, Colt
1984 
1985 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
1986 model="models/powerups/ammo/am45cal_s.md3"
1987 */
1988 	{
1989 		"ammo_45cal_small",
1990 		"sound/misc/am_pkup.wav",
1991 		{ "models/powerups/ammo/am45cal_s.md3",
1992 		  0, 0, 0,    0 },
1993 		"icons/iconw_luger_1", // icon
1994 		NULL,               // ammo icon
1995 		".45cal Rounds", // pickup
1996 		20,
1997 		IT_AMMO,
1998 		WP_COLT,
1999 		WP_COLT,
2000 		WP_COLT,
2001 		"",                  // precache
2002 		"",                  // sounds
2003 		{30,20,15,15}
2004 	},
2005 /*QUAKED ammo_45cal (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2006 used by: Thompson, Colt
2007 
2008 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2009 model="models/powerups/ammo/am45cal_m.md3"
2010 */
2011 	{
2012 		"ammo_45cal",
2013 		"sound/misc/am_pkup.wav",
2014 		{ "models/powerups/ammo/am45cal_m.md3",
2015 		  0, 0, 0,    0 },
2016 		"icons/iconw_luger_1", // icon
2017 		NULL,               // ammo icon
2018 		".45cal",        // pickup			//----(SA)	changed
2019 		60,
2020 		IT_AMMO,
2021 		WP_COLT,
2022 		WP_COLT,
2023 		WP_COLT,
2024 		"",                  // precache
2025 		"",                  // sounds
2026 		{60,45,30,30}
2027 	},
2028 /*QUAKED ammo_45cal_large (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2029 used by: Thompson, Colt
2030 
2031 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2032 model="models/powerups/ammo/am45cal_l.md3"
2033 */
2034 	{
2035 		"ammo_45cal_large",
2036 		"sound/misc/am_pkup.wav",
2037 		{ "models/powerups/ammo/am45cal_l.md3",
2038 		  0, 0, 0,    0 },
2039 		"icons/iconw_luger_1", // icon
2040 		NULL,               // ammo icon
2041 		".45cal Box",        // pickup
2042 		100,
2043 		IT_AMMO,
2044 		WP_COLT,
2045 		WP_COLT,
2046 		WP_COLT,
2047 		"",                  // precache
2048 		"",                  // sounds
2049 		{90,60,45,45}
2050 	},
2051 
2052 
2053 
2054 
2055 /*QUAKED ammo_792mm_small (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2056 used by: Mauser rifle, FG42
2057 
2058 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2059 model="models/powerups/ammo/am792mm_s.md3"
2060 */
2061 	{
2062 		"ammo_792mm_small",
2063 		"sound/misc/am_pkup.wav",
2064 		{ "models/powerups/ammo/am792mm_s.md3",
2065 		  0, 0, 0,    0 },
2066 		"icons/icona_machinegun",    // icon
2067 		NULL,                       // ammo icon
2068 		"7.92mm Rounds",         // pickup
2069 		50,
2070 		IT_AMMO,
2071 		WP_MAUSER,
2072 		WP_MAUSER,
2073 		WP_MAUSER,
2074 		"",                          // precache
2075 		"",                          // sounds
2076 		{16,12,8,8}
2077 	},
2078 /*QUAKED ammo_792mm (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2079 used by: Mauser rifle, FG42
2080 
2081 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2082 model="models/powerups/ammo/am792mm_m.md3"
2083 */
2084 	{
2085 		"ammo_792mm",
2086 		"sound/misc/am_pkup.wav",
2087 		{ "models/powerups/ammo/am792mm_m.md3",
2088 		  0, 0, 0,    0 },
2089 		"icons/icona_machinegun",    // icon
2090 		NULL,                       // ammo icon
2091 		"7.92mm",                // pickup			//----(SA)	changed
2092 		10,
2093 		IT_AMMO,
2094 		WP_MAUSER,
2095 		WP_MAUSER,
2096 		WP_MAUSER,
2097 		"",                          // precache
2098 		"",                          // sounds
2099 		{32,24,16,16}
2100 	},
2101 /*QUAKED ammo_792mm_large (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2102 used by: Mauser rifle, FG42
2103 
2104 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2105 model="models/powerups/ammo/am792mm_l.md3"
2106 */
2107 	{
2108 		"ammo_792mm_large",
2109 		"sound/misc/am_pkup.wav",
2110 		{ "models/powerups/ammo/am792mm_l.md3",
2111 		  0, 0, 0,    0 },
2112 		"icons/icona_machinegun",    // icon
2113 		NULL,                       // ammo icon
2114 		"7.92mm Box",                // pickup
2115 		50,
2116 		IT_AMMO,
2117 		WP_MAUSER,
2118 		WP_MAUSER,
2119 		WP_MAUSER,
2120 		"",                          // precache
2121 		"",                          // sounds
2122 		{48,32,24,24}
2123 	},
2124 
2125 
2126 
2127 
2128 /*QUAKED ammo_30cal_small (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2129 used by: Garand rifle
2130 
2131 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2132 model="models/powerups/ammo/am30cal_s.md3"
2133 */
2134 	{
2135 		"ammo_30cal_small",
2136 		"sound/misc/am_pkup.wav",
2137 		{ "models/powerups/ammo/am30cal_s.md3",
2138 		  0, 0, 0,    0 },
2139 		"icons/icona_machinegun",    // icon
2140 		NULL,                       // ammo icon
2141 		".30cal Rounds",         // pickup
2142 		50,
2143 		IT_AMMO,
2144 		WP_GARAND,
2145 		WP_GARAND,
2146 		WP_GARAND,
2147 		"",                          // precache
2148 		"",                          // sounds
2149 		{5,2,2,2}
2150 	},
2151 /*QUAKED ammo_30cal (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2152 used by: Garand rifle
2153 
2154 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2155 model="models/powerups/ammo/am30cal_m.md3"
2156 */
2157 	{
2158 		"ammo_30cal",
2159 		"sound/misc/am_pkup.wav",
2160 		{ "models/powerups/ammo/am30cal_m.md3",
2161 		  0, 0, 0,    0 },
2162 		"icons/icona_machinegun",    // icon
2163 		NULL,                       // ammo icon
2164 		".30cal",                // pickup			//----(SA)	changed
2165 		50,
2166 		IT_AMMO,
2167 		WP_GARAND,
2168 		WP_GARAND,
2169 		WP_GARAND,
2170 		"",                          // precache
2171 		"",                          // sounds
2172 		{5,5,5,5    }
2173 	},
2174 /*QUAKED ammo_30cal_large (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2175 used by: Garand rifle
2176 
2177 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2178 model="models/powerups/ammo/am30cal_l.md3"
2179 */
2180 	{
2181 		"ammo_30cal_large",
2182 		"sound/misc/am_pkup.wav",
2183 		{ "models/powerups/ammo/am30cal_l.md3",
2184 		  0, 0, 0,    0 },
2185 		"icons/icona_machinegun",    // icon
2186 		NULL,                       // ammo icon
2187 		".30cal Box",                // pickup
2188 		50,
2189 		IT_AMMO,
2190 		WP_GARAND,
2191 		WP_GARAND,
2192 		WP_GARAND,
2193 		"",                          // precache
2194 		"",                          // sounds
2195 		{10,10,10,5}
2196 	},
2197 
2198 
2199 
2200 
2201 /*QUAKED ammo_127mm (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2202 used by: Venom gun
2203 
2204 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2205 model="models/powerups/ammo/am127mm.md3"
2206 */
2207 	{
2208 		"ammo_127mm",
2209 		"sound/misc/am_pkup.wav",
2210 		{ "models/powerups/ammo/am127mm.md3",
2211 		  0, 0, 0,    0 },
2212 		"icons/icona_machinegun",    // icon
2213 		NULL,                       // ammo icon
2214 		"12.7mm",                    // pickup
2215 		100,
2216 		IT_AMMO,
2217 		WP_VENOM,
2218 		WP_VENOM,
2219 		WP_VENOM,
2220 		"",                          // precache
2221 		"",                          // sounds
2222 		{100,75,50,50}
2223 	},
2224 
2225 /*QUAKED ammo_grenades (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2226 
2227 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2228 model="models/powerups/ammo/amgren_bag.md3"
2229 */
2230 	{
2231 		"ammo_grenades",
2232 		"sound/misc/am_pkup.wav",
2233 		{ "models/powerups/ammo/amgren_bag.md3",
2234 		  0, 0, 0,    0 },
2235 		"icons/icona_grenade",   // icon
2236 		NULL,                   // ammo icon
2237 		"Grenades",              // pickup
2238 		5,
2239 		IT_AMMO,
2240 		WP_GRENADE_LAUNCHER,
2241 		WP_GRENADE_LAUNCHER,
2242 		WP_GRENADE_LAUNCHER,
2243 		"",                      // precache
2244 		"",                      // sounds
2245 		{5,4,3,3}
2246 	},
2247 
2248 /*QUAKED ammo_grenades_american (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2249 
2250 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2251 model="models/powerups/ammo/amgrenus_bag.md3"
2252 */
2253 	{
2254 		"ammo_grenades_american",
2255 		"sound/misc/am_pkup.wav",
2256 		{ "models/powerups/ammo/amgrenus_bag.md3",
2257 		  0, 0, 0,    0 },
2258 		"icons/icona_pineapple", // icon
2259 		NULL,                   // ammo icon
2260 		"Pineapples",            // pickup
2261 		5,
2262 		IT_AMMO,
2263 		WP_GRENADE_PINEAPPLE,
2264 		WP_GRENADE_PINEAPPLE,
2265 		WP_GRENADE_PINEAPPLE,
2266 		"",                      // precache
2267 		"",                      // sounds
2268 		{5,4,3,3}
2269 	},
2270 
2271 /*QUAKED ammo_dynamite (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2272 
2273  -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2274 model="models/powerups/ammo/dynamite.md3"
2275 */
2276 	{
2277 		"ammo_dynamite",
2278 		"sound/misc/am_pkup.wav",
2279 		{ "models/powerups/ammo/dynamite.md3",
2280 		  0, 0, 0,    0 },
2281 		"icons/icona_dynamite",  // icon
2282 		NULL,                   // ammo icon
2283 		"Dynamite",              // pickup
2284 		1,
2285 		IT_AMMO,
2286 		WP_DYNAMITE,
2287 		WP_DYNAMITE,
2288 		WP_DYNAMITE,
2289 		"",                      // precache
2290 		"",                      // sounds
2291 		{1,1,1,1}
2292 	},
2293 
2294 
2295 /*QUAKED ammo_cell (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2296 used by: Tesla
2297 
2298 Boosts recharge on Tesla
2299 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2300 model="models/powerups/ammo/amcell.md3"
2301 */
2302 	{
2303 		"ammo_cell",
2304 		"sound/misc/am_pkup.wav",
2305 		{ "models/powerups/ammo/amcell.md3",
2306 		  0, 0, 0,    0 },
2307 		"icons/icona_cell",  // icon
2308 		NULL,               // ammo icon
2309 		"Cell",              // pickup
2310 		500,
2311 		IT_AMMO,
2312 		WP_TESLA,
2313 		WP_TESLA,
2314 		WP_TESLA,
2315 		"",                  // precache
2316 		"",                  // sounds
2317 		{100,75,50,50}
2318 	},
2319 
2320 
2321 
2322 /*QUAKED ammo_fuel (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2323 used by: Flamethrower
2324 
2325 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2326 model="models/powerups/ammo/amfuel.md3"
2327 */
2328 	{
2329 		"ammo_fuel",
2330 		"sound/misc/am_pkup.wav",
2331 		{ "models/powerups/ammo/amfuel.md3",
2332 		  0, 0, 0,    0 },
2333 		"icons/icona_fuel",  // icon
2334 		NULL,               // ammo icon
2335 		"Fuel",              // pickup
2336 		100,
2337 		IT_AMMO,
2338 		WP_FLAMETHROWER,
2339 		WP_FLAMETHROWER,
2340 		WP_FLAMETHROWER,
2341 		"",                  // precache
2342 		"",                  // sounds
2343 		{100,75,50,50}
2344 	},
2345 
2346 
2347 /* ammo_speargun (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2348 used by: Speargun
2349 
2350 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2351 model="models/powerups/ammo/amspear.md3"
2352 */
2353 /*
2354 	{
2355 		"ammo_speargun",
2356 		"sound/misc/am_pkup.wav",
2357 		{ "models/powerups/ammo/amspear.md3",
2358 		0, 0, 0,	0 },
2359 		"icons/icona_spear",	// icon
2360 		NULL,					// ammo icon
2361 		"Speargun Bolts",			// pickup
2362 		10,
2363 		IT_AMMO,
2364 		WP_SPEARGUN,
2365 		WP_SPEARGUN,
2366 		WP_SPEARGUN,
2367 		"",					// precache
2368 		"",					// sounds
2369 		{100,75,50,50}
2370 	},
2371 */
2372 
2373 
2374 /* ammo_speargun_co2 (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2375 CO2 tipped speargun bolts
2376 
2377 used by: Speargun
2378 
2379 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2380 model="models/powerups/ammo/amspear.md3"
2381 */
2382 /*
2383 	{
2384 		"ammo_speargun_co2",
2385 		"sound/misc/am_pkup.wav",
2386 		{ "models/powerups/ammo/amspear.md3",
2387 		0, 0, 0,	0 },
2388 		"icons/icona_spear",	// icon
2389 		NULL,					// ammo icon
2390 		"C02 Speargun Bolts",	// pickup
2391 		10,
2392 		IT_AMMO,
2393 		WP_SPEARGUN_CO2,
2394 		WP_SPEARGUN_CO2,
2395 		WP_SPEARGUN_CO2,
2396 		"",					// precache
2397 		"",					// sounds
2398 		{100,75,50,50}
2399 	},
2400 */
2401 
2402 
2403 //----(SA)	removed ammo_sniper(_n)
2404 
2405 //----(SA)	removed ammo_snooper(_n)
2406 
2407 
2408 /*QUAKED ammo_panzerfaust (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2409 used by: German Panzerfaust
2410 
2411 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2412 model="models/powerups/ammo/ampf.md3"
2413 */
2414 	{
2415 		"ammo_panzerfaust",
2416 		"sound/misc/am_pkup.wav",
2417 		{ "models/powerups/ammo/ampf.md3",
2418 		  0, 0, 0,    0 },
2419 		"icons/icona_panzerfaust",   // icon
2420 		NULL,                   // ammo icon
2421 		"Panzerfaust Rockets",               // pickup
2422 		5,
2423 		IT_AMMO,
2424 		WP_PANZERFAUST,
2425 		WP_PANZERFAUST,
2426 		WP_PANZERFAUST,
2427 		"",                      // precache
2428 		"",                      // sounds
2429 		{4,3,2,2}
2430 	},
2431 
2432 
2433 /* ammo_rockets (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2434 used by: Allied Rocket Launcher (bazooka)
2435 
2436 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2437 model="models/powerups/ammo/amrocket.md3"
2438 */
2439 /*
2440 	{
2441 		"ammo_rockets",
2442 		"sound/misc/am_pkup.wav",
2443 		{ "models/powerups/ammo/amrocket.md3",
2444 		0, 0, 0,	0 },
2445 		"icons/icona_rocket",	// icon
2446 		NULL,					// ammo icon
2447 		"Rockets",				// pickup
2448 		5,
2449 		IT_AMMO,
2450 		WP_ROCKET_LAUNCHER,
2451 		WP_ROCKET_LAUNCHER,
2452 		WP_ROCKET_LAUNCHER,
2453 		"",						// precache
2454 		"",						// sounds
2455 		{4,3,2,2}
2456 	},
2457 */
2458 
2459 /* ammo_charges (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2460 used by: Cross of Coronado
2461 
2462 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2463 model="models/powerups/ammo/amcharges.md3"
2464 */
2465 /*
2466 	{
2467 		"ammo_charges",
2468 		"sound/misc/am_pkup.wav",
2469 		{ "models/powerups/ammo/amcharges.md3",
2470 		0, 0, 0,	0 },
2471 		"icons/icona_charges",	// icon
2472 		NULL,					// ammo icon
2473 		"Charges",				// pickup
2474 		2,
2475 		IT_AMMO,
2476 		WP_CROSS,
2477 		WP_CROSS,
2478 		WP_CROSS,
2479 		"",						// precache
2480 		"",						// sounds
2481 		{4,2,2,1}
2482 	},
2483 */
2484 
2485 //----(SA)	hopefully it doesn't need to be a quaked thing.
2486 //			apologies if it does and I'll put it back.
2487 /*
2488 ammo_monster_attack1 (.3 .3 1) (-16 -16 -16) (16 16 16) suspended
2489 used by: Monster Attack 1 (specific to each monster)
2490 */
2491 	{
2492 		"ammo_monster_attack1",
2493 		"",
2494 		{ "",
2495 		  0, 0, 0},
2496 		"",                      // icon
2497 		NULL,                   // ammo icon
2498 		"MonsterAttack1",        // pickup
2499 		60,
2500 		IT_AMMO,
2501 		WP_MONSTER_ATTACK1,
2502 		WP_MONSTER_ATTACK1,
2503 		WP_MONSTER_ATTACK1,
2504 		"",
2505 		"",
2506 		{0,0,0,0}
2507 	},
2508 
2509 
2510 	//
2511 	// HOLDABLE ITEMS
2512 	//
2513 
2514 //----(SA)	updated a number of powerup items (11/6/00)
2515 
2516 /* holdable_medkit (.3 .3 1) (-16 -16 -16) (16 16 16) SUSPENDED SPIN - RESPAWN
2517 
2518 pickup sound : "sound/pickup/holdable/get_medkit.wav"
2519 use sound : "sound/pickup/holdable/get_medkit.wav"
2520 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2521 model="models/powerups/holdable/medkit.md3"
2522 */
2523 /*
2524 	{
2525 		"holdable_medkit",
2526 		"sound/pickup/holdable/get_medkit.wav",
2527 		{
2528 		"models/powerups/holdable/medkit.md3",
2529 		"models/powerups/holdable/medkit_sphere.md3",
2530 		0, 0,	0 },
2531 		"icons/medkit",	// icon
2532 		NULL,			// ammo icon
2533 		"Medkit",		// pickup
2534 		1,
2535 		IT_HOLDABLE,
2536 		HI_MEDKIT,
2537 		0,
2538 		0,
2539 		"",				// precache
2540 		"sound/pickup/holdable/use_medkit.wav",	// sounds
2541 		{0,0,0,0}
2542 	},
2543 */
2544 
2545 /*QUAKED holdable_wine (.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2546 
2547 pickup sound : "sound/pickup/holdable/get_wine.wav"
2548 use sound : "sound/pickup/holdable/use_wine.wav"
2549 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2550 model="models/powerups/holdable/wine.md3"
2551 */
2552 	{
2553 		"holdable_wine",
2554 		"sound/pickup/holdable/get_wine.wav",
2555 		{
2556 			"models/powerups/holdable/wine.md3",
2557 			0, 0, 0,    0
2558 		},
2559 		"icons/wine",                    // icon
2560 		NULL,                           // ammo icon
2561 		"1921 Chateau Lafite",           // pickup
2562 		1,
2563 		IT_HOLDABLE,
2564 		HI_WINE,
2565 		0,
2566 		0,
2567 		"",                              // precache
2568 		"sound/pickup/holdable/use_wine.wav",        // sounds
2569 		{3,0,0,0}
2570 	},
2571 
2572 
2573 /* holdable_skull (.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2574 Skull of Invulnerability
2575 Protection from all attacks
2576 
2577 pickup sound : "sound/pickup/holdable/get_skull.wav"
2578 use sound : "sound/pickup/holdable/use_skull.wav"
2579 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2580 model="models/powerups/holdable/skull.md3"
2581 */
2582 /*
2583 	{
2584 		"holdable_skull",
2585 		"sound/pickup/holdable/get_skull.wav",
2586 		{
2587 			"models/powerups/holdable/skull.md3",
2588 			0, 0, 0
2589 		,	0 },
2590 		"icons/skull",					// icon
2591 		NULL,							// ammo icon
2592 		"Skull of Invulnerability",		// pickup
2593 		1,
2594 		IT_HOLDABLE,
2595 		HI_SKULL,
2596 		0,
2597 		0,
2598 		"",								// precache
2599 		"sound/pickup/holdable/use_skull.wav",	// sounds
2600 		{0,0,0,0}
2601 	},
2602 */
2603 
2604 
2605 /* holdable_p_water (.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2606 Protection from drowning for n seconds
2607 "time" (in seconds)  How much extra underwater time is given
2608 
2609 pickup sound : "sound/pickup/holdable/get_water.wav"
2610 use sound : "sound/pickup/holdable/use_water.wav"
2611 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2612 model="models/powerups/holdable/water.md3"
2613 */
2614 /*
2615 	{
2616 		"holdable_p_water",
2617 		"sound/pickup/holdable/get_water.wav",
2618 		{
2619 			"models/powerups/holdable/water.md3",
2620 			0, 0, 0
2621 		,	0 },
2622 		"icons/water",					// icon
2623 		NULL,							// ammo icon
2624 		"Breather",					// pickup
2625 		1,
2626 		IT_HOLDABLE,
2627 		HI_WATER,
2628 		0,
2629 		0,
2630 		"",								// precache
2631 		"sound/pickup/holdable/use_water.wav",	// sounds
2632 		{0,0,0,0}
2633 	},
2634 */
2635 
2636 /* holdable_p_elec (.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2637 Protection from electric attacks
2638 Absorbs "dmg" points of electric damage
2639 
2640 pickup sound : "sound/pickup/holdable/get_elec.wav"
2641 use sound : "sound/pickup/holdable/use_elec.wav"
2642 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2643 model="models/powerups/holdable/elec.md3"
2644 */
2645 /*
2646 	{
2647 		"holdable_p_elec",
2648 		"sound/pickup/holdable/get_elec.wav",
2649 		{
2650 			"models/powerups/holdable/elec.md3",
2651 			0, 0, 0
2652 		,	0 },
2653 		"icons/elec",					// icon
2654 		NULL,							// ammo icon
2655 		"Electric Protection",			// pickup
2656 		1,
2657 		IT_HOLDABLE,
2658 		HI_ELECTRIC,
2659 		0,
2660 		0,
2661 		"",								// precache
2662 		"sound/pickup/holdable/use_elec.wav",	// sounds
2663 		{0,0,0,0}
2664 	},
2665 */
2666 
2667 /* holdable_p_fire (.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2668 Protection from fire attacks
2669 Absorbs "dmg" points of fire damage
2670 
2671 pickup sound : "sound/pickup/holdable/get_fire.wav"
2672 use sound : "sound/pickup/holdable/use_fire.wav"
2673 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2674 model="models/powerups/holdable/fire.md3"
2675 */
2676 /*
2677 	{
2678 		"holdable_p_fire",
2679 		"sound/pickup/holdable/get_fire.wav",
2680 		{
2681 			"models/powerups/holdable/fire.md3",
2682 			0, 0, 0
2683 		,	0 },
2684 		"icons/fire",					// icon
2685 		NULL,							// ammo icon
2686 		"Fire Protection",				// pickup
2687 		1,
2688 		IT_HOLDABLE,
2689 		HI_FIRE,
2690 		0,
2691 		0,
2692 		"",								// precache
2693 		"sound/pickup/holdable/use_fire.wav",	// sounds
2694 		{0,0,0,0}
2695 	},
2696 */
2697 
2698 /*QUAKED holdable_stamina(.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2699 Protection from fatigue
2700 Using the "sprint" key will not fatigue the character
2701 
2702 pickup sound : "sound/pickup/holdable/get_stamina.wav"
2703 use sound : "sound/pickup/holdable/use_stamina.wav"
2704 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2705 model="models/powerups/holdable/stamina.md3"
2706 */
2707 	{
2708 		"holdable_stamina",
2709 		"sound/pickup/holdable/get_stamina.wav",
2710 		{
2711 			"models/powerups/holdable/stamina.md3",
2712 			0, 0, 0
2713 			,   0
2714 		},
2715 		"icons/stamina",             // icon
2716 		NULL,                           // ammo icon
2717 		"Added Stamina",             // pickup
2718 		1,
2719 		IT_HOLDABLE,
2720 		HI_STAMINA,
2721 		0,
2722 		0,
2723 		"",                              // precache
2724 		"sound/pickup/holdable/use_stamina.wav", // sounds
2725 		{0,0,0,0}
2726 	},
2727 
2728 
2729 
2730 /*QUAKED holdable_book1(.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2731 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2732 model="models/powerups/holdable/venom_book.md3"
2733 */
2734 	{
2735 		"holdable_book1",
2736 		"sound/pickup/holdable/get_book1.wav",
2737 		{
2738 			"models/powerups/holdable/venom_book.md3",
2739 			0, 0, 0
2740 			,   0
2741 		},
2742 		"icons/icon_vbook",              // icon
2743 		NULL,                       // ammo icon
2744 		"Venom Tech Manual",     // pickup
2745 		1,
2746 		IT_HOLDABLE,
2747 		HI_BOOK1,
2748 		0,
2749 		0,
2750 		"",                              // precache
2751 		"sound/pickup/holdable/use_book.wav",    // sounds
2752 		{0,0,0,0}
2753 	},
2754 
2755 
2756 /*QUAKED holdable_book2(.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2757 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2758 model="models/powerups/holdable/paranormal_book.md3"
2759 */
2760 	{
2761 		"holdable_book2",
2762 		"sound/pickup/holdable/get_book2.wav",
2763 		{
2764 			"models/powerups/holdable/paranormal_book.md3",
2765 			0, 0, 0
2766 			,   0
2767 		},
2768 		"icons/icon_pbook",              // icon
2769 		NULL,                           // ammo icon
2770 		"Project Book",                  // pickup
2771 		1,
2772 		IT_HOLDABLE,
2773 		HI_BOOK2,
2774 		0,
2775 		0,
2776 		"",                              // precache
2777 		"sound/pickup/holdable/use_book.wav",    // sounds
2778 		{0,0,0,0}
2779 	},
2780 
2781 
2782 /*QUAKED holdable_book3(.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2783 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2784 model="models/powerups/holdable/zemphr_book.md3"
2785 */
2786 	{
2787 		"holdable_book3",
2788 		"sound/pickup/holdable/get_book3.wav",
2789 		{
2790 			"models/powerups/holdable/zemphr_book.md3",
2791 			0, 0, 0
2792 			,   0
2793 		},
2794 		"icons/icon_zbook",              // icon
2795 		NULL,                       // ammo icon
2796 		"Dr. Zemph's Journal",       // pickup
2797 		1,
2798 		IT_HOLDABLE,
2799 		HI_BOOK3,
2800 		0,
2801 		0,
2802 		"",                              // precache
2803 		"sound/pickup/holdable/use_book.wav",    // sounds
2804 		{0,0,0,0}
2805 	},
2806 
2807 
2808 
2809 
2810 /* holdable_11(.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2811 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2812 model="models/powerups/holdable/11.md3"
2813 */
2814 /*
2815 	{
2816 		"holdable_11",
2817 		"sound/pickup/holdable/get_11.wav",
2818 		{
2819 			"models/powerups/holdable/11.md3",
2820 			0, 0, 0
2821 		,	0 },
2822 		"icons/11",				// icon
2823 		NULL,							// ammo icon
2824 		"11",					// pickup
2825 		1,
2826 		IT_HOLDABLE,
2827 		HI_11,
2828 		0,
2829 		0,
2830 		"",								// precache
2831 		"sound/pickup/holdable/use_11.wav",	// sounds
2832 		{0,0,0,0}
2833 	},
2834 */
2835 
2836 /* holdable_12(.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2837 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2838 model="models/powerups/holdable/12.md3"
2839 */
2840 /*
2841 	{
2842 		"holdable_12",
2843 		"sound/pickup/holdable/get_12.wav",
2844 		{
2845 			"models/powerups/holdable/12.md3",
2846 			0, 0, 0
2847 		,	0 },
2848 		"icons/12",				// icon
2849 		NULL,							// ammo icon
2850 		"12",					// pickup
2851 		1,
2852 		IT_HOLDABLE,
2853 		HI_12,
2854 		0,
2855 		0,
2856 		"",								// precache
2857 		"sound/pickup/holdable/use_12.wav",	// sounds
2858 		{0,0,0,0}
2859 	},
2860 */
2861 
2862 /* holdable_13(.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2863 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2864 model="models/powerups/holdable/13.md3"
2865 */
2866 /*
2867 	{
2868 		"holdable_13",
2869 		"sound/pickup/holdable/get_13.wav",
2870 		{
2871 			"models/powerups/holdable/13.md3",
2872 			0, 0, 0
2873 		,	0 },
2874 		"icons/13",				// icon
2875 		NULL,							// ammo icon
2876 		"13",					// pickup
2877 		1,
2878 		IT_HOLDABLE,
2879 		HI_13,
2880 		0,
2881 		0,
2882 		"",								// precache
2883 		"sound/pickup/holdable/use_13.wav",	// sounds
2884 		{0,0,0,0}
2885 	},
2886 */
2887 
2888 /* holdable_14(.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2889 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2890 model="models/powerups/holdable/14.md3"
2891 */
2892 /*
2893 	{
2894 		"holdable_14",
2895 		"sound/pickup/holdable/get_14.wav",
2896 		{
2897 			"models/powerups/holdable/14.md3",
2898 			0, 0, 0
2899 		,	0 },
2900 		"icons/14",				// icon
2901 		NULL,							// ammo icon
2902 		"14",					// pickup
2903 		1,
2904 		IT_HOLDABLE,
2905 		HI_14,
2906 		0,
2907 		0,
2908 		"",								// precache
2909 		"sound/pickup/holdable/use_14.wav",	// sounds
2910 		{0,0,0,0}
2911 	},
2912 */
2913 
2914 /* holdable_15(.3 .3 1) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2915 /
2916 	{
2917 		"holdable_15",
2918 		"sound/pickup/holdable/get_15.wav",
2919 		{
2920 			"models/powerups/holdable/15.md3",
2921 			0, 0, 0
2922 		,	0 },
2923 		"icons/15",				// icon
2924 		NULL,							// ammo icon
2925 		"15",					// pickup
2926 		1,
2927 		IT_HOLDABLE,
2928 		HI_15,
2929 		0,
2930 		"",								// precache
2931 		"sound/pickup/holdable/use_15.wav",	// sounds
2932 		{0,0,0,0}
2933 	},
2934 
2935 */
2936 
2937 
2938 
2939 	//
2940 	// POWERUP ITEMS
2941 	//
2942 
2943 /*QUAKED team_CTF_redflag (1 0 0) (-16 -16 -16) (16 16 16)
2944 Only in CTF games
2945 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2946 model="models/flags/r_flag.md3"
2947 */
2948 	{
2949 		"team_CTF_redflag",
2950 		"sound/teamplay/flagtk_red.wav",
2951 		{ "models/flags/r_flag.md3",
2952 		  0, 0, 0,   0 },
2953 		"icons/iconf_red",   // icon
2954 		NULL,               // ammo icon
2955 		"Red Flag",          // pickup
2956 		0,
2957 		IT_TEAM,
2958 		PW_REDFLAG,
2959 		0,
2960 		0,
2961 		"",                  // precache
2962 		"sound/teamplay/flagcap_red.wav sound/teamplay/flagtk_red.wav sound/teamplay/flagret_red.wav",   // sounds
2963 		{0,0,0,0}
2964 	},
2965 
2966 /*QUAKED team_CTF_blueflag (0 0 1) (-16 -16 -16) (16 16 16)
2967 Only in CTF games
2968 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2969 model="models/flags/b_flag.md3"
2970 */
2971 	{
2972 		"team_CTF_blueflag",
2973 		"sound/teamplay/flagtk_blu.wav",
2974 		{ "models/flags/b_flag.md3",
2975 		  0, 0, 0,   0 },
2976 		"icons/iconf_blu",   // icon
2977 		NULL,               // ammo icon
2978 		"Blue Flag",     // pickup
2979 		0,
2980 		IT_TEAM,
2981 		PW_BLUEFLAG,
2982 		0,
2983 		0,
2984 		"",                  // precache
2985 		"sound/teamplay/flagcap_blu.wav sound/teamplay/flagtk_blu.wav sound/teamplay/flagret_blu.wav",   // sounds
2986 		{0,0,0,0}
2987 	},
2988 
2989 
2990 	//---- (SA) Wolf keys
2991 
2992 /* key_skull1 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
2993 key 1
2994 
2995 pickup sound : "sound/pickup/keys/skull.wav"
2996 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
2997 model="models/powerups/keys/skull.md3"
2998 */
2999 /*
3000 	{
3001 		"key_skull1",
3002 		"sound/pickup/keys/skull.wav",
3003 		{
3004 			"models/powerups/keys/skull.md3",
3005 			0, 0, 0
3006 		,	0 },
3007 		"icons/iconk_skull",	// icon
3008 		NULL,					// ammo icon
3009 		"Crystal Skull",		// pickup
3010 		0,
3011 		IT_KEY,
3012 		KEY_1,
3013 		0,
3014 		0,
3015 		"",						// precache
3016 		"models/keys/key.wav",	// sounds
3017 		{0,0,0,0}
3018 	},
3019 */
3020 
3021 /* key_chalice2 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3022 key 2
3023 
3024 pickup sound : "sound/pickup/keys/chalice.wav"
3025 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3026 model="models/powerups/keys/chalice.md3"
3027 */
3028 /*
3029 	{
3030 		"key_chalice2",
3031 		"sound/pickup/keys/chalice.wav",
3032 		{
3033 			"models/powerups/keys/chalice.md3",
3034 			0, 0, 0
3035 		,	0 },
3036 		"icons/iconk_chalice",	// icon
3037 		NULL,					// ammo icon
3038 		"Chalice",				// pickup
3039 		0,
3040 		IT_KEY,
3041 		KEY_2,
3042 		0,
3043 		0,
3044 		"",						// precache
3045 		"models/keys/key.wav",	// sounds
3046 		{0,0,0,0}
3047 	},
3048 */
3049 
3050 /* key_eye3 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3051 key 3
3052 
3053 pickup sound : "sound/pickup/keys/eye.wav"
3054 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3055 model="models/powerups/keys/eye.md3"
3056 */
3057 /*
3058 	{
3059 		"key_eye3",
3060 		"sound/pickup/keys/eye.wav",
3061 		{
3062 			"models/powerups/keys/eye.md3",
3063 			0, 0, 0
3064 		,	0 },
3065 		"icons/iconk_eye",		// icon
3066 		NULL,					// ammo icon
3067 		"Eye of Isis",			// pickup
3068 		0,
3069 		IT_KEY,
3070 		KEY_3,
3071 		0,
3072 		0,
3073 		"",						// precache
3074 		"models/keys/key.wav",	// sounds
3075 		{0,0,0,0}
3076 	},
3077 */
3078 
3079 /* key_radio4 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3080 key 4
3081 
3082 pickup sound : "sound/pickup/keys/radio.wav"
3083 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3084 model="models/powerups/keys/radio_port.md3"
3085 */
3086 /*
3087 	{
3088 		"key_radio4",
3089 		"sound/pickup/keys/radio.wav",
3090 		{
3091 			"models/powerups/keys/radio_port.md3",
3092 			0, 0, 0
3093 		,	0 },
3094 		"icons/iconk_radio",	// icon
3095 		NULL,					// ammo icon
3096 		"Field Radio",			// pickup
3097 		0,
3098 		IT_KEY,
3099 		KEY_4,
3100 		0,
3101 		0,
3102 		"",						// precache
3103 		"models/keys/key.wav",	// sounds
3104 		{0,0,0,0}
3105 	},
3106 */
3107 
3108 /* key_satchelcharge5 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3109 key 5
3110 
3111 pickup sound : "sound/pickup/keys/satchelcharge.wav"
3112 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3113 model="models/powerups/keys/satchel_charge.md3"
3114 */
3115 /*
3116 	{
3117 		"key_satchelcharge5",
3118 		"sound/pickup/keys/satchelcharge.wav",
3119 		{
3120 			"models/powerups/keys/satchel_charge.md3",
3121 			0, 0, 0
3122 		,	0 },
3123 		"icons/iconk_satchel",	// icon
3124 		NULL,					// ammo icon
3125 		"Satchel Charge",		// pickup
3126 		0,
3127 		IT_KEY,
3128 		KEY_5,
3129 		0,
3130 		0,
3131 		"",						// precache
3132 		"models/keys/key.wav",	// sounds
3133 		{0,0,0,0}
3134 	},
3135 */
3136 
3137 /*QUAKED key_binocs (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3138 Binoculars.
3139 
3140 pickup sound : "sound/pickup/keys/binocs.wav"
3141 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3142 model="models/powerups/keys/binoculars.md3"
3143 */
3144 	{
3145 		"key_binocs",
3146 		"sound/pickup/keys/binocs.wav",
3147 		{
3148 			"models/powerups/keys/binoculars.md3",
3149 			0, 0, 0
3150 			,   0
3151 		},
3152 		"icons/binocs",          // icon
3153 		NULL,                   // ammo icon
3154 		"Binoculars",            // pickup
3155 		0,
3156 		IT_KEY,
3157 		INV_BINOCS,
3158 		0,
3159 		0,
3160 		"",                      // precache
3161 		"models/keys/key.wav",   // sounds
3162 		{0,0,0,0}
3163 	},
3164 
3165 /* key_7 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3166 key 7
3167 
3168 pickup sound : "sound/pickup/keys/key7.wav"
3169 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3170 model="models/powerups/keys/key7.md3"
3171 */
3172 /*
3173 	{
3174 		"key_key7",
3175 		"sound/pickup/keys/key7.wav",
3176 		{
3177 			"models/powerups/keys/key7.md3",
3178 			0, 0, 0
3179 		,	0 },
3180 		"icons/key7",			// icon
3181 		NULL,					// ammo icon
3182 		"Key 7",				// pickup
3183 		0,
3184 		IT_KEY,
3185 		KEY_7,
3186 		0,
3187 		0,
3188 		"",						// precache
3189 		"models/keys/key.wav",	// sounds
3190 		{0,0,0,0}
3191 	},
3192 */
3193 
3194 /* key_key8 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3195 key 8
3196 
3197 pickup sound : "sound/pickup/keys/key8.wav"
3198 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3199 model="models/powerups/keys/key.md3"
3200 */
3201 /*
3202 	{
3203 		"key_key8",
3204 		"sound/pickup/keys/key8.wav",
3205 		{
3206 			"models/powerups/keys/key.md3",
3207 			0, 0, 0
3208 		,	0 },
3209 		"icons/key8",			// icon
3210 		NULL,					// ammo icon
3211 		"Key 8",				// pickup
3212 		0,
3213 		IT_KEY,
3214 		KEY_8,
3215 		0,
3216 		0,
3217 		"",						// precache
3218 		"models/keys/key.wav",	// sounds
3219 		{0,0,0,0}
3220 	},
3221 */
3222 
3223 /* key_key9 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3224 key 9
3225 
3226 pickup sound : "sound/pickup/keys/key9.wav"
3227 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3228 model="models/powerups/keys/key.md3"
3229 */
3230 /*
3231 	{
3232 		"key_key9",
3233 		"sound/pickup/keys/key9.wav",
3234 		{
3235 			"models/powerups/keys/key.md3",
3236 			0, 0, 0
3237 		,	0 },
3238 		"icons/key9",			// icon
3239 		NULL,					// ammo icon
3240 		"Key 9",				// pickup
3241 		0,
3242 		IT_KEY,
3243 		KEY_9,
3244 		0,
3245 		0,
3246 		"",						// precache
3247 		"models/keys/key.wav",	// sounds
3248 		{0,0,0,0}
3249 	},
3250 */
3251 
3252 /* key_key10 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3253 key 10
3254 
3255 pickup sound : "sound/pickup/keys/key10.wav"
3256 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3257 model="models/powerups/keys/key.md3"
3258 */
3259 /*
3260 	{
3261 		"key_key10",
3262 		"sound/pickup/keys/key10.wav",
3263 		{
3264 			"models/powerups/keys/key.md3",
3265 			0, 0, 0
3266 		,	0 },
3267 		"icons/key10",			// icon
3268 		NULL,					// ammo icon
3269 		"Key 10",				// pickup
3270 		0,
3271 		IT_KEY,
3272 		KEY_10,
3273 		0,
3274 		0,
3275 		"",						// precache
3276 		"models/keys/key.wav",	// sounds
3277 		{0,0,0,0}
3278 	},
3279 */
3280 
3281 /* key_key11 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3282 key 11
3283 
3284 pickup sound : "sound/pickup/keys/key11.wav"
3285 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3286 model="models/powerups/keys/key.md3"
3287 */
3288 /*
3289 	{
3290 		"key_key11",
3291 		"sound/pickup/keys/key11.wav",
3292 		{
3293 			"models/powerups/keys/key.md3",
3294 			0, 0, 0
3295 		,	0 },
3296 		"icons/key11",			// icon
3297 		NULL,					// ammo icon
3298 		"Key 11",				// pickup
3299 		0,
3300 		IT_KEY,
3301 		KEY_11,
3302 		0,
3303 		0,
3304 		"",						// precache
3305 		"models/keys/key.wav",	// sounds
3306 		{0,0,0,0}
3307 	},
3308 */
3309 
3310 /* key_key12 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3311 key 12
3312 
3313 pickup sound : "sound/pickup/keys/key12.wav"
3314 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3315 model="models/powerups/keys/key.md3"
3316 */
3317 /*
3318 	{
3319 		"key_key12",
3320 		"sound/pickup/keys/key12.wav",
3321 		{
3322 			"models/powerups/keys/key.md3",
3323 			0, 0, 0
3324 		,	0 },
3325 		"icons/key12",			// icon
3326 		NULL,					// ammo icon
3327 		"Key 12",				// pickup
3328 		0,
3329 		IT_KEY,
3330 		KEY_12,
3331 		0,
3332 		0,
3333 		"",						// precache
3334 		"models/keys/key.wav",	// sounds
3335 		{0,0,0,0}
3336 	},
3337 */
3338 
3339 /* key_key13 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3340 key 13
3341 
3342 pickup sound : "sound/pickup/keys/key13.wav"
3343 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3344 model="models/powerups/keys/key.md3"
3345 */
3346 /*
3347 	{
3348 		"key_key13",
3349 		"sound/pickup/keys/key13.wav",
3350 		{
3351 			"models/powerups/keys/key.md3",
3352 			0, 0, 0
3353 		,	0 },
3354 		"icons/key13",			// icon
3355 		NULL,					// ammo icon
3356 		"Key 13",				// pickup
3357 		0,
3358 		IT_KEY,
3359 		KEY_13,
3360 		0,
3361 		0,
3362 		"",						// precache
3363 		"models/keys/key.wav",	// sounds
3364 		{0,0,0,0}
3365 	},
3366 */
3367 
3368 /* key_key14 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3369 key 14
3370 
3371 pickup sound : "sound/pickup/keys/key14.wav"
3372 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3373 model="models/powerups/keys/key.md3"
3374 */
3375 /*
3376 	{
3377 		"key_key14",
3378 		"sound/pickup/keys/key14.wav",
3379 		{
3380 			"models/powerups/keys/key.md3",
3381 			0, 0, 0
3382 		,	0 },
3383 		"icons/key14",			// icon
3384 		NULL,					// ammo icon
3385 		"Key 14",				// pickup
3386 		0,
3387 		IT_KEY,
3388 		KEY_14,
3389 		0,
3390 		0,
3391 		"",						// precache
3392 		"models/keys/key.wav",	// sounds
3393 		{0,0,0,0}
3394 	},
3395 */
3396 
3397 /* key_key15 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3398 key 15
3399 
3400 pickup sound : "sound/pickup/keys/key15.wav"
3401 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3402 model="models/powerups/keys/key.md3"
3403 */
3404 /*
3405 	{
3406 		"key_key15",
3407 		"sound/pickup/keys/key15.wav",
3408 		{
3409 			"models/powerups/keys/key.md3",
3410 			0, 0, 0
3411 		,	0 },
3412 		"icons/key15",			// icon
3413 		NULL,					// ammo icon
3414 		"Key 15",				// pickup
3415 		0,
3416 		IT_KEY,
3417 		KEY_15,
3418 		0,
3419 		0,
3420 		"",						// precache
3421 		"models/keys/key.wav",	// sounds
3422 		{0,0,0,0}
3423 	},
3424 */
3425 
3426 /* key_key16 (1 1 0) (-8 -8 -8) (8 8 8) SUSPENDED SPIN - RESPAWN
3427 key 16
3428 
3429 pickup sound : "sound/pickup/keys/key16.wav"
3430 -------- MODEL FOR RADIANT ONLY - DO NOT SET THIS AS A KEY --------
3431 model="models/powerups/keys/key.md3"
3432 */
3433 /*
3434 	{
3435 		"key_key16",
3436 		"sound/pickup/keys/key16.wav",
3437 		{
3438 			"models/powerups/keys/key.md3",
3439 			0, 0, 0
3440 		,	0 },
3441 		"icons/key16",			// icon
3442 		NULL,					// ammo icon
3443 		"Key 16",				// pickup
3444 		0,
3445 		IT_KEY,
3446 		KEY_16,
3447 		0,
3448 		0,
3449 		"",						// precache
3450 		"models/keys/key.wav",	// sounds
3451 		{0,0,0,0}
3452 	},
3453 */
3454 
3455 
3456 
3457 	// end of list marker
3458 	{NULL}
3459 };
3460 // END JOSEPH
3461 
3462 int	bg_numItems = ARRAY_LEN( bg_itemlist ) - 1;
3463 
3464 
3465 /*
3466 ==============
3467 BG_FindItemForPowerup
3468 ==============
3469 */
BG_FindItemForPowerup(powerup_t pw)3470 gitem_t *BG_FindItemForPowerup( powerup_t pw ) {
3471 	int i;
3472 
3473 	for ( i = 0 ; i < bg_numItems ; i++ ) {
3474 		if ( ( bg_itemlist[i].giType == IT_POWERUP ||
3475 			   bg_itemlist[i].giType == IT_TEAM ) &&
3476 			 bg_itemlist[i].giTag == pw ) {
3477 			return &bg_itemlist[i];
3478 		}
3479 	}
3480 
3481 	return NULL;
3482 }
3483 
3484 
3485 /*
3486 ==============
3487 BG_FindItemForHoldable
3488 ==============
3489 */
BG_FindItemForHoldable(holdable_t pw)3490 gitem_t *BG_FindItemForHoldable( holdable_t pw ) {
3491 	int i;
3492 
3493 	for ( i = 0 ; i < bg_numItems ; i++ ) {
3494 		if ( bg_itemlist[i].giType == IT_HOLDABLE && bg_itemlist[i].giTag == pw ) {
3495 			return &bg_itemlist[i];
3496 		}
3497 	}
3498 
3499 //	Com_Error( ERR_DROP, "HoldableItem not found" );
3500 
3501 	return NULL;
3502 }
3503 
3504 
3505 /*
3506 ===============
3507 BG_FindItemForWeapon
3508 
3509 ===============
3510 */
BG_FindItemForWeapon(weapon_t weapon)3511 gitem_t *BG_FindItemForWeapon( weapon_t weapon ) {
3512 	gitem_t *it;
3513 	int i;
3514 	const int NUM_TABLE_ELEMENTS = WP_NUM_WEAPONS;
3515 	static gitem_t  *lookupTable[WP_NUM_WEAPONS];
3516 	static qboolean lookupTableInit = qtrue;
3517 
3518 	if ( lookupTableInit ) {
3519 		for ( i = 0; i < NUM_TABLE_ELEMENTS; i++ ) {
3520 			lookupTable[i] = 0; // default value for no match found
3521 			for ( it = bg_itemlist + 1 ; it->classname ; it++ ) {
3522 				if ( it->giType == IT_WEAPON && it->giTag == i ) {
3523 					lookupTable[i] = it;
3524 				}
3525 			}
3526 		}
3527 		// table is created
3528 		lookupTableInit = qfalse;
3529 	}
3530 
3531 	if ( weapon > NUM_TABLE_ELEMENTS ) {
3532 		Com_Error( ERR_DROP, "BG_FindItemForWeapon: weapon out of range %i", weapon );
3533 	}
3534 
3535 	if ( !lookupTable[weapon] ) {
3536 		Com_Error( ERR_DROP, "Couldn't find item for weapon %i", weapon );
3537 	}
3538 
3539 	// get the weapon from the lookup table
3540 	return lookupTable[weapon];
3541 }
3542 
3543 //----(SA) added
3544 
3545 #define DEATHMATCH_SHARED_AMMO 0
3546 
3547 
3548 /*
3549 ==============
3550 BG_FindClipForWeapon
3551 ==============
3552 */
BG_FindClipForWeapon(weapon_t weapon)3553 weapon_t BG_FindClipForWeapon( weapon_t weapon ) {
3554 	gitem_t *it;
3555 	int i;
3556 	const int NUM_TABLE_ELEMENTS = WP_NUM_WEAPONS;
3557 	static weapon_t lookupTable[WP_NUM_WEAPONS];
3558 	static qboolean lookupTableInit = qtrue;
3559 
3560 	if ( lookupTableInit ) {
3561 		for ( i = 0; i < NUM_TABLE_ELEMENTS; i++ ) {
3562 			lookupTable[i] = 0; // default value for no match found
3563 			for ( it = bg_itemlist + 1 ; it->classname ; it++ ) {
3564 				if ( it->giType == IT_WEAPON && it->giTag == i ) {
3565 					lookupTable[i] = it->giClipIndex;
3566 				}
3567 			}
3568 		}
3569 		// table is created
3570 		lookupTableInit = qfalse;
3571 	}
3572 
3573 	if ( weapon > NUM_TABLE_ELEMENTS ) {
3574 		Com_Error( ERR_DROP, "BG_FindClipForWeapon: weapon out of range %i", weapon );
3575 	}
3576 
3577 	// get the weapon from the lookup table
3578 	return lookupTable[weapon];
3579 }
3580 
3581 
3582 
3583 /*
3584 ==============
3585 BG_FindAmmoForWeapon
3586 ==============
3587 */
BG_FindAmmoForWeapon(weapon_t weapon)3588 weapon_t BG_FindAmmoForWeapon( weapon_t weapon ) {
3589 	gitem_t *it;
3590 	int i;
3591 	const int NUM_TABLE_ELEMENTS = WP_NUM_WEAPONS;
3592 	static weapon_t lookupTable[WP_NUM_WEAPONS];
3593 	static qboolean lookupTableInit = qtrue;
3594 
3595 	if ( lookupTableInit ) {
3596 		for ( i = 0; i < NUM_TABLE_ELEMENTS; i++ ) {
3597 			lookupTable[i] = 0; // default value for no match found
3598 			for ( it = bg_itemlist + 1 ; it->classname ; it++ ) {
3599 				if ( it->giType == IT_WEAPON && it->giTag == i ) {
3600 					lookupTable[i] = it->giAmmoIndex;
3601 				}
3602 			}
3603 		}
3604 		// table is created
3605 		lookupTableInit = qfalse;
3606 	}
3607 
3608 	if ( weapon > NUM_TABLE_ELEMENTS ) {
3609 		Com_Error( ERR_DROP, "BG_FindAmmoForWeapon: weapon out of range %i", weapon );
3610 	}
3611 
3612 	// get the weapon from the lookup table
3613 	return lookupTable[weapon];
3614 }
3615 
3616 /*
3617 ==============
3618 BG_AkimboFireSequence
3619 	returns 'true' if it's the left hand's turn to fire, 'false' if it's the right hand's turn
3620 ==============
3621 */
3622 //qboolean BG_AkimboFireSequence( playerState_t *ps ) {
BG_AkimboFireSequence(int weapon,int akimboClip,int coltClip)3623 qboolean BG_AkimboFireSequence( int weapon, int akimboClip, int coltClip ) {
3624 	// NOTE: this doesn't work when clips are turned off (dmflags 64)
3625 
3626 	if ( weapon != WP_AKIMBO ) {
3627 		return qfalse;
3628 	}
3629 
3630 	if ( !akimboClip ) {
3631 		return qfalse;
3632 	}
3633 
3634 	// no ammo in colt, must be akimbo turn
3635 	if ( !coltClip ) {
3636 		return qtrue;
3637 	}
3638 
3639 	// at this point, both have ammo
3640 
3641 	// now check 'cycle'   // (removed old method 11/5/2001)
3642 	if ( ( akimboClip + coltClip ) & 1 ) {
3643 		return qfalse;
3644 	}
3645 
3646 	return qtrue;
3647 }
3648 
3649 //----(SA) end
3650 
3651 //----(SA) Added keys
3652 /*
3653 ==============
3654 BG_FindItemForKey
3655 ==============
3656 */
BG_FindItemForKey(wkey_t k,int * indexreturn)3657 gitem_t *BG_FindItemForKey( wkey_t k, int *indexreturn ) {
3658 	int i;
3659 
3660 	for ( i = 0 ; i < bg_numItems ; i++ ) {
3661 		if ( bg_itemlist[i].giType == IT_KEY && bg_itemlist[i].giTag == k ) {
3662 			{
3663 				if ( indexreturn ) {
3664 					*indexreturn = i;
3665 				}
3666 				return &bg_itemlist[i];
3667 			}
3668 		}
3669 	}
3670 
3671 	Com_Error( ERR_DROP, "Key %d not found", k );
3672 	return NULL;
3673 }
3674 //----(SA) end
3675 
3676 
3677 //----(SA) added
3678 /*
3679 ==============
3680 BG_FindItemForAmmo
3681 ==============
3682 */
BG_FindItemForAmmo(int ammo)3683 gitem_t *BG_FindItemForAmmo( int ammo ) {
3684 	int i = 0;
3685 
3686 	for (; i < bg_numItems; i++ )
3687 	{
3688 		if ( bg_itemlist[i].giType == IT_AMMO && bg_itemlist[i].giAmmoIndex == ammo ) {
3689 			return &bg_itemlist[i];
3690 		}
3691 	}
3692 	Com_Error( ERR_DROP, "Item not found for ammo: %d", ammo );
3693 	return NULL;
3694 }
3695 //----(SA) end
3696 
3697 
3698 /*
3699 ===============
3700 BG_FindItem
3701 
3702 ===============
3703 */
BG_FindItem(const char * pickupName)3704 gitem_t *BG_FindItem( const char *pickupName ) {
3705 	gitem_t *it;
3706 
3707 	for ( it = bg_itemlist + 1 ; it->classname ; it++ ) {
3708 		if ( !Q_stricmp( it->pickup_name, pickupName ) ) {
3709 			return it;
3710 		}
3711 	}
3712 
3713 	return NULL;
3714 }
3715 
3716 /*
3717 ==============
3718 BG_FindItem2
3719 	also check classname
3720 ==============
3721 */
BG_FindItem2(const char * name)3722 gitem_t *BG_FindItem2( const char *name ) {
3723 	gitem_t *it;
3724 	char *name2;
3725 
3726 	name2 = (char*)name;
3727 
3728 	for ( it = bg_itemlist + 1 ; it->classname ; it++ ) {
3729 		if ( !Q_stricmp( it->pickup_name, name ) ) {
3730 			return it;
3731 		}
3732 
3733 		if ( !Q_strcasecmp( it->classname, name2 ) ) {
3734 			return it;
3735 		}
3736 	}
3737 
3738 	Com_Printf( "BG_FindItem2(): unable to locate item '%s'\n", name );
3739 
3740 	return NULL;
3741 }
3742 
3743 //----(SA)	added
3744 /*
3745 ==============
3746 BG_PlayerSeesItem
3747 	Try to quickly determine if an item should be highlighted as per the current cg_drawCrosshairPickups.integer value.
3748 	pvs check should have already been done by the time we get in here, so we shouldn't have to check
3749 ==============
3750 */
3751 
3752 //----(SA)	not used
3753 /*
3754 qboolean BG_PlayerSeesItem(playerState_t *ps, entityState_t *item, int atTime)
3755 {
3756    vec3_t	vorigin, eorigin, viewa, dir;
3757    float	dot, dist, foo;
3758 
3759    BG_EvaluateTrajectory( &item->pos, atTime, eorigin );
3760 
3761    VectorCopy(ps->origin, vorigin);
3762    vorigin[2] += ps->viewheight;			// get the view loc up to the viewheight
3763    eorigin[2] += 16;						// and subtract the item's offset (that is used to place it on the ground)
3764    VectorSubtract(vorigin, eorigin, dir);
3765 
3766    dist = VectorNormalize(dir);			// dir is now the direction from the item to the player
3767 
3768    if(dist > 255)
3769 	   return qfalse;						// only run the remaining stuff on items that are close enough
3770 
3771    // (SA) FIXME: do this without AngleVectors.
3772    //		It'd be nice if the angle vectors for the player
3773    //		have already been figured at this point and I can
3774    //		just pick them up.  (if anybody is storing this somewhere,
3775    //		for the current frame please let me know so I don't
3776    //		have to do redundant calcs)
3777    AngleVectors(ps->viewangles, viewa, 0, 0);
3778    dot = DotProduct(viewa, dir );
3779 
3780    // give more range based on distance (the hit area is wider when closer)
3781 
3782    foo = -0.94f - (dist/255.0f) * 0.057f;	// (ranging from -0.94 to -0.997) (it happened to be a pretty good range)
3783 
3784 //	Com_Printf("test: if(%f > %f) return qfalse (dot > foo)\n", dot, foo);
3785    if(dot > foo)
3786 	   return qfalse;
3787 
3788    return qtrue;
3789 }
3790 */
3791 //----(SA)	end
3792 
3793 
3794 /*
3795 ============
3796 BG_PlayerTouchesItem
3797 
3798 Items can be picked up without actually touching their physical bounds to make
3799 grabbing them easier
3800 ============
3801 */
3802 
3803 extern int trap_Cvar_VariableIntegerValue( const char *var_name );
3804 
BG_PlayerTouchesItem(playerState_t * ps,entityState_t * item,int atTime)3805 qboolean    BG_PlayerTouchesItem( playerState_t *ps, entityState_t *item, int atTime ) {
3806 	vec3_t origin;
3807 
3808 	BG_EvaluateTrajectory( &item->pos, atTime, origin );
3809 
3810 	// we are ignoring ducked differences here
3811 	if ( ps->origin[0] - origin[0] > 44
3812 		 || ps->origin[0] - origin[0] < -50
3813 		 || ps->origin[1] - origin[1] > 36
3814 		 || ps->origin[1] - origin[1] < -36
3815 		 || ps->origin[2] - origin[2] > 36
3816 		 || ps->origin[2] - origin[2] < -36 ) {
3817 		return qfalse;
3818 	}
3819 
3820 	return qtrue;
3821 }
3822 
3823 
3824 
3825 #define AMMOFORWEAP BG_FindAmmoForWeapon( item->giTag )
3826 /*
3827 ================
3828 BG_CanItemBeGrabbed
3829 
3830 Returns false if the item should not be picked up.
3831 This needs to be the same for client side prediction and server use.
3832 ================
3833 */
3834 
isClipOnly(int weap)3835 qboolean isClipOnly( int weap ) {
3836 	switch ( weap ) {
3837 	case WP_GRENADE_LAUNCHER:
3838 	case WP_GRENADE_PINEAPPLE:
3839 	case WP_DYNAMITE:
3840 	case WP_TESLA:
3841 	case WP_FLAMETHROWER:
3842 		return qtrue;
3843 	}
3844 	return qfalse;
3845 }
3846 
3847 
BG_CanItemBeGrabbed(const entityState_t * ent,const playerState_t * ps)3848 qboolean    BG_CanItemBeGrabbed( const entityState_t *ent, const playerState_t *ps ) {
3849 	gitem_t *item;
3850 	int ammoweap;
3851 	qboolean multiplayer = qfalse;
3852 
3853 	if ( ent->modelindex < 1 || ent->modelindex >= bg_numItems ) {
3854 		Com_Error( ERR_DROP, "BG_CanItemBeGrabbed: index out of range" );
3855 	}
3856 
3857 //----(SA)	check for mp
3858 #ifdef GAMEDLL
3859 	if ( g_gametype.integer == GT_WOLF )
3860 #endif
3861 #ifdef CGAMEDLL
3862 	if ( cg_gameType.integer == GT_WOLF )
3863 #endif
3864 	multiplayer = qtrue;
3865 //----(SA)	end
3866 
3867 	item = &bg_itemlist[ent->modelindex];
3868 
3869 	switch ( item->giType ) {
3870 
3871 	case IT_WEAPON:
3872 		// JPW NERVE -- medics & engineers can only pick up same weapon type
3873 		if ( multiplayer ) {
3874 			if ( ( ps->stats[STAT_PLAYER_CLASS] == PC_MEDIC ) || ( ps->stats[STAT_PLAYER_CLASS] == PC_ENGINEER ) ) {
3875 				if ( !COM_BitCheck( ps->weapons, item->giTag ) ) {
3876 					return qfalse;
3877 				}
3878 			}
3879 		} else {
3880 			if ( COM_BitCheck( ps->weapons, item->giTag ) ) {               // you have the weap
3881 				if ( isClipOnly( item->giTag ) ) {
3882 					if ( ps->ammoclip[item->giAmmoIndex] >= ammoTable[item->giAmmoIndex].maxclip ) {
3883 						return qfalse;
3884 					}
3885 				} else {
3886 					if ( ps->ammo[item->giAmmoIndex] >= ammoTable[item->giAmmoIndex].maxammo ) { // you are loaded with the ammo
3887 						return qfalse;
3888 					}
3889 				}
3890 			}
3891 		}
3892 		// JPW
3893 		return qtrue;
3894 
3895 	case IT_AMMO:
3896 		ammoweap = BG_FindAmmoForWeapon( item->giTag );
3897 
3898 		if ( isClipOnly( ammoweap ) ) {
3899 			if ( ps->ammoclip[ammoweap] >= ammoTable[ammoweap].maxclip ) {
3900 				return qfalse;
3901 			}
3902 		}
3903 
3904 		if ( ps->ammo[ammoweap] >= ammoTable[ammoweap].maxammo ) {
3905 			return qfalse;
3906 		}
3907 
3908 		return qtrue;
3909 
3910 	case IT_ARMOR:
3911 		// we also clamp armor to the maxhealth for handicapping
3912 //			if ( ps->stats[STAT_ARMOR] >= ps->stats[STAT_MAX_HEALTH] * 2 ) {
3913 		if ( ps->stats[STAT_ARMOR] >= 100 ) {
3914 			return qfalse;
3915 		}
3916 		return qtrue;
3917 
3918 	case IT_HEALTH:
3919 		if ( ent->density == ( 1 << 9 ) ) { // density tracks how many uses left
3920 			return qfalse;
3921 		}
3922 
3923 		if ( ps->stats[STAT_HEALTH] >= ps->stats[STAT_MAX_HEALTH] ) {
3924 			return qfalse;
3925 		}
3926 		return qtrue;
3927 
3928 	case IT_POWERUP:
3929 		if ( ent->density == ( 1 << 9 ) ) { // density tracks how many uses left
3930 			return qfalse;
3931 		}
3932 
3933 		if ( ps->powerups[PW_NOFATIGUE] == 60000 ) { // full
3934 			return qfalse;
3935 		}
3936 
3937 		return qtrue;
3938 
3939 	case IT_TEAM:     // team items, such as flags
3940 
3941 		// DHM - Nerve :: otherEntity2 is now used instead of modelindex2
3942 		// ent->modelindex2 is non-zero on items if they are dropped
3943 		// we need to know this because we can pick up our dropped flag (and return it)
3944 		// but we can't pick up our flag at base
3945 		if ( ps->persistant[PERS_TEAM] == TEAM_RED ) {
3946 			if ( item->giTag == PW_BLUEFLAG ||
3947 				 ( item->giTag == PW_REDFLAG && ent->otherEntityNum2 /*ent->modelindex2*/ ) ||
3948 				 ( item->giTag == PW_REDFLAG && ps->powerups[PW_BLUEFLAG] ) ) {
3949 				return qtrue;
3950 			}
3951 		} else if ( ps->persistant[PERS_TEAM] == TEAM_BLUE ) {
3952 			if ( item->giTag == PW_REDFLAG ||
3953 				 ( item->giTag == PW_BLUEFLAG && ent->otherEntityNum2 /*ent->modelindex2*/ ) ||
3954 				 ( item->giTag == PW_BLUEFLAG && ps->powerups[PW_REDFLAG] ) ) {
3955 				return qtrue;
3956 			}
3957 		}
3958 		return qfalse;
3959 
3960 
3961 	case IT_HOLDABLE:
3962 		return qtrue;
3963 
3964 	case IT_TREASURE:       // treasure always picked up
3965 		return qtrue;
3966 
3967 	case IT_CLIPBOARD:      // clipboards always picked up
3968 		return qtrue;
3969 
3970 		//---- (SA) Wolf keys
3971 	case IT_KEY:
3972 		return qtrue;       // keys are always picked up
3973 
3974 	case IT_BAD:
3975 		Com_Error( ERR_DROP, "BG_CanItemBeGrabbed: IT_BAD" );
3976 	default:
3977 #ifndef Q3_VM
3978 #ifndef NDEBUG
3979           Com_Printf("BG_CanItemBeGrabbed: unknown enum %d\n", item->giType );
3980 #endif
3981 #endif
3982          break;
3983 	}
3984 
3985 	return qfalse;
3986 }
3987 
3988 //======================================================================
3989 
3990 /*
3991 ================
3992 BG_EvaluateTrajectory
3993 
3994 ================
3995 */
BG_EvaluateTrajectory(const trajectory_t * tr,int atTime,vec3_t result)3996 void BG_EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result ) {
3997 	float deltaTime;
3998 	float phase;
3999 	vec3_t v;
4000 
4001 	switch ( tr->trType ) {
4002 	case TR_STATIONARY:
4003 	case TR_INTERPOLATE:
4004 	case TR_GRAVITY_PAUSED: //----(SA)
4005 		VectorCopy( tr->trBase, result );
4006 		break;
4007 	case TR_LINEAR:
4008 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4009 		VectorMA( tr->trBase, deltaTime, tr->trDelta, result );
4010 		break;
4011 	case TR_SINE:
4012 		deltaTime = ( atTime - tr->trTime ) / (float) tr->trDuration;
4013 		phase = sin( deltaTime * M_PI * 2 );
4014 		VectorMA( tr->trBase, phase, tr->trDelta, result );
4015 		break;
4016 //----(SA)	removed
4017 	case TR_LINEAR_STOP:
4018 		if ( atTime > tr->trTime + tr->trDuration ) {
4019 			atTime = tr->trTime + tr->trDuration;
4020 		}
4021 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4022 		if ( deltaTime < 0 ) {
4023 			deltaTime = 0;
4024 		}
4025 		VectorMA( tr->trBase, deltaTime, tr->trDelta, result );
4026 		break;
4027 	case TR_GRAVITY:
4028 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4029 		VectorMA( tr->trBase, deltaTime, tr->trDelta, result );
4030 		result[2] -= 0.5 * DEFAULT_GRAVITY * deltaTime * deltaTime;     // FIXME: local gravity...
4031 		break;
4032 		// Ridah
4033 	case TR_GRAVITY_LOW:
4034 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4035 		VectorMA( tr->trBase, deltaTime, tr->trDelta, result );
4036 		result[2] -= 0.5 * ( DEFAULT_GRAVITY * 0.3 ) * deltaTime * deltaTime;     // FIXME: local gravity...
4037 		break;
4038 		// done.
4039 //----(SA)
4040 	case TR_GRAVITY_FLOAT:
4041 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4042 		VectorMA( tr->trBase, deltaTime, tr->trDelta, result );
4043 		result[2] -= 0.5 * ( DEFAULT_GRAVITY * 0.2 ) * deltaTime;
4044 		break;
4045 //----(SA)	end
4046 		// RF, acceleration
4047 	case TR_ACCELERATE:     // trDelta is the ultimate speed
4048 		if ( atTime > tr->trTime + tr->trDuration ) {
4049 			atTime = tr->trTime + tr->trDuration;
4050 		}
4051 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4052 		// phase is the acceleration constant
4053 		phase = VectorLength( tr->trDelta ) / ( tr->trDuration * 0.001 );
4054 		// trDelta at least gives us the acceleration direction
4055 		VectorNormalize2( tr->trDelta, result );
4056 		// get distance travelled at current time
4057 		VectorMA( tr->trBase, phase * 0.5 * deltaTime * deltaTime, result, result );
4058 		break;
4059 	case TR_DECCELERATE:    // trDelta is the starting speed
4060 		if ( atTime > tr->trTime + tr->trDuration ) {
4061 			atTime = tr->trTime + tr->trDuration;
4062 		}
4063 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4064 		// phase is the breaking constant
4065 		phase = VectorLength( tr->trDelta ) / ( tr->trDuration * 0.001 );
4066 		// trDelta at least gives us the acceleration direction
4067 		VectorNormalize2( tr->trDelta, result );
4068 		// get distance travelled at current time (without breaking)
4069 		VectorMA( tr->trBase, deltaTime, tr->trDelta, v );
4070 		// subtract breaking force
4071 		VectorMA( v, -phase * 0.5 * deltaTime * deltaTime, result, result );
4072 		break;
4073 	default:
4074 		Com_Error( ERR_DROP, "BG_EvaluateTrajectory: unknown trType: %i", tr->trType );
4075 		break;
4076 	}
4077 }
4078 
4079 /*
4080 ================
4081 BG_EvaluateTrajectoryDelta
4082 
4083 For determining velocity at a given time
4084 ================
4085 */
BG_EvaluateTrajectoryDelta(const trajectory_t * tr,int atTime,vec3_t result)4086 void BG_EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result ) {
4087 	float deltaTime;
4088 	float phase;
4089 
4090 	switch ( tr->trType ) {
4091 	case TR_STATIONARY:
4092 	case TR_INTERPOLATE:
4093 		VectorClear( result );
4094 		break;
4095 	case TR_LINEAR:
4096 		VectorCopy( tr->trDelta, result );
4097 		break;
4098 	case TR_SINE:
4099 		deltaTime = ( atTime - tr->trTime ) / (float) tr->trDuration;
4100 		phase = cos( deltaTime * M_PI * 2 );    // derivative of sin = cos
4101 		phase *= 0.5;
4102 		VectorScale( tr->trDelta, phase, result );
4103 		break;
4104 //----(SA)	removed
4105 	case TR_LINEAR_STOP:
4106 		if ( atTime > tr->trTime + tr->trDuration ) {
4107 			VectorClear( result );
4108 			return;
4109 		}
4110 		VectorCopy( tr->trDelta, result );
4111 		break;
4112 	case TR_GRAVITY:
4113 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4114 		VectorCopy( tr->trDelta, result );
4115 		result[2] -= DEFAULT_GRAVITY * deltaTime;       // FIXME: local gravity...
4116 		break;
4117 		// Ridah
4118 	case TR_GRAVITY_LOW:
4119 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4120 		VectorCopy( tr->trDelta, result );
4121 		result[2] -= ( DEFAULT_GRAVITY * 0.3 ) * deltaTime;       // FIXME: local gravity...
4122 		break;
4123 		// done.
4124 //----(SA)
4125 	case TR_GRAVITY_FLOAT:
4126 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4127 		VectorCopy( tr->trDelta, result );
4128 		result[2] -= ( DEFAULT_GRAVITY * 0.2 ) * deltaTime;
4129 		break;
4130 //----(SA)	end
4131 		// RF, acceleration
4132 	case TR_ACCELERATE: // trDelta is eventual speed
4133 		if ( atTime > tr->trTime + tr->trDuration ) {
4134 			VectorClear( result );
4135 			return;
4136 		}
4137 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4138 		VectorScale( tr->trDelta, deltaTime * deltaTime, result );
4139 		break;
4140 	case TR_DECCELERATE:    // trDelta is breaking force
4141 		if ( atTime > tr->trTime + tr->trDuration ) {
4142 			VectorClear( result );
4143 			return;
4144 		}
4145 		deltaTime = ( atTime - tr->trTime ) * 0.001;    // milliseconds to seconds
4146 		VectorScale( tr->trDelta, deltaTime, result );
4147 		break;
4148 	default:
4149 		Com_Error( ERR_DROP, "BG_EvaluateTrajectoryDelta: unknown trType: %i", tr->trType );
4150 		break;
4151 	}
4152 }
4153 
4154 /*
4155 ============
4156 BG_GetMarkDir
4157 
4158   used to find a good directional vector for a mark projection, which will be more likely
4159   to wrap around adjacent surfaces
4160 
4161   dir is the direction of the projectile or trace that has resulted in a surface being hit
4162 ============
4163 */
BG_GetMarkDir(const vec3_t dir,const vec3_t normal,vec3_t out)4164 void BG_GetMarkDir( const vec3_t dir, const vec3_t normal, vec3_t out ) {
4165 	vec3_t ndir, lnormal;
4166 	float minDot = 0.3;
4167 
4168 	if ( VectorLength( normal ) < 1.0 ) {
4169 		VectorSet( lnormal, 0, 0, 1 );
4170 	} else {
4171 		VectorCopy( normal, lnormal );
4172 	}
4173 
4174 	VectorNegate( dir, ndir );
4175 	VectorNormalize( ndir );
4176 	if ( normal[2] > 0.8 ) {
4177 		minDot = 0.7;
4178 	}
4179 	// make sure it makrs the impact surface
4180 	while ( DotProduct( ndir, lnormal ) < minDot ) {
4181 		VectorMA( ndir, 0.5, lnormal, ndir );
4182 		VectorNormalize( ndir );
4183 	}
4184 
4185 	VectorCopy( ndir, out );
4186 }
4187 
4188 
4189 char *eventnames[] = {
4190 	"EV_NONE",
4191 	"EV_FOOTSTEP",
4192 	"EV_FOOTSTEP_METAL",
4193 	"EV_FOOTSTEP_WOOD",
4194 	"EV_FOOTSTEP_GRASS",
4195 	"EV_FOOTSTEP_GRAVEL",
4196 	"EV_FOOTSTEP_ROOF",
4197 	"EV_FOOTSTEP_SNOW",
4198 	"EV_FOOTSTEP_CARPET",
4199 	"EV_FOOTSPLASH",
4200 	"EV_FOOTWADE",
4201 	"EV_SWIM",
4202 	"EV_STEP_4",
4203 	"EV_STEP_8",
4204 	"EV_STEP_12",
4205 	"EV_STEP_16",
4206 	"EV_FALL_SHORT",
4207 	"EV_FALL_MEDIUM",
4208 	"EV_FALL_FAR",
4209 	"EV_FALL_NDIE",
4210 	"EV_FALL_DMG_10",
4211 	"EV_FALL_DMG_15",
4212 	"EV_FALL_DMG_25",
4213 	"EV_FALL_DMG_50",
4214 	"EV_JUMP_PAD",           // boing sound at origin, jump sound on player
4215 	"EV_JUMP",
4216 	"EV_WATER_TOUCH",    // foot touches
4217 	"EV_WATER_LEAVE",    // foot leaves
4218 	"EV_WATER_UNDER",    // head touches
4219 	"EV_WATER_CLEAR",    // head leaves
4220 	"EV_ITEM_PICKUP",            // normal item pickups are predictable
4221 	"EV_ITEM_PICKUP_QUIET",  // (SA) same, but don't play the default pickup sound as it was specified in the ent
4222 	"EV_GLOBAL_ITEM_PICKUP", // powerup / team sounds are broadcast to everyone
4223 	"EV_NOITEM",
4224 	"EV_NOAMMO",
4225 	"EV_EMPTYCLIP",
4226 	"EV_FILL_CLIP",
4227 	"EV_WEAP_OVERHEAT",
4228 	"EV_CHANGE_WEAPON",
4229 	"EV_FIRE_WEAPON",
4230 	"EV_FIRE_WEAPONB",
4231 	"EV_FIRE_WEAPON_LASTSHOT",
4232 	"EV_FIRE_QUICKGREN", // "Quickgrenade"
4233 	"EV_NOFIRE_UNDERWATER",
4234 	"EV_FIRE_WEAPON_MG42",
4235 	"EV_SUGGESTWEAP",        //----(SA)	added
4236 	"EV_GRENADE_SUICIDE",    //----(SA)	added
4237 	"EV_USE_ITEM0",
4238 	"EV_USE_ITEM1",
4239 	"EV_USE_ITEM2",
4240 	"EV_USE_ITEM3",
4241 	"EV_USE_ITEM4",
4242 	"EV_USE_ITEM5",
4243 	"EV_USE_ITEM6",
4244 	"EV_USE_ITEM7",
4245 	"EV_USE_ITEM8",
4246 	"EV_USE_ITEM9",
4247 	"EV_USE_ITEM10",
4248 	"EV_USE_ITEM11",
4249 	"EV_USE_ITEM12",
4250 	"EV_USE_ITEM13",
4251 	"EV_USE_ITEM14",
4252 	"EV_USE_ITEM15",
4253 	"EV_ITEM_RESPAWN",
4254 	"EV_ITEM_POP",
4255 	"EV_PLAYER_TELEPORT_IN",
4256 	"EV_PLAYER_TELEPORT_OUT",
4257 	"EV_GRENADE_BOUNCE",     // eventParm will be the soundindex
4258 	"EV_GENERAL_SOUND",
4259 	"EV_GLOBAL_SOUND",       // no attenuation
4260 	"EV_BULLET_HIT_FLESH",
4261 	"EV_BULLET_HIT_WALL",
4262 	"EV_MISSILE_HIT",
4263 	"EV_MISSILE_MISS",
4264 	"EV_RAILTRAIL",
4265 	"EV_VENOM",
4266 	"EV_VENOMFULL",
4267 	"EV_BULLET",             // otherEntity is the shooter
4268 	"EV_LOSE_HAT",
4269 	"EV_GIB_HEAD",           // only blow off the head
4270 	"EV_PAIN",
4271 	"EV_CROUCH_PAIN",
4272 	"EV_DEATH1",
4273 	"EV_DEATH2",
4274 	"EV_DEATH3",
4275 	"EV_ENTDEATH",           //----(SA)	added
4276 	"EV_OBITUARY",
4277 	"EV_POWERUP_QUAD",
4278 	"EV_POWERUP_BATTLESUIT",
4279 	"EV_POWERUP_REGEN",
4280 	"EV_GIB_PLAYER",         // gib a previously living player
4281 	"EV_DEBUG_LINE",
4282 	"EV_STOPLOOPINGSOUND",
4283 	"EV_STOPSTREAMINGSOUND", //----(SA)	added
4284 	"EV_TAUNT",
4285 	"EV_SMOKE",
4286 	"EV_SPARKS",
4287 	"EV_SPARKS_ELECTRIC",
4288 	"EV_BATS",
4289 	"EV_BATS_UPDATEPOSITION",
4290 	"EV_BATS_DEATH",
4291 	"EV_EXPLODE",        // func_explosive
4292 	"EV_EFFECT",     // target_effect
4293 	"EV_MORTAREFX",  // mortar firing
4294 	"EV_SPINUP", // JPW NERVE panzerfaust preamble for MP balance
4295 	"EV_SNOW_ON",
4296 	"EV_SNOW_OFF",
4297 	"EV_MISSILE_MISS_SMALL",
4298 	"EV_MISSILE_MISS_LARGE",
4299 	"EV_WOLFKICK_HIT_FLESH",
4300 	"EV_WOLFKICK_HIT_WALL",
4301 	"EV_WOLFKICK_MISS",
4302 	"EV_SPIT_HIT",
4303 	"EV_SPIT_MISS",
4304 	"EV_SHARD",
4305 	"EV_JUNK",
4306 	"EV_EMITTER",    //----(SA)	added
4307 	"EV_OILPARTICLES",
4308 	"EV_OILSLICK",
4309 	"EV_OILSLICKREMOVE",
4310 	"EV_MG42EFX",
4311 	"EV_FLAMEBARREL_BOUNCE",
4312 	"EV_FLAKGUN1",
4313 	"EV_FLAKGUN2",
4314 	"EV_FLAKGUN3",
4315 	"EV_FLAKGUN4",
4316 	"EV_EXERT1",
4317 	"EV_EXERT2",
4318 	"EV_EXERT3",
4319 	"EV_SNOWFLURRY",
4320 	"EV_CONCUSSIVE",
4321 	"EV_DUST",
4322 	"EV_RUMBLE_EFX",
4323 	"EV_GUNSPARKS",
4324 	"EV_FLAMETHROWER_EFFECT",
4325 	"EV_SNIPER_SOUND",
4326 	"EV_POPUP",
4327 	"EV_POPUPBOOK",
4328 	"EV_GIVEPAGE",
4329 	"EV_CLOSEMENU",
4330 
4331 	"EV_MAX_EVENTS"
4332 };
4333 
4334 /*
4335 ===============
4336 BG_AddPredictableEventToPlayerstate
4337 
4338 Handles the sequence numbers
4339 ===============
4340 */
4341 
4342 void    trap_Cvar_VariableStringBuffer( const char *var_name, char *buffer, int bufsize );
4343 
BG_AddPredictableEventToPlayerstate(int newEvent,int eventParm,playerState_t * ps)4344 void BG_AddPredictableEventToPlayerstate( int newEvent, int eventParm, playerState_t *ps ) {
4345 
4346 #ifdef _DEBUG
4347 	{
4348 		char buf[256];
4349 		trap_Cvar_VariableStringBuffer( "showevents", buf, sizeof( buf ) );
4350 		if ( atof( buf ) != 0 ) {
4351 #ifdef QAGAME
4352 			Com_Printf( " game event svt %5d -> %5d: num = %20s parm %d\n", ps->pmove_framecount /*ps->commandTime*/, ps->eventSequence, eventnames[newEvent], eventParm );
4353 #else
4354 			Com_Printf( "Cgame event svt %5d -> %5d: num = %20s parm %d\n", ps->pmove_framecount /*ps->commandTime*/, ps->eventSequence, eventnames[newEvent], eventParm );
4355 #endif
4356 		}
4357 	}
4358 #endif
4359 	ps->events[ps->eventSequence & ( MAX_EVENTS - 1 )] = newEvent;
4360 	ps->eventParms[ps->eventSequence & ( MAX_EVENTS - 1 )] = eventParm;
4361 	ps->eventSequence++;
4362 }
4363 
4364 
4365 /*
4366 ========================
4367 BG_PlayerStateToEntityState
4368 
4369 This is done after each set of usercmd_t on the server,
4370 and after local prediction on the client
4371 ========================
4372 */
BG_PlayerStateToEntityState(playerState_t * ps,entityState_t * s,qboolean snap)4373 void BG_PlayerStateToEntityState( playerState_t *ps, entityState_t *s, qboolean snap ) {
4374 	int i;
4375 
4376 	if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR || ps->pm_flags & PMF_LIMBO ) { // JPW NERVE limbo
4377 		s->eType = ET_INVISIBLE;
4378 	} else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) {
4379 		s->eType = ET_INVISIBLE;
4380 	} else {
4381 		s->eType = ET_PLAYER;
4382 	}
4383 
4384 	s->number = ps->clientNum;
4385 
4386 	s->pos.trType = TR_INTERPOLATE;
4387 	VectorCopy( ps->origin, s->pos.trBase );
4388 	if ( snap ) {
4389 		SnapVector( s->pos.trBase );
4390 	}
4391 
4392 	s->apos.trType = TR_INTERPOLATE;
4393 	VectorCopy( ps->viewangles, s->apos.trBase );
4394 	if ( snap ) {
4395 		SnapVector( s->apos.trBase );
4396 	}
4397 
4398 	if ( ps->movementDir > 128 ) {
4399 		s->angles2[YAW] = (float)ps->movementDir - 256;
4400 	} else {
4401 		s->angles2[YAW] = ps->movementDir;
4402 	}
4403 
4404 	s->legsAnim     = ps->legsAnim;
4405 	s->torsoAnim    = ps->torsoAnim;
4406 	s->clientNum    = ps->clientNum;    // ET_PLAYER looks here instead of at number
4407 										// so corpses can also reference the proper config
4408 	// Ridah, let clients know if this person is using a mounted weapon
4409 	// so they don't show any client muzzle flashes
4410 
4411 	// (SA) moved up since it needs to set the ps->eFlags too.
4412 	//		Seems like this could be the problem Raf was
4413 	//		encountering with the EF_DEAD flag below when guys
4414 	//		dead flags weren't sticking
4415 
4416 	if ( ps->persistant[PERS_HWEAPON_USE] ) {
4417 		ps->eFlags |= EF_MG42_ACTIVE;
4418 	} else {
4419 		ps->eFlags &= ~EF_MG42_ACTIVE;
4420 	}
4421 
4422 	s->eFlags = ps->eFlags;
4423 
4424 	if ( ps->stats[STAT_HEALTH] <= 0 ) {
4425 		s->eFlags |= EF_DEAD;
4426 	} else {
4427 		s->eFlags &= ~EF_DEAD;
4428 	}
4429 
4430 // from MP
4431 	if ( ps->externalEvent ) {
4432 		s->event = ps->externalEvent;
4433 		s->eventParm = ps->externalEventParm;
4434 	} else if ( ps->entityEventSequence < ps->eventSequence ) {
4435 		int seq;
4436 
4437 		if ( ps->entityEventSequence < ps->eventSequence - MAX_EVENTS ) {
4438 			ps->entityEventSequence = ps->eventSequence - MAX_EVENTS;
4439 		}
4440 		seq = ps->entityEventSequence & ( MAX_EVENTS - 1 );
4441 		s->event = ps->events[ seq ] | ( ( ps->entityEventSequence & 3 ) << 8 );
4442 		s->eventParm = ps->eventParms[ seq ];
4443 		ps->entityEventSequence++;
4444 	}
4445 // end
4446 	// Ridah, now using a circular list of events for all entities
4447 	// add any new events that have been added to the playerState_t
4448 	// (possibly overwriting entityState_t events)
4449 	for ( i = ps->oldEventSequence; i != ps->eventSequence; i++ ) {
4450 		s->events[s->eventSequence & ( MAX_EVENTS - 1 )] = ps->events[i & ( MAX_EVENTS - 1 )];
4451 		s->eventParms[s->eventSequence & ( MAX_EVENTS - 1 )] = ps->eventParms[i & ( MAX_EVENTS - 1 )];
4452 		s->eventSequence++;
4453 	}
4454 	ps->oldEventSequence = ps->eventSequence;
4455 
4456 	s->weapon = ps->weapon;
4457 	s->groundEntityNum = ps->groundEntityNum;
4458 
4459 	s->powerups = 0;
4460 	for ( i = 0 ; i < MAX_POWERUPS ; i++ ) {
4461 		if ( ps->powerups[ i ] ) {
4462 			s->powerups |= 1 << i;
4463 		}
4464 	}
4465 
4466 	s->aiChar = ps->aiChar; // Ridah
4467 //	s->loopSound = ps->loopSound;
4468 	s->teamNum = ps->teamNum;
4469 	s->aiState = ps->aiState;
4470 }
4471 
4472 /*
4473 ========================
4474 BG_PlayerStateToEntityStateExtraPolate
4475 
4476 This is done after each set of usercmd_t on the server,
4477 and after local prediction on the client
4478 ========================
4479 */
BG_PlayerStateToEntityStateExtraPolate(playerState_t * ps,entityState_t * s,int time,qboolean snap)4480 void BG_PlayerStateToEntityStateExtraPolate( playerState_t *ps, entityState_t *s, int time, qboolean snap ) {
4481 	int i;
4482 
4483 	if ( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPECTATOR || ps->pm_flags & PMF_LIMBO ) { // JPW NERVE limbo
4484 		s->eType = ET_INVISIBLE;
4485 	} else if ( ps->stats[STAT_HEALTH] <= GIB_HEALTH ) {
4486 		s->eType = ET_INVISIBLE;
4487 	} else {
4488 		s->eType = ET_PLAYER;
4489 	}
4490 
4491 	s->number = ps->clientNum;
4492 
4493 	s->pos.trType = TR_LINEAR_STOP;
4494 	VectorCopy( ps->origin, s->pos.trBase );
4495 	if ( snap ) {
4496 		SnapVector( s->pos.trBase );
4497 	}
4498 	// set the trDelta for flag direction and linear prediction
4499 	VectorCopy( ps->velocity, s->pos.trDelta );
4500 	// set the time for linear prediction
4501 	s->pos.trTime = time;
4502 	// set maximum extra polation time
4503 	s->pos.trDuration = 50; // 1000 / sv_fps (default = 20)
4504 
4505 	s->apos.trType = TR_INTERPOLATE;
4506 	VectorCopy( ps->viewangles, s->apos.trBase );
4507 	if ( snap ) {
4508 		SnapVector( s->apos.trBase );
4509 	}
4510 
4511 	s->angles2[YAW] = ps->movementDir;
4512 	s->legsAnim = ps->legsAnim;
4513 	s->torsoAnim = ps->torsoAnim;
4514 	s->clientNum = ps->clientNum;       // ET_PLAYER looks here instead of at number
4515 										// so corpses can also reference the proper config
4516 	s->eFlags = ps->eFlags;
4517 	if ( ps->stats[STAT_HEALTH] <= 0 ) {
4518 		s->eFlags |= EF_DEAD;
4519 	} else {
4520 		s->eFlags &= ~EF_DEAD;
4521 	}
4522 
4523 	if ( ps->externalEvent ) {
4524 		s->event = ps->externalEvent;
4525 		s->eventParm = ps->externalEventParm;
4526 	} else if ( ps->entityEventSequence < ps->eventSequence ) {
4527 		int seq;
4528 
4529 		if ( ps->entityEventSequence < ps->eventSequence - MAX_EVENTS ) {
4530 			ps->entityEventSequence = ps->eventSequence - MAX_EVENTS;
4531 		}
4532 		seq = ps->entityEventSequence & ( MAX_EVENTS - 1 );
4533 		s->event = ps->events[ seq ] | ( ( ps->entityEventSequence & 3 ) << 8 );
4534 		s->eventParm = ps->eventParms[ seq ];
4535 		ps->entityEventSequence++;
4536 	}
4537 
4538 	// Ridah, now using a circular list of events for all entities
4539 	// add any new events that have been added to the playerState_t
4540 	// (possibly overwriting entityState_t events)
4541 	if ( ps->oldEventSequence > ps->eventSequence ) {
4542 		ps->oldEventSequence = ps->eventSequence;
4543 	}
4544 	for ( i = ps->oldEventSequence; i != ps->eventSequence; i++ ) {
4545 		s->events[s->eventSequence & ( MAX_EVENTS - 1 )] = ps->events[i & ( MAX_EVENTS - 1 )];
4546 		s->eventParms[s->eventSequence & ( MAX_EVENTS - 1 )] = ps->eventParms[i & ( MAX_EVENTS - 1 )];
4547 		s->eventSequence++;
4548 	}
4549 	ps->oldEventSequence = ps->eventSequence;
4550 
4551 	s->weapon = ps->weapon;
4552 	s->groundEntityNum = ps->groundEntityNum;
4553 
4554 	s->powerups = 0;
4555 	for ( i = 0 ; i < MAX_POWERUPS ; i++ ) {
4556 		if ( ps->powerups[ i ] ) {
4557 			s->powerups |= 1 << i;
4558 		}
4559 	}
4560 
4561 //	s->loopSound = ps->loopSound;
4562 //	s->generic1 = ps->generic1;
4563 	s->aiChar = ps->aiChar; // Ridah
4564 	s->teamNum = ps->teamNum;
4565 	s->aiState = ps->aiState;
4566 }
4567