home *** CD-ROM | disk | FTP | other *** search
/ Quake 'em / QUAKEEM.BIN / quake / programs / qwiz12 / magicm.qc < prev    next >
Encoding:
Text File  |  1996-08-16  |  5.6 KB  |  225 lines

  1. /*
  2.  
  3. ==============================================================================
  4.  
  5. MAGIC MISSLE
  6.  
  7. ==============================================================================
  8.  
  9. */
  10.  
  11.  
  12. /*
  13. ================
  14. HomeFindTarget by Vhold
  15. returns the closest entity to itself that is killable, not a team member on 
  16. self's team, ect ect....
  17. ================
  18. */
  19. entity() HomeFindTarget =
  20. {
  21.         local entity head, selected;
  22.         local float dist;
  23.         dist = 100000;
  24.         selected = world;
  25.         head = findradius(self.origin, 100000);
  26.         while(head)
  27.         {
  28.           if( (head.health > 1) && (head != self) && (head != self.owner) && !( (teamplay == 1) && (head.team > 0)&&(head.team == self.owner.team) ) && (head.classname != "door") && (head.classname != "misc_explobox") && !(head.items & IT_INVISIBILITY) )
  29.              {
  30.  
  31.                         traceline(self.origin,head.origin,TRUE,self);
  32.                         if ( (trace_fraction >= 1) && (vlen(head.origin - self.origin) < dist) )
  33.                         {
  34.                                 selected = head;
  35.                                 dist = vlen(head.origin - self.origin);
  36.                         }
  37.                 }
  38.                 head = head.chain;
  39.         }
  40.  
  41. /*
  42.         if (selected != world)   // All of this is stuff you can comment out
  43.         {
  44.                 sprint (self.owner,"Homing->");
  45.                 if (selected.classname == "player")
  46.                 {
  47.                         sprint (self.owner,selected.netname);
  48.                         sprint (selected,self.owner.netname);
  49.                         sprint (selected," has a bogey on you!\n");
  50.                 }
  51.                 else
  52.                         sprint (self.owner,selected.classname);
  53.                 sprint (self.owner,"\n");
  54.         }
  55. */
  56.  
  57.         return selected;
  58. };
  59. /* 
  60. ===============
  61. HomeThink by Vhold
  62. The Think function for the Homing Missile
  63. ===============
  64. */
  65. void() HomeThink =
  66. {
  67.         local vector needdir, currdir;
  68.     local float needspeed, maxspeed, acceleration;
  69.     local vector temp;
  70.  
  71.     traceline(self.origin,self.enemy.origin,TRUE,self);
  72.  
  73.         if ( (trace_fraction < 1) || !(self.enemy) || (self.enemy == world) || (self.enemy.health < 1) )
  74.                 self.enemy = HomeFindTarget();
  75.  
  76.         if (self.enemy != world) // Arr.. don't be taken on da World!
  77.         {
  78.         temp = normalize(self.velocity) * 100;
  79.         traceline(self.origin,self.origin+temp,TRUE,self);
  80.         if(trace_fraction < 1)
  81.         {
  82.             maxspeed = 200;
  83.             acceleration = 300;
  84.         }
  85.         else
  86.         {
  87.             maxspeed = 400;
  88.             acceleration = 150;
  89.         }
  90.                 needdir = normalize((self.enemy.origin + '0 0 10') - self.origin);
  91.                 currdir = normalize(self.velocity);
  92.                 self.angles = vectoangles(needdir);
  93.  
  94.                 needspeed = vlen(needdir - currdir) * acceleration;
  95.  
  96.                 self.movedir = needdir * needspeed;
  97.                 self.velocity = self.velocity + self.movedir;
  98.  
  99.                 if ( vlen(self.velocity) > maxspeed )
  100.                         self.velocity = normalize(self.velocity) * maxspeed;
  101.         self.nextthink = time + 0.1;
  102.  
  103.         }
  104.     else
  105.             self.nextthink = time + 0.5;
  106.         
  107.     self.think=HomeThink;
  108. };
  109.  
  110.  
  111.  
  112.  
  113. //--------------------------------------------------------------------
  114. // Fire Magic Missile
  115. //--------------------------------------------------------------------
  116. void() magicm_touch; 
  117.  
  118. void (vector org, vector dir) launch_magicm =
  119. {
  120.     local   entity  missile;
  121.  
  122.     missile = spawn ();
  123.     missile.owner = self;
  124.     missile.movetype = MOVETYPE_FLYMISSILE;
  125.     missile.solid = SOLID_BBOX;
  126.  
  127.     missile.angles = vectoangles(dir);
  128.  
  129.     missile.touch = magicm_touch;
  130.         missile.classname = "magicm";
  131.  
  132. // set missile duration
  133.     missile.nextthink = time + 0.5;
  134.     missile.think = HomeThink;
  135.     missile.enemy = world;
  136.  
  137. // set missile speed    
  138.     makevectors (self.v_angle);
  139.     missile.velocity = aim(self, 1000);
  140.     missile.velocity = missile.velocity * 400;
  141.     missile.angles = vectoangles(missile.velocity);
  142.  
  143.     setsize (missile, '0 0 0', '0 0 0');        
  144.     setmodel (missile, "progs/w_spike.mdl");
  145.     setorigin (missile, org);
  146.         missile.effects=EF_DIMLIGHT;
  147. };
  148.  
  149.  
  150.  
  151.  
  152. void() magicm_touch =
  153. {
  154. local float rand;
  155.  
  156.       sound (self, CHAN_WEAPON, "enforcer/enfstop.wav", 1, ATTN_NORM);
  157.  
  158.     if (other == self.owner)
  159.         return;
  160.  
  161.     if (other.solid == SOLID_TRIGGER)
  162.         return; // trigger field, do nothing
  163.  
  164.     if (pointcontents(self.origin) == CONTENT_SKY)
  165.     {
  166.         remove(self);
  167.         return;
  168.     }
  169.     
  170. // hit something that bleeds
  171.     if (other.takedamage)
  172.     {
  173. //        spawn_touchblood (9);
  174.         T_Damage (other, self, self.owner, 5);
  175.     }
  176.     else
  177.     {
  178.         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  179.             WriteByte (MSG_BROADCAST, TE_SPIKE);
  180.         WriteCoord (MSG_BROADCAST, self.origin_x);
  181.         WriteCoord (MSG_BROADCAST, self.origin_y);
  182.         WriteCoord (MSG_BROADCAST, self.origin_z);
  183.     }
  184.  
  185.     remove(self);
  186. };
  187.  
  188.  
  189.  
  190.  
  191. void(float ox) W_FireMagicm =
  192. {
  193.     local vector    dir;
  194.     local entity    old;
  195.     
  196.     makevectors (self.v_angle);
  197.  
  198.     self.attack_finished = time + 0.5;
  199.     dir = aim (self, 1000);
  200.         launch_magicm (self.origin + '0 0 20' + v_right*ox, dir);
  201.  
  202.     self.punchangle_x = -2;
  203. };
  204.  
  205.  
  206.  
  207.  
  208. //--------------------------------------------------------------------
  209. // Checks if Magic Missile can be fired
  210. //--------------------------------------------------------------------
  211. void() MagicmC = 
  212. {
  213.  
  214.     if (self.ammo_cells < 10)
  215.     {
  216.         sprint(self,"cells are low\n");
  217.         return;
  218.     }
  219.       self.currentammo = self.ammo_cells = self.ammo_cells - 10;
  220.     W_SetCurrentAmmo();
  221.  
  222.     sound (self, CHAN_WEAPON, "shalrath/attack2.wav", 1, ATTN_NORM);
  223.     W_FireMagicm ();
  224. };
  225.