mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-09-23 00:46:39 +00:00
Init
This commit is contained in:
226
maps/mp/_mp_trophy_turret.gsc
Normal file
226
maps/mp/_mp_trophy_turret.gsc
Normal file
@@ -0,0 +1,226 @@
|
||||
#include maps\mp\_utility;
|
||||
#include maps\mp\gametypes\_hud_util;
|
||||
#include common_scripts\utility;
|
||||
|
||||
//*******************************************************************
|
||||
// *
|
||||
// *
|
||||
//*******************************************************************
|
||||
// Min distance to start to track projectile.
|
||||
CONST_TROPHY_MAX_TRACK_DISTANCE = 500;
|
||||
CONST_MAX_TRACK_TIME_MS = 500;
|
||||
TROPHY_SOUND_AFTER_COOLDOWN = "weap_recharge_stop";
|
||||
TROPHY_RELOAD_TIME_SEC = 3.0;
|
||||
TROPHY_ACTIVE_RADIUS = 400.0;
|
||||
TROPHY_INACTIVE_RADIUS = 200.0;
|
||||
TROPHY_TABLE_FILE = "mp/trophyTable.csv";
|
||||
|
||||
//*******************************************************************
|
||||
// *
|
||||
// *
|
||||
//*******************************************************************
|
||||
find_closest_projectile( pos, current_projectile, friendlyTeam )
|
||||
{
|
||||
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 ))
|
||||
{
|
||||
|
||||
foreach ( ent in projectiles )
|
||||
{
|
||||
team = ent MissileGetTeam();
|
||||
if ( "invalid" == team )
|
||||
{
|
||||
// projectiles from vehicles fall under "invalid", so we'll check the team of their owner
|
||||
team = ent VehicleMissleGetTeam();
|
||||
}
|
||||
|
||||
// team check
|
||||
if( isDefined( friendlyTeam ))
|
||||
{
|
||||
if( team == friendlyTeam )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if( isDefined( ent.type ))
|
||||
{
|
||||
if( ent.type == "remote" )
|
||||
{
|
||||
// remote missile, those are ok
|
||||
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.
|
||||
soundEnt = self;
|
||||
turret = self.trophy_turret;
|
||||
if( isDefined( turret ))
|
||||
{
|
||||
soundEnt = turret;
|
||||
}
|
||||
|
||||
soundorg = Spawn( "script_origin", soundEnt.origin );
|
||||
soundorg LinkTo( soundEnt );
|
||||
|
||||
projectile = undefined;
|
||||
|
||||
tracked_time = 0;
|
||||
self.trophyLastFireTime = 0;
|
||||
|
||||
// Think.
|
||||
for( ;; )
|
||||
{
|
||||
wait( 0.05 );
|
||||
//println( "update" );
|
||||
friendlyTeam = undefined;
|
||||
// this is a escort plus check
|
||||
if( isDefined( self.curr_owner ))
|
||||
{
|
||||
// if the current owner is neutral, trophy system is off
|
||||
if( self.curr_owner == "neutral" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if( isDefined( game[self.curr_owner] ))
|
||||
{
|
||||
friendlyTeam = game[self.curr_owner];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
friendlyTeam = self.owner.team;
|
||||
}
|
||||
|
||||
//println( "friendly team is ", friendlyTeam );
|
||||
|
||||
// Get target.
|
||||
prev = projectile;
|
||||
projectile = find_closest_projectile( self.origin, projectile, friendlyTeam );
|
||||
|
||||
if ( isdefined( projectile ))
|
||||
{
|
||||
//println( "got projectile" );
|
||||
distance_squared = DistanceSquared( projectile.origin, self.origin );
|
||||
if ( distance_squared < ( CONST_TROPHY_MAX_TRACK_DISTANCE * CONST_TROPHY_MAX_TRACK_DISTANCE ))
|
||||
{
|
||||
canFire = false;
|
||||
if( TROPHY_RELOAD_TIME_SEC * 1000 < getTime() - self.trophyLastFireTime )
|
||||
{
|
||||
canFire = true;
|
||||
}
|
||||
inRange = false;
|
||||
if( distance_squared < TROPHY_ACTIVE_RADIUS * TROPHY_ACTIVE_RADIUS )
|
||||
{
|
||||
if( distance_squared > TROPHY_INACTIVE_RADIUS * TROPHY_INACTIVE_RADIUS )
|
||||
{
|
||||
inRange = true;
|
||||
}
|
||||
}
|
||||
|
||||
if( canFire && inRange )
|
||||
{
|
||||
weaponName = projectile getWeaponName();
|
||||
if( !canGoThroughTrophy ( weaponName, "ugv" ))
|
||||
{
|
||||
//projectile MissileTryTrophyExplode( self );
|
||||
self notify( "trophy_kill_projectile", TROPHY_RELOAD_TIME_SEC );
|
||||
self.trophyLastFireTime = getTime();
|
||||
PlayFX ( level._effect[ "trophy_explosion" ], projectile.origin );
|
||||
projectile delete();
|
||||
projectile = undefined;
|
||||
self PlaySound( TROPHY_SOUND_AFTER_COOLDOWN );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// println( "not close enough... dsqr ", distance_squared, " ", projectile.origin, " ", self.origin );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( isDefined( turret ))
|
||||
{
|
||||
turret ClearTargetEntity();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
canGoThroughTrophy ( weaponName, type )
|
||||
{
|
||||
index = undefined;
|
||||
switch ( type )
|
||||
{
|
||||
case "suit":
|
||||
index = 2;
|
||||
break;
|
||||
case "ugv":
|
||||
index = 3;
|
||||
break;
|
||||
default:
|
||||
assertMsg( "Invalid trophy type. Must be either 'suit' or 'ugv'" );
|
||||
}
|
||||
|
||||
result = tablelookup( TROPHY_TABLE_FILE, 1, weaponName, index );
|
||||
|
||||
if ( result == "1")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user