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 >
Wrap
Text File
|
1996-07-30
|
13KB
|
513 lines
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 ();