2 // increments sprite frame, loops when end is hit.. simple
5 void (vector vec) WriteVec =
7 WriteCoord (MSG_BROADCAST, vec_x);
8 WriteCoord (MSG_BROADCAST, vec_y);
9 WriteCoord (MSG_BROADCAST, vec_z);
11 void (vector org, vector dir, float counts) W_Smoke =
13 WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
14 WriteByte (MSG_BROADCAST, TE_SMOKE);
17 WriteByte (MSG_BROADCAST, counts);
20 // increments sprite frame, loops when end is hit.. simple
21 void animate_sprite (float startframe, float frame_count)
23 if ((self.frame - startframe) >= (frame_count - 1 ))
24 self.frame = startframe;
26 self.frame = self.frame + 1;
29 void W_UpdateAmmo (void)
32 self.items = self.items - (self.items & (IT_NAILS | IT_SHELLS | IT_ROCKETS | IT_CELLS));
34 if (self.weapon == IT_LASER)
36 else if (self.weapon == IT_SHOTGUN)
38 self.currentammo = self.ammo_shells;
39 self.items = self.items | IT_SHELLS;
41 else if (self.weapon == IT_UZI)
43 self.currentammo = self.ammo_nails;
44 self.items = self.items | IT_NAILS;
46 else if (self.weapon == IT_GRENADE_LAUNCHER || self.weapon == IT_HAGAR || self.weapon == IT_ROCKET_LAUNCHER)
48 self.currentammo = self.ammo_rockets;
49 self.items = self.items | IT_ROCKETS;
51 else if (self.weapon == IT_ELECTRO || self.weapon == IT_NEX || self.weapon == IT_CRYLINK)
53 self.currentammo = self.ammo_cells;
54 self.items = self.items | IT_CELLS;
59 void W_UpdateWeapon (void)
62 if (self.weapon == IT_LASER)
63 self.weaponmodel = "models/weapons/w_laser.zym";
64 else if (self.weapon == IT_SHOTGUN)
65 self.weaponmodel = "models/weapons/w_shotgun.zym";
66 else if (self.weapon == IT_UZI)
67 self.weaponmodel = "models/weapons/w_uzi.zym";
68 else if (self.weapon == IT_GRENADE_LAUNCHER)
69 self.weaponmodel = "models/weapons/w_gl.zym";
70 else if (self.weapon == IT_ELECTRO)
71 self.weaponmodel = "models/weapons/w_electro.zym";
72 else if (self.weapon == IT_CRYLINK)
73 self.weaponmodel = "models/weapons/w_crylink.zym";
74 else if (self.weapon == IT_NEX)
75 self.weaponmodel = "models/weapons/w_nex.zym";
76 else if (self.weapon == IT_HAGAR)
77 self.weaponmodel = "models/weapons/w_hagar.zym";
78 else if (self.weapon == IT_ROCKET_LAUNCHER)
79 self.weaponmodel = "models/weapons/w_rl.zym";
81 objerror ("Illegal weapon - please register your guns please!");
85 float W_GetBestWeapon (entity e)
88 if ((e.items & IT_ROCKET_LAUNCHER) && e.ammo_rockets)
89 return IT_ROCKET_LAUNCHER;
90 else if ((e.items & IT_NEX) && e.ammo_cells)
92 else if ((e.items & IT_HAGAR) && e.ammo_rockets)
94 else if ((e.items & IT_GRENADE_LAUNCHER) && e.ammo_rockets)
95 return IT_GRENADE_LAUNCHER;
96 else if ((e.items & IT_ELECTRO) && e.ammo_cells)
98 else if ((e.items & IT_CRYLINK) && e.ammo_cells)
100 else if ((e.items & IT_UZI) && e.ammo_nails)
102 else if ((e.items & IT_SHOTGUN) && e.ammo_shells)
110 void W_GiveWeapon (entity e, float wep, string name)
117 e.items = e.items | wep;
122 weapon_action(self.weapon, WR_UPDATECOUNTS);
124 if (other.classname == "player")
126 sprint (other, "You got the ");
127 sprint (other, name);
128 sprint (other, "\n");
139 void W_SwitchWeapon (float wep)
142 var float noammo = FALSE;
148 nextwep = IT_SHOTGUN;
149 if (!self.ammo_shells)
155 if (!self.ammo_nails)
160 nextwep = IT_CRYLINK;
161 if (!self.ammo_cells)
166 nextwep = IT_ELECTRO;
167 if (!self.ammo_cells)
172 nextwep = IT_GRENADE_LAUNCHER;
173 if (!self.ammo_rockets)
179 if (!self.ammo_rockets)
185 if (!self.ammo_cells)
190 nextwep = IT_ROCKET_LAUNCHER;
191 if (!self.ammo_rockets)
196 if (!(self.items & nextwep))
198 sprint (self, "You don't own that weapon\n");
203 sprint (self, "You don't have any ammo for that weapon\n");
207 self.weapon = nextwep;
210 self.attack_finished = time + 0.2;
211 if (self.viewzoom != 1)
215 void W_NextWeapon (void)
223 if (self.weapon == IT_ROCKET_LAUNCHER)
224 self.weapon = IT_LASER;
225 else if (self.weapon == IT_LASER)
227 self.weapon = IT_SHOTGUN;
228 if (!self.ammo_shells)
231 else if (self.weapon == IT_SHOTGUN)
233 self.weapon = IT_UZI;
234 if (!self.ammo_nails)
237 else if (self.weapon == IT_UZI)
239 self.weapon = IT_CRYLINK;
240 if (!self.ammo_cells)
243 else if (self.weapon == IT_CRYLINK)
245 self.weapon = IT_ELECTRO;
246 if (!self.ammo_cells)
249 else if (self.weapon == IT_ELECTRO)
251 self.weapon = IT_GRENADE_LAUNCHER;
252 if (!self.ammo_cells)
255 else if (self.weapon == IT_GRENADE_LAUNCHER)
257 self.weapon = IT_HAGAR;
258 if (!self.ammo_rockets)
261 else if (self.weapon == IT_HAGAR)
263 self.weapon = IT_NEX;
264 if (!self.ammo_rockets)
267 else if (self.weapon == IT_NEX)
269 self.weapon = IT_ROCKET_LAUNCHER;
270 if (!self.ammo_cells)
274 if ((self.items & self.weapon) && !noammo)
283 void W_PreviousWeapon (void)
291 if (self.weapon == IT_SHOTGUN)
292 self.weapon = IT_LASER;
293 else if (self.weapon == IT_UZI)
295 self.weapon = IT_SHOTGUN;
296 if (!self.ammo_shells)
299 else if (self.weapon == IT_CRYLINK)
301 self.weapon = IT_UZI;
302 if (!self.ammo_nails)
305 else if (self.weapon == IT_ELECTRO)
307 self.weapon = IT_CRYLINK;
308 if (!self.ammo_cells)
311 else if (self.weapon == IT_GRENADE_LAUNCHER)
313 self.weapon = IT_ELECTRO;
314 if (!self.ammo_cells)
317 else if (self.weapon == IT_HAGAR)
319 self.weapon = IT_GRENADE_LAUNCHER;
320 if (!self.ammo_rockets)
323 else if (self.weapon == IT_NEX)
325 self.weapon = IT_HAGAR;
326 if (!self.ammo_rockets)
329 else if (self.weapon == IT_ROCKET_LAUNCHER)
331 self.weapon = IT_NEX;
332 if (!self.ammo_cells)
335 else if (self.weapon == IT_LASER)
337 self.weapon = IT_ROCKET_LAUNCHER;
338 if (!self.ammo_rockets)
342 if ((self.items & self.weapon) && !noammo)
351 float W_CheckAmmo (void)
353 if ((cvar("g_instagib") == 1) | (cvar("g_rocketarena") == 1))
357 if (self.weapon == IT_LASER)
359 else if (self.currentammo)
362 self.weapon = W_GetBestWeapon (self);
369 void FireRailgunBullet (vector src, float bdamage, vector dir, float spread, float deathtype)
372 entity saveself, last;
374 org = self.origin + self.view_ofs;
383 traceline_hitcorpse (self, org, org + v_forward * 4096 + v_right * crandom () * spread + v_up * crandom () * spread, FALSE, self);
385 lastpos = trace_endpos;
386 if (trace_fraction != 1.0)
388 if (pointcontents(trace_endpos - dir*4) == CONTENT_SKY)
391 if (trace_ent.takedamage || trace_ent.classname == "case")
393 if (trace_ent.classname == "player" || trace_ent.classname == "corpse" || trace_ent.classname == "gib")
394 te_blood (trace_endpos, dir * bdamage * 16, bdamage);
395 Damage (trace_ent, self, self, bdamage, deathtype, trace_endpos, dir * bdamage);
398 if (last.solid == SOLID_BSP)
404 void FireRailgunBullet (vector start, vector end, float bdamage, float deathtype)
406 local vector hitloc, dir, force;
408 //local entity explosion;
410 force = normalize(end - start) * 800; //(bdamage * 10);
412 // find how far the beam can go until it hits a wall
413 traceline (start, end, TRUE, self);
414 // go a little bit into the wall because we need to hit this wall later
415 end = trace_endpos + normalize(end - start);
418 WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
419 WriteByte (MSG_BROADCAST, 76);
420 WriteCoord (MSG_BROADCAST, start_x);
421 WriteCoord (MSG_BROADCAST, start_y);
422 WriteCoord (MSG_BROADCAST, start_z);
423 WriteCoord (MSG_BROADCAST, end_x);
424 WriteCoord (MSG_BROADCAST, end_y);
425 WriteCoord (MSG_BROADCAST, end_z);
426 WriteCoord (MSG_BROADCAST, 0);
427 WriteCoord (MSG_BROADCAST, 0);
428 WriteCoord (MSG_BROADCAST, 0);
430 // flash and burn the wall
431 te_plasmaburn (trace_endpos);
434 // flame effect at impact
435 dir = trace_plane_normal * 100;
436 WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
437 WriteByte (MSG_BROADCAST, TE_FLAMEJET);
438 WriteCoord (MSG_BROADCAST, trace_endpos_x);
439 WriteCoord (MSG_BROADCAST, trace_endpos_y);
440 WriteCoord (MSG_BROADCAST, trace_endpos_z);
441 WriteCoord (MSG_BROADCAST, dir_x);
442 WriteCoord (MSG_BROADCAST, dir_y);
443 WriteCoord (MSG_BROADCAST, dir_z);
444 WriteByte (MSG_BROADCAST, 255);
447 PointSound (trace_endpos, "weapons/neximpact.wav", 1, ATTN_NORM);
450 // trace multiple times until we hit a wall, each obstacle will be made
451 // non-solid so we can hit the next, while doing this we spawn effects and
452 // note down which entities were hit so we can damage them later
455 traceline_hitcorpse (self, start, end, FALSE, self);
457 // if it is world we can't hurt it so stop now
458 if (trace_ent == world || trace_fraction == 1)
461 // make the entity non-solid so we can hit the next one
462 trace_ent.railgunhit = TRUE;
463 trace_ent.railgunhitloc = trace_endpos;
464 trace_ent.railgunhitsolidbackup = trace_ent.solid;
466 // stop if this is a wall
467 if (trace_ent.solid == SOLID_BSP)
470 // make the entity non-solid
471 trace_ent.solid = SOLID_NOT;
474 // find all the entities the railgun hit and restore their solid state
475 ent = findfloat(world, railgunhit, TRUE);
478 // restore their solid type
479 ent.solid = ent.railgunhitsolidbackup;
480 ent = findfloat(ent, railgunhit, TRUE);
483 // spawn a temporary explosion entity for RadiusDamage calls
484 //explosion = spawn();
486 // find all the entities the railgun hit and hurt them
487 ent = findfloat(world, railgunhit, TRUE);
490 // get the details we need to call the damage function
491 hitloc = ent.railgunhitloc;
492 ent.railgunhitloc = '0 0 0';
493 ent.railgunhitsolidbackup = SOLID_NOT;
494 ent.railgunhit = FALSE;
497 if (ent.takedamage || ent.classname == "case")
498 Damage (ent, self, self, bdamage, deathtype, hitloc, force);
500 // create a small explosion to throw gibs around (if applicable)
501 //setorigin (explosion, hitloc);
502 //RadiusDamage (explosion, self, 10, 0, 50, world, 300, deathtype);
504 // advance to the next entity
505 ent = findfloat(ent, railgunhit, TRUE);
508 // we're done with the explosion entity, remove it
512 void fireBullet (vector start, vector dir, float spread, float damage, float dtype, float tracer)
518 // use traceline_hitcorpse to make sure it can hit gibs and corpses too
519 dir = dir + randomvec() * spread;
520 end = start + dir * 4096;
521 traceline_hitcorpse (self, start, end, FALSE, self);
527 e.movetype = MOVETYPE_FLY;
529 e.think = SUB_Remove;
530 e.nextthink = time + vlen(trace_endpos - start) / 6000;
531 e.velocity = dir * 6000;
532 e.angles = vectoangles(e.velocity);
533 setmodel (e, "models/tracer.mdl");
534 setsize (e, '0 0 0', '0 0 0');
535 setorigin (e, start);
536 e.effects = e.effects | EF_ADDITIVE;
539 // FIXME - causes excessive 'tinking'. Hopefully remove "tink1.wav" from the ricochets with csqc
540 if ((trace_fraction != 1.0) && (pointcontents (trace_endpos) != CONTENT_SKY))
542 if (trace_ent.solid == SOLID_BSP)
544 pointcontents (self.origin);
545 te_gunshot (trace_endpos);
548 sound (self, CHAN_IMPACT, "weapons/ric1.wav", 1, ATTN_NORM);
550 sound (self, CHAN_IMPACT, "weapons/ric2.wav", 1, ATTN_NORM);
552 sound (self, CHAN_IMPACT, "weapons/ric3.wav", 1, ATTN_NORM);
554 else if (trace_ent.classname == "player" || trace_ent.classname == "corpse" || trace_ent.classname == "gib")
555 sound (self, CHAN_BODY, "misc/hit.wav", 1, ATTN_NORM);
556 Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * damage * 5);
563 if (self.deadflag != DEAD_NO)
565 if (self.death_time < time)
574 makevectors (self.v_angle);
575 //if (self.weapon == IT_LASER)
576 // W_Laser_Attack ();
577 //if (self.weapon == IT_SHOTGUN)
578 //W_Shotgun_Attack ();
579 //else if (self.weapon == IT_UZI)
581 if (self.weapon == IT_CRYLINK)
583 else if (self.weapon == IT_ELECTRO)
585 W_Electro_Attack (self.electrocount);
586 self.electrocount = self.electrocount + 1;
587 if (self.electrocount == 3)
588 self.electrocount = 0;
590 else if (self.weapon == IT_GRENADE_LAUNCHER)
592 else if (self.weapon == IT_HAGAR)
594 else if (self.weapon == IT_NEX)
596 //else if (self.weapon == IT_ROCKET_LAUNCHER)
597 // W_Rocket_Attack ();
602 void W_SecondaryAttack (void)
604 if (self.deadflag != DEAD_NO)
606 if (self.death_time < time)
615 makevectors (self.v_angle);
616 //if (self.weapon == IT_LASER)
617 //W_Laser_Attack2 ();
618 //if (self.weapon == IT_SHOTGUN)
619 //W_Shotgun_Attack2 ();
620 //else if (self.weapon == IT_UZI)
622 else if (self.weapon == IT_CRYLINK)
623 W_Crylink_Attack2 ();
624 else if (self.weapon == IT_ELECTRO) {
625 W_Electro_Attack2 (self.electrocount);
626 self.electrocount = self.electrocount + 1;
627 if (self.electrocount == 3)
628 self.electrocount = 0;
630 else if (self.weapon == IT_GRENADE_LAUNCHER)
631 W_Grenade_Attack2 ();
632 else if (self.weapon == IT_HAGAR)
634 else if (self.weapon == IT_NEX)
636 //else if (self.weapon == IT_ROCKET_LAUNCHER)
637 //W_Rocket_Attack2 ();
642 void W_ThirdAttack (void)
644 if (self.deadflag != DEAD_NO)
646 if (self.death_time < time)
655 makevectors (self.v_angle);
656 //if (self.weapon == IT_LASER)
657 //W_Laser_Attack2 ();
658 //if (self.weapon == IT_SHOTGUN)
659 //W_Shotgun_Attack2 ();
660 //else if (self.weapon == IT_UZI)
662 else if (self.weapon == IT_CRYLINK)
663 W_Crylink_Attack2 ();
664 else if (self.weapon == IT_ELECTRO) {
665 W_Electro_Attack3 (self.electrocount);
666 self.electrocount = self.electrocount + 1;
667 if (self.electrocount == 3)
668 self.electrocount = 0;
670 else if (self.weapon == IT_GRENADE_LAUNCHER)
671 W_Grenade_Attack3 ();
672 else if (self.weapon == IT_HAGAR)
674 else if (self.weapon == IT_NEX)
676 //else if (self.weapon == IT_ROCKET_LAUNCHER)
677 //W_Rocket_Attack3 ();