home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-09-30 | 49.4 KB | 2,310 lines |
- /*
- */
- void (entity targ, entity inflictor, entity attacker, float damage) T_Damage;
- void () player_run;
- void(entity bomb, entity attacker, float rad, entity ignore) T_RadiusDamage;
- void(vector org, vector vel, float damage) SpawnBlood;
- void() SuperDamageSound;
-
- /*
- #####################
- ### chase cam mod ###
- (start date, more new functions, also lines added in client.qc
- they all are seperated with blank lines and have // ### chase cam mod ###
- lines above them)
- Rob Albin, 09 Sep 96
- orig functions modified:
- none
- orig functions with added code:
- void() W_SetCurrentAmmo =
- void() ImpulseCommands =
- new functions:
- void() Start_chase_cam =
- void() Remove_chase_cam =
- void() Keep_cam_chasing_owner =
- void() Toggle_chase_cam =
- */
-
- // message protocol defines
- float SVC_SETVIEWPORT = 5;
- float SVC_SETVIEWANGLES = 10;
-
- // free player entity variable
- // '.float speed' bit-flag defines:
- float GUIDEDMIS_ON = 16;
- float CHSCAM_ALT = 8;
- float CHSCAM_ON = 4;
- float LASERTARG_LIT = 2;
- float LASERTARG_ON = 1;
-
- // #####################
-
-
- // called by worldspawn
- void() W_Precache =
- {
- precache_sound ("weapons/r_exp3.wav"); // new rocket explosion
- precache_sound ("weapons/rocket1i.wav"); // spike gun
- precache_sound ("weapons/sgun1.wav");
- precache_sound ("weapons/guncock.wav"); // player shotgun
- precache_sound ("weapons/ric1.wav"); // ricochet (used in c code)
- precache_sound ("weapons/ric2.wav"); // ricochet (used in c code)
- precache_sound ("weapons/ric3.wav"); // ricochet (used in c code)
- precache_sound ("weapons/spike2.wav"); // super spikes
- precache_sound ("weapons/tink1.wav"); // spikes tink (used in c code)
- precache_sound ("weapons/grenade.wav"); // grenade launcher
- precache_sound ("weapons/bounce.wav"); // grenade bounce
- precache_sound ("weapons/shotgn2.wav"); // super shotgun
- };
-
- float() crandom =
- {
- return 2*(random() - 0.5);
- };
-
- /*
- ================
- W_FireAxe
- ================
- */
- void() W_FireAxe =
- {
- local vector source;
- local vector org;
-
- makevectors (self.v_angle);
- source = self.origin + '0 0 16';
- traceline (source, source + v_forward*64, FALSE, self);
- if (trace_fraction == 1.0)
- return;
-
- org = trace_endpos - v_forward*4;
-
- if (trace_ent.takedamage)
- {
- trace_ent.axhitme = 1;
- SpawnBlood (org, '0 0 0', 20);
- T_Damage (trace_ent, self, self, 20);
- }
- else
- { // hit wall
- sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM);
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, TE_GUNSHOT);
- WriteCoord (MSG_BROADCAST, org_x);
- WriteCoord (MSG_BROADCAST, org_y);
- WriteCoord (MSG_BROADCAST, org_z);
- }
- };
-
-
- //============================================================================
-
-
- vector() wall_velocity =
- {
- local vector vel;
-
- vel = normalize (self.velocity);
- vel = normalize(vel + v_up*(random()- 0.5) + v_right*(random()- 0.5));
- vel = vel + 2*trace_plane_normal;
- vel = vel * 200;
-
- return vel;
- };
-
-
- /*
- ================
- SpawnMeatSpray
- ================
- */
- void(vector org, vector vel) SpawnMeatSpray =
- {
- local entity missile, mpuff;
- local vector org;
-
- missile = spawn ();
- missile.owner = self;
- missile.movetype = MOVETYPE_BOUNCE;
- missile.solid = SOLID_NOT;
-
- makevectors (self.angles);
-
- missile.velocity = vel;
- missile.velocity_z = missile.velocity_z + 250 + 50*random();
-
- missile.avelocity = '3000 1000 2000';
-
- // set missile duration
- missile.nextthink = time + 1;
- missile.think = SUB_Remove;
-
- setmodel (missile, "progs/zom_gib.mdl");
- setsize (missile, '0 0 0', '0 0 0');
- setorigin (missile, org);
- };
-
- /*
- ================
- SpawnBlood
- ================
- */
- void(vector org, vector vel, float damage) SpawnBlood =
- {
- particle (org, vel*0.1, 73, damage*2);
- };
-
- /*
- ================
- spawn_touchblood
- ================
- */
- void(float damage) spawn_touchblood =
- {
- local vector vel;
-
- vel = wall_velocity () * 0.2;
- SpawnBlood (self.origin + vel*0.01, vel, damage);
- };
-
-
- /*
- ================
- SpawnChunk
- ================
- */
- void(vector org, vector vel) SpawnChunk =
- {
- particle (org, vel*0.02, 0, 10);
- };
-
- /*
- ==============================================================================
-
- MULTI-DAMAGE
-
- Collects multiple small damages into a single damage
-
- ==============================================================================
- */
-
- entity multi_ent;
- float multi_damage;
-
- void() ClearMultiDamage =
- {
- multi_ent = world;
- multi_damage = 0;
- };
-
- void() ApplyMultiDamage =
- {
- if (!multi_ent)
- return;
- T_Damage (multi_ent, self, self, multi_damage);
- };
-
- void(entity hit, float damage) AddMultiDamage =
- {
- if (!hit)
- return;
-
- if (hit != multi_ent)
- {
- ApplyMultiDamage ();
- multi_damage = damage;
- multi_ent = hit;
- }
- else
- multi_damage = multi_damage + damage;
- };
-
- /*
- ==============================================================================
-
- BULLETS
-
- ==============================================================================
- */
-
- /*
- ================
- TraceAttack
- ================
- */
- void(float damage, vector dir) TraceAttack =
- {
- local vector vel, org;
-
- vel = normalize(dir + v_up*crandom() + v_right*crandom());
- vel = vel + 2*trace_plane_normal;
- vel = vel * 200;
-
- org = trace_endpos - dir*4;
-
- if (trace_ent.takedamage)
- {
- SpawnBlood (org, vel*0.2, damage);
- AddMultiDamage (trace_ent, damage);
- }
- else
- {
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, TE_GUNSHOT);
- WriteCoord (MSG_BROADCAST, org_x);
- WriteCoord (MSG_BROADCAST, org_y);
- WriteCoord (MSG_BROADCAST, org_z);
- }
- };
-
- /*
- ================
- FireBullets
-
- Used by shotgun, super shotgun, and enemy soldier firing
- Go to the trouble of combining multiple pellets into a single damage call.
- ================
- */
- void(float shotcount, vector dir, vector spread) FireBullets =
- {
- local vector direction;
- local vector src;
-
- makevectors(self.v_angle);
-
- src = self.origin + v_forward*10;
- src_z = self.absmin_z + self.size_z * 0.7;
-
- ClearMultiDamage ();
- while (shotcount > 0)
- {
- direction = dir + crandom()*spread_x*v_right + crandom()*spread_y*v_up;
-
- traceline (src, src + direction*2048, FALSE, self);
- if (trace_fraction != 1.0)
- TraceAttack (4, direction);
-
- shotcount = shotcount - 1;
- }
- ApplyMultiDamage ();
- };
-
- /*
- ================
- W_FireShotgun
- ================
- */
- void() W_FireShotgun =
- {
- local vector dir;
-
- sound (self, CHAN_WEAPON, "weapons/guncock.wav", 1, ATTN_NORM);
-
- self.punchangle_x = -2;
-
- self.currentammo = self.ammo_shells = self.ammo_shells - 1;
- dir = aim (self, 100000);
- FireBullets (6, dir, '0.04 0.04 0');
- };
-
-
- /*
- ================
- W_FireSuperShotgun
- ================
- */
- void() W_FireSuperShotgun =
- {
- local vector dir;
-
- if (self.currentammo == 1)
- {
- W_FireShotgun ();
- return;
- }
-
- sound (self ,CHAN_WEAPON, "weapons/shotgn2.wav", 1, ATTN_NORM);
-
- self.punchangle_x = -4;
-
- self.currentammo = self.ammo_shells = self.ammo_shells - 2;
- dir = aim (self, 100000);
- FireBullets (14, dir, '0.14 0.08 0');
- };
-
-
- /*
- ==============================================================================
-
- ROCKETS
-
- ==============================================================================
- */
-
- void() s_explode1 = [0, s_explode2] {};
- void() s_explode2 = [1, s_explode3] {};
- void() s_explode3 = [2, s_explode4] {};
- void() s_explode4 = [3, s_explode5] {};
- void() s_explode5 = [4, s_explode6] {};
- void() s_explode6 = [5, SUB_Remove] {};
-
- void() BecomeExplosion =
- {
- self.movetype = MOVETYPE_NONE;
- self.velocity = '0 0 0';
- self.touch = SUB_Null;
- setmodel (self, "progs/s_explod.spr");
- self.solid = SOLID_NOT;
- s_explode1 ();
- };
-
- void() T_MissileTouch =
- {
- local float damg;
-
- if (other == self.owner)
- return; // don't explode on owner
-
- if (pointcontents(self.origin) == CONTENT_SKY)
- {
- remove(self);
- return;
- }
-
- damg = 100 + random()*20;
-
- if (other.health)
- {
- if (other.classname == "monster_shambler")
- damg = damg * 0.5; // mostly immune
- T_Damage (other, self, self.owner, damg );
- }
-
- // don't do radius damage to the other, because all the damage
- // was done in the impact
- T_RadiusDamage (self, self.owner, 120, other);
-
- // sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
- self.origin = self.origin - 8*normalize(self.velocity);
-
- 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 ();
- };
-
-
-
- /*
- ================
- W_FireRocket
- ================
- */
-
- /*
- // ##########################
- // ### Guided missile mod ###
- // Rob Albin, 29 Sep 96
-
- modified original functions:
- void() W_FireRocket =
- void() W_Attack =
- */
-
-
- // original W_FireRocket() function...
- /*
- void() W_FireRocket =
- {
- local entity missile, mpuff;
-
- self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
-
- 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 = "missile";
-
- // set missile speed
-
- makevectors (self.v_angle);
- missile.velocity = aim(self, 1000);
- missile.velocity = missile.velocity * 1000;
- missile.angles = vectoangles(missile.velocity);
-
- missile.touch = T_MissileTouch;
-
- // set missile duration
- missile.nextthink = time + 5;
- missile.think = SUB_Remove;
-
- setmodel (missile, "progs/missile.mdl");
- setsize (missile, '0 0 0', '0 0 0');
- setorigin (missile, self.origin + v_forward*8 + '0 0 16');
- };
- */
-
- // default speed is ~1/3 normal rocket velocity
- float guided_missile_vel = 300;
-
- void() W_SetCurrentAmmo;
-
- float modelindex_eyes, modelindex_player;
-
- // called by player entity
- void() Guided_Mis_owner_vanish =
- {
-
- self.takedamage = DAMAGE_NO;
- self.solid = SOLID_NOT;
- self.movetype = MOVETYPE_NONE;
-
- setmodel (self, "");
- modelindex_eyes = self.modelindex;
- modelindex_player = self.modelindex;
-
- setsize (self, VEC_ORIGIN, VEC_ORIGIN);
-
- /*
- local entity fake;
- fake = spawn();
- fake.owner = e;
-
- fake.takedamage = DAMAGE_NO;
- // fake.takedamage = DAMAGE_AIM;
- fake.health = fake.owner.health;
- fake.solid = SOLID_NOT;
- // fake.solid = SOLID_SLIDEBOX;
- fake.movetype = MOVETYPE_NONE;
- fake.angles = fake.owner.angles;
- fake.fixangle = TRUE; // turn this way immediately
-
- setmodel (fake, "progs/player.mdl");
- setsize (fake, VEC_HULL_MIN, VEC_HULL_MAX);
- setorigin( fake, fake.owner.origin );
-
- fake.nextthink = time + 5;
- fake.think = SUB_Remove;
- */
-
-
- };
-
- // called only by missile entities
- void() Guided_Mis_owner_appear =
- {
- self.owner.takedamage = DAMAGE_AIM;
- self.owner.solid = SOLID_SLIDEBOX;
- self.owner.movetype = MOVETYPE_WALK;
- self.owner.angles_x = self.ammo_shells;
- self.owner.angles_y = self.ammo_nails;
- self.owner.fixangle = TRUE; // turn this way immediately
-
- // oh, this is a hack!
- setmodel (self.owner, "progs/eyes.mdl");
- modelindex_eyes = self.owner.modelindex;
-
- setmodel (self.owner, "progs/player.mdl");
- modelindex_player = self.owner.modelindex;
-
- setsize (self.owner, VEC_HULL_MIN, VEC_HULL_MAX);
-
- };
-
-
- void() GM_WatchExplosionEnd =
- {
- local entity e;
-
- // turn off bit flag
- if ( (self.owner.speed & GUIDEDMIS_ON) )
- self.owner.speed = self.owner.speed - GUIDEDMIS_ON;
-
- Guided_Mis_owner_appear();
- setorigin( self.owner, self.oldorigin );
-
- msg_entity = self.owner; // target of message
- WriteByte (MSG_ONE, SVC_SETVIEWPORT);
- WriteEntity (MSG_ONE, self.owner); // view port
-
- e = self;
- self = self.owner;
- W_SetCurrentAmmo ();
- self = e;
-
- remove( self );
-
- };
-
-
-
- void() GM_WatchExplosion =
- {
- local entity e;
-
- e = spawn();
- e.classname = "missile";
- e.owner = self.owner;
-
- e.solid = SOLID_NOT;
- e.movetype = MOVETYPE_NONE;
-
- setmodel (e, "progs/s_explod.spr");
- setsize (e, '0 0 0', '0 0 0');
- setorigin (e, self.origin);
-
- e.nextthink = time + 0.1;
- e.think = s_explode1;
-
- self.velocity = '0 0 0';
- self.solid = SOLID_NOT;
- self.movetype = MOVETYPE_NONE;
- self.touch = SUB_Null;
-
- makevectors (self.owner.v_angle);
- traceline( self.origin, self.origin - (v_forward * 120), TRUE, self.owner );
- setorigin( self, trace_endpos );
-
- self.nextthink = time + 1;
- self.think = GM_WatchExplosionEnd;
-
- };
-
-
- void() T_Guided_MissileTouch =
- {
- local float damg;
-
- if (other == self.owner)
- return; // don't explode on owner
-
-
- if (pointcontents(self.origin) == CONTENT_SKY)
- {
- GM_WatchExplosionEnd();
- // remove(self);
- return;
- }
-
- damg = 100 + random()*20;
-
- if (other.health)
- {
- if (other.classname == "monster_shambler")
- damg = damg * 0.5; // mostly immune
- T_Damage (other, self, self.owner, damg );
- }
-
- // don't do radius damage to the other, because all the damage
- // was done in the impact
- T_RadiusDamage (self, self.owner, 120, other);
-
- // sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NORM);
- self.origin = self.origin - 8*normalize(self.velocity);
-
- 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);
-
- GM_WatchExplosion();
-
- };
-
- void() Guided_MissileSteer =
- {
- self.nextthink = 0.1;
- makevectors (self.owner.v_angle);
- self.velocity = v_forward * guided_missile_vel;
-
- setorigin( self.owner, self.origin );
- self.angles = vectoangles(self.velocity);
-
- };
-
-
- // opt:
- // TRUE = fire guided missile
- // FALSE = fire standard rocket
- void( float opt ) W_FireRocket =
- {
- local entity missile, mpuff;
-
-
- sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
-
-
- missile = spawn ();
- missile.owner = self;
- missile.movetype = MOVETYPE_FLYMISSILE;
- missile.solid = SOLID_BBOX;
- missile.classname = "missile";
-
- // set missile speed
-
- makevectors (self.v_angle);
-
- if (opt)
- {
- self.currentammo = self.ammo_rockets = self.ammo_rockets - 5;
- missile.velocity = aim(self, guided_missile_vel);
- missile.velocity = missile.velocity * guided_missile_vel;
- missile.touch = T_Guided_MissileTouch;
- missile.nextthink = 0.1;
- missile.think = Guided_MissileSteer;
-
- msg_entity = missile.owner; // target of message
- WriteByte (MSG_ONE, SVC_SETVIEWPORT);
- WriteEntity (MSG_ONE, missile); // view port
-
- self.weaponmodel = "";
- self.weaponframe = 0;
-
- Guided_Mis_owner_vanish();
- missile.oldorigin = missile.owner.origin;
- missile.ammo_shells = missile.owner.angles_x;
- missile.ammo_nails = missile.owner.angles_y;
-
- // turn on bit flag
- self.speed = self.speed | GUIDEDMIS_ON;
- }
- else
- {
- self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
- self.punchangle_x = -2;
- missile.velocity = aim(self, 1000);
- missile.velocity = missile.velocity * 1000;
-
- missile.touch = T_MissileTouch;
-
- // set missile duration
- missile.nextthink = time + 5;
- missile.think = SUB_Remove;
- }
- missile.angles = vectoangles(missile.velocity);
-
- setmodel (missile, "progs/missile.mdl");
- setsize (missile, '0 0 0', '0 0 0');
- setorigin (missile, self.origin + v_forward*8 + '0 0 16');
- };
-
- // called by new impulse
- void() W_FireGuidedMissile =
- {
- if ( (self.speed & CHSCAM_ON) )
- {
- sprint( self, "Not in chase view...\n" );
- return;
- }
- if (! (self.items & IT_ROCKET_LAUNCHER) )
- {
- sprint( self, "No rocket launcher...\n" );
- return;
- }
- if (self.ammo_rockets < 5)
- {
- sprint( self, "Not enough rockets...\n" );
- return;
- }
- if ( (self.speed & GUIDEDMIS_ON) )
- {
- return;
- }
-
- if (! (self.weapon & IT_ROCKET_LAUNCHER) )
- {
- self.weapon = IT_ROCKET_LAUNCHER;
- W_SetCurrentAmmo ();
- }
-
- W_FireRocket( TRUE );
-
- };
-
- // ### Guided missile mod ###
- // ##########################
-
-
- /*
- ===============================================================================
-
- LIGHTNING
-
- ===============================================================================
- */
-
- /*
- =================
- LightningDamage
- =================
- */
- void(vector p1, vector p2, entity from, float damage) LightningDamage =
- {
- 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);
- T_Damage (trace_ent, from, from, damage);
- 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);
- T_Damage (trace_ent, from, from, damage);
- }
- 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);
- T_Damage (trace_ent, from, from, damage);
- }
- };
-
-
- void() W_FireLightning =
- {
- local vector org;
- local float cells;
-
- if (self.ammo_cells < 1)
- {
- 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 - 1;
-
- org = self.origin + '0 0 16';
-
- traceline (org, org + v_forward*600, TRUE, 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);
-
- LightningDamage (self.origin, trace_endpos + v_forward*4, self, 30);
- };
-
-
- //=============================================================================
-
-
- void() GrenadeExplode =
- {
- T_RadiusDamage (self, self.owner, 120, world);
-
- 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() GrenadeTouch =
- {
- if (other == self.owner)
- return; // don't explode on owner
- if (other.takedamage == DAMAGE_AIM)
- {
- GrenadeExplode();
- return;
- }
- sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM); // bounce sound
- if (self.velocity == '0 0 0')
- self.avelocity = '0 0 0';
- };
-
- /*
- ================
- W_FireGrenade
- ================
- */
- void() W_FireGrenade =
- {
- local entity missile, mpuff;
-
- self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
-
- 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 = "grenade";
-
- // 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 + 2.5;
- missile.think = GrenadeExplode;
-
- setmodel (missile, "progs/grenade.mdl");
- setsize (missile, '0 0 0', '0 0 0');
- setorigin (missile, self.origin);
- };
-
-
- //=============================================================================
-
- void() spike_touch;
- void() superspike_touch;
-
-
- /*
- ===============
- launch_spike
-
- Used for both the player and the ogre
- ===============
- */
- void(vector org, vector dir) launch_spike =
- {
- newmis = spawn ();
- newmis.owner = self;
- newmis.movetype = MOVETYPE_FLYMISSILE;
- newmis.solid = SOLID_BBOX;
-
- newmis.angles = vectoangles(dir);
-
- newmis.touch = spike_touch;
- newmis.classname = "spike";
- newmis.think = SUB_Remove;
- newmis.nextthink = time + 6;
- setmodel (newmis, "progs/spike.mdl");
- setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
- setorigin (newmis, org);
-
- newmis.velocity = dir * 1000;
- };
-
- void() W_FireSuperSpikes =
- {
- local vector dir;
- local entity old;
-
- sound (self, CHAN_WEAPON, "weapons/spike2.wav", 1, ATTN_NORM);
- self.attack_finished = time + 0.2;
- self.currentammo = self.ammo_nails = self.ammo_nails - 2;
- dir = aim (self, 1000);
- launch_spike (self.origin + '0 0 16', dir);
- newmis.touch = superspike_touch;
- setmodel (newmis, "progs/s_spike.mdl");
- setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
- self.punchangle_x = -2;
- };
-
- void(float ox) W_FireSpikes =
- {
- local vector dir;
- local entity old;
-
- makevectors (self.v_angle);
-
- if (self.ammo_nails >= 2 && self.weapon == IT_SUPER_NAILGUN)
- {
- W_FireSuperSpikes ();
- return;
- }
-
- if (self.ammo_nails < 1)
- {
- self.weapon = W_BestWeapon ();
- W_SetCurrentAmmo ();
- return;
- }
-
- sound (self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM);
- self.attack_finished = time + 0.2;
- self.currentammo = self.ammo_nails = self.ammo_nails - 1;
- dir = aim (self, 1000);
- launch_spike (self.origin + '0 0 16' + v_right*ox, dir);
-
- self.punchangle_x = -2;
- };
-
-
-
- .float hit_z;
- void() spike_touch =
- {
- local float rand;
- if (other == self.owner)
- return;
-
- if (other.solid == SOLID_TRIGGER)
- return; // trigger field, do nothing
-
- if (pointcontents(self.origin) == CONTENT_SKY)
- {
- remove(self);
- return;
- }
-
- // hit something that bleeds
- if (other.takedamage)
- {
- spawn_touchblood (9);
- T_Damage (other, self, self.owner, 9);
- }
- else
- {
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-
- if (self.classname == "wizspike")
- WriteByte (MSG_BROADCAST, TE_WIZSPIKE);
- else if (self.classname == "knightspike")
- WriteByte (MSG_BROADCAST, TE_KNIGHTSPIKE);
- else
- WriteByte (MSG_BROADCAST, TE_SPIKE);
- WriteCoord (MSG_BROADCAST, self.origin_x);
- WriteCoord (MSG_BROADCAST, self.origin_y);
- WriteCoord (MSG_BROADCAST, self.origin_z);
- }
-
- remove(self);
-
- };
-
- void() superspike_touch =
- {
- local float rand;
- if (other == self.owner)
- return;
-
- if (other.solid == SOLID_TRIGGER)
- return; // trigger field, do nothing
-
- if (pointcontents(self.origin) == CONTENT_SKY)
- {
- remove(self);
- return;
- }
-
- // hit something that bleeds
- if (other.takedamage)
- {
- spawn_touchblood (18);
- T_Damage (other, self, self.owner, 18);
- }
- else
- {
- WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
- WriteByte (MSG_BROADCAST, TE_SUPERSPIKE);
- WriteCoord (MSG_BROADCAST, self.origin_x);
- WriteCoord (MSG_BROADCAST, self.origin_y);
- WriteCoord (MSG_BROADCAST, self.origin_z);
- }
-
- remove(self);
-
- };
-
-
- /*
- ===============================================================================
-
- PLAYER WEAPON USE
-
- ===============================================================================
- */
-
- void() W_SetCurrentAmmo =
- {
- player_run (); // get out of any weapon firing states
-
- self.items = self.items - ( self.items & (IT_SHELLS | IT_NAILS | IT_ROCKETS | IT_CELLS) );
-
- if (self.weapon == IT_AXE)
- {
- self.currentammo = 0;
- self.weaponmodel = "progs/v_axe.mdl";
- self.weaponframe = 0;
- }
- else if (self.weapon == IT_SHOTGUN)
- {
- self.currentammo = self.ammo_shells;
- self.weaponmodel = "progs/v_shot.mdl";
- self.weaponframe = 0;
- self.items = self.items | IT_SHELLS;
- }
- else if (self.weapon == IT_SUPER_SHOTGUN)
- {
- self.currentammo = self.ammo_shells;
- self.weaponmodel = "progs/v_shot2.mdl";
- self.weaponframe = 0;
- self.items = self.items | IT_SHELLS;
- }
- else if (self.weapon == IT_NAILGUN)
- {
- self.currentammo = self.ammo_nails;
- self.weaponmodel = "progs/v_nail.mdl";
- self.weaponframe = 0;
- self.items = self.items | IT_NAILS;
- }
- else if (self.weapon == IT_SUPER_NAILGUN)
- {
- self.currentammo = self.ammo_nails;
- self.weaponmodel = "progs/v_nail2.mdl";
- self.weaponframe = 0;
- self.items = self.items | IT_NAILS;
- }
- else if (self.weapon == IT_GRENADE_LAUNCHER)
- {
- self.currentammo = self.ammo_rockets;
- self.weaponmodel = "progs/v_rock.mdl";
- self.weaponframe = 0;
- self.items = self.items | IT_ROCKETS;
- }
- else if (self.weapon == IT_ROCKET_LAUNCHER)
- {
- self.currentammo = self.ammo_rockets;
- self.weaponmodel = "progs/v_rock2.mdl";
- self.weaponframe = 0;
- self.items = self.items | IT_ROCKETS;
- }
- else if (self.weapon == IT_LIGHTNING)
- {
- self.currentammo = self.ammo_cells;
- self.weaponmodel = "progs/v_light.mdl";
- self.weaponframe = 0;
- self.items = self.items | IT_CELLS;
- }
- else
- {
- self.currentammo = 0;
- self.weaponmodel = "";
- self.weaponframe = 0;
- }
-
- // ### chase cam mod ###
- if ( (self.speed & CHSCAM_ON) )
- {
- self.weaponmodel = "";
- self.weaponframe = 0;
- }
-
- };
-
- float() W_BestWeapon =
- {
- local float it;
-
- it = self.items;
-
- if(self.ammo_cells >= 1 && (it & IT_LIGHTNING) )
- return IT_LIGHTNING;
- else if(self.ammo_nails >= 2 && (it & IT_SUPER_NAILGUN) )
- return IT_SUPER_NAILGUN;
- else if(self.ammo_shells >= 2 && (it & IT_SUPER_SHOTGUN) )
- return IT_SUPER_SHOTGUN;
- else if(self.ammo_nails >= 1 && (it & IT_NAILGUN) )
- return IT_NAILGUN;
- else if(self.ammo_shells >= 1 && (it & IT_SHOTGUN) )
- return IT_SHOTGUN;
-
- /*
- if(self.ammo_rockets >= 1 && (it & IT_ROCKET_LAUNCHER) )
- return IT_ROCKET_LAUNCHER;
- else if(self.ammo_rockets >= 1 && (it & IT_GRENADE_LAUNCHER) )
- return IT_GRENADE_LAUNCHER;
-
- */
-
- return IT_AXE;
- };
-
- float() W_CheckNoAmmo =
- {
- if (self.currentammo > 0)
- return TRUE;
-
- if (self.weapon == IT_AXE)
- return TRUE;
-
- self.weapon = W_BestWeapon ();
-
- W_SetCurrentAmmo ();
-
- // drop the weapon down
- return FALSE;
- };
-
- /*
- ============
- W_Attack
-
- An attack impulse can be triggered now
- ============
- */
- void() player_axe1;
- void() player_axeb1;
- void() player_axec1;
- void() player_axed1;
- void() player_shot1;
- void() player_nail1;
- void() player_light1;
- void() player_rocket1;
-
- void() W_Attack =
- {
- local float r;
-
- // ### guided missile mod ###
- if ( (self.speed & GUIDEDMIS_ON) )
- return;
-
- if (!W_CheckNoAmmo ())
- return;
-
- makevectors (self.v_angle); // calculate forward angle for velocity
- self.show_hostile = time + 1; // wake monsters up
-
- if (self.weapon == IT_AXE)
- {
- sound (self, CHAN_WEAPON, "weapons/ax1.wav", 1, ATTN_NORM);
- r = random();
- if (r < 0.25)
- player_axe1 ();
- else if (r<0.5)
- player_axeb1 ();
- else if (r<0.75)
- player_axec1 ();
- else
- player_axed1 ();
- self.attack_finished = time + 0.5;
- }
- else if (self.weapon == IT_SHOTGUN)
- {
- player_shot1 ();
- W_FireShotgun ();
- self.attack_finished = time + 0.5;
- }
- else if (self.weapon == IT_SUPER_SHOTGUN)
- {
- player_shot1 ();
- W_FireSuperShotgun ();
- self.attack_finished = time + 0.7;
- }
- else if (self.weapon == IT_NAILGUN)
- {
- player_nail1 ();
- }
- else if (self.weapon == IT_SUPER_NAILGUN)
- {
- player_nail1 ();
- }
- else if (self.weapon == IT_GRENADE_LAUNCHER)
- {
- player_rocket1();
- W_FireGrenade();
- self.attack_finished = time + 0.6;
- }
- else if (self.weapon == IT_ROCKET_LAUNCHER)
- {
- player_rocket1();
-
- // ### guided missile mod ###
- // W_FireRocket(); //original line
- W_FireRocket( FALSE );
-
- self.attack_finished = time + 0.8;
- }
- else if (self.weapon == IT_LIGHTNING)
- {
- player_light1();
- self.attack_finished = time + 0.1;
- sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
- }
- };
-
-
-
-
-
- /*
- ============
- W_ChangeWeapon
-
- ============
- */
- void() W_ChangeWeapon =
- {
- local float it, am, fl;
-
- it = self.items;
- am = 0;
-
- if (self.impulse == 1)
- {
- fl = IT_AXE;
- }
- else if (self.impulse == 2)
- {
- fl = IT_SHOTGUN;
- if (self.ammo_shells < 1)
- am = 1;
- }
- else if (self.impulse == 3)
- {
- fl = IT_SUPER_SHOTGUN;
- if (self.ammo_shells < 2)
- am = 1;
- }
- else if (self.impulse == 4)
- {
- fl = IT_NAILGUN;
- if (self.ammo_nails < 1)
- am = 1;
- }
- else if (self.impulse == 5)
- {
- fl = IT_SUPER_NAILGUN;
- if (self.ammo_nails < 2)
- am = 1;
- }
- else if (self.impulse == 6)
- {
- fl = IT_GRENADE_LAUNCHER;
- if (self.ammo_rockets < 1)
- am = 1;
- }
- else if (self.impulse == 7)
- {
- fl = IT_ROCKET_LAUNCHER;
- if (self.ammo_rockets < 1)
- am = 1;
- }
- else if (self.impulse == 8)
- {
- fl = IT_LIGHTNING;
- if (self.ammo_cells < 1)
- am = 1;
- }
-
- self.impulse = 0;
-
- if (!(self.items & fl))
- { // don't have the weapon or the ammo
- sprint (self, "no weapon.\n");
- return;
- }
-
- if (am)
- { // don't have the ammo
- sprint (self, "not enough ammo.\n");
- return;
- }
-
- //
- // set weapon, set ammo
- //
- self.weapon = fl;
- W_SetCurrentAmmo ();
- };
-
- /*
- ============
- CheatCommand
- ============
- */
- void() CheatCommand =
- {
- if (deathmatch || coop)
- return;
-
- self.ammo_rockets = 100;
- self.ammo_nails = 200;
- self.ammo_shells = 100;
- self.items = self.items |
- IT_AXE |
- IT_SHOTGUN |
- IT_SUPER_SHOTGUN |
- IT_NAILGUN |
- IT_SUPER_NAILGUN |
- IT_GRENADE_LAUNCHER |
- IT_ROCKET_LAUNCHER |
- IT_KEY1 | IT_KEY2;
-
- self.ammo_cells = 200;
- self.items = self.items | IT_LIGHTNING;
-
- self.weapon = IT_ROCKET_LAUNCHER;
- self.impulse = 0;
- W_SetCurrentAmmo ();
- };
-
- /*
- ============
- CycleWeaponCommand
-
- Go to the next weapon with ammo
- ============
- */
- void() CycleWeaponCommand =
- {
- local float it, am;
-
- it = self.items;
- self.impulse = 0;
-
- while (1)
- {
- am = 0;
-
- if (self.weapon == IT_LIGHTNING)
- {
- self.weapon = IT_AXE;
- }
- else if (self.weapon == IT_AXE)
- {
- self.weapon = IT_SHOTGUN;
- if (self.ammo_shells < 1)
- am = 1;
- }
- else if (self.weapon == IT_SHOTGUN)
- {
- self.weapon = IT_SUPER_SHOTGUN;
- if (self.ammo_shells < 2)
- am = 1;
- }
- else if (self.weapon == IT_SUPER_SHOTGUN)
- {
- self.weapon = IT_NAILGUN;
- if (self.ammo_nails < 1)
- am = 1;
- }
- else if (self.weapon == IT_NAILGUN)
- {
- self.weapon = IT_SUPER_NAILGUN;
- if (self.ammo_nails < 2)
- am = 1;
- }
- else if (self.weapon == IT_SUPER_NAILGUN)
- {
- self.weapon = IT_GRENADE_LAUNCHER;
- if (self.ammo_rockets < 1)
- am = 1;
- }
- else if (self.weapon == IT_GRENADE_LAUNCHER)
- {
- self.weapon = IT_ROCKET_LAUNCHER;
- if (self.ammo_rockets < 1)
- am = 1;
- }
- else if (self.weapon == IT_ROCKET_LAUNCHER)
- {
- self.weapon = IT_LIGHTNING;
- if (self.ammo_cells < 1)
- am = 1;
- }
-
- if ( (it & self.weapon) && am == 0)
- {
- W_SetCurrentAmmo ();
- return;
- }
- }
-
- };
-
- /*
- ============
- CycleWeaponReverseCommand
-
- Go to the prev weapon with ammo
- ============
- */
- void() CycleWeaponReverseCommand =
- {
- local float it, am;
-
- it = self.items;
- self.impulse = 0;
-
- while (1)
- {
- am = 0;
-
- if (self.weapon == IT_LIGHTNING)
- {
- self.weapon = IT_ROCKET_LAUNCHER;
- if (self.ammo_rockets < 1)
- am = 1;
- }
- else if (self.weapon == IT_ROCKET_LAUNCHER)
- {
- self.weapon = IT_GRENADE_LAUNCHER;
- if (self.ammo_rockets < 1)
- am = 1;
- }
- else if (self.weapon == IT_GRENADE_LAUNCHER)
- {
- self.weapon = IT_SUPER_NAILGUN;
- if (self.ammo_nails < 2)
- am = 1;
- }
- else if (self.weapon == IT_SUPER_NAILGUN)
- {
- self.weapon = IT_NAILGUN;
- if (self.ammo_nails < 1)
- am = 1;
- }
- else if (self.weapon == IT_NAILGUN)
- {
- self.weapon = IT_SUPER_SHOTGUN;
- if (self.ammo_shells < 2)
- am = 1;
- }
- else if (self.weapon == IT_SUPER_SHOTGUN)
- {
- self.weapon = IT_SHOTGUN;
- if (self.ammo_shells < 1)
- am = 1;
- }
- else if (self.weapon == IT_SHOTGUN)
- {
- self.weapon = IT_AXE;
- }
- else if (self.weapon == IT_AXE)
- {
- self.weapon = IT_LIGHTNING;
- if (self.ammo_cells < 1)
- am = 1;
- }
-
- if ( (it & self.weapon) && am == 0)
- {
- W_SetCurrentAmmo ();
- return;
- }
- }
-
- };
-
- /*
- ============
- ServerflagsCommand
-
- Just for development
- ============
- */
- void() ServerflagsCommand =
- {
- serverflags = serverflags * 2 + 1;
- };
-
- void() QuadCheat =
- {
- if (deathmatch || coop)
- return;
- self.super_time = 1;
- self.super_damage_finished = time + 30;
- self.items = self.items | IT_QUAD;
- dprint ("quad cheat\n");
- };
-
- // #####################
- // ### chase cam mod ###
- // main code block
-
- void() Keep_cam_chasing_owner;
- void( float opt ) Remove_chase_cam;
-
- // defaults reset every time level starts
- float chasecam_alt, chasecam_dist = 72, chasecam_zofs = 24;
-
-
- // Resets weapon model after changing view
- // called by chase cam or player entities
- void( entity player_ent ) Chase_cam_setweapon =
- {
- local entity e;
-
- e = self;
- self = player_ent;
- W_SetCurrentAmmo ();
- self = e;
- };
-
- // called either by player or chase cam entities (to restart)
- void( entity cam_owner ) Start_chase_cam =
- {
-
- local entity chase_cam;
-
- chase_cam = spawn();
-
- chase_cam.owner=cam_owner;
-
- // turn on bit-flag
- chase_cam.owner.speed = chase_cam.owner.speed | CHSCAM_ON;
-
- chase_cam.solid = SOLID_NOT;
- chase_cam.movetype = MOVETYPE_FLYMISSILE;
-
-
- chase_cam.angles = chase_cam.owner.angles;
-
- setmodel (chase_cam, "progs/eyes.mdl" );
- setsize (chase_cam, '0 0 0', '0 0 0');
- setorigin( chase_cam, chase_cam.owner.origin );
- chase_cam.classname = "chase_cam";
-
- chase_cam.nextthink = time + 0.1;
- chase_cam.think = Keep_cam_chasing_owner;
-
- msg_entity = chase_cam.owner; // target of message
- WriteByte (MSG_ONE, SVC_SETVIEWPORT);
- WriteEntity (MSG_ONE, chase_cam); // view port
-
- Chase_cam_setweapon( cam_owner );
-
- // distance clipping
- chase_cam.ammo_shells = chasecam_dist;
- // offset choice
- chase_cam.ammo_cells = 0;
-
- };
-
- // secondary think for cam entities
- void() Reable_chase_cam =
- {
- self.nextthink = time + 0.1;
-
- // debug
- // sprint( self.owner, "Reable_chase_cam was called\n" );
-
- // clears bug of not being able to hit fire to restart
- // after dying in water
- if (self.owner.health <= 0)
- {
- remove( self );
- return;
- }
-
- if ( self.owner.waterlevel )
- return;
-
- Start_chase_cam( self.owner );
- remove( self );
-
- };
-
- // called only by chase cam entities
- // opt values
- // TRUE = remove completely
- // FALSE = remove view but keep alive with Reable_chase_cam();
- void( float opt ) Remove_chase_cam =
- {
- // turn off bit-flag
- if ( (self.owner.speed & CHSCAM_ON) )
- self.owner.speed = self.owner.speed - CHSCAM_ON;
-
- // makes entity appear gone even if going into keep alive state
- setmodel( self, "" );
- self.velocity = '0 0 0';
-
- // set view-point back to normal
- msg_entity = self.owner; // target of message
- WriteByte (MSG_ONE, SVC_SETVIEWPORT);
- WriteEntity (MSG_ONE, self.owner); // view port
-
- Chase_cam_setweapon( self.owner );
-
- if ( !opt )
- {
- self.nextthink = time + 0.1;
- self.think = Reable_chase_cam;
- }
- else
- remove( self );
-
- };
-
- /*
- ###########
- main think function for cam entities
- self.ammo_shells = distance clipping
- self.ammo_nails = hang-up flag
- ###########
- */
-
- void() Alt_cam_chasing_owner;
-
- void() Keep_cam_chasing_owner =
- {
- local vector goal, dir;
- local float dist, cap,
- f_f;
-
- self.nextthink = time + 0.1;
-
- // check if player toggled
- // or in water
- if ( (self.owner.speed & CHSCAM_ALT))
- {
- self.think = Alt_cam_chasing_owner;
- return;
- }
-
- if ( self.owner.waterlevel )
- {
- if (self.owner.health > 0)
- {
- Remove_chase_cam( FALSE );
- return;
- }
- }
-
- // get player velocity relative to player's
- // current yaw
- // f_f (based on running calcs (maxspeed = 400)
- // (back ~= 640, forward ~= 0)
- dir_y = self.owner.v_angle_y;
- makevectors( dir );
- f_f = vlen( (v_forward * 320) - self.owner.velocity );
-
- // held for use after second makevectors call for
- // v_forward based only on yaw
- dir = v_forward;
-
- /*
- local string s;
- sprint( self.owner, "\n\n f_f = " );
- s = ftos( f_f );
- sprint( self.owner, s );
- sprint( self.owner, "\n f_r = " );
- s = ftos( f_r );
- sprint( self.owner, s );
- sprint( self.owner, "\n" );
- */
-
- makevectors( self.owner.v_angle );
-
- // set spot before clipping
- goal = self.owner.origin - (v_forward * self.ammo_shells);
-
- if (self.owner.v_angle_x > 16)
- {
- // dir is first v_forward based on yaw only
- goal = goal + (dir * (self.owner.v_angle_x - 16) );
- cap = chasecam_zofs - ((self.owner.v_angle_x - 16) * 0.3);
- if (cap < 0) cap = 0;
- goal_z = goal_z + cap;
- }
- else
- goal_z = goal_z + chasecam_zofs;
-
- traceline (self.owner.origin, goal, FALSE, self.owner);
-
- // avoids most hang-ups along walls
- goal = trace_endpos + ( v_forward * 2 );
-
- // for fading from walls and up-aim auto rising
- self.ammo_shells = 8 + vlen(trace_endpos - self.owner.origin);
-
-
- // clip from ceiling if too close
- traceline (goal, goal + '0 0 32', FALSE, self.owner );
- if (trace_fraction < 1 )
- {
- dir = trace_endpos - '0 0 32';
-
- traceline (goal, goal - '0 0 32', FALSE, self.owner );
- if (trace_fraction == 1)
- goal = dir;
- }
-
-
- dir = normalize(goal - self.origin);
- dist = vlen(goal - self.origin);
-
- traceline( self.origin, goal, FALSE, self.owner );
- if ( trace_fraction == 1 )
- {
- self.angles = self.owner.angles;
-
- cap = dist * 0.2;
-
- if (cap > 5.2)
- self.velocity = dir * dist * 5.2;
- else if (cap > 1)
- self.velocity = dir * dist * cap;
- else
- self.velocity = dir * dist;
-
- // tighten up if owner running backwards
- if ( f_f > 560)
- {
- self.velocity = self.velocity * 2;
- }
-
- }
- else
- setorigin( self, goal );
-
- // fade back from walls
- self.ammo_shells = self.ammo_shells + 4;
- if (self.ammo_shells > chasecam_dist)
- self.ammo_shells = chasecam_dist;
-
- // respawn if missile ent. get's hung up
- if( self.oldorigin == self.origin )
- {
- if( dist > 30 )
- self.ammo_nails = self.ammo_nails + 1;
-
- }
- if( self.ammo_nails > 3 )
- {
- Start_chase_cam( self.owner );
- remove( self );
- return;
- }
- self.oldorigin = self.origin;
-
- };
-
- /*
- ###############
- self.ammo_cells = view offset direction
- 0 = up
- 1 = left
- 2 = right
- ###############
- */
- void() Alt_cam_chasing_owner =
- {
- local vector goal, dir;
- local float dist, cap,
- f_f, f_r;
-
- self.nextthink = time + 0.1;
-
- // check if player toggled
- // or in water
- if (! (self.owner.speed & CHSCAM_ON))
- {
- if( (self.owner.speed & CHSCAM_ALT) )
- self.owner.speed = self.owner.speed - CHSCAM_ALT;
- Remove_chase_cam( TRUE );
- return;
- }
-
- if ( self.owner.waterlevel )
- {
- if (self.owner.health > 0)
- {
- Remove_chase_cam( FALSE );
- return;
- }
- }
-
- // get player velocity relative to player's
- // current yaw
- // f_f (based on running calcs (maxspeed = 400)
- // (back ~= 640, forward ~= 0)
- // f_r
- // (left ~= 640, right ~= 0)
- dir_y = self.owner.v_angle_y;
- makevectors( dir );
- f_f = vlen( (v_forward * 320) - self.owner.velocity );
- f_r = vlen( (v_right * 320) - self.owner.velocity );
-
- // held for use after second makevectors call for
- // v_forward based only on yaw
- dir = v_forward;
-
- /*
- local string s;
- sprint( self.owner, "\n\n f_f = " );
- s = ftos( f_f );
- sprint( self.owner, s );
- sprint( self.owner, "\n f_r = " );
- s = ftos( f_r );
- sprint( self.owner, s );
- sprint( self.owner, "\n" );
- */
-
- if (f_f < 160 || self.owner.v_angle_x < -45)
- self.ammo_cells = 0;
- else if (f_r < 80)
- self.ammo_cells = 1;
- else if (f_r > 560)
- self.ammo_cells = 2;
-
-
- makevectors( self.owner.v_angle );
-
- // set spot before clipping
- goal = self.owner.origin - (v_forward * self.ammo_shells);
-
- if (!self.ammo_cells)
- {
- if (self.owner.v_angle_x > 16)
- {
- // dir is first v_forward based on yaw only
- goal = goal + (dir * (self.owner.v_angle_x - 16) );
- cap = chasecam_zofs - ((self.owner.v_angle_x - 16) * 0.3);
- if (cap < 0) cap = 0;
- goal_z = goal_z + cap;
- }
- else
- goal_z = goal_z + chasecam_zofs;
- }
- else if (self.ammo_cells == 1)
- goal = goal - (v_right * (chasecam_zofs));
- else
- goal = goal + (v_right * (chasecam_zofs));
-
-
- traceline (self.owner.origin, goal, FALSE, self.owner);
-
- // avoids most hang-ups along walls
- goal = trace_endpos + ( v_forward * 2 );
-
- // for fading from walls and up-aim auto rising
- self.ammo_shells = 8 + vlen(trace_endpos - self.owner.origin);
-
-
- // clip from ceiling if too close
- traceline (goal, goal + '0 0 32', FALSE, self.owner );
- if (trace_fraction < 1 )
- {
- dir = trace_endpos - '0 0 32';
-
- traceline (goal, goal - '0 0 32', FALSE, self.owner );
- if (trace_fraction == 1)
- goal = dir;
- }
-
-
- dir = normalize(goal - self.origin);
- dist = vlen(goal - self.origin);
-
- traceline( self.origin, goal, FALSE, self.owner );
- if ( trace_fraction == 1 )
- {
- self.angles = self.owner.angles;
-
- cap = dist * 0.2;
-
- if (cap > 5.2)
- self.velocity = dir * dist * 5.2;
- else if (cap > 1)
- self.velocity = dir * dist * cap;
- else
- self.velocity = dir * dist;
-
- // tighten up if owner running backwards
- if ( f_f > 560)
- {
- self.velocity = self.velocity * 2;
- }
-
- }
- else
- setorigin( self, goal );
-
- // fade back from walls
- self.ammo_shells = self.ammo_shells + 4;
- if (self.ammo_shells > chasecam_dist)
- self.ammo_shells = chasecam_dist;
-
- // respawn if missile ent. get's hung up
- if( self.oldorigin == self.origin )
- {
- if( dist > 30 )
- self.ammo_nails = self.ammo_nails + 1;
-
- }
- if( self.ammo_nails > 3 )
- {
- Start_chase_cam( self.owner );
- remove( self );
- return;
- }
- self.oldorigin = self.origin;
-
- };
-
-
- // called by player only
- void() Toggle_chase_cam =
- {
-
- if (self.waterlevel)
- return;
-
- // don't activate if currently flying a missile
- if ( (self.speed & GUIDEDMIS_ON) )
- return;
-
- if( (self.speed & CHSCAM_ON) )
- {
- // will be noticed by next think
- // of player's chase cam entity
-
- if( (self.speed & CHSCAM_ALT) )
- {
- self.speed = self.speed - CHSCAM_ALT;
- self.speed = self.speed - CHSCAM_ON;
- }
- else
- {
- sprint( self, "View tracking: strafing\n" );
- self.speed = self.speed | CHSCAM_ALT;
- }
- }
- else
- Start_chase_cam( self );
-
- };
-
- ////////////////////////////////////////////
- // laser targeter functions
-
- // targeter ent. think function
-
- void() LaserTargeterTrack = {
- local vector src;
-
- if (! (self.owner.speed & LASERTARG_ON))
- {
- if( (self.owner.speed & LASERTARG_LIT) )
- {
- self.owner.speed = self.owner.speed | LASERTARG_ON;
- self.effects = self.effects | EF_DIMLIGHT;
- }
- else
- {
- remove( self );
- return;
- }
- }
-
- makevectors( self.owner.v_angle );
-
- src = self.owner.origin + v_forward * 10;
- src_z = self.owner.absmin_z + self.owner.size_z * 0.7;
-
- traceline( src, src + v_forward * 2048, FALSE, self.owner);
-
- setorigin( self, (0.1 * src + 0.9 * trace_endpos) );
-
- self.nextthink = time + 0.05;
-
- };
-
- void( entity targ_owner ) LaserTargeterToggle =
- {
-
- local entity e;
-
- if( (targ_owner.speed & LASERTARG_ON) )
- {
- if( (targ_owner.speed & LASERTARG_LIT) )
- targ_owner.speed = targ_owner.speed - LASERTARG_LIT;
- else
- targ_owner.speed = targ_owner.speed | LASERTARG_LIT;
-
- targ_owner.speed = targ_owner.speed - LASERTARG_ON;
- }
- else
- {
- targ_owner.speed = targ_owner.speed | LASERTARG_ON;
-
- e = spawn();
- e.owner = targ_owner;
-
- e.movetype = MOVETYPE_NONE;
- e.solid = SOLID_NOT;
-
- setmodel( e, "progs/s_bubble.spr" );
- setsize( e, VEC_ORIGIN, VEC_ORIGIN );
- setorigin( e, e.owner.origin );
-
- if( (e.owner.speed & LASERTARG_LIT) )
- e.effects = e.effects | EF_DIMLIGHT;
-
- e.nextthink = time + 0.1;
- e.think = LaserTargeterTrack;
-
- }
-
- };
- ////////////////////////////////////////////
-
-
- void() Chase_cam_lvlstart_think =
- {
-
- local string s;
-
- if ( (self.owner.speed & CHSCAM_ON) )
- Start_chase_cam( self.owner );
- if ( (self.owner.speed & LASERTARG_ON) )
- {
- self.owner.speed = self.owner.speed - LASERTARG_ON;
- LaserTargeterToggle( self.owner );
- }
-
- remove( self );
-
- };
-
-
- // called in CLIENT.QC by void() PutClientInServer
- // player.speed is set and saved between levels using parm16
- // in CLIENT.QC
- void() Chase_cam_level_start =
- {
-
- local entity e;
-
- e = spawn();
- e.owner = self;
-
- e.movetype = MOVETYPE_NONE;
- e.solid = SOLID_NOT;
-
- setmodel( e, "" );
- setsize( e, VEC_ORIGIN, VEC_ORIGIN );
- setorigin( e, e.owner.origin );
-
- e.nextthink = time + 0.2;
- e.think = Chase_cam_lvlstart_think;
-
- };
-
-
- // ### chase cam mod ###
- // #####################
-
-
-
-
- // ######################
- // ### Multiskin v1.1 ###
-
- void( float imp ) Choose_multiskin =
- {
- if (imp == 200)
- {
- self.skin = self.skin + 1;
- if (self.skin == 19)
- self.skin = 0;
- }
- else
- {
- self.skin = self.skin - 1;
- if (self.skin == -1)
- self.skin = 18;
- }
-
- if (self.skin == 0)
- centerprint(self, "SKIN: the Good Guy Himself (1)");
- else if (self.skin == 1)
- centerprint(self, "SKIN: Duke Nukem 3d (2)");
- else if (self.skin == 2)
- centerprint(self, "SKIN: Mr. Toad (3)");
- else if (self.skin == 3)
- centerprint(self, "SKIN: the Stormtrooper (4)");
- else if (self.skin == 4)
- centerprint(self, "SKIN: Max (5)");
- else if (self.skin == 5)
- centerprint(self, "SKIN: the Terminator (6)");
- else if (self.skin == 6)
- centerprint(self, "SKIN: Judge Dredd (7)");
- else if (self.skin == 7)
- centerprint(self, "SKIN: Camouflaged soldier (8)");
- else if (self.skin == 8)
- centerprint(self, "SKIN: Captain Picard (9)");
- else if (self.skin == 9)
- centerprint(self, "SKIN: the Wizzard (10)");
- else if (self.skin == 10)
- centerprint(self,"SKIN: the Predator (11)");
- else if (self.skin == 11)
- centerprint(self,"SKIN: Skeleton (12)");
- else if (self.skin == 12)
- centerprint(self,"SKIN: Wan-Fu (13)");
- else if (self.skin == 13)
- centerprint(self,"SKIN: Henry Rollins (14)");
- else if (self.skin == 14)
- centerprint(self,"SKIN: He-Man (15)");
- else if (self.skin == 15)
- centerprint(self,"SKIN: Boba (16)");
- else if (self.skin == 16)
- centerprint(self,"SKIN: Superman (17)");
- else if (self.skin == 17)
- centerprint(self,"SKIN: NYPD Cop (18)");
- else if (self.skin == 18)
- centerprint(self,"SKIN: Red/Yellow women dude (19)");
- };
-
- // ### Multiskin v1.1 ###
- // ######################
-
-
-
- /*
- ============
- ImpulseCommands
-
- ============
- */
- void() ImpulseCommands =
- {
- if (self.impulse >= 1 && self.impulse <= 8)
- W_ChangeWeapon ();
-
- if (self.impulse == 9)
- CheatCommand ();
- if (self.impulse == 10)
- CycleWeaponCommand ();
- if (self.impulse == 11)
- ServerflagsCommand ();
- if (self.impulse == 12)
- CycleWeaponReverseCommand ();
-
- // ### chase cam mods ###
- if ( self.impulse == 30)
- Toggle_chase_cam(); // Toggle view
- if ( self.impulse == 31) // laser targeter toggle
- LaserTargeterToggle( self );
-
- // ### guided missile mod ###
- if ( self.impulse == 32) // guided missile fire
- W_FireGuidedMissile();
-
- // ### Multiskin v1.1 ###
- if ( self.impulse == 200 || self.impulse == 201 )
- Choose_multiskin( self.impulse );
-
- if (self.impulse == 255)
- QuadCheat ();
-
- self.impulse = 0;
- };
-
- /*
- ============
- W_WeaponFrame
-
- Called every frame so impulse events can be handled as well as possible
- ============
- */
- void() W_WeaponFrame =
- {
- if (time < self.attack_finished)
- return;
-
- ImpulseCommands ();
-
- // check for attack
- if (self.button0)
- {
- SuperDamageSound ();
- W_Attack ();
- }
- };
-
- /*
- ========
- SuperDamageSound
-
- Plays sound if needed
- ========
- */
- void() SuperDamageSound =
- {
- if (self.super_damage_finished > time)
- {
- if (self.super_sound < time)
- {
- self.super_sound = time + 1;
- sound (self, CHAN_BODY, "items/damage3.wav", 1, ATTN_NORM);
- }
- }
- return;
- };
-
-
-