e8dc38d98a
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1871 fc73d0e0-1445-4013-8a0c-d673dee63da5
264 lines
No EOL
5.6 KiB
C++
264 lines
No EOL
5.6 KiB
C++
void() tesla_think =
|
|
{
|
|
local entity e;
|
|
local vector org;
|
|
|
|
self.nextthink = time + 0.1;
|
|
self.frame = self.frame + 1;
|
|
|
|
if (!self.aflag)
|
|
{
|
|
if (!self.enemy || self.enemy.health <= 0)
|
|
{
|
|
e = findradius(self.origin, 800);
|
|
while (e != world)
|
|
{
|
|
if (e.health > 0)
|
|
{
|
|
if (e.team != self.team)
|
|
{
|
|
if (e.solid)
|
|
{
|
|
if (e.takedamage)
|
|
{
|
|
traceline (self.origin, e.origin, FALSE, self);
|
|
if (trace_ent == e)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
e = e.chain;
|
|
}
|
|
self.enemy = e;
|
|
if (e != world)
|
|
sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
|
|
}
|
|
if (self.enemy)
|
|
{
|
|
if (self.frame < 7)
|
|
self.frame = 7;
|
|
|
|
org = self.origin + '0 0 32';
|
|
|
|
traceline (org, self.enemy.origin, FALSE, self);
|
|
|
|
if (self.t_width < time)
|
|
{
|
|
sound (self, CHAN_WEAPON, "weapons/lhit.wav", 1, ATTN_NORM);
|
|
self.t_width = time + 0.6;
|
|
}
|
|
|
|
//mwa ha ha!!
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_LIGHTNING2);
|
|
WriteEntity (MSG_MULTICAST, self);
|
|
WriteCoord (MSG_MULTICAST, org_x);
|
|
WriteCoord (MSG_MULTICAST, org_y);
|
|
WriteCoord (MSG_MULTICAST, org_z);
|
|
WriteCoord (MSG_MULTICAST, trace_endpos_x);
|
|
WriteCoord (MSG_MULTICAST, trace_endpos_y);
|
|
WriteCoord (MSG_MULTICAST, trace_endpos_z);
|
|
multicast (org, MULTICAST_PHS);
|
|
|
|
if (trace_ent != self.enemy)
|
|
self.enemy = world;
|
|
trace_endpos = normalize(trace_endpos - org)*8 + trace_endpos;
|
|
LightningDamage (self.origin, trace_endpos, self, 10);
|
|
|
|
if (self.frame > 12)
|
|
self.frame = 0;
|
|
return;
|
|
}
|
|
}
|
|
if (self.frame >= 7)
|
|
self.frame = 0;
|
|
};
|
|
|
|
void (float tmp, float dam) turret_mg_fire =
|
|
{
|
|
local vector src;
|
|
local vector dir;
|
|
local vector direction;
|
|
local entity en;
|
|
local vector org;
|
|
|
|
makevectors (self.angles);
|
|
|
|
sound (self, CHAN_WEAPON, "weapons/1911.wav", PLAT_LOW_TRIGGER, ATTN_NORM);
|
|
|
|
src = self.origin + v_forward*10;
|
|
src_z = self.absmin_z + self.size_z * 0.7;
|
|
|
|
en = self.enemy;
|
|
|
|
dir = en.origin - en.velocity*0.2;
|
|
dir = normalize (dir - self.origin);
|
|
|
|
direction = dir;
|
|
|
|
traceline (src, src + direction*2048 + v_right*crandom()*tmp + v_up*crandom()*tmp, FALSE, self);
|
|
|
|
if (trace_fraction == PLAT_LOW_TRIGGER)
|
|
return;
|
|
|
|
if (trace_ent.takedamage)
|
|
{
|
|
dam = 1 + random()*dam + random()*dam;
|
|
dam = dam * (1 - (trace_fraction/2));
|
|
SpawnBlood (org, PLAT_LOW_TRIGGER);
|
|
T_Damage (trace_ent, self, self, dam);
|
|
}
|
|
else
|
|
{
|
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_MULTICAST, TE_SPIKE);
|
|
WriteCoord (MSG_MULTICAST, trace_endpos_x);
|
|
WriteCoord (MSG_MULTICAST, trace_endpos_y);
|
|
WriteCoord (MSG_MULTICAST, trace_endpos_z);
|
|
multicast (trace_endpos, MULTICAST_PVS);
|
|
}
|
|
|
|
muzzleflash();
|
|
};
|
|
|
|
void() GunTop_Think =
|
|
{
|
|
local entity e;
|
|
local vector org;
|
|
local float delta;
|
|
|
|
self.nextthink = time + 0.1;
|
|
|
|
if (self.owner.health < 1)
|
|
{
|
|
remove(self);
|
|
return;
|
|
}
|
|
|
|
setorigin(self, self.owner.origin);
|
|
|
|
if (!self.owner.aflag)
|
|
{
|
|
if (self.attack_finished < time)
|
|
if (!self.enemy || self.enemy.health < 1)
|
|
{
|
|
e = findradius(self.origin, 800);
|
|
while (e != world)
|
|
{
|
|
if (e.health > 0)
|
|
{
|
|
if (e.team != self.owner.team)
|
|
{
|
|
if (e.solid)
|
|
{
|
|
if (e.takedamage)
|
|
{
|
|
traceline (self.origin+'0 0 16', e.origin, FALSE, self);
|
|
if (trace_ent == e)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
e = e.chain;
|
|
}
|
|
self.enemy = e;
|
|
if (e == world)
|
|
self.attack_finished = time + 0.3;
|
|
|
|
}
|
|
if (self.enemy)
|
|
{
|
|
self.ideal_yaw = vectoyaw(self.enemy.origin - self.origin);
|
|
ChangeYaw();
|
|
if (self.attack_finished < time)
|
|
{
|
|
delta = anglemod(self.angles_y - self.ideal_yaw);
|
|
if (delta > 10 && delta < 350)
|
|
return;
|
|
|
|
traceline (self.owner.origin+'0 0 16', self.enemy.origin, FALSE, self.owner);
|
|
if (trace_ent != self.enemy)
|
|
{
|
|
self.enemy = world;
|
|
return;
|
|
}
|
|
|
|
if (self.owner.buildtype == IID_BUILD_RTURRET)
|
|
{
|
|
sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);
|
|
self.attack_finished = time + 0.7;
|
|
newmis = spawn ();
|
|
newmis.owner = self.owner;
|
|
newmis.movetype = MOVETYPE_FLYMISSILE;
|
|
newmis.solid = SOLID_BBOX;
|
|
|
|
// set newmis speed
|
|
newmis.velocity = normalize(self.enemy.origin - self.origin)*1000;
|
|
newmis.angles = vectoangles(newmis.velocity);
|
|
|
|
newmis.touch = T_MissileTouch;
|
|
newmis.voided = 0;
|
|
|
|
// set newmis duration
|
|
newmis.nextthink = time + 5;
|
|
newmis.think = SUB_Remove;
|
|
newmis.classname = "rocket";
|
|
|
|
setmodel (newmis, "progs/missile.mdl");
|
|
setsize (newmis, '0 0 0', '0 0 0');
|
|
setorigin (newmis, self.origin + v_forward*8 + '0 0 16');
|
|
}
|
|
if (self.owner.buildtype == IID_BUILD_GTURRET)
|
|
{
|
|
turret_mg_fire(0.4, 3+random()*4);
|
|
self.attack_finished = time + 0.05;
|
|
self.nextthink = time + 0.05;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
void() FinishTesla =
|
|
{
|
|
self.netname = "tesla turret";
|
|
self.think = tesla_think;
|
|
setmodel (self, "progs/coil.mdl");
|
|
setsize (self, '-16 -16 -24', '16 16 32');
|
|
self.nextthink = time + 0.1;
|
|
};
|
|
void() FinishGunPost =
|
|
{
|
|
local entity top;
|
|
|
|
top = spawn();
|
|
top.owner = self;
|
|
top.think = GunTop_Think;
|
|
top.nextthink = time + 0.1;
|
|
top.yaw_speed = 20;
|
|
if (self.buildtype == IID_BUILD_RTURRET)
|
|
{
|
|
setmodel(top, "progs/turrgun.mdl");
|
|
setmodel(self, "progs/turrbase.mdl");
|
|
}
|
|
else
|
|
{
|
|
setmodel(top, "progs/miniturr.mdl");
|
|
setmodel(self, "progs/minibase.mdl");
|
|
}
|
|
setorigin(top, self.origin);
|
|
top.angles = self.angles;
|
|
};
|
|
void() FinishTurret =
|
|
{
|
|
if (self.buildtype == IID_BUILD_TTURRET)
|
|
FinishTesla();
|
|
else
|
|
FinishGunPost();
|
|
}; |