mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-04-23 09:35:45 +00:00
377 lines
9.1 KiB
Plaintext
377 lines
9.1 KiB
Plaintext
//****************************************************************************
|
|
// **
|
|
// Confidential - (C) Activision Publishing, Inc. 2010 **
|
|
// **
|
|
//****************************************************************************
|
|
// **
|
|
// Module: Mission Utils **
|
|
// **
|
|
// Created: DATE - CREATOR **
|
|
// **
|
|
//****************************************************************************
|
|
|
|
#include maps\_utility;
|
|
#include common_scripts\utility;
|
|
#include maps\_anim;
|
|
#include maps\_vehicle;
|
|
#include maps\_nx_utility;
|
|
|
|
|
|
//*******************************************************************
|
|
// Utility *
|
|
// *
|
|
//*******************************************************************
|
|
waittill_flag_timeout( flag, timeout )//SCRIPT_KEEP
|
|
{
|
|
if( !IsDefined( flag ) || !IsDefined( timeout ) )
|
|
return;
|
|
|
|
if( flag_exist( flag ) && flag( flag ) )
|
|
return;
|
|
|
|
level endon( flag );
|
|
|
|
wait( timeout );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// Actors *
|
|
// *
|
|
//*******************************************************************
|
|
actor_teleport( actor, origin_targetname )//SCRIPT_KEEP
|
|
{
|
|
org = GetEnt( origin_targetname, "targetname" );
|
|
|
|
if( IsPlayer( actor ) )
|
|
{
|
|
actor SetPlayerAngles( org.angles );
|
|
actor SetOrigin( org.origin );
|
|
}
|
|
else if(IsAI( actor ) )
|
|
{
|
|
actor ForceTeleport( org.origin, org.angles );
|
|
}
|
|
}
|
|
|
|
|
|
// Deletes an actor after time
|
|
delete_after_time( time )
|
|
{
|
|
self endon( "death" );
|
|
|
|
wait time;
|
|
if( !player_can_see_ai( self ))
|
|
{
|
|
self delete();
|
|
}
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// AI *
|
|
// *
|
|
//*******************************************************************
|
|
ai_color_reset( color )// SCRIPT_KEEP
|
|
{
|
|
if( !IsDefined( color ) )
|
|
{
|
|
if( IsDefined( self.ai_color ) )
|
|
color = self.ai_color;
|
|
}
|
|
|
|
if( IsDefined( color ) )
|
|
{
|
|
self set_force_color( color );
|
|
self enable_ai_color();
|
|
}
|
|
}
|
|
|
|
ai_color_reset_array( ai_array, color )// SCRIPT_KEEP
|
|
{
|
|
foreach( ai in ai_array )
|
|
{
|
|
ai ai_color_reset( color );
|
|
}
|
|
}
|
|
|
|
ai_ignore_until_damage()
|
|
{
|
|
self endon( "death" );
|
|
|
|
self.ignoreAll = true;
|
|
self.ignoreMe = true;
|
|
|
|
self waittill( "damage" );
|
|
|
|
self.ignoreAll = false;
|
|
self.ignoreMe = false;
|
|
}
|
|
|
|
ai_ignore_until_damage_group( team )
|
|
{
|
|
self.ignoreAll = true;
|
|
self.ignoreMe = true;
|
|
|
|
self waittill( "damage" );
|
|
|
|
guys = array_removedead( team );
|
|
|
|
foreach( guy in guys )
|
|
{
|
|
guy.ignoreAll = false;
|
|
guy.ignoreMe = false;
|
|
}
|
|
}
|
|
|
|
ai_ignore_until_flag( flag_name )
|
|
{
|
|
self endon( "death" );
|
|
|
|
self.ignoreAll = true;
|
|
self.ignoreMe = true;
|
|
|
|
flag_wait( flag_name );
|
|
|
|
self.ignoreAll = false;
|
|
self.ignoreMe = false;
|
|
}
|
|
|
|
//*******************************************************************
|
|
// SQUAD *
|
|
// *
|
|
//*******************************************************************
|
|
squad_add_ally( script_name, spawner_targetname, animname )// SCRIPT_KEEP
|
|
{
|
|
if( !IsDefined( level.squad ) )
|
|
level.squad = [];
|
|
spawner = GetEnt( spawner_targetname, "targetname" );
|
|
ally = spawner spawn_ai();
|
|
ally.animname = animname;
|
|
|
|
ally thread magic_bullet_shield();
|
|
ally.ai_color = ally.script_forcecolor;
|
|
ally ai_color_reset();
|
|
ally.hero = true;
|
|
ally make_hero();
|
|
|
|
level.squad[script_name] = ally;
|
|
if( ally.animname == "ally_alpha" )
|
|
level.squad[ "ALLY_ALPHA" ] set_battlechatter_id( "bak" );
|
|
|
|
|
|
return ally;
|
|
}
|
|
|
|
squad_color_reset() //SCRIPT_KEEP
|
|
{
|
|
ai_color_reset_array( level.squad );
|
|
}
|
|
|
|
squad_cqb( enable )
|
|
{
|
|
foreach( actor in level.squad )
|
|
{
|
|
if( enable )
|
|
actor enable_cqbwalk();
|
|
else
|
|
actor disable_cqbwalk();
|
|
}
|
|
}
|
|
|
|
squad_sprint( enable )
|
|
{
|
|
foreach( actor in level.squad )
|
|
{
|
|
if( enable )
|
|
actor enable_sprint();
|
|
else
|
|
actor disable_sprint();
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// OFFENSIVE GRENADES *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
|
|
BLAST_RADIUS = 350;
|
|
DEBRIS_RADIUS = 500;
|
|
FUSE_DELAY = 1.0;
|
|
|
|
grenade_behavior()
|
|
{
|
|
level._player waittill ( "grenade_fire", grenade, weaponname );
|
|
volumes = GetEntArray ("indoor_volume", "script_noteworthy");
|
|
if ( weaponname == "offensive_grenade")
|
|
{
|
|
foreach ( volume in volumes )
|
|
{
|
|
grenade thread check_for_interior_detonation( volume );
|
|
}
|
|
thread grenade_percussion_fuse( grenade );
|
|
}
|
|
thread grenade_behavior();
|
|
}
|
|
|
|
grenade_percussion_fuse( grenade )
|
|
{
|
|
// wait until impact of any sort
|
|
grenade waittill( "other" );
|
|
wait( FUSE_DELAY );
|
|
if( IsDefined( grenade ) )
|
|
{
|
|
grenade detonate();
|
|
}
|
|
}
|
|
|
|
check_for_interior_detonation( volume )
|
|
{
|
|
self waittill ("explode", position);
|
|
proxy = spawn("script_model", position );
|
|
if ( proxy IsTouching ( volume ))
|
|
{
|
|
PlayFX ( level._effect[ "offensive_grenade_indoor_explosion" ], proxy.origin );
|
|
BadPlace_Brush( "", 5, volume, "axis" );
|
|
Earthquake (0.3, 3, volume.origin, 850);
|
|
volume activate_destructibles_in_volume( );
|
|
// iprintln ( "I blew up in: " + volume.targetname );
|
|
grenade_victims = volume get_ai_touching_volume( "axis" );
|
|
if ( level._player IsTouching( volume ) )
|
|
{
|
|
distance = Distance ( level._player.origin, proxy.origin );
|
|
if ( distance <= BLAST_RADIUS )
|
|
{
|
|
SetDvar( "ui_deadquote", &"NX_HOSPITAL_FAIL_OFFENSIVE_GRENADE" );
|
|
waittillframeend;
|
|
level._player kill( proxy.origin, level._player );
|
|
}
|
|
}
|
|
foreach ( victim in grenade_victims )
|
|
{
|
|
distance = Distance ( victim.origin, proxy.origin );
|
|
if ( distance <= BLAST_RADIUS )
|
|
{
|
|
victim kill( proxy.origin, level._player );
|
|
PlayFX ( level._effect[ "nx_concussion_grenade_gibs" ], victim.origin );
|
|
}
|
|
else if ( distance <= DEBRIS_RADIUS )
|
|
{
|
|
victim DoDamage ( 50, proxy.origin, level._player);
|
|
victim flashBangStart( 3 );
|
|
}
|
|
}
|
|
if ( IsDefined ( volume.target ))
|
|
{
|
|
openings = GetEntArray ( volume.target, "targetname");
|
|
foreach ( opening in openings )
|
|
{
|
|
if ( opening.script_noteworthy == "window")
|
|
{
|
|
GlassRadiusDamage( opening.origin, 100, 1000, 1000 );
|
|
PhysicsExplosionSphere( opening.origin, 100, 80, 2000 );
|
|
forward = AnglesToForward( opening.angles );
|
|
PlayFX ( level._effect[ "offensive_grenade_window" ], opening.origin, forward );
|
|
}
|
|
|
|
if ( opening.script_noteworthy == "door")
|
|
{
|
|
forward = AnglesToForward( opening.angles );
|
|
PlayFX ( level._effect[ "offensive_grenade_door" ], opening.origin, forward);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
//waittillframeend;
|
|
proxy delete();
|
|
}
|
|
|
|
// FLASHLIGHT ON GUN
|
|
FLASHLIGHT_FX = "flashlight";
|
|
|
|
attach_flashlight_gun( state )
|
|
{
|
|
effect_id = level._effect[ FLASHLIGHT_FX ];
|
|
effect_tag = "tag_flash";
|
|
|
|
if( state )
|
|
{
|
|
PlayFXOnTag( effect_id, self, "tag_flash" );
|
|
self thread detach_flashlight_gun_on_death();
|
|
}
|
|
else
|
|
{
|
|
StopFXOnTag( effect_id, self, "tag_flash" );
|
|
}
|
|
|
|
self.have_flashlight = state;
|
|
}
|
|
|
|
detach_flashlight_gun()
|
|
{
|
|
self attach_flashlight_gun( false );
|
|
}
|
|
|
|
detach_flashlight_gun_on_death()
|
|
{
|
|
self waittill( "death" );
|
|
self detach_flashlight_gun();
|
|
}
|
|
|
|
// FLASHLIGHT IN HAND
|
|
attach_flashlight( state )
|
|
{
|
|
if( IsDefined( self.patrol_walk_flashlight ) )
|
|
{
|
|
self set_generic_run_anim( random( self.patrol_walk_flashlight ), true );
|
|
}
|
|
|
|
self attach( "com_flashlight_on", "tag_inhand", true );
|
|
self.have_flashlight = true;
|
|
self flashlight_light( state );
|
|
self thread detach_flashlight_on_death();
|
|
}
|
|
|
|
detach_flashlight_on_death()
|
|
{
|
|
self waittill( "death" );
|
|
if ( isdefined( self ) )
|
|
self detach_flashlight();
|
|
}
|
|
|
|
detach_flashlight()
|
|
{
|
|
if ( !isdefined( self.have_flashlight ) )
|
|
return;
|
|
// self detach( "com_flashlight_on", "tag_inhand" ); // This failed for some reason ( PJ )
|
|
self flashlight_light( false );
|
|
self.have_flashlight = undefined;
|
|
}
|
|
|
|
flashlight_light( state )
|
|
{
|
|
flash_light_tag = "tag_light";
|
|
|
|
if ( state )
|
|
{
|
|
flashlight_fx_ent = spawn( "script_model", ( 0, 0, 0 ) );
|
|
flashlight_fx_ent setmodel( "tag_origin" );
|
|
flashlight_fx_ent hide();
|
|
flashlight_fx_ent linkto( self, flash_light_tag, ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
|
|
self thread flashlight_light_death( flashlight_fx_ent );
|
|
playfxontag( level._effect[ FLASHLIGHT_FX ], flashlight_fx_ent, "tag_origin" );
|
|
}
|
|
else if ( isdefined( self.have_flashlight ) )
|
|
self notify( "flashlight_off" );
|
|
}
|
|
|
|
flashlight_light_death( flashlight_fx_ent )
|
|
{
|
|
self waittill_either( "death", "flashlight_off" );
|
|
|
|
flashlight_fx_ent delete();
|
|
self.have_flashlight = undefined;
|
|
|
|
} |