home *** CD-ROM | disk | FTP | other *** search
/ Quake 'em / QUAKEEM.BIN / quake / programs / seeker / player.qc < prev    next >
Encoding:
Text File  |  1996-07-29  |  21.6 KB  |  819 lines

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