home *** CD-ROM | disk | FTP | other *** search
/ Quake 'em / QUAKEEM.BIN / quake / programs / qplus11 / player.qc < prev    next >
Encoding:
Text File  |  1996-08-27  |  22.0 KB  |  832 lines

  1. void(string gibname, float dm) ThrowGib;
  2. float() random;
  3.  
  4. void() SUB_Gib =
  5. {
  6.         local vector x, y, v;
  7.         x='1 0 0';
  8.         y='0 1 0';
  9.         v=x*(50-random()*100)+y*(50-random()*100);
  10.         if (random() < 0.8)                 
  11.            SpawnMeatSpray(self.origin, v);
  12.        
  13.         else if (random() < 0.3)
  14.                 ThrowGib("progs/gib1.mdl", self.health*3);
  15.         else if (random() < 0.5)
  16.                 ThrowGib("progs/gib2.mdl", self.health*3);
  17.         else 
  18.                 ThrowGib("progs/gib3.mdl", self.health*3);
  19. };      
  20.  
  21. ///////
  22. void() SUB_Gib1 =
  23. {
  24.        local vector x, y, v;
  25.         x='1 0 0';
  26.         y='0 1 0';
  27.         v=x*(50-random()*100)+y*(50-random()*100);
  28.         if (random() < 0.8)                 
  29.            SpawnMeatSpray(self.origin, v);
  30.  
  31.         else if (random() < 0.3)
  32.                 ThrowGib("progs/gib3.mdl", self.health*3);
  33.         else if (random() < 0.5)
  34.                 ThrowGib("progs/zom_gib.mdl", self.health*3);
  35.         else
  36.                 ThrowGib("progs/gib3.mdl", self.health*3);
  37. };
  38.  
  39.  
  40. ///////
  41. void() SUB_Gib2 =
  42. {
  43.         local vector x, y, v;
  44.         x='1 0 0';
  45.         y='0 1 0';
  46.         v=x*(50-random()*100)+y*(50-random()*100);
  47.         if (random() < 0.8)                 
  48.            SpawnMeatSpray(self.origin, v);
  49.  
  50.         else if (random() < 0.3)
  51.                 ThrowGib("progs/zom_gib.mdl", self.health*3);
  52.         else if (random() < 0.5)
  53.                 ThrowGib("progs/zom_gib.mdl", self.health*3);
  54.         else
  55.                 ThrowGib("progs/gib3.mdl", self.health);
  56. };
  57.  
  58. void() bubble_bob;
  59.  
  60. /*
  61. ==============================================================================
  62.  
  63. PLAYER
  64.  
  65. ==============================================================================
  66. */
  67.  
  68. $cd /raid/quake/id1/models/player_4
  69. $origin 0 -6 24
  70. $base base        
  71. $skin skin
  72.  
  73. //
  74. // running
  75. //
  76. $frame axrun1 axrun2 axrun3 axrun4 axrun5 axrun6
  77.  
  78. $frame rockrun1 rockrun2 rockrun3 rockrun4 rockrun5 rockrun6
  79.  
  80. //
  81. // standing
  82. //
  83. $frame stand1 stand2 stand3 stand4 stand5
  84.  
  85. $frame axstnd1 axstnd2 axstnd3 axstnd4 axstnd5 axstnd6
  86. $frame axstnd7 axstnd8 axstnd9 axstnd10 axstnd11 axstnd12
  87.  
  88.  
  89. //
  90. // pain
  91. //
  92. $frame axpain1 axpain2 axpain3 axpain4 axpain5 axpain6
  93.  
  94. $frame pain1 pain2 pain3 pain4 pain5 pain6
  95.  
  96.  
  97. //
  98. // death
  99. //
  100.  
  101. $frame axdeth1 axdeth2 axdeth3 axdeth4 axdeth5 axdeth6
  102. $frame axdeth7 axdeth8 axdeth9
  103.  
  104. $frame deatha1 deatha2 deatha3 deatha4 deatha5 deatha6 deatha7 deatha8
  105. $frame deatha9 deatha10 deatha11
  106.  
  107. $frame deathb1 deathb2 deathb3 deathb4 deathb5 deathb6 deathb7 deathb8
  108. $frame deathb9
  109.  
  110. $frame deathc1 deathc2 deathc3 deathc4 deathc5 deathc6 deathc7 deathc8
  111. $frame deathc9 deathc10 deathc11 deathc12 deathc13 deathc14 deathc15
  112.  
  113. $frame deathd1 deathd2 deathd3 deathd4 deathd5 deathd6 deathd7
  114. $frame deathd8 deathd9
  115.  
  116. $frame deathe1 deathe2 deathe3 deathe4 deathe5 deathe6 deathe7
  117. $frame deathe8 deathe9
  118.  
  119. //
  120. // attacks
  121. //
  122. $frame nailatt1 nailatt2
  123.  
  124. $frame light1 light2
  125.  
  126. $frame rockatt1 rockatt2 rockatt3 rockatt4 rockatt5 rockatt6
  127.  
  128. $frame shotatt1 shotatt2 shotatt3 shotatt4 shotatt5 shotatt6
  129.  
  130. $frame axatt1 axatt2 axatt3 axatt4 axatt5 axatt6
  131.  
  132. $frame axattb1 axattb2 axattb3 axattb4 axattb5 axattb6
  133.  
  134. $frame axattc1 axattc2 axattc3 axattc4 axattc5 axattc6
  135.  
  136. $frame axattd1 axattd2 axattd3 axattd4 axattd5 axattd6
  137.  
  138.  
  139. /*
  140. ==============================================================================
  141. PLAYER
  142. ==============================================================================
  143. */
  144.  
  145. void() player_run;
  146.  
  147. void()    player_stand1 =[    $axstnd1,    player_stand1    ]
  148. {
  149.     self.weaponframe=0;
  150.     if (self.velocity_x || self.velocity_y)
  151.     {
  152.         self.walkframe=0;
  153.         player_run();
  154.         return;
  155.     }
  156.  
  157.     if (self.weapon == IT_AXE)
  158.     {
  159.         if (self.walkframe >= 12)
  160.             self.walkframe = 0;
  161.         self.frame = $axstnd1 + self.walkframe;
  162.     }
  163.     else
  164.     {
  165.         if (self.walkframe >= 5)
  166.             self.walkframe = 0;
  167.         self.frame = $stand1 + self.walkframe;
  168.     }
  169.     self.walkframe = self.walkframe + 1;    
  170. };
  171.  
  172. void()    player_run =[    $rockrun1,    player_run    ]
  173. {
  174.     self.weaponframe=0;
  175.     if (!self.velocity_x && !self.velocity_y)
  176.     {
  177.         self.walkframe=0;
  178.         player_stand1();
  179.         return;
  180.     }
  181.  
  182.     if (self.weapon == IT_AXE)
  183.     {
  184.         if (self.walkframe == 6)
  185.             self.walkframe = 0;
  186.         self.frame = $axrun1 + self.walkframe;
  187.     }
  188.     else
  189.     {
  190.         if (self.walkframe == 6)
  191.             self.walkframe = 0;
  192.         self.frame = self.frame + self.walkframe;
  193.     }
  194.  
  195.            if (self.walkframe == 1 || self.walkframe == 4 )        //ws...
  196.             {
  197.                     if (checkbottom(self) == TRUE)
  198.                     {
  199.                                 if (self.waterlevel == 0)
  200.                                     sound (self, CHAN_VOICE, "weapons/ax1.wav", 0.5, ATTN_NORM);
  201.                     }
  202.             }                        //...ws
  203.  
  204.     self.walkframe = self.walkframe + 1;
  205. };
  206.  
  207.  
  208. void()    player_shot1 =    [$shotatt1, player_shot2    ] {self.weaponframe=1;
  209. self.effects = self.effects | EF_MUZZLEFLASH;};
  210. void()    player_shot2 =    [$shotatt2, player_shot3    ] {self.weaponframe=2;};
  211. void()    player_shot3 =    [$shotatt3, player_shot4    ] {self.weaponframe=3;};
  212. void()    player_shot4 =    [$shotatt4, player_shot5    ] {self.weaponframe=4;};
  213. void()    player_shot5 =    [$shotatt5, player_shot6    ] {self.weaponframe=5;};
  214. void()    player_shot6 =    [$shotatt6, player_run    ] {self.weaponframe=6;};
  215.  
  216. void()    player_axe1 =    [$axatt1, player_axe2    ] {self.weaponframe=1;};
  217. void()    player_axe2 =    [$axatt2, player_axe3    ] {self.weaponframe=2;};
  218. void()    player_axe3 =    [$axatt3, player_axe4    ] {self.weaponframe=3;W_FireAxe();};
  219. void()    player_axe4 =    [$axatt4, player_run    ] {self.weaponframe=4;};
  220.  
  221. void()    player_axeb1 =    [$axattb1, player_axeb2    ] {self.weaponframe=5;};
  222. void()    player_axeb2 =    [$axattb2, player_axeb3    ] {self.weaponframe=6;};
  223. void()    player_axeb3 =    [$axattb3, player_axeb4    ] {self.weaponframe=7;W_FireAxe();};
  224. void()    player_axeb4 =    [$axattb4, player_run    ] {self.weaponframe=8;};
  225.  
  226. void()    player_axec1 =    [$axattc1, player_axec2    ] {self.weaponframe=1;};
  227. void()    player_axec2 =    [$axattc2, player_axec3    ] {self.weaponframe=2;};
  228. void()    player_axec3 =    [$axattc3, player_axec4    ] {self.weaponframe=3;W_FireAxe();};
  229. void()    player_axec4 =    [$axattc4, player_run    ] {self.weaponframe=4;};
  230.  
  231. void()    player_axed1 =    [$axattd1, player_axed2    ] {self.weaponframe=5;};
  232. void()    player_axed2 =    [$axattd2, player_axed3    ] {self.weaponframe=6;};
  233. void()    player_axed3 =    [$axattd3, player_axed4    ] {self.weaponframe=7;W_FireAxe();};
  234. void()    player_axed4 =    [$axattd4, player_run    ] {self.weaponframe=8;};
  235.  
  236.  
  237. //============================================================================
  238.  
  239. void() player_nail1   =[$nailatt1, player_nail2  ] 
  240. {
  241.     self.effects = self.effects | EF_MUZZLEFLASH;
  242.  
  243.     if (!self.button0)
  244.         {player_run ();return;}
  245.     self.weaponframe = self.weaponframe + 1;
  246.     if (self.weaponframe == 9)
  247.         self.weaponframe = 1;
  248.     SuperDamageSound();
  249.     W_FireSpikes (4);
  250.     self.attack_finished = time + 0.2;
  251. };
  252. void() player_nail2   =[$nailatt2, player_nail1  ]
  253. {
  254.     self.effects = self.effects | EF_MUZZLEFLASH;
  255.  
  256.     if (!self.button0)
  257.         {player_run ();return;}
  258.     self.weaponframe = self.weaponframe + 1;
  259.     if (self.weaponframe == 9)
  260.         self.weaponframe = 1;
  261.     SuperDamageSound();
  262.     W_FireSpikes (-4);
  263.     self.attack_finished = time + 0.2;
  264. };
  265.  
  266. //============================================================================
  267.  
  268. void() player_light1   =[$light1, player_light2  ] 
  269. {
  270.     self.effects = self.effects | EF_MUZZLEFLASH;
  271.  
  272.     if (!self.button0)
  273.         {player_run ();return;}
  274.     self.weaponframe = self.weaponframe + 1;
  275.     if (self.weaponframe == 5)
  276.         self.weaponframe = 1;
  277.     SuperDamageSound();
  278.     W_FireLightning();
  279.     self.attack_finished = time + 0.5;
  280. };
  281. void() player_light2   =[$light2, player_light1  ]
  282. {
  283.     self.effects = self.effects | EF_MUZZLEFLASH;
  284.  
  285.     if (!self.button0)
  286.         {player_run ();return;}
  287.     self.weaponframe = self.weaponframe + 1;
  288.     if (self.weaponframe == 5)
  289.         self.weaponframe = 1;
  290.     SuperDamageSound();
  291.     W_FireLightning();
  292.     self.attack_finished = time + 0.2;
  293. };
  294.  
  295. //============================================================================
  296.  
  297.  
  298. void() player_rocket1   =[$rockatt1, player_rocket2  ] {self.weaponframe=1;
  299. self.effects = self.effects | EF_MUZZLEFLASH;};
  300. void() player_rocket2   =[$rockatt2, player_rocket3  ] {self.weaponframe=2;};
  301. void() player_rocket3   =[$rockatt3, player_rocket4  ] {self.weaponframe=3;};
  302. void() player_rocket4   =[$rockatt4, player_rocket5  ] {self.weaponframe=4;};
  303. void() player_rocket5   =[$rockatt5, player_rocket6  ] {self.weaponframe=5;};
  304. void() player_rocket6   =[$rockatt6, player_run  ] {self.weaponframe=6;};
  305. void(float num_bubbles) DeathBubbles;
  306.  
  307. void() PainSound =
  308. {
  309. local float        rs;
  310.  
  311.     if (self.health < 0)
  312.         return;
  313.  
  314.     if (damage_attacker.classname == "teledeath")
  315.     {
  316.         sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
  317.         return;
  318.     }
  319.  
  320. // water pain sounds
  321.     if (self.watertype == CONTENT_WATER && self.waterlevel == 3)
  322.     {
  323.         DeathBubbles(1);
  324.         if (random() > 0.5)
  325.             sound (self, CHAN_VOICE, "player/drown1.wav", 1, ATTN_NORM);
  326.         else
  327.             sound (self, CHAN_VOICE, "player/drown2.wav", 1, ATTN_NORM);
  328.         return;
  329.     }
  330.  
  331. // slime pain sounds
  332.     if (self.watertype == CONTENT_SLIME)
  333.     {
  334. // FIX ME    put in some steam here
  335.         if (random() > 0.5)
  336.             sound (self, CHAN_VOICE, "player/lburn1.wav", 1, ATTN_NORM);
  337.         else
  338.             sound (self, CHAN_VOICE, "player/lburn2.wav", 1, ATTN_NORM);
  339.         return;
  340.     }
  341.  
  342.     if (self.watertype == CONTENT_LAVA)
  343.     {
  344.         if (random() > 0.5)
  345.             sound (self, CHAN_VOICE, "player/lburn1.wav", 1, ATTN_NORM);
  346.         else
  347.             sound (self, CHAN_VOICE, "player/lburn2.wav", 1, ATTN_NORM);
  348.         return;
  349.     }
  350.  
  351.     if (self.pain_finished > time)
  352.     {
  353.         self.axhitme = 0;
  354.         return;
  355.     }
  356.     self.pain_finished = time + 0.5;
  357.  
  358. // don't make multiple pain sounds right after each other
  359.  
  360. // ax pain sound
  361.     if (self.axhitme == 1)
  362.     {
  363.         self.axhitme = 0;
  364.         sound (self, CHAN_VOICE, "player/axhit1.wav", 1, ATTN_NORM);
  365.         return;
  366.     }
  367.     
  368.  
  369.     rs = rint((random() * 5) + 1);
  370.  
  371.     self.noise = "";
  372.     if (rs == 1)
  373.         self.noise = "player/pain1.wav";
  374.     else if (rs == 2)
  375.         self.noise = "player/pain2.wav";
  376.     else if (rs == 3)
  377.         self.noise = "player/pain3.wav";
  378.     else if (rs == 4)
  379.         self.noise = "player/pain4.wav";
  380.     else if (rs == 5)
  381.         self.noise = "player/pain5.wav";
  382.     else
  383.         self.noise = "player/pain6.wav";
  384.  
  385.     sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
  386.     return;
  387. };
  388.  
  389. void()    player_pain1 =    [    $pain1,    player_pain2    ] {PainSound();self.weaponframe=0;};
  390. void()    player_pain2 =    [    $pain2,    player_pain3    ] {};
  391. void()    player_pain3 =    [    $pain3,    player_pain4    ] {};
  392. void()    player_pain4 =    [    $pain4,    player_pain5    ] {};
  393. void()    player_pain5 =    [    $pain5,    player_pain6    ] {};
  394. void()    player_pain6 =    [    $pain6,    player_run    ] {};
  395.  
  396. void()    player_axpain1 =    [    $axpain1,    player_axpain2    ] {PainSound();self.weaponframe=0;};
  397. void()    player_axpain2 =    [    $axpain2,    player_axpain3    ] {};
  398. void()    player_axpain3 =    [    $axpain3,    player_axpain4    ] {};
  399. void()    player_axpain4 =    [    $axpain4,    player_axpain5    ] {};
  400. void()    player_axpain5 =    [    $axpain5,    player_axpain6    ] {};
  401. void()    player_axpain6 =    [    $axpain6,    player_run    ] {};
  402.  
  403. void(entity attacker, float take) player_pain =
  404. {
  405.     local entity list, previous, onefriend;
  406.     local entity oldself;
  407.  
  408.     list=self.friendlist;
  409.     previous=world;
  410.     while(list) {
  411.         onefriend=list.listitem;
  412.         if(onefriend.friend!=self||onefriend.health <=0) {
  413.             if(onefriend.health <= 0) {
  414.                 if(previous) {
  415.                     previous.chain=list.chain;
  416.                     remove(list);
  417.                     list=previous.chain;
  418.                 } else {
  419.                     self.friendlist=list.chain;
  420.                     remove(list);
  421.                     list=self.friendlist;
  422.                 }
  423.             }
  424.         } else {
  425.             if(onefriend.enemy==onefriend.friend) {
  426.                 onefriend.enemy=attacker;
  427.                 oldself=self;
  428.                 self=onefriend;
  429.                 FoundTarget();
  430.                 self=oldself;
  431.             }
  432.             previous=list;
  433.             list=list.chain;
  434.         }
  435.     }
  436.  
  437.     if (self.weaponframe)
  438.         return;
  439.  
  440.     if (self.invisible_finished > time)
  441.         return;        // eyes don't have pain frames
  442.  
  443.     if (self.weapon == IT_AXE)
  444.         player_axpain1 ();
  445.     else
  446.         player_pain1 ();
  447. };
  448.  
  449. void() player_diea1;
  450. void() player_dieb1;
  451. void() player_diec1;
  452. void() player_died1;
  453. void() player_diee1;
  454. void() player_die_ax1;
  455.  
  456. void() DeathBubblesSpawn =
  457. {
  458. local entity    bubble;
  459.     if (self.owner.waterlevel != 3)
  460.         return;
  461.     bubble = spawn();
  462.     setmodel (bubble, "progs/s_bubble.spr");
  463.     setorigin (bubble, self.owner.origin + '0 0 24');
  464.     bubble.movetype = MOVETYPE_NOCLIP;
  465.     bubble.solid = SOLID_NOT;
  466.     bubble.velocity = '0 0 15';
  467.     bubble.nextthink = time + 0.5;
  468.     bubble.think = bubble_bob;
  469.     bubble.classname = "bubble";
  470.     bubble.frame = 0;
  471.     bubble.cnt = 0;
  472.     setsize (bubble, '-8 -8 -8', '8 8 8');
  473.     self.nextthink = time + 0.1;
  474.     self.think = DeathBubblesSpawn;
  475.     self.air_finished = self.air_finished + 1;
  476.     if (self.air_finished >= self.bubble_count)
  477.         remove(self);
  478. };
  479.  
  480. void(float num_bubbles) DeathBubbles =
  481. {
  482. local entity    bubble_spawner;
  483.     
  484.     bubble_spawner = spawn();
  485.     setorigin (bubble_spawner, self.origin);
  486.     bubble_spawner.movetype = MOVETYPE_NONE;
  487.     bubble_spawner.solid = SOLID_NOT;
  488.     bubble_spawner.nextthink = time + 0.1;
  489.     bubble_spawner.think = DeathBubblesSpawn;
  490.     bubble_spawner.air_finished = 0;
  491.     bubble_spawner.owner = self;
  492.     bubble_spawner.bubble_count = num_bubbles;
  493.     return;
  494. };
  495.  
  496.  
  497. void() DeathSound =
  498. {
  499. local float        rs;
  500.  
  501.     // water death sounds
  502.     if (self.waterlevel == 3)
  503.     {
  504.         DeathBubbles(20);
  505.         sound (self, CHAN_VOICE, "player/h2odeath.wav", 1, ATTN_NONE);
  506.         return;
  507.     }
  508.     
  509.     rs = rint ((random() * 4) + 1);
  510.     if (rs == 1)
  511.         self.noise = "player/death1.wav";
  512.     if (rs == 2)
  513.         self.noise = "player/death2.wav";
  514.     if (rs == 3)
  515.         self.noise = "player/death3.wav";
  516.     if (rs == 4)
  517.         self.noise = "player/death4.wav";
  518.     if (rs == 5)
  519.         self.noise = "player/death5.wav";
  520.  
  521.     sound (self, CHAN_VOICE, self.noise, 1, ATTN_NONE);
  522.     return;
  523. };
  524.  
  525. void() PlayerDead =
  526. {
  527.     self.nextthink = -1;
  528. // allow respawn after a certain time
  529.     self.deadflag = DEAD_DEAD;
  530. };
  531.  
  532. vector(float dm) VelocityForDamage =
  533. {
  534.     local vector v;
  535.  
  536.     v_x = 100 * crandom();
  537.     v_y = 100 * crandom();
  538.     v_z = 200 + 100 * random();
  539.  
  540.     if (dm > -50)
  541.     {
  542. //        dprint ("level 1\n");
  543.         v = v * 0.7;
  544.     }
  545.     else if (dm > -200)
  546.     {
  547. //        dprint ("level 3\n");
  548.         v = v * 2;
  549.     }
  550.     else
  551.         v = v * 10;
  552.  
  553.     return v;
  554. };
  555.  
  556. void(string gibname, float dm) ThrowGib =
  557. {
  558.     local    entity new;
  559.  
  560.     new = spawn();
  561.     new.origin = self.origin;
  562.     setmodel (new, gibname);
  563.     setsize (new, '0 0 0', '0 0 0');
  564.     new.velocity = VelocityForDamage (dm);
  565.     new.movetype = MOVETYPE_BOUNCE;
  566.     new.solid = SOLID_NOT;
  567.     new.avelocity_x = random()*600;
  568.     new.avelocity_y = random()*600;
  569.     new.avelocity_z = random()*600;
  570.     new.think = SUB_Remove;
  571.     new.ltime = time;
  572.     new.nextthink = time + 10 + random()*10;
  573.     new.frame = 0;
  574.     new.flags = 0;
  575. };
  576.  
  577. void() HeadDeath =            //ws...
  578. {
  579.   ThrowGib ("progs/gib1.mdl", self.health);
  580.  self.nextthink = time;
  581.  self.think = SUB_Remove;
  582.  self.movetype = MOVETYPE_BOUNCE;
  583.  self.takedamage = DAMAGE_NO;
  584.  self.solid = SOLID_NOT;
  585.  self.th_die = SUB_Null;
  586. };                    //...ws
  587.  
  588. void(string gibname, float dm) ThrowHead =
  589. {
  590.     setmodel (self, gibname);
  591.     self.frame = 0;
  592.     self.nextthink = -1;
  593.     self.movetype = MOVETYPE_BOUNCE;    // ws
  594.     self.takedamage = DAMAGE_AIM;        // ws
  595.     self.solid = SOLID_BBOX;            // ws
  596.     self.view_ofs = '0 0 8';
  597.     setsize (self, '-16 -16 0', '16 16 24');    // 24==56
  598.     self.velocity = VelocityForDamage (dm);
  599.     self.origin_z = self.origin_z - 24;
  600.     self.flags = self.flags - (self.flags & FL_ONGROUND);
  601.     self.avelocity = crandom() * '0 600 0';
  602.     self.health = 1;                //ws
  603.     self.th_die = HeadDeath;            //ws
  604. };
  605.  
  606. void() GibPlayer =
  607. {
  608.     ThrowHead ("progs/h_player.mdl", self.health);
  609.     ThrowGib ("progs/gib1.mdl", self.health);
  610.     ThrowGib ("progs/gib2.mdl", self.health);
  611.     ThrowGib ("progs/gib3.mdl", self.health);
  612.  
  613.     self.nextthink = -1;        //ws...    
  614. // allow respawn after a certain time
  615.     self.deadflag = DEAD_DEAD;
  616.  
  617.     if (damage_attacker.classname == "teledeath")
  618.     {
  619.         sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
  620.         return;
  621.     }
  622.  
  623.     if (damage_attacker.classname == "teledeath2")
  624.     {
  625.         sound (self, CHAN_VOICE, "player/teledth1.wav", 1, ATTN_NONE);
  626.         return;
  627.     }
  628.         
  629.     if (random() < 0.5)
  630.         sound (self, CHAN_VOICE, "player/gib.wav", 1, ATTN_NONE);
  631.     else
  632.         sound (self, CHAN_VOICE, "player/udeath.wav", 1, ATTN_NONE);
  633. };
  634.  
  635. void() PlayerCorpseGib =
  636. {
  637.     self.takedamage = DAMAGE_YES;     // ws 
  638.     if (self.health < -40)
  639.     {
  640.         self.deadflag = DEAD_DEAD;  // Noting that corpse was already dead.
  641.         GibPlayer();
  642.         self.think = SUB_Null;
  643.     }
  644.     else
  645.         SUB_Gib();
  646. };
  647.  
  648. void() PlayerDie =
  649. {
  650.     local    float    i;
  651.     
  652.     self.items = self.items - (self.items & IT_INVISIBILITY);
  653.     self.invisible_finished = 0;    // don't die as eyes
  654.     self.invincible_finished = 0;
  655.     self.super_damage_finished = 0;
  656.     self.radsuit_finished = 0;
  657.     self.modelindex = modelindex_player;    // don't use eyes
  658.  
  659.     if (deathmatch || coop)
  660.         DropBackpack();
  661.     
  662.     self.weaponmodel="";
  663.     self.view_ofs = '0 0 -8';
  664.     self.deadflag = DEAD_DYING;
  665. //ws    self.solid = SOLID_NOT;
  666.     self.flags = self.flags - (self.flags & FL_ONGROUND);
  667.     self.movetype = MOVETYPE_BOUNCE;    //ws
  668.     if (self.velocity_z < 10)
  669.         self.velocity_z = self.velocity_z + random()*300;
  670.  
  671.     if (self.health < -40)
  672.     {
  673.         GibPlayer ();
  674.         return;
  675.     }
  676.  
  677.     DeathSound();
  678.     
  679.     self.angles_x = 0;
  680.     self.angles_z = 0;
  681.     
  682.     local vector min, max;        //ws...
  683.     
  684.     if (self.weapon == IT_AXE)
  685.     {
  686.         player_die_ax1 ();
  687.         min = '-16 -12 -24';
  688.         max = '16 12 -8';
  689.     }
  690.     else
  691.     {
  692.         i = cvar("temp1");
  693.         if (!i)
  694.             i = 1 + floor(random()*6);
  695.  
  696.         if (i == 1)
  697.         {
  698.             player_diea1();
  699.             min = '-16 -12 -24';
  700.             max = '16 12 -8';
  701.         }
  702.         else if (i == 2)
  703.         {
  704.             player_dieb1();
  705.             min = '-16 -12 -24';
  706.             max = '16 12 6';
  707.         }
  708.         else if (i == 3)
  709.         {
  710.             player_diec1();
  711.             min = '-16 -12 -24';
  712.             max = '16 12 -8';
  713.         }
  714.         else if (i == 4)
  715.         {
  716.             player_died1();
  717.             min = '-16 -12 -24';
  718.             max = '16 12 -8';
  719.         }
  720.         else
  721.         {
  722.             player_diee1();
  723.             min = '-16 -12 -24';
  724.             max = '16 12 -8';
  725.         }
  726.     }
  727.  
  728.     if (deathmatch || coop)
  729.     {
  730.         self.health = -1;
  731.         self.mins = min;
  732.         self.maxs = max;
  733.         self.size = max - min;
  734.         self.solid = SOLID_SLIDEBOX;
  735.         self.th_stand = SUB_Null;
  736.         self.th_walk = SUB_Null;
  737.         self.th_run = SUB_Null;
  738.         self.th_pain = PlayerCorpseGib;
  739.         self.th_die = PlayerCorpseGib;
  740.         self.th_melee = SUB_Null;
  741.         self.th_missile = SUB_Null;
  742.         self.takedamage= DAMAGE_YES; // ws
  743.     }            //...ws
  744. };
  745.  
  746. void() set_suicide_frame =
  747. {    // used by klill command and diconnect command
  748.     if (self.model != "progs/player.mdl")
  749.         return;    // allready gibbed
  750.     self.frame = $deatha11;
  751.     self.solid = SOLID_NOT;
  752.     self.movetype = MOVETYPE_TOSS;
  753.     self.deadflag = DEAD_DEAD;
  754.     self.nextthink = -1;
  755. };
  756.  
  757. void(entity e) player_addfriend =        //ws...
  758. {    local entity newfle;
  759.     newfle=spawn();
  760.     newfle.chain=self.friendlist;
  761.     newfle.listitem=e;
  762.     self.friendlist=newfle;
  763. };                    //ws...
  764.  
  765. void()    player_diea1    =    [    $deatha1,    player_diea2    ] {};
  766. void()    player_diea2    =    [    $deatha2,    player_diea3    ] {};
  767. void()    player_diea3    =    [    $deatha3,    player_diea4    ] {};
  768. void()    player_diea4    =    [    $deatha4,    player_diea5    ] {};
  769. void()    player_diea5    =    [    $deatha5,    player_diea6    ] {};
  770. void()    player_diea6    =    [    $deatha6,    player_diea7    ] {};
  771. void()    player_diea7    =    [    $deatha7,    player_diea8    ] {};
  772. void()    player_diea8    =    [    $deatha8,    player_diea9    ] {};
  773. void()    player_diea9    =    [    $deatha9,    player_diea10    ] {};
  774. void()    player_diea10    =    [    $deatha10,    player_diea11    ] {};
  775. void()    player_diea11    =    [    $deatha11,    player_diea11     ] {PlayerDead();};
  776.  
  777. void()    player_dieb1    =    [    $deathb1,    player_dieb2    ] {};
  778. void()    player_dieb2    =    [    $deathb2,    player_dieb3    ] {};
  779. void()    player_dieb3    =    [    $deathb3,    player_dieb4    ] {};
  780. void()    player_dieb4    =    [    $deathb4,    player_dieb5    ] {};
  781. void()    player_dieb5    =    [    $deathb5,    player_dieb6    ] {};
  782. void()    player_dieb6    =    [    $deathb6,    player_dieb7    ] {};
  783. void()    player_dieb7    =    [    $deathb7,    player_dieb8    ] {};
  784. void()    player_dieb8    =    [    $deathb8,    player_dieb9    ] {};
  785. void()    player_dieb9    =    [    $deathb9,    player_dieb9    ] {PlayerDead();};
  786.  
  787. void()    player_diec1    =    [    $deathc1,    player_diec2    ] {};
  788. void()    player_diec2    =    [    $deathc2,    player_diec3    ] {};
  789. void()    player_diec3    =    [    $deathc3,    player_diec4    ] {};
  790. void()    player_diec4    =    [    $deathc4,    player_diec5    ] {};
  791. void()    player_diec5    =    [    $deathc5,    player_diec6    ] {};
  792. void()    player_diec6    =    [    $deathc6,    player_diec7    ] {};
  793. void()    player_diec7    =    [    $deathc7,    player_diec8    ] {};
  794. void()    player_diec8    =    [    $deathc8,    player_diec9    ] {};
  795. void()    player_diec9    =    [    $deathc9,    player_diec10    ] {};
  796. void()    player_diec10    =    [    $deathc10,    player_diec11    ] {};
  797. void()    player_diec11    =    [    $deathc11,    player_diec12    ] {};
  798. void()    player_diec12    =    [    $deathc12,    player_diec13    ] {};
  799. void()    player_diec13    =    [    $deathc13,    player_diec14    ] {};
  800. void()    player_diec14    =    [    $deathc14,    player_diec15    ] {};
  801. void()    player_diec15    =    [    $deathc15,    player_diec15     ] {PlayerDead();};
  802.  
  803. void()    player_died1    =    [    $deathd1,    player_died2    ] {};
  804. void()    player_died2    =    [    $deathd2,    player_died3    ] {};
  805. void()    player_died3    =    [    $deathd3,    player_died4    ] {};
  806. void()    player_died4    =    [    $deathd4,    player_died5    ] {};
  807. void()    player_died5    =    [    $deathd5,    player_died6    ] {};
  808. void()    player_died6    =    [    $deathd6,    player_died7    ] {};
  809. void()    player_died7    =    [    $deathd7,    player_died8    ] {};
  810. void()    player_died8    =    [    $deathd8,    player_died9    ] {};
  811. void()    player_died9    =    [    $deathd9,    player_died9    ] {PlayerDead();};
  812.  
  813. void()    player_diee1    =    [    $deathe1,    player_diee2    ] {};
  814. void()    player_diee2    =    [    $deathe2,    player_diee3    ] {};
  815. void()    player_diee3    =    [    $deathe3,    player_diee4    ] {};
  816. void()    player_diee4    =    [    $deathe4,    player_diee5    ] {};
  817. void()    player_diee5    =    [    $deathe5,    player_diee6    ] {};
  818. void()    player_diee6    =    [    $deathe6,    player_diee7    ] {};
  819. void()    player_diee7    =    [    $deathe7,    player_diee8    ] {};
  820. void()    player_diee8    =    [    $deathe8,    player_diee9    ] {};
  821. void()    player_diee9    =    [    $deathe9,    player_diee9    ] {PlayerDead();};
  822.  
  823. void()    player_die_ax1    =    [    $axdeth1,    player_die_ax2    ] {};
  824. void()    player_die_ax2    =    [    $axdeth2,    player_die_ax3    ] {};
  825. void()    player_die_ax3    =    [    $axdeth3,    player_die_ax4    ] {};
  826. void()    player_die_ax4    =    [    $axdeth4,    player_die_ax5    ] {};
  827. void()    player_die_ax5    =    [    $axdeth5,    player_die_ax6    ] {};
  828. void()    player_die_ax6    =    [    $axdeth6,    player_die_ax7    ] {};
  829. void()    player_die_ax7    =    [    $axdeth7,    player_die_ax8    ] {};
  830. void()    player_die_ax8    =    [    $axdeth8,    player_die_ax9    ] {};
  831. void()    player_die_ax9    =    [    $axdeth9,    player_die_ax9    ] {PlayerDead();};
  832.