home *** CD-ROM | disk | FTP | other *** search
/ Quake 'em / QUAKEEM.BIN / quake / programs / sgqcver2 / misc.qc < prev    next >
Encoding:
Text File  |  1996-08-10  |  15.9 KB  |  691 lines

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