home *** CD-ROM | disk | FTP | other *** search
/ Qu-ake / Qu-ake.iso / qu_ke / monster / 005 / CHAIN.QC < prev    next >
Encoding:
Text File  |  1996-11-26  |  8.5 KB  |  277 lines

  1. /*
  2.  
  3. hook.dest = Last Origin of Owner
  4. hook.style = Current chain sound
  5.  
  6. */
  7.  
  8.  
  9. /************\
  10. * BreakChain *
  11. \************/
  12.  
  13. void (entity Head) BreakChain =
  14. {
  15.         local entity link;
  16.  
  17.         link = Head.goalentity;
  18.         while (link != world)
  19.         {
  20.                 Head = link.goalentity;
  21.                 remove (link);
  22.                 link = Head;
  23.         }
  24. };
  25.  
  26. /*********\
  27. * LinkPos *
  28. \*********/
  29.  
  30. void () LinkPos =
  31. {
  32.         makevectors (self.enemy.angles);
  33.         setorigin (self, self.owner.origin + ( ( ( self.enemy.origin + 
  34.                 (v_up * 20 * (!self.enemy.button2)) + (v_forward * 16) ) - self.owner.origin ) *
  35.                 ( self.weapon ) ) );
  36.         self.nextthink = time + 0.01;
  37. };
  38.  
  39. /***********\
  40. * MakeChain *
  41. \***********/
  42.  
  43. entity (entity head, entity tail, float num) MakeChain =
  44. {
  45.         local entity link, prevlink;
  46.         local float linknum;
  47.  
  48.         linknum = num;
  49.         num = num + 1;
  50.         prevlink = world;
  51.         while (linknum > 0)
  52.         {
  53.                 link = spawn();
  54.  
  55.                 link.goalentity = prevlink;
  56.                 prevlink = link;
  57.  
  58.                 link.owner = head;
  59.                 link.enemy = tail;
  60.                 link.weapon = linknum / num;
  61.                 link.movetype = MOVETYPE_NOCLIP;
  62.                 link.solid = SOLID_NOT;
  63.                 link.angles_z = 51 * linknum;
  64.                 link.angles_y = 41 * linknum;
  65.                 link.angles_x = 31 * linknum;
  66.                 link.avelocity = '310 410 510';
  67.                 setmodel (link, "progs/bit.mdl");
  68.                 setsize (link, '0 0 0', '0 0 0');
  69.                 makevectors (tail.angles);
  70.                 setorigin (link, head.origin + ( ( ( tail.origin 
  71.                         + (v_up * 20 * (!tail.button2)) + ( v_forward * 16 ) ) - head.origin )
  72.                         * ( link.weapon ) ) );
  73.                 link.nextthink = time + 0.01;
  74.                 link.think = LinkPos;
  75.                 linknum = linknum - 1;
  76.         }
  77.         return link;
  78. };
  79.  
  80.  
  81. /************\
  82. * HookVanish *
  83. \************/
  84.  
  85. void () HookVanish =
  86. {
  87.         self.owner.hook_out = FALSE;
  88.         if (self.enemy.classname == "player")
  89.                 self.enemy.attack_finished = time + 0.1;
  90.         sound (self.owner, CHAN_WEAPON, "weapons/bounce2.wav", 1, ATTN_NORM);
  91.         BreakChain (self);
  92.         remove (self);
  93. };
  94.  
  95. /**********\
  96. * HookPull *
  97. \**********/
  98.  
  99. void () HookPull =
  100. {
  101.         local vector vel, spray;
  102.         local float v, dorg;
  103.  
  104.         if ((!self.owner.button0 && (self.owner.weapon == IT_MORNINGSTAR)) ||
  105.                 (self.owner.teleport_time > time ) || self.owner.deadflag )
  106.         {
  107.                 if (self.enemy.takedamage && (self.weapon > 0))
  108.                 {       self.enemy.nextthink = time + 0.1; }
  109.                 HookVanish();
  110.                 return;
  111.         }
  112.         else
  113.         {
  114.                 makevectors (self.owner.angles);
  115.                 vel = self.origin - ( self.owner.origin + (v_up * 20 *
  116.                         ((1.25 * (!self.owner.button2)) - 0.25)) + (v_forward
  117.                         * 16));
  118.                 v = vlen (vel);
  119.                 if (v <= 100)
  120.                         vel = normalize(vel) * v * 10;  
  121.                 else
  122.                         vel = normalize(vel) * 1000;
  123.                 dorg = vlen (self.owner.origin - self.dest);
  124.                 if ( ( dorg > 10 ) && (self.style == 3) )
  125.                 {
  126.                         sound (self.owner, CHAN_WEAPON, "weapons/chain2.wav", 1, ATTN_NORM);
  127.                         self.style = 2;
  128.                 }
  129.                 if ( (dorg < 10) && (self.style == 2) )
  130.                 {
  131.                         sound (self.owner, CHAN_WEAPON, "weapons/chain3.wav", 1, ATTN_NORM);
  132.                         self.style = 3;
  133.                 }
  134.                 self.owner.velocity = vel;
  135.                 self.dest = self.owner.origin;
  136.                 if (self.enemy.takedamage)
  137.                 {
  138.                         sound (self, CHAN_WEAPON, "blob/land1.wav", 1, ATTN_NORM);
  139.                         T_Damage (self.enemy, self, self.owner, 1);
  140.                         makevectors (self.v_angle);
  141.                         spray_x = 100 * crandom();
  142.                         spray_y = 100 * crandom();
  143.                         spray_z = 100 * crandom() + 50;
  144.                         SpawnBlood (self.origin, spray, 20);
  145.                         if (self.weapon > 0)
  146.                         {
  147.                                 self.enemy.nextthink = time + 9999999;
  148.                                 if (self.enemy.classname == "player")
  149.                                         self.enemy.attack_finished = time + 9999999;
  150.                         }
  151.                         if (self.enemy.health <= 0)
  152.                         {
  153.                                 if (self.weapon > 0)
  154.                                         self.enemy.nextthink = time + 0.1;
  155.                         }
  156.                         if (self.enemy.solid == SOLID_SLIDEBOX)
  157.                         {
  158.                                 self.velocity = '0 0 0';
  159.                                 setorigin (self, self.enemy.origin +
  160.                                         self.enemy.mins +
  161.                                         (self.enemy.size * 0.5));
  162.                         }
  163.                         else
  164.                         {
  165.                                 self.velocity = self.enemy.velocity;
  166.                         }
  167.                 }
  168.                 else
  169.                 {
  170.                         self.velocity = self.enemy.velocity;                             
  171.                 }
  172.                 if (self.enemy.solid == SOLID_NOT)
  173.                 {
  174.                         HookVanish();
  175.                         return;
  176.                 }
  177.                 self.nextthink = time + 0.1;
  178.                 self.think = HookPull;
  179.         }
  180. };
  181.  
  182. /**************\
  183. * T_ChainTouch *
  184. \**************/
  185.  
  186. void() T_ChainTouch =
  187. {
  188.         local float rand;
  189.  
  190.         if (other == self.owner)
  191.                 return;         // don't attach to owner
  192.  
  193.     if (pointcontents(self.origin) == CONTENT_SKY)
  194.     {
  195.                 HookVanish();
  196.                 return;
  197.     }
  198.  
  199.         if (other.takedamage)
  200.     {
  201.                 T_Damage (other, self, self.owner, 10 );
  202.                 SpawnBlood (self.origin, self.velocity, 10);
  203.         }
  204.         else
  205.         {
  206.                 self.avelocity = '0 0 0';
  207.         }
  208.                 
  209.       sound (self, CHAN_AUTO, "weapons/bounce.wav", 1, ATTN_NORM);
  210.  
  211.         if (!self.owner.button0)
  212.         {
  213.                 HookVanish();
  214.                 return;
  215.         }
  216.         else
  217.         {
  218.                 if (other.solid == SOLID_SLIDEBOX)
  219.                 {
  220.                         setorigin (self, other.origin + other.mins +
  221.                                 (other.size * 0.5));
  222.                         self.velocity = '0 0 0';
  223.                         rand = random();
  224.                         if (rand <= (vlen(other.origin - self.owner.origin) * 0.001))
  225.                                 sound (self.owner, CHAN_VOICE, "weapons/gotcha.wav",
  226.                                 1, ATTN_STATIC);
  227.                 }
  228.                 else
  229.                 {
  230.                         self.velocity = other.velocity;
  231.                 }
  232.                 self.weapon = other.nextthink - time;
  233.                 sound (self.owner, CHAN_WEAPON, "weapons/chain2.wav", 1, ATTN_NORM);
  234.                 self.style = 2;
  235.                 self.enemy = other;
  236.                 self.think = HookPull;
  237.                 self.nextthink = time + 0.1;
  238.                 self.touch = SUB_Null;
  239.         }
  240. };
  241.  
  242. /*************\
  243. * W_FireChain *
  244. \*************/
  245.  
  246. void() W_FireChain =
  247. {
  248.         local entity hook;
  249.  
  250.         self.hook_out = TRUE;
  251.         hook = spawn ();
  252.         hook.owner = self;
  253.         hook.movetype = MOVETYPE_FLY;
  254.         hook.solid = SOLID_BBOX;
  255.         
  256. // set hook speed 
  257.  
  258.         makevectors (self.v_angle);
  259.         hook.velocity = aim(self, 1000);
  260.         hook.velocity = hook.velocity * 1000;
  261.         hook.angles = vectoangles(hook.velocity);
  262.         hook.avelocity = '0 0 -500';
  263.     
  264.         hook.touch = T_ChainTouch;
  265.     
  266. // set hook sound
  267.         hook.think = HookVanish;
  268.         hook.nextthink = time + 5;
  269.  
  270.         setmodel (hook, "progs/star.mdl");
  271.         setsize (hook, '0 0 0', '0 0 0');     
  272.         setorigin (hook, self.origin + (v_forward*16) + '0 0 20' );
  273.         sound (self, CHAN_WEAPON, "weapons/chain1.wav", 1, ATTN_NORM);
  274.  
  275.         hook.goalentity = MakeChain (hook, self, 8);
  276. };
  277.