IL-GSC/BO1/PC/ZM/maps/_utility.gsc
2024-02-18 17:32:07 -05:00

8103 lines
186 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include common_scripts\utility;
#include maps\_utility_code;
array_levelthread( array, process, var1, var2, var3, var4 )
{
keys = getArrayKeys( array );
if( IsDefined( var4 ) )
{
for( i = 0 ; i < keys.size ; i++ )
{
thread [[ process ]]( array[ keys[ i ] ], var1, var2, var3, var4 );
}
return;
}
if( IsDefined( var3 ) )
{
for( i = 0 ; i < keys.size ; i++ )
{
thread [[ process ]]( array[ keys[ i ] ], var1, var2, var3 );
}
return;
}
if( IsDefined( var2 ) )
{
for( i = 0 ; i < keys.size ; i++ )
{
thread [[ process ]]( array[ keys[ i ] ], var1, var2 );
}
return;
}
if( IsDefined( var1 ) )
{
for( i = 0 ; i < keys.size ; i++ )
{
thread [[ process ]]( array[ keys[ i ] ], var1 );
}
return;
}
for( i = 0 ; i < keys.size ; i++ )
{
thread [[ process ]]( array[ keys[ i ] ] );
}
}
set_vision_set( visionset, transition_time )
{
if ( init_vision_set( visionset ) )
{
return;
}
if ( !IsDefined( transition_time ) )
{
transition_time = 1;
}
visionSetNaked( visionset, transition_time );
}
ent_flag_wait( msg )
{
self endon("death");
while( !self.ent_flag[ msg ] )
{
self waittill( msg );
}
}
ent_flag_wait_either( flag1, flag2 )
{
self endon("death");
for( ;; )
{
if( ent_flag( flag1 ) )
{
return;
}
if( ent_flag( flag2 ) )
{
return;
}
self waittill_either( flag1, flag2 );
}
}
ent_flag_wait_or_timeout( flagname, timer )
{
self endon("death");
start_time = gettime();
for( ;; )
{
if( self.ent_flag[ flagname ] )
{
break;
}
if( gettime() >= start_time + timer * 1000 )
{
break;
}
self ent_wait_for_flag_or_time_elapses( flagname, timer );
}
}
ent_flag_waitopen( msg )
{
self endon("death");
while( self.ent_flag[ msg ] )
{
self waittill( msg );
}
}
ent_flag_init( message, val )
{
if( !IsDefined( self.ent_flag ) )
{
self.ent_flag = [];
self.ent_flags_lock = [];
}
if ( !IsDefined( level.first_frame ) )
{
assertEx( !IsDefined( self.ent_flag[ message ] ), "Attempt to reinitialize existing flag '" + message + "' on entity.");
}
if (is_true(val))
{
self.ent_flag[ message ] = true;
}
else
{
self.ent_flag[ message ] = false;
}
}
ent_flag_set_delayed( message, delay )
{
wait( delay );
self ent_flag_set( message );
}
ent_flag_set( message )
{
self.ent_flag[ message ] = true;
self notify( message );
}
ent_flag_toggle( message )
{
if (self ent_flag(message))
{
self ent_flag_clear(message);
}
else
{
self ent_flag_set(message);
}
}
ent_flag_clear( message )
{
if( self.ent_flag[ message ] )
{
self.ent_flag[ message ] = false;
self notify( message );
}
}
ent_flag_clear_delayed( message, delay )
{
wait( delay );
self ent_flag_clear( message );
}
ent_flag( message )
{
AssertEx( IsDefined( message ), "Tried to check flag but the flag was not defined." );
AssertEx( IsDefined( self.ent_flag[ message ] ), "Tried to check entity flag '" + message + "', but the flag was not initialized.");
if( !self.ent_flag[ message ] )
{
return false;
}
return true;
}
ent_flag_init_ai_standards()
{
message_array = [];
message_array[ message_array.size ] = "goal";
message_array[ message_array.size ] = "damage";
for( i = 0; i < message_array.size; i++)
{
self ent_flag_init( message_array[ i ] );
self thread ent_flag_wait_ai_standards( message_array[ i ] );
}
}
ent_flag_wait_ai_standards( message )
{
self endon("death");
self waittill( message );
self.ent_flag[ message ] = true;
}
flag_wait_either( flag1, flag2 )
{
for( ;; )
{
if( flag( flag1 ) )
{
return;
}
if( flag( flag2 ) )
{
return;
}
level waittill_either( flag1, flag2 );
}
}
flag_wait_any( flag1, flag2, flag3, flag4 )
{
array = [];
if( IsDefined( flag4 ) )
{
array[ array.size ] = flag1;
array[ array.size ] = flag2;
array[ array.size ] = flag3;
array[ array.size ] = flag4;
}
else if( IsDefined( flag3 ) )
{
array[ array.size ] = flag1;
array[ array.size ] = flag2;
array[ array.size ] = flag3;
}
else if( IsDefined( flag2 ) )
{
flag_wait_either( flag1, flag2 );
return;
}
else
{
assertmsg( "flag_wait_any() needs at least 2 flags passed to it" );
return;
}
for( ;; )
{
for(i=0; i<array.size; i++)
{
if( flag( array[i] ) )
{
return;
}
}
level waittill_any( flag1, flag2, flag3, flag4 );
}
}
flag_wait_all( flag1, flag2, flag3, flag4 )
{
if( IsDefined( flag1 ) )
{
flag_wait( flag1 );
}
if( IsDefined( flag2 ) )
{
flag_wait( flag2 );
}
if( IsDefined( flag3 ) )
{
flag_wait( flag3 );
}
if( IsDefined( flag4 ) )
{
flag_wait( flag4 );
}
}
flag_wait_on( flagname )
{
while( !level flag_exists( flagname ) )
{
wait 0.05;
}
flag_wait( flagname );
}
flag_wait_or_timeout( flagname, timer )
{
start_time = gettime();
for( ;; )
{
if( level.flag[ flagname ] )
{
break;
}
if( gettime() >= start_time + timer * 1000 )
{
break;
}
wait_for_flag_or_time_elapses( flagname, timer );
}
}
flag_waitopen_or_timeout( flagname, timer )
{
start_time = gettime();
for( ;; )
{
if( !level.flag[ flagname ] )
{
break;
}
if( gettime() >= start_time + timer * 1000 )
{
break;
}
wait_for_flag_or_time_elapses( flagname, timer );
}
}
flag_trigger_init( message, trigger, continuous )
{
flag_init( message );
if( !IsDefined( continuous ) )
{
continuous = false;
}
assert( isSubStr( trigger.classname, "trigger" ) );
trigger thread _flag_wait_trigger( message, continuous );
return trigger;
}
flag_triggers_init( message, triggers, all )
{
flag_init( message );
if( !IsDefined( all ) )
{
all = false;
}
for( index = 0; index < triggers.size; index ++ )
{
assert( isSubStr( triggers[ index ].classname, "trigger" ) );
triggers[ index ] thread _flag_wait_trigger( message, false );
}
return triggers;
}
flag_assert( msg )
{
assertEx( !flag( msg ), "Flag " + msg + " set too soon!" );
}
flag_set_delayed( message, delay )
{
wait( delay );
flag_set( message );
}
flag_clear_delayed( message, delay )
{
wait( delay );
flag_clear( message );
}
_flag_wait_trigger( message, continuous )
{
self endon( "death" );
for( ;; )
{
self waittill( "trigger", other );
flag_set( message );
if( !continuous )
{
return;
}
while( other isTouching( self ) )
{
wait( 0.05 );
}
flag_clear( message );
}
}
wait_endon( waitTime, endOnString, endonString2, endonString3 )
{
self endon ( endOnString );
if ( isDefined( endonString2 ) )
self endon ( endonString2 );
if ( isDefined( endonString3 ) )
self endon ( endonString3 );
wait ( waitTime );
}
level_end_save()
{
if( level.missionfailed )
{
return;
}
if ( flag( "game_saving" ) )
{
return;
}
players = get_players();
if( !IsAlive( players[0] ) )
{
return;
}
flag_set( "game_saving" );
imagename = "levelshots / autosave / autosave_" + level.script + "end";
saveGame( "levelend", &"AUTOSAVE_AUTOSAVE", imagename, true );
flag_clear( "game_saving" );
}
autosave_by_name( name )
{
thread autosave_by_name_thread( name );
}
autosave_by_name_thread( name, timeout )
{
if( !IsDefined( level.curAutoSave ) )
{
level.curAutoSave = 1;
}
imageName = "levelshots / autosave / autosave_" + level.script + level.curAutoSave;
result = level maps\_autosave::try_auto_save( level.curAutoSave, "autosave", imagename, timeout );
if( IsDefined( result ) && result )
{
level.curAutoSave++;
}
}
error( message )
{
println( "^c * ERROR * ", message );
wait 0.05;
}
error2( message )
{
println( "^c * ERROR * ", message );
wait 0.05;
}
debug_message( message, origin, duration )
{
if( !IsDefined( duration ) )
{
duration = 5;
}
for( time = 0; time < ( duration * 20 );time ++ )
{
print3d( ( origin + ( 0, 0, 45 ) ), message, ( 0.48, 9.4, 0.76 ), 0.85 );
wait 0.05;
}
}
debug_message_clear( message, origin, duration, extraEndon )
{
if( IsDefined( extraEndon ) )
{
level notify( message + extraEndon );
level endon( message + extraEndon );
}
else
{
level notify( message );
level endon( message );
}
if( !IsDefined( duration ) )
{
duration = 5;
}
for( time = 0; time < ( duration * 20 );time ++ )
{
print3d( ( origin + ( 0, 0, 45 ) ), message, ( 0.48, 9.4, 0.76 ), 0.85 );
wait 0.05;
}
}
precache( model )
{
ent = spawn( "script_model", ( 0, 0, 0 ) );
ent.origin = get_players()[0] getorigin();
ent setmodel( model );
ent delete();
}
closerFunc( dist1, dist2 )
{
return dist1 >= dist2;
}
fartherFunc( dist1, dist2 )
{
return dist1 <= dist2;
}
getClosest( org, array, dist )
{
return compareSizes( org, array, dist, ::closerFunc );
}
getFarthest( org, array, dist )
{
return compareSizes( org, array, dist, ::fartherFunc );
}
compareSizesFx( org, array, dist, compareFunc )
{
if( !array.size )
{
return undefined;
}
if( IsDefined( dist ) )
{
struct = undefined;
keys = getArrayKeys( array );
for( i = 0; i < keys.size; i++ )
{
newdist = distance( array[ keys[ i ] ].v[ "origin" ], org );
if( [[ compareFunc ]]( newDist, dist ) )
{
continue;
}
dist = newdist;
struct = array[ keys[ i ] ];
}
return struct;
}
keys = getArrayKeys( array );
struct = array[ keys[ 0 ] ];
dist = distance( struct.v[ "origin" ], org );
for( i = 1; i < keys.size; i++ )
{
newdist = distance( array[ keys[ i ] ].v[ "origin" ], org );
if( [[ compareFunc ]]( newDist, dist ) )
{
continue;
}
dist = newdist;
struct = array[ keys[ i ] ];
}
return struct;
}
compareSizes( org, array, dist, compareFunc )
{
if( !array.size )
{
return undefined;
}
if( IsDefined( dist ) )
{
ent = undefined;
keys = GetArrayKeys( array );
for( i = 0; i < keys.size; i++ )
{
newdist = distance( array[ keys[ i ] ].origin, org );
if( [[ compareFunc ]]( newDist, dist ) )
{
continue;
}
dist = newdist;
ent = array[ keys[ i ] ];
}
return ent;
}
keys = GetArrayKeys( array );
ent = array[ keys[ 0 ] ];
dist = Distance( ent.origin, org );
for( i = 1; i < keys.size; i++ )
{
newdist = distance( array[ keys[ i ] ].origin, org );
if( [[ compareFunc ]]( newDist, dist ) )
{
continue;
}
dist = newdist;
ent = array[ keys[ i ] ];
}
return ent;
}
get_closest_point( origin, points, maxDist )
{
assert( points.size );
closestPoint = points[ 0 ];
dist = Distance( origin, closestPoint );
for( index = 0; index < points.size; index ++ )
{
testDist = distance( origin, points[ index ] );
if( testDist >= dist )
{
continue;
}
dist = testDist;
closestPoint = points[ index ];
}
if( !IsDefined( maxDist ) || dist <= maxDist )
{
return closestPoint;
}
return undefined;
}
get_within_range( org, array, dist )
{
guys = [];
for( i = 0; i < array.size; i++ )
{
if( distance( array[ i ].origin, org ) <= dist )
{
guys[ guys.size ] = array[ i ];
}
}
return guys;
}
get_outside_range( org, array, dist )
{
guys = [];
for( i = 0; i < array.size; i++ )
{
if( distance( array[ i ].origin, org ) > dist )
{
guys[ guys.size ] = array[ i ];
}
}
return guys;
}
get_closest_living( org, array, dist )
{
if( !IsDefined( dist ) )
{
dist = 9999999;
}
if( array.size < 1 )
{
return;
}
ent = undefined;
for( i = 0;i < array.size;i++ )
{
if( !isalive( array[ i ] ) )
{
continue;
}
newdist = distance( array[ i ].origin, org );
if( newdist >= dist )
{
continue;
}
dist = newdist;
ent = array[ i ];
}
return ent;
}
get_highest_dot( start, end, array )
{
if( !array.size )
{
return;
}
ent = undefined;
angles = VectorToAngles( end - start );
dotforward = AnglesToForward( angles );
dot = -1;
for( i = 0;i < array.size;i++ )
{
angles = vectorToAngles( array[ i ].origin - start );
forward = AnglesToForward( angles );
newdot = VectorDot( dotforward, forward );
if( newdot < dot )
{
continue;
}
dot = newdot;
ent = array[ i ];
}
return ent;
}
get_closest_index( org, array, dist )
{
if( !IsDefined( dist ) )
{
dist = 9999999;
}
if( array.size < 1 )
{
return;
}
index = undefined;
for( i = 0;i < array.size;i++ )
{
newdist = distance( array[ i ].origin, org );
if( newdist >= dist )
{
continue;
}
dist = newdist;
index = i;
}
return index;
}
get_farthest( org, array )
{
if( array.size < 1 )
{
return;
}
dist = Distance( array[0].origin, org );
ent = array[0];
for( i = 1; i < array.size; i++ )
{
newdist = Distance( array[i].origin, org );
if( newdist <= dist )
{
continue;
}
dist = newdist;
ent = array[i];
}
return ent;
}
get_closest_exclude( org, ents, excluders )
{
if( !IsDefined( ents ) )
{
return undefined;
}
range = 0;
if( IsDefined( excluders ) && excluders.size )
{
exclude = [];
for( i = 0;i < ents.size;i++ )
{
exclude[ i ] = false;
}
for( i = 0;i < ents.size;i++ )
{
for( p = 0;p < excluders.size;p ++ )
{
if( ents[ i ] == excluders[ p ] )
{
exclude[ i ] = true;
}
}
}
found_unexcluded = false;
for( i = 0;i < ents.size;i++ )
{
if( ( !exclude[ i ] ) && ( IsDefined( ents[ i ] ) ) )
{
found_unexcluded = true;
range = distance( org, ents[ i ].origin );
ent = i;
i = ents.size + 1;
}
}
if( !found_unexcluded )
{
return( undefined );
}
}
else
{
for( i = 0;i < ents.size;i++ )
{
if( IsDefined( ents[ i ] ) )
{
range = distance( org, ents[ 0 ].origin );
ent = i;
i = ents.size + 1;
}
}
}
ent = undefined;
for( i = 0;i < ents.size;i++ )
{
if( IsDefined( ents[ i ] ) )
{
exclude = false;
if( IsDefined( excluders ) )
{
for( p = 0;p < excluders.size;p ++ )
{
if( ents[ i ] == excluders[ p ] )
{
exclude = true;
}
}
}
if( !exclude )
{
newrange = distance( org, ents[ i ].origin );
if( newrange <= range )
{
range = newrange;
ent = i;
}
}
}
}
if( IsDefined( ent ) )
{
return ents[ ent ];
}
else
{
return undefined;
}
}
get_closest_ai( org, team )
{
if( IsDefined( team ) )
{
ents = GetAiArray( team );
}
else
{
ents = GetAiArray();
}
if( ents.size == 0 )
{
return undefined;
}
return getClosest( org, ents );
}
get_array_of_closest( org, array, excluders, max, maxdist )
{
if( !IsDefined( max ) )
{
max = array.size;
}
if( !IsDefined( excluders ) )
{
excluders = [];
}
maxdists2rd = undefined;
if( IsDefined( maxdist ) )
{
maxdists2rd = maxdist * maxdist;
}
dist = [];
index = [];
for( i = 0;i < array.size;i++ )
{
excluded = false;
for( p = 0;p < excluders.size;p ++ )
{
if( array[ i ] != excluders[ p ] )
{
continue;
}
excluded = true;
break;
}
if( excluded )
{
continue;
}
if( !IsDefined(array[ i ]) )
{
continue;
}
length = distancesquared( org, array[ i ].origin );
if( IsDefined( maxdists2rd ) && maxdists2rd < length )
{
continue;
}
dist[ dist.size ] = length;
index[ index.size ] = i;
}
for( ;; )
{
change = false;
for( i = 0;i < dist.size - 1;i++ )
{
if( dist[ i ] <= dist[ i + 1 ] )
{
continue;
}
change = true;
temp = dist[ i ];
dist[ i ] = dist[ i + 1 ];
dist[ i + 1 ] = temp;
temp = index[ i ];
index[ i ] = index[ i + 1 ];
index[ i + 1 ] = temp;
}
if( !change )
{
break;
}
}
newArray = [];
if( max > dist.size )
{
max = dist.size;
}
for( i = 0;i < max;i++ )
{
newArray[ i ] = array[ index[ i ] ];
}
return newArray;
}
get_array_of_farthest( org, array, excluders, max )
{
sorted_array = get_array_of_closest( org, array, excluders, max );
sorted_array = array_reverse( sorted_array );
return( sorted_array );
}
get_closest_ai_exclude( org, team, excluders )
{
if( IsDefined( team ) )
{
ents = GetAiArray( team );
}
else
{
ents = GetAiArray();
}
if( ents.size == 0 )
{
return undefined;
}
return get_closest_exclude( org, ents, excluders );
}
stop_magic_bullet_shield()
{
if ( IsAI(self) )
{
self BloodImpact( "normal" );
}
self.attackerAccuracy = 1;
self notify("stop_magic_bullet_shield");
self.magic_bullet_shield = undefined;
self._mbs = undefined;
}
magic_bullet_shield()
{
if (!is_true(self.magic_bullet_shield))
{
if( IsAI(self) || IsPlayer(self))
{
self.magic_bullet_shield = true;
if (!IsDefined(self._mbs))
{
self._mbs = SpawnStruct();
}
if ( IsAI(self) )
{
AssertEx( IsAlive( self ), "Tried to do magic_bullet_shield on a dead or undefined guy." );
self._mbs.last_pain_time = 0;
self._mbs.ignore_time = 5;
self._mbs.turret_ignore_time = 5;
self BloodImpact( "hero" );
}
self.attackerAccuracy = 0.1;
}
else
{
if (self is_vehicle())
{
AssertMsg("Use veh_magic_bullet_shield for vehicles.");
}
else
{
AssertMsg("magic_bullet_shield does not support entity of classname '" + self.classname + "'.");
}
}
}
}
debug_magic_bullet_shield_death(guy)
{
targetname = "none";
if (IsDefined(guy.targetname))
{
targetname = guy.targetname;
}
guy endon("stop_magic_bullet_shield");
guy waittill("death");
AssertEx(!IsDefined(guy), "Guy died with magic bullet shield on with targetname: " + targetname);
}
disable_long_death()
{
assertex( isalive( self ), "Tried to disable long death on a non living thing" );
self.a.disableLongDeath = true;
}
enable_long_death()
{
assertex( isalive( self ), "Tried to enable long death on a non living thing" );
self.a.disableLongDeath = false;
}
get_ignoreme()
{
return self.ignoreme;
}
set_ignoreme( val )
{
assertex( IsSentient( self ), "Non ai tried to set ignoreme" );
self.ignoreme = val;
}
set_ignoreall( val )
{
assertEx( isSentient( self ), "Non ai tried to set ignoraell" );
self.ignoreall = val;
}
get_pacifist()
{
return self.pacifist;
}
set_pacifist( val )
{
assertex( IsSentient( self ), "Non ai tried to set pacifist" );
self.pacifist = val;
}
ignore_me_timer( time, endon_msg )
{
self notify("ignore_me_timer");
self.ignore_me_timer_old = self get_ignoreme();
if( !self.ignore_me_timer_old )
{
ai = GetAiArray( "axis" );
for( i = 0; i < ai.size; i++ )
{
guy = ai[ i ];
if( IsAlive( guy.enemy ) && guy.enemy == self )
{
guy notify( "enemy" );
}
}
}
self endon( "death" );
self endon( "ignore_me_timer" );
self set_ignoreme(true);
waittill_any_or_timeout( time, endon_msg );
self set_ignoreme(self.ignore_me_timer_old);
}
turret_ignore_me_timer( time )
{
self endon( "death" );
self endon( "pain" );
self.turretInvulnerability = true;
wait time;
self.turretInvulnerability = false;
}
exploder_damage()
{
if( IsDefined( self.v[ "delay" ] ) )
{
delay = self.v[ "delay" ];
}
else
{
delay = 0;
}
if( IsDefined( self.v[ "damage_radius" ] ) )
{
radius = self.v[ "damage_radius" ];
}
else
{
radius = 128;
}
damage = self.v[ "damage" ];
origin = self.v[ "origin" ];
wait( delay );
self.model RadiusDamage( origin, radius, damage, damage / 3 );
}
exploder( num )
{
[[ level.exploderFunction ]]( num );
}
exploder_before_load( num )
{
waittillframeend;
waittillframeend;
activate_exploder( num );
}
exploder_after_load( num )
{
activate_exploder( num );
}
activate_exploder_on_clients(num)
{
if(!IsDefined(level._exploder_ids[num]))
{
return;
}
if(!IsDefined(level._client_exploders[num]))
{
level._client_exploders[num] = 1;
}
if(!IsDefined(level._client_exploder_ids[num]))
{
level._client_exploder_ids[num] = 1;
}
ActivateClientExploder(level._exploder_ids[num]);
}
delete_exploder_on_clients(num)
{
if(!IsDefined(level._exploder_ids[num]))
{
return;
}
if(!IsDefined(level._client_exploders[num]))
{
return;
}
level._client_exploders[num] = undefined;
level._client_exploder_ids[num] = undefined;
DeactivateClientExploder(level._exploder_ids[num]);
}
activate_exploder( num )
{
num = int( num );
client_send = true;
prof_begin( "activate_exploder" );
for( i = 0;i < level.createFXent.size;i++ )
{
ent = level.createFXent[ i ];
if( !IsDefined( ent ) )
{
continue;
}
if( ent.v[ "type" ] != "exploder" )
{
continue;
}
if( !IsDefined( ent.v[ "exploder" ] ) )
{
continue;
}
if( ent.v[ "exploder" ] != num )
{
continue;
}
if(IsDefined(ent.v["exploder_server"]))
{
client_send = false;
}
ent activate_individual_exploder();
}
if(level.clientScripts)
{
if(!level.createFX_enabled && client_send == true)
{
activate_exploder_on_clients(num);
}
}
prof_end( "activate_exploder" );
}
stop_exploder( num )
{
num = int( num );
if(level.clientScripts)
{
if(!level.createFX_enabled)
{
delete_exploder_on_clients(num);
}
}
for( i = 0;i < level.createFXent.size;i++ )
{
ent = level.createFXent[ i ];
if( !IsDefined( ent ) )
{
continue;
}
if( ent.v[ "type" ] != "exploder" )
{
continue;
}
if( !IsDefined( ent.v[ "exploder" ] ) )
{
continue;
}
if( ent.v[ "exploder" ] != num )
{
continue;
}
if ( !IsDefined( ent.looper ) )
{
continue;
}
ent.looper delete();
}
}
activate_individual_exploder()
{
level notify("exploder" + self.v["exploder"]);
if(level.createFX_enabled || !level.clientScripts || !IsDefined(level._exploder_ids[int(self.v["exploder"])] ) || IsDefined(self.v["exploder_server"]))
{
if( IsDefined( self.v[ "firefx" ] ) )
{
self thread fire_effect();
}
if( IsDefined( self.v[ "fxid" ] ) && self.v[ "fxid" ] != "No FX" )
{
self thread cannon_effect();
}
else if( IsDefined( self.v[ "soundalias" ] ) )
{
self thread sound_effect();
}
if( IsDefined( self.v[ "earthquake" ] ) )
{
self thread exploder_earthquake();
}
if( IsDefined( self.v[ "rumble" ] ) )
{
self thread exploder_rumble();
}
}
if( IsDefined( self.v[ "trailfx" ] ) )
{
self thread trail_effect();
}
if( IsDefined( self.v[ "damage" ] ) )
{
self thread exploder_damage();
}
if( self.v[ "exploder_type" ] == "exploder" )
{
self thread brush_show();
}
else if( ( self.v[ "exploder_type" ] == "exploderchunk" ) || ( self.v[ "exploder_type" ] == "exploderchunk visible" ) )
{
self thread brush_throw();
}
else
{
self thread brush_delete();
}
}
loop_sound_Delete( ender, ent )
{
ent endon( "death" );
self waittill( ender );
ent Delete();
}
loop_fx_sound( alias, origin, ender, timeout )
{
org = Spawn( "script_origin", ( 0, 0, 0 ) );
if( IsDefined( ender ) )
{
thread loop_sound_Delete( ender, org );
self endon( ender );
}
org.origin = origin;
org PlayLoopSound( alias );
if( !IsDefined( timeout ) )
{
return;
}
wait( timeout );
}
brush_delete()
{
num = self.v[ "exploder" ];
if( IsDefined( self.v[ "delay" ] ) )
{
wait( self.v[ "delay" ] );
}
else
{
wait( .05 );
}
if( !IsDefined( self.model ) )
{
return;
}
assert( IsDefined( self.model ) );
if( self.model has_spawnflag(level.SPAWNFLAG_MODEL_DYNAMIC_PATH) )
{
self.model ConnectPaths();
}
if( level.createFX_enabled )
{
if( IsDefined( self.exploded ) )
{
return;
}
self.exploded = true;
self.model Hide();
self.model NotSolid();
wait( 3 );
self.exploded = undefined;
self.model Show();
self.model Solid();
return;
}
if( !IsDefined( self.v[ "fxid" ] ) || self.v[ "fxid" ] == "No FX" )
{
self.v[ "exploder" ] = undefined;
}
waittillframeend;
self.model Delete();
}
brush_Show()
{
if( IsDefined( self.v[ "delay" ] ) )
{
wait( self.v[ "delay" ] );
}
assert( IsDefined( self.model ) );
self.model Show();
self.model Solid();
if( self.model has_spawnflag(level.SPAWNFLAG_MODEL_DYNAMIC_PATH) )
{
if( !IsDefined( self.model.disconnect_paths ) )
{
self.model ConnectPaths();
}
else
{
self.model DisconnectPaths();
}
}
if( level.createFX_enabled )
{
if( IsDefined( self.exploded ) )
{
return;
}
self.exploded = true;
wait( 3 );
self.exploded = undefined;
self.model Hide();
self.model NotSolid();
}
}
brush_throw()
{
if( IsDefined( self.v[ "delay" ] ) )
{
wait( self.v[ "delay" ] );
}
ent = undefined;
if( IsDefined( self.v[ "target" ] ) )
{
ent = getent( self.v[ "target" ], "targetname" );
}
if( !IsDefined( ent ) )
{
ent = GetStruct( self.v["target"], "targetname" );
if( !IsDefined( ent ) )
{
self.model Delete();
return;
}
}
self.model Show();
startorg = self.v[ "origin" ];
startang = self.v[ "angles" ];
org = ent.origin;
temp_vec = ( org - self.v[ "origin" ] );
x = temp_vec[ 0 ];
y = temp_vec[ 1 ];
z = temp_vec[ 2 ];
physics = IsDefined( self.v[ "physics" ] );
if ( physics )
{
target = undefined;
if ( IsDefined( ent.target ) )
{
target = getent( ent.target, "targetname" );
}
if ( !IsDefined( target ) )
{
contact_point = startorg;
throw_vec = ent.origin;
}
else
{
contact_point = ent.origin;
throw_vec = vector_scale(target.origin - ent.origin, self.v[ "physics" ]);
}
self.model physicslaunch( contact_point, throw_vec );
return;
}
else
{
self.model RotateVelocity( ( x, y, z ), 12 );
self.model moveGravity( ( x, y, z ), 12 );
}
if( level.createFX_enabled )
{
if( IsDefined( self.exploded ) )
{
return;
}
self.exploded = true;
wait( 3 );
self.exploded = undefined;
self.v[ "origin" ] = startorg;
self.v[ "angles" ] = startang;
self.model Hide();
return;
}
self.v[ "exploder" ] = undefined;
wait( 6 );
self.model Delete();
}
shock_onpain()
{
self endon( "death" );
self endon( "disconnect" );
if( GetDvar( #"blurpain" ) == "" )
{
SetDvar( "blurpain", "on" );
}
while( 1 )
{
oldhealth = self.health;
self waittill( "damage", damage, attacker, direction_vec, point, mod );
if( IsDefined( level.shock_onpain ) && !level.shock_onpain )
{
continue;
}
if( IsDefined( self.shock_onpain ) && !self.shock_onpain )
{
continue;
}
if( self.health < 1 )
{
continue;
}
if( mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" )
{
continue;
}
else if( mod == "MOD_GRENADE_SPLASH" || mod == "MOD_GRENADE" || mod == "MOD_EXPLOSIVE" )
{
self shock_onexplosion( damage );
}
else
{
if( GetDvar( #"blurpain" ) == "on" )
{
self ShellShock( "pain", 0.5 );
}
}
}
}
shock_onexplosion( damage )
{
time = 0;
multiplier = self.maxhealth / 100;
scaled_damage = damage * multiplier;
if( scaled_damage >= 90 )
{
time = 4;
}
else if( scaled_damage >= 50 )
{
time = 3;
}
else if( scaled_damage >= 25 )
{
time = 2;
}
else if( scaled_damage > 10 )
{
time = 1;
}
if( time )
{
self ShellShock( "explosion", time );
}
}
shock_ondeath()
{
self waittill( "death" );
if( IsDefined( level.shock_ondeath ) && !level.shock_ondeath )
{
return;
}
if( IsDefined( self.shock_ondeath ) && !self.shock_ondeath )
{
return;
}
if( IsDefined( self.specialDeath ) )
{
return;
}
if( GetDvar( #"r_texturebits" ) == "16" )
{
return;
}
}
delete_on_death( ent )
{
ent endon( "death" );
self waittill( "death" );
if( IsDefined( ent ) )
{
ent delete();
}
}
delete_on_death_wait_sound( ent, sounddone )
{
ent endon( "death" );
self waittill( "death" );
if( IsDefined( ent ) )
{
if ( ent iswaitingonsound() )
{
ent waittill( sounddone );
}
ent Delete();
}
}
is_dead_sentient()
{
return isSentient( self ) && !isalive( self );
}
play_sound_on_tag( alias, tag, ends_on_death )
{
if ( is_dead_sentient() )
{
return;
}
org = Spawn( "script_origin", ( 0, 0, 0 ) );
org endon( "death" );
thread delete_on_death_wait_sound( org, "sounddone" );
if ( IsDefined( tag ) )
{
org LinkTo( self, tag, ( 0, 0, 0 ), ( 0, 0, 0 ) );
}
else
{
org.origin = self.origin;
org.angles = self.angles;
org LinkTo( self );
}
org PlaySound( alias, "sounddone" );
if ( IsDefined( ends_on_death ) )
{
assertex( ends_on_death, "ends_on_death must be true or undefined" );
wait_for_sounddone_or_death( org );
if(is_dead_sentient())
{
org StopSounds();
}
wait( 0.05 );
}
else
{
org waittill( "sounddone" );
}
org Delete();
}
play_sound_on_tag_endon_death( alias, tag )
{
play_sound_on_tag( alias, tag, true );
}
play_sound_on_entity( alias )
{
play_sound_on_tag( alias );
}
play_loop_sound_on_tag( alias, tag, bStopSoundOnDeath )
{
org = Spawn( "script_origin", ( 0, 0, 0 ) );
org endon( "death" );
if ( !IsDefined( bStopSoundOnDeath ) )
{
bStopSoundOnDeath = true;
}
if ( bStopSoundOnDeath )
{
thread delete_on_death( org );
}
if( IsDefined( tag ) )
{
org LinkTo( self, tag, ( 0, 0, 0 ), ( 0, 0, 0 ) );
}
else
{
org.origin = self.origin;
org.angles = self.angles;
org LinkTo( self );
}
org PlayLoopSound( alias );
self waittill( "stop sound" + alias );
org StopLoopSound( alias );
org Delete();
}
stop_loop_sound_on_entity( alias )
{
self notify( "stop sound" + alias );
}
play_loop_sound_on_entity( alias, offset )
{
org = Spawn( "script_origin", ( 0, 0, 0 ) );
org endon( "death" );
thread delete_on_death( org );
if( IsDefined( offset ) )
{
org.origin = self.origin + offset;
org.angles = self.angles;
org LinkTo( self );
}
else
{
org.origin = self.origin;
org.angles = self.angles;
org LinkTo( self );
}
org PlayLoopSound( alias );
self waittill( "stop sound" + alias );
org StopLoopSound( 0.1 );
org Delete();
}
play_sound_in_space( alias, origin, master )
{
org = Spawn( "script_origin", ( 0, 0, 1 ) );
if( !IsDefined( origin ) )
{
origin = self.origin;
}
org.origin = origin;
if( IsDefined( master ) && master )
{
org PlaySoundAsMaster( alias, "sounddone" );
}
else
{
org PlaySound( alias, "sounddone" );
}
org waittill( "sounddone" );
if( IsDefined( org ) )
{
org Delete();
}
}
spawn_failed( spawn )
{
if ( IsDefined(spawn) && IsAlive(spawn) )
{
if ( !IsDefined(spawn.finished_spawning) )
{
spawn waittill("finished spawning");
}
waittillframeend;
if ( IsAlive(spawn) )
{
return false;
}
}
return true;
}
spawn_setcharacter( data )
{
codescripts\character::precache( data );
self waittill( "spawned", spawn );
if( maps\_utility::spawn_failed( spawn ) )
{
return;
}
println( "Size is ", data[ "attach" ].size );
spawn codescripts\character::new();
spawn codescripts\character::load( data );
}
assign_animtree(animname)
{
if( IsDefined( animname ) )
{
self.animname = animname;
}
assertEx( IsDefined( level.scr_animtree[ self.animname ] ), "There is no level.scr_animtree for animname " + self.animname );
animtree = level.scr_animtree[ self.animname ];
self UseAnimTree(animtree);
}
assign_model(animname)
{
if (!IsDefined(animname))
{
animname = self.animname;
}
assertEx( IsDefined( level.scr_model[ animname ] ), "There is no level.scr_model for animname " + animname );
self SetModel( level.scr_model[ animname ] );
}
spawn_anim_model( animname, origin, angles, is_simple_prop )
{
if ( !IsDefined( origin ) )
{
origin = ( 0, 0, 0 );
}
model = spawn( "script_model", origin );
model assign_model(animname);
model init_anim_model(animname, is_simple_prop);
if(!isDefined(angles))
{
angles = (0,0,0);
}
model.angles = angles;
return model;
}
init_anim_model(animname, is_simple_prop)
{
if (!IsDefined(animname))
{
animname = self.animname;
}
AssertEx(IsDefined(animname), "Trying to init anim model with no animname.");
self.animname = animname;
if (is_true(is_simple_prop))
{
if (!IsDefined(self.anim_link))
{
self.anim_link = Spawn("script_model", self.origin);
self.anim_link SetModel("tag_origin_animate");
level thread delete_anim_link_on_death(self, self.anim_link);
}
self.anim_link.animname = animname;
self.anim_link assign_animtree();
self Unlink();
self.anim_link.angles = self.angles;
self.anim_link.origin = self.origin;
self LinkTo(self.anim_link, "origin_animate_jnt");
}
else
{
self assign_animtree();
}
}
delete_anim_link_on_death(ent, anim_link)
{
anim_link endon("death");
ent waittill("death");
anim_link Delete();
}
triggerOff()
{
if (!isdefined (self.realOrigin))
{
self.realOrigin = self.origin;
}
if (self.origin == self.realorigin)
{
self.origin += (0, 0, -10000);
}
}
triggerOn()
{
if (isDefined (self.realOrigin) )
{
self.origin = self.realOrigin;
}
}
trigger_use( strName, strKey, ent )
{
if( !IsDefined( strKey ) )
{
strKey = "targetname";
}
if( !IsDefined( ent ) )
{
ent = get_players()[0];
}
eTrigger = GetEnt( strName, strKey );
if( !IsDefined( eTrigger ) )
{
assertmsg( "trigger not found: " + strName + " key: " + strKey );
return;
}
eTrigger UseBy( ent );
level notify( strName, ent );
return eTrigger;
}
set_flag_on_notify( notifyStr, strFlag )
{
if( !level.flag[ strFlag ] )
{
self waittill( notifyStr );
flag_set( strFlag );
}
}
set_flag_on_trigger( eTrigger, strFlag )
{
if( !level.flag[ strFlag ] )
{
eTrigger waittill( "trigger", eOther );
flag_set( strFlag );
return eOther;
}
}
set_flag_on_targetname_trigger( msg )
{
assert( IsDefined( level.flag[ msg ] ) );
if( flag( msg ) )
{
return;
}
trigger = GetEnt( msg, "targetname" );
trigger waittill( "trigger" );
flag_set( msg );
}
waittill_dead( guys, num, timeoutLength )
{
allAlive = true;
for( i = 0;i < guys.size;i++ )
{
if( isalive( guys[ i ] ) )
{
continue;
}
allAlive = false;
break;
}
assertex( allAlive, "Waittill_Dead was called with dead or removed AI in the array, meaning it will never pass." );
if( !allAlive )
{
newArray = [];
for( i = 0;i < guys.size;i++ )
{
if( isalive( guys[ i ] ) )
{
newArray[ newArray.size ] = guys[ i ];
}
}
guys = newArray;
}
ent = SpawnStruct();
if( IsDefined( timeoutLength ) )
{
ent endon( "thread_timed_out" );
ent thread waittill_dead_timeout( timeoutLength );
}
ent.count = guys.size;
if( IsDefined( num ) && num < ent.count )
{
ent.count = num;
}
array_thread( guys, ::waittill_dead_thread, ent );
while( ent.count > 0 )
{
ent waittill( "waittill_dead guy died" );
}
}
waittill_dead_or_dying( guys, num, timeoutLength )
{
newArray = [];
for( i = 0;i < guys.size;i++ )
{
if( isalive( guys[ i ] ) && !guys[ i ].ignoreForFixedNodeSafeCheck )
{
newArray[ newArray.size ] = guys[ i ];
}
}
guys = newArray;
ent = spawnStruct();
if( IsDefined( timeoutLength ) )
{
ent endon( "thread_timed_out" );
ent thread waittill_dead_timeout( timeoutLength );
}
ent.count = guys.size;
if( IsDefined( num ) && num < ent.count )
{
ent.count = num;
}
array_thread( guys, ::waittill_dead_or_dying_thread, ent );
while( ent.count > 0 )
{
ent waittill( "waittill_dead_guy_dead_or_dying" );
}
}
waittill_dead_thread( ent )
{
self waittill( "death" );
ent.count-- ;
ent notify( "waittill_dead guy died" );
}
waittill_dead_or_dying_thread( ent )
{
self waittill_either( "death", "pain_death" );
ent.count-- ;
ent notify( "waittill_dead_guy_dead_or_dying" );
}
waittill_dead_timeout( timeoutLength )
{
wait( timeoutLength );
self notify( "thread_timed_out" );
}
set_ai_group_cleared_count(aigroup, count)
{
maps\_spawner::aigroup_init(aigroup);
level._ai_group[aigroup].cleared_count = count;
}
waittill_ai_group_cleared( aigroup )
{
AssertEx(IsDefined(level._ai_group[aigroup]), "The aigroup "+aigroup+" does not exist");
flag_wait(aigroup + "_cleared");
}
waittill_ai_group_count( aigroup, count )
{
while( level._ai_group[ aigroup ].spawnercount + level._ai_group[ aigroup ].aicount > count )
{
wait( 0.25 );
}
}
waittill_ai_group_ai_count( aigroup, count )
{
while( level._ai_group[ aigroup ].aicount > count )
{
wait( 0.25 );
}
}
waittill_ai_group_spawner_count( aigroup, count )
{
while( level._ai_group[ aigroup ].spawnercount > count )
{
wait( 0.25 );
}
}
waittill_ai_group_amount_killed( aigroup, amount_killed )
{
while( level._ai_group[ aigroup ].killed_count < amount_killed )
{
wait( 0.25 );
}
}
get_ai_group_count( aigroup )
{
return( level._ai_group[ aigroup ].spawnercount + level._ai_group[ aigroup ].aicount );
}
get_ai_group_sentient_count( aigroup )
{
return( level._ai_group[ aigroup ].aicount );
}
get_ai_group_ai( aigroup )
{
aiSet = [];
for( index = 0; index < level._ai_group[ aigroup ].ai.size; index ++ )
{
if( !isAlive( level._ai_group[ aigroup ].ai[ index ] ) )
{
continue;
}
aiSet[ aiSet.size ] = level._ai_group[ aigroup ].ai[ index ];
}
return( aiSet );
}
get_ai( name, type )
{
array = get_ai_array( name, type );
if( array.size > 1 )
{
assertMsg( "get_ai used for more than one living ai of type " + type + " called " + name + "." );
return undefined;
}
return array[0];
}
get_ai_array(name, type)
{
ai = GetAIArray();
if (!IsDefined(type))
{
type = "script_noteworthy";
}
array = [];
for(i=0; i<ai.size; i++)
{
switch(type)
{
case "targetname":
if(IsDefined(ai[i].targetname) && ai[i].targetname == name)
{
array[array.size] = ai[i];
}
break;
case "script_noteworthy":
if(IsDefined(ai[i].script_noteworthy) && ai[i].script_noteworthy == name)
{
array[array.size] = ai[i];
}
break;
case "classname":
if(IsDefined(ai[i].classname) && ai[i].classname == name)
{
array[array.size] = ai[i];
}
break;
}
}
return array;
}
get_aispecies( name, type, breed )
{
array = get_ai_array( name, type, breed );
if( array.size > 1 )
{
assertMsg( "get_aispecies used for more than one living ai of type " + type + " called " + name + "." );
return undefined;
}
return array[0];
}
get_aispecies_array(name, type, breed)
{
if( !IsDefined( breed ) )
{
breed = "all";
}
ai = getaispeciesarray("allies", breed);
ai = array_combine(ai, getaispeciesarray("axis", breed) );
array = [];
for(i=0; i<ai.size; i++)
{
switch(type)
{
case "targetname":
if(IsDefined(ai[i].targetname) && ai[i].targetname == name)
{
array[array.size] = ai[i];
}
break;
case "script_noteworthy":
if(IsDefined(ai[i].script_noteworthy) && ai[i].script_noteworthy == name)
{
array[array.size] = ai[i];
}
break;
}
}
return array;
}
set_environment( env )
{
animscripts\utility::setEnv( env );
}
getchar( num )
{
if( num == 0 )
{
return "0";
}
if( num == 1 )
{
return "1";
}
if( num == 2 )
{
return "2";
}
if( num == 3 )
{
return "3";
}
if( num == 4 )
{
return "4";
}
if( num == 5 )
{
return "5";
}
if( num == 6 )
{
return "6";
}
if( num == 7 )
{
return "7";
}
if( num == 8 )
{
return "8";
}
if( num == 9 )
{
return "9";
}
}
waittill_either( msg1, msg2 )
{
self endon( msg1 );
self waittill( msg2 );
}
array_merge_links( array1, array2 )
{
if( !array1.size )
{
return array2;
}
if( !array2.size )
{
return array1;
}
linkMap = [];
for( i = 0; i < array1.size; i++ )
{
node = array1[ i ];
linkMap[ node.script_linkname ] = true;
}
for( i = 0; i < array2.size; i++ )
{
node = array2[ i ];
if( IsDefined( linkMap[ node.script_linkname ] ) )
{
continue;
}
linkMap[ node.script_linkname ] = true;
array1[ array1.size ] = node;
}
return array1;
}
flat_angle( angle )
{
rangle = ( 0, angle[ 1 ], 0 );
return rangle;
}
flat_origin( org )
{
rorg = ( org[ 0 ], org[ 1 ], 0 );
return rorg;
}
plot_points( plotpoints, r, g, b, timer )
{
lastpoint = plotpoints[ 0 ];
if( !IsDefined( r ) )
{
r = 1;
}
if( !IsDefined( g ) )
{
g = 1;
}
if( !IsDefined( b ) )
{
b = 1;
}
if( !IsDefined( timer ) )
{
timer = 0.05;
}
for( i = 1;i < plotpoints.size;i++ )
{
thread draw_line_for_time( lastpoint, plotpoints[ i ], r, g, b, timer );
lastpoint = plotpoints[ i ];
}
}
draw_line_for_time( org1, org2, r, g, b, timer )
{
timer = gettime() + ( timer * 1000 );
while( GetTime() < timer )
{
line( org1, org2, ( r, g, b ), 1 );
wait .05;
}
}
draw_point( org, scale, color, timer )
{
timer = gettime() + ( timer * 1000 );
range = 10*scale;
rt = (range,0,0);
ot = (0,range,0);
up = (0,0,range);
v1_1 = org + rt;
v2_1 = org + ot;
v3_1 = org + up;
v1_2 = org - rt;
v2_2 = org - ot;
v3_2 = org - up;
while( GetTime() < timer )
{
line( v1_1, v1_2, color, 1 );
line( v2_1, v2_2, color, 1 );
line( v3_1, v3_2, color, 1 );
wait .05;
}
}
draw_line_to_ent_for_time( org1, ent, r, g, b, timer )
{
timer = gettime() + ( timer * 1000 );
while( GetTime() < timer )
{
line( org1, ent.origin, ( r, g, b ), 1 );
wait .05;
}
}
draw_line_from_ent_for_time( ent, org, r, g, b, timer )
{
draw_line_to_ent_for_time( org, ent, r, g, b, timer );
}
draw_line_from_ent_to_ent_for_time( ent1, ent2, r, g, b, timer )
{
ent1 endon( "death" );
ent2 endon( "death" );
timer = gettime() + ( timer * 1000 );
while( gettime() < timer )
{
line( ent1.origin, ent2.origin, ( r, g, b ), 1 );
wait .05;
}
}
draw_line_from_ent_to_ent_until_notify( ent1, ent2, r, g, b, notifyEnt, notifyString )
{
assert( IsDefined( notifyEnt ) );
assert( IsDefined( notifyString ) );
ent1 endon( "death" );
ent2 endon( "death" );
notifyEnt endon( notifyString );
while( 1 )
{
line( ent1.origin, ent2.origin, ( r, g, b ), 0.05 );
wait .05;
}
}
draw_line_until_notify( org1, org2, r, g, b, notifyEnt, notifyString )
{
assert( IsDefined( notifyEnt ) );
assert( IsDefined( notifyString ) );
notifyEnt endon( notifyString );
while( 1 )
{
draw_line_for_time( org1, org2, r, g, b, 0.05 );
}
}
draw_arrow_time( start, end, color, duration )
{
level endon( "newpath" );
pts = [];
angles = VectorToAngles( start - end );
right = AnglesToRight( angles );
forward = AnglesToForward( angles );
up = AnglesToUp( angles );
dist = Distance( start, end );
arrow = [];
range = 0.1;
arrow[ 0 ] = start;
arrow[ 1 ] = start + vector_scale( right, dist * ( range ) ) + vector_scale( forward, dist * - 0.1 );
arrow[ 2 ] = end;
arrow[ 3 ] = start + vector_scale( right, dist * ( - 1 * range ) ) + vector_scale( forward, dist * - 0.1 );
arrow[ 4 ] = start;
arrow[ 5 ] = start + vector_scale( up, dist * ( range ) ) + vector_scale( forward, dist * - 0.1 );
arrow[ 6 ] = end;
arrow[ 7 ] = start + vector_scale( up, dist * ( - 1 * range ) ) + vector_scale( forward, dist * - 0.1 );
arrow[ 8 ] = start;
r = color[ 0 ];
g = color[ 1 ];
b = color[ 2 ];
plot_points( arrow, r, g, b, duration );
}
draw_arrow( start, end, color )
{
level endon( "newpath" );
pts = [];
angles = VectorToAngles( start - end );
right = AnglesToRight( angles );
forward = AnglesToForward( angles );
dist = Distance( start, end );
arrow = [];
range = 0.05;
arrow[ 0 ] = start;
arrow[ 1 ] = start + vector_scale( right, dist * ( range ) ) + vector_scale( forward, dist * - 0.2 );
arrow[ 2 ] = end;
arrow[ 3 ] = start + vector_scale( right, dist * ( - 1 * range ) ) + vector_scale( forward, dist * - 0.2 );
for( p = 0;p < 4;p++ )
{
nextpoint = p + 1;
if( nextpoint >= 4 )
{
nextpoint = 0;
}
line( arrow[ p ], arrow[ nextpoint ], color, 1.0 );
}
}
battlechatter_off( team )
{
maps\_dds::dds_disable( team );
return;
}
battlechatter_on( team )
{
maps\_dds::dds_enable( team );
return;
}
dds_set_player_character_name( hero_name )
{
if( !IsPlayer( self ) )
{
PrintLn( "dds 'dds_set_player_character_name' function was not called on a player. No changes made." );
return;
}
switch( hero_name )
{
case "mason":
case "hudson":
case "reznov":
level.dds.player_character_name = GetSubStr( hero_name, 0, 3 );
PrintLn( "dds setting player name to '" + level.dds.player_character_name + "'" );
break;
default:
printLn( "dds: '" + hero_name + "' not a valid player name; setting to 'mason' (mas)" );
level.dds.player_character_name = "mas";
break;
}
self.dds_characterID = level.dds.player_character_name;
}
dds_exclude_this_ai()
{
if( IsAI( self ) && IsAlive( self ) )
{
self.dds_characterID = undefined;
}
else
{
PrintLn( "Tried to mark an entity for DDS removal that was not an AI or not alive." );
}
}
debugorigin()
{
self notify( "Debug origin" );
self endon( "Debug origin" );
self endon( "death" );
for( ;; )
{
forward = AnglesToForward( self.angles );
forwardFar = vector_scale( forward, 30 );
forwardClose = vector_scale( forward, 20 );
right = AnglesToRight( self.angles );
left = vector_scale( right, -10 );
right = vector_scale( right, 10 );
line( self.origin, self.origin + forwardFar, ( 0.9, 0.7, 0.6 ), 0.9 );
line( self.origin + forwardFar, self.origin + forwardClose + right, ( 0.9, 0.7, 0.6 ), 0.9 );
line( self.origin + forwardFar, self.origin + forwardClose + left, ( 0.9, 0.7, 0.6 ), 0.9 );
wait( 0.05 );
}
}
get_links()
{
return Strtok( self.script_linkTo, " " );
}
get_linked_ents()
{
array = [];
if ( IsDefined( self.script_linkto ) )
{
linknames = get_links();
for ( i = 0; i < linknames.size; i++ )
{
ent = getent( linknames[ i ], "script_linkname" );
if ( IsDefined( ent ) )
{
array[ array.size ] = ent;
}
}
}
return array;
}
get_linked_structs()
{
array = [];
if ( IsDefined( self.script_linkto ) )
{
linknames = get_links();
for ( i = 0; i < linknames.size; i++ )
{
ent = getstruct( linknames[ i ], "script_linkname" );
if ( IsDefined( ent ) )
{
array[ array.size ] = ent;
}
}
}
return array;
}
get_last_ent_in_chain( sEntityType )
{
ePathpoint = self;
while ( IsDefined(ePathpoint.target) )
{
wait (0.05);
if ( IsDefined( ePathpoint.target ) )
{
switch ( sEntityType )
{
case "vehiclenode":
ePathpoint = getvehiclenode( ePathpoint.target, "targetname" );
break;
case "pathnode":
ePathpoint = getnode( ePathpoint.target, "targetname" );
break;
case "ent":
ePathpoint = getent( ePathpoint.target, "targetname" );
break;
default:
assertmsg("sEntityType needs to be 'vehiclenode', 'pathnode' or 'ent'");
}
}
else
{
break;
}
}
ePathend = ePathpoint;
return ePathend;
}
timeout( timeout )
{
self endon( "death" );
wait( timeout );
self notify( "timeout" );
}
set_forcegoal()
{
if( IsDefined( self.set_forcedgoal ) )
{
return;
}
self.oldfightdist = self.pathenemyfightdist;
self.oldmaxdist = self.pathenemylookahead;
self.oldmaxsight = self.maxsightdistsqrd;
self.pathenemyfightdist = 8;
self.pathenemylookahead = 8;
self.maxsightdistsqrd = 1;
self.set_forcedgoal = true;
}
unset_forcegoal()
{
if( !IsDefined( self.set_forcedgoal ) )
{
return;
}
self.pathenemyfightdist = self.oldfightdist;
self.pathenemylookahead = self.oldmaxdist;
self.maxsightdistsqrd = self.oldmaxsight;
self.set_forcedgoal = undefined;
}
array_removeDead_keepkeys( array )
{
newArray = [];
keys = getarraykeys( array );
for( i = 0; i < keys.size; i++ )
{
key = keys[ i ];
if( !isalive( array[ key ] ) )
{
continue;
}
newArray[ key ] = array[ key ];
}
return newArray;
}
array_removeDead( array )
{
newArray = [];
if( !IsDefined( array ) )
{
return undefined;
}
for( i = 0; i < array.size; i++ )
{
if( !isalive( array[ i ] ) || ( isDefined( array[i].isacorpse) && array[i].isacorpse) )
{
continue;
}
newArray[ newArray.size ] = array[ i ];
}
return newArray;
}
struct_arraySpawn()
{
struct = SpawnStruct();
struct.array = [];
struct.lastindex = 0;
return struct;
}
structarray_add( struct, object )
{
assert( !IsDefined( object.struct_array_index ) );
struct.array[ struct.lastindex ] = object;
object.struct_array_index = struct.lastindex;
struct.lastindex ++ ;
}
structarray_remove( struct, object )
{
structarray_swaptolast( struct, object );
struct.array[ struct.lastindex - 1 ] = undefined;
struct.lastindex -- ;
}
structarray_swaptolast( struct, object )
{
struct structarray_swap( struct.array[ struct.lastindex - 1 ], object );
}
structarray_shuffle( struct, shuffle )
{
for( i = 0;i < shuffle;i++ )
{
struct structarray_swap( struct.array[ i ], struct.array[ randomint( struct.lastindex ) ] );
}
}
custom_battlechatter( string )
{
excluders = [];
excluders[ 0 ] = self;
buddy = get_closest_ai_exclude( self.origin, self.team, excluders );
if( IsDefined( buddy ) && Distance( buddy.origin, self.origin ) > 384 )
{
buddy = undefined;
}
self animscripts\battlechatter_ai::beginCustomEvent();
tokens = Strtok( string, "_" );
if( !tokens.size )
{
return;
}
if( tokens[ 0 ] == "move" )
{
if( tokens.size > 1 )
{
modifier = tokens[ 1 ];
}
else
{
modifier = "generic";
}
self animscripts\battlechatter_ai::addGenericAliasEx( "order", "move", modifier );
}
else if( tokens[ 0 ] == "infantry" )
{
self animscripts\battlechatter_ai::addGenericAliasEx( "threat", "infantry", tokens[ 1 ] );
if( tokens.size > 2 && tokens[ 2 ] != "inbound" )
{
self animscripts\battlechatter_ai::addGenericAliasEx( "direction", "relative", tokens[ 2 ] );
}
else if( tokens.size > 2 )
{
self animscripts\battlechatter_ai::addGenericAliasEx( "direction", "inbound", tokens[ 3 ] );
}
}
else if( tokens[ 0 ] == "vehicle" )
{
self animscripts\battlechatter_ai::addGenericAliasEx( "threat", "vehicle", tokens[ 1 ] );
if( tokens.size > 2 && tokens[ 2 ] != "inbound" )
{
self animscripts\battlechatter_ai::addGenericAliasEx( "direction", "relative", tokens[ 2 ] );
}
else if( tokens.size > 2 )
{
self animscripts\battlechatter_ai::addGenericAliasEx( "direction", "inbound", tokens[ 3 ] );
}
}
self animscripts\battlechatter_ai::endCustomEvent( 2000 );
}
buildbcalias( action, type, modifier )
{
if( IsDefined( modifier ) )
{
return( self.countryID + "_" + self.npcID + "_" + action + "_" + type + "_" + modifier );
}
else
{
return( self.countryID + "_" + self.npcID + "_" + action + "_" + type );
}
}
get_stop_watch( time, othertime )
{
watch = NewHudElem();
if( level.console )
{
watch.x = 68;
watch.y = 35;
}
else
{
watch.x = 58;
watch.y = 95;
}
watch.alignx = "center";
watch.aligny = "middle";
watch.horzAlign = "left";
watch.vertAlign = "middle";
if( IsDefined( othertime ) )
{
timer = othertime;
}
else
{
timer = level.explosiveplanttime;
}
watch setClock( timer, time, "hudStopwatch", 64, 64 );
return watch;
}
missionfailedwrapper( fail_hint, shader, iWidth, iHeight, fDelay, x, y )
{
if( level.missionfailed )
{
return;
}
if ( IsDefined( level.nextmission ) )
{
return;
}
if ( GetDvar( #"failure_disabled" ) == "1" )
{
return;
}
screen_message_delete();
if( IsDefined( fail_hint ) )
{
SetDvar( "ui_deadquote", fail_hint );
}
if( IsDefined( shader ) )
{
get_players()[0] thread maps\_load_common::special_death_indicator_hudelement( shader, iWidth, iHeight, fDelay, x, y );
}
level.missionfailed = true;
flag_set( "missionfailed" );
MissionFailed();
}
nextmission()
{
maps\_endmission::_nextmission();
}
prefetchnext()
{
maps\_endmission::prefetch_next();
}
script_delay()
{
if( IsDefined( self.script_delay ) )
{
wait( self.script_delay );
return true;
}
else if( IsDefined( self.script_delay_min ) && IsDefined( self.script_delay_max ) )
{
wait( RandomFloatrange( self.script_delay_min, self.script_delay_max ) );
return true;
}
return false;
}
script_wait( called_from_spawner )
{
if (!IsDefined(called_from_spawner))
{
called_from_spawner = false;
}
coop_scalar = 1;
if ( called_from_spawner )
{
players = get_players();
if (players.size == 2)
{
coop_scalar = 0.7;
}
else if (players.size == 3)
{
coop_scalar = 0.4;
}
else if (players.size == 4)
{
coop_scalar = 0.1;
}
}
startTime = GetTime();
if( IsDefined( self.script_wait ) )
{
wait( self.script_wait * coop_scalar);
if( IsDefined( self.script_wait_add ) )
{
self.script_wait += self.script_wait_add;
}
}
else if( IsDefined( self.script_wait_min ) && IsDefined( self.script_wait_max ) )
{
wait( RandomFloatrange( self.script_wait_min, self.script_wait_max ) * coop_scalar);
if( IsDefined( self.script_wait_add ) )
{
self.script_wait_min += self.script_wait_add;
self.script_wait_max += self.script_wait_add;
}
}
return( GetTime() - startTime );
}
enter_vehicle( vehicle, tag )
{
self maps\_vehicle_aianim::vehicle_enter( vehicle, tag );
}
guy_array_enter_vehicle( guy, vehicle )
{
maps\_vehicle_aianim::guy_array_enter( guy, vehicle );
}
run_to_vehicle_load(vehicle, bGodDriver, seat_tag)
{
self maps\_vehicle_aianim::run_to_vehicle( vehicle, bGodDriver, seat_tag );
}
vehicle_unload(delay)
{
self maps\_vehicle::do_unload(delay);
}
vehicle_override_anim(action, tag, animation)
{
self maps\_vehicle_aianim::override_anim(action, tag, animation);
}
set_wait_for_players(seat_tag, player_array)
{
vehicleanim = level.vehicle_aianims[ self.vehicletype ];
for(i = 0; i < vehicleanim.size; i++)
{
if(vehicleanim[i].sittag == seat_tag)
{
vehicleanim[i].wait_for_player = [];
for(j = 0; j < player_array.size; j++)
{
vehicleanim[i].wait_for_player[j] = player_array[j];
}
break;
}
}
}
set_wait_for_notify(seat_tag, custom_notify)
{
vehicleanim = level.vehicle_aianims[ self.vehicletype ];
for(i = 0; i < vehicleanim.size; i++)
{
if(vehicleanim[i].sittag == seat_tag)
{
vehicleanim[i].wait_for_notify = custom_notify;
break;
}
}
}
is_on_vehicle(vehicle)
{
if(!IsDefined(self.viewlockedentity))
{
return false;
}
else if(self.viewlockedentity == vehicle)
{
return true;
}
if(!IsDefined(self.groundentity))
{
return false;
}
else if(self.groundentity == vehicle)
{
return true;
}
return false;
}
get_force_color_guys( team, color )
{
ai = GetAiArray( team );
guys = [];
for( i = 0; i < ai.size; i++ )
{
guy = ai[ i ];
if( !IsDefined( guy.script_forceColor ) )
{
continue;
}
if( guy.script_forceColor != color )
{
continue;
}
guys[ guys.size ] = guy;
}
return guys;
}
get_all_force_color_friendlies()
{
ai = GetAiArray( "allies" );
guys = [];
for( i = 0; i < ai.size; i++ )
{
guy = ai[ i ];
if( !IsDefined( guy.script_forceColor ) )
{
continue;
}
guys[ guys.size ] = guy;
}
return guys;
}
enable_ai_color()
{
if( IsDefined( self.script_forceColor ) )
{
return;
}
if( !IsDefined( self.old_forceColor ) )
{
return;
}
set_force_color( self.old_forcecolor );
self.old_forceColor = undefined;
}
disable_ai_color()
{
if( IsDefined( self.new_force_color_being_set ) )
{
self endon( "death" );
self waittill( "done_setting_new_color" );
}
self clearFixedNodeSafeVolume();
if( !IsDefined( self.script_forceColor ) )
{
return;
}
assertEx( !IsDefined( self.old_forcecolor ), "Tried to disable forcecolor on a guy that somehow had a old_forcecolor already. Investigate!!!" );
self.old_forceColor = self.script_forceColor;
level.arrays_of_colorForced_ai[ self.team ][ self.script_forcecolor ] = array_remove( level.arrays_of_colorForced_ai[ self.team ][ self.script_forcecolor ], self );
maps\_colors::left_color_node();
self.script_forceColor = undefined;
self.currentColorCode = undefined;
}
clear_force_color()
{
disable_ai_color();
}
check_force_color( _color )
{
color = level.colorCheckList[ tolower( _color ) ];
if( IsDefined( self.script_forcecolor ) && color == self.script_forcecolor )
{
return true;
}
else
{
return false;
}
}
get_force_color()
{
color = self.script_forceColor;
return color;
}
shortenColor( color )
{
assertEx( IsDefined( level.colorCheckList[ tolower( color ) ] ), "Tried to set force color on an undefined color: " + color );
return level.colorCheckList[ tolower( color ) ];
}
set_force_color( _color )
{
color = shortenColor( _color );
assertEx( maps\_colors::colorIsLegit( color ), "Tried to set force color on an undefined color: " + color );
if( !isAI( self ) )
{
set_force_color_spawner( color );
return;
}
assertEx( isalive( self ), "Tried to set force color on a dead / undefined entity." );
if( self.team == "allies" )
{
self.fixedNode = true;
self.fixedNodeSafeRadius = 64;
self.pathEnemyFightDist = 0;
self.pathEnemyLookAhead = 0;
}
self.script_color_axis = undefined;
self.script_color_allies = undefined;
self.old_forcecolor = undefined;
if( IsDefined( self.script_forcecolor ) )
{
level.arrays_of_colorForced_ai[ self.team ][ self.script_forcecolor ] = array_remove( level.arrays_of_colorForced_ai[ self.team ][ self.script_forcecolor ], self );
}
self.script_forceColor = color;
level.arrays_of_colorForced_ai[ self.team ][ self.script_forceColor ] = array_add( level.arrays_of_colorForced_ai[ self.team ][ self.script_forceColor ], self );
thread new_color_being_set( color );
}
set_force_color_spawner( color )
{
self.script_forceColor = color;
self.old_forceColor = undefined;
}
issue_color_orders( color_team, team )
{
colorCodes = Strtok( color_team, " " );
colors = [];
colorCodesByColorIndex = [];
for( i = 0;i < colorCodes.size;i++ )
{
color = undefined;
if( issubstr( colorCodes[ i ], "r" ) )
{
color = "r";
}
else if( issubstr( colorCodes[ i ], "b" ) )
{
color = "b";
}
else if( issubstr( colorCodes[ i ], "y" ) )
{
color = "y";
}
else if( issubstr( colorCodes[ i ], "c" ) )
{
color = "c";
}
else if( issubstr( colorCodes[ i ], "g" ) )
{
color = "g";
}
else if( issubstr( colorCodes[ i ], "p" ) )
{
color = "p";
}
else if( issubstr( colorCodes[ i ], "o" ) )
{
color = "o";
}
else
{
assertEx( 0, "Trigger at origin " + self getorigin() + " had strange color index " + colorCodes[ i ] );
}
colorCodesByColorIndex[ color ] = colorCodes[ i ];
colors[ colors.size ] = color;
}
assert( colors.size == colorCodes.size );
for( i = 0;i < colorCodes.size;i++ )
{
level.arrays_of_colorCoded_spawners[ team ][ colorCodes[ i ] ] = array_removeUndefined( level.arrays_of_colorCoded_spawners[ team ][ colorCodes[ i ] ] );
assertex( IsDefined( level.arrays_of_colorCoded_spawners[ team ][ colorCodes[ i ] ] ), "Trigger refer to a color# that does not exist in any node for this team." );
for( p = 0;p < level.arrays_of_colorCoded_spawners[ team ][ colorCodes[ i ] ].size;p ++ )
{
level.arrays_of_colorCoded_spawners[ team ][ colorCodes[ i ] ][ p ].currentColorCode = colorCodes[ i ];
}
}
for( i = 0;i < colors.size;i++ )
{
level.arrays_of_colorForced_ai[ team ][ colors[ i ] ] = array_removeDead( level.arrays_of_colorForced_ai[ team ][ colors[ i ] ] );
level.currentColorForced[ team ][ colors[ i ] ] = colorCodesByColorIndex[ colors[ i ] ];
}
for( i = 0;i < colorCodes.size;i++ )
{
ai_array = [];
ai_array = maps\_colors::issue_leave_node_order_to_ai_and_get_ai( colorCodes[ i ], colors[ i ], team );
maps\_colors::issue_color_order_to_ai( colorCodes[ i ], colors[ i ], team, ai_array );
}
}
disable_replace_on_death()
{
self.replace_on_death = undefined;
self notify( "_disable_reinforcement" );
}
createLoopEffect( fxid )
{
ent = maps\_createfx::createEffect( "loopfx", fxid );
ent.v[ "delay" ] = 0.5;
return ent;
}
createOneshotEffect( fxid )
{
ent = maps\_createfx::createEffect( "oneshotfx", fxid );
ent.v[ "delay" ] = -15;
return ent;
}
reportExploderIds()
{
if(!IsDefined(level._exploder_ids))
{
return;
}
keys = GetArrayKeys( level._exploder_ids );
println("Server Exploder dictionary : ");
for( i = 0; i < keys.size; i++ )
{
println(keys[i] + " : " + level._exploder_ids[keys[i]]);
}
}
getExploderId( ent )
{
if(!IsDefined(level._exploder_ids))
{
level._exploder_ids = [];
level._exploder_id = 1;
}
if(!IsDefined(level._exploder_ids[ent.v["exploder"]]))
{
level._exploder_ids[ent.v["exploder"]] = level._exploder_id;
level._exploder_id ++;
}
return level._exploder_ids[ent.v["exploder"]];
}
createExploder( fxid )
{
ent = maps\_createfx::createEffect( "exploder", fxid );
ent.v[ "delay" ] = 0;
ent.v[ "exploder_type" ] = "normal";
return ent;
}
vehicle_detachfrompath()
{
maps\_vehicle::vehicle_pathDetach();
}
vehicle_resumepath()
{
thread maps\_vehicle::vehicle_resumepathvehicle();
}
vehicle_land()
{
maps\_vehicle::vehicle_landvehicle();
}
vehicle_liftoff( height )
{
maps\_vehicle::vehicle_liftoffvehicle( height );
}
vehicle_dynamicpath( node, bwaitforstart )
{
maps\_vehicle::vehicle_paths( node, bwaitforstart );
}
groundpos( origin )
{
return bullettrace( origin, ( origin + ( 0, 0, -100000 ) ), 0, self )[ "position" ];
}
playergroundpos(origin)
{
return playerphysicstrace(origin, ( origin + ( 0, 0, -100000 ) ));
}
getvehiclespawner( targetname )
{
spawner = getent( targetname + "_vehiclespawner", "targetname" );
return spawner;
}
getvehiclespawnerarray( targetname )
{
spawner = getentarray( targetname + "_vehiclespawner", "targetname" );
return spawner;
}
player_fudge_moveto( dest, moverate )
{
if( !IsDefined( moverate ) )
{
moverate = 200;
}
org = Spawn( "script_origin", self.origin );
org.angles = self.angles;
self LinkTo( org );
dist = Distance( self.origin, dest );
movetime = dist/moverate;
org MoveTo( dest, dist/moverate, .05, .05 );
wait( movetime );
self UnLink();
org Delete();
}
add_start( msg, func, loc_string )
{
assertex( !IsDefined( level._loadStarted ), "Can't create starts after _load" );
if( !IsDefined( level.start_functions ) )
{
level.start_functions = [];
}
msg = tolower( msg );
level.start_functions[ msg ] = func;
if( IsDefined(loc_string) )
{
precachestring(loc_string);
level.start_loc_string[ msg ] = loc_string;
}
else
{
level.start_loc_string[ msg ] = &"MISSING_LOC_STRING";
}
}
default_start( func, bSplash )
{
level.default_start = func;
}
start_teleport_players( start_name, coop_sort )
{
players = get_players();
if( IsDefined( coop_sort ) && coop_sort )
{
starts = get_sorted_starts( start_name );
}
else
{
starts = getstructarray( start_name, "targetname" );
}
assertex( starts.size >= players.size, "Need more start positions for players!" );
for (i = 0; i < players.size; i++)
{
players[i] setOrigin( starts[i].origin );
if( IsDefined( starts[i].angles ) )
{
players[i] setPlayerAngles( starts[i].angles );
}
}
set_breadcrumbs(starts);
}
get_sorted_starts( start_name )
{
player_starts = getstructarray( start_name, "targetname" );
for( i = 0; i < player_starts.size; i++ )
{
for( j = i; j < player_starts.size; j++ )
{
assertex( IsDefined( player_starts[j].script_int ), "start at: " + player_starts[j].origin + " must have a script_int set for coop spawning" );
assertex( IsDefined( player_starts[i].script_int ), "start at: " + player_starts[i].origin + " must have a script_int set for coop spawning" );
if( player_starts[j].script_int < player_starts[i].script_int )
{
temp = player_starts[i];
player_starts[i] = player_starts[j];
player_starts[j] = temp;
}
}
}
return player_starts;
}
start_teleport_ai( start_name, ai_names )
{
friendly_ai = get_ai_array( ai_names, "script_noteworthy" );
ai_starts = getstructarray( start_name + "_ai", "targetname");
assertex( ai_starts.size >= friendly_ai.size, "Need more start positions for ai!" );
for (i = 0; i < friendly_ai.size; i++)
{
start_i = 0;
if (IsDefined(friendly_ai[i].script_int))
{
for (j = 0; j < ai_starts.size; j++)
{
if (IsDefined(ai_starts[j].script_int))
{
if (ai_starts[j].script_int == friendly_ai[i].script_int)
{
start_i = j;
break;
}
}
}
}
friendly_ai[i] start_teleport_single_ai(ai_starts[start_i]);
ai_starts = array_remove(ai_starts, ai_starts[start_i]);
}
}
start_teleport_single_ai(ai_start)
{
if( IsDefined( ai_start.angles ) )
{
self forceteleport( ai_start.origin, ai_start.angles );
}
else
{
self forceteleport( ai_start.origin );
}
if (IsDefined(ai_start.target))
{
node = GetNode(ai_start.target, "targetname");
if (IsDefined(node))
{
self SetGoalNode(node);
return;
}
}
self SetGoalPos(ai_start.origin);
}
start_teleport( start_name, ai_names, coop_sort )
{
if( IsDefined( ai_names ) )
{
start_teleport_ai( start_name, ai_names );
}
start_teleport_players( start_name, coop_sort );
}
within_fov( start_origin, start_angles, end_origin, fov )
{
normal = VectorNormalize( end_origin - start_origin );
forward = AnglesToForward( start_angles );
dot = VectorDot( forward, normal );
return dot >= fov;
}
wait_for_buffer_time_to_pass( last_queue_time, buffer_time )
{
timer = buffer_time * 1000 - ( gettime() - last_queue_time );
timer *= 0.001;
if ( timer > 0 )
{
wait( timer );
}
}
dialogue_queue( msg )
{
self maps\_anim::anim_single_queue( self, msg );
}
hint_position_internal( bgAlpha )
{
if( level.console )
{
self.elm.fontScale = 2;
}
else
{
self.elm.fontScale = 1.6;
}
self.elm.x = 0;
self.elm.y = -40;
self.elm.alignX = "center";
self.elm.alignY = "bottom";
self.elm.horzAlign = "center";
self.elm.vertAlign = "middle";
self.elm.sort = 1;
self.elm.alpha = 0.8;
if( !IsDefined( self.bg ) )
{
return;
}
self.bg.x = 0;
self.bg.y = -40;
self.bg.alignX = "center";
self.bg.alignY = "middle";
self.bg.horzAlign = "center";
self.bg.vertAlign = "middle";
self.bg.sort = -1;
if( level.console )
{
self.bg SetShader( "popmenu_bg", 650, 52 );
}
else
{
self.bg SetShader( "popmenu_bg", 650, 42 );
}
if ( !IsDefined( bgAlpha ) )
{
bgAlpha = 0.5;
}
self.bg.alpha = bgAlpha;
}
string( num )
{
return( "" + num );
}
clear_threatbias( group1, group2 )
{
SetThreatBias( group1, group2, 0 );
SetThreatBias( group2, group1, 0 );
}
add_global_spawn_function( team, function, param1, param2, param3 )
{
assertEx( IsDefined( level.spawn_funcs ), "Tried to add_global_spawn_function before calling _load" );
func = [];
func[ "function" ] = function;
func[ "param1" ] = param1;
func[ "param2" ] = param2;
func[ "param3" ] = param3;
level.spawn_funcs[ team ][ level.spawn_funcs[ team ].size ] = func;
}
remove_global_spawn_function( team, function )
{
assertEx( IsDefined( level.spawn_funcs ), "Tried to remove_global_spawn_function before calling _load" );
array = [];
for( i = 0; i < level.spawn_funcs[ team ].size; i++ )
{
if( level.spawn_funcs[ team ][ i ][ "function" ] != function )
{
array[ array.size ] = level.spawn_funcs[ team ][ i ];
}
}
assertEx( level.spawn_funcs[ team ].size != array.size, "Tried to remove a function from level.spawn_funcs, but that function didn't exist!" );
level.spawn_funcs[ team ] = array;
}
add_spawn_function( function, param1, param2, param3, param4 )
{
AssertEx( !IsDefined( level._loadStarted ) || !IsAlive( self ), "Tried to add_spawn_function to a living guy." );
func = [];
func[ "function" ] = function;
func[ "param1" ] = param1;
func[ "param2" ] = param2;
func[ "param3" ] = param3;
func[ "param4" ] = param4;
if (!IsDefined(self.spawn_funcs))
{
self.spawn_funcs = [];
}
self.spawn_funcs[ self.spawn_funcs.size ] = func;
}
add_spawn_function_veh( veh_targetname, function, param1, param2, param3, param4 )
{
assertEx( IsDefined(level.vehicleSpawners), "Tried to add_spawn_function_veh before vehicle spawners were inited");
func = [];
func[ "function" ] = function;
func[ "param1" ] = param1;
func[ "param2" ] = param2;
func[ "param3" ] = param3;
func[ "param4" ] = param4;
func_count_added = 0;
for( i = 0; func_count_added < level.vehicleSpawners.size; i++ )
{
if(!IsDefined(level.vehicleSpawners[i]))
{
continue;
}
else
{
for( j = 0; j < level.vehicleSpawners[i].size; j++ )
{
if( IsDefined(level.vehicleSpawners[i][j].targetname) && level.vehicleSpawners[i][j].targetname == veh_targetname + "_vehiclespawner" )
{
if(!IsDefined( level.vehicleSpawners[i][j].spawn_funcs ))
{
level.vehicleSpawners[i][j].spawn_funcs = [];
}
level.vehicleSpawners[i][j].spawn_funcs[ level.vehicleSpawners[i][j].spawn_funcs.size ] = func;
}
}
func_count_added++;
}
}
}
add_spawn_function_veh_by_type( veh_type, function, param1, param2, param3, param4 )
{
assertEx( IsDefined(level.vehicleSpawners), "Tried to add_spawn_function_veh_by_type before vehicle spawners were inited");
func = [];
func[ "function" ] = function;
func[ "param1" ] = param1;
func[ "param2" ] = param2;
func[ "param3" ] = param3;
func[ "param4" ] = param4;
func_count_added = 0;
for( i = 0; func_count_added < level.vehicleSpawners.size; i++ )
{
if(!IsDefined(level.vehicleSpawners[i]))
{
continue;
}
else
{
for( j = 0; j < level.vehicleSpawners[i].size; j++ )
{
if( IsDefined(level.vehicleSpawners[i][j].vehicletype) && level.vehicleSpawners[i][j].vehicletype == veh_type )
{
if(!IsDefined( level.vehicleSpawners[i][j].spawn_funcs ))
{
level.vehicleSpawners[i][j].spawn_funcs = [];
}
level.vehicleSpawners[i][j].spawn_funcs[ level.vehicleSpawners[i][j].spawn_funcs.size ] = func;
}
}
func_count_added++;
}
}
}
ignore_triggers( timer )
{
self endon( "death" );
self.ignoreTriggers = true;
if( IsDefined( timer ) )
{
wait( timer );
}
else
{
wait( 0.5 );
}
self.ignoreTriggers = false;
}
delayThread( timer, func, param1, param2, param3, param4 )
{
thread delayThread_proc( func, timer, param1, param2, param3, param4 );
}
activate_trigger_with_targetname( msg )
{
trigger = getent( msg, "targetname" );
trigger activate_trigger();
}
activate_trigger_with_noteworthy( msg )
{
trigger = getent( msg, "script_noteworthy" );
trigger activate_trigger();
}
disable_trigger_with_targetname( msg )
{
trigger = getent( msg, "targetname" );
trigger trigger_off();
}
disable_trigger_with_noteworthy( msg )
{
trigger = getent( msg, "script_noteworthy" );
trigger trigger_off();
}
enable_trigger_with_targetname( msg )
{
trigger = getent( msg, "targetname" );
trigger trigger_on();
}
enable_trigger_with_noteworthy( msg )
{
trigger = getent( msg, "script_noteworthy" );
trigger trigger_on();
}
is_hero()
{
return IsDefined( level.hero_list[ get_ai_number() ] );
}
get_ai_number()
{
if( !IsDefined( self.ai_number ) )
{
set_ai_number();
}
return self.ai_number;
}
set_ai_number()
{
self.ai_number = level.ai_number;
level.ai_number ++ ;
}
make_hero()
{
self magic_bullet_shield();
level.hero_list[ self.ai_number ] = self;
self.ikpriority = 5;
self thread unmake_hero_on_death();
}
unmake_hero_on_death()
{
self waittill("death");
level.hero_list[ self.ai_number ] = undefined;
}
unmake_hero()
{
self thread stop_magic_bullet_shield();
level.hero_list[ self.ai_number ] = undefined;
self.ikpriority = 0;
}
get_heroes()
{
return level.hero_list;
}
replace_on_death()
{
maps\_colors::colorNode_replace_on_death();
}
spawn_reinforcement( classname, color )
{
maps\_colors::colorNode_spawn_reinforcement( classname, color );
}
clear_promotion_order()
{
level.current_color_order = [];
}
set_promotion_order( deadguy, replacer )
{
if( !IsDefined( level.current_color_order ) )
{
level.current_color_order = [];
}
deadguy = shortenColor( deadguy );
replacer = shortenColor( replacer );
level.current_color_order[ deadguy ] = replacer;
if( !IsDefined( level.current_color_order[ replacer ] ) )
{
set_empty_promotion_order( replacer );
}
}
set_empty_promotion_order( deadguy )
{
if( !IsDefined( level.current_color_order ) )
{
level.current_color_order = [];
}
level.current_color_order[ deadguy ] = "none";
}
remove_dead_from_array( array )
{
newarray = [];
for( i = 0; i < array.size; i++ )
{
if( !isalive( array[ i ] ) )
{
continue;
}
newarray[ newarray.size ] = array[ i ];
}
return newarray;
}
remove_heroes_from_array( array )
{
newarray = [];
for( i = 0; i < array.size; i++ )
{
if( array[ i ] is_hero() )
{
continue;
}
newarray[ newarray.size ] = array[ i ];
}
return newarray;
}
remove_all_animnamed_guys_from_array( array )
{
newarray = [];
for( i = 0; i < array.size; i++ )
{
if( IsDefined( array[ i ].animname ) )
{
continue;
}
newarray[ newarray.size ] = array[ i ];
}
return newarray;
}
remove_color_from_array( array, color )
{
newarray = [];
for( i = 0; i < array.size; i++ )
{
guy = array[ i ];
if( !IsDefined( guy.script_forceColor ) )
{
continue;
}
if( guy.script_forceColor == color )
{
continue;
}
newarray[ newarray.size ] = guy;
}
return newarray;
}
remove_noteworthy_from_array( array, noteworthy )
{
newarray = [];
for( i = 0; i < array.size; i++ )
{
guy = array[ i ];
if( IsDefined( guy.script_noteworthy ) && guy.script_noteworthy == noteworthy )
{
continue;
}
newarray[ newarray.size ] = guy;
}
return newarray;
}
get_closest_colored_friendly( color, origin )
{
allies = get_force_color_guys( "allies", color );
allies = remove_heroes_from_array( allies );
if( !IsDefined( origin ) )
{
players = get_players();
friendly_origin = players[0].origin;
}
else
{
friendly_origin = origin;
}
return getclosest( friendly_origin, allies );
}
remove_without_classname( array, classname )
{
newarray = [];
for( i = 0; i < array.size; i++ )
{
if( !issubstr( array[ i ].classname, classname ) )
{
continue;
}
newarray[ newarray.size ] = array[ i ];
}
return newarray;
}
remove_without_model( array, model )
{
newarray = [];
for( i = 0; i < array.size; i++ )
{
if( !issubstr( array[ i ].model, model ) )
{
continue;
}
newarray[ newarray.size ] = array[ i ];
}
return newarray;
}
get_closest_colored_friendly_with_classname( color, classname, origin )
{
allies = get_force_color_guys( "allies", color );
allies = remove_heroes_from_array( allies );
if( !IsDefined( origin ) )
{
players = get_players();
friendly_origin = players[0].origin;
}
else
{
friendly_origin = origin;
}
allies = remove_without_classname( allies, classname );
return getclosest( friendly_origin, allies );
}
promote_nearest_friendly( colorFrom, colorTo )
{
for( ;; )
{
friendly = get_closest_colored_friendly( colorFrom );
if( !IsAlive( friendly ) )
{
wait( 1 );
continue;
}
friendly set_force_color( colorTo );
return;
}
}
instantly_promote_nearest_friendly( colorFrom, colorTo )
{
for( ;; )
{
friendly = get_closest_colored_friendly( colorFrom );
if( !IsAlive( friendly ) )
{
assertex( 0, "Instant promotion from " + colorFrom + " to " + colorTo + " failed!" );
return;
}
friendly set_force_color( colorTo );
return;
}
}
instantly_promote_nearest_friendly_with_classname( colorFrom, colorTo, classname )
{
for( ;; )
{
friendly = get_closest_colored_friendly_with_classname( colorFrom, classname );
if( !IsAlive( friendly ) )
{
assertex( 0, "Instant promotion from " + colorFrom + " to " + colorTo + " failed!" );
return;
}
friendly set_force_color( colorTo );
return;
}
}
promote_nearest_friendly_with_classname( colorFrom, colorTo, classname )
{
for( ;; )
{
friendly = get_closest_colored_friendly_with_classname( colorFrom, classname );
if( !isalive( friendly ) )
{
wait( 1 );
continue;
}
friendly set_force_color( colorTo );
return;
}
}
instantly_set_color_from_array_with_classname( array, color, classname )
{
foundGuy = false;
newArray = [];
for( i = 0; i < array.size; i++ )
{
guy = array[ i ];
if( foundGuy || !isSubstr( guy.classname, classname ) )
{
newArray[ newArray.size ] = guy;
continue;
}
foundGuy = true;
guy set_force_color( color );
}
return newArray;
}
instantly_set_color_from_array( array, color )
{
foundGuy = false;
newArray = [];
for( i = 0; i < array.size; i++ )
{
guy = array[ i ];
if( foundGuy )
{
newArray[ newArray.size ] = guy;
continue;
}
foundGuy = true;
guy set_force_color( color );
}
return newArray;
}
wait_for_flag_or_timeout( msg, timer )
{
if( flag( msg ) )
{
return;
}
ent = SpawnStruct();
ent thread ent_waits_for_level_notify( msg );
ent thread ent_times_out( timer );
ent waittill( "done" );
}
wait_for_trigger_or_timeout( timer )
{
ent = SpawnStruct();
ent thread ent_waits_for_trigger( self );
ent thread ent_times_out( timer );
ent waittill( "done" );
}
wait_for_either_trigger( msg1, msg2 )
{
ent = SpawnStruct();
array = [];
array = array_combine( array, GetEntArray( msg1, "targetname" ) );
array = array_combine( array, GetEntArray( msg2, "targetname" ) );
for( i = 0; i < array.size; i++ )
{
ent thread ent_waits_for_trigger( array[ i ] );
}
ent waittill( "done" );
}
dronespawn( spawner )
{
drone = maps\_spawner::spawner_dronespawn( spawner );
assert( IsDefined( drone ) );
return drone;
}
make_real_ai( drone )
{
return maps\_spawner::spawner_make_real_ai( drone );
}
get_trigger_flag(flag_name_override)
{
if (IsDefined(flag_name_override))
{
return flag_name_override;
}
if( IsDefined( self.script_flag ) )
{
return self.script_flag;
}
if( IsDefined( self.script_noteworthy ) )
{
return self.script_noteworthy;
}
assertex( 0, "Flag trigger at " + self.origin + " has no script_flag set." );
}
is_spawner()
{
return (is_true(self.is_spawner));
}
set_default_pathenemy_settings()
{
if( self.team == "allies" )
{
self.pathEnemyLookAhead = 350;
self.pathEnemyFightDist = 350;
return;
}
if( self.team == "axis" )
{
self.pathEnemyLookAhead = 350;
self.pathEnemyFightDist = 350;
return;
}
}
enable_heat()
{
self thread call_overloaded_func( "animscripts\anims_table", "setup_heat_anim_array" );
}
disable_heat()
{
self thread call_overloaded_func( "animscripts\anims_table", "reset_heat_anim_array" );
}
enable_cqbwalk()
{
self.cqbwalking = true;
level thread call_overloaded_func( "animscripts\cqb", "findCQBPointsOfInterest" );
self thread call_overloaded_func( "animscripts\anims_table", "setup_cqb_anim_array" );
}
disable_cqbwalk()
{
if(!IsDefined(self) && (!IsAlive(self)) )
{
return;
}
self.cqbwalking = false;
self.sprint = false;
self.cqb_point_of_interest = undefined;
self thread call_overloaded_func( "animscripts\anims_table", "reset_cqb_anim_array" );
}
enable_cqbsprint()
{
if( !( self animscripts\utility::isCQBWalking() ) )
self enable_cqbwalk();
self.sprint = true;
}
disable_cqbsprint()
{
self.sprint = false;
}
cqb_aim( the_target )
{
if( !IsDefined( the_target ) )
{
self.cqb_target = undefined;
}
else
{
self.cqb_target = the_target;
if( !IsDefined( the_target.origin ) )
{
assertmsg( "target passed into cqb_aim does not have an origin!" );
}
}
}
set_force_cover( val )
{
assertex( val == "hide" || val == "none" || val == "show", "invalid force cover set on guy" );
assertex( IsAlive( self ), "Tried to set force cover on a dead guy" );
self.a.forced_cover = val;
}
waittill_notify_or_timeout( msg, timer )
{
self endon( msg );
wait( timer );
}
waittill_any_or_timeout( timer, string1, string2, string3, string4, string5 )
{
assert( IsDefined( string1 ) );
self endon( string1 );
if ( IsDefined( string2 ) )
{
self endon( string2 );
}
if ( IsDefined( string3 ) )
{
self endon( string3 );
}
if ( IsDefined( string4 ) )
{
self endon( string4 );
}
if ( IsDefined( string5 ) )
{
self endon( string5 );
}
wait( timer );
}
scrub_guy()
{
self SetThreatBiasGroup( self.team );
self.script_accuracy = 1;
self.perfectAim = false;
set_default_pathenemy_settings();
maps\_gameskill::grenadeAwareness();
self clear_force_color();
maps\_spawner::set_default_covering_fire();
self.interval = 96;
self.disableArrivals = undefined;
self.ignoreme = false;
self.threatbias = 0;
self.pacifist = false;
self.pacifistWait = 20;
self.IgnoreRandomBulletDamage = false;
self.playerPushable = true;
self.precombatrunEnabled = true;
self.accuracystationarymod = 1;
self.allowdeath = false;
self.anglelerprate = 540;
self.badplaceawareness = 0.75;
self.chainfallback = 0;
self.dontavoidplayer = 0;
self.drawoncompass = 1;
self.activatecrosshair = true;
self.dropweapon = 1;
self.goalradius = level.default_goalradius;
self.goalheight = level.default_goalheight;
self.ignoresuppression = 0;
self PushPlayer( false );
if ( IsDefined( self.magic_bullet_shield ) && self.magic_bullet_shield )
{
stop_magic_bullet_shield();
}
self disable_replace_on_death();
self.maxsightdistsqrd = 8192*8192;
if( WeaponClass( self.weapon ) == "gas" )
{
self.maxSightDistSqrd = 1024 * 1024;
}
self.script_forceGrenade = 0;
self.walkdist = 16;
self unmake_hero();
self.pushable = true;
call_overloaded_func( "animscripts\init", "set_anim_playback_rate" );
self.fixednode = self.team == "allies";
if( IsDefined( self.script_grenades ) )
{
self.grenadeAmmo = self.script_grenades;
}
else
{
self.grenadeAmmo = 3;
}
}
send_notify( msg )
{
self notify( msg );
}
getfx( fx )
{
assertEx( IsDefined( level._effect[ fx ] ), "Fx " + fx + " is not defined in level._effect." );
return level._effect[ fx ];
}
getanim( anime )
{
assertex( IsDefined( self.animname ), "Called getanim on a guy with no animname" );
assertEx( IsDefined( level.scr_anim[ self.animname ][ anime ] ), "Called getanim on an inexistent anim" );
return level.scr_anim[ self.animname ][ anime ];
}
getanim_from_animname( anime, animname )
{
assertEx( IsDefined( animname ), "Must supply an animname" );
assertEx( IsDefined( level.scr_anim[ animname ][ anime ] ), "Called getanim on an inexistent anim" );
return level.scr_anim[ animname ][ anime ];
}
getanim_generic( anime )
{
assertEx( IsDefined( level.scr_anim[ "generic" ][ anime ] ), "Called getanim_generic on an inexistent anim" );
return level.scr_anim[ "generic" ][ anime ];
}
add_hint_string( name, string, optionalFunc )
{
assertex( IsDefined( level.trigger_hint_string ), "Tried to add a hint string before _load was called." );
assertex( IsDefined( name ), "Set a name for the hint string. This should be the same as the script_hint on the trigger_hint." );
assertex( IsDefined( string ), "Set a string for the hint string. This is the string you want to appear when the trigger is hit." );
level.trigger_hint_string[ name ] = string;
precachestring( string );
if( IsDefined( optionalFunc ) )
{
level.trigger_hint_func[ name ] = optionalFunc;
}
}
ThrowGrenadeAtPlayerASAP()
{
players = get_players();
if ( players.size > 0 )
{
best_target = undefined;
closest_dist = 99999999;
for (i=0;i<players.size;i++)
{
if ( IsDefined(players[i]) )
{
dist = DistanceSquared( self.origin, players[i].origin );
if ( dist < closest_dist )
{
best_target = players[i];
closest_dist = dist;
}
}
}
if ( IsDefined(best_target) )
{
animscripts\combat_utility::ThrowGrenadeAtPlayerASAP_combat_utility(best_target);
}
}
}
is_ai_in_revive()
{
assertEX(IsAI(self), "Can only call this function on an AI character");
if( IsAlive(self) )
{
return animscripts\revive::isReviverOrBleeder();
}
}
disable_ai_revive()
{
Assert(IsDefined(level.reviveFeature), "level.reviveFeature is not defined, call this function after maps\_load::main().");
level.reviveFeature = false;
}
enable_ai_revive()
{
Assert(IsDefined(level.reviveFeature), "level.reviveFeature is not defined, call this function after maps\_load::main().");
Assert((level.reviveFeature == false), "Revive Feature is already enabled.");
level.reviveFeature = true;
}
disable_ai_bleeder()
{
assertEX(IsAI(self), "Can only call this function on an AI character");
assertEX(IsDefined(self.a.canBleed), "Can only call this function on an AI character");
self.a.canBleed = false;
}
enable_ai_bleeder()
{
assertEX(IsAI(self), "Can only call this function on an AI character");
assertEX(IsDefined(self.a.canBleed), "Can only call this function on an AI character");
self.a.canBleed = true;
}
disable_ai_reviver()
{
assertEX(IsAI(self), "Can only call this function on an AI character");
assertEX(IsDefined(self.a.canRevive), "Can only call this function on an AI character");
self.a.canRevive = false;
}
enable_ai_reviver()
{
assertEX(IsAI(self), "Can only call this function on an AI character");
assertEX(IsDefined(self.a.canRevive), "Can only call this function on an AI character");
self.a.canRevive = true;
}
switch_weapon_ASAP()
{
assertEX(IsAI(self), "Can only call this function on an AI character");
if( IsAlive(self) && !self.a.weapon_switch_ASAP )
self.a.weapon_switch_ASAP = true;
}
sg_precachemodel( model )
{
script_gen_dump_addline( "precachemodel( \"" + model + "\" );", "xmodel_" + model );
}
sg_precacheitem( item )
{
script_gen_dump_addline( "precacheitem( \"" + item + "\" );", "item_" + item );
}
sg_precachemenu( menu )
{
script_gen_dump_addline( "precachemenu( \"" + menu + "\" );", "menu_" + menu );
}
sg_precacherumble( rumble )
{
script_gen_dump_addline( "precacherumble( \"" + rumble + "\" );", "rumble_" + rumble );
}
sg_precacheshader( shader )
{
script_gen_dump_addline( "precacheshader( \"" + shader + "\" );", "shader_" + shader );
}
sg_precacheshellshock( shock )
{
script_gen_dump_addline( "precacheshellshock( \"" + shock + "\" );", "shock_" + shock );
}
sg_precachestring( string )
{
script_gen_dump_addline( "precachestring( \"" + string + "\" );", "string_" + string );
}
sg_precacheturret( turret )
{
script_gen_dump_addline( "precacheturret( \"" + turret + "\" );", "turret_" + turret );
}
sg_precachevehicle( vehicle )
{
script_gen_dump_addline( "precachevehicle( \"" + vehicle + "\" );", "vehicle_" + vehicle );
}
sg_getanim( animation )
{
return level.sg_anim[ animation ];
}
sg_getanimtree( animtree )
{
return level.sg_animtree[ animtree ];
}
sg_precacheanim( animation, animtree )
{
if( !IsDefined( animtree ) )
{
animtree = "generic_human";
}
sg_csv_addtype( "xanim", animation );
if( !IsDefined( level.sg_precacheanims ) )
{
level.sg_precacheanims = [];
}
if( !IsDefined( level.sg_precacheanims[ animtree ] ) )
{
level.sg_precacheanims[ animtree ] = [];
}
level.sg_precacheanims[ animtree ][ animation ] = true;
}
sg_getfx( fx )
{
return level.sg_effect[ fx ];
}
sg_precachefx( fx )
{
script_gen_dump_addline( "level.sg_effect[ \"" + fx + "\" ] = loadfx( \"" + fx + "\" );", "fx_" + fx );
}
sg_wait_dump()
{
flag_wait( "scriptgen_done" );
}
sg_standard_includes()
{
sg_csv_addtype( "ignore", "code_post_gfx" );
sg_csv_addtype( "ignore", "common" );
sg_csv_addtype( "col_map_sp", "maps/" + tolower( GetDvar( #"mapname" ) ) + ".d3dbsp" );
sg_csv_addtype( "gfx_map", "maps/" + tolower( GetDvar( #"mapname" ) ) + ".d3dbsp" );
sg_csv_addtype( "rawfile", "maps/" + tolower( GetDvar( #"mapname" ) ) + ".gsc" );
sg_csv_addtype( "rawfile", "maps / scriptgen/" + tolower( GetDvar( #"mapname" ) ) + "_scriptgen.gsc" );
sg_csv_soundadd( "us_battlechatter", "all_sp" );
sg_csv_soundadd( "ab_battlechatter", "all_sp" );
sg_csv_soundadd( "voiceovers", "all_sp" );
sg_csv_soundadd( "common", "all_sp" );
sg_csv_soundadd( "generic", "all_sp" );
sg_csv_soundadd( "requests", "all_sp" );
}
sg_csv_soundadd( type, loadspec )
{
script_gen_dump_addline( "nowrite Sound CSV entry: " + type, "sound_" + type + ", " + tolower( GetDvar( #"mapname" ) ) + ", " + loadspec );
}
sg_csv_addtype( type, string )
{
script_gen_dump_addline( "nowrite CSV entry: " + type + ", " + string, type + "_" + string );
}
array_combine_keys( array1, array2 )
{
if( !array1.size )
{
return array2;
}
keys = getarraykeys( array2 );
for( i = 0;i < keys.size;i++ )
{
array1[ keys[ i ] ] = array2[ keys[ i ] ];
}
return array1;
}
set_ignoreSuppression( val )
{
self.ignoreSuppression = val;
}
set_goalradius( radius )
{
self.goalradius = radius;
}
set_allowdeath( val )
{
self.allowdeath = val;
}
set_run_anim( anime, alwaysRunForward )
{
assertEx( IsDefined( anime ), "Tried to set run anim but didn't specify which animation to ues" );
assertEx( IsDefined( self.animname ), "Tried to set run anim on a guy that had no anim name" );
assertEx( IsDefined( level.scr_anim[ self.animname ][ anime ] ), "Tried to set run anim but the anim was not defined in the maps _anim file" );
if( IsDefined( alwaysRunForward ) )
{
self.alwaysRunForward = alwaysRunForward;
}
else
{
self.alwaysRunForward = true;
}
self.a.combatrunanim = level.scr_anim[ self.animname ][ anime ];
self.run_noncombatanim = self.a.combatrunanim;
self.walk_combatanim = self.a.combatrunanim;
self.walk_noncombatanim = self.a.combatrunanim;
self.preCombatRunEnabled = false;
}
set_generic_run_anim( anime, alwaysRunForward )
{
assertEx( IsDefined( anime ), "Tried to set generic run anim but didn't specify which animation to ues" );
assertEx( IsDefined( level.scr_anim[ "generic" ][ anime ] ), "Tried to set generic run anim but the anim was not defined in the maps _anim file" );
if ( IsDefined( alwaysRunForward ) )
{
if ( alwaysRunForward )
{
self.alwaysRunForward = alwaysRunForward;
}
else
{
self.alwaysRunForward = undefined;
}
}
else
{
self.alwaysRunForward = true;
}
self.a.combatrunanim = level.scr_anim[ "generic" ][ anime ];
self.run_noncombatanim = self.a.combatrunanim;
self.walk_combatanim = self.a.combatrunanim;
self.walk_noncombatanim = self.a.combatrunanim;
self.preCombatRunEnabled = false;
}
clear_run_anim()
{
self.alwaysRunForward = undefined;
self.a.combatrunanim = undefined;
self.run_noncombatanim = undefined;
self.walk_combatanim = undefined;
self.walk_noncombatanim = undefined;
self.preCombatRunEnabled = true;
}
physicsjolt_proximity( outer_radius, inner_radius, force )
{
self endon( "death" );
self endon( "stop_physicsjolt" );
if( !IsDefined( outer_radius ) || !IsDefined( inner_radius ) || !IsDefined( force ) )
{
outer_radius = 400;
inner_radius = 256;
force = ( 0, 0, 0.075 );
}
fade_distance = outer_radius * outer_radius;
fade_speed = 3;
base_force = force;
while( true )
{
wait 0.1;
force = base_force;
if( self.classname == "script_vehicle" )
{
speed = self getspeedMPH();
if( speed < fade_speed )
{
scale = speed / fade_speed;
force = vector_scale( base_force, scale );
}
}
dist = distancesquared( self.origin, get_players()[0].origin );
scale = fade_distance / dist;
if( scale > 1 )
{
scale = 1;
}
force = vector_scale( force, scale );
total_force = force[ 0 ] + force[ 1 ] + force[ 2 ];
}
}
set_goal_entity( ent )
{
self setGoalEntity( ent );
}
activate_trigger()
{
assertEx( !IsDefined( self.trigger_off ), "Tried to activate trigger that is OFF( either from trigger_off or from flags set on it through shift - G menu" );
if( IsDefined( self.script_color_allies ) )
{
self.activated_color_trigger = true;
maps\_colors::activate_color_trigger( "allies" );
}
if( IsDefined( self.script_color_axis ) )
{
self.activated_color_trigger = true;
maps\_colors::activate_color_trigger( "axis" );
}
self notify( "trigger" );
}
self_delete()
{
if (IsDefined(self))
{
self delete();
}
}
remove_noColor_from_array( ai )
{
newarray = [];
for( i = 0; i < ai.size; i++ )
{
guy = ai[ i ];
if( guy has_color() )
{
newarray[ newarray.size ] = guy;
}
}
return newarray;
}
has_color()
{
if( self.team == "axis" )
{
return IsDefined( self.script_color_axis ) || IsDefined( self.script_forceColor );
}
return IsDefined( self.script_color_allies ) || IsDefined( self.script_forceColor );
}
clear_colors()
{
clear_team_colors( "axis" );
clear_team_colors( "allies" );
}
clear_team_colors( team )
{
level.currentColorForced[ team ][ "r" ] = undefined;
level.currentColorForced[ team ][ "b" ] = undefined;
level.currentColorForced[ team ][ "c" ] = undefined;
level.currentColorForced[ team ][ "y" ] = undefined;
level.currentColorForced[ team ][ "p" ] = undefined;
level.currentColorForced[ team ][ "o" ] = undefined;
level.currentColorForced[ team ][ "g" ] = undefined;
}
get_script_palette()
{
rgb = [];
rgb[ "r" ] = ( 1, 0, 0 );
rgb[ "o" ] = ( 1, 0.5, 0 );
rgb[ "y" ] = ( 1, 1, 0 );
rgb[ "g" ] = ( 0, 1, 0 );
rgb[ "c" ] = ( 0, 1, 1 );
rgb[ "b" ] = ( 0, 0, 1 );
rgb[ "p" ] = ( 1, 0, 1 );
return rgb;
}
notify_delay( sNotifyString, fDelay )
{
assert( IsDefined( self ) );
assert( IsDefined( sNotifyString ) );
assert( IsDefined( fDelay ) );
self endon( "death" );
if( fDelay > 0 )
{
wait fDelay;
}
if( !IsDefined( self ) )
{
return;
}
self notify( sNotifyString );
}
gun_remove()
{
self animscripts\shared::placeWeaponOn( self.weapon, "none" );
}
gun_switchto( weaponName, whichHand )
{
self animscripts\shared::placeWeaponOn( weaponName, whichHand );
}
gun_recall()
{
self animscripts\shared::placeWeaponOn( self.weapon, "right" );
}
custom_ai_weapon_loadout( primary, secondary, sidearm )
{
self animscripts\shared::detachAllWeaponModels();
if( IsDefined(self.primaryweapon) && self.primaryweapon != "" )
{
self animscripts\shared::detachWeapon(self.primaryweapon);
}
if( IsDefined(self.secondaryweapon) && self.secondaryweapon != "" )
{
self animscripts\shared::detachWeapon(self.secondaryweapon);
}
if( IsDefined(self.sideArm) && self.sideArm != "" )
{
self animscripts\shared::detachWeapon(self.sideArm);
}
self.primaryweapon = "";
self.secondaryweapon = "";
self.sidearm = "";
if( IsDefined(primary) )
{
if( GetWeaponModel(primary) != "" )
{
self.primaryweapon = primary;
self call_overloaded_func( "animscripts\init", "initWeapon", self.primaryweapon );
self animscripts\shared::placeWeaponOn( self.primaryweapon, "right");
}
else
{
assertex( false, "custom_ai_weapon_loadout: primary weapon " + primary + " is not in a csv or isn't precached" );
}
}
if( IsDefined(secondary) )
{
if( GetWeaponModel(secondary) != "" )
{
self.secondaryweapon = secondary;
self call_overloaded_func( "animscripts\init", "initWeapon", self.secondaryweapon );
self animscripts\shared::placeWeaponOn( self.secondaryweapon, "back");
}
else
{
assertex( false, "custom_ai_weapon_loadout: secondary weapon " + secondary + " is not in a csv or isn't precached" );
}
}
if( IsDefined(sidearm) )
{
if( GetWeaponModel(sidearm) != "" )
{
self.sidearm = sidearm;
self call_overloaded_func( "animscripts\init", "initWeapon", self.sidearm );
}
else
{
assertex( false, "custom_ai_weapon_loadout: sidearm weapon " + sidearm + " is not in a csv or isn't precached" );
}
}
self.weapon = self.primaryweapon;
self animscripts\weaponList::RefillClip();
self.isSniper = animscripts\combat_utility::isSniperRifle( self.weapon );
}
lerp_player_view_to_tag( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc )
{
if( IsPlayer( self ) )
{
self endon( "disconnect" );
}
lerp_player_view_to_tag_internal( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, undefined );
}
lerp_player_view_to_tag_and_hit_geo( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc )
{
if( IsPlayer( self ) )
{
self endon( "disconnect" );
}
lerp_player_view_to_tag_internal( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, true );
}
lerp_player_view_to_position( origin, angles, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo )
{
if( IsPlayer( self ) )
{
self endon( "disconnect" );
}
linker = spawn( "script_origin", ( 0, 0, 0 ) );
linker.origin = self.origin;
linker.angles = self getplayerangles();
if( IsDefined( hit_geo ) )
{
self playerlinkto( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo );
}
else if( IsDefined( right_arc ) )
{
self playerlinkto( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc );
}
else if( IsDefined( fraction ) )
{
self playerlinkto( linker, "", fraction );
}
else
{
self playerlinkto( linker );
}
linker moveto( origin, lerptime, lerptime * 0.25 );
linker rotateto( angles, lerptime, lerptime * 0.25 );
linker waittill( "movedone" );
linker delete();
}
lerp_player_view_to_tag_oldstyle( tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc )
{
lerp_player_view_to_tag_oldstyle_internal( tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, false );
}
lerp_player_view_to_position_oldstyle( origin, angles, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo )
{
if( IsPlayer( self ) )
{
self endon( "disconnect" );
}
linker = spawn( "script_origin", ( 0, 0, 0 ) );
linker.origin = get_player_feet_from_view();
linker.angles = self getplayerangles();
if( IsDefined( hit_geo ) )
{
self playerlinktodelta( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo );
}
else if( IsDefined( right_arc ) )
{
self playerlinktodelta( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc );
}
else if( IsDefined( fraction ) )
{
self playerlinktodelta( linker, "", fraction );
}
else
{
self playerlinktodelta( linker );
}
linker moveto( origin, lerptime, lerptime * 0.25 );
linker rotateto( angles, lerptime, lerptime * 0.25 );
linker waittill( "movedone" );
linker delete();
}
lerp_player_view_to_moving_position_oldstyle( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo )
{
if( IsPlayer( self ) )
{
self endon( "disconnect" );
}
linker = spawn( "script_origin", ( 0, 0, 0 ) );
linker.origin = self.origin;
linker.angles = self getplayerangles();
if( IsDefined( hit_geo ) )
{
self playerlinktodelta( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo );
}
else if( IsDefined( right_arc ) )
{
self playerlinktodelta( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc );
}
else if( IsDefined( fraction ) )
{
self playerlinktodelta( linker, "", fraction );
}
else
{
self playerlinktodelta( linker );
}
max_count=lerptime/0.0167;
count=0;
while (count < max_count)
{
origin = ent gettagorigin( tag );
angles = ent gettagangles( tag );
linker moveto( origin, 0.0167*(max_count-count) );
linker rotateto( angles, 0.0167*(max_count-count) );
wait( 0.0167 );
count++;
}
linker delete();
}
timer( time )
{
wait( time );
}
waittill_either_function( func1, parm1, func2, parm2 )
{
ent = spawnstruct();
thread waittill_either_function_internal( ent, func1, parm1 );
thread waittill_either_function_internal( ent, func2, parm2 );
ent waittill( "done" );
}
waittill_msg( msg )
{
if( IsPlayer( self ) )
{
self endon( "disconnect" );
}
self waittill( msg );
}
display_hint( hint )
{
if ( GetDvar( #"chaplincheat" ) == "1" )
{
return;
}
if( IsDefined( level.trigger_hint_func[ hint ] ) )
{
if( [[ level.trigger_hint_func[ hint ] ]]() )
{
return;
}
HintPrint( level.trigger_hint_string[ hint ], level.trigger_hint_func[ hint ] );
}
else
{
HintPrint( level.trigger_hint_string[ hint ] );
}
}
getGenericAnim( anime )
{
assertex( IsDefined( level.scr_anim[ "generic" ][ anime ] ), "Generic anim " + anime + " was not defined in your _anim file." );
return level.scr_anim[ "generic" ][ anime ];
}
enable_careful()
{
assertex( isai( self ), "Tried to make an ai careful but it wasn't called on an AI" );
self.script_careful = true;
}
disable_careful()
{
assertex( isai( self ), "Tried to unmake an ai careful but it wasn't called on an AI" );
self.script_careful = false;
self notify( "stop_being_careful" );
}
set_fixednode_true()
{
self.fixednode = true;
}
set_fixednode_false()
{
self.fixednode = true;
}
spawn_ai()
{
ai = undefined;
if( IsDefined( self.lastSpawnTime ) && self.lastSpawnTime >= GetTime() )
{
wait(0.05);
}
no_enemy_info = is_true(self.script_noenemyinfo);
if ( IsDefined( self.script_forcespawn ) )
{
ai = self StalingradSpawn(no_enemy_info);
}
else
{
ai = self DoSpawn(no_enemy_info);
}
if( IsDefined( ai ) )
{
self.lastSpawnTime = GetTime();
}
return ai;
}
kill_spawnernum( number )
{
spawners = GetSpawnerArray();
for( i = 0; i < spawners.size; i++ )
{
if( !IsDefined( spawners[i].script_killspawner ) )
{
continue;
}
if( number != spawners[i].script_killspawner )
{
continue;
}
spawners[i] Delete();
}
}
function_stack( func, param1, param2, param3, param4 )
{
self endon( "death" );
localentity = spawnstruct();
localentity thread function_stack_proc( self, func, param1, param2, param3, param4 );
localentity waittill_either( "function_done", "death" );
}
set_goal_node( node )
{
self.last_set_goalnode = node;
self.last_set_goalpos = undefined;
self.last_set_goalent = undefined;
self SetGoalNode( node );
}
set_goal_pos( origin )
{
self.last_set_goalnode = undefined;
self.last_set_goalpos = origin;
self.last_set_goalent = undefined;
self SetGoalPos( origin );
}
set_goal_ent( target )
{
set_goal_pos( target.origin );
self.last_set_goalent = target;
}
run_thread_on_targetname( msg, func, param1, param2, param3 )
{
array = getentarray( msg, "targetname" );
array_thread( array, func, param1, param2, param3 );
}
run_thread_on_noteworthy( msg, func, param1, param2, param3 )
{
array = getentarray( msg, "script_noteworthy" );
array_thread( array, func, param1, param2, param3 );
}
handsignal( action, end_on, wait_till )
{
if ( IsDefined( end_on ) )
{
level endon( end_on );
}
if ( IsDefined( wait_till ) )
{
level waittill( wait_till );
}
switch ( action )
{
case "go":
self maps\_anim::anim_generic(self, "signal_go");
break;
case "onme":
self maps\_anim::anim_generic(self, "signal_onme");
break;
case "stop":
self maps\_anim::anim_generic(self, "signal_stop");
break;
case "moveup":
self maps\_anim::anim_generic(self, "signal_moveup");
break;
case "moveout":
self maps\_anim::anim_generic(self, "signal_moveout");
break;
}
}
add_dialogue_line( name, msg, blocking )
{
}
add_dialogue_line_internal( name, msg )
{
if( GetDvarInt( #"loc_warnings") )
{
return;
}
if ( !IsDefined( level.dialogue_huds ) )
{
level.dialogue_huds = [];
}
for ( index = 0;; index++ )
{
if ( !IsDefined( level.dialogue_huds[ index ] ) )
{
break;
}
}
level.dialogue_huds[ index ] = true;
hudelem = maps\_hud_util::createFontString( "default", 1.5 );
hudelem.location = 0;
hudelem.alignX = "left";
hudelem.alignY = "top";
hudelem.foreground = 1;
hudelem.sort = 20;
hudelem.alpha = 0;
hudelem fadeOverTime( 0.5 );
hudelem.alpha = 1;
hudelem.x = 40;
hudelem.y = 260 + index * 18;
hudelem.label = "<" + name + "> " + msg;
hudelem.color = (1,1,0);
wait( 2 );
timer = 2 * 20;
hudelem fadeOverTime( 6 );
hudelem.alpha = 0;
for ( i = 0; i < timer; i++ )
{
hudelem.color = ( 1, 1, 1 / ( timer - i ) );
wait( 0.05 );
}
wait( 4 );
hudelem destroy();
level.dialogue_huds[ index ] = undefined;
}
alphabetize( array )
{
if ( array.size <= 1 )
{
return array;
}
count = 0;
for ( ;; )
{
changed = false;
for ( i = 0; i < array.size - 1; i++ )
{
if ( is_later_in_alphabet( array[ i ], array[ i + 1 ] ) )
{
val = array[ i ];
array[ i ] = array[ i + 1 ];
array[ i + 1 ] = val;
changed = true;
count++;
if ( count >= 10 )
{
count = 0;
wait( 0.05 );
}
}
}
if ( !changed )
{
return array;
}
}
return array;
}
set_grenadeammo( count )
{
self.grenadeammo = count;
}
get_player_feet_from_view()
{
tagorigin = self.origin;
upvec = anglestoup( self getplayerangles() );
height = self GetPlayerViewHeight();
player_eye = tagorigin + (0,0,height);
player_eye_fake = tagorigin + vector_scale( upvec, height );
diff_vec = player_eye - player_eye_fake;
fake_origin = tagorigin + diff_vec;
return fake_origin;
}
set_console_status()
{
if ( !IsDefined( level.Console ) )
{
level.Console = GetDvar( #"consoleGame" ) == "true";
}
else
{
assertex( level.Console == ( GetDvar( #"consoleGame" ) == "true" ), "Level.console got set incorrectly." );
}
if ( !IsDefined( level.Consolexenon ) )
{
level.xenon = GetDvar( #"xenonGame" ) == "true";
}
else
{
assertex( level.xenon == ( GetDvar( #"xenonGame" ) == "true" ), "Level.xenon got set incorrectly." );
}
}
autosave_now( optional_useless_string, suppress_print )
{
return maps\_autosave::autosave_game_now( suppress_print );
}
set_generic_deathanim( deathanim )
{
self.deathanim = getgenericanim( deathanim );
}
set_deathanim( deathanim )
{
self.deathanim = getanim( deathanim );
}
clear_deathanim()
{
self.deathanim = undefined;
}
lerp_fov_overtime( time, destfov, use_camera_tween )
{
level endon("stop_lerping_thread");
if( !IsDefined( use_camera_tween ) )
{
basefov = GetDvarFloat( #"cg_fov" );
incs = int( time/.05 );
incfov = ( destfov - basefov ) / incs ;
currentfov = basefov;
if(incfov == 0)
{
return;
}
for ( i = 0; i < incs; i++ )
{
currentfov += incfov;
self SetClientDvar( "cg_fov", currentfov );
wait .05;
}
self SetClientDvar( "cg_fov", destfov );
}
else
{
self StartCameraTween( time );
self SetClientDvar( "cg_fov", destfov );
}
}
apply_fog()
{
maps\_load_common::set_fog_progress( 0 );
}
apply_end_fog()
{
maps\_load_common::set_fog_progress( 1 );
}
anim_stopanimscripted(blend_time)
{
anim_ent = get_anim_ent();
anim_ent StopAnimScripted(blend_time);
anim_ent notify( "single anim", "end" );
anim_ent notify( "looping anim", "end" );
if (IsDefined(anim_ent.anim_loop_ender))
{
anim_ent notify( anim_ent.anim_loop_ender );
}
anim_ent notify("_anim_stopped");
}
get_anim_ent()
{
if (IsDefined(self.anim_link))
{
self.anim_link.animname = self.animname;
return self.anim_link;
}
return self;
}
enable_additive_pain( enable_regular_pain_on_low_health )
{
AssertEx( IsAI( self ), "Enable_additive_pain should be called on AI only." );
self thread call_overloaded_func( "animscripts\pain", "additive_pain_think", enable_regular_pain_on_low_health );
}
disable_pain()
{
assertex( isalive( self ), "Tried to disable pain on a non ai" );
self.a.disablePain = true;
self.allowPain = false;
}
enable_pain()
{
assertex( isalive( self ), "Tried to enable pain on a non ai" );
self.a.disablePain = false;
self.allowPain = true;
}
disable_react()
{
assertex( isalive( self ), "Tried to disable react on a non ai" );
self.a.disableReact = true;
self.allowReact = false;
}
enable_react()
{
assertex( isalive( self ), "Tried to enable react on a non ai" );
self.a.disableReact = false;
self.allowReact = true;
}
enable_rambo()
{
if( IsDefined( level.norambo ) )
{
level.norambo = undefined;
}
}
disable_rambo()
{
level.norambo = 1;
}
die()
{
self dodamage( self.health + 150, (0,0,0) );
}
getmodel( str )
{
assertex( IsDefined( level.scr_model[ str ] ), "Tried to getmodel on model " + str + " but level.scr_model[ " + str + " was not defined." );
return level.scr_model[ str ];
}
isADS( player )
{
return ( player playerADS() > 0.5 );
}
enable_auto_adjust_threatbias(player)
{
level.auto_adjust_threatbias = true;
if ( level.gameskill >= 2 )
{
player.threatbias = int( maps\_gameskill::get_locked_difficulty_val( "threatbias", 1 ) );
return;
}
level.auto_adjust_difficulty_frac = GetDvarInt( #"autodifficulty_frac" );
current_frac = level.auto_adjust_difficulty_frac * 0.01;
players = get_players();
level.coop_player_threatbias_scalar = maps\_gameskill::getCoopValue( "coopFriendlyThreatBiasScalar", players.size );
if (!IsDefined(level.coop_player_threatbias_scalar))
{
level.coop_player_threatbias_scalar = 1;
}
player.threatbias = int( maps\_gameskill::get_blended_difficulty( "threatbias", current_frac ) * level.coop_player_threatbias_scalar);
}
disable_auto_adjust_threatbias()
{
level.auto_adjust_threatbias = false;
}
waittill_player_looking_at(origin, dot, do_trace)
{
while (!is_player_looking_at(origin, dot, do_trace))
{
wait .05;
}
}
is_player_looking_at(origin, dot, do_trace)
{
AssertEx(IsPlayer(self), "player_looking_at must be called on a player.");
if (!IsDefined(dot))
{
dot = .7;
}
if (!IsDefined(do_trace))
{
do_trace = true;
}
eye = self get_eye();
delta_vec = AnglesToForward(VectorToAngles(origin - eye));
view_vec = AnglesToForward(self GetPlayerAngles());
new_dot = VectorDot( delta_vec, view_vec );
if ( new_dot >= dot )
{
if (do_trace)
{
return BulletTracePassed( origin, eye, false, undefined );
}
else
{
return true;
}
}
return false;
}
look_at(origin_or_ent, tween, force, tag, offset)
{
if (is_true(force))
{
self FreezeControls(true);
}
if (IsDefined(tween))
{
self StartCameraTween(tween);
}
self notify("look_at_begin");
origin = origin_or_ent;
if (!IsVec(origin_or_ent))
{
ent = origin_or_ent;
if (IsDefined(tag))
{
origin = ent GetTagOrigin(tag);
}
else if (IsAI(origin_or_ent) && !IsDefined(offset))
{
origin = ent get_eye();
}
else
{
origin = ent.origin;
}
}
if (IsDefined(offset))
{
origin = origin + offset;
}
player_org = self get_eye();
vec_to_pt = origin - player_org;
self SetPlayerAngles(VectorToAngles(vec_to_pt));
wait tween;
if (is_true(force))
{
self FreezeControls(false);
}
self notify("look_at_end");
}
add_wait( func, parm1, parm2, parm3 )
{
ent = spawnstruct();
ent.caller = self;
ent.func = func;
ent.parms = [];
if ( IsDefined( parm1 ) )
{
ent.parms[ ent.parms.size ] = parm1;
}
if ( IsDefined( parm2 ) )
{
ent.parms[ ent.parms.size ] = parm2;
}
if ( IsDefined( parm3 ) )
{
ent.parms[ ent.parms.size ] = parm3;
}
level.wait_any_func_array[ level.wait_any_func_array.size ] = ent;
}
do_wait_any()
{
assertex( IsDefined( level.wait_any_func_array ), "Tried to do a do_wait without addings funcs first" );
assertex( level.wait_any_func_array.size > 0, "Tried to do a do_wait without addings funcs first" );
do_wait( level.wait_any_func_array.size - 1 );
}
do_wait( count_to_reach )
{
if ( !IsDefined( count_to_reach ) )
{
count_to_reach = 0;
}
assertex( IsDefined( level.wait_any_func_array ), "Tried to do a do_wait without addings funcs first" );
ent = spawnstruct();
array = level.wait_any_func_array;
endons = level.do_wait_endons_array;
after_array = level.run_func_after_wait_array;
level.wait_any_func_array = [];
level.run_func_after_wait_array = [];
level.do_wait_endons_array = [];
ent.count = array.size;
ent array_levelthread( array, ::waittill_func_ends, endons );
for ( ;; )
{
if ( ent.count <= count_to_reach )
{
break;
}
ent waittill( "func_ended" );
}
ent notify( "all_funcs_ended" );
array_levelthread( after_array, ::exec_func, [] );
}
waterfx( endflag )
{
if ( IsDefined( endflag ) )
{
flag_assert( endflag );
level endon( endflag );
}
for ( ;; )
{
wait( randomfloatrange( 0.15, 0.3 ) );
start = self.origin + (0,0,150);
end = self.origin - (0,0,150);
trace = BulletTrace( start, end, false, undefined );
if ( trace[ "surfacetype" ] != "water" )
{
continue;
}
fx = "water_movement";
if ( self == level.player )
{
if ( distance( level.player getvelocity(), (0,0,0) ) < 5 )
{
fx = "water_stop";
}
}
else if ( IsDefined( level._effect[ "water_" + self.a.movement ] ) )
{
fx = "water_" + self.a.movement;
}
playfx( getfx( fx ), trace[ "position" ], trace[ "normal" ] );
}
}
fail_on_friendly_fire()
{
if ( !IsDefined( level.friendlyfire_friendly_kill_points ) )
{
level.friendlyfire_friendly_kill_points = level.friendlyfire[ "friend_kill_points" ];
}
level.friendlyfire[ "friend_kill_points" ] = -60000;
}
giveachievement_wrapper( achievement, all_players )
{
if ( achievement == "" )
{
return;
}
if ( isCoopEPD() )
{
return;
}
if( !( maps\_cheat::is_cheating() ) && ! ( flag("has_cheated") ) )
{
if( IsDefined( all_players ) && all_players )
{
players = get_players();
for( i = 0; i < players.size; i++ )
{
players[i] GiveAchievement( achievement );
}
}
else
{
if( !IsPlayer( self ) )
{
println( "^1self needs to be a player for _utility::giveachievement_wrapper()" );
return;
}
self GiveAchievement( achievement );
}
}
}
slowmo_start()
{
flag_set( "disable_slowmo_cheat" );
}
slowmo_end()
{
maps\_cheat::slowmo_system_defaults();
flag_clear( "disable_slowmo_cheat" );
}
slowmo_setspeed_slow( speed )
{
if( !maps\_cheat::slowmo_check_system() )
{
return;
}
level.slowmo.speed_slow = speed;
}
slowmo_setspeed_norm( speed )
{
if( !maps\_cheat::slowmo_check_system() )
{
return;
}
level.slowmo.speed_norm = speed;
}
slowmo_setlerptime_in( time )
{
if( !maps\_cheat::slowmo_check_system() )
{
return;
}
level.slowmo.lerp_time_in = time;
}
slowmo_setlerptime_out( time )
{
if( !maps\_cheat::slowmo_check_system() )
{
return;
}
level.slowmo.lerp_time_out = time;
}
slowmo_lerp_in()
{
if( !flag( "disable_slowmo_cheat" ) )
{
return;
}
level.slowmo thread maps\_cheat::gamespeed_set( level.slowmo.speed_slow, level.slowmo.speed_current, level.slowmo.lerp_time_in );
}
slowmo_lerp_out()
{
if( !flag( "disable_slowmo_cheat" ) )
{
return;
}
level.slowmo thread maps\_cheat::gamespeed_reset();
}
arcademode_assignpoints( amountDvar, player )
{
if ( GetDvar( #"arcademode" ) != "1" )
{
return;
}
}
arcadeMode()
{
isArcadeMode = GetDvar( #"arcademode" ) == "1";
if ( GetDvar( #"zombiemode" ) == "1" )
{
isArcadeMode = false;
}
return isArcadeMode;
}
coopGame()
{
return (( GetDvar( #"systemlink" ) == "1" ) || (GetDvar( #"onlinegame" ) == "1" ) || IsSplitScreen() );
}
player_is_near_live_grenade()
{
grenades = getentarray( "grenade", "classname" );
for ( i = 0; i < grenades.size; i++ )
{
grenade = grenades[ i ];
players = get_players();
for( j = 0; j < players.size; j++ )
{
if( DistanceSquared( grenade.origin, players[j].origin ) < 250 * 250 )
{
return true;
}
}
}
return false;
}
player_died_recently()
{
return GetDvarInt( #"player_died_recently" ) > 0;
}
set_splitscreen_fog( start_dist, halfway_dist, halfway_height, base_height, red, green, blue, trans_time, cull_dist )
{
if( !IsSplitScreen() )
{
return;
}
if( !IsDefined( start_dist ) )
{
start_dist = 0;
}
if( !IsDefined( halfway_dist ) )
{
halfway_dist = 200;
}
if( !IsDefined( base_height ) )
{
base_height = -2000;
}
if( !IsDefined( red ) )
{
red = 1;
}
if( !IsDefined( green ) )
{
green = 1;
}
if( !IsDefined( blue ) )
{
blue = 0;
}
if( !IsDefined( trans_time ) )
{
trans_time = 0;
}
if( !IsDefined( cull_dist ) )
{
cull_dist = 2000;
}
halfway_height = base_height + 2000;
level.splitscreen_fog = true;
SetVolFog( start_dist, halfway_dist, halfway_height, base_height, red, green, blue, 0 );
SetCullDist( cull_dist );
}
default_fog_print()
{
wait_for_first_player();
}
share_screen( player, toggle, instant )
{
if( !IsSplitscreen() )
{
return;
}
time = 1;
if( IsDefined( instant ) && instant )
{
time = 0.1;
}
toggle = !toggle;
SplitViewAllowed( player GetEntityNumber(), toggle, time );
}
get_players(t)
{
if(IsDefined(t))
{
return(GetPlayers(t));
}
else
{
return(GetPlayers());
}
}
get_host()
{
players = get_players("all");
for( i = 0; i < players.size; i++ )
{
if( players[i] GetEntityNumber() == 0 )
{
return players[i];
}
}
}
is_coop()
{
players = get_players("all");
if( players.size > 1 )
{
return true;
}
return false;
}
any_player_IsTouching( ent, t )
{
players = [];
if(IsDefined(t))
{
players = get_players(t);
}
else
{
players = get_players();
}
for( i = 0; i < players.size; i++ )
{
if( IsAlive( players[i] ) && players[i] IsTouching( ent ) )
{
return true;
}
}
return false;
}
get_player_touching( ent, t )
{
players = [];
if(IsDefined(t))
{
players = get_players(t);
}
else
{
players = get_players();
}
for( i = 0; i < players.size; i++ )
{
if( IsAlive( players[i] ) && players[i] IsTouching( ent ) )
{
return players[i];
}
}
return undefined;
}
get_closest_player( org, t )
{
players = [];
if(IsDefined(t))
{
players = get_players(t);
}
else
{
players = get_players();
}
return GetClosest( org, players );
}
clear_player_spawnpoints()
{
level.player_spawnpoints = [];
}
freezecontrols_all( toggle, delay )
{
if( IsDefined( delay ) )
{
wait( delay );
}
players = get_players("all");
for( i = 0; i < players.size; i++ )
{
players[i] FreezeControls( toggle );
}
}
set_all_players_blur( amount, time )
{
wait_for_first_player();
flag_wait( "all_players_connected" );
players = get_players("all");
for( i = 0; i < players.size; i++ )
{
players[i] SetBlur( amount, time );
}
}
set_all_players_double_vision( amount, time )
{
wait_for_first_player();
flag_wait( "all_players_connected" );
players = get_players("all");
for( i = 0; i < players.size; i++ )
{
players[i] SetDoubleVision( amount, time );
}
}
set_all_players_shock( shellshock_file, time )
{
wait_for_first_player();
flag_wait( "all_players_connected" );
players = get_players("all");
for( i = 0; i < players.size; i++ )
{
players[i] Shellshock( shellshock_file, time );
}
}
set_all_players_visionset( vision_file, time )
{
wait_for_first_player();
flag_wait( "all_players_connected" );
players = get_players("all");
for( i = 0; i < players.size; i++ )
{
players[i] VisionSetNaked( vision_file, time );
}
}
player_flag_wait( msg )
{
while( !self.flag[msg] )
{
self waittill( msg );
}
}
player_flag_wait_either( flag1, flag2 )
{
for( ;; )
{
if( flag( flag1 ) )
{
return;
}
if( flag( flag2 ) )
{
return;
}
self waittill_either( flag1, flag2 );
}
}
player_flag_waitopen( msg )
{
while( self.flag[msg] )
{
self waittill( msg );
}
}
player_flag_init( message, trigger )
{
if( !IsDefined( self.flag ) )
{
self.flag = [];
self.flags_lock = [];
}
assertex( !IsDefined( self.flag[message] ), "Attempt to reinitialize existing message: " + message );
self.flag[message] = false;
}
player_flag_set_delayed( message, delay )
{
wait( delay );
player_flag_set( message );
}
player_flag_set( message )
{
self.flag[message] = true;
self notify( message );
}
player_flag_clear( message )
{
self.flag[message] = false;
self notify( message );
}
player_flag( message )
{
assertex( IsDefined( message ), "Tried to check flag but the flag was not defined." );
if( !self.flag[message] )
{
return false;
}
return true;
}
wait_for_first_player()
{
players = get_players("all");
if( !IsDefined( players ) || players.size == 0 )
{
level waittill( "first_player_ready" );
}
}
wait_for_all_players()
{
flag_wait( "all_players_connected" );
}
findBoxCenter( mins, maxs )
{
center = ( 0, 0, 0 );
center = maxs - mins;
center = ( center[0]/2, center[1]/2, center[2]/2 ) + mins;
return center;
}
expandMins( mins, point )
{
if ( mins[0] > point[0] )
{
mins = ( point[0], mins[1], mins[2] );
}
if ( mins[1] > point[1] )
{
mins = ( mins[0], point[1], mins[2] );
}
if ( mins[2] > point[2] )
{
mins = ( mins[0], mins[1], point[2] );
}
return mins;
}
expandMaxs( maxs, point )
{
if ( maxs[0] < point[0] )
{
maxs = ( point[0], maxs[1], maxs[2] );
}
if ( maxs[1] < point[1] )
{
maxs = ( maxs[0], point[1], maxs[2] );
}
if ( maxs[2] < point[2] )
{
maxs = ( maxs[0], maxs[1], point[2] );
}
return maxs;
}
get_ai_touching_volume( team, volume_name, volume )
{
if ( !IsDefined( volume ) )
{
volume = getent( volume_name, "targetname" );
assertEx( IsDefined( volume ), volume_name + " does not exist" );
}
guys = getaiarray( team );
guys_touching_volume = [];
for( i=0; i < guys.size; i++ )
{
if ( guys[i] isTouching( volume ) )
{
guys_touching_volume[guys_touching_volume.size] = guys[i];
}
}
return guys_touching_volume;
}
registerClientSys(sSysName)
{
if(!IsDefined(level._clientSys))
{
level._clientSys = [];
}
if(level._clientSys.size >= 32)
{
error("Max num client systems exceeded.");
return;
}
if(IsDefined(level._clientSys[sSysName]))
{
error("Attempt to re-register client system : " + sSysName);
return;
}
else
{
level._clientSys[sSysName] = spawnstruct();
level._clientSys[sSysName].sysID = ClientSysRegister(sSysName);
}
}
setClientSysState(sSysName, sSysState, player)
{
if(!IsDefined(level._clientSys))
{
error("setClientSysState called before registration of any systems.");
return;
}
if(!IsDefined(level._clientSys[sSysName]))
{
error("setClientSysState called on unregistered system " + sSysName);
return;
}
if(IsDefined(player))
{
player ClientSysSetState(level._clientSys[sSysName].sysID, sSysState);
}
else
{
ClientSysSetState(level._clientSys[sSysName].sysID, sSysState);
level._clientSys[sSysName].sysState = sSysState;
}
}
wait_network_frame()
{
if(NumRemoteClients())
{
snapshot_ids = getsnapshotindexarray();
acked = undefined;
while (!IsDefined(acked))
{
level waittill("snapacknowledged");
acked = snapshotacknowledged(snapshot_ids);
}
}
else
{
wait(0.1);
}
}
clientNotify(event)
{
if(level.clientscripts)
{
if(IsPlayer(self))
{
maps\_utility::setClientSysState("levelNotify", event, self);
}
else
{
maps\_utility::setClientSysState("levelNotify", event);
}
}
}
ok_to_spawn( max_wait_seconds )
{
if( IsDefined( max_wait_seconds ) )
{
timer = GetTime() + max_wait_seconds * 1000;
while( GetTime() < timer && !OkToSpawn() )
{
wait( 0.05 );
}
}
else
{
while( !OkToSpawn() )
{
wait( 0.05 );
}
}
}
set_breadcrumbs(starts)
{
if(!IsDefined(level._player_breadcrumbs))
{
maps\_callbackglobal::Player_BreadCrumb_Reset((0,0,0));
}
for(i = 0; i < starts.size; i++)
{
for(j = 0; j < starts.size; j++)
{
level._player_breadcrumbs[i][j].pos = starts[j].origin;
if(IsDefined(starts[j].angles))
{
level._player_breadcrumbs[i][j].ang = starts[j].angles;
}
else
{
level._player_breadcrumbs[i][j].ang = (0,0,0);
}
}
}
}
set_breadcrumbs_player_positions()
{
if(!IsDefined(level._player_breadcrumbs))
{
maps\_callbackglobal::Player_BreadCrumb_Reset((0,0,0));
}
players = get_players();
for(i = 0; i < players.size; i++)
{
level._player_breadcrumbs[i][0].pos = players[i].origin;
level._player_breadcrumbs[i][0].ang = players[i].angles;
}
}
spread_array_thread( entities, process, var1, var2, var3 )
{
keys = getArrayKeys( entities );
if ( IsDefined( var3 ) )
{
for( i = 0 ; i < keys.size ; i++ )
{
entities[ keys[ i ] ] thread [[ process ]]( var1, var2, var3 );
wait_network_frame();
}
return;
}
if ( IsDefined( var2 ) )
{
for( i = 0 ; i < keys.size ; i++ )
{
entities[ keys[ i ] ] thread [[ process ]]( var1, var2 );
wait_network_frame();
}
return;
}
if ( IsDefined( var1 ) )
{
for( i = 0 ; i < keys.size ; i++ )
{
entities[ keys[ i ] ] thread [[ process ]]( var1 );
wait_network_frame();
}
return;
}
for( i = 0 ; i < keys.size ; i++ )
{
entities[ keys[ i ] ] thread [[ process ]]();
wait_network_frame();
}
}
simple_floodspawn( name, spawn_func, spawn_func_2 )
{
spawners = getEntArray( name, "targetname" );
assertex( spawners.size, "no spawners with targetname " + name + " found!" );
if( IsDefined( spawn_func ) )
{
for( i = 0; i < spawners.size; i++ )
{
spawners[i] add_spawn_function( spawn_func );
}
}
if( IsDefined( spawn_func_2 ) )
{
for( i = 0; i < spawners.size; i++ )
{
spawners[i] add_spawn_function( spawn_func_2 );
}
}
for( i = 0; i < spawners.size; i++ )
{
if( i % 2 )
{
wait_network_frame();
}
spawners[i] thread maps\_spawner::flood_spawner_init();
spawners[i] thread maps\_spawner::flood_spawner_think();
}
}
simple_spawn( name_or_spawners, spawn_func, param1, param2, param3, param4, param5 )
{
spawners = [];
if (IsString(name_or_spawners))
{
spawners = GetEntArray( name_or_spawners, "targetname" );
AssertEx( spawners.size, "no spawners with targetname " + name_or_spawners + " found!" );
}
else
{
if (IsArray(name_or_spawners))
{
spawners = name_or_spawners;
}
else
{
spawners[0] = name_or_spawners;
}
}
ai_array = [];
for( i = 0; i < spawners.size; i++ )
{
spawners[i].spawning = true;
if( i % 2 )
{
wait_network_frame();
}
ai = spawners[i] spawn_ai();
if(!spawn_failed( ai ))
{
if (IsDefined( spawn_func ))
{
single_thread(ai, spawn_func, param1, param2, param3, param4, param5);
}
ai_array = add_to_array( ai_array, ai );
}
spawners[i].spawning = undefined;
}
return ai_array;
}
simple_spawn_single( name_or_spawner, spawn_func, param1, param2, param3, param4, param5 )
{
if (IsString(name_or_spawner))
{
spawner = GetEnt( name_or_spawner, "targetname" );
AssertEx( IsDefined( spawner ), "no spawner with targetname " + name_or_spawner + " found!" );
}
else if (IsArray(name_or_spawner))
{
AssertMsg("simple_spawn_single cannot be used on an array of spawners. use simple_spawn instead.");
}
ai = simple_spawn(name_or_spawner, spawn_func, param1, param2, param3, param4, param5);
AssertEx( ai.size <= 1, "simple_spawn called from simple_spawn_single somehow spawned more than one guy!" );
if (ai.size)
{
return ai[0];
}
}
CanSpawnThink()
{
level.canSpawnInOneFrame = 3;
for(;;)
{
level.canSpawnCount = 0;
wait_network_frame();
}
}
CanSpawn()
{
if(!isdefined(level.canSpawnInOneFrame))
{
thread CanSpawnThink();
}
return true;
}
SpawnThrottleEnableThread()
{
level notify ("spawn_throttle_enable_thread_ender");
level endon ("spawn_throttle_enable_thread_ender");
if (isdefined(level.flag["all_players_connected"]))
{
flag_wait("all_players_connected");
level.spawnThrottleEnable = true;
}
}
SpawnThrottleEnable()
{
if(!isdefined(level.spawnThrottleEnable) || (isdefined(level.spawnThrottleEnable) && level.spawnThrottleEnable == false) )
{
level.spawnThrottleEnable = false;
thread SpawnThrottleEnableThread();
}
return level.spawnThrottleEnable;
}
DoSpawn(no_enemy_info, targetname)
{
if(SpawnThrottleEnable())
{
while(!CanSpawn())
{
wait_network_frame();
}
}
if(isdefined(level.canSpawnCount))
{
level.canSpawnCount += 1;
}
if(!IsDefined(no_enemy_info))
{
return self CodeSpawnerSpawn();
}
else if(!IsDefined(targetname))
{
return self CodeSpawnerSpawn(no_enemy_info);
}
else
{
return self CodeSpawnerSpawn(no_enemy_info, targetname);
}
}
StalingradSpawn(no_enemy_info, targetname)
{
if(SpawnThrottleEnable())
{
while(!CanSpawn())
{
wait_network_frame();
}
}
if(isdefined(level.canSpawnCount))
{
level.canSpawnCount += 1;
}
if(!IsDefined(no_enemy_info))
{
return self CodeSpawnerForceSpawn();
}
else if(!IsDefined(targetname))
{
return self CodeSpawnerForceSpawn(no_enemy_info);
}
else
{
return self CodeSpawnerForceSpawn(no_enemy_info, targetname);
}
}
Spawn(classname, origin, flags, radius, height, destructibledef)
{
if(SpawnThrottleEnable())
{
while(!CanSpawn())
{
wait_network_frame();
}
}
if(isdefined(level.canSpawnCount))
{
level.canSpawnCount += 1;
}
if(IsDefined(destructibledef))
{
return CodeSpawn(classname, origin, flags, radius, height, destructibledef);
}
else if(IsDefined(height))
{
return CodeSpawn(classname, origin, flags, radius, height);
}
else if(IsDefined(radius))
{
return CodeSpawn(classname, origin, flags, radius);
}
else if(IsDefined(flags))
{
return CodeSpawn(classname, origin, flags);
}
else
{
return CodeSpawn(classname, origin);
}
}
SpawnVehicle( modelname, targetname, vehicletype, origin, angles, destructibledef )
{
if(SpawnThrottleEnable())
{
while(!CanSpawn())
{
wait_network_frame();
}
}
if(isdefined(level.canSpawnCount))
{
level.canSpawnCount += 1;
}
assert(IsDefined(targetname));
assert(IsDefined(vehicletype));
assert(IsDefined(origin));
assert(IsDefined(angles));
if(IsDefined(destructibledef))
{
return CodeSpawnVehicle( modelname, targetname, vehicletype, origin, angles, destructibledef );
}
else
{
return CodeSpawnVehicle( modelname, targetname, vehicletype, origin, angles );
}
}
SpawnTurret( classname, origin, weaponinfoname )
{
if(SpawnThrottleEnable())
{
while(!CanSpawn())
{
wait_network_frame();
}
}
if(isdefined(level.canSpawnCount))
{
level.canSpawnCount += 1;
}
return CodeSpawnTurret(classname, origin, weaponinfoname);
}
PlayLoopedFX( effectid, repeat, position, cull, forward, up )
{
if(SpawnThrottleEnable())
{
while(!CanSpawn())
{
wait_network_frame();
}
}
if(isdefined(level.canSpawnCount))
{
level.canSpawnCount += 1;
}
if(IsDefined(up))
{
return CodePlayLoopedFX(effectid, repeat, position, cull, forward, up);
}
else if(IsDefined(forward))
{
return CodePlayLoopedFX(effectid, repeat, position, cull, forward);
}
else if(IsDefined(cull))
{
return CodePlayLoopedFX(effectid, repeat, position, cull);
}
else
{
return CodePlayLoopedFX(effectid, repeat, position);
}
}
SpawnFx( effect, position, forward, up )
{
if(SpawnThrottleEnable())
{
while(!CanSpawn())
{
wait_network_frame();
}
}
if(isdefined(level.canSpawnCount))
{
level.canSpawnCount += 1;
}
if(IsDefined(up))
{
return CodeSpawnFx(effect, position, forward, up);
}
else if(IsDefined(forward))
{
return CodeSpawnFx(effect, position, forward);
}
else
{
return CodeSpawnFx(effect, position);
}
}
spawn_model(model_name, origin, angles)
{
if (!IsDefined(origin))
{
origin = (0, 0, 0);
}
model = Spawn( "script_model", origin );
model SetModel( model_name );
if( IsDefined( angles ) )
{
model.angles = angles;
}
return model;
}
is_plane()
{
if(self.vehicleclass == "plane")
{
return true;
}
return false;
}
is_boat()
{
if(self.vehicleclass == "boat")
{
return true;
}
return false;
}
is_helicopter()
{
if(self.vehicleclass == "helicopter")
{
return true;
}
return false;
}
is_tank()
{
if(self.vehicleclass == "tank")
{
return true;
}
return false;
}
is_artillery()
{
if(self.vehicleclass == "artillery")
{
return true;
}
return false;
}
is_4wheel()
{
if(self.vehicleclass == "4 wheel")
{
return true;
}
return false;
}
is_vehicle()
{
return (IsDefined(self.classname) && (self.classname == "script_vehicle"));
}
go_path(path_start)
{
self maps\_vehicle::getonpath(path_start);
self maps\_vehicle::gopath();
}
disable_driver_turret()
{
self notify( "stop_turret_shoot");
}
enable_driver_turret()
{
self notify( "stop_turret_shoot");
self thread maps\_vehicle::turret_attack_think();
}
set_switch_node(src_node, dst_node)
{
assert(IsDefined(src_node));
assert(IsDefined(dst_node));
self.bSwitchingNodes = true;
self.dst_node = dst_node;
self SetSwitchNode(src_node, dst_node);
}
create_billboard()
{
level.billboardBlack = newHudElem();
level.billboardBlack.x = 268;
level.billboardBlack.y = 20;
level.billboardBlack.horzAlign = "fullscreen";
level.billboardBlack.vertAlign = "fullscreen";
level.billboardBlack.sort = 0;
level.billboardBlack.alpha = .3;
level.billboardBlack setShader("black", 120, 55);
level.billboardWhite = newHudElem();
level.billboardWhite.x = 270;
level.billboardWhite.y = 22;
level.billboardWhite.horzAlign = "fullscreen";
level.billboardWhite.vertAlign = "fullscreen";
level.billboardWhite.sort = 1;
level.billboardWhite.alpha = .3;
level.billboardWhite setShader("white", 116, 50);
level.billboardName = NewHudElem();
level.billboardName.alignX = "left";
level.billboardName.x = 260;
level.billboardName.y = 25;
level.billboardName.sort = 2;
level.billboardName.fontscale = 1.0;
level.billboardName.color = ( 0, 0, 0 );
level.billboardType = NewHudElem();
level.billboardType.alignX = "left";
level.billboardType.x = 260;
level.billboardType.y = 40;
level.billboardType.sort = 2;
level.billboardType.fontscale = 1.0;
level.billboardType.color = ( 0, 0, 0 );
level.billboardSize = NewHudElem();
level.billboardSize.alignX = "left";
level.billboardSize.x = 260;
level.billboardSize.y = 55;
level.billboardSize.sort = 2;
level.billboardSize.fontscale = 1.0;
level.billboardSize.color = ( 0, 0, 0 );
level.billboardName setText("Name: ");
level.billboardType setText( "Type:" );
level.billboardSize setText( "Size:" );
}
destroy_billboard()
{
assertEx( IsDefined( level.billboardName ), "No billboard is created call create_billboard" );
level.billboardBlack destroy();
level.billboardWhite destroy();
level.billboardName destroy();
level.billboardType destroy();
level.billboardSize destroy();
}
update_billboard( event_name, event_type, event_size, event_state, disable_fade )
{
assertEx( IsDefined( level.billboardName ), "No billboard is created call create_billboard" );
if( !IsDefined(event_name) )
{
event_name = "undefined";
}
if( !IsDefined(event_type) )
{
event_type = "undefined";
}
if( !IsDefined(event_size) )
{
event_size = "undefined";
}
color = "black";
for(i = 0; i < 10; i++)
{
if(color == "black")
{
level.billboardName.color = ( 1, 0, 0);
level.billboardType.color = ( 1, 0, 0 );
level.billboardSize.color = ( 1, 0, 0 );
color = "red";
}
else
{
level.billboardName.color = ( 0, 0, 0);
level.billboardType.color = ( 0, 0, 0 );
level.billboardSize.color = ( 0, 0, 0 );
color = "black";
}
wait(0.1);
}
level.billboardBlack.alpha = 1;
level.billboardWhite.alpha = 1;
if( IsDefined(event_state))
{
level.billboardName setText( "Name: " + event_name + " (" + event_state + ")" );
}
else
{
level.billboardName setText( "Name: " + event_name );
}
level.billboardType setText( "Type: " + event_type );
level.billboardSize setText( "Size: " + event_size );
wait(3);
if(IsDefined(disable_fade) && disable_fade)
{
return;
}
deltaT = 0.7 / 60;
for(i = 0; i < 60; i++)
{
level.billboardBlack.alpha -= deltaT;
level.billboardWhite.alpha -= deltaT;
wait(0.05);
}
}
heli_toggle_main_rotor_fx( alternate )
{
if(alternate)
{
self SetClientFlag(0);
}
else
{
self ClearClientFlag(0);
}
}
veh_toggle_tread_fx( on )
{
if(!on)
{
self SetClientFlag(6);
}
else
{
self ClearClientFlag(6);
}
}
veh_toggle_exhaust_fx( on )
{
if(!on)
{
self SetClientFlag(8);
}
else
{
self ClearClientFlag(8);
}
}
veh_toggle_lights( on )
{
if(on)
{
self SetClientFlag(10);
}
else
{
self ClearClientFlag(10);
}
}
heli_toggle_rotor_fx( on )
{
if(!on)
{
self SetClientFlag(1);
}
else
{
self ClearClientFlag(1);
}
}
vehicle_toggle_sounds( on )
{
if(!on)
{
self SetClientFlag(2);
}
else
{
self ClearClientFlag(2);
}
}
spawn_manager_set_global_active_count( cnt )
{
AssertEx( cnt <= 32, "Max number of Active AI at a given time cant be more than 32" );
level.spawn_manager_max_ai = cnt;
}
sm_use_trig_when_complete( spawn_manager_targetname, trig_name, trig_key, once_only )
{
self thread sm_use_trig_when_complete_internal( spawn_manager_targetname, trig_name, trig_key, once_only );
}
sm_use_trig_when_complete_internal( spawn_manager_targetname, trig_name, trig_key, once_only )
{
if(IsDefined(once_only) && once_only )
{
trigger = GetEnt(trig_name, trig_key);
AssertEX(IsDefined(trigger), "The trigger " + trig_key + " / " + trig_name + " does not exist.");
trigger endon("trigger");
}
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
flag_wait("sm_" + spawn_manager_targetname + "_complete");
trigger_use(trig_name, trig_key);
}
else
{
AssertMsg("sm_use_trig_when_complete: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
sm_use_trig_when_cleared( spawn_manager_targetname, trig_name, trig_key, once_only )
{
self thread sm_use_trig_when_cleared_internal( spawn_manager_targetname, trig_name, trig_key, once_only );
}
sm_use_trig_when_cleared_internal( spawn_manager_targetname, trig_name, trig_key, once_only )
{
if(IsDefined(once_only) && once_only )
{
trigger = GetEnt(trig_name, trig_key);
AssertEX(IsDefined(trigger), "The trigger " + trig_key + " / " + trig_name + " does not exist.");
trigger endon("trigger");
}
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
flag_wait("sm_" + spawn_manager_targetname + "_cleared");
trigger_use(trig_name, trig_key);
}
else
{
AssertMsg("sm_use_trig_when_cleared: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
sm_use_trig_when_enabled( spawn_manager_targetname, trig_name, trig_key, once_only )
{
self thread sm_use_trig_when_enabled_internal( spawn_manager_targetname, trig_name, trig_key, once_only );
}
sm_use_trig_when_enabled_internal( spawn_manager_targetname, trig_name, trig_key, once_only )
{
if(IsDefined(once_only) && once_only )
{
trigger = GetEnt(trig_name, trig_key);
AssertEX(IsDefined(trigger), "The trigger " + trig_key + " / " + trig_name + " does not exist.");
trigger endon("trigger");
}
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
flag_wait("sm_" + spawn_manager_targetname + "_enabled");
trigger_use(trig_name, trig_key);
}
else
{
AssertMsg("sm_use_trig_when_cleared: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
sm_run_func_when_complete( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 )
{
self thread sm_run_func_when_complete_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 );
}
sm_run_func_when_complete_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 )
{
AssertEx(IsDefined(process), "sm_run_func_when_complete: the function is not defined");
AssertEx(level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ), "sm_run_func_when_complete: Spawn manager '" + spawn_manager_targetname + "' not found.");
waittill_spawn_manager_complete( spawn_manager_targetname );
single_func(ent, process, var1, var2, var3, var4, var5);
}
sm_run_func_when_cleared( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 )
{
self thread sm_run_func_when_cleared_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 );
}
sm_run_func_when_cleared_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 )
{
AssertEx(IsDefined(process), "sm_run_func_when_cleared: the function is not defined");
AssertEx(level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ), "sm_run_func_when_cleared: Spawn manager '" + spawn_manager_targetname + "' not found.");
waittill_spawn_manager_cleared(spawn_manager_targetname);
single_func(ent, process, var1, var2, var3, var4, var5);
}
sm_run_func_when_enabled( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 )
{
self thread sm_run_func_when_enabled_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 );
}
sm_run_func_when_enabled_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 )
{
AssertEx(IsDefined(process), "sm_run_func_when_enabled: the function is not defined");
AssertEx(level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ), "sm_run_func_when_enabled: Spawn manager '" + spawn_manager_targetname + "' not found.");
waittill_spawn_manager_enabled( spawn_manager_targetname );
single_func(ent, process, var1, var2, var3, var4, var5);
}
spawn_manager_enable( spawn_manager_targetname, no_assert )
{
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
for (i = 0; i < level.spawn_managers.size; i++)
{
if (level.spawn_managers[i].sm_id == spawn_manager_targetname)
{
level.spawn_managers[i] notify("enable");
return;
}
}
}
else if (!is_true(no_assert))
{
AssertMsg("spawn_manager_enable: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
spawn_manager_disable( spawn_manager_targetname, no_assert )
{
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
for( i = 0; i < level.spawn_managers.size; i++ )
{
if( level.spawn_managers[i].sm_id == spawn_manager_targetname )
{
level.spawn_managers[i] notify("disable");
return;
}
}
}
else if (!is_true(no_assert))
{
AssertMsg("spawn_manager_disable: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
spawn_manager_kill( spawn_manager_targetname, no_assert )
{
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
for( i = 0; i < level.spawn_managers.size; i++ )
{
if( level.spawn_managers[i].sm_id == spawn_manager_targetname )
{
level.spawn_managers[i] notify("kill");
return;
}
}
}
else if (!is_true(no_assert))
{
AssertMsg("spawn_manager_kill: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
is_spawn_manager_enabled( spawn_manager_targetname )
{
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
if( flag( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
return true;
}
return false;
}
else
{
AssertMsg("is_spawn_manager_enabled: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
is_spawn_manager_complete( spawn_manager_targetname )
{
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
if( flag( "sm_" + spawn_manager_targetname + "_complete" ) )
{
return true;
}
return false;
}
else
{
AssertMsg("is_spawn_manager_complete: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
is_spawn_manager_cleared( spawn_manager_targetname )
{
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
if( flag( "sm_" + spawn_manager_targetname + "_cleared" ) )
{
return true;
}
return false;
}
else
{
AssertMsg("is_spawn_manager_cleared: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
is_spawn_manager_killed( spawn_manager_targetname )
{
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
if( flag( "sm_" + spawn_manager_targetname + "_killed" ) )
{
return true;
}
return false;
}
else
{
AssertMsg("is_spawn_manager_killed: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
waittill_spawn_manager_cleared(spawn_manager_targetname)
{
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
flag_wait("sm_" + spawn_manager_targetname + "_cleared");
}
else
{
AssertMsg("waittill_spawn_manager_cleared: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
waittill_spawn_manager_ai_remaining(spawn_manager_targetname, count_to_reach)
{
AssertEX( IsDefined(count_to_reach), "# of AI remaining not specified in _utility::waittill_spawn_manager_ai_remaining()");
AssertEX( count_to_reach, "# of AI remaining specified in _utility::waittill_spawn_manager_ai_remaining() is 0, use waittill_spawn_manager_cleared" );
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
flag_wait("sm_" + spawn_manager_targetname + "_complete");
}
else
{
AssertMsg("waittill_spawn_manager_ai_remaining: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
if( flag( "sm_" + spawn_manager_targetname + "_cleared" ) )
{
return;
}
spawn_manager = maps\_spawn_manager::get_spawn_manager_array( spawn_manager_targetname );
AssertEx( spawn_manager.size, "Somehow the spawn manager doesnt exist, but related flag existed before." );
AssertEx( ( spawn_manager.size == 1 ), "Found two spawn managers with same targetname." );
while( ( IsDefined( spawn_manager[0] ) ) && ( spawn_manager[0].activeAI.size > count_to_reach ) )
{
wait(0.1);
}
}
waittill_spawn_manager_complete(spawn_manager_targetname)
{
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
flag_wait("sm_" + spawn_manager_targetname + "_complete");
}
else
{
AssertMsg("waittill_spawn_manager_complete: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
waittill_spawn_manager_enabled(spawn_manager_targetname)
{
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
flag_wait("sm_" + spawn_manager_targetname + "_enabled");
}
else
{
AssertMsg("waittill_spawn_manager_enabled: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
}
waittill_spawn_manager_spawned_count( spawn_manager_targetname, count )
{
if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) )
{
flag_wait("sm_" + spawn_manager_targetname + "_enabled");
}
else
{
AssertMsg("waittill_spawn_manager_spawned_count: Spawn manager '" + spawn_manager_targetname + "' not found.");
}
spawn_manager = maps\_spawn_manager::get_spawn_manager_array( spawn_manager_targetname );
AssertEx( spawn_manager.size, "Somehow the spawn manager doesnt exist, but related flag existed before." );
AssertEx( ( spawn_manager.size == 1 ), "Found two spawn managers with same targetname." );
Assert( spawn_manager[0].count > count, "waittill_spawn_manager_spawned_count : Count should be less than total count on the spawn manager." );
original_count = spawn_manager[0].count;
while(1)
{
if( IsDefined( spawn_manager[0].spawnCount ) && ( spawn_manager[0].spawnCount < count ) && !is_spawn_manager_killed( spawn_manager_targetname ) )
{
wait(0.5);
}
else
{
break;
}
}
return;
}
contextual_melee(melee_name, which_set)
{
self maps\_contextual_melee::main(melee_name, which_set);
}
add_meatshield_target(meatshield, scripted)
{
maps\_meatshield::add_target(meatshield, scripted);
}
add_meatshield_angle_limits(guy, leftarc, rightarc)
{
maps\_meatshield::add_angle_limits( guy, leftarc, rightarc );
}
veh_magic_bullet_shield( on )
{
assertex(!IsAI(self), "This is for vehicles, please use magic_bullet_shield for AI.");
assertex(!IsPlayer(self), "This is for vehicles, please use magic_bullet_shield for players.");
if(!on)
{
self maps\_vehicle::godoff();
}
else
{
self maps\_vehicle::godon();
}
}
OnFirstPlayerConnect_Callback(func)
{
maps\_callbackglobal::AddCallback("on_first_player_connect", func);
}
OnFirstPlayerConnect_CallbackRemove(func)
{
maps\_callbackglobal::RemoveCallback("on_first_player_connect", func);
}
OnPlayerConnect_Callback(func)
{
maps\_callbackglobal::AddCallback("on_player_connect", func);
}
OnPlayerConnect_CallbackRemove(func)
{
maps\_callbackglobal::RemoveCallback("on_player_connect", func);
}
OnPlayerDisconnect_Callback(func)
{
maps\_callbackglobal::AddCallback("on_player_disconnect", func);
}
OnPlayerDisconnect_CallbackRemove(func)
{
maps\_callbackglobal::RemoveCallback("on_player_disconnect", func);
}
OnPlayerDamage_Callback(func)
{
maps\_callbackglobal::AddCallback("on_player_damage", func);
}
OnPlayerDamage_CallbackRemove(func)
{
maps\_callbackglobal::RemoveCallback("on_player_damage", func);
}
OnPlayerLastStand_Callback(func)
{
maps\_callbackglobal::AddCallback("on_player_last_stand", func);
}
OnPlayerLastStand_CallbackRemove(func)
{
maps\_callbackglobal::RemoveCallback("on_player_last_stand", func);
}
OnPlayerKilled_Callback(func)
{
maps\_callbackglobal::AddCallback("on_player_killed", func);
}
OnPlayerKilled_CallbackRemove(func)
{
maps\_callbackglobal::RemoveCallback("on_player_killed", func);
}
OnActorDamage_Callback(func)
{
maps\_callbackglobal::AddCallback("on_actor_damage", func);
}
OnActorDamage_CallbackRemove(func)
{
maps\_callbackglobal::RemoveCallback("on_actor_damage", func);
}
OnActorKilled_Callback(func)
{
maps\_callbackglobal::AddCallback("on_actor_killed", func);
}
OnActorKilled_CallbackRemove(func)
{
maps\_callbackglobal::RemoveCallback("on_actor_killed", func);
}
OnVehicleDamage_Callback(func)
{
maps\_callbackglobal::AddCallback("on_vehicle_damage", func);
}
OnVehicleDamage_CallbackRemove(func)
{
maps\_callbackglobal::RemoveCallback("on_vehicle_damage", func);
}
OnSaveRestored_Callback(func)
{
maps\_callbackglobal::AddCallback("on_save_restored", func);
}
OnSaveRestored_CallbackRemove(func)
{
maps\_callbackglobal::RemoveCallback("on_save_restored", func);
}
aim_at_target(target, duration)
{
self endon("death");
self endon("stop_aim_at_target");
assert( IsDefined(target) );
if( !IsDefined(target) )
{
return;
}
self SetEntityTarget( target );
self.a.allow_shooting = false;
if( IsDefined(duration) && duration > 0 )
{
elapsed = 0;
while( elapsed < duration )
{
elapsed += 0.05;
wait(0.05);
}
stop_aim_at_target();
}
}
stop_aim_at_target()
{
self ClearEntityTarget();
self.a.allow_shooting = true;
self notify("stop_aim_at_target");
}
shoot_at_target(target, tag, fireDelay, duration)
{
self endon("death");
self endon("stop_shoot_at_target");
assert( IsDefined(target) );
if( !IsDefined(target) )
{
return;
}
if( IsDefined(tag) && tag != "" && tag != "tag_eye" && tag != "tag_head" )
{
self SetEntityTarget( target, 1, tag );
}
else
{
self SetEntityTarget( target );
}
self animscripts\weaponList::RefillClip();
if( IsDefined(fireDelay) && fireDelay > 0 )
{
self.a.allow_shooting = false;
wait( fireDelay );
}
self.a.allow_shooting = true;
self.cansee_override = true;
self call_overloaded_func( "animscripts\shoot_behavior", "setShootEnt", target );
self waittill("shoot");
if( IsDefined(duration) )
{
if( duration > 0)
{
elapsed = 0;
while( elapsed < duration )
{
elapsed += 0.05;
wait(0.05);
}
}
else if (duration == -1)
{
target waittill("death");
}
}
stop_shoot_at_target();
}
shoot_at_target_untill_dead(target, tag, fireDelay)
{
shoot_at_target(target, tag, fireDelay, -1);
}
stop_shoot_at_target()
{
self ClearEntityTarget();
self.cansee_override = false;
self notify("stop_shoot_at_target");
}
add_trigger_to_ent(ent)
{
if(!IsDefined(ent._triggers))
{
ent._triggers = [];
}
ent._triggers[self GetEntityNumber()] = 1;
}
remove_trigger_from_ent(ent)
{
if(!IsDefined(ent._triggers))
return;
if(!IsDefined(ent._triggers[self GetEntityNumber()]))
return;
ent._triggers[self GetEntityNumber()] = 0;
}
ent_already_in_trigger(trig)
{
if(!IsDefined(self._triggers))
return false;
if(!IsDefined(self._triggers[trig GetEntityNumber()]))
return false;
if(!self._triggers[trig GetEntityNumber()])
return false;
return true;
}
trigger_thread(ent, on_enter_payload, on_exit_payload)
{
ent endon("entityshutdown");
ent endon("death");
if(ent ent_already_in_trigger(self))
return;
self add_trigger_to_ent(ent);
endon_condition = "leave_trigger_" + self GetEntityNumber();
if(IsDefined(on_enter_payload))
{
self thread [[on_enter_payload]](ent, endon_condition);
}
while(IsDefined(ent) && ent IsTouching(self))
{
wait(0.01);
}
ent notify(endon_condition);
if(IsDefined(ent) && IsDefined(on_exit_payload))
{
self thread [[on_exit_payload]](ent);
}
if(IsDefined(ent))
{
self remove_trigger_from_ent(ent);
}
}
set_swimming_depth_of_field( toggle, set_values, near_start, near_end, far_start, far_end, near_blur, far_blur)
{
AssertEx(IsDefined(toggle), "toggle must be set to true or false");
if(toggle)
{
level._swimming.toggle_depth_of_field = true;
if(IsDefined(set_values) && set_values)
{
AssertEx(IsDefined(near_start), "Depth of Field value near_start undefined");
AssertEx(IsDefined(near_end), "Depth of Field value near_end undefined");
AssertEx(IsDefined(far_start), "Depth of Field value far_start undefined");
AssertEx(IsDefined(far_end), "Depth of Field value far_end undefined");
AssertEx(IsDefined(near_blur), "Depth of Field value near_blur undefined");
AssertEx(IsDefined(far_blur), "Depth of Field value far_blur undefined");
AssertEx(near_start < near_end, "Depth of Field value near_start must be < near_end");
AssertEx(far_start < far_end, "Depth of Field value far_start must be < far_end");
level._swimming.dof_near_start = near_start;
level._swimming.dof_near_end = near_end;
level._swimming.dof_far_start = far_start;
level._swimming.dof_far_end = far_end;
level._swimming.dof_near_blur = near_blur;
level._swimming.dof_far_blur = far_blur;
}
}
else if(!toggle)
{
level._swimming.toggle_depth_of_field = false;
}
}
disable_swimming()
{
self maps\_swimming::disable();
}
enable_swimming()
{
self maps\_swimming::enable();
}
hide_swimming_arms()
{
self ClientNotify("_swimming:hide_arms");
}
show_swimming_arms()
{
self ClientNotify("_swimming:show_arms");
}
delete_ents( mask, origin, radius )
{
ents = entsearch( mask, origin, radius );
for( i = 0; i < ents.size; i++ )
{
ents[i] delete();
}
}
set_drop_weapon(weapon_name)
{
AssertEx(IsDefined(weapon_name) && IsString(weapon_name), "_utility::set_drop_weapon: Invalid weapon name!");
self.script_dropweapon = weapon_name;
}
take_and_giveback_weapons(mynotify, no_autoswitch)
{
take_weapons();
self waittill (mynotify);
give_weapons(no_autoswitch);
}
take_weapons()
{
self.curweapon = self GetCurrentWeapon();
self.weapons_list = self GetWeaponsList();
self.offhand = self GetCurrentOffhand();
weapon_list_modified = [];
for ( i = 0; i < self.weapons_list.size; i++)
{
if( !is_weapon_attachment( self.weapons_list[i] ) )
weapon_list_modified[ weapon_list_modified.size ] = self.weapons_list[i];
}
self.weapons_list = weapon_list_modified;
if( is_weapon_attachment( self.curweapon ) )
{
self.curweapon = get_baseweapon_for_attachment( self.curweapon );
}
self.weapons_info = [];
for ( i = 0; i < self.weapons_list.size; i++)
{
self.weapons_info[i] = SpawnStruct();
if (IsDefined(self.offhand) && self.weapons_list[i] == self.offhand )
{
self.weapons_info[i]._ammo = 0;
self.weapons_info[i]._stock = self GetWeaponAmmoStock(self.weapons_list[i]);
}
else
{
self.weapons_info[i]._ammo = self GetWeaponAmmoClip(self.weapons_list[i]);
self.weapons_info[i]._stock = self GetWeaponAmmoStock(self.weapons_list[i]);
self.weapons_info[i]._renderOptions = self GetWeaponRenderOptions( self.weapons_list[i] );
}
}
self TakeAllWeapons();
}
give_weapons(no_autoswitch)
{
for (i=0; i < self.weapons_list.size; i++)
{
if( IsDefined( self.weapons_info[i]._renderOptions ) )
{
self GiveWeapon(self.weapons_list[i], 0, self.weapons_info[i]._renderOptions );
}
else
{
self GiveWeapon(self.weapons_list[i]);
}
self SetWeaponAmmoClip(self.weapons_list[i], self.weapons_info[i]._ammo);
self SetWeaponAmmoStock(self.weapons_list[i], self.weapons_info[i]._stock );
}
self.weapons_info = undefined;
if( IsDefined( self.curweapon ) && self.curweapon != "none" && !IsDefined(no_autoswitch) )
{
self SwitchToWeapon(self.curweapon);
}
}
is_weapon_attachment( weapon_name )
{
weapon_pieces = StrTok(weapon_name, "_");
if( weapon_pieces[0] == "ft" || weapon_pieces[0] == "mk" || weapon_pieces[0] == "gl" )
{
return true;
}
return false;
}
get_baseweapon_for_attachment( weapon_name )
{
Assert( is_weapon_attachment( weapon_name ) );
weapon_pieces = StrTok( weapon_name, "_" );
attachment = weapon_pieces[0];
Assert( weapon_pieces[0] == "ft" || weapon_pieces[0] == "mk" || weapon_pieces[0] == "gl" || weapon_pieces[0] == "db" );
weapon = weapon_pieces[1];
Assert( weapon_pieces[1] != "ft" && weapon_pieces[1] != "mk" && weapon_pieces[1] != "gl" && weapon_pieces[1] != "db" );
for ( i = 0; i < self.weapons_list.size; i++)
{
if( IsSubStr( self.weapons_list[i], weapon ) && IsSubStr( self.weapons_list[i], attachment ) )
return self.weapons_list[i];
}
return self.weapons_list[0];
}
set_near_plane(val)
{
self SetClientDvar("r_znear", val);
}
reset_near_plane()
{
self SetClientDvar("r_znear", 4);
}
average_origin( ent_array )
{
AssertEx( IsArray(ent_array), "_utility::average_position passed a non-array" );
AssertEx( ent_array.size > 0, "_utility::average_position passed a size zero array");
if(IsVec(ent_array[0]))
{
return(average_origin_internal( ent_array ));
}
org_array = [];
for(i=0; i<ent_array.size; i++)
{
org_array[i] = ent_array[i].origin;
}
return(average_origin_internal( org_array ));
}
average_origin_internal( org_array )
{
if(org_array.size == 1)
{
return org_array[0];
}
pos = (0,0,0);
for( i=0; i < org_array.size; i++ )
{
pos += org_array[i];
}
avg_pos = pos / org_array.size;
return avg_pos;
}
screen_message_create( string_message_1, string_message_2, string_message_3 )
{
if( IsDefined( level.missionfailed ) && level.missionfailed )
return;
if( GetDvarInt( "hud_missionFailed" ) == 1 )
return;
if( !IsDefined(level._screen_message_1) )
{
level._screen_message_1 = NewHudElem();
level._screen_message_1.elemType = "font";
level._screen_message_1.font = "objective";
level._screen_message_1.fontscale = 1.8;
level._screen_message_1.horzAlign = "center";
level._screen_message_1.vertAlign = "middle";
level._screen_message_1.alignX = "center";
level._screen_message_1.alignY = "middle";
level._screen_message_1.y = -60;
level._screen_message_1.sort = 2;
level._screen_message_1.color = ( 1, 1, 1 );
level._screen_message_1.alpha = 0.70;
level._screen_message_1.hidewheninmenu = true;
}
level._screen_message_1 SetText( string_message_1 );
if( IsDefined(string_message_2) )
{
if( !IsDefined(level._screen_message_2) )
{
level._screen_message_2 = NewHudElem();
level._screen_message_2.elemType = "font";
level._screen_message_2.font = "objective";
level._screen_message_2.fontscale = 1.8;
level._screen_message_2.horzAlign = "center";
level._screen_message_2.vertAlign = "middle";
level._screen_message_2.alignX = "center";
level._screen_message_2.alignY = "middle";
level._screen_message_2.y = -33;
level._screen_message_2.sort = 2;
level._screen_message_2.color = ( 1, 1, 1 );
level._screen_message_2.alpha = 0.70;
level._screen_message_2.hidewheninmenu = true;
}
level._screen_message_2 SetText( string_message_2 );
}
else if( IsDefined(level._screen_message_2) )
{
level._screen_message_2 Destroy();
}
if( IsDefined(string_message_3) )
{
if( !IsDefined(level._screen_message_3) )
{
level._screen_message_3 = NewHudElem();
level._screen_message_3.elemType = "font";
level._screen_message_3.font = "objective";
level._screen_message_3.fontscale = 1.8;
level._screen_message_3.horzAlign = "center";
level._screen_message_3.vertAlign = "middle";
level._screen_message_3.alignX = "center";
level._screen_message_3.alignY = "middle";
level._screen_message_3.y = -6;
level._screen_message_3.sort = 2;
level._screen_message_3.color = ( 1, 1, 1 );
level._screen_message_3.alpha = 0.70;
level._screen_message_3.hidewheninmenu = true;
}
level._screen_message_3 SetText( string_message_3 );
}
else if( IsDefined(level._screen_message_3) )
{
level._screen_message_3 Destroy();
}
}
screen_message_delete()
{
if( IsDefined(level._screen_message_1) )
{
level._screen_message_1 Destroy();
}
if( IsDefined(level._screen_message_2) )
{
level._screen_message_2 Destroy();
}
if( IsDefined(level._screen_message_3) )
{
level._screen_message_3 Destroy();
}
}
get_eye()
{
if (IsPlayer(self))
{
linked_ent = self GetLinkedEnt();
if (IsDefined(linked_ent) && (GetDvarInt( #"cg_cameraUseTagCamera") > 0))
{
camera = linked_ent GetTagOrigin("tag_camera");
if (IsDefined(camera))
{
return camera;
}
}
}
pos = self GetEye();
return pos;
}
vehicle_node_wait( strName, strKey )
{
if( !IsDefined( strKey ) )
{
strKey = "targetname";
}
nodes = GetVehicleNodeArray( strName, strKey );
AssertEX( IsDefined(nodes) && nodes.size > 0, "_utility::vehicle_node_wait - vehicle node not found: " + strName + " key: " + strKey );
ent = SpawnStruct();
array_thread( nodes, common_scripts\utility::trigger_wait_think, ent );
ent waittill( "trigger", eOther, node_hit );
level notify( strName, eOther );
if(IsDefined(node_hit))
{
node_hit.who = eother;
return node_hit;
}
else
{
return eOther;
}
}
timescale_tween(start, end, time, delay, step_time)
{
DEFAULT_STEP_TIME = .1;
if (!IsDefined(step_time))
{
step_time = DEFAULT_STEP_TIME;
}
num_steps = time / step_time;
time_scale_range = end - start;
time_scale_step = 0;
if (num_steps > 0)
{
time_scale_step = abs(time_scale_range) / num_steps;
}
if (IsDefined(delay))
{
wait delay;
}
level notify("timescale_tween");
level endon("timescale_tween");
time_scale = start;
SetTimeScale(time_scale);
while (time_scale != end)
{
wait(step_time);
if (time_scale_range > 0)
{
time_scale = min(time_scale + time_scale_step, end);
}
else if (time_scale_range < 0)
{
time_scale = max(time_scale - time_scale_step, end);
}
SetTimeScale(time_scale);
}
}
player_seek( delayed )
{
self endon("death");
self.ignoresuppression = 1;
if( IsDefined( self.target ) || IsDefined( self.script_spawner_targets ) )
{
self waittill("goal");
}
while(1)
{
if( IsDefined( delayed ) )
{
wait( RandomIntRange( 6, 12 ) );
}
else
{
wait( 0.05 );
}
if( self.goalradius > 100 )
{
self.goalradius = self.goalradius - 100;
}
self.pathenemyFightdist = self.goalradius;
closest_player = get_closest_player( self.origin );
self SetGoalEntity( closest_player );
self animscripts\combat_utility::FindCoverNearSelf();
}
}
set_spawner_targets(spawner_targets)
{
self thread maps\_spawner::go_to_spawner_target(StrTok(spawner_targets," "));
}
ragdoll_death()
{
self animscripts\utility::do_ragdoll_death();
}
is_destructible()
{
if (!IsDefined(self.script_noteworthy))
{
return false;
}
switch (self.script_noteworthy)
{
case "explodable_barrel":
return true;
}
return false;
}
register_overloaded_func( filename, funcname, func )
{
if ( !isDefined( level._overloaded_funcs ) )
{
level._overloaded_funcs = [];
}
if ( !isDefined( level._overloaded_funcs[filename] ) )
{
level._overloaded_funcs[filename] = [];
}
if ( isDefined( level._overloaded_funcs[filename][funcname] ) )
{
error( "Tried to call register_overloaded_func() on a previously registered filename['" + filename + "']/funcname['" + funcname + "'] combination." );
return;
}
level._overloaded_funcs[filename][funcname] = func;
}
call_overloaded_func( filename, funcname, var1, var2, var3, var4, var5 )
{
if ( !isDefined( level._overloaded_funcs ) )
{
if ( GetDvar( #"zombiemode" ) == "1" )
{
println( "call_overloaded_func: no overloaded_funcs registered." );
}
else
{
assertex( false, "call_overloaded_func: no overloaded_funcs registered." );
}
return false;
}
if ( !isDefined( level._overloaded_funcs[filename] ) )
{
if ( GetDvar( #"zombiemode" ) == "1" )
{
println( "call_overloaded_func: no overloaded_funcs registered for filename: '" + filename + "'." );
}
else
{
assertex( false, "call_overloaded_func: no overloaded_funcs registered for filename: '" + filename + "'." );
}
return false;
}
if ( !isDefined( level._overloaded_funcs[filename][funcname] ) )
{
if ( GetDvar( #"zombiemode" ) == "1" )
{
println( "call_overloaded_func: no overloaded_func registered for filename['" + filename + "']/funcname['" + funcname + "'] combination." );
}
else
{
assertex( false, "call_overloaded_func: no overloaded_func registered for filename['" + filename + "']/funcname['" + funcname + "'] combination." );
}
return false;
}
if ( IsDefined( var5 ) )
{
return self [[ level._overloaded_funcs[filename][funcname] ]]( var1, var2, var3, var4, var5 );
}
if ( IsDefined( var4 ) )
{
return self [[ level._overloaded_funcs[filename][funcname] ]]( var1, var2, var3, var4 );
}
if ( IsDefined( var3 ) )
{
return self [[ level._overloaded_funcs[filename][funcname] ]]( var1, var2, var3 );
}
if ( IsDefined( var2 ) )
{
return self [[ level._overloaded_funcs[filename][funcname] ]]( var1, var2 );
}
if ( IsDefined( var1 ) )
{
return self [[ level._overloaded_funcs[filename][funcname] ]]( var1 );
}
return self [[ level._overloaded_funcs[filename][funcname] ]]();
}
get_overloaded_func( filename, funcname )
{
if ( !isDefined( level._overloaded_funcs ) )
{
if ( GetDvar( #"zombiemode" ) == "1" )
{
println( "get_overloaded_func: no overloaded_funcs registered." );
}
else
{
assertex( false, "get_overloaded_func: no overloaded_funcs registered." );
}
return false;
}
if ( !isDefined( level._overloaded_funcs[filename] ) )
{
if ( GetDvar( #"zombiemode" ) == "1" )
{
println( "get_overloaded_func: no overloaded_funcs registered for filename: '" + filename + "'." );
}
else
{
assertex( false, "get_overloaded_func: no overloaded_funcs registered for filename: '" + filename + "'." );
}
return false;
}
if ( !isDefined( level._overloaded_funcs[filename][funcname] ) )
{
if ( GetDvar( #"zombiemode" ) == "1" )
{
println( "get_overloaded_func: no overloaded_func registered for filename['" + filename + "']/funcname['" + funcname + "'] combination." );
}
else
{
assertex( false, "get_overloaded_func: no overloaded_func registered for filename['" + filename + "']/funcname['" + funcname + "'] combination." );
}
return false;
}
return level._overloaded_funcs[filename][funcname];
}
waittill_not_moving()
{
self endon("death");
self endon( "disconnect" );
self endon( "detonated" );
level endon( "game_ended" );
prevorigin = self.origin;
while(1)
{
wait .15;
if ( self.origin == prevorigin )
break;
prevorigin = self.origin;
}
}
turn_off_friendly_player_look()
{
level._dont_look_at_player = true;
}
turn_on_friendly_player_look()
{
level._dont_look_at_player = false;
}
force_goal(node_or_org, radius, shoot, end_on, keep_colors)
{
self endon("death");
goalradius = self.goalradius;
if (IsDefined(radius))
{
self.goalradius = radius;
}
color_enabled = false;
if (!is_true(keep_colors))
{
if (IsDefined(get_force_color()))
{
color_enabled = true;
self disable_ai_color();
}
}
allowpain = self.allowpain;
allowreact = self.allowreact;
ignoreall = self.ignoreall;
ignoreme = self.ignoreme;
dontshootwhilemoving = self.dontshootwhilemoving;
ignoresuppression = self.ignoresuppression;
suppressionthreshold = self.suppressionthreshold;
nododgemove = self.nododgemove;
grenadeawareness = self.grenadeawareness;
pathenemylookahead = self.pathenemylookahead;
pathenemyfightdist = self.pathenemyfightdist;
meleeattackdist = self.meleeattackdist;
fixednodesaferadius = self.fixednodesaferadius;
if (is_false(shoot))
{
self set_ignoreall(true);
}
self.dontshootwhilemoving = undefined;
self.pathenemyfightdist = 0;
self.pathenemylookahead = 0;
self.ignoresuppression = true;
self.suppressionthreshold = 1;
self.nododgemove = true;
self.grenadeawareness = 0;
self.meleeattackdist = 0;
self.fixednodesaferadius = 0;
if ( GetDvar( #"zombiemode" ) != "1" )
{
self set_ignoreme(true);
self disable_react();
self disable_pain();
}
self PushPlayer(true);
if (IsDefined(node_or_org))
{
if (IsVec(node_or_org))
{
self set_goal_pos(node_or_org);
}
else
{
self set_goal_node(node_or_org);
}
}
if (IsDefined(end_on))
{
self waittill(end_on);
}
else
{
self waittill("goal");
}
if (color_enabled)
{
enable_ai_color();
}
self PushPlayer(false);
if ( GetDvar( #"zombiemode" ) == "1" )
{
if (IsDefined(radius))
{
self.goalradius = goalradius;
}
}
else
{
self.goalradius = goalradius;
self set_ignoreall(ignoreall);
self set_ignoreme(ignoreme);
if (allowpain)
{
self enable_pain();
}
if (allowreact)
{
self enable_react();
}
}
self.ignoresuppression = ignoresuppression;
self.suppressionthreshold = suppressionthreshold;
self.nododgemove = nododgemove;
self.dontshootwhilemoving = dontshootwhilemoving;
self.grenadeawareness = grenadeawareness;
self.pathenemylookahead = pathenemylookahead;
self.pathenemyfightdist = pathenemyfightdist;
self.meleeattackdist = meleeattackdist;
self.fixednodesaferadius = fixednodesaferadius;
}
restore_ik_headtracking_limits()
{
SetSavedDvar("ik_pitch_limit_thresh", 10);
SetSavedDvar("ik_pitch_limit_max", 60);
SetSavedDvar("ik_roll_limit_thresh", 30);
SetSavedDvar("ik_roll_limit_max", 100);
SetSavedDvar("ik_yaw_limit_thresh", 10);
SetSavedDvar("ik_yaw_limit_max", 90);
}
relax_ik_headtracking_limits()
{
SetSavedDvar("ik_pitch_limit_thresh", 110);
SetSavedDvar("ik_pitch_limit_max", 120);
SetSavedDvar("ik_roll_limit_thresh", 90);
SetSavedDvar("ik_roll_limit_max", 100);
SetSavedDvar("ik_yaw_limit_thresh", 80);
SetSavedDvar("ik_yaw_limit_max", 90);
}
do_notetracks(flag)
{
self animscripts\shared::DoNoteTracks(flag);
}
rumble_delay(delay, rumble)
{
wait delay;
self PlayRumbleOnEntity(rumble);
}
enable_random_weapon_drops()
{
level.rw_enabled = true;
}
disable_random_weapon_drops()
{
level.rw_enabled = false;
}
enable_random_alt_weapon_drops()
{
level.rw_attachments_allowed = true;
}
disable_random_alt_weapon_drops()
{
level.rw_attachments_allowed = false;
}
set_random_alt_weapon_drops( attachment_abbreviation, on_or_off )
{
AssertEX(IsDefined(attachment_abbreviation), "set_random_alt_weapon_drops called without passing in an attachment type");
AssertEX(IsDefined(on_or_off), "set_random_alt_weapon_drops called without telling the function whether it is on or off");
switch( attachment_abbreviation )
{
case "ft":
level.rw_ft_allowed = on_or_off;
break;
case "gl":
level.rw_gl_allowed = on_or_off;
break;
case "mk":
level.rw_mk_allowed = on_or_off;
break;
default:
AssertEX(false, "Weapon of type: " + attachment_abbreviation + " is not a valid attachment abbreviation." );
break;
}
}
button_held_think(which_button)
{
self endon("disconnect");
if (!IsDefined(self._holding_button))
{
self._holding_button = [];
}
self._holding_button[which_button] = false;
time_started = 0;
use_time = GetDvarInt("g_useholdtime");
while(1)
{
if(self._holding_button[which_button])
{
if(!self [[level._button_funcs[which_button]]]())
{
self._holding_button[which_button] = false;
}
}
else
{
if(self [[level._button_funcs[which_button]]]())
{
if(time_started == 0)
{
time_started = GetTime();
}
if((GetTime() - time_started) > use_time)
{
self._holding_button[which_button] = true;
}
}
else
{
if(time_started != 0)
{
time_started = 0;
}
}
}
wait(0.05);
}
}
use_button_held()
{
init_button_wrappers();
if(!IsDefined(self._use_button_think_threaded))
{
self thread button_held_think(level.BUTTON_USE);
self._use_button_think_threaded = true;
}
return self._holding_button[level.BUTTON_USE];
}
ads_button_held()
{
init_button_wrappers();
if(!IsDefined(self._ads_button_think_threaded))
{
self thread button_held_think(level.BUTTON_ADS);
self._ads_button_think_threaded = true;
}
return self._holding_button[level.BUTTON_ADS];
}
attack_button_held()
{
init_button_wrappers();
if(!IsDefined(self._attack_button_think_threaded))
{
self thread button_held_think(level.BUTTON_ATTACK);
self._attack_button_think_threaded = true;
}
return self._holding_button[level.BUTTON_ATTACK];
}
use_button_pressed()
{
return (self UseButtonPressed());
}
ads_button_pressed()
{
return (self AdsButtonPressed());
}
attack_button_pressed()
{
return (self AttackButtonPressed());
}
init_button_wrappers()
{
if (!IsDefined(level._button_funcs))
{
level.BUTTON_USE = 0;
level.BUTTON_ADS = 1;
level.BUTTON_ATTACK = 2;
level._button_funcs[level.BUTTON_USE] = ::use_button_pressed;
level._button_funcs[level.BUTTON_ADS] = ::ads_button_pressed;
level._button_funcs[level.BUTTON_ATTACK] = ::attack_button_pressed;
}
}
play_movie_on_surface(movie_name, is_looping, is_in_memory, start_on_notify, notify_when_done, notify_offset)
{
level endon("stop_movie");
if (!IsDefined(level.flag["movie_loaded"]))
{
flag_init("movie_loaded");
}
if (!IsDefined(is_looping))
{
is_looping = false;
}
if (!IsDefined(is_in_memory))
{
is_in_memory = true;
}
if (!IsDefined(notify_offset) || notify_offset < .3)
{
notify_offset = .3;
}
level thread load_movie(movie_name, is_looping, is_in_memory, IsDefined(start_on_notify));
if (IsDefined(start_on_notify))
{
level waittill(start_on_notify);
}
playsoundatposition(movie_name+"_movie",(0,0,0));
flag_wait("movie_loaded");
Pause3DCinematic(false);
waittill_movie_done(notify_when_done, notify_offset, is_looping);
flag_clear("movie_loaded");
}
start_movie_scene()
{
level notify("kill_scene_subs_thread");
level._scene_subs = [];
}
add_scene_line(scene_line, time, duration)
{
if(!IsDefined(level._scene_subs))
{
level._scene_subs = [];
}
sl = SpawnStruct();
sl.line = scene_line;
sl.time = time;
sl.duration = duration;
for(i = 0; i < level._scene_subs.size; i ++)
{
if(time < level._scene_subs[i].time)
{
PrintLn("*** ERROR: Cannot add an earlier line after a later one. Times must always increase.");
return;
}
}
level._scene_subs[level._scene_subs.size] = sl;
}
sub_fade(alpha, duration)
{
self notify("kill_fade");
self endon("kill_fade");
if(alpha == 1)
{
self.alpha = 0;
}
self fadeOverTime( duration );
self.alpha = alpha;
wait( duration );
}
do_scene_sub(sub_string, duration)
{
if(!GetDvarInt( #"cg_subtitles"))
return;
if (!IsDefined(level.vo_hud))
{
level.vo_hud = NewHudElem();
level.vo_hud.fontscale = 2;
level.vo_hud.horzAlign = "center";
level.vo_hud.vertAlign = "middle";
level.vo_hud.alignX = "center";
level.vo_hud.alignY = "middle";
level.vo_hud.y = 180;
level.vo_hud.sort = 0;
}
fade_duration = 0.2;
level.vo_hud thread sub_fade(1, fade_duration);
old_scale = level.vo_hud.fontscale;
level.vo_hud.fontscale = 1.5;
old_sort = level.vo_hud.sort;
level.vo_hud.sort = 1;
level.vo_hud SetText(sub_string);
wait (duration - fade_duration);
level.vo_hud sub_fade(0, fade_duration);
level.vo_hud SetText("");
level.vo_hud.sort = old_sort;
level.vo_hud.fontscale = old_scale;
}
playback_scene_subs()
{
if(!IsDefined(level._scene_subs))
{
return;
}
level notify("kill_scene_subs_thread");
level endon("kill_scene_subs_thread");
scene_start = GetTime();
for(i = 0; i < level._scene_subs.size; i ++)
{
level._scene_subs[i].time = scene_start + (level._scene_subs[i].time * 1000);
}
for(i = 0; i < level._scene_subs.size; i ++)
{
while(GetTime() < level._scene_subs[i].time)
{
wait(0.05);
}
do_scene_sub(level._scene_subs[i].line, level._scene_subs[i].duration);
}
level._scene_subs = undefined;
}
play_movie(movie_name, is_looping, is_in_memory, start_on_notify, use_fullscreen_trans, notify_when_done, notify_offset, snapshot)
{
level endon("stop_movie");
if (!IsDefined(level.flag["movie_loaded"]))
{
flag_init("movie_loaded");
}
if (!IsDefined(level.flag["movie_failed"]))
{
flag_init("movie_failed");
}
if (!IsDefined(is_looping))
{
is_looping = false;
}
if (!IsDefined(is_in_memory))
{
is_in_memory = true;
}
if (!IsDefined(notify_offset) || notify_offset < .3)
{
notify_offset = .3;
}
if(!IsDefined (snapshot))
{
snapshot = 0;
}
fullscreen_trans_in = "none";
fullscreen_trans_out = "none";
if (is_true(use_fullscreen_trans))
{
fullscreen_trans_in = "white";
fullscreen_trans_out = "white";
if (IsDefined(level.movie_trans_in))
{
fullscreen_trans_in = level.movie_trans_in;
}
if (IsDefined(level.movie_trans_out))
{
fullscreen_trans_out = level.movie_trans_out;
}
}
level thread load_movie(movie_name, is_looping, is_in_memory, IsDefined(start_on_notify));
if (IsDefined(start_on_notify))
{
level waittill(start_on_notify);
}
level thread playback_scene_subs();
level thread handle_movie_dvars();
vision_set = movie_fade_in(movie_name, fullscreen_trans_in);
hud = start_movie(movie_name, fullscreen_trans_in);
if (flag("movie_failed"))
{
if (IsDefined(notify_when_done))
{
wait .05;
level notify(notify_when_done);
if (IsDefined(notify_offset))
{
wait notify_offset;
}
}
}
else
{
waittill_movie_done(notify_when_done, notify_offset, is_looping);
}
clientNotify ("pmo");
flag_clear("movie_loaded");
flag_clear("movie_failed");
level.movie_trans_in = undefined;
level.movie_trans_out = undefined;
if (IsDefined(hud))
{
hud Destroy();
}
level thread movie_fade_out(movie_name, vision_set, fullscreen_trans_out);
level waittill_notify_or_timeout("cine_notify", 1);
}
handle_movie_dvars()
{
players = GetPlayers();
for (i=0;i<players.size;i++)
{
players[i]._hud_dvars = [];
players[i]._hud_dvars["cl_scoreDraw"] = Int(GetDvar("cl_scoreDraw"));
players[i]._hud_dvars["compass"] = Int(GetDvar("compass"));
players[i]._hud_dvars["hud_showstance"] = Int(GetDvar("hud_showstance"));
players[i]._hud_dvars["actionSlotsHide"] = Int(GetDvar("actionSlotsHide"));
players[i]._hud_dvars["ammoCounterHide"] = Int(GetDvar("ammoCounterHide"));
players[i]._hud_dvars["cg_cursorHints"] = Int(GetDvar("cg_cursorHints"));
players[i]._hud_dvars["hud_showobjectives"] = Int(GetDvar("hud_showobjectives"));
players[i]._hud_dvars["cg_drawFriendlyNames"] = Int(GetDvar("cg_drawfriendlynames"));
players[i] SetClientDvars( "cl_scoreDraw",0,"compass",0,"hud_showstance",0,"actionSlotsHide",1,"ammoCounterHide",1,"cg_cursorHints",0, "hud_showobjectives", 0, "cg_drawfriendlynames", 0);
}
flag_wait("movie_loaded");
waittill_either("movie_loaded", "stop_movie");
PrintLn("play_movie: resetting play movie dvars.");
players = GetPlayers();
for (i=0;i<players.size;i++)
{
keys = GetArrayKeys(players[i]._hud_dvars);
players[i] SetClientDvars( keys[0],players[i]._hud_dvars[keys[0]],keys[1],players[i]._hud_dvars[keys[1]],keys[2],players[i]._hud_dvars[keys[2]],keys[3],players[i]._hud_dvars[keys[3]],keys[4],players[i]._hud_dvars[keys[4]],keys[5],players[i]._hud_dvars[keys[5]], keys[6], players[i]._hud_dvars[keys[6]], keys[7], players[i]._hud_dvars[keys[7]]);
}
}
load_movie(movie_name, is_looping, is_in_memory, paused)
{
level endon("stop_movie");
Start3DCinematic(movie_name, is_looping, is_in_memory);
level thread load_movie_failsafe();
level waittill("cine_notify", num);
if (num == -1)
{
flag_set("movie_failed");
}
else if (is_true(paused))
{
Pause3DCinematic(true);
}
flag_set("movie_loaded");
}
load_movie_failsafe()
{
level endon("cine_notify");
wait 10;
Stop3DCinematic();
level notify("cine_notify", -1);
}
start_movie(movie_name, fullscreen_trans)
{
flag_wait("movie_loaded");
hud = undefined;
if ( !IsDefined(level.fullscreen_cin_hud) )
{
hud = create_movie_hud(fullscreen_trans);
}
if (!flag("movie_failed"))
{
PlaySoundAtPosition(movie_name+"_movie",(0,0,0));
Pause3DCinematic(false);
}
return hud;
}
stop_movie()
{
level endon("movie_loaded");
level notify("stop_movie");
Stop3DCinematic();
flag_clear("movie_loaded");
}
create_movie_hud(fullscreen_trans)
{
movie_hud = NewHudElem();
movie_hud.x = 0;
movie_hud.y = 0;
movie_hud.horzAlign = "fullscreen";
movie_hud.vertAlign = "fullscreen";
movie_hud.foreground = false;
movie_hud.sort = 0;
movie_hud.alpha = 1;
if (!is_true(level.flag["movie_failed"]))
{
movie_hud SetShader("cinematic", 640, 480);
}
else
{
if (fullscreen_trans == "black")
{
movie_hud SetShader("black", 640, 480);
}
else
{
movie_hud SetShader("white", 640, 480);
}
}
movie_hud thread destroy_when_movie_is_stopped();
return movie_hud;
}
destroy_when_movie_is_stopped()
{
level endon("movie_loaded");
level waittill("stop_movie");
if (IsDefined(self))
{
self Destroy();
}
}
movie_fade_in(movie_name, fullscreen_trans)
{
level endon("stop_movie");
current_vision_set = "";
if (fullscreen_trans != "none")
{
fade_hud = NewHudElem();
PlaySoundAtPosition(movie_name+"_fade_in",(0,0,0));
FADE_IN = .5;
if (IsDefined(level.movie_fade_in_time))
{
FADE_IN = level.movie_fade_in_time;
}
switch (fullscreen_trans)
{
case "white":
{
current_vision_set = get_players()[0] GetVisionSetNaked();
VisionSetNaked("int_frontend_char_trans", FADE_IN);
break;
}
case "whitehud":
{
fade_hud.x = 0;
fade_hud.y = 0;
fade_hud.horzAlign = "fullscreen";
fade_hud.vertAlign = "fullscreen";
fade_hud.foreground = false;
fade_hud.sort = 0;
fade_hud.alpha = 0;
fade_hud SetShader("white", 640, 480);
fade_hud FadeOverTime(FADE_IN);
fade_hud.alpha = 1;
break;
}
case "black":
{
fade_hud.x = 0;
fade_hud.y = 0;
fade_hud.horzAlign = "fullscreen";
fade_hud.vertAlign = "fullscreen";
fade_hud.foreground = false;
fade_hud.sort = 0;
fade_hud.alpha = 0;
fade_hud SetShader("black", 640, 480);
fade_hud FadeOverTime(FADE_IN);
fade_hud.alpha = 1;
break;
}
}
wait FADE_IN;
fade_hud Destroy();
}
return current_vision_set;
}
movie_fade_out(movie_name, vision_set, fullscreen_trans)
{
level endon("stop_movie");
if (fullscreen_trans != "none")
{
fade_hud = NewHudElem();
PlaySoundAtPosition(movie_name+"_fade_out",(0,0,0));
FADE_OUT = .5;
if (IsDefined(level.movie_fade_out_time))
{
FADE_OUT = level.movie_fade_out_time;
}
switch (fullscreen_trans)
{
case "white":
{
current_vision_set = get_players()[0] GetVisionSetNaked();
if (current_vision_set != "int_frontend_char_trans")
{
vision_set = current_vision_set;
}
VisionSetNaked("int_frontend_char_trans", 0);
wait .1;
VisionSetNaked(vision_set, FADE_OUT);
break;
}
case "whitehud":
{
fade_hud.x = 0;
fade_hud.y = 0;
fade_hud.horzAlign = "fullscreen";
fade_hud.vertAlign = "fullscreen";
fade_hud.foreground = false;
fade_hud.sort = 0;
fade_hud.alpha = 1;
fade_hud SetShader("white", 640, 480);
fade_hud FadeOverTime(FADE_OUT);
fade_hud.alpha = 0;
break;
}
case "black":
{
fade_hud.x = 0;
fade_hud.y = 0;
fade_hud.horzAlign = "fullscreen";
fade_hud.vertAlign = "fullscreen";
fade_hud.foreground = false;
fade_hud.sort = 0;
fade_hud.alpha = 1;
fade_hud SetShader("black", 640, 480);
fade_hud FadeOverTime(FADE_OUT);
fade_hud.alpha = 0;
current_vision_set = get_players()[0] GetVisionSetNaked();
if (current_vision_set == "int_frontend_char_trans")
{
VisionSetNaked(vision_set, 0);
}
break;
}
}
wait FADE_OUT;
fade_hud Destroy();
}
}
waittill_movie_done(notify_when_done, notify_offset, is_looping)
{
level endon("stop_movie");
cutoff_time = 0.2;
if ( is_true(is_looping))
{
level waittill ("stop_movie");
}
timeleft = GetCinematicTimeRemaining();
PrintLn(timeleft);
counter = 0;
while ( (timeleft < 0.05) && counter < 100 )
{
wait 0.05;
counter++;
timeleft = GetCinematicTimeRemaining();
PrintLn(timeleft);
}
oldtimeleft = GetCinematicTimeRemaining();
AssertEx(counter < 100, "Error: Bink movie never started playing even 5 seconds after calling waittill_movie_done");
if ((counter >= 100) && IsDefined(notify_when_done))
{
level notify(notify_when_done);
}
while (timeleft >= cutoff_time)
{
if (IsDefined(notify_when_done) && (timeleft <= notify_offset))
{
level notify(notify_when_done);
}
wait 0.05;
timeleft = GetCinematicTimeRemaining();
PrintLn(timeleft);
if (timeleft < oldtimeleft )
{
oldtimeleft = timeleft;
}
else
{
timeleft -= 0.05;
}
}
if (IsDefined(notify_when_done))
{
level notify(notify_when_done);
}
}
wont_disable_player_firing()
{
if(!IsDefined(self))
{
return;
}
self.NoFriendlyfire = true;
self.ignoreforfriendlyfire = 1;
}
allow_divetoprone( allowed )
{
if( !IsDefined( allowed ) )
{
return;
}
SetDvar( "dtp", allowed );
}
waittill_player_shoots(weapon_type, ender)
{
if(IsDefined(ender))
{
self endon (ender);
}
if(!IsDefined (weapon_type))
{
weapon_type = "any";
}
while(1)
{
self waittill ("weapon_fired");
gun = self GetCurrentWeapon();
if(weapon_type == "any")
{
return gun;
}
else if(weapon_type =="silenced")
{
if( IsSubStr(gun, "silencer"))
{
return gun;
}
}
else
{
if( !IsSubStr(gun, "silencer"))
{
return gun;
}
}
continue;
}
}