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