home *** CD-ROM | disk | FTP | other *** search
/ Quake 'em / QUAKEEM.BIN / quake / programs / mon_dm09 / player.qc < prev    next >
Encoding:
Text File  |  1996-08-20  |  41.7 KB  |  1,342 lines

  1. void(float shotcount, vector dir, vector spread) FireBullets;
  2. void() bubble_bob;
  3.  
  4. /*
  5. ==============================================================================
  6.  
  7. PLAYER
  8.  
  9. ==============================================================================
  10. */
  11.  
  12. $cd /raid/quake/id1/models/player_4
  13. $origin 0 -6 24
  14. $base base        
  15. $skin skin
  16.  
  17. //
  18. // running
  19. //
  20. $frame axrun1 axrun2 axrun3 axrun4 axrun5 axrun6
  21.  
  22. $frame rockrun1 rockrun2 rockrun3 rockrun4 rockrun5 rockrun6
  23.  
  24. //
  25. // standing
  26. //
  27. $frame stand1 stand2 stand3 stand4 stand5
  28.  
  29. $frame axstnd1 axstnd2 axstnd3 axstnd4 axstnd5 axstnd6
  30. $frame axstnd7 axstnd8 axstnd9 axstnd10 axstnd11 axstnd12
  31.  
  32. //
  33. // pain
  34. //
  35. $frame axpain1 axpain2 axpain3 axpain4 axpain5 axpain6
  36.  
  37. $frame pain1 pain2 pain3 pain4 pain5 pain6
  38. //
  39. // death
  40. //
  41.  
  42. $frame axdeth1 axdeth2 axdeth3 axdeth4 axdeth5 axdeth6
  43. $frame axdeth7 axdeth8 axdeth9
  44.  
  45. $frame deatha1 deatha2 deatha3 deatha4 deatha5 deatha6 deatha7 deatha8
  46. $frame deatha9 deatha10 deatha11
  47.  
  48. $frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8
  49. $frame deathb9
  50.  
  51. $frame deathc1 deathc2 deathc3 deathc4 deathc5 deathc6 deathc7 deathc8
  52. $frame deathc9 deathc10 deathc11 deathc12 deathc13 deathc14 deathc15
  53.  
  54. $frame deathd1 deathd2 deathd3 deathd4 deathd5 deathd6 deathd7
  55. $frame deathd8 deathd9
  56.  
  57. $frame deathe1 deathe2 deathe3 deathe4 deathe5 deathe6 deathe7
  58. $frame deathe8 deathe9
  59.  
  60. //
  61. // attacks
  62. //
  63. $frame nailatt1 nailatt2
  64.  
  65. $frame light1 light2
  66.  
  67. $frame rockatt1 rockatt2 rockatt3 rockatt4 rockatt5 rockatt6
  68.  
  69. $frame shotatt1 shotatt2 shotatt3 shotatt4 shotatt5 shotatt6
  70.  
  71. $frame axatt1 axatt2 axatt3 axatt4 axatt5 axatt6
  72.  
  73. $frame axattb1 axattb2 axattb3 axattb4 axattb5 axattb6
  74.  
  75. $frame axattc1 axattc2 axattc3 axattc4 axattc5 axattc6
  76.  
  77. $frame axattd1 axattd2 axattd3 axattd4 axattd5 axattd6
  78.  
  79. // 143
  80.  
  81. /*
  82. ==============================================================================
  83. PLAYER
  84. ==============================================================================
  85. */
  86.  
  87. void() player_demon_jump =[     $axstnd11,  player_demon_jump  ]
  88. {
  89.         if (self.walkframe >= 12)
  90.                 self.walkframe = 11;
  91.         self.frame = $axstnd11 + self.walkframe;
  92.         self.walkframe = self.walkframe + 1;
  93.         if (self.flags & FL_ONGROUND)
  94.                 player_stand1();
  95. };
  96.  
  97. void() player_run;
  98.  
  99. /*
  100. ***********
  101. STANDING
  102. ***********
  103. */
  104.  
  105. void()    player_stand1 =[    $axstnd1,    player_stand1    ]
  106. {
  107.     self.weaponframe=0;
  108.     if (self.velocity_x || self.velocity_y)
  109.     {
  110.         self.walkframe=0;
  111.         player_run();
  112.         return;
  113.     }
  114.  
  115.         if (self.effects & EF_DEMON)
  116.         {
  117.         // We are a demon
  118.                 self.view_ofs = '0 0 4';
  119.                 if (self.walkframe >= 13)
  120.                         self.walkframe = 0;
  121.                 self.frame = $axrun1 + self.walkframe;
  122.         }
  123.         else if (self.effects & EF_GRUNT)
  124.         {
  125.                 self.view_ofs = '0 0 24';
  126.                 if (self.walkframe >= 8)
  127.                         self.walkframe = 0;
  128.                 self.frame = $axrun1 + self.walkframe;
  129.         }
  130.         else if (self.effects & EF_SHALRATH)
  131.         {
  132.                 self.view_ofs = '0 0 18';
  133.                 self.walkframe = 0;
  134.                 self.frame = 24;
  135.         }
  136.         else if (self.effects & EF_ENFORCER)
  137.         {
  138.                 self.view_ofs = '0 0 24';
  139.                 if (self.walkframe >= 6)
  140.                         self.walkframe = 0;
  141.                 self.frame = 1 + self.walkframe;
  142.         }
  143.         else if (self.effects & EF_WIZARD)
  144.         {
  145.                 self.view_ofs = '0 0 24';
  146.                 if (self.walkframe >= 14)
  147.                         self.walkframe = 0;
  148.                 self.frame = 1 + self.walkframe;
  149.         }
  150.         else if (self.effects & EF_KNIGHT)
  151.         {
  152.                 self.view_ofs = '0 0 24';
  153.                 if (self.walkframe >= 8)
  154.                         self.walkframe = 0;
  155.                 self.frame = 1 + self.walkframe;
  156.         }
  157.         else if (self.effects & EF_HKNIGHT)
  158.         {
  159.                 self.view_ofs = '0 0 24';
  160.                 if (self.walkframe >= 8)
  161.                         self.walkframe = 0;
  162.                 self.frame = 1 + self.walkframe;
  163.         }
  164.  
  165.         else if (self.effects & EF_OGRE)
  166.         {
  167.                 self.view_ofs = '0 0 24';
  168.                 if (self.walkframe >= 8)
  169.                         self.walkframe = 0;
  170.                 self.frame = 1 + self.walkframe;
  171.         }
  172.  
  173.         else if (self.weapon == IT_AXE)
  174.     {
  175.         if (self.walkframe >= 12)
  176.             self.walkframe = 0;
  177.         self.frame = $axstnd1 + self.walkframe;
  178.     }
  179.     else
  180.     {
  181.         if (self.walkframe >= 5)
  182.             self.walkframe = 0;
  183.         self.frame = $stand1 + self.walkframe;
  184.     }
  185.     self.walkframe = self.walkframe + 1;    
  186. };
  187.  
  188. /*
  189. ******************
  190. RUNNING
  191. ******************
  192. */
  193.  
  194. void()    player_run =[    $rockrun1,    player_run    ]
  195. {
  196.     self.weaponframe=0;
  197.     if (!self.velocity_x && !self.velocity_y)
  198.     {
  199.         self.walkframe=0;
  200.         player_stand1();
  201.         return;
  202.     }
  203.  
  204.         if(self.effects & EF_DEMON)
  205.         {
  206.                 //We are a demon
  207.                 self.view_ofs = '0 0 4';
  208.                 if (self.walkframe >= 8)
  209.                         self.walkframe = 0;
  210.                 self.frame = $stand2 + self.walkframe;
  211.         }
  212.         else if(self.effects & EF_GRUNT)
  213.         {
  214.                 self.view_ofs = '0 0 24';
  215.                 if (self.walkframe >= 8)
  216.                          self.walkframe = 0;
  217.                  self.frame = $deathc4 + self.walkframe;
  218.         }
  219.         else if(self.effects & EF_SHALRATH)
  220.         {
  221.                 self.view_ofs = '0 0 18';
  222.                 if (self.walkframe >= 10)
  223.                          self.walkframe = 0;
  224.                  self.frame = 25 + self.walkframe;
  225.         }
  226.         else if(self.effects & EF_ENFORCER)
  227.         {
  228.                 self.view_ofs = '0 0 24';
  229.                 if (self.walkframe >= 7)
  230.                          self.walkframe = 0;
  231.                  self.frame = 24 + self.walkframe;
  232.         }
  233.         else if(self.effects & EF_WIZARD)
  234.         {
  235.                 self.view_ofs = '0 0 24';
  236.                 if (self.walkframe >= 13)
  237.                          self.walkframe = 0;
  238.                  self.frame = 16 + self.walkframe;
  239.         }
  240.        else if(self.effects & EF_KNIGHT)
  241.         {
  242.                 self.view_ofs = '0 0 24';
  243.                 if (self.walkframe >= 8)
  244.                          self.walkframe = 0;
  245.                  self.frame = $rockrun4 + self.walkframe;
  246.         }
  247.        else if(self.effects & EF_HKNIGHT)
  248.         {
  249.                 self.view_ofs = '0 0 24';
  250.                 if (self.walkframe >= 7)
  251.                          self.walkframe = 0;
  252.                  self.frame = 30 + self.walkframe;
  253.         }
  254.  
  255.        else if(self.effects & EF_OGRE)
  256.         {
  257.                 self.view_ofs = '0 0 24';
  258.                 if (self.walkframe >= 7)
  259.                          self.walkframe = 0;
  260.                  self.frame = 26 + self.walkframe;
  261.         }
  262.  
  263.         else if (self.weapon == IT_AXE)
  264.     {
  265.         if (self.walkframe == 6)
  266.             self.walkframe = 0;
  267.         self.frame = $axrun1 + self.walkframe;
  268.     }
  269.     else
  270.     {
  271.         if (self.walkframe == 6)
  272.             self.walkframe = 0;
  273.         self.frame = self.frame + self.walkframe;
  274.     }
  275.     self.walkframe = self.walkframe + 1;
  276. };
  277.  
  278.  
  279. /*
  280. ***************
  281. MISSILE ATTACKS
  282. ***************
  283. */
  284.  
  285. // FRAMES
  286.  
  287. void() GruntFire;
  288.  
  289. void() player_gattack = [$deathd1     , player_gattack6 ] {self.weaponframe = 1;GruntFire();self.effects = self.effects | EF_MUZZLEFLASH;};
  290. void() player_gattack6 = [$deathd2     , player_gattack7 ] {self.weaponframe = 2;};
  291. void() player_gattack7 = [$deathd3     , player_gattack8 ] {self.weaponframe = 3;};
  292. void() player_gattack8 = [$deathd4     , player_gattack9 ] {self.weaponframe = 4;};
  293. void() player_gattack9 = [$deathd5     , player_run      ] {self.weaponframe = 5;};
  294.  
  295. void() ShalFire;
  296.  
  297. void() player_sattack = [ 1, player_sattack2 ] {sound (self, CHAN_VOICE, "shalrath/attack.wav", 1, ATTN_NORM); self.effects = self.effects | EF_MUZZLEFLASH;};
  298. void() player_sattack2 = [ 2, player_sattack3 ] {};
  299. void() player_sattack3 = [ 3, player_sattack4 ] {};
  300. void() player_sattack4 = [ 4, player_sattack5 ] {};
  301. void() player_sattack5 = [ 5, player_sattack6 ] {};
  302. void() player_sattack6 = [ 6, player_sattack7 ] {};
  303. void() player_sattack7 = [ 7, player_sattack8 ] {};
  304. void() player_sattack8 = [ 8, player_sattack9 ] {};
  305. void() player_sattack9 = [ 9, player_sattack10 ] {ShalFire();};
  306. void() player_sattack10 = [10, player_sattack11 ] {};
  307. void() player_sattack11 = [11, player_run ] {};
  308.  
  309.  
  310. void (float offset) FireHK;
  311.  
  312. void() player_hkattack = [85, player_hkattack7 ] {};
  313. void() player_hkattack7 = [86, player_hkattack8 ] {FireHK(-2);self.effects = self.effects | EF_MUZZLEFLASH;};
  314. void() player_hkattack8 = [87, player_hkattack9 ] {FireHK(-1);self.effects = self.effects | EF_MUZZLEFLASH;};
  315. void() player_hkattack9 = [88, player_hkattack10 ] {FireHK(0);self.effects = self.effects | EF_MUZZLEFLASH;};
  316. void() player_hkattack10 = [89, player_hkattack11 ] {FireHK(1);self.effects = self.effects | EF_MUZZLEFLASH;};
  317. void() player_hkattack11 = [80, player_hkattack12 ] {FireHK(2);self.effects = self.effects | EF_MUZZLEFLASH;};
  318. void() player_hkattack12 = [91, player_hkattack13 ] {FireHK(3);self.effects = self.effects | EF_MUZZLEFLASH;};
  319. void() player_hkattack13 = [92, player_hkattack14 ] {};
  320. void() player_hkattack14 = [93, player_run ] {};
  321.  
  322. void() player_eattack = [ 37, player_eattack2 ] {self.weaponframe = 1;FireLaser();self.effects = self.effects | EF_MUZZLEFLASH;};
  323. void() player_eattack2= [ 38, player_eattack3 ] {self.weaponframe = 0;};
  324. void() player_eattack3= [ 39, player_eattack4 ] {self.weaponframe = 0;};
  325. void() player_eattack4= [ 40, player_run ] {self.weaponframe = 0;};
  326.  
  327. void() player_wattack = [ 30, player_wattack2] {sound (self, CHAN_WEAPON, "wizard/wattack.wav", 1, ATTN_NORM); FireMagic('0 3 16');self.effects = self.effects | EF_MUZZLEFLASH;};
  328. void() player_wattack2 = [ 31, player_wattack3] {};
  329. void() player_wattack3 = [ 31, player_wattack4] {};
  330. void() player_wattack4 = [ 31, player_wattack5] {};
  331. void() player_wattack5 = [ 31, player_wattack6] {FireMagic('0 -3 16');};
  332. void() player_wattack6 = [ 31, player_wattack7] {};
  333. void() player_wattack7 = [ 31, player_wattack8] {};
  334. void() player_wattack8 = [ 31, player_wattack9] {};
  335. void() player_wattack9 = [ 31, player_wattack10] {};
  336. void() player_wattack10 = [ 31, player_wattack11] {};
  337. void() player_wattack11 = [ 31, player_wattack12] {};
  338. void() player_wattack12 = [ 31, player_wattack13] {};
  339. void() player_wattack13 = [ 31, player_run  ] {};
  340.  
  341. void() OgreFire;
  342.  
  343. void() player_ogren = [$deathb1, player_ogren2 ] {self.weaponframe = 1; OgreFire(); self.effects = self.effects | EF_MUZZLEFLASH;};
  344. void() player_ogren2 = [$deathb2, player_ogren3 ] {self.weaponframe = 2;};
  345. void() player_ogren3 = [$deathb3, player_ogren4 ] {self.weaponframe = 3;};
  346. void() player_ogren4 = [$deathb4, player_ogren5 ] {self.weaponframe = 4;};
  347. void() player_ogren5 = [$deathb5, player_ogren6 ] {self.weaponframe = 5;};
  348. void() player_ogren6= [$deathb6, player_run ] {self.weaponframe = 6;};
  349.  
  350.  
  351. // WEAPONS
  352.  
  353. /*
  354. ================
  355. GruntFire
  356. ================
  357. */
  358. void() GruntFire =
  359. {
  360.     local vector dir;
  361.  
  362.     sound (self, CHAN_WEAPON, "weapons/guncock.wav", 1, ATTN_NORM);    
  363.  
  364.     self.punchangle_x = -2;
  365.     
  366.     dir = aim (self, 100000);
  367.     FireBullets (6, dir, '0.04 0.04 0');
  368. };
  369.  
  370.  
  371.  
  372. void(float offset) FireHK =
  373. {
  374.         local   vector  offang, dir;
  375.     local    vector    org, vec;
  376.  
  377.         dir = aim (self, 1000);
  378.         offang = vectoangles (dir);
  379.     offang_y = offang_y + offset * 6;
  380.     
  381.     makevectors (offang);
  382.  
  383.         org = self.origin + '0 0 16';
  384.  
  385. // set missile speed
  386.     vec = normalize (v_forward);
  387.     vec_z = 0 - vec_z + (random() - 0.5)*0.1;
  388.     
  389.     launch_spike (org, vec);
  390.     newmis.classname = "knightspike";
  391.         newmis.owner = self;
  392.     setmodel (newmis, "progs/k_spike.mdl");
  393.     setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);        
  394.         newmis.velocity = vec*1000;
  395.     sound (self, CHAN_WEAPON, "hknight/attack1.wav", 1, ATTN_NORM);
  396. };
  397.  
  398.  
  399. void() OgreGrenExplode =
  400. {
  401.     T_RadiusDamage (self, self.owner, 40, world);
  402.     sound (self, CHAN_VOICE, "weapons/r_exp3.wav", 1, ATTN_NORM);
  403.  
  404.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  405.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  406.     WriteCoord (MSG_BROADCAST, self.origin_x);
  407.     WriteCoord (MSG_BROADCAST, self.origin_y);
  408.     WriteCoord (MSG_BROADCAST, self.origin_z);
  409.  
  410.     self.velocity = '0 0 0';
  411.     self.touch = SUB_Null;
  412.     setmodel (self, "progs/s_explod.spr");
  413.     self.solid = SOLID_NOT;
  414.     s_explode1 ();
  415. };
  416.  
  417. void() OgreGrenTouch =
  418. {
  419.     if (other == self.owner)
  420.         return;        // don't explode on owner
  421.     if (other.takedamage == DAMAGE_AIM)
  422.     {
  423.                 OgreGrenExplode();
  424.         return;
  425.     }
  426.     sound (self, CHAN_VOICE, "weapons/bounce.wav", 1, ATTN_NORM);    // bounce sound
  427.     if (self.velocity == '0 0 0')
  428.         self.avelocity = '0 0 0';
  429. };
  430.  
  431. void() OgreFire =
  432. {
  433.     local    entity missile, mpuff;
  434.  
  435.         sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
  436.  
  437.         self.punchangle_x = -4;
  438.  
  439.     missile = spawn ();
  440.     missile.owner = self;
  441.     missile.movetype = MOVETYPE_BOUNCE;
  442.     missile.solid = SOLID_BBOX;
  443.     missile.classname = "grenade";
  444.         missile.wait = time + 10 + 10*random();
  445.         
  446. // set missile speed    
  447.  
  448.     makevectors (self.v_angle);
  449.  
  450.     if (self.v_angle_x)
  451.         missile.velocity = v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10;
  452.     else
  453.     {
  454.         missile.velocity = aim(self, 10000);
  455.         missile.velocity = missile.velocity * 600;
  456.         missile.velocity_z = 200;
  457.     }
  458.  
  459.     missile.avelocity = '300 300 300';
  460.  
  461.     missile.angles = vectoangles(missile.velocity);
  462.     
  463.         missile.touch = OgreGrenTouch;
  464.  
  465.                 missile.nextthink = time + 1.5;
  466.                 missile.think = OgreGrenExplode;
  467.  
  468.     setmodel (missile, "progs/grenade.mdl");
  469.     setsize (missile, '0 0 0', '0 0 0');        
  470.     setorigin (missile, self.origin);
  471. };
  472.  
  473. /*
  474. ================
  475. HomeFindTarget by Vhold
  476. returns the closest entity to itself that is killable, not a team member on 
  477. self's team, ect ect....
  478. ================
  479. */
  480. entity() HomeFindTarget =
  481. {
  482.         local entity head, selected;
  483.         local float dist;
  484.         dist = 100000;
  485.         selected = world;
  486.         head = findradius(self.origin, 100000);
  487.         while(head)
  488.         {
  489.           if( (head.health > 1) && (head != self) && (head != self.owner) && !( (teamplay == 1) && (head.team > 0)&&(head.team == self.owner.team) ) && (head.classname != "door") && (head.classname != "misc_explobox") && !(head.items & IT_INVISIBILITY) )
  490.              {
  491.  
  492.                         traceline(self.origin,head.origin,TRUE,self);
  493.                         if ( (trace_fraction >= 1) && (vlen(head.origin - self.origin) < dist) )
  494.                         {
  495.                                 selected = head;
  496.                                 dist = vlen(head.origin - self.origin);
  497.                         }
  498.                 }
  499.                 head = head.chain;
  500.         }
  501.  
  502.         return selected;
  503. };
  504. /* 
  505. ===============
  506. HomeThink by Vhold
  507. The Think function for the Homing Missile
  508. ===============
  509. */
  510. void() HomeThink =
  511. {
  512.         local vector needdir, currdir;
  513.     local float needspeed, maxspeed, acceleration;
  514.     local vector temp;
  515.  
  516.     traceline(self.origin,self.enemy.origin,TRUE,self);
  517.  
  518.         if ( (trace_fraction < 1) || !(self.enemy) || (self.enemy == world) || (self.enemy.health < 1) )
  519.                 self.enemy = HomeFindTarget();
  520.  
  521.         if (self.enemy != world) // Arr.. don't be taken on da World!
  522.         {
  523.         temp = normalize(self.velocity) * 100;
  524.         traceline(self.origin,self.origin+temp,TRUE,self);
  525.         if(trace_fraction < 1)
  526.         {
  527.             maxspeed = 200;
  528.             acceleration = 300;
  529.         }
  530.         else
  531.         {
  532.                         maxspeed = 350;
  533.             acceleration = 150;
  534.         }
  535.                 needdir = normalize((self.enemy.origin + '0 0 10') - self.origin);
  536.                 currdir = normalize(self.velocity);
  537.                 self.angles = vectoangles(needdir);
  538.  
  539.                 needspeed = vlen(needdir - currdir) * acceleration;
  540.  
  541.                 self.movedir = needdir * needspeed;
  542.                 self.velocity = self.velocity + self.movedir;
  543.  
  544.                 if ( vlen(self.velocity) > maxspeed )
  545.                         self.velocity = normalize(self.velocity) * maxspeed;
  546.         self.nextthink = time + 0.1;
  547.  
  548.         }
  549.     else
  550.             self.nextthink = time + 0.5;
  551.         
  552.     self.think=HomeThink;
  553. };
  554.  
  555. /*
  556. ==============
  557. ShalFire
  558. Fires a Shalrath missile using Vhold's homing code
  559. ==============
  560. */
  561. void() ShalTouch;
  562.  
  563. void() ShalFire =
  564. {
  565.     local    entity missile, mpuff;
  566.         
  567.         sound (self, CHAN_WEAPON, "shalrath/attack2.wav", 1, ATTN_NORM);
  568.  
  569.         self.punchangle_x = -4;
  570.  
  571.     missile = spawn ();
  572.     missile.owner = self;
  573.     missile.movetype = MOVETYPE_FLYMISSILE;
  574.     missile.solid = SOLID_BBOX;
  575.     missile.classname = "arocket";
  576.         
  577. // set missile speed    
  578.  
  579.     makevectors (self.v_angle);
  580.     missile.velocity = aim(self, 1000);
  581.         missile.velocity = missile.velocity * 350;
  582.         missile.avelocity= '300 300 300';
  583.     missile.angles = vectoangles(missile.velocity);
  584.     
  585.         missile.touch = ShalTouch;
  586.     
  587. // set missile duration
  588.     missile.nextthink = time + 0.5;
  589.     missile.think = HomeThink;
  590.     missile.enemy = world;
  591.  
  592.         setmodel (missile, "progs/v_spike.mdl");
  593.     setsize (missile, '0 0 0', '0 0 0');        
  594.         setorigin (missile, self.origin + v_forward*8 + '0 0 16');
  595.  
  596. };
  597.  
  598. void() ShalTouch =
  599. {
  600.     if (other == self.owner)
  601.         return;        // don't explode on owner
  602.  
  603.     T_RadiusDamage (self, self.owner, 40, world);
  604.     sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
  605.  
  606.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  607.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  608.     WriteCoord (MSG_BROADCAST, self.origin_x);
  609.     WriteCoord (MSG_BROADCAST, self.origin_y);
  610.     WriteCoord (MSG_BROADCAST, self.origin_z);
  611.  
  612.     self.velocity = '0 0 0';
  613.     self.touch = SUB_Null;
  614.     setmodel (self, "progs/s_explod.spr");
  615.     self.solid = SOLID_NOT;
  616.     s_explode1 ();
  617. };
  618.  
  619. /*
  620. **************
  621. MELEE ATTACKS
  622. **************
  623. */
  624.  
  625. // FRAMES
  626.  
  627. void(float side) HKSword;
  628.  
  629. void() player_hksword = [ 113, player_hksword2 ] {self.weaponframe = 1;};
  630. void() player_hksword2 = [ 114, player_hksword3 ] {self.weaponframe = 2;sound (self, CHAN_WEAPON, "knight/sword2.wav", 1, ATTN_NORM);};
  631. void() player_hksword3 = [ 115, player_hksword4 ] {self.weaponframe = 3;HKSword();};
  632. void() player_hksword4 = [ 116, player_hksword5 ] {self.weaponframe = 4;};
  633. void() player_hksword5 = [ 117, player_hksword6 ] {self.weaponframe = 5;HKSword();};
  634. void() player_hksword6 = [ 118, player_hksword7 ] {self.weaponframe = 6;HKSword();};
  635. void() player_hksword7 = [ 119, player_hksword8 ] {self.weaponframe = 7;HKSword();};
  636. void() player_hksword8 = [ 120, player_hksword9 ] {self.weaponframe = 8;HKSword();};
  637. void() player_hksword9 = [ 121, player_hksword10 ] {self.weaponframe = 0;};
  638. void() player_hksword10 = [ 122, player_run ] {};
  639.  
  640.  
  641. void(float side) Player_Demon_Melee;
  642.  
  643. void()  player_dattack = [$deatha5, player_dattack2 ] {self.view_ofs = '0 0 8';};
  644. void()  player_dattack2 = [$deatha6, player_dattack3 ] {self.view_ofs = '0 0 16';};
  645. void()  player_dattack3 = [$deatha7, player_dattack4 ] {self.view_ofs = '0 0 25';};
  646. void()  player_dattack4 = [$deatha8, player_dattack5 ] {self.view_ofs = '0 0 23';};
  647. void()  player_dattack5 = [$deatha9, player_dattack6 ] {self.view_ofs = '0 0 21'; Player_Demon_Melee(200);};
  648. void()  player_dattack6 = [$deatha10, player_dattack7 ] {self.view_ofs = '0 0 23';};
  649. void()  player_dattack7 = [$deatha11, player_dattack8 ] {self.view_ofs = '0 0 24';};
  650. void()  player_dattack8 = [$deathb1, player_dattack9 ] {self.view_ofs = '0 0 25';};              
  651. void()  player_dattack9 = [$deathb2, player_dattack10 ] {self.view_ofs = '0 0 24';};
  652. void()  player_dattack10 = [$deathb3, player_dattack11 ] {self.view_ofs = '0 0 23';};
  653. void()  player_dattack11 = [$deathb4, player_dattack12 ] {self.view_ofs = '0 0 21'; Player_Demon_Melee(-200);};
  654. void()  player_dattack12 = [$deathb5, player_dattack13 ] {self.view_ofs = '0 0 16';};
  655. void()  player_dattack13 = [$deathb6, player_dattack14 ] {self.view_ofs = '0 0 12';};
  656. void()  player_dattack14 = [$deathb7, player_dattack15 ] {self.view_ofs = '0 0 8';};
  657. void()  player_dattack15 = [$deathb8, player_stand1 ] {self.view_ofs = '0 0 4';};
  658.  
  659. void(float side) Player_Knight_Melee;
  660.  
  661. void() player_kattack = [18      , player_kattack2 ] {self.weaponframe = 4; sound (self, CHAN_WEAPON, "knight/sword1.wav", 1, ATTN_NORM);};
  662. void() player_kattack2 = [19     , player_kattack3 ]{self.weaponframe = 5; Player_Knight_Melee(100);};
  663. void() player_kattack3 = [20      , player_kattack4 ]{self.weaponframe = 6;};
  664. void() player_kattack4 = [21      , player_kattack5 ]{self.weaponframe = 7;};
  665. void() player_kattack5 = [22     , player_kattack6 ]{self.weaponframe = 8; Player_Knight_Melee(1);};
  666. void() player_kattack6 = [23     , player_kattack7 ]{self.weaponframe = 1;};
  667. void() player_kattack7 = [24      , player_kattack8 ]{self.weaponframe = 2;};
  668. void() player_kattack8 = [25      , player_kattack9 ]{self.weaponframe = 3;Player_Knight_Melee(-100);};
  669. void() player_kattack9 = [26      , player_kattack10 ]{self.weaponframe = 4;};
  670. void() player_kattack10 = [27      , player_kattack11 ]{self.weaponframe = 4;};
  671. void() player_kattack11 = [28     , player_run ] {self.weaponframe = 0;};
  672.  
  673. void (float side) player_chainsaw;
  674.  
  675. void() player_oattack = [$axpain5, player_oattack2 ] {sound (self, CHAN_WEAPON, "ogre/ogsawatk.wav", 1, ATTN_NORM);};
  676.     void() player_oattack2 = [$axpain6, player_oattack3 ] {};    
  677. void() player_oattack3 = [ $pain1, player_oattack4 ] {};     
  678. void() player_oattack4 = [ $pain2, player_oattack5 ] {};    
  679. void() player_oattack5 = [ $pain3, player_oattack6 ] {player_chainsaw(0);};    
  680. void() player_oattack6 = [ $pain4, player_oattack7 ] {player_chainsaw(300);};    
  681. void() player_oattack7 = [ $pain5, player_oattack8 ] {player_chainsaw(0);};    
  682. void() player_oattack8 = [ $pain6, player_oattack9 ] {player_chainsaw(0);};    
  683. void() player_oattack9 = [ $axdeth1, player_oattack10 ] {player_chainsaw(0);};    
  684. void() player_oattack10 = [ $axdeth2, player_oattack11 ] {player_chainsaw(-200);};     
  685. void() player_oattack11 = [ $axdeth3, player_oattack12 ] {player_chainsaw(0);};    
  686. void() player_oattack12 = [ $axdeth4, player_oattack13 ] {};    
  687. void() player_oattack13 = [ $axdeth5, player_oattack14 ] {};    
  688. void() player_oattack14 = [ $axdeth6, player_run ]  {};   
  689.  
  690.  
  691. // WEAPONS
  692.  
  693. void(float side) Player_Demon_Melee =
  694. {
  695.     local    vector    source;
  696.     local    vector    org;
  697.         local   float   ldmg;
  698.  
  699.         sound (self, CHAN_WEAPON, "weapons/ax1.wav", 1, ATTN_NORM);        
  700.  
  701.         source = self.origin + '0 0 4';
  702.         makevectors (self.angles);
  703.         traceline (source, source + v_forward*128, FALSE, self);
  704.         if (!trace_ent.takedamage)
  705.                 traceline (source, source + v_forward*128 + v_right*30, FALSE, self);
  706.         if (!trace_ent.takedamage)
  707.                 traceline (source, source + v_forward*128 - v_right*30, FALSE, self);
  708.  
  709.     if (trace_fraction == 1.0)
  710.         return;
  711.     
  712.     org = trace_endpos - v_forward*4;
  713.     if (trace_ent.takedamage)
  714.     {
  715.             sound (self, CHAN_WEAPON, "demon/dhit2.wav", 1, ATTN_NORM);
  716.                 ldmg = 10 + 5*random();
  717.                 T_Damage (trace_ent, self, self, ldmg); 
  718.  
  719.                 SpawnMeatSpray (self.origin + v_forward*16, side * v_right);
  720.     }
  721. };
  722.  
  723. void(float side) Player_Knight_Melee =
  724. {
  725.     local    vector    source;
  726.     local    vector    org;
  727.         local   float   ldmg;
  728.  
  729.         source = self.origin + '0 0 16';
  730.         makevectors (self.angles);
  731.         traceline (source, source + v_forward*128, FALSE, self);
  732.         if (!trace_ent.takedamage)
  733.                 traceline (source, source + v_forward*128 + v_right*30, FALSE, self);
  734.         if (!trace_ent.takedamage)
  735.                 traceline (source, source + v_forward*128 - v_right*30, FALSE, self);
  736.  
  737.     if (trace_fraction == 1.0)
  738.         return;
  739.     
  740.     org = trace_endpos - v_forward*4;
  741.     if (trace_ent.takedamage)
  742.     {
  743.                 ldmg = 6 + 3*random();
  744.                 T_Damage (trace_ent, self, self, ldmg); 
  745.  
  746.                 SpawnMeatSpray (self.origin + v_forward*16, side * v_right);
  747.     }
  748. };
  749.  
  750.  
  751. void(float side) HKSword =
  752. {
  753.     local    vector    source;
  754.     local    vector    org;
  755.         local   float   ldmg;
  756.  
  757.         source = self.origin + '0 0 16';
  758.         makevectors (self.angles);
  759.         traceline (source, source + v_forward*128, FALSE, self);
  760.         if (!trace_ent.takedamage)
  761.                 traceline (source, source + v_forward*128 + v_right*30, FALSE, self);
  762.         if (!trace_ent.takedamage)
  763.                 traceline (source, source + v_forward*128 - v_right*30, FALSE, self);
  764.  
  765.     if (trace_fraction == 1.0)
  766.         return;
  767.     
  768.     org = trace_endpos - v_forward*4;
  769.     if (trace_ent.takedamage)
  770.     {
  771.                 ldmg = 6 + 3*random();
  772.                 T_Damage (trace_ent, self, self, ldmg); 
  773.  
  774.                 SpawnMeatSpray (self.origin + v_forward*16, side * v_right);
  775.     }
  776. };
  777.  
  778.  
  779.  
  780. void(float side) player_chainsaw =
  781. {
  782.     local    vector    source;
  783.     local    vector    org;
  784.         local   float   ldmg;
  785.  
  786.         source = self.origin + '0 0 16';
  787.         makevectors (self.angles);
  788.         traceline (source, source + v_forward*128, FALSE, self);
  789.         if (!trace_ent.takedamage)
  790.                 traceline (source, source + v_forward*128 + v_right*30, FALSE, self);
  791.         if (!trace_ent.takedamage)
  792.                 traceline (source, source + v_forward*128 - v_right*30, FALSE, self);
  793.  
  794.     if (trace_fraction == 1.0)
  795.         return;
  796.     
  797.     org = trace_endpos - v_forward*4;
  798.     if (trace_ent.takedamage)
  799.     {
  800.                 ldmg = (random() + random() + random()) * 4;
  801.                 T_Damage (trace_ent, self, self, ldmg); 
  802.  
  803.                 SpawnMeatSpray (self.origin + v_forward*16, side * v_right);
  804.     }
  805. };
  806.  
  807.  
  808.  
  809. void() Player_Demon_JumpTouch =
  810. {
  811.         local float ldmg;
  812.  
  813.         if(other.takedamage)
  814.         {
  815.                 ldmg = 40 + 10*random();
  816.                 T_Damage(other, self, self, ldmg);
  817.                 SpawnMeatSpray (self.origin + v_forward*20,  100* v_forward);
  818.                 SpawnMeatSpray (self.origin + v_forward*20,  50* v_forward);
  819.         }
  820.  
  821.         self.touch = SUB_Null;
  822. };
  823.  
  824.  
  825. /*
  826. ***********
  827. PAIN
  828. ***********
  829. */
  830.  
  831. void(float num_bubbles) DeathBubbles;
  832.  
  833. void() PainSound =
  834. {
  835. local float        rs;
  836.  
  837.     if (self.health < 0)
  838.         return;
  839.  
  840.     if (damage_attacker.classname == "teledeath")
  841.     {
  842.         sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
  843.         return;
  844.     }
  845.  
  846. // water pain sounds
  847.     if (self.watertype == CONTENT_WATER && self.waterlevel == 3)
  848.     {
  849.         DeathBubbles(1);
  850.         if (random() > 0.5)
  851.             sound (self, CHAN_VOICE, "player/drown1.wav", 1, ATTN_NORM);
  852.         else
  853.             sound (self, CHAN_VOICE, "player/drown2.wav", 1, ATTN_NORM);
  854.         return;
  855.     }
  856.  
  857. // slime pain sounds
  858.     if (self.watertype == CONTENT_SLIME)
  859.     {
  860. // FIX ME    put in some steam here
  861.         if (random() > 0.5)
  862.             sound (self, CHAN_VOICE, "player/lburn1.wav", 1, ATTN_NORM);
  863.         else
  864.             sound (self, CHAN_VOICE, "player/lburn2.wav", 1, ATTN_NORM);
  865.         return;
  866.     }
  867.  
  868.     if (self.watertype == CONTENT_LAVA)
  869.     {
  870.         if (random() > 0.5)
  871.             sound (self, CHAN_VOICE, "player/lburn1.wav", 1, ATTN_NORM);
  872.         else
  873.             sound (self, CHAN_VOICE, "player/lburn2.wav", 1, ATTN_NORM);
  874.         return;
  875.     }
  876.  
  877.     if (self.pain_finished > time)
  878.     {
  879.         self.axhitme = 0;
  880.         return;
  881.     }
  882.     self.pain_finished = time + 0.5;
  883.  
  884. // don't make multiple pain sounds right after each other
  885.  
  886. // ax pain sound
  887.     self.noise = "";
  888.         if (self.effects & EF_DEMON)
  889.                 self.noise = "demon/dpain1.wav";
  890.         else if (self.effects & EF_GRUNT)
  891.                 self.noise = "soldier/pain1.wav";
  892.         else if (self.effects & EF_KNIGHT)
  893.                 self.noise = "knight/khurt.wav";
  894.         else if (self.effects & EF_HKNIGHT)
  895.                 self.noise = "hknight/pain1.wav";
  896.         else if (self.effects & EF_OGRE)
  897.                 self.noise = "ogre/ogpain1.wav";
  898.         else if (self.effects & EF_WIZARD)
  899.                 self.noise = "wizard/wpain.wav";
  900.         else if (self.effects & EF_ENFORCER)
  901.                 self.noise = "enforcer/pain1.wav";
  902.         else if (self.effects & EF_SHALRATH)
  903.                 self.noise = "shalrath/pain.wav";
  904.     sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
  905.     return;
  906. };
  907.  
  908. void()  player_dpain =  [       $pain5, player_dpain1    ]
  909. {
  910.         self.walkframe = 1;
  911.         PainSound();
  912.         self.weaponframe = 0;
  913.         self.frame = $pain5;
  914. };
  915.  
  916. void()  player_dpain1 =  [      $pain5, player_dpain1    ]
  917. {        
  918.         if (self.walkframe >=10)
  919.                 player_stand1();
  920.         if (self.walkframe < 6)
  921.                 self.frame = $pain5 + self.walkframe;
  922.         else self.frame = $pain5 + (10 - self.walkframe);
  923.         self.walkframe = self.walkframe + 1;
  924. };
  925.  
  926.  
  927. void() player_gpain  =  [$pain6   , player_gpain2 ] {PainSound();self.weaponframe=0;};
  928. void() player_gpain2 =  [$axdeth1   , player_gpain3 ] {};
  929. void() player_gpain3  = [$axdeth2   , player_gpain4 ] {};
  930. void() player_gpain4  = [$axdeth3   , player_gpain5 ] {};
  931. void() player_gpain5 =  [$axdeth4   , player_gpain6 ] {};
  932. void() player_gpain6  = [$axdeth5   , player_run    ] {};
  933.  
  934. void() player_kpain = [$axpain6    , player_kpain2  ] {PainSound();self.weaponframe= 0;};
  935. void() player_kpain2 = [$pain1    , player_kpain3  ] {};
  936. void() player_kpain3 = [$pain2    , player_run  ] {};
  937.  
  938. void() player_epain = [71, player_epain2 ] {PainSound();self.weaponframe = 0;};
  939. void() player_epain2 = [ 72, player_epain3 ] {};
  940. void() player_epain3 = [ 73, player_epain4 ] {};
  941. void() player_epain4 = [ 74, player_epain5 ] {};
  942. void() player_epain5 = [ 75, player_run ] {};
  943.  
  944. void() player_spain = [ 12, player_spain2] {PainSound();self.weaponframe = 0;};
  945. void() player_spain2 = [ 13, player_spain3 ] {};
  946. void() player_spain3 = [ 14, player_spain4 ] {};
  947. void() player_spain4 = [ 15, player_spain5 ] {};
  948. void() player_spain5 = [ 16, player_run ] {};
  949.  
  950. void() player_opain = [ $deathb7, player_opain2 ] {PainSound();self.weaponframe = 0;};
  951. void() player_opain2 = [ $deathb8, player_opain3  ] {};
  952. void() player_opain3 = [ $deathb9, player_opain4 ] {};
  953. void() player_opain4 = [ $deathc1, player_opain5] {};
  954. void() player_opain5 = [ $deathc2, player_run ] {};
  955.  
  956. void() player_wpain = [ 43, player_wpain2 ] {PainSound();};
  957. void() player_wpain2 = [ 44, player_wpain3 ] {};
  958. void() player_wpain3 = [ 45, player_wpain4 ] {};
  959. void() player_wpain4 = [ 46, player_run ] {};
  960.  
  961. void() player_hkpain = [ 38, player_hkpain2 ] {PainSound();};
  962. void() player_hkpain2 = [ 39, player_hkpain3 ] {};
  963. void() player_hkpain3 = [ 40, player_hkpain4 ] {};
  964. void() player_hkpain4 = [ 41, player_hkpain5 ] {};
  965. void() player_hkpain5 = [ 42, player_run ] {};
  966.  
  967. void() player_pain =
  968. {
  969.     if (self.weaponframe)
  970.         return;
  971.  
  972.     if (self.invisible_finished > time)
  973.         return;        // eyes don't have pain frames
  974.  
  975.         if (self.effects & EF_DEMON)
  976.                 player_dpain ();
  977.  
  978.         else if (self.effects & EF_GRUNT)
  979.                 player_gpain ();
  980.  
  981.         else if (self.effects & EF_ENFORCER)
  982.                 player_epain ();
  983.  
  984.         else if (self.effects & EF_KNIGHT)
  985.                 player_kpain ();
  986.  
  987.         else if (self.effects & EF_KNIGHT)
  988.                 player_hkpain ();
  989.  
  990.         else if (self.effects & EF_OGRE) 
  991.                  player_opain();     
  992.  
  993.         else if (self.effects & EF_OGRE)
  994.                  player_opain();     
  995.  
  996.         else if (self.effects & EF_WIZARD)
  997.                  player_wpain();     
  998.  
  999.         else if (self.effects & EF_SHALRATH)
  1000.                  player_spain();     
  1001.  
  1002. };
  1003.  
  1004. void() DeathBubblesSpawn =
  1005. {
  1006. local entity    bubble;
  1007.     if (self.owner.waterlevel != 3)
  1008.         return;
  1009.     bubble = spawn();
  1010.     setmodel (bubble, "progs/s_bubble.spr");
  1011.     setorigin (bubble, self.owner.origin + '0 0 24');
  1012.     bubble.movetype = MOVETYPE_NOCLIP;
  1013.     bubble.solid = SOLID_NOT;
  1014.     bubble.velocity = '0 0 15';
  1015.     bubble.nextthink = time + 0.5;
  1016.     bubble.think = bubble_bob;
  1017.     bubble.classname = "bubble";
  1018.     bubble.frame = 0;
  1019.     bubble.cnt = 0;
  1020.     setsize (bubble, '-8 -8 -8', '8 8 8');
  1021.     self.nextthink = time + 0.1;
  1022.     self.think = DeathBubblesSpawn;
  1023.     self.air_finished = self.air_finished + 1;
  1024.     if (self.air_finished >= self.bubble_count)
  1025.         remove(self);
  1026. };
  1027.  
  1028. void(float num_bubbles) DeathBubbles =
  1029. {
  1030. local entity    bubble_spawner;
  1031.     
  1032.     bubble_spawner = spawn();
  1033.     setorigin (bubble_spawner, self.origin);
  1034.     bubble_spawner.movetype = MOVETYPE_NONE;
  1035.     bubble_spawner.solid = SOLID_NOT;
  1036.     bubble_spawner.nextthink = time + 0.1;
  1037.     bubble_spawner.think = DeathBubblesSpawn;
  1038.     bubble_spawner.air_finished = 0;
  1039.     bubble_spawner.owner = self;
  1040.     bubble_spawner.bubble_count = num_bubbles;
  1041.     return;
  1042. };
  1043.  
  1044.  
  1045. void() PlayerDead =
  1046. {
  1047.     self.nextthink = -1;
  1048. // allow respawn after a certain time
  1049.     self.deadflag = DEAD_DEAD;
  1050. };
  1051.  
  1052. vector(float dm) VelocityForDamage =
  1053. {
  1054.     local vector v;
  1055.  
  1056.     v_x = 100 * crandom();
  1057.     v_y = 100 * crandom();
  1058.     v_z = 200 + 100 * random();
  1059.  
  1060.     if (dm > -50)
  1061.     {
  1062. //        dprint ("level 1\n");
  1063.         v = v * 0.7;
  1064.     }
  1065.     else if (dm > -200)
  1066.     {
  1067. //        dprint ("level 3\n");
  1068.         v = v * 2;
  1069.     }
  1070.     else
  1071.         v = v * 10;
  1072.  
  1073.     return v;
  1074. };
  1075.  
  1076. void(string gibname, float dm) ThrowGib =
  1077. {
  1078.     local    entity new;
  1079.  
  1080.     new = spawn();
  1081.     new.origin = self.origin;
  1082.     setmodel (new, gibname);
  1083.     setsize (new, '0 0 0', '0 0 0');
  1084.     new.velocity = VelocityForDamage (dm);
  1085.     new.movetype = MOVETYPE_BOUNCE;
  1086.     new.solid = SOLID_NOT;
  1087.     new.avelocity_x = random()*600;
  1088.     new.avelocity_y = random()*600;
  1089.     new.avelocity_z = random()*600;
  1090.     new.think = SUB_Remove;
  1091.     new.ltime = time;
  1092.     new.nextthink = time + 10 + random()*10;
  1093.     new.frame = 0;
  1094.     new.flags = 0;
  1095. };
  1096.  
  1097. void(string gibname, float dm) ThrowHead =
  1098. {
  1099.     setmodel (self, gibname);
  1100.     self.frame = 0;
  1101.     self.nextthink = -1;
  1102.     self.movetype = MOVETYPE_BOUNCE;
  1103.     self.takedamage = DAMAGE_NO;
  1104.     self.solid = SOLID_NOT;
  1105.     self.view_ofs = '0 0 8';
  1106.     setsize (self, '-16 -16 0', '16 16 56');
  1107.     self.velocity = VelocityForDamage (dm);
  1108.     self.origin_z = self.origin_z - 24;
  1109.     self.flags = self.flags - (self.flags & FL_ONGROUND);
  1110.     self.avelocity = crandom() * '0 600 0';
  1111. };
  1112.  
  1113.  
  1114. void() GibPlayer =
  1115. {
  1116.         ThrowHead ("progs/h_player.mdl", self.health);
  1117.     ThrowGib ("progs/gib1.mdl", self.health);
  1118.     ThrowGib ("progs/gib2.mdl", self.health);
  1119.     ThrowGib ("progs/gib3.mdl", self.health);
  1120.  
  1121.     self.deadflag = DEAD_DEAD;
  1122.  
  1123.     if (damage_attacker.classname == "teledeath")
  1124.     {
  1125.         sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
  1126.         return;
  1127.     }
  1128.  
  1129.     if (damage_attacker.classname == "teledeath2")
  1130.     {
  1131.         sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
  1132.         return;
  1133.     }
  1134.         
  1135.     if (random() < 0.5)
  1136.         sound (self, CHAN_VOICE, "player/gib.wav", 1, ATTN_NONE);
  1137.     else
  1138.         sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NONE);
  1139. };
  1140.  
  1141. void() player_ddie  = [ $axdeth5, player_ddie1 ]
  1142. {
  1143.         sound (self, CHAN_VOICE, "demon/ddeath.wav", 1, ATTN_NONE);
  1144.         self.walkframe = 1;
  1145.         self.frame = $axdeth5;
  1146. };
  1147.  
  1148. /*
  1149. ***********
  1150. DEATH
  1151. ***********
  1152. */
  1153.  
  1154. void() player_ddie2 = [ $deatha4, player_ddie2 ] {PlayerDead();};
  1155.  
  1156. void() player_ddie1 = [ $axdeth5, player_ddie1 ] 
  1157. {
  1158.         if (self.walkframe >= 8) {
  1159.                 player_ddie2();
  1160.         }
  1161.         else {
  1162.                 self.frame = $axdeth5 + self.walkframe;
  1163.                 self.walkframe = self.walkframe + 1;
  1164.         }
  1165. };
  1166.  
  1167. void()  player_gdie =   [ $rockrun3,    player_gdie2    ] {sound(self, CHAN_VOICE, "soldier/death1.wav", 1, ATTN_NONE);};
  1168. void()    player_gdie2 =    [ $rockrun4,    player_gdie3    ] {};
  1169. void()    player_gdie3 =    [ $rockrun5,    player_gdie4    ] {};
  1170. void()    player_gdie4 =    [ $rockrun6,    player_gdie5    ] {};
  1171. void()    player_gdie5 =    [ $stand1,    player_gdie6    ] {};
  1172. void()    player_gdie6 =    [ $stand2,    player_gdie7    ] {};
  1173. void()    player_gdie7 =    [ $stand3,    player_gdie8    ] {};
  1174. void()    player_gdie8 =    [ $stand4,    player_gdie9    ] {};
  1175. void()    player_gdie9 =    [ $stand5,    player_gdie10    ] {};
  1176. void()  player_gdie10 = [ $axstnd1,     player_gdie10   ] {PlayerDead();};
  1177.  
  1178. void()  player_kdie = [$deathd3,  player_kdie2    ] {sound (self, CHAN_VOICE, "knight/kdeath.wav", 1, ATTN_NONE);};
  1179. void()  player_kdie2 = [ $deathd4, player_kdie3   ] {};
  1180. void()  player_kdie3 = [ $deathd5, player_kdie4   ] {};  
  1181. void()  player_kdie4 = [ $deathd6, player_kdie5   ] {};  
  1182. void()  player_kdie5 = [ $deathd7, player_kdie6   ] {};  
  1183. void()  player_kdie6 = [ $deathd8, player_kdie7   ] {};  
  1184. void()  player_kdie7 = [ $deathd9, player_kdie8   ] {};  
  1185. void()  player_kdie8 = [ $deathe1, player_kdie9   ] {};  
  1186. void()  player_kdie9 = [ $deathe2, player_kdie10   ] {};  
  1187. void()  player_kdie10 = [ $deathe3, player_kdie10   ] {PlayerDead();};
  1188.  
  1189. void() player_hkdie = [ 43, player_hkdie2 ] {sound (self, CHAN_VOICE, "hknight/death1.wav", 1, ATTN_NONE);};
  1190. void() player_hkdie2 = [ 44, player_hkdie3 ] {};
  1191. void() player_hkdie3 = [ 45, player_hkdie4 ] {};
  1192. void() player_hkdie4 = [ 46, player_hkdie5 ] {};
  1193. void() player_hkdie5 = [ 47, player_hkdie6 ] {};
  1194. void() player_hkdie6 = [ 48, player_hkdie7 ] {};
  1195. void() player_hkdie7 = [ 49, player_hkdie8 ] {};
  1196. void() player_hkdie8 = [ 50, player_hkdie9 ] {};
  1197. void() player_hkdie9 = [ 51, player_hkdie10 ] {};
  1198. void() player_hkdie10 = [ 52, player_hkdie11 ] {};
  1199. void() player_hkdie11 = [ 53, player_hkdie11 ] {PlayerDead();};
  1200.  
  1201.  
  1202. void() player_edie = [56, player_edie2 ] {sound (self, CHAN_VOICE, "enforcer/death1.wav", 1, ATTN_NONE);};
  1203. void() player_edie2= [57, player_edie3 ] {};
  1204. void() player_edie3= [58, player_edie4 ] {};
  1205. void() player_edie4= [59, player_edie5 ] {};
  1206. void() player_edie5= [60, player_edie6 ] {};
  1207. void() player_edie6= [61, player_edie7 ] {};
  1208. void() player_edie7= [62, player_edie8 ] {};
  1209. void() player_edie8= [63, player_edie9 ] {};
  1210. void() player_edie9= [64, player_edie10 ] {};
  1211. void() player_edie10= [65, player_edie10 ] {PlayerDead();};
  1212.  
  1213. void() player_sdie=  [17, player_sdie2] {sound (self, CHAN_VOICE, "shalrath/death.wav", 1, ATTN_NONE);};
  1214. void() player_sdie2= [18, player_sdie3] {};
  1215. void() player_sdie3= [19, player_sdie4] {};
  1216. void() player_sdie4= [20, player_sdie5] {};
  1217. void() player_sdie5= [21, player_sdie6] {};
  1218. void() player_sdie6= [22, player_sdie6] {PlayerDead();};
  1219.  
  1220.  
  1221. void() player_odie = [ $rockatt6, player_odie2 ] {sound (self, CHAN_VOICE, "ogre/ogdth.wav", 1, ATTN_NONE);};
  1222. void() player_odie2 = [ $shotatt1, player_odie3 ] {};
  1223. void() player_odie3 = [ $shotatt2, player_odie4 ] {};
  1224. void() player_odie4 = [ $shotatt3, player_odie5 ] {};
  1225. void() player_odie5 = [ $shotatt4, player_odie6 ] {};
  1226. void() player_odie6 = [ $shotatt5, player_odie7 ] {};
  1227. void() player_odie7 = [ $shotatt6, player_odie8 ] {};
  1228. void() player_odie8 = [ $axatt1, player_odie9 ] {};
  1229. void() player_odie9 = [ $axatt2, player_odie10 ] {};
  1230. void() player_odie10 = [ $axatt3, player_odie11 ] {};
  1231. void() player_odie11 = [ $axatt4, player_odie12 ] {};
  1232. void() player_odie12 = [ $axatt5, player_odie13 ] {};
  1233. void() player_odie13 = [ $axatt6, player_odie14 ] {};
  1234. void() player_odie14 = [ $axattb1, player_odie14 ] {PlayerDead();};
  1235.  
  1236. void() player_wdie = [ 47, player_wdie2 ] {sound (self, CHAN_VOICE, "wizard/wdeath.wav", 1, ATTN_NONE);};
  1237. void() player_wdie2 = [ 48, player_wdie3 ] {};
  1238. void() player_wdie3 = [ 49, player_wdie4 ] {};
  1239. void() player_wdie4 = [ 50, player_wdie5 ] {};
  1240. void() player_wdie5 = [ 51, player_wdie6 ] {};
  1241. void() player_wdie6 = [ 52, player_wdie7 ] {};
  1242. void() player_wdie7 = [ 53, player_wdie7 ] {PlayerDead();};
  1243. void() PlayerDie =
  1244. {
  1245.     local    float    i;
  1246.     
  1247.     self.items = self.items - (self.items & IT_INVISIBILITY);
  1248.     self.invisible_finished = 0;    // don't die as eyes
  1249.     self.invincible_finished = 0;
  1250.     self.super_damage_finished = 0;
  1251.     self.radsuit_finished = 0;
  1252.         if (self.modelindex == modelindex_eyes)
  1253.           {
  1254.             if(self.effects & EF_DEMON)
  1255.               self.modelindex = modelindex_demon;
  1256.             else if(self.effects & EF_GRUNT)
  1257.               self.modelindex = modelindex_grunt;
  1258.             else if(self.effects & EF_KNIGHT)
  1259.               self.modelindex = modelindex_knight;
  1260.             else if(self.effects & EF_HKNIGHT)
  1261.               self.modelindex = modelindex_hknight;
  1262.             else if(self.effects & EF_KNIGHT)
  1263.               self.modelindex = modelindex_ogre;
  1264.             else if(self.effects & EF_WIZARD)
  1265.               self.modelindex = modelindex_ogre;
  1266.             else if(self.effects & EF_ENFORCER)
  1267.               self.modelindex = modelindex_enforcer;
  1268.             else if(self.effects & EF_SHALRATH)
  1269.               self.modelindex = modelindex_shalrath;
  1270.           }
  1271.  
  1272.         self.weaponmodel="";
  1273.     self.view_ofs = '0 0 -8';
  1274.     self.deadflag = DEAD_DYING;
  1275.     self.solid = SOLID_NOT;
  1276.     self.flags = self.flags - (self.flags & FL_ONGROUND);
  1277.     self.movetype = MOVETYPE_TOSS;
  1278.     if (self.velocity_z < 10)
  1279.         self.velocity_z = self.velocity_z + random()*300;
  1280.  
  1281.         if (self.health < -20)
  1282.     {
  1283.         GibPlayer ();
  1284.         return;
  1285.     }
  1286.  
  1287.     self.angles_x = 0;
  1288.     self.angles_z = 0;
  1289.  
  1290.         if (self.effects & EF_DEMON)
  1291.         {
  1292.                 player_ddie ();
  1293.                 return;
  1294.         }
  1295.         else if (self.effects & EF_GRUNT)
  1296.         {
  1297.                 player_gdie();
  1298.                 return;
  1299.         }
  1300.         else if (self.effects & EF_ENFORCER)
  1301.         {
  1302.                 player_edie();
  1303.                 return;
  1304.         }
  1305.         else if (self.effects & EF_KNIGHT)
  1306.         {
  1307.                 player_kdie();
  1308.                 return;
  1309.         }
  1310.         else if (self.effects & EF_HKNIGHT)
  1311.         {
  1312.                 player_hkdie();
  1313.                 return;
  1314.         }
  1315.         else if (self.effects & EF_OGRE)
  1316.         {
  1317.                 player_odie();
  1318.                 return;
  1319.         }
  1320.         else if (self.effects & EF_WIZARD)
  1321.         {
  1322.                 player_wdie();
  1323.                 return;
  1324.         }
  1325.         else if (self.effects & EF_SHALRATH)
  1326.         {
  1327.                 player_sdie();
  1328.                 return;
  1329.         }
  1330. };
  1331.  
  1332. void() set_suicide_frame =
  1333. {    // used by klill command and diconnect command
  1334.     if (self.model != "progs/player.mdl")
  1335.         return;    // allready gibbed
  1336.     self.frame = $deatha11;
  1337.     self.solid = SOLID_NOT;
  1338.     self.movetype = MOVETYPE_TOSS;
  1339.     self.deadflag = DEAD_DEAD;
  1340.     self.nextthink = -1;
  1341. };
  1342.