misc.qc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  1. /*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4)
  2. Used as a positional target for spotlights, etc.
  3. */
  4. void() info_null =
  5. {
  6. remove(self);
  7. };
  8. /*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4)
  9. Used as a positional target for lightning.
  10. */
  11. void() info_notnull =
  12. {
  13. };
  14. //============================================================================
  15. float START_OFF = 1;
  16. void() light_use =
  17. {
  18. if (self.spawnflags & START_OFF)
  19. {
  20. lightstyle(self.style, "m");
  21. self.spawnflags = self.spawnflags - START_OFF;
  22. }
  23. else
  24. {
  25. lightstyle(self.style, "a");
  26. self.spawnflags = self.spawnflags + START_OFF;
  27. }
  28. };
  29. /*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  30. Non-displayed light.
  31. Default light value is 300
  32. Default style is 0
  33. If targeted, it will toggle between on or off.
  34. */
  35. void() light =
  36. {
  37. if (!self.targetname)
  38. { // inert light
  39. remove(self);
  40. return;
  41. }
  42. if (self.style >= 32)
  43. {
  44. self.use = light_use;
  45. if (self.spawnflags & START_OFF)
  46. lightstyle(self.style, "a");
  47. else
  48. lightstyle(self.style, "m");
  49. }
  50. };
  51. /*QUAKED light_fluoro (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  52. Non-displayed light.
  53. Default light value is 300
  54. Default style is 0
  55. If targeted, it will toggle between on or off.
  56. Makes steady fluorescent humming sound
  57. */
  58. void() light_fluoro =
  59. {
  60. if (self.style >= 32)
  61. {
  62. self.use = light_use;
  63. if (self.spawnflags & START_OFF)
  64. lightstyle(self.style, "a");
  65. else
  66. lightstyle(self.style, "m");
  67. }
  68. precache_sound ("ambience/fl_hum1.wav");
  69. ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
  70. };
  71. /*QUAKED light_fluorospark (0 1 0) (-8 -8 -8) (8 8 8)
  72. Non-displayed light.
  73. Default light value is 300
  74. Default style is 10
  75. Makes sparking, broken fluorescent sound
  76. */
  77. void() light_fluorospark =
  78. {
  79. if (!self.style)
  80. self.style = 10;
  81. precache_sound ("ambience/buzz1.wav");
  82. ambientsound (self.origin, "ambience/buzz1.wav", 0.5, ATTN_STATIC);
  83. };
  84. /*QUAKED light_globe (0 1 0) (-8 -8 -8) (8 8 8)
  85. Sphere globe light.
  86. Default light value is 300
  87. Default style is 0
  88. */
  89. void() light_globe =
  90. {
  91. precache_model ("progs/s_light.spr");
  92. setmodel (self, "progs/s_light.spr");
  93. makestatic (self);
  94. };
  95. void() FireAmbient =
  96. {
  97. precache_sound ("ambience/fire1.wav");
  98. // attenuate fast
  99. ambientsound (self.origin, "ambience/fire1.wav", 0.5, ATTN_STATIC);
  100. };
  101. /*QUAKED light_torch_small_walltorch (0 .5 0) (-10 -10 -20) (10 10 20)
  102. Short wall torch
  103. Default light value is 200
  104. Default style is 0
  105. */
  106. void() light_torch_small_walltorch =
  107. {
  108. precache_model ("progs/flame.mdl");
  109. setmodel (self, "progs/flame.mdl");
  110. FireAmbient ();
  111. makestatic (self);
  112. };
  113. /*QUAKED light_flame_large_yellow (0 1 0) (-10 -10 -12) (12 12 18)
  114. Large yellow flame ball
  115. */
  116. void() light_flame_large_yellow =
  117. {
  118. precache_model ("progs/flame2.mdl");
  119. setmodel (self, "progs/flame2.mdl");
  120. self.frame = 1;
  121. FireAmbient ();
  122. makestatic (self);
  123. };
  124. /*QUAKED light_flame_small_yellow (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  125. Small yellow flame ball
  126. */
  127. void() light_flame_small_yellow =
  128. {
  129. precache_model ("progs/flame2.mdl");
  130. setmodel (self, "progs/flame2.mdl");
  131. FireAmbient ();
  132. makestatic (self);
  133. };
  134. /*QUAKED light_flame_small_white (0 1 0) (-10 -10 -40) (10 10 40) START_OFF
  135. Small white flame ball
  136. */
  137. void() light_flame_small_white =
  138. {
  139. precache_model ("progs/flame2.mdl");
  140. setmodel (self, "progs/flame2.mdl");
  141. FireAmbient ();
  142. makestatic (self);
  143. };
  144. //============================================================================
  145. /*QUAKED misc_fireball (0 .5 .8) (-8 -8 -8) (8 8 8)
  146. Lava Balls
  147. */
  148. void() fire_fly;
  149. void() fire_touch;
  150. void() misc_fireball =
  151. {
  152. precache_model ("progs/lavaball.mdl");
  153. self.classname = "fireball";
  154. self.nextthink = time + (random() * 5);
  155. self.think = fire_fly;
  156. if (!self.speed)
  157. self.speed == 1000;
  158. };
  159. void() fire_fly =
  160. {
  161. local entity fireball;
  162. fireball = spawn();
  163. fireball.solid = SOLID_TRIGGER;
  164. fireball.movetype = MOVETYPE_TOSS;
  165. fireball.velocity = '0 0 1000';
  166. fireball.velocity_x = (random() * 100) - 50;
  167. fireball.velocity_y = (random() * 100) - 50;
  168. fireball.velocity_z = self.speed + (random() * 200);
  169. fireball.classname = "fireball";
  170. setmodel (fireball, "progs/lavaball.mdl");
  171. setsize (fireball, '0 0 0', '0 0 0');
  172. setorigin (fireball, self.origin);
  173. fireball.nextthink = time + 5;
  174. fireball.think = SUB_Remove;
  175. fireball.touch = fire_touch;
  176. self.nextthink = time + (random() * 5) + 3;
  177. self.think = fire_fly;
  178. };
  179. void() fire_touch =
  180. {
  181. T_Damage (other, self, self, 20);
  182. remove(self);
  183. };
  184. //============================================================================
  185. void() barrel_explode =
  186. {
  187. self.takedamage = DAMAGE_NO;
  188. self.classname = "explo_box";
  189. // did say self.owner
  190. T_RadiusDamage (self, self, 160, world, "");
  191. WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
  192. WriteByte (MSG_MULTICAST, TE_EXPLOSION);
  193. WriteCoord (MSG_MULTICAST, self.origin_x);
  194. WriteCoord (MSG_MULTICAST, self.origin_y);
  195. WriteCoord (MSG_MULTICAST, self.origin_z+32);
  196. multicast (self.origin, MULTICAST_PHS);
  197. remove (self);
  198. };
  199. /*QUAKED misc_explobox (0 .5 .8) (0 0 0) (32 32 64)
  200. TESTING THING
  201. */
  202. void() misc_explobox =
  203. {
  204. local float oldz;
  205. self.solid = SOLID_BBOX;
  206. self.movetype = MOVETYPE_NONE;
  207. precache_model ("maps/b_explob.bsp");
  208. setmodel (self, "maps/b_explob.bsp");
  209. setsize (self, '0 0 0', '32 32 64');
  210. precache_sound ("weapons/r_exp3.wav");
  211. self.health = 20;
  212. self.th_die = barrel_explode;
  213. self.takedamage = DAMAGE_AIM;
  214. self.origin_z = self.origin_z + 2;
  215. oldz = self.origin_z;
  216. droptofloor();
  217. if (oldz - self.origin_z > 250)
  218. {
  219. dprint ("item fell out of level at ");
  220. dprint (vtos(self.origin));
  221. dprint ("\n");
  222. remove(self);
  223. }
  224. };
  225. /*QUAKED misc_explobox2 (0 .5 .8) (0 0 0) (32 32 64)
  226. Smaller exploding box, REGISTERED ONLY
  227. */
  228. void() misc_explobox2 =
  229. {
  230. local float oldz;
  231. self.solid = SOLID_BBOX;
  232. self.movetype = MOVETYPE_NONE;
  233. precache_model2 ("maps/b_exbox2.bsp");
  234. setmodel (self, "maps/b_exbox2.bsp");
  235. setsize (self, '0 0 0', '32 32 32');
  236. precache_sound ("weapons/r_exp3.wav");
  237. self.health = 20;
  238. self.th_die = barrel_explode;
  239. self.takedamage = DAMAGE_AIM;
  240. self.origin_z = self.origin_z + 2;
  241. oldz = self.origin_z;
  242. droptofloor();
  243. if (oldz - self.origin_z > 250)
  244. {
  245. dprint ("item fell out of level at ");
  246. dprint (vtos(self.origin));
  247. dprint ("\n");
  248. remove(self);
  249. }
  250. };
  251. //============================================================================
  252. float SPAWNFLAG_SUPERSPIKE = 1;
  253. float SPAWNFLAG_LASER = 2;
  254. void() Laser_Touch =
  255. {
  256. local vector org;
  257. if (other == self.owner)
  258. return; // don't explode on owner
  259. if (pointcontents(self.origin) == CONTENT_SKY)
  260. {
  261. remove(self);
  262. return;
  263. }
  264. sound (self, CHAN_WEAPON, "enforcer/enfstop.wav", 1, ATTN_STATIC);
  265. org = self.origin - 8*normalize(self.velocity);
  266. if (other.health)
  267. {
  268. SpawnBlood (org, 15);
  269. other.deathtype = "laser";
  270. T_Damage (other, self, self.owner, 15);
  271. }
  272. else
  273. {
  274. WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
  275. WriteByte (MSG_MULTICAST, TE_GUNSHOT);
  276. WriteByte (MSG_MULTICAST, 5);
  277. WriteCoord (MSG_MULTICAST, org_x);
  278. WriteCoord (MSG_MULTICAST, org_y);
  279. WriteCoord (MSG_MULTICAST, org_z);
  280. multicast (org, MULTICAST_PVS);
  281. }
  282. remove(self);
  283. };
  284. void(vector org, vector vec) LaunchLaser =
  285. {
  286. local vector vec;
  287. if (self.classname == "monster_enforcer")
  288. sound (self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM);
  289. vec = normalize(vec);
  290. newmis = spawn();
  291. newmis.owner = self;
  292. newmis.movetype = MOVETYPE_FLY;
  293. newmis.solid = SOLID_BBOX;
  294. newmis.effects = EF_DIMLIGHT;
  295. setmodel (newmis, "progs/laser.mdl");
  296. setsize (newmis, '0 0 0', '0 0 0');
  297. setorigin (newmis, org);
  298. newmis.velocity = vec * 600;
  299. newmis.angles = vectoangles(newmis.velocity);
  300. newmis.nextthink = time + 5;
  301. newmis.think = SUB_Remove;
  302. newmis.touch = Laser_Touch;
  303. };
  304. void() spikeshooter_use =
  305. {
  306. if (self.spawnflags & SPAWNFLAG_LASER)
  307. {
  308. sound (self, CHAN_VOICE, "enforcer/enfire.wav", 1, ATTN_NORM);
  309. LaunchLaser (self.origin, self.movedir);
  310. }
  311. else
  312. {
  313. sound (self, CHAN_VOICE, "weapons/spike2.wav", 1, ATTN_NORM);
  314. launch_spike (self.origin, self.movedir);
  315. newmis.velocity = self.movedir * 500;
  316. if (self.spawnflags & SPAWNFLAG_SUPERSPIKE)
  317. newmis.touch = superspike_touch;
  318. }
  319. };
  320. void() shooter_think =
  321. {
  322. spikeshooter_use ();
  323. self.nextthink = time + self.wait;
  324. newmis.velocity = self.movedir * 500;
  325. };
  326. /*QUAKED trap_spikeshooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser
  327. When triggered, fires a spike in the direction set in QuakeEd.
  328. Laser is only for REGISTERED.
  329. */
  330. void() trap_spikeshooter =
  331. {
  332. SetMovedir ();
  333. self.use = spikeshooter_use;
  334. if (self.spawnflags & SPAWNFLAG_LASER)
  335. {
  336. precache_model2 ("progs/laser.mdl");
  337. precache_sound2 ("enforcer/enfire.wav");
  338. precache_sound2 ("enforcer/enfstop.wav");
  339. }
  340. else
  341. precache_sound ("weapons/spike2.wav");
  342. };
  343. /*QUAKED trap_shooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser
  344. Continuously fires spikes.
  345. "wait" time between spike (1.0 default)
  346. "nextthink" delay before firing first spike, so multiple shooters can be stagered.
  347. */
  348. void() trap_shooter =
  349. {
  350. trap_spikeshooter ();
  351. if (self.wait == 0)
  352. self.wait = 1;
  353. self.nextthink = self.nextthink + self.wait + self.ltime;
  354. self.think = shooter_think;
  355. };
  356. /*
  357. ===============================================================================
  358. ===============================================================================
  359. */
  360. void() make_bubbles;
  361. void() bubble_remove;
  362. void() bubble_bob;
  363. /*QUAKED air_bubbles (0 .5 .8) (-8 -8 -8) (8 8 8)
  364. testing air bubbles
  365. */
  366. void() air_bubbles =
  367. {
  368. remove (self);
  369. };
  370. void() make_bubbles =
  371. {
  372. local entity bubble;
  373. bubble = spawn();
  374. setmodel (bubble, "progs/s_bubble.spr");
  375. setorigin (bubble, self.origin);
  376. bubble.movetype = MOVETYPE_NOCLIP;
  377. bubble.solid = SOLID_NOT;
  378. bubble.velocity = '0 0 15';
  379. bubble.nextthink = time + 0.5;
  380. bubble.think = bubble_bob;
  381. bubble.touch = bubble_remove;
  382. bubble.classname = "bubble";
  383. bubble.frame = 0;
  384. bubble.cnt = 0;
  385. setsize (bubble, '-8 -8 -8', '8 8 8');
  386. self.nextthink = time + random() + 0.5;
  387. self.think = make_bubbles;
  388. };
  389. void() bubble_split =
  390. {
  391. local entity bubble;
  392. bubble = spawn();
  393. setmodel (bubble, "progs/s_bubble.spr");
  394. setorigin (bubble, self.origin);
  395. bubble.movetype = MOVETYPE_NOCLIP;
  396. bubble.solid = SOLID_NOT;
  397. bubble.velocity = self.velocity;
  398. bubble.nextthink = time + 0.5;
  399. bubble.think = bubble_bob;
  400. bubble.touch = bubble_remove;
  401. bubble.classname = "bubble";
  402. bubble.frame = 1;
  403. bubble.cnt = 10;
  404. setsize (bubble, '-8 -8 -8', '8 8 8');
  405. self.frame = 1;
  406. self.cnt = 10;
  407. if (self.waterlevel != 3)
  408. remove (self);
  409. };
  410. void() bubble_remove =
  411. {
  412. if (other.classname == self.classname)
  413. {
  414. // dprint ("bump");
  415. return;
  416. }
  417. remove(self);
  418. };
  419. void() bubble_bob =
  420. {
  421. local float rnd1, rnd2, rnd3;
  422. local vector vtmp1, modi;
  423. self.cnt = self.cnt + 1;
  424. if (self.cnt == 4)
  425. bubble_split();
  426. if (self.cnt == 20)
  427. remove(self);
  428. rnd1 = self.velocity_x + (-10 + (random() * 20));
  429. rnd2 = self.velocity_y + (-10 + (random() * 20));
  430. rnd3 = self.velocity_z + 10 + random() * 10;
  431. if (rnd1 > 10)
  432. rnd1 = 5;
  433. if (rnd1 < -10)
  434. rnd1 = -5;
  435. if (rnd2 > 10)
  436. rnd2 = 5;
  437. if (rnd2 < -10)
  438. rnd2 = -5;
  439. if (rnd3 < 10)
  440. rnd3 = 15;
  441. if (rnd3 > 30)
  442. rnd3 = 25;
  443. self.velocity_x = rnd1;
  444. self.velocity_y = rnd2;
  445. self.velocity_z = rnd3;
  446. self.nextthink = time + 0.5;
  447. self.think = bubble_bob;
  448. };
  449. /*~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>
  450. ~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~*/
  451. /*QUAKED viewthing (0 .5 .8) (-8 -8 -8) (8 8 8)
  452. Just for the debugging level. Don't use
  453. */
  454. void() viewthing =
  455. {
  456. self.movetype = MOVETYPE_NONE;
  457. self.solid = SOLID_NOT;
  458. precache_model ("progs/player.mdl");
  459. setmodel (self, "progs/player.mdl");
  460. };
  461. /*
  462. ==============================================================================
  463. SIMPLE BMODELS
  464. ==============================================================================
  465. */
  466. void() func_wall_use =
  467. { // change to alternate textures
  468. self.frame = 1 - self.frame;
  469. };
  470. /*QUAKED func_wall (0 .5 .8) ?
  471. This is just a solid wall if not inhibitted
  472. */
  473. void() func_wall =
  474. {
  475. self.angles = '0 0 0';
  476. self.movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything
  477. self.solid = SOLID_BSP;
  478. self.use = func_wall_use;
  479. setmodel (self, self.model);
  480. };
  481. /*QUAKED func_illusionary (0 .5 .8) ?
  482. A simple entity that looks solid but lets you walk through it.
  483. */
  484. void() func_illusionary =
  485. {
  486. self.angles = '0 0 0';
  487. self.movetype = MOVETYPE_NONE;
  488. self.solid = SOLID_NOT;
  489. setmodel (self, self.model);
  490. makestatic ();
  491. };
  492. /*QUAKED func_episodegate (0 .5 .8) ? E1 E2 E3 E4
  493. This bmodel will appear if the episode has allready been completed, so players can't reenter it.
  494. */
  495. void() func_episodegate =
  496. {
  497. if (!(serverflags & self.spawnflags))
  498. return; // can still enter episode
  499. self.angles = '0 0 0';
  500. self.movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything
  501. self.solid = SOLID_BSP;
  502. self.use = func_wall_use;
  503. setmodel (self, self.model);
  504. };
  505. /*QUAKED func_bossgate (0 .5 .8) ?
  506. This bmodel appears unless players have all of the episode sigils.
  507. */
  508. void() func_bossgate =
  509. {
  510. if ( (serverflags & 15) == 15)
  511. return; // all episodes completed
  512. self.angles = '0 0 0';
  513. self.movetype = MOVETYPE_PUSH; // so it doesn't get pushed by anything
  514. self.solid = SOLID_BSP;
  515. self.use = func_wall_use;
  516. setmodel (self, self.model);
  517. };
  518. //============================================================================
  519. /*QUAKED ambient_suck_wind (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  520. */
  521. void() ambient_suck_wind =
  522. {
  523. precache_sound ("ambience/suck1.wav");
  524. ambientsound (self.origin, "ambience/suck1.wav", 1, ATTN_STATIC);
  525. };
  526. /*QUAKED ambient_drone (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  527. */
  528. void() ambient_drone =
  529. {
  530. precache_sound ("ambience/drone6.wav");
  531. ambientsound (self.origin, "ambience/drone6.wav", 0.5, ATTN_STATIC);
  532. };
  533. /*QUAKED ambient_flouro_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  534. */
  535. void() ambient_flouro_buzz =
  536. {
  537. precache_sound ("ambience/buzz1.wav");
  538. ambientsound (self.origin, "ambience/buzz1.wav", 1, ATTN_STATIC);
  539. };
  540. /*QUAKED ambient_drip (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  541. */
  542. void() ambient_drip =
  543. {
  544. precache_sound ("ambience/drip1.wav");
  545. ambientsound (self.origin, "ambience/drip1.wav", 0.5, ATTN_STATIC);
  546. };
  547. /*QUAKED ambient_comp_hum (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  548. */
  549. void() ambient_comp_hum =
  550. {
  551. precache_sound ("ambience/comp1.wav");
  552. ambientsound (self.origin, "ambience/comp1.wav", 1, ATTN_STATIC);
  553. };
  554. /*QUAKED ambient_thunder (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  555. */
  556. void() ambient_thunder =
  557. {
  558. precache_sound ("ambience/thunder1.wav");
  559. ambientsound (self.origin, "ambience/thunder1.wav", 0.5, ATTN_STATIC);
  560. };
  561. /*QUAKED ambient_light_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  562. */
  563. void() ambient_light_buzz =
  564. {
  565. precache_sound ("ambience/fl_hum1.wav");
  566. ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
  567. };
  568. /*QUAKED ambient_swamp1 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  569. */
  570. void() ambient_swamp1 =
  571. {
  572. precache_sound ("ambience/swamp1.wav");
  573. ambientsound (self.origin, "ambience/swamp1.wav", 0.5, ATTN_STATIC);
  574. };
  575. /*QUAKED ambient_swamp2 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  576. */
  577. void() ambient_swamp2 =
  578. {
  579. precache_sound ("ambience/swamp2.wav");
  580. ambientsound (self.origin, "ambience/swamp2.wav", 0.5, ATTN_STATIC);
  581. };
  582. //============================================================================
  583. void() noise_think =
  584. {
  585. self.nextthink = time + 0.5;
  586. sound (self, 1, "enforcer/enfire.wav", 1, ATTN_NORM);
  587. sound (self, 2, "enforcer/enfstop.wav", 1, ATTN_NORM);
  588. sound (self, 3, "enforcer/sight1.wav", 1, ATTN_NORM);
  589. sound (self, 4, "enforcer/sight2.wav", 1, ATTN_NORM);
  590. sound (self, 5, "enforcer/sight3.wav", 1, ATTN_NORM);
  591. sound (self, 6, "enforcer/sight4.wav", 1, ATTN_NORM);
  592. sound (self, 7, "enforcer/pain1.wav", 1, ATTN_NORM);
  593. };
  594. /*QUAKED misc_noisemaker (1 0.5 0) (-10 -10 -10) (10 10 10)
  595. For optimzation testing, starts a lot of sounds.
  596. */
  597. void() misc_noisemaker =
  598. {
  599. precache_sound2 ("enforcer/enfire.wav");
  600. precache_sound2 ("enforcer/enfstop.wav");
  601. precache_sound2 ("enforcer/sight1.wav");
  602. precache_sound2 ("enforcer/sight2.wav");
  603. precache_sound2 ("enforcer/sight3.wav");
  604. precache_sound2 ("enforcer/sight4.wav");
  605. precache_sound2 ("enforcer/pain1.wav");
  606. precache_sound2 ("enforcer/pain2.wav");
  607. precache_sound2 ("enforcer/death1.wav");
  608. precache_sound2 ("enforcer/idle1.wav");
  609. self.nextthink = time + 0.1 + random();
  610. self.think = noise_think;
  611. };