mirror of
https://git.code.sf.net/p/quake/prozac-qfcc
synced 2024-11-27 14:32:03 +00:00
05c05180dc
- rename Obit_* to Obituary_* - further cleanups of Obituary_Player. This is about as clean and uniform as it's gonna get.
155 lines
3 KiB
C++
155 lines
3 KiB
C++
/*=============================
|
|
Turrets
|
|
|
|
This file contains all information required
|
|
to handle turrets. Some changes may have
|
|
to be made in Obituary().
|
|
=============================*/
|
|
|
|
float TURRET_INSTANT_FIRE = 1;
|
|
float TURRET_EXPLOSIVE_FIRE = 2;
|
|
|
|
void() turret_scanthink;
|
|
void() turret_attackthink;
|
|
void() turret_fire;
|
|
void() turret_projectiletouch;
|
|
|
|
|
|
void() turret_normal =
|
|
{
|
|
self.solid = SOLID_SLIDEBOX;
|
|
self.movetype = MOVETYPE_NONE;
|
|
|
|
precache_sound("enforcer/enfire.wav");
|
|
|
|
// set the defaults
|
|
if (!(self.model))
|
|
self.model = "progs/v_rock2.mdl";
|
|
|
|
if (!(self.health))
|
|
self.health = -1;
|
|
|
|
if (!(self.search_time))
|
|
self.search_time = 5;
|
|
|
|
if (!(self.speed))
|
|
self.speed = 0.2;
|
|
|
|
if (!(self.dmg))
|
|
self.dmg = 5;
|
|
|
|
self.weaponmodel = "progs/laser.mdl";
|
|
|
|
// if no weapon model, it must be instantaneous fire
|
|
if (!(self.weaponmodel))
|
|
self.spawnflags = self.spawnflags | TURRET_INSTANT_FIRE;
|
|
|
|
if (!(self.ammo_shells))
|
|
self.ammo_shells = -1;
|
|
|
|
if (!(self.currentammo))
|
|
self.currentammo = self.ammo_shells;
|
|
|
|
if (!(self.wait))
|
|
self.wait = -1;
|
|
|
|
if (!(self.lives))
|
|
self.lives = -1;
|
|
|
|
if (!(self.team_no))
|
|
self.team_no = -1;
|
|
|
|
if (!(self.numflames))
|
|
self.numflames = 1;
|
|
|
|
// projectile speed
|
|
if (!(self.aflag))
|
|
self.aflag = 1200;
|
|
|
|
// this is the radius damage done
|
|
if (self.all_active)
|
|
self.spawnflags = self.spawnflags | TURRET_EXPLOSIVE_FIRE;
|
|
|
|
setmodel(self, self.model);
|
|
setorigin(self, self.origin);
|
|
self.nextthink = time + 5; // don't come online for 5 seconds
|
|
self.think = turret_scanthink;
|
|
};
|
|
|
|
// scans for enemies
|
|
// don't do it too often
|
|
void() turret_scanthink =
|
|
{
|
|
local entity search;
|
|
|
|
bprint("t: scanning..\n");
|
|
|
|
search = checkclient();
|
|
|
|
if (visible(search) && search.health > 1)
|
|
{
|
|
// locked onto target
|
|
self.enemy = search;
|
|
self.think = turret_attackthink;
|
|
self.nextthink = 0.1;
|
|
return;
|
|
}
|
|
|
|
self.nextthink = time + self.search_time;
|
|
};
|
|
|
|
// attacks the same enemy repeatedly
|
|
void() turret_attackthink =
|
|
{
|
|
if (visible(self.enemy) && self.enemy.health > 1)
|
|
{
|
|
bprint("t: attacking..\n");
|
|
turret_fire();
|
|
// set angle to face the enemy
|
|
}
|
|
else
|
|
{
|
|
self.think = turret_scanthink;
|
|
}
|
|
|
|
self.nextthink = time + self.speed;
|
|
};
|
|
|
|
// fires the turret
|
|
void() turret_fire =
|
|
{
|
|
|
|
/* if (self.spawnflags & TURRET_INSTANT_FIRE)
|
|
{
|
|
// fire instant weapon
|
|
}
|
|
else
|
|
*/// {
|
|
newmis = spawn();
|
|
sound (self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM);
|
|
|
|
setorigin(newmis, self.origin + dir * 48);
|
|
setmodel(newmis, self.weaponmodel);
|
|
|
|
newmis.movetype = MOVETYPE_FLY;
|
|
newmis.solid = SOLID_BBOX;
|
|
newmis.effects = EF_DIMLIGHT;
|
|
newmis.velocity = normalize(self.enemy.origin - self.origin) * self.aflag;
|
|
newmis.dmg = self.dmg;
|
|
newmis.angles = vectoangles(newmis.velocity);
|
|
newmis.touch = turret_projectiletouch;
|
|
newmis.owner = self;
|
|
newmis.think = SUB_Remove;
|
|
newmis.nextthink = time + 5; // remove projectile after 5 seconds
|
|
// }
|
|
};
|
|
|
|
void() turret_projectiletouch =
|
|
{
|
|
if (other.takedamage)
|
|
{
|
|
T_Damage(other, self, self.owner, self.dmg);
|
|
}
|
|
|
|
remove(self);
|
|
};
|