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