home *** CD-ROM | disk | FTP | other *** search
/ Quake 'em / QUAKEEM.BIN / quake / programs / sgqcver3 / chain.qc < prev    next >
Encoding:
Text File  |  1996-08-22  |  6.9 KB  |  208 lines

  1. void (entity Head) BreakChain =
  2. {
  3.         local entity link;
  4.  
  5.         link = Head.goalentity;
  6.         while (link != world)
  7.         {
  8.                 Head = link.goalentity;
  9.                 remove (link);
  10.                 link = Head;
  11.         }
  12. };
  13.  
  14. void () LinkPos =
  15. {
  16.         makevectors (self.enemy.angles);
  17.         setorigin (self, self.owner.origin + ( ( ( self.enemy.origin + 
  18.                 (v_up * 16 * (!self.enemy.button2)) + (v_forward * 16) ) - self.owner.origin ) *
  19.                 ( self.weapon ) ) );
  20.         self.nextthink = time + 0.01;
  21. };
  22.  
  23. entity (entity head, entity tail, float num) MakeChain =
  24. {
  25.         local entity link, prevlink;
  26.         local float linknum;
  27.  
  28.         linknum = num;
  29.         num = num + 1;
  30.         prevlink = world;
  31.         while (linknum > 0)
  32.         {
  33.                 link = spawn();
  34.  
  35.                 link.goalentity = prevlink;
  36.                 prevlink = link;
  37.  
  38.                 link.owner = head;
  39.                 link.enemy = tail;
  40.                 link.weapon = linknum / num;
  41.                 link.movetype = MOVETYPE_NOCLIP;
  42.                 link.solid = SOLID_NOT;
  43.                 link.angles_z = 51 * linknum;
  44.                 link.angles_y = 41 * linknum;
  45.                 link.angles_x = 31 * linknum;
  46.                 link.avelocity = '310 410 510';
  47.                 setmodel (link, "progs/bit.mdl");
  48.                 setsize (link, '0 0 0', '0 0 0');
  49.                 makevectors (tail.angles);
  50.                 setorigin (link, head.origin + ( ( ( tail.origin 
  51.                         + (v_up * 16 * (!tail.button2)) + ( v_forward * 16 ) ) - head.origin )
  52.                         * ( link.weapon ) ) );
  53.                 link.nextthink = time + 0.01;
  54.                 link.think = LinkPos;
  55.                 linknum = linknum - 1;
  56.         }
  57.         return link;
  58. };
  59.  
  60. void () HookVanish =
  61. {
  62.         self.owner.hook_out = FALSE;
  63.         if (self.enemy.classname == "player")
  64.                 self.enemy.attack_finished = time + 0.1;
  65.         BreakChain (self);
  66.         remove (self);
  67. };
  68.  
  69. void () HookPull =
  70. {
  71.         local vector vel, spray;
  72.         local float v;
  73.  
  74.         if ((!self.owner.button0 && (self.owner.weapon == IT_MORNINGSTAR)) ||
  75.                 (self.owner.teleport_time > time ) || self.owner.deadflag )
  76.         {
  77.                 if (self.enemy.takedamage && (self.weapon > 0))
  78.                 {       self.enemy.nextthink = time + 0.1; }
  79.                 HookVanish();
  80.                 return;
  81.         }
  82.         else
  83.         {
  84.                 if (self.enemy.takedamage)
  85.                 {
  86.                         sound (self, CHAN_WEAPON, "blob/land1.wav", 1, ATTN_NORM);
  87.                         T_Damage (self.enemy, self, self.owner, 1);
  88.                         makevectors (self.v_angle);
  89.                         spray_x = 100 * crandom();
  90.                         spray_y = 100 * crandom();
  91.                         spray_z = 100 * crandom() + 50;
  92.                         SpawnBlood (self.origin, spray, 20);
  93.                         if (self.weapon > 0)
  94.                         {
  95.                                 self.enemy.nextthink = time + 9999999;
  96.                                 if (self.enemy.classname == "player")
  97.                                         self.enemy.attack_finished = time + 9999999;
  98.                         }
  99.                         if (self.enemy.health <= 0)
  100.                         {
  101.                                 if (self.weapon > 0)
  102.                                         self.enemy.nextthink = time + 0.1;
  103.                         }
  104.                         if (self.enemy.solid == SOLID_SLIDEBOX)
  105.                         {
  106.                                 self.velocity = '0 0 0';
  107.                                 setorigin (self, self.enemy.origin +
  108.                                         self.enemy.mins +
  109.                                         (self.enemy.size * 0.5));
  110.                         }
  111.                         else
  112.                         {
  113.                                 self.velocity = self.enemy.velocity;
  114.                         }
  115.                 }
  116.                 else
  117.                 {
  118.                         self.velocity = self.enemy.velocity;
  119.                 }
  120.                 if (self.enemy.solid == SOLID_NOT)
  121.                 {
  122.                         HookVanish();
  123.                         return;
  124.                 }
  125.                 makevectors (self.owner.angles);
  126.                 vel = self.origin - ( self.owner.origin + (v_up * 16 *
  127.                         (!self.owner.button2)) + (v_forward * 16));
  128.                 v = vlen (vel);
  129.                 if (v <= 100)
  130.                         vel = normalize(vel) * v * 10;  
  131.                 if ( v > 100 )
  132.                         vel = normalize(vel) * 1000;  
  133.                 self.owner.velocity = vel;
  134.                 self.nextthink = time + 0.1;
  135.         }
  136. };
  137.  
  138. void() T_ChainTouch =
  139. {
  140.         if (other == self.owner)
  141.                 return;         // don't attach to owner
  142.  
  143.     if (pointcontents(self.origin) == CONTENT_SKY)
  144.     {
  145.                 HookVanish();
  146.                 return;
  147.     }
  148.  
  149.         if (other.takedamage)
  150.     {
  151.                 T_Damage (other, self, self.owner, 10 );
  152.                 SpawnBlood (self.origin, self.velocity, 10);
  153.         }
  154.         else
  155.         {
  156.                 self.avelocity = '0 0 0';
  157.         }
  158.                 
  159.       sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
  160.  
  161.         if (!self.owner.button0)
  162.         {
  163.                 HookVanish();
  164.                 return;
  165.         }
  166.         else
  167.         {
  168.                 if (other.solid == SOLID_SLIDEBOX)
  169.                 {
  170.                         setorigin (self, other.origin + other.mins +
  171.                                 (other.size * 0.5));
  172.                         self.velocity = '0 0 0';
  173.                 }
  174.                 else
  175.                 {
  176.                         self.velocity = other.velocity;
  177.                 }
  178.                 self.weapon = other.nextthink - time;
  179.                 self.enemy = other;
  180.                 self.nextthink = time + 0.1;
  181.                 self.think = HookPull;
  182.                 self.touch = SUB_Null;
  183.         }
  184. };
  185.  
  186. void() W_FireChain =
  187. {
  188.         local entity hook;
  189.  
  190.         self.hook_out = TRUE;
  191.         hook = spawn ();
  192.         hook.owner = self;
  193.         hook.movetype = MOVETYPE_FLY;
  194.         hook.solid = SOLID_BBOX;
  195.         makevectors (self.v_angle);
  196.         hook.velocity = aim(self, 1000);
  197.         hook.velocity = hook.velocity * 1000;
  198.         hook.angles = vectoangles(hook.velocity);
  199.         hook.avelocity = '0 0 -500';
  200.         hook.touch = T_ChainTouch;
  201.         hook.nextthink = time + 5;
  202.         hook.think = HookVanish;
  203.         setmodel (hook, "progs/star.mdl");
  204.         setsize (hook, '0 0 0', '0 0 0');     
  205.         setorigin (hook, self.origin + (v_forward*16) + '0 0 16' );
  206.         hook.goalentity = MakeChain (hook, self, 8);
  207. };
  208.