home *** CD-ROM | disk | FTP | other *** search
- diff -ur --new-file ../default/weapons.qc ./weapons.qc
- --- ../default/weapons.qc Sun Jul 28 19:03:39 1996
- +++ ./weapons.qc Tue Jul 30 17:47:10 1996
- @@ -6,6 +6,489 @@
- void(vector org, vector vel, float damage) SpawnBlood;
- void() SuperDamageSound;
-
- +/*
- +============
- +Det some pineapples ****
- +============
- +*/
- +void() GrenadeExplode;
- +void() DetGrenades =
- +{
- + local entity head;
- +
- + head = findradius (self.origin, 100000);
- + while(head)
- + {
- + if ( ((head.classname == "grenade") || (head.classname == "agrenade")) && (head.owner == self) )
- + {
- + head.nextthink = time;
- + head.think = GrenadeExplode;
- + }
- + else if ( ((head.classname == "rocket") || (head.classname == "arocket") ) && (head.owner == self) )
- +
- + {
- + head.nextthink = time;
- + head.think = T_MissileTouch;
- + }
- + head = head.chain;
- + }
- +};
- +
- +/*
- +================
- +HomeFindTarget by Vhold
- +returns the closest entity to itself that is killable, not a team member on
- +self's team, ect ect....
- +================
- +*/
- +entity() HomeFindTarget =
- +{
- + local entity head, selected;
- + local float dist;
- + dist = 100000;
- + selected = world;
- + head = findradius(self.origin, 100000);
- + while(head)
- + {
- + 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) )
- + {
- +
- + 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;
- + }
- +
- +/*
- + if (selected != world) // All of this is stuff you can comment out
- + {
- + sprint (self.owner,"Homing->");
- + if (selected.classname == "player")
- + {
- + sprint (self.owner,selected.netname);
- + sprint (selected,self.owner.netname);
- + sprint (selected," has a bogey on you!\n");
- + }
- + else
- + sprint (self.owner,selected.classname);
- + sprint (self.owner,"\n");
- + }
- +*/
- +
- + return selected;
- +};
- +/*
- +===============
- +HomeThink by Vhold
- +The Think function for the Homing Missile
- +===============
- +*/
- +void() HomeThink =
- +{
- + local vector needdir, currdir;
- + local float needspeed, maxspeed, acceleration;
- + local vector temp;
- +
- + traceline(self.origin,self.enemy.origin,TRUE,self);
- +
- + if ( (trace_fraction < 1) || !(self.enemy) || (self.enemy == world) || (self.enemy.health < 1) )
- + self.enemy = HomeFindTarget();
- +
- + if (self.enemy != world) // Arr.. don't be taken on da World!
- + {
- + temp = normalize(self.velocity) * 100;
- + traceline(self.origin,self.origin+temp,TRUE,self);
- + if(trace_fraction < 1)
- + {
- + maxspeed = 200;
- + acceleration = 300;
- + }
- + else
- + {
- + maxspeed = 400;
- + acceleration = 150;
- + }
- + needdir = normalize((self.enemy.origin + '0 0 10') - self.origin);
- + currdir = normalize(self.velocity);
- + self.angles = vectoangles(needdir);
- +
- + needspeed = vlen(needdir - currdir) * acceleration;
- +
- + self.movedir = needdir * needspeed;
- + self.velocity = self.velocity + self.movedir;
- +
- + if ( vlen(self.velocity) > maxspeed )
- + self.velocity = normalize(self.velocity) * maxspeed;
- + self.nextthink = time + 0.1;
- +
- + }
- + else
- + self.nextthink = time + 0.5;
- +
- + self.think=HomeThink;
- +};
- +
- +/*
- +==============
- +FireHomingMissile
- +Fires a Vhold brand homing missile
- +==============
- +*/
- +void() FireHomingMissile =
- +{
- + local entity missile, mpuff;
- +
- + if ((self.ammo_rockets < 5) || !(self.items & IT_ROCKET_LAUNCHER) )
- + {
- + sprint(self,"Homing Missile Needs 5 Rockets\n");
- + return;
- + }
- + self.currentammo = self.ammo_rockets = self.ammo_rockets - 5;
- +
- + sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
- +
- + self.punchangle_x = -2;
- +
- + missile = spawn ();
- + missile.owner = self;
- + missile.movetype = MOVETYPE_FLYMISSILE;
- + missile.solid = SOLID_BBOX;
- + missile.classname = "arocket";
- + missile.health = 1;
- +
- +// set missile speed
- +
- + makevectors (self.v_angle);
- + missile.velocity = aim(self, 1000);
- + missile.velocity = missile.velocity * 400;
- + missile.angles = vectoangles(missile.velocity);
- +
- + missile.touch = T_MissileTouch;
- +
- +// set missile duration
- + missile.nextthink = time + 0.5;
- + missile.think = HomeThink;
- + missile.enemy = world;
- +
- + setmodel (missile, "progs/missile.mdl");
- + setsize (missile, '0 0 0', '0 0 0');
- + setorigin (missile, self.origin + v_forward*8 + '0 0 16');
- +
- + W_SetCurrentAmmo();
- +};
- +
- +/*
- +===============
- +ThorThink by Vhold
- +The Think function for Thor... very similar to the HomeThink
- +===============
- +*/
- +void(vector p1, vector p2, entity from, float damage) LightningDamage;
- +void(vector a, vector b) Bolt;
- +
- +void() ThorThink =
- +{
- + HomeThink();
- +
- + Bolt(self.owner.origin,self.origin);
- + LightningDamage (self.origin, trace_endpos + v_forward*4, self, 30);
- +
- + self.think=ThorThink;
- +};
- +
- +/*
- +================
- +FireThor by Vhold.
- +================
- +*/
- +void(float spd, vector ang, float firstthink) SpawnThor;
- +
- +void() FireThor =
- +{
- + if ((self.ammo_rockets < 20) || (self.ammo_cells < 50))
- + {
- + sprint(self,"Thor demands 20 rockets and 50 cells\n");
- + return;
- + }
- +
- + self.currentammo = self.ammo_rockets = self.ammo_rockets - 20;
- + self.currentammo = self.ammo_cells = self.ammo_cells - 50;
- +
- + SpawnThor(300,self.v_angle,0.5);
- + SpawnThor(200,self.v_angle + '0 15 0',0.75);
- + SpawnThor(200,self.v_angle - '0 15 0',0.75);
- +
- + bprint(self.netname);
- + bprint(" has unleashed Thor!\n");
- +
- + W_SetCurrentAmmo();
- +};
- +
- +void(float spd, vector ang, float firstthink) SpawnThor =
- +{
- + local entity missile, mpuff;
- +
- + sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
- +
- + self.punchangle_x = -2;
- +
- + missile = spawn ();
- + missile.owner = self;
- + missile.classname = "arocket";
- + missile.movetype = MOVETYPE_FLYMISSILE;
- + missile.solid = SOLID_BBOX;
- +
- +
- +// set missile speed
- +
- + missile.v_angle = ang;
- + makevectors(missile.v_angle);
- + missile.velocity = aim(missile,1000);
- + missile.velocity = missile.velocity * spd;
- + missile.angles = vectoangles(missile.velocity);
- +
- + missile.touch = T_MissileTouch;
- +
- +// set missile duration
- + missile.nextthink = time + firstthink;
- + missile.think = ThorThink;
- + missile.enemy = world;
- +
- + setmodel (missile, "progs/missile.mdl");
- + setsize (missile, '0 0 0', '0 0 0');
- + makevectors (self.v_angle);
- + setorigin (missile, self.origin + v_forward*8 + '0 0 16');
- +};
- +
- +/*
- +==========================
- +VholdBackpackTouch
- +This simply makes sure you don't pick up your backpack immediately
- +after throwing it
- +==========================
- +*/
- +
- +void() BackpackTouch;
- +
- +void() VholdBackpackTouch =
- +{
- + if ( (self.owner == other) && ((self.nextthink - time) > 119 ))
- + return;
- +
- + BackpackTouch();
- +};
- +
- +/*
- +=======================
- +ThrowBackpack by Vhold
- +=======================
- +*/
- +void() ThrowBackpack =
- +{
- + local entity item;
- +
- + if ( (self.ammo_shells + self.ammo_nails + self.ammo_rockets + self.ammo_cells) == 0)
- + return;
- +
- + item = spawn();
- +
- + if ( self.ammo_shells >= 20)
- + {
- + item.ammo_shells = 20;
- + self.ammo_shells = self.ammo_shells - 20;
- + }
- + else
- + {
- + item.ammo_shells = self.ammo_shells;
- + self.ammo_shells = 0;
- + }
- +
- + if ( self.ammo_nails >= 20)
- + {
- + item.ammo_nails = 20;
- + self.ammo_nails = self.ammo_nails - 20;
- + }
- + else
- + {
- + item.ammo_nails = self.ammo_nails;
- + self.ammo_nails = 0;
- + }
- +
- + if ( self.ammo_rockets >= 10)
- + {
- + item.ammo_rockets = 10;
- + self.ammo_rockets = self.ammo_rockets - 10;
- + }
- + else
- + {
- + item.ammo_rockets = self.ammo_rockets;
- + self.ammo_rockets = 0;
- + }
- +
- + if (self.ammo_cells >= 20)
- + {
- + item.ammo_cells = 20;
- + self.ammo_cells = self.ammo_cells - 20;
- + }
- + else
- + {
- + item.ammo_cells = self.ammo_cells;
- + self.ammo_cells = 0;
- + }
- +
- + item.owner = self;
- + makevectors(self.v_angle);
- + setorigin(item, self.origin + '0 0 16');
- + item.velocity = aim(self, 1000);
- + item.velocity = item.velocity * 500;
- + item.flags = FL_ITEM;
- + item.solid = SOLID_TRIGGER;
- + item.movetype = MOVETYPE_BOUNCE;
- +
- + setmodel (item, "progs/backpack.mdl");
- + setsize(item, '-16 -16 0', '16 16 56');
- + item.touch = VholdBackpackTouch;
- + item.nextthink = time + 120; // remove after 2 minutes
- + item.think = SUB_Remove;
- +
- + W_SetCurrentAmmo();
- +};
- +
- +/*
- +=================
- +Bolt by Vhold
- +simply creates a lightning bolt that does no damage from vector a
- +to vector b. Any walls WILL stop it
- +=================
- +*/
- +
- +void(vector a, vector b) Bolt =
- +{
- + traceline(a,b,TRUE,self);
- +
- + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- + WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
- + WriteEntity (MSG_BROADCAST, self);
- + WriteCoord (MSG_BROADCAST, a_x);
- + WriteCoord (MSG_BROADCAST, a_y);
- + WriteCoord (MSG_BROADCAST, a_z);
- + WriteCoord (MSG_BROADCAST, trace_endpos_x);
- + WriteCoord (MSG_BROADCAST, trace_endpos_y);
- + WriteCoord (MSG_BROADCAST, trace_endpos_z);
- +};
- +
- +/*
- +==================
- +ProxThink
- +==================
- +*/
- +void() GrenadeExplode;
- +
- +void() ProxThink =
- +{
- + local entity head;
- +
- + if (time >= self.wait)
- + GrenadeExplode();
- +
- + head = findradius(self.origin,160);
- + while(head)
- + {
- + if( (head.classname != "door") && (head.health > 1) && (head.classname != "misc_explobox") &&
- +(head != self) && (head != self.owner) && !(head.items & IT_INVISIBILITY) )
- + {
- + GrenadeExplode();
- + return;
- + }
- + head = head.chain;
- + }
- + self.nextthink = time + 0.25;
- +};
- +
- +/*
- +=================
- +FireProxGrenade
- +=================
- +*/
- +float() crandom;
- +
- +void() FireProxGrenade =
- +{
- + local entity missile, mpuff;
- + if (self.currentammo < 5)
- + {
- + sprint(self,"Requires 5 grenades\n");
- + return;
- + }
- + self.currentammo = self.ammo_rockets = self.ammo_rockets - 5;
- +
- + sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
- +
- + self.punchangle_x = -2;
- +
- + missile = spawn ();
- + missile.owner = self;
- + missile.movetype = MOVETYPE_BOUNCE;
- + missile.solid = SOLID_BBOX;
- + missile.classname = "agrenade";
- +
- +// set missile speed
- +
- + 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 = GrenadeTouch;
- +
- +// set missile duration
- + missile.nextthink = time + 0.75;
- + missile.think = ProxThink;
- +
- + missile.wait = time + 120;
- +
- + setmodel (missile, "progs/grenade.mdl");
- + setsize (missile, '0 0 0', '0 0 0');
- + setorigin (missile, self.origin);
- +};
- +
- +/*
- +==================
- +FireAlternate
- +==================
- +*/
- +void() FireAlternate =
- +{
- + if(self.weapon == IT_ROCKET_LAUNCHER)
- + {
- + FireHomingMissile();
- + self.attack_finished = time + 1.0;
- + }
- + if(self.weapon == IT_GRENADE_LAUNCHER)
- + {
- + FireProxGrenade();
- + self.attack_finished = time + 0.8;
- + }
- + if(self.weapon == IT_LIGHTNING)
- + {
- + FireThor();
- + self.attack_finished = time + 1.0;
- + }
- +};
-
- // called by worldspawn
- void() W_Precache =
- @@ -1169,6 +1652,18 @@
- CycleWeaponCommand ();
- if (self.impulse == 11)
- ServerflagsCommand ();
- +
- + // Vhold's Backpack thing
- + if (self.impulse == 21)
- + ThrowBackpack();
- +
- + // Fire alternate weapon. Lynx & Dumont's idea
- + if (self.impulse == 20)
- + FireAlternate();
- +
- + // D&L's Detonate grenades
- + if (self.impulse == 22)
- + DetGrenades();
-
- if (self.impulse == 255)
- QuadCheat ();
-