home *** CD-ROM | disk | FTP | other *** search
/ Quake 'em / QUAKEEM.BIN / quake / programs / xtrawp19 / bouncer.qc < prev    next >
Encoding:
Text File  |  1996-08-09  |  4.1 KB  |  175 lines

  1. float() crandom;
  2. void() BecomeExplosion;
  3. void(float dmg) spawn_touchblood;
  4.  
  5. float WP_BOUNCER = 2;
  6. float IM_BOUNCER = 71;
  7.  
  8. void() PopperTouch =
  9. {
  10.     PopperExplode();
  11. };
  12.  
  13. void() PopperExplode =
  14. {
  15.     local entity spike;
  16.     local float tmp=0;
  17.     while (tmp<20)
  18.     {
  19.         tmp=tmp+1;
  20.         spike=spawn();
  21.         spike.owner=self.owner;
  22.         spike.movetype=MOVETYPE_FLYMISSILE;
  23.         spike.solid=SOLID_BBOX;
  24.         self.touch=SUB_Null;
  25.         spike.classname="shrapnel";
  26.         spike.think=SUB_Remove;
  27.         spike.nextthink=time+6;
  28.         spike.velocity_x=crandom()*1000;
  29.         spike.velocity_y=crandom()*1000;
  30.         spike.velocity_z=0;
  31.         spike.angles=vectoangles(spike.velocity);
  32.         spike.avelocity='300 300 300';
  33.         spike.touch=ShrapnelTouch;
  34.         setmodel(spike,"progs/spike.mdl");
  35.         setsize(spike,'0 0 0','0 0 0');
  36.         setorigin(spike,self.origin);
  37.     }
  38.     T_RadiusDamage(self,self.owner,120,world);
  39.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  40.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  41.     WriteCoord (MSG_BROADCAST, self.origin_x);
  42.     WriteCoord (MSG_BROADCAST, self.origin_y);
  43.     WriteCoord (MSG_BROADCAST, self.origin_z);
  44.     self.solid=SOLID_NOT;
  45.     BecomeExplosion();
  46. };
  47.  
  48. void() BouncerDud =
  49. {
  50.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  51.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  52.     WriteCoord (MSG_BROADCAST, self.origin_x);
  53.     WriteCoord (MSG_BROADCAST, self.origin_y);
  54.     WriteCoord (MSG_BROADCAST, self.origin_z);
  55.     self.solid=SOLID_NOT;
  56.     BecomeExplosion();
  57. };
  58.  
  59. void() BouncerDie =
  60. {
  61.     self.think=BouncerDud;
  62.     self.nextthink=time+0.1;
  63. };
  64.     
  65. void() BouncerFirstThink =
  66. {
  67.     self.nextthink=time+0.1;
  68.     if (self.velocity == '0 0 0') 
  69.     {
  70.         self.avelocity='0 0 0';
  71.         self.think=BouncerThink;
  72.         self.blasttimer=time+10;
  73.     }
  74. };
  75.         
  76. void() BouncerThink =
  77. {
  78.     local entity head;
  79.     local float expfl;
  80.     head = findradius(self.origin,60);
  81.     self.nextthink=time+0.1;
  82.     while (head)
  83.     {
  84.         if ((head.takedamage)&&(head != self))
  85.             expfl=1;
  86.         head=head.chain;
  87.     }
  88.     if (expfl)
  89.     {
  90.         self.think=BouncerExplode;
  91.         self.nextthink=time+0.1;
  92.     }
  93.     if (self.blasttimer<time)
  94.     {
  95.         self.think=BouncerDud;
  96.         self.nextthink=time+0.1;
  97.     }
  98. };
  99.  
  100. void() BouncerExplode =
  101. {
  102.     local entity popper;
  103.     popper=spawn();
  104.     popper.owner=self.owner;
  105.     popper.movetype=MOVETYPE_BOUNCE;
  106.     popper.solid=SOLID_BBOX;
  107.     popper.classname="popper";
  108.     popper.velocity='0 0 600';
  109.     popper.angles=vectoangles(popper.velocity);
  110.     popper.touch=PopperTouch;
  111.     popper.nextthink=time+0.1;
  112.     popper.think=PopperExplode;
  113.     setmodel(popper,"progs/grenade.mdl");
  114.     setsize(popper,'0 0 0','0 0 0');
  115.     setorigin(popper,self.origin);
  116. //  T_RadiusDamage (self, self.owner, 120, world);  
  117.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  118.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  119.     WriteCoord (MSG_BROADCAST, self.origin_x);
  120.     WriteCoord (MSG_BROADCAST, self.origin_y);
  121.     WriteCoord (MSG_BROADCAST, self.origin_z);
  122.     self.solid=SOLID_NOT;
  123.     BecomeExplosion();
  124. };
  125.  
  126. void() BouncerTouch =
  127. {
  128.     sound(self,CHAN_WEAPON,"weapons/bounce.wav",1,ATTN_NORM);
  129. };
  130.  
  131. void() W_FireBouncer =
  132. {
  133.     local entity bouncer;
  134.     local float tmp;
  135.     // pulls 1 rocket and 30 nails
  136.     if (self.currentammo<1)
  137.     {
  138.         self.weapon=W_BestWeapon();
  139.         self.ef=0;
  140.         W_SetCurrentAmmo();
  141.         return;
  142.     }
  143.     self.ammo_rockets = self.ammo_rockets - 1;
  144.     self.ammo_nails = self.ammo_nails - 20;
  145.     sound(self,CHAN_WEAPON,"weapons/grenade.wav",1,ATTN_NORM);
  146.     tmp=floor(self.ammo_nails/20);
  147.     self.currentammo=min(self.ammo_rockets,tmp);
  148.     bouncer=spawn();
  149.     bouncer.owner=self;
  150.     bouncer.movetype=MOVETYPE_BOUNCE;
  151.     bouncer.solid=SOLID_BBOX;
  152.     bouncer.classname="bouncer";
  153.     makevectors(self.v_angle);
  154.     if (self.v_angle_x)
  155.         bouncer.velocity=v_forward*600+v_up*200+crandom()*v_right*10+crandom()*v_up*10;
  156.     else
  157.     {
  158.         bouncer.velocity=aim(self,10000);
  159.         bouncer.velocity=bouncer.velocity*600;
  160.         bouncer.velocity_z=200;
  161.     }
  162.     bouncer.avelocity='300 300 300';
  163.     bouncer.angles=vectoangles(bouncer.velocity);
  164.     bouncer.touch=BouncerTouch;
  165.     bouncer.think=BouncerFirstThink;
  166.     bouncer.nextthink=time+0.1;
  167.     bouncer.th_die=BouncerDie;
  168.     bouncer.takedamage=DAMAGE_YES;
  169.     bouncer.health=1;
  170.     bouncer.blasttimer=time+30;
  171.     setmodel(bouncer,"progs/grenade.mdl");
  172.     setsize(bouncer,'0 0 0','0 0 0');
  173.     setorigin(bouncer,self.origin);
  174. };
  175.