nx1-gsc-dump/maps/_trophy_turret.gsc

272 lines
5.6 KiB
Plaintext

#include maps\_vehicle;
#include maps\_utility;
#include maps\_hud_util;
#include maps\_vehicle_aianim;
#include common_scripts\utility;
#using_animtree( "vehicles" );
//*******************************************************************
// *
// *
//*******************************************************************
// Min distance to track projectile.
// tagBK<NOTE> Should be in GDT?
CONST_TROPHY_MAX_DISTANCE = 700;
CONST_MAX_TRACK_TIME_MS = 500;
//*******************************************************************
// *
// *
//*******************************************************************
init( turret_template )
{
self.ownerVehicle.trophy_turret = self;
self.trophy_sound = turret_template.trophy_sound;
if( turret_template.trophy_owner == "vehicle" )
{
self SetSentryOwner( turret_template.ownerVehicle );
}
else
{
self SetSentryOwner( level._player );
}
self setmode( "trophy" );
self.ownerVehicle thread trophy_turret_update();
if( IsDefined( turret_template.trophy_effect ))
{
self.trophy_effect = turret_template.trophy_effect;
}
else
{
self.trophy_effect = undefined;
}
}
//*******************************************************************
// *
// *
//*******************************************************************
find_closest_projectile( pos, current_projectile )
{
projectiles = GetEntArray( "grenade", "classname" );
// Is there a better way to do this?
rockets = GetEntArray( "rocket", "classname" );
foreach ( ent in rockets )
{
projectiles[ projectiles.size ] = ent;
}
min_distance = 999999999999999.0;
return_obj = undefined;
// First check for the current projectile.
if ( isdefined( current_projectile ))
{
foreach ( ent in projectiles )
{
if ( current_projectile == ent )
{
return_obj = ent;
break;
}
}
}
// No dice, find a new one by range.
if ( !isdefined( return_obj ))
{
disallow_trophy_destroy_allies = ( GetDvar( "g_allowTrophyToDestroyAllies" ) == "0" );
foreach ( ent in projectiles )
{
if ( IsDefined( self.script_team ) )
{
// Check team if we need to prevent the trophy from damaging allies.
if ( disallow_trophy_destroy_allies )
{
team = ent MissileGetTeam();
if ( team == self.script_team )
{
continue;
}
else if ( "invalid" == team )
{
// projectiles from vehicles fall under "invalid", so we'll check the team of their owner
team = ent VehicleMissleGetTeam();
if ( team == self.script_team )
{
continue;
}
}
}
}
// Distance.
d = DistanceSquared( ent.origin, pos );
if ( d < min_distance )
{
min_distance = d;
return_obj = ent;
}
}
}
return return_obj;
}
//*******************************************************************
// *
// *
//*******************************************************************
trophy_turret_update()
{
// Exit cases.
self endon( "death" );
// Locals.
turret = self.trophy_turret;
soundorg = Spawn( "script_origin", turret.origin );
soundorg LinkTo( turret );
projectile = undefined;
tracked_time = 0;
// Think.
for( ;; )
{
if ( IsDefined( self.cheap_turrets ) && self.cheap_turrets == true )
{
turret laserForceOff();
return;
}
if ( IsDefined( turret.trophy_effect ))
{
heat_up_effect = getfx( turret.trophy_effect );
}
else
{
heat_up_effect = undefined;
}
// Get target.
prev = projectile;
projectile = find_closest_projectile( self.origin, projectile );
// Timer update.
if ( isdefined( projectile ))
{
// Check for change.
had_change = false;
if ( isdefined( prev ))
{
if ( prev != projectile )
{
had_change = true;
}
}
else
{
had_change = true;
}
// Apply.
if ( had_change )
{
tracked_time = GetTime();
}
else
{
ellapsed_time = GetTime() - tracked_time;
if( ellapsed_time > CONST_MAX_TRACK_TIME_MS )
{
projectile MissileForceTrophyExplode( self );
projectile = undefined;
}
}
}
// Make sure within our min distance.
if( isdefined( projectile ))
{
distance_squared = DistanceSquared( projectile.origin, self.origin );
if ( distance_squared > ( CONST_TROPHY_MAX_DISTANCE * CONST_TROPHY_MAX_DISTANCE ))
{
if( isdefined( projectile.has_effect_on_tag ))
{
if ( IsDefined( heat_up_effect ))
{
stopfxontag( heat_up_effect, projectile, projectile.has_effect_on_tag );
}
projectile.has_effect_on_tag = undefined;
}
projectile = undefined;
}
}
// Lock on. C++ logic will shoot it down.
if( isdefined( projectile ))
{
if( !isdefined( projectile.has_effect_on_tag ))
{
tag = "undefined";
if( projectile DoesTagExistOnEntity( "tag_origin" ) == 1 )
{
tag = "tag_origin";
}
else if( projectile DoesTagExistOnEntity( "tag_weapon" ) == 1 )
{
tag = "tag_weapon";
}
else
{
tag = "origin";
}
if( tag != "undefined" )
{
projectile.has_effect_on_tag = tag;
if ( IsDefined( heat_up_effect ))
{
playfxontag( heat_up_effect, projectile, projectile.has_effect_on_tag );
}
if( IsDefined( turret.trophy_sound ))
{
soundorg PlaySound( turret.trophy_sound );
}
}
}
turret SetTargetEntity( projectile );
turret laserForceOn( projectile );
}
else
{
// Clear target.
turret laserForceOff();
turret ClearTargetEntity();
}
self ent_flag_waitopen( "secondary_turret_override" );
wait( 0.05 );
}
}