Code:
sentrygun()
{
self thread sentrygunrelogio();
if( isDefined(self.turret_gun) && isDefined(self.turret_bip) )
{
self.turret_gun destroy();
self.turret_bip destroy();
self notify("kill_turret");
}
self.gotTurret = false;
self endon("kill_turret");
self endon("joined_spectators");
self endon("disconnect");
self endon("death");
self endon("killed");
self.turret_gun = spawn("script_model", self.origin + (40,0,35));
self.turret_gun setmodel("xmodel/caspi_minigun_head");
self.turret_gun setContents(1);
self.turret_gun.ammo = 200;
self.turret_gun.owner = self;
self.turret_gun thread CheckForPlayers();
self.turret_gun thread moveShoot();
self.turret_bip = spawn("script_model", self.origin+ (40,0,0));
self.turret_bip setmodel("xmodel/sentry_gun_4pod");
self.turret_bip setContents(1);
level.sentryMP=1;
}
CheckForPlayers()
{
self endon("joined_spectators");
self endon("disconnect");
self endon("death");
self endon("killed");
self endon("powerdown");
self endon("kill_turret");
self.targetPlayer = undefined;
while(1)
{
closestDist = undefined;
closestPlayer = undefined;
players = getentarray("player", "classname");
for(i = 0; i < players.size; i++)
{
player = players[i];
if(player.pers["team"] == "axis" && isAlive(player) && player.sessionstate == "playing" && !player.spawnprotected)
{
res = self IsInView(player);
if(res >= 0)
{
if(!isDefined(closestDist) || res < closestDist)
{
closestDist = res;
closestPlayer = player;
}
}
}
}
if(isDefined(closestPlayer))
self.targetPlayer = closestPlayer;
else if(!isDefined(closestPlayer))
self rotateyaw(randomfloat(360),2);
while(isDefined(closestPlayer) && isAlive(closestPlayer) && closestPlayer.sessionstate == "playing" && self IsInView(closestPlayer) >= 0)
{
self.targetPlayer = closestPlayer;
wait 0.05;
}
self.targetPlayer = undefined;
wait 0.2;
}
}
vector_scale (vec, scale){vec = (vec[0] * scale, vec[1] * scale, vec[2] * scale);
return vec;
}
moveShoot()
{
self endon("joined_spectators");
self endon("disconnect");
self endon("death");
self endon("killed");
self endon("powerdown");
self endon("kill_turret");
rotating=-1;
angle=int(self.angles[1])+180;
while(1)
{
while( isDefined(self.targetPlayer) && !self.targetPlayer.spawnprotected && self.ammo > 0 )
{
self.ammo--;
flash = anglesToForward( self.angles );
flash = vector_scale( flash, 43 );
shell = anglesToRight( self.angles );
shell = vector_scale( shell, 7 );
playFx( level.fx_turretflash, self.origin + flash + (0,0,7) );
playFx( level.fx_turretshelleject, self.origin + shell + (0,0,6) );
self playsound("Flak20_fire");
self.targetPlayer thread [[level.callbackPlayerDamage]](self, self.owner, (30 + RandomInt(30)), 0, "MOD_RIFLE_BULLET", "sentry_mp", self.origin, vectornormalize(self.targetPlayer.origin + (0,0,0) - self.origin), "none", 0);
aim = vectortoangles(self.targetPlayer getEye() + (0,0,-10) - self.origin);
self rotateto((aim[0],aim[1] + 0,0), 0.3);
wait 0.2;
if( self.ammo <= 0 )
self notify("ammo_deployed");
}
wait 0.5;
}
}
IsInView(target)
{
dist = distanceSquared(self.origin,target.origin);
if(dist < 400000)
{
tracer = bullettrace(self.origin + (0,0,30) , target getEye() , false, self);
if(tracer["fraction"] == 1)
return dist;
}
return -1;
}
sentrygunrelogio()
{
self.Sentrygun destroy();
self.Sentrygun = newClientHudElem(self);
self.Sentrygun.alignx = "center";
self.Sentrygun.x = 390;
self.Sentrygun.y = 10;
self.Sentrygun.fontscale = 0.9;
self.Sentrygun.label = &"^2S^7entry ^2T^7ime^2:^7";
temposentry=60;
while(1)
{
temposentry-=0.1;
self.Sentrygun setvalue(int(temposentry));
if(temposentry <=0 || self.pers["team"]!="allies" || !isAlive(self) )
{
if(isDefined(self.Sentrygun))self.Sentrygun destroy();
self.turret_bip hide();
self.turret_gun hide();
self.turret_bip playsound("sentrygun_winddown");
self playlocalsound("sentrygun_gone");
self.turret_bip delete();
self.turret_gun delete();
self notify("powerdown");
self.turret_gun notify("powerdown");
level.sentryMP=0;
self thread sentrydelay();
break;
}
wait 0.1;
}
}
sentrydelay()
{
self.sentrydelay=1;
if(isdefined(self.Sentry_huddelay))
self.Sentry_huddelay destroy();
self.Sentry_huddelay = newClientHudElem(self);
self.Sentry_huddelay.alignx = "center";
self.Sentry_huddelay.x = 390;
self.Sentry_huddelay.y = 10;
self.Sentry_huddelay.fontscale = 0.9;
self.Sentry_huddelay.label = &"ER_DELAY_SENTRY";
self.Sentry_huddelay settimer(getcvarint("sv_sentry_delay"));
wait(getcvarint("sv_sentry_delay"));
self.sentrydelay=0;
self.Sentry_huddelay destroy();
}