home *** CD-ROM | disk | FTP | other *** search
- .float grenadetimer;
- .float numholo;//init
- .float nextregen;
-
- entity newclient;
-
- //prototypes
- float() crandom;
- void() GrenadeExplode;
- void() BecomeExplosion;
- void(string gibname,float dmg) ThrowGib;
- void(string gibname,float dmg) ThrowHead;
- void(vector p1, vector p2, entity from, float damage) LightningDamage;
- void() zombie_stand1;
- void() zombie_walk1;
- void() zombie_run1;
- void(entity attacker,float take) zombie_pain;
- void() zombie_paine1;
- void() zombie_die;
- void() zombie_missile;
- void() walkmonster_start_go;
-
- //Make Thrown Ammo,Backpack,Gun pick uppable.
- void() SUB_MakePickup = {
- self.flags=FL_ITEM;
- self.solid=SOLID_TRIGGER;
- self.nextthink=time+600;
- self.think=SUB_Remove;
- };
-
- //Gib a Body into pieces after a while.
- void() SUB_Gib = {
- ThrowGib("progs/gib1.mdl",10);
- ThrowGib("progs/gib1.mdl",10);
- ThrowGib("progs/gib2.mdl",10);
- ThrowGib("progs/gib3.mdl",10);
- ThrowHead("progs/h_player.mdl",10);
- };
-
- //Used to toss a weapon, ammo, or armor.
- void(float ax) TossBackpack =
- {
- local entity item;
- if (self.flags & FL_OBSERVER) return;
- if (self.impulse==55) ax=0;
- else if (self.impulse==56) ax=1;
- else if (self.impulse==57) ax=32;
- if (ax==0) {
- if (self.weapon==IT_SUPER_SHOTGUN) ax=3;
- if (self.weapon==IT_NAILGUN) ax=4;
- if (self.weapon==IT_SUPER_NAILGUN) ax=5;
- if (self.weapon==IT_GRENADE_LAUNCHER) ax=6;
- if (self.weapon==IT_ROCKET_LAUNCHER) ax=7;
- if (self.weapon==IT_LIGHTNING) ax=8;
- }
- if (ax==1) {
- if (self.weapon==IT_SHOTGUN) ax=16;
- if (self.weapon==IT_SUPER_SHOTGUN) ax=16;
- if (self.weapon==IT_NAILGUN) ax=17;
- if (self.weapon==IT_SUPER_NAILGUN) ax=17;
- if (self.weapon==IT_GRENADE_LAUNCHER) ax=18;
- if (self.weapon==IT_ROCKET_LAUNCHER) ax=18;
- if (self.weapon==IT_LIGHTNING) ax=19;
- }
- if (ax==2) {
- if (!(self.ammo_shells+self.ammo_nails+self.ammo_rockets+self.ammo_cells))
- return; // nothing in it
- item = spawn();
- item.owner = self;
- item.items = 0;
- setmodel (item, "progs/backpack.mdl");
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = BackpackTouch;
- item.ammo_shells = self.ammo_shells;
- item.ammo_nails = self.ammo_nails;
- item.ammo_rockets = self.ammo_rockets;
- item.ammo_cells = self.ammo_cells;
- item.classname="backpack";
- self.ammo_shells = 0;
- self.ammo_nails = 0;
- self.ammo_rockets = 0;
- self.ammo_cells = 0;
- } else if (ax==3) {
- if (!(self.items & IT_SUPER_SHOTGUN)) return;
- item = spawn();
- item.owner = self;
- item.items = IT_SUPER_SHOTGUN;
- self.items = self.items - IT_SUPER_SHOTGUN;
- if (self.weapon==IT_SUPER_SHOTGUN) self.weapon=W_BestWeapon();
- setmodel (item, "progs/g_shot.mdl");
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = BackpackTouch;
- if (self.ammo_shells < 10)
- item.ammo_shells = self.ammo_shells;
- else item.ammo_shells = 10;
- self.ammo_shells=self.ammo_shells-item.ammo_shells;
- item.classname="weapon_supershotgun";
- } else if (ax==4) {
- if (!(self.items & IT_NAILGUN)) return;
- item = spawn();
- item.owner = self;
- item.items = IT_NAILGUN;
- self.items = self.items - IT_NAILGUN;
- if (self.weapon==IT_NAILGUN) self.weapon=W_BestWeapon();
- setmodel (item, "progs/g_nail.mdl");
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = BackpackTouch;
- if (self.ammo_nails < 20)
- item.ammo_nails = self.ammo_nails;
- else item.ammo_nails = 20;
- self.ammo_nails=self.ammo_nails-item.ammo_nails;
- item.classname="weapon_nailgun";
- } else if (ax==5) {
- if (!(self.items & IT_SUPER_NAILGUN)) return;
- item = spawn();
- item.owner = self;
- item.items = IT_SUPER_NAILGUN;
- self.items = self.items - IT_SUPER_NAILGUN;
- if (self.weapon==IT_SUPER_NAILGUN) self.weapon=W_BestWeapon();
- setmodel (item, "progs/g_nail2.mdl");
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = BackpackTouch;
- if (self.ammo_nails < 20) item.ammo_nails = self.ammo_nails;
- else item.ammo_nails = 20;
- self.ammo_nails=self.ammo_nails-item.ammo_nails;
- item.classname="weapon_supernailgun";
- } else if (ax==6) {
- if (!(self.items & IT_GRENADE_LAUNCHER)) return;
- item = spawn();
- item.owner = self;
- item.items = IT_GRENADE_LAUNCHER;
- self.items = self.items - IT_GRENADE_LAUNCHER;
- if (self.weapon==IT_GRENADE_LAUNCHER) self.weapon=W_BestWeapon();
- setmodel (item, "progs/g_rock.mdl");
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = BackpackTouch;
- if (self.ammo_rockets < 10) item.ammo_rockets = self.ammo_rockets;
- else item.ammo_rockets = 10;
- self.ammo_rockets=self.ammo_rockets-item.ammo_rockets;
- item.classname="weapon_grenadelauncher";
- } else if (ax==7) {
- if (!(self.items & IT_ROCKET_LAUNCHER)) return;
- item = spawn();
- item.owner = self;
- item.items = IT_ROCKET_LAUNCHER;
- self.items = self.items - IT_ROCKET_LAUNCHER;
- if (self.weapon==IT_ROCKET_LAUNCHER) self.weapon=W_BestWeapon();
- setmodel (item, "progs/g_rock2.mdl");
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = BackpackTouch;
- if (self.ammo_rockets < 10) item.ammo_rockets = self.ammo_rockets;
- else item.ammo_rockets = 10;
- self.ammo_rockets=self.ammo_rockets-item.ammo_rockets;
- item.classname="weapon_rocketlauncher";
- } else if (ax==8) {
- if (!(self.items & IT_LIGHTNING)) return;
- item = spawn();
- item.owner = self;
- item.items = IT_LIGHTNING;
- self.items = self.items - IT_LIGHTNING;
- if (self.weapon==IT_LIGHTNING) self.weapon=W_BestWeapon();
- setmodel (item, "progs/g_light.mdl");
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = BackpackTouch;
- if (self.ammo_cells < 10) item.ammo_cells = self.ammo_cells;
- else item.ammo_cells = 10;
- self.ammo_cells=self.ammo_cells-item.ammo_cells;
- item.classname="weapon_lightning";
- } else if (ax==16) {
- //shells
- if (self.ammo_shells==0) return;
- item = spawn();
- if (self.ammo_shells < 10) item.ammo_shells = self.ammo_shells;
- else item.ammo_shells = 10;
- item.owner = self;
- self.ammo_shells=self.ammo_shells-item.ammo_shells;
- setmodel (item, "maps/b_shell1.bsp");
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = BackpackTouch;
- item.classname = "ammo_shells";
- } else if (ax==17) {
- //nails
- if (self.ammo_nails==0) return;
- item = spawn();
- if (self.ammo_nails < 20) item.ammo_nails = self.ammo_nails;
- else item.ammo_nails = 20;
- item.owner = self;
- self.ammo_nails=self.ammo_nails-item.ammo_nails;
- setmodel (item, "maps/b_nail1.bsp");
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = BackpackTouch;
- item.classname = "ammo_nails";
- } else if (ax==18) {
- //rockets
- if (self.ammo_rockets==0) return;
- item = spawn();
- if (self.ammo_rockets < 10) item.ammo_rockets=self.ammo_rockets;
- else item.ammo_rockets = 10;
- item.owner = self;
- self.ammo_rockets=self.ammo_rockets-item.ammo_rockets;
- setmodel (item, "maps/b_rock1.bsp");
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = BackpackTouch;
- item.classname = "ammo_rockets";
- } else if (ax==19) {
- //cells
- if (self.ammo_cells==0) return;
- item = spawn();
- if (self.ammo_cells < 10) item.ammo_cells = self.ammo_cells;
- else item.ammo_cells = 10;
- item.owner = self;
- self.ammo_cells=self.ammo_cells-item.ammo_cells;
- setmodel (item, "maps/b_batt1.bsp");
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = BackpackTouch;
- item.classname = "ammo_cells";
- } else if (ax==32) {
- if (self.armorvalue<1) return;
- sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
- item = spawn();
- item.owner = self;
- item.armortype=self.armortype;
- item.armorvalue=self.armorvalue;
- self.armortype=0;
- self.armorvalue=0;
- setmodel (item, "progs/armor.mdl");
- if (item.armortype==0.3) {
- item.skin=0;
- self.items=self.items-IT_ARMOR1;
- item.items=IT_ARMOR1;
- item.classname="item_armor1";
- } else if (item.armortype==0.6) {
- item.skin=1;
- self.items=self.items-IT_ARMOR2;
- item.items=IT_ARMOR2;
- item.classname="item_armor2";
- } else if (item.armortype==0.8) {
- item.skin=2;
- self.items=self.items-IT_ARMOR3;
- item.items=IT_ARMOR3;
- item.classname="item_armorInv";
- }
- setsize (item, '-16 -16 0', '16 16 56');
- item.touch = armor_touch;
- } else return;
- sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
- W_SetCurrentAmmo(); //Draw new weapon on screen (in hand)
- // set missile speed
- makevectors (self.v_angle);
- if (self.v_angle_x)
- item.velocity = v_forward*600 + v_up * 200 +
- crandom()*v_right*10 + crandom()*v_up*10;
- else
- {
- item.velocity = aim(self, 10000);
- item.velocity = item.velocity * 600;
- }
- item.origin = self.origin + (item.velocity * 0.0);
- item.movetype = MOVETYPE_TOSS;
- // so people cant pick it up immediately
- item.nextthink = time + 0.25;
- item.think = SUB_MakePickup;
- };
-
- //Detonate all pipebombs
- void() DetPipeBombs =
- {
- local entity head;
-
- head = find (world,classname,"pipebomb");
- while(head)
- {
- if(head.owner == self)
- head.nextthink = time;
- head = find (head,classname,"pipebomb");
- }
- };
-
- void() PipeBombTouch =
- {
- if (other == self.owner)
- return; // don't explode on owner
- sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM); // bounce sound
- if (self.velocity == '0 0 0')
- self.avelocity = '0 0 0';
- };
-
- void() W_FirePipeBomb =
- {
- local entity missile, mpuff;
- if(self.ammo_rockets < 1) // have to have ammo
- return;
- self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
- self.punchangle_x=-2;
- missile = spawn ();
- missile.owner = self;
- missile.movetype = MOVETYPE_BOUNCE;
- missile.solid = SOLID_BBOX;
- missile.classname = "pipebomb";
- makevectors (self.v_angle);
- if (self.v_angle_x) missile.velocity =
- v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10;
- else {
- missile.velocity = aim(self, 10000);
- missile.velocity = missile.velocity * 600;
- missile.velocity_z = 200;
- }
- missile.avelocity = '300 300 300';
- missile.angles = vectoangles(missile.velocity);
- missile.touch = PipeBombTouch;
- missile.think = GrenadeExplode;
- setmodel (missile, "progs/grenade.mdl");
- setsize (missile, '0 0 0', '0 0 0');
- setorigin (missile, self.origin);
- //pipe bombs explode after 5 mins by default
- missile.nextthink=time+300;
- };
- // end pipebombs
-
-
- entity() LightFindTarget = { //this routine based on function by VHOLD
- local entity head, selected;
- local float dist;
- dist = 100000;
- selected = world;
- head = findradius(self.origin, 100000);
- while(head) {
- if ((((coop) && (head.classname != "player")) || (!coop)) &&
- (((teamplay==1 || teamplay==2 || teamplay==7) &&
- (head.team != self.owner.team)) || (teamplay!=1 || teamplay!=7)) &&
- ((head.health > 1) && (head != self) && (head != self.owner)) &&
- (!(head.items & IT_INVISIBILITY ))) {
- traceline(self.origin,head.origin,TRUE,self);
- if ((trace_fraction==1) && (vlen(head.origin-self.origin) < dist)) {
- selected = head;
- dist = vlen(head.origin - self.origin);
- }
- }
- head = head.chain;
- }
- return selected;
- };
-
- void(vector p1, vector p2, entity from, float damage) LightningStun =
- {
- local entity e1, e2;
- local vector f;
-
- f = p2 - p1;
- normalize (f);
- f_x = 0 - f_y;
- f_y = f_x;
- f_z = 0;
- f = f*16;
-
- e1 = e2 = world;
-
- traceline (p1, p2, FALSE, self);
- if (trace_ent.takedamage)
- {
- particle (trace_endpos, '0 0 100', 225, damage*4);
- if (trace_ent.th_pain) {
- trace_ent.th_pain (trace_ent,damage);
- // nightmare mode monsters don't go into pain frames often
- if (skill == 3) trace_ent.pain_finished = time + 5;
- }
- if (self.classname == "player")
- {
- if (other.classname == "player")
- trace_ent.velocity_z = trace_ent.velocity_z + 400;
- }
- }
- e1 = trace_ent;
-
- traceline (p1 + f, p2 + f, FALSE, self);
- if (trace_ent != e1 && trace_ent.takedamage)
- {
- particle (trace_endpos, '0 0 100', 225, damage*4);
- if (trace_ent.th_pain) {
- trace_ent.th_pain (trace_ent,damage);
- // nightmare mode monsters don't go into pain frames often
- if (skill == 3) trace_ent.pain_finished = time + 5;
- }
- }
- e2 = trace_ent;
-
- traceline (p1 - f, p2 - f, FALSE, self);
- if (trace_ent != e1 && trace_ent != e2 && trace_ent.takedamage)
- {
- particle (trace_endpos, '0 0 100', 225, damage*4);
- if (trace_ent.th_pain) {
- trace_ent.th_pain (trace_ent,damage);
- // nightmare mode monsters don't go into pain frames often
- if (skill == 3) trace_ent.pain_finished = time + 5;
- }
- }
- };
-
- void() CastMinionLightning =
- {
- local vector org, dir;
-
- self.effects = self.effects | EF_MUZZLEFLASH;
-
- ai_face ();
-
- org=self.origin;
-
- dir = self.enemy.origin + '0 0 16' - org;
- dir = normalize (dir);
-
- traceline (org, self.origin + dir*600, TRUE, self);
-
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, TE_LIGHTNING1);
- WriteEntity (MSG_BROADCAST, self);
- WriteCoord (MSG_BROADCAST, org_x);
- WriteCoord (MSG_BROADCAST, org_y);
- WriteCoord (MSG_BROADCAST, org_z);
- WriteCoord (MSG_BROADCAST, trace_endpos_x);
- WriteCoord (MSG_BROADCAST, trace_endpos_y);
- WriteCoord (MSG_BROADCAST, trace_endpos_z);
- LightningStun (org, trace_endpos, self.owner, 40);
- };
-
- //Minion AI
- void() MinionThink = {
- local vector dir, vtemp;
- local string s;
- if ((self.owner.flags & FL_HASMINION)==0) {
- remove(self);
- return;
- }
- self.enemy = self.owner;
- if (self.enemy != world) {
- vtemp = self.enemy.origin + '0 0 10';
- dir = normalize(vtemp - self.origin + '0 0 25');
- self.velocity = dir * 200;
- self.angles = vectoangles(self.velocity);
- }
- self.enemy=LightFindTarget();
- if (self.enemy) {
- if (self.ammo_cells > 1) {
- self.currentammo = self.ammo_cells =self.ammo_cells - 1;
- CastMinionLightning();
- sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
- } else {
- self.owner.flags = self.owner.flags - (FL_HASMINION & self.owner.flags);
- remove(self);
- return;
- }
- }
- self.nextthink = time + 1;
- self.think=MinionThink;
- };
-
- //Create the minion
- void(vector vec) Minion =
- {
- sound (self, CHAN_WEAPON, "items/damage3.wav", 1, ATTN_NORM);
- vec = normalize(vec);
- newmis = spawn();
- newmis.owner = self;
- newmis.classname = "electricminion";
- newmis.movetype = MOVETYPE_NOCLIP;
- // newmis.movetype = MOVETYPE_FLY;
- newmis.solid = SOLID_NOT;
- newmis.effects = EF_DIMLIGHT;
- newmis.ammo_cells = 40;
- newmis.items = IT_LIGHTNING;
- setmodel (newmis, "progs/quaddama.mdl");
- setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
- setorigin (newmis, self.origin + '0 0 25');// v_forward*8 + '0 0 16');
- newmis.velocity = aim(self, 1000);
- newmis.velocity = newmis.velocity * 1;
- newmis.angles = vectoangles(newmis.velocity);
- newmis.enemy = world;
- newmis.nextthink = time + 2;
- newmis.think = MinionThink;
- };
-
- //Fire the minion with your gun
- void() W_FireMinion =
- {
- if ((self.ammo_cells < 80) || (self.flags & FL_HASMINION)) return;
- //maybe add sound for failure?
- sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
- self.effects = self.effects | EF_MUZZLEFLASH;
- self.currentammo = self.ammo_cells = self.ammo_cells - 80;
- self.flags = self.flags + FL_HASMINION;
- Minion(self.enemy.origin - self.origin);
- };
-
- //after a minute, hologram disappears
- void() Holothink = {
- self.owner.numholo = self.owner.numholo - 1;
- sound (self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM);
- remove(self);
-
- };
-
- //Create a hologram
- void(vector vec) Hologram = {
- if (self.flags & FL_OBSERVER) return;
- sound (self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM);
- vec = normalize(vec);
-
- newmis = spawn();
- newmis.owner = self;
- newmis.classname = "hologram";
- newmis.solid = SOLID_NOT;
- setmodel (newmis, self.model);
- newmis.skin=self.skin;
- newmis.frame=self.frame;
- newmis.colormap=self.colormap;
- newmis.modelindex=self.modelindex;
-
- setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
-
- setorigin (newmis, self.origin);
- newmis.velocity = aim(self, 1000);
- newmis.velocity = newmis.velocity * 1;
- newmis.angles = vectoangles(newmis.velocity);
- newmis.nextthink = time + 60;
- newmis.think = Holothink;
- };
-
- //Fire the Hologram
- void() W_FireHolo =
- {
- if ((self.ammo_cells < 12) || (self.numholo > 2)) return;
-
- self.effects = self.effects | EF_MUZZLEFLASH;
- self.currentammo = self.ammo_cells = self.ammo_cells - 12;
- self.numholo = self.numholo + 1;
- Hologram(self.enemy.origin - self.origin);
- };
-
-
- //Become an Observer
- void() Observer =
- {
- self.items = self.items | (IT_INVULNERABILITY + IT_INVISIBILITY);
- self.solid = SOLID_NOT;
- centerprint(self,"OBSERVER MODE");
- self.flags = self.flags | (FL_OBSERVER);
- self.flags = self.flags - (self.flags & (FL_HASMINION));
- self.movetype=MOVETYPE_NOCLIP;
- self.frags=self.frags - 1;
- // Detonate Pipe Bombs so person cant use them later
- DetPipeBombs();
- DropFlagCheck(TRUE);
- bprint("\n");
- bprint(self.netname);
- bprint(" ");
- bprint("is now an observer.");
- bprint("\n");
- setmodel(self,"");
- /*
- self.flags=self.flags | FL_SWIM | FL_INWATER;
- self.watertype=CONTENT_WATER;
- self.waterlevel=1;
- */
- };
-
- //set the grenade timer based on impulses 53 and 54
- void ()SetGrenadeTimer = {
- local string s;
- local float iv;
- if (self.impulse==53){
- if (self.grenadetimer==0.5) iv=0;
- else iv= -0.5;
- if (self.grenadetimer >5) iv = -1;
- if (self.grenadetimer >20) iv= -5;
- if (self.grenadetimer >60) iv= -15;
- if (self.grenadetimer >120) iv= -30;
- } else {
- iv=0.5;
- if (self.grenadetimer>=5) iv=1;
- if (self.grenadetimer>=15) iv=5;
- if (self.grenadetimer >=60) iv=15;
- if (self.grenadetimer >=120) iv=30;
- if (self.grenadetimer==300) iv=0;
- }
- self.grenadetimer=self.grenadetimer+iv;
- if (!self.grenadetimer) self.grenadetimer=0.5;
- sprint(self,"Grenade Timer: ");
- s=ftos(self.grenadetimer);
- sprint(self,s);
- sprint(self,"\n");
- };
-
- //If player has lightning gun and less than 50 cells, the gain a cell
- void ()CheckPowerRegen = {
- if(self.nextregen <= time){
- if((self.items & IT_LIGHTNING) && (self.ammo_cells < 50)){
- self.ammo_cells=self.ammo_cells+1;
- if (self.weapon==IT_LIGHTNING) self.currentammo=self.ammo_cells;
- }
- self.nextregen=time+5;
- }
- };
-
- void() W_PushEnemy = {
- local vector source;
- local vector push;
- source = self.origin + '0 0 16';
- makevectors(self.angles);
- traceline (source, source + v_forward*128, FALSE, self);
- v_forward_z=0;
- if (trace_fraction!=1.0)
- if (trace_ent.takedamage==DAMAGE_AIM){
- //watch out what you move. should this be just players?
- if (trace_ent.flags & FL_ONGROUND)
-
- trace_ent.flags=trace_ent.flags-FL_ONGROUND;
- sound (self, CHAN_WEAPON, "player/plyrjmp8.wav", 1, ATTN_NORM);
- push=(((v_forward*64)-(self.origin + '0 0 -32' - trace_ent.origin))*4);
- push_z=push_z+80;
- if (self.super_damage_finished > time) push=push*4;
- trace_ent.velocity=trace_ent.velocity+push;
- }
- };
-
- void(vector bolt_org, vector bolt_dir, float spawn_num) LightningBounce =
- {
- local entity tempent;
- local vector old_endpos;
-
- if (spawn_num < 1)
- return;
- tempent=spawn();
- tempent.origin = bolt_org;
- setorigin(tempent,bolt_org);
- setmodel(tempent,"progs/grenade.mdl");
- tempent.v_angle = bolt_dir;
- tempent.angles = vectoangles(tempent.v_angle);
-
- traceline (bolt_org, bolt_org + bolt_dir * 600, FALSE, self);
-
- old_endpos = trace_endpos + bolt_dir * 4;
-
- bolt_dir_x = bolt_dir_x * (((0 - 2) * fabs(trace_plane_normal_x)) + 1);
- bolt_dir_y = bolt_dir_y * (((0 - 2) * fabs(trace_plane_normal_y)) + 1);
- bolt_dir_z = bolt_dir_z * (((0 - 2) * fabs(trace_plane_normal_z)) + 1);
-
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
- WriteEntity (MSG_BROADCAST, tempent);
- WriteCoord (MSG_BROADCAST, bolt_org_x);
- WriteCoord (MSG_BROADCAST, bolt_org_y);
- WriteCoord (MSG_BROADCAST, bolt_org_z);
- WriteCoord (MSG_BROADCAST, trace_endpos_x);
- WriteCoord (MSG_BROADCAST, trace_endpos_y);
- WriteCoord (MSG_BROADCAST, trace_endpos_z);
-
- LightningDamage (bolt_org, old_endpos, self, 15*spawn_num);
-
- bolt_dir_x = bolt_dir_x + 0.05 * crandom();
- bolt_dir_y = bolt_dir_y + 0.05 * crandom();
- bolt_dir_z = bolt_dir_z + 0.05 * crandom();
-
- LightningBounce(old_endpos, bolt_dir, spawn_num - 1);
-
- remove(tempent);
- };
-
- void() W_FireSuperLightning =
- {
- local float cells;
- local vector org;
- if (self.ammo_cells < 3)
- {
- self.weaponnum=0;
- self.weapon = W_BestWeapon ();
- W_SetCurrentAmmo ();
- return;
- }
-
- // explode if under water
- if (self.waterlevel > 1)
- {
- cells=self.ammo_cells;
- self.ammo_cells = 0;
- T_RadiusDamage (self, self, 35*cells, world);
- W_SetCurrentAmmo ();
- return;
- }
-
- if (self.t_width < time)
- {
- sound (self, CHAN_WEAPON, "weapons/lhit.wav", 1, ATTN_NORM);
- self.t_width = time + 0.6;
- }
-
- self.punchangle_x = -2;
-
- self.currentammo = self.ammo_cells = self.ammo_cells - 3;
-
- org=self.origin+'0 0 16';
- traceline(org,org+v_forward*600,TRUE,self);
-
- makevectors(self.v_angle);
-
- self.attack_finished=time + 2;
- LightningBounce(org, v_forward, 3);
- };
-
- void() W_Remember =
- {
- self.pos1 = self.origin;
- self.pos2 = self.angles;
- sound (self, CHAN_WEAPON, "misc/basekey.wav", 1, ATTN_NORM);
- sprint (self, "Location Stored\n");
- };
-
- // void(vector org) spawn_tfog;
- // void() tdeath_touch;
- void(vector org, entity death_owner) spawn_tdeath;
-
- void() W_Teleport =
- {
- if (self.ammo_cells < 10)
- {
- sprint(self,"Need 10 cells to teleport.\n");
- return;
- }
- if (teamplay == 7)
- {
- sprint(self,"Teleporting disabled in Capture The Flag.\n");
- return;
- }
- if (!(self.pos1 == '0 0 0'))
- {
- self.currentammo = self.ammo_cells = self.ammo_cells - 10;
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, TE_TELEPORT);
- WriteCoord (MSG_BROADCAST, self.origin_x);
- WriteCoord (MSG_BROADCAST, self.origin_y);
- WriteCoord (MSG_BROADCAST, self.origin_z);
- sound (self, CHAN_WEAPON, "misc/r_tele4.wav", 1, ATTN_NORM);
- spawn_tdeath(self.pos1, self);
- self.origin = self.pos1;
- self.angles = self.pos2;
- self.fixangle = 1;
-
- sound (self, CHAN_WEAPON, "misc/r_tele3.wav", 1, ATTN_NORM);
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, TE_TELEPORT);
- WriteCoord (MSG_BROADCAST, self.origin_x);
- WriteCoord (MSG_BROADCAST, self.origin_y);
- WriteCoord (MSG_BROADCAST, self.origin_z);
- }
- else sprint(self,"No location stored.\n");
- };
-
- void () W_TripExplode =
- {
- self.owner = self.dmg_inflictor;
- T_RadiusDamage (self, self.owner, 199, self);
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, TE_EXPLOSION);
- WriteCoord (MSG_BROADCAST, self.origin_x);
- WriteCoord (MSG_BROADCAST, self.origin_y);
- WriteCoord (MSG_BROADCAST, self.origin_z);
- BecomeExplosion ();
- };
-
- void() W_TripActivate =
- {
- local vector org;
- local vector des;
- local entity found;
- local entity tempent;
-
- local float min_dist;
-
- org = self.origin;
- des = self.pos1;
-
- traceline(org, des, FALSE, self);
-
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
- WriteEntity (MSG_BROADCAST, self);
- WriteCoord (MSG_BROADCAST, org_x);
- WriteCoord (MSG_BROADCAST, org_y);
- WriteCoord (MSG_BROADCAST, org_z);
- WriteCoord (MSG_BROADCAST, trace_endpos_x);
- WriteCoord (MSG_BROADCAST, trace_endpos_y);
- WriteCoord (MSG_BROADCAST, trace_endpos_z);
-
- self.health = self.health - 1;
-
- if (trace_endpos != des && self.health > 3)
- self.health = 1;
-
- if (self.health == 1)
- sound (self, CHAN_WEAPON, "misc/talk.wav", 1, ATTN_NORM);
-
- if (self.health <= 0)
- {
- self.think = W_TripExplode;
- self.nextthink = time;
- }
- else
- {
- self.think = W_TripActivate;
- self.nextthink = time + 0.15;
- }
- };
-
-
- void() W_TripWait =
- {
- local entity oldself;
- if(other.health) {
- remove(self);
- return;
- }
- self.owner.attack_finished = time + 1;
- self.owner.currentammo=self.owner.ammo_rockets = self.owner.ammo_rockets - 5;
- self.owner.items=self.owner.items-(self.owner.items & IT_ROCKET_LAUNCHER);
- oldself=self;
- self=self.owner;
- self.weapon=W_BestWeapon();
- W_SetCurrentAmmo();
- self=oldself;
- setmodel(self,"progs/missile.mdl");
- self.angles = self.velocity;
- self.velocity = '0 0 0';
- self.movetype = MOVETYPE_NONE;
- setsize (self, '0 0 0', '0 0 0');
- sound (self, CHAN_WEAPON, "misc/basekey.wav", 1, ATTN_NORM);
- self.dmg_inflictor = self.owner;
- traceline (self.origin, self.origin - self.angles*6000, FALSE, self);
- self.pos1 = trace_endpos;
- self.health = 1200 ; // 3mins
- self.owner = self;
- self.think = W_TripActivate;
- self.nextthink = time + 1.5;
- };
-
- void() W_FireTripBomb =
- {
- local vector dir;
- if (self.ammo_rockets < 5)
- {
- sprint (self, "Need 5 rockets to place tripbomb\n");
- return;
- }
- dir = aim(self,1000);
-
- newmis = spawn ();
- newmis.owner = self;
- newmis.movetype = MOVETYPE_FLYMISSILE;
- newmis.solid = SOLID_BBOX;
- newmis.angles = vectoangles(dir);
- newmis.touch = W_TripWait;
- newmis.classname="tripbomb";
- newmis.takedamage = DAMAGE_NO;
- newmis.think = SUB_Remove;
- newmis.nextthink = time + 0.05;
- setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
- setorigin (newmis, self.origin);
- newmis.velocity = dir * 5000;
- };
-
-
- void(entity targ,entity inflictor, float vel) DamageGib = {
- local entity oldself;
- local float rnum;
- rnum = random();
- if ((vel < 10) || (inflictor.weapon == IT_LIGHTNING)) return;
- oldself=self;
- self=targ;
- if(vel < 50) ThrowGib("progs/gib1.mdl",-2 * vel);
- else if(vel < 90) {
- if(rnum < 0.5){
- ThrowGib("progs/gib1.mdl",-2 * vel);
- ThrowGib("progs/gib1.mdl",-2 * vel);
- } else {
- ThrowGib("progs/gib3.mdl",-2 * vel);
- }
- } else if(vel < 130) {
- ThrowGib("progs/gib1.mdl",-2 * vel);
- ThrowGib("progs/gib3.mdl",-2 * vel);
- } else if(vel < 170) {
- ThrowGib("progs/gib3.mdl",-2 * vel);
- if(rnum < 0.5){
- ThrowGib("progs/gib1.mdl",-2 * vel);
- ThrowGib("progs/gib1.mdl",-2 * vel);
- } else {
- ThrowGib("progs/gib3.mdl",-2 * vel);
- }
- } else if(vel < 210) {
- ThrowGib("progs/gib3.mdl",-2 * vel);
- ThrowGib("progs/gib3.mdl",-2 * vel);
- ThrowGib("progs/gib1.mdl",-2 * vel);
- } else {
- ThrowGib("progs/gib3.mdl",-2 * vel);
- ThrowGib("progs/gib3.mdl",-2 * vel);
- ThrowGib("progs/gib1.mdl",-2 * vel);
- ThrowGib("progs/gib1.mdl",-2 * vel);
- }
- self=oldself;
- };
-
- void() SetAliases = {
- if(newclient==world) return;
- stuffcmd(newclient,"alias INC_SKIN impulse 200\n");
- stuffcmd(newclient,"alias DEC_SKIN impulse 201\n");
- stuffcmd(newclient,"alias OBSERVER impulse 210\n");
- stuffcmd(newclient,"alias UNPLACE impulse 17\n");
- stuffcmd(newclient,"alias DROP_FLAG impulse 18\n");
- stuffcmd(newclient,"alias CYCLE_TEAMPLAY impulse 19\n");
- stuffcmd(newclient,"alias DETONATE impulse 52\n");
- stuffcmd(newclient,"alias DEC_GRENADE_TIMER impulse 53\n");
- stuffcmd(newclient,"alias INC_GRENADE_TIMER impulse 54\n");
- stuffcmd(newclient,"alias TOSS_WEAPON impulse 55\n");
- stuffcmd(newclient,"alias TOSS_AMMO impulse 56\n");
- stuffcmd(newclient,"alias TOSS_ARMOR impulse 57\n");
- stuffcmd(newclient,"alias HOLO impulse 58\n");
- newclient=world;
- };
-
- void(entity targ,entity attacker) CreateZombie = {
- local entity ent;
- setmodel(targ,"progs/gib3.mdl");
- ent=self;
- self=spawn();
- setorigin(self,targ.origin);
- self.solid = SOLID_SLIDEBOX;
- self.movetype = MOVETYPE_STEP;
- setmodel (self, "progs/zombie.mdl");
- setsize (self, '-16 -16 -24', '16 16 40');
- self.friend=attacker;
- self.health = 65;
- self.classname = "monster_zombie";
- self.th_stand = zombie_stand1;
- self.th_walk = zombie_walk1;
- self.th_run = zombie_run1;
- self.th_pain = zombie_pain;
- self.th_die = zombie_die;
- self.th_missile = zombie_missile;
- walkmonster_start_go();
- T_Damage(self,ent,ent,60);
- self=ent;
- };
-
-