home *** CD-ROM | disk | FTP | other *** search
/ Ultra Collection Level Ad…e, Duke, Warcraft 2, C&C / ULTRA_Collection_Level_AddOn_-_Quake_Duke.iso / quwaffen / prg7.zip / VWEAPONS.DIF < prev    next >
Text File  |  1996-07-30  |  13KB  |  513 lines

  1. diff -ur --new-file ../default/weapons.qc ./weapons.qc
  2. --- ../default/weapons.qc    Sun Jul 28 19:03:39 1996
  3. +++ ./weapons.qc    Tue Jul 30 17:47:10 1996
  4. @@ -6,6 +6,489 @@
  5.  void(vector org, vector vel, float damage) SpawnBlood;
  6.  void() SuperDamageSound;
  7.  
  8. +/*
  9. +============
  10. +Det some pineapples ****
  11. +============
  12. +*/
  13. +void() GrenadeExplode;
  14. +void() DetGrenades =
  15. +{
  16. +        local entity    head;
  17. +
  18. +        head = findradius (self.origin, 100000);
  19. +        while(head)
  20. +        {
  21. +                if ( ((head.classname == "grenade") || (head.classname == "agrenade")) && (head.owner == self) )
  22. +        {
  23. +                        head.nextthink = time;
  24. +            head.think = GrenadeExplode;
  25. +        }
  26. +                else if ( ((head.classname == "rocket") || (head.classname == "arocket") ) && (head.owner == self) )
  27. +
  28. +                {
  29. +                      head.nextthink = time;
  30. +                      head.think = T_MissileTouch;
  31. +                }
  32. +                head = head.chain;
  33. +        }
  34. +};
  35. +
  36. +/*
  37. +================
  38. +HomeFindTarget by Vhold
  39. +returns the closest entity to itself that is killable, not a team member on 
  40. +self's team, ect ect....
  41. +================
  42. +*/
  43. +entity() HomeFindTarget =
  44. +{
  45. +        local entity head, selected;
  46. +        local float dist;
  47. +        dist = 100000;
  48. +        selected = world;
  49. +        head = findradius(self.origin, 100000);
  50. +        while(head)
  51. +        {
  52. +          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) )
  53. +             {
  54. +
  55. +                        traceline(self.origin,head.origin,TRUE,self);
  56. +                        if ( (trace_fraction >= 1) && (vlen(head.origin - self.origin) < dist) )
  57. +                        {
  58. +                                selected = head;
  59. +                                dist = vlen(head.origin - self.origin);
  60. +                        }
  61. +                }
  62. +                head = head.chain;
  63. +        }
  64. +
  65. +/*
  66. +        if (selected != world)   // All of this is stuff you can comment out
  67. +        {
  68. +                sprint (self.owner,"Homing->");
  69. +                if (selected.classname == "player")
  70. +                {
  71. +                        sprint (self.owner,selected.netname);
  72. +                        sprint (selected,self.owner.netname);
  73. +                        sprint (selected," has a bogey on you!\n");
  74. +                }
  75. +                else
  76. +                        sprint (self.owner,selected.classname);
  77. +                sprint (self.owner,"\n");
  78. +        }
  79. +*/
  80. +
  81. +        return selected;
  82. +};
  83. +/* 
  84. +===============
  85. +HomeThink by Vhold
  86. +The Think function for the Homing Missile
  87. +===============
  88. +*/
  89. +void() HomeThink =
  90. +{
  91. +        local vector needdir, currdir;
  92. +    local float needspeed, maxspeed, acceleration;
  93. +    local vector temp;
  94. +
  95. +    traceline(self.origin,self.enemy.origin,TRUE,self);
  96. +
  97. +        if ( (trace_fraction < 1) || !(self.enemy) || (self.enemy == world) || (self.enemy.health < 1) )
  98. +                self.enemy = HomeFindTarget();
  99. +
  100. +        if (self.enemy != world) // Arr.. don't be taken on da World!
  101. +        {
  102. +        temp = normalize(self.velocity) * 100;
  103. +        traceline(self.origin,self.origin+temp,TRUE,self);
  104. +        if(trace_fraction < 1)
  105. +        {
  106. +            maxspeed = 200;
  107. +            acceleration = 300;
  108. +        }
  109. +        else
  110. +        {
  111. +            maxspeed = 400;
  112. +            acceleration = 150;
  113. +        }
  114. +                needdir = normalize((self.enemy.origin + '0 0 10') - self.origin);
  115. +                currdir = normalize(self.velocity);
  116. +                self.angles = vectoangles(needdir);
  117. +
  118. +                needspeed = vlen(needdir - currdir) * acceleration;
  119. +
  120. +                self.movedir = needdir * needspeed;
  121. +                self.velocity = self.velocity + self.movedir;
  122. +
  123. +                if ( vlen(self.velocity) > maxspeed )
  124. +                        self.velocity = normalize(self.velocity) * maxspeed;
  125. +        self.nextthink = time + 0.1;
  126. +
  127. +        }
  128. +    else
  129. +            self.nextthink = time + 0.5;
  130. +        
  131. +    self.think=HomeThink;
  132. +};
  133. +
  134. +/*
  135. +==============
  136. +FireHomingMissile
  137. +Fires a Vhold brand homing missile
  138. +==============
  139. +*/
  140. +void() FireHomingMissile =
  141. +{
  142. +    local    entity missile, mpuff;
  143. +        
  144. +    if ((self.ammo_rockets < 5) || !(self.items & IT_ROCKET_LAUNCHER) )
  145. +    {
  146. +        sprint(self,"Homing Missile Needs 5 Rockets\n");
  147. +        return;
  148. +    }
  149. +    self.currentammo = self.ammo_rockets = self.ammo_rockets - 5;
  150. +    
  151. +    sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
  152. +
  153. +    self.punchangle_x = -2;
  154. +
  155. +    missile = spawn ();
  156. +    missile.owner = self;
  157. +    missile.movetype = MOVETYPE_FLYMISSILE;
  158. +    missile.solid = SOLID_BBOX;
  159. +    missile.classname = "arocket";
  160. +    missile.health = 1;
  161. +        
  162. +// set missile speed    
  163. +
  164. +    makevectors (self.v_angle);
  165. +    missile.velocity = aim(self, 1000);
  166. +    missile.velocity = missile.velocity * 400;
  167. +    missile.angles = vectoangles(missile.velocity);
  168. +    
  169. +    missile.touch = T_MissileTouch;
  170. +    
  171. +// set missile duration
  172. +    missile.nextthink = time + 0.5;
  173. +    missile.think = HomeThink;
  174. +    missile.enemy = world;
  175. +
  176. +    setmodel (missile, "progs/missile.mdl");
  177. +    setsize (missile, '0 0 0', '0 0 0');        
  178. +    setorigin (missile, self.origin + v_forward*8 + '0 0 16');
  179. +
  180. +    W_SetCurrentAmmo();
  181. +};
  182. +
  183. +/* 
  184. +===============
  185. +ThorThink by Vhold
  186. +The Think function for Thor... very similar to the HomeThink
  187. +===============
  188. +*/
  189. +void(vector p1, vector p2, entity from, float damage) LightningDamage;
  190. +void(vector a, vector b) Bolt;
  191. +
  192. +void() ThorThink =
  193. +{
  194. +    HomeThink();
  195. +
  196. +    Bolt(self.owner.origin,self.origin);
  197. +    LightningDamage (self.origin, trace_endpos + v_forward*4, self, 30);
  198. +
  199. +        self.think=ThorThink;
  200. +};
  201. +
  202. +/*
  203. +================
  204. +FireThor by Vhold.
  205. +================
  206. +*/
  207. +void(float spd, vector ang, float firstthink) SpawnThor; 
  208. +
  209. +void() FireThor =
  210. +{
  211. +    if ((self.ammo_rockets < 20) || (self.ammo_cells < 50))
  212. +    {
  213. +        sprint(self,"Thor demands 20 rockets and 50 cells\n");
  214. +        return;
  215. +    }
  216. +
  217. +    self.currentammo = self.ammo_rockets = self.ammo_rockets - 20;
  218. +    self.currentammo = self.ammo_cells = self.ammo_cells - 50;
  219. +
  220. +    SpawnThor(300,self.v_angle,0.5);
  221. +    SpawnThor(200,self.v_angle + '0 15 0',0.75);
  222. +    SpawnThor(200,self.v_angle - '0 15 0',0.75);
  223. +
  224. +    bprint(self.netname);
  225. +    bprint(" has unleashed Thor!\n");
  226. +
  227. +    W_SetCurrentAmmo();
  228. +};
  229. +
  230. +void(float spd, vector ang, float firstthink) SpawnThor =
  231. +{
  232. +    local    entity missile, mpuff;
  233. +
  234. +    sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
  235. +
  236. +    self.punchangle_x = -2;
  237. +
  238. +    missile = spawn ();
  239. +    missile.owner = self;
  240. +    missile.classname = "arocket";
  241. +    missile.movetype = MOVETYPE_FLYMISSILE;
  242. +    missile.solid = SOLID_BBOX;
  243. +
  244. +        
  245. +// set missile speed    
  246. +
  247. +    missile.v_angle = ang;
  248. +    makevectors(missile.v_angle);
  249. +    missile.velocity = aim(missile,1000);
  250. +    missile.velocity = missile.velocity * spd;
  251. +    missile.angles = vectoangles(missile.velocity);
  252. +    
  253. +    missile.touch = T_MissileTouch;
  254. +    
  255. +// set missile duration
  256. +    missile.nextthink = time + firstthink;
  257. +    missile.think = ThorThink;
  258. +    missile.enemy = world;
  259. +
  260. +    setmodel (missile, "progs/missile.mdl");
  261. +    setsize (missile, '0 0 0', '0 0 0');        
  262. +    makevectors (self.v_angle);
  263. +    setorigin (missile, self.origin + v_forward*8 + '0 0 16');
  264. +};
  265. +
  266. +/*
  267. +==========================
  268. +VholdBackpackTouch
  269. +This simply makes sure you don't pick up your backpack immediately
  270. +after throwing it
  271. +==========================
  272. +*/
  273. +
  274. +void() BackpackTouch;
  275. +
  276. +void() VholdBackpackTouch =
  277. +{
  278. +    if ( (self.owner == other) && ((self.nextthink - time) > 119 )) 
  279. +        return;
  280. +
  281. +    BackpackTouch();        
  282. +};
  283. +
  284. +/*
  285. +=======================
  286. +ThrowBackpack by Vhold
  287. +=======================
  288. +*/
  289. +void() ThrowBackpack =
  290. +{
  291. +        local entity    item;
  292. +
  293. +        if ( (self.ammo_shells + self.ammo_nails + self.ammo_rockets + self.ammo_cells) == 0)
  294. +                return;
  295. +
  296. +        item = spawn();
  297. +
  298. +        if ( self.ammo_shells >= 20)
  299. +        {
  300. +                item.ammo_shells = 20;
  301. +                self.ammo_shells = self.ammo_shells - 20;
  302. +        }
  303. +        else
  304. +        {
  305. +                item.ammo_shells = self.ammo_shells;
  306. +                self.ammo_shells = 0;
  307. +        }
  308. +
  309. +        if ( self.ammo_nails >= 20)
  310. +        {
  311. +                item.ammo_nails = 20;
  312. +                self.ammo_nails = self.ammo_nails - 20;
  313. +        }
  314. +        else
  315. +        {
  316. +                item.ammo_nails = self.ammo_nails;
  317. +                self.ammo_nails = 0;
  318. +        }
  319. +
  320. +        if ( self.ammo_rockets >= 10)
  321. +        {
  322. +                item.ammo_rockets = 10;
  323. +                self.ammo_rockets = self.ammo_rockets - 10;
  324. +        }
  325. +        else
  326. +        {
  327. +                item.ammo_rockets = self.ammo_rockets;
  328. +                self.ammo_rockets = 0;
  329. +        }
  330. +
  331. +        if (self.ammo_cells >= 20)
  332. +        {
  333. +                item.ammo_cells = 20;
  334. +                self.ammo_cells = self.ammo_cells - 20;
  335. +        }
  336. +        else
  337. +        {
  338. +                item.ammo_cells = self.ammo_cells;
  339. +                self.ammo_cells = 0;
  340. +        }
  341. +
  342. +        item.owner = self;
  343. +        makevectors(self.v_angle);
  344. +        setorigin(item, self.origin + '0 0 16');
  345. +        item.velocity = aim(self, 1000);
  346. +        item.velocity = item.velocity * 500;
  347. +        item.flags = FL_ITEM;
  348. +        item.solid = SOLID_TRIGGER;
  349. +        item.movetype = MOVETYPE_BOUNCE;
  350. +
  351. +        setmodel (item, "progs/backpack.mdl");
  352. +        setsize(item, '-16 -16 0', '16 16 56');
  353. +        item.touch = VholdBackpackTouch;
  354. +        item.nextthink = time + 120;    // remove after 2 minutes
  355. +        item.think = SUB_Remove;
  356. +
  357. +        W_SetCurrentAmmo();
  358. +}; 
  359. +
  360. +/*
  361. +=================
  362. +Bolt by Vhold
  363. +simply creates a lightning bolt that does no damage from vector a 
  364. +to vector b.  Any walls WILL stop it
  365. +=================
  366. +*/
  367. +
  368. +void(vector a, vector b) Bolt =
  369. +{
  370. +    traceline(a,b,TRUE,self);
  371. +
  372. +    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  373. +    WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
  374. +    WriteEntity (MSG_BROADCAST, self);
  375. +    WriteCoord (MSG_BROADCAST, a_x);
  376. +    WriteCoord (MSG_BROADCAST, a_y);
  377. +    WriteCoord (MSG_BROADCAST, a_z);
  378. +    WriteCoord (MSG_BROADCAST, trace_endpos_x);
  379. +    WriteCoord (MSG_BROADCAST, trace_endpos_y);
  380. +    WriteCoord (MSG_BROADCAST, trace_endpos_z);
  381. +};
  382. +
  383. +/*
  384. +==================
  385. +ProxThink
  386. +==================
  387. +*/
  388. +void() GrenadeExplode;
  389. +
  390. +void() ProxThink = 
  391. +{
  392. +        local entity head;
  393. +
  394. +    if (time >= self.wait)
  395. +        GrenadeExplode();
  396. +
  397. +        head = findradius(self.origin,160);
  398. +        while(head)
  399. +        {
  400. +                if( (head.classname != "door") && (head.health > 1) && (head.classname != "misc_explobox") &&
  401. +(head != self) && (head != self.owner) && !(head.items & IT_INVISIBILITY) )
  402. +                {
  403. +                        GrenadeExplode();
  404. +                        return;
  405. +                }
  406. +                head = head.chain;
  407. +        }
  408. +        self.nextthink = time + 0.25;
  409. +};
  410. +
  411. +/*
  412. +=================
  413. +FireProxGrenade
  414. +=================
  415. +*/
  416. +float() crandom;
  417. +
  418. +void() FireProxGrenade =
  419. +{
  420. +        local   entity missile, mpuff;
  421. +        if (self.currentammo < 5)
  422. +    {
  423. +        sprint(self,"Requires 5 grenades\n");
  424. +                return;
  425. +    }
  426. +        self.currentammo = self.ammo_rockets = self.ammo_rockets - 5;
  427. +    
  428. +    sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
  429. +
  430. +    self.punchangle_x = -2;
  431. +
  432. +    missile = spawn ();
  433. +    missile.owner = self;
  434. +    missile.movetype = MOVETYPE_BOUNCE;
  435. +    missile.solid = SOLID_BBOX;
  436. +    missile.classname = "agrenade";
  437. +        
  438. +// set missile speed    
  439. +
  440. +    makevectors (self.v_angle);
  441. +
  442. +    if (self.v_angle_x)
  443. +        missile.velocity = v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10;
  444. +    else
  445. +    {
  446. +        missile.velocity = aim(self, 10000);
  447. +        missile.velocity = missile.velocity * 600;
  448. +        missile.velocity_z = 200;
  449. +    }
  450. +
  451. +    missile.avelocity = '300 300 300';
  452. +
  453. +    missile.angles = vectoangles(missile.velocity);
  454. +    
  455. +//    missile.touch = GrenadeTouch;
  456. +    
  457. +// set missile duration
  458. +    missile.nextthink = time + 0.75;
  459. +    missile.think = ProxThink;
  460. +
  461. +    missile.wait = time + 120;
  462. +
  463. +    setmodel (missile, "progs/grenade.mdl");
  464. +    setsize (missile, '0 0 0', '0 0 0');        
  465. +    setorigin (missile, self.origin);
  466. +};
  467. +
  468. +/*
  469. +==================
  470. +FireAlternate
  471. +==================
  472. +*/
  473. +void() FireAlternate =
  474. +{
  475. +    if(self.weapon == IT_ROCKET_LAUNCHER)
  476. +    {
  477. +        FireHomingMissile();
  478. +        self.attack_finished = time + 1.0;        
  479. +    }
  480. +    if(self.weapon == IT_GRENADE_LAUNCHER)
  481. +    {
  482. +        FireProxGrenade();
  483. +        self.attack_finished = time + 0.8;
  484. +    }
  485. +    if(self.weapon == IT_LIGHTNING)
  486. +    {
  487. +        FireThor();
  488. +        self.attack_finished = time + 1.0;
  489. +    }
  490. +};
  491.  
  492.  // called by worldspawn
  493.  void() W_Precache =
  494. @@ -1169,6 +1652,18 @@
  495.          CycleWeaponCommand ();
  496.      if (self.impulse == 11)
  497.          ServerflagsCommand ();
  498. +
  499. +        // Vhold's Backpack thing
  500. +        if (self.impulse == 21)
  501. +                ThrowBackpack();
  502. +
  503. +    // Fire alternate weapon. Lynx & Dumont's idea
  504. +    if (self.impulse == 20)
  505. +        FireAlternate();
  506. +
  507. +        // D&L's Detonate grenades
  508. +        if (self.impulse == 22)
  509. +                DetGrenades();
  510.  
  511.      if (self.impulse == 255)
  512.          QuadCheat ();
  513.