nx1-gsc-dump/maps/nx_hospital_util.gsc

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;
}