prozac-qfcc/sniper.qc

182 lines
4.1 KiB
C++

#include "defs.qh"
/*======================================================
SNIPER.QC
TeamFortress v2.5 29/2/97
========================================================
Functions for the SNIPER class and associated weaponry
========================================================*/
// Functions outside this file
// Functions inside this file
void() TeamFortress_SniperWeapon;
// Autozoom functions
void(float zoom_level) TF_zoom;
void() SniperSight_Update;
void() SniperSight_Update2;
void(float type) SniperSight_Create;
//=========================================================================
// Sniper/Auto Rifle selection function
void() TeamFortress_SniperWeapon =
{
self.impulse = 0;
if (self.tfstate & TFSTATE_RELOADING)
return;
if (!((self.weapons_carried & WEAP_SNIPER_RIFLE) && (self.weapons_carried & WEAP_AUTO_RIFLE)))
return;
if (self.ammo_shells < 1)
{ // don't have the ammo
sprint (self, PRINT_HIGH, "not enough ammo.\n");
return;
}
if (self.current_weapon == WEAP_SNIPER_RIFLE)
{
self.current_weapon = WEAP_AUTO_RIFLE;
}
else
{
self.current_weapon = WEAP_SNIPER_RIFLE;
}
W_SetCurrentAmmo ();
};
//=========================================================================
// Do the autozoom of the sniper rifle
void(float zoom_level) TF_zoom =
{
local string zl;
if (self.tfstate & TFSTATE_ZOOMOFF)
return;
zl = ftos(zoom_level);
stuffcmd(self, "fov ");
stuffcmd(self, zl);
stuffcmd(self, "\n");
};
//=========================================================================
// Move the sight to the point the rifle's aiming at
void() SniperSight_Update =
{
local vector org;
if (!(self.owner.tfstate & TFSTATE_AIMING) || (self.owner.current_weapon != WEAP_SNIPER_RIFLE))
{
self.owner.tfstate = self.owner.tfstate - (self.owner.tfstate & TFSTATE_AIMING);
TeamFortress_SetSpeed(self.owner);
self.owner.heat = 0;
dremove(self);
return;
}
makevectors(self.owner.v_angle);
org = self.owner.origin + v_forward*10;
org_z = self.owner.absmin_z + self.owner.size_z * 0.7;
traceline (org, org + v_forward*9192, FALSE, self);
if (trace_fraction == 1.0)
{
setorigin(self, self.owner.origin );
return;
}
self.angles = vectoangles(v_forward);
setorigin(self, trace_endpos);
self.nextthink = time + 0.1;
};
//CH used for the rl
void() SniperSight_Update2 =
{
//bprint(PRINT_HIGH, "Sight Think..\n");
local vector org;
if (!(self.owner.tfstate & TFSTATE_RL_LASER) || (self.owner.current_weapon != WEAP_ROCKET_LAUNCHER))
{
self.owner.tfstate = self.owner.tfstate - (self.owner.tfstate & TFSTATE_RL_LASER);
TeamFortress_SetSpeed(self.owner);
self.owner.heat = 0;
dremove(self);
return;
}
makevectors(self.owner.v_angle);
org = self.owner.origin + v_forward*10;
org_z = self.owner.absmin_z + self.owner.size_z * 0.7;
traceline (org, org + v_forward*9192, FALSE, self);
if (trace_fraction == 1.0)
{
setorigin(self, self.owner.origin );
return;
}
self.angles = vectoangles(v_forward);
setorigin(self, trace_endpos);
self.nextthink = time + 0.1;
};
//=========================================================================
// Create the sight
//CH type 1 = rl
void(float type) SniperSight_Create =
{
local entity sight;
if (type == 1)
self.tfstate = self.tfstate | TFSTATE_RL_LASER;
else
self.tfstate = self.tfstate | TFSTATE_AIMING;
sight = spawn ();
sight.owner = self;
sight.movetype = MOVETYPE_NOCLIP;
sight.solid = SOLID_NOT;
setmodel (sight, "progs/sight.spr");
sight.classname = "timer";
setorigin(sight, self.origin);
if (type == 1)
sight.think = SniperSight_Update2;
else
sight.think = SniperSight_Update;
sight.nextthink = time + 0.05;
};
// this toggles the snipers autozoom on/off
void() TeamFortress_AutoZoomToggle =
{
if (self.tfstate & TFSTATE_ZOOMOFF)
{
self.tfstate = self.tfstate - TFSTATE_ZOOMOFF;
sprint(self, PRINT_HIGH, "autozoom ON\n");
}
else
{
self.tfstate = self.tfstate | TFSTATE_ZOOMOFF;
sprint(self, PRINT_HIGH, "autozoom OFF\n");
}
};
//=========================================================================