scriptPrintln(channel, msg) { setprintchannel(channel); println(msg); setprintchannel ("script"); } debugPrintln(channel, msg) { setprintchannel("script_debug"); println(msg); setprintchannel ("script"); } draw_debug_line(start, end, timer) { for (i=0;i 360) newangle -=360; while (newangle < 0) newangle +=360; while (oldangle > 360) oldangle -=360; while (oldangle < 0) oldangle +=360; olddif = undefined; newdif = undefined; if (newangle > 180) newdif = 360 - newangle; else newdif = newangle; if (oldangle > 180) olddif = 360 - oldangle; else olddif = oldangle; outerdif = newdif + olddif; innerdif = 0; if (newangle > oldangle) innerdif = newangle - oldangle; else innerdif = oldangle - newangle; if (innerdif < outerdif) return innerdif; else return outerdif; } vectorScale( vector, scale ) { vector = (vector[0] * scale, vector[1] * scale, vector[2] * scale); return vector; } sign( x ) { if ( x >= 0 ) return 1; return -1; } track(spot_to_track) { if (isdefined(self.current_target)) { if (spot_to_track == self.current_target) return; } self.current_target = spot_to_track; } get_enemy_team( team ) { assertEx( team != "neutral", "Team must be allies or axis" ); teams = []; teams["axis"] = "allies"; teams["allies"] = "axis"; return teams[team]; } clear_exception( type ) { assert( isdefined( self.exception[ type ] ) ); self.exception[ type ] = anim.defaultException; } set_exception( type, func ) { assert( isdefined( self.exception[ type ] ) ); self.exception[ type ] = func; } set_all_exceptions( exceptionFunc ) { keys = getArrayKeys( self.exception ); for ( i=0; i < keys.size; i++ ) { self.exception[ keys[ i ] ] = exceptionFunc; } } set_flash_duration(time_in_seconds) { self.flashduration = time_in_seconds * 1000; } cointoss() { return randomint( 100 ) >= 50 ; } waittill_string( msg, ent ) { if ( msg != "death" ) self endon ("death"); ent endon ( "die" ); self waittill ( msg ); ent notify ( "returned", msg ); } waittill_multiple( string1, string2, string3, string4, string5 ) { self endon ("death"); ent = spawnstruct(); ent.threads = 0; if (isdefined (string1)) { self thread waittill_string (string1, ent); ent.threads++; } if (isdefined (string2)) { self thread waittill_string (string2, ent); ent.threads++; } if (isdefined (string3)) { self thread waittill_string (string3, ent); ent.threads++; } if (isdefined (string4)) { self thread waittill_string (string4, ent); ent.threads++; } if (isdefined (string5)) { self thread waittill_string (string5, ent); ent.threads++; } while (ent.threads) { ent waittill ("returned"); ent.threads--; } ent notify ("die"); } waittill_multiple_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4 ) { self endon ("death"); ent = spawnstruct(); ent.threads = 0; if ( isdefined( ent1 ) ) { assert( isdefined( string1 ) ); ent1 thread waittill_string( string1, ent ); ent.threads++; } if ( isdefined( ent2 ) ) { assert( isdefined( string2 ) ); ent2 thread waittill_string ( string2, ent ); ent.threads++; } if ( isdefined( ent3 ) ) { assert( isdefined( string3 ) ); ent3 thread waittill_string ( string3, ent ); ent.threads++; } if ( isdefined( ent4 ) ) { assert( isdefined( string4 ) ); ent4 thread waittill_string ( string4, ent ); ent.threads++; } while (ent.threads) { ent waittill ("returned"); ent.threads--; } ent notify ("die"); } waittill_any_return( string1, string2, string3, string4, string5 ) { if ((!isdefined (string1) || string1 != "death") && (!isdefined (string2) || string2 != "death") && (!isdefined (string3) || string3 != "death") && (!isdefined (string4) || string4 != "death") && (!isdefined (string5) || string5 != "death")) self endon ("death"); ent = spawnstruct(); if (isdefined (string1)) self thread waittill_string (string1, ent); if (isdefined (string2)) self thread waittill_string (string2, ent); if (isdefined (string3)) self thread waittill_string (string3, ent); if (isdefined (string4)) self thread waittill_string (string4, ent); if (isdefined (string5)) self thread waittill_string (string5, ent); ent waittill ("returned", msg); ent notify ("die"); return msg; } waittill_any( string1, string2, string3, string4, string5 ) { assert( isdefined( 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 ); self waittill( string1 ); } waittill_any_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4, ent5, string5, ent6, string6, ent7, string7 ) { assert( isdefined( ent1 ) ); assert( isdefined( string1 ) ); if ( ( isdefined( ent2 ) ) && ( isdefined( string2 ) ) ) ent2 endon( string2 ); if ( ( isdefined( ent3 ) ) && ( isdefined( string3 ) ) ) ent3 endon( string3 ); if ( ( isdefined( ent4 ) ) && ( isdefined( string4 ) ) ) ent4 endon( string4 ); if ( ( isdefined( ent5 ) ) && ( isdefined( string5 ) ) ) ent5 endon( string5 ); if ( ( isdefined( ent6 ) ) && ( isdefined( string6 ) ) ) ent6 endon( string6 ); if ( ( isdefined( ent7 ) ) && ( isdefined( string7 ) ) ) ent7 endon( string7 ); ent1 waittill( string1 ); } /* ============= ///ScriptDocBegin "Name: isFlashed()" "Summary: Returns true if the player or an AI is flashed" "Module: Utility" "CallOn: An AI" "Example: flashed = level.price isflashed();" "SPMP: singleplayer" ///ScriptDocEnd ============= */ isFlashed() { if ( !isdefined( self.flashEndTime ) ) return false; return gettime() < self.flashEndTime; } /* ============= ///ScriptDocBegin "Name: flag( )" "Summary: Checks if the flag is set. Returns true or false." "Module: Flag" "CallOn: " "MandatoryArg: : name of the flag to check" "Example: flag( "hq_cleared" );" "SPMP: both" ///ScriptDocEnd ============= */ flag( message ) { assertEx( isdefined( message ), "Tried to check flag but the flag was not defined." ); assertEx( isdefined( level.flag[ message ] ), "Tried to check flag " + message + " but the flag was not initialized." ); if ( !level.flag[ message ] ) return false; return true; } /* ============= ///ScriptDocBegin "Name: flag_init( )" "Summary: Initialize a flag to be used. All flags must be initialized before using flag_set or flag_wait" "Module: Flag" "CallOn: " "MandatoryArg: : name of the flag to create" "Example: flag_init( "hq_cleared" );" "SPMP: singleplayer" ///ScriptDocEnd ============= */ flag_init( message ) { if ( !isDefined( level.flag ) ) { level.flag = []; level.flags_lock = []; if ( !isdefined( level.sp_stat_tracking_func ) ) level.sp_stat_tracking_func = ::empty_init_func; } if ( !isdefined( level.first_frame ) ) assertEx( !isDefined( level.flag[ message ] ), "Attempt to reinitialize existing message: " + message ); level.flag[ message ] = false; /# level.flags_lock[ message ] = false; #/ if ( !isdefined( level.trigger_flags ) ) { init_trigger_flags(); level.trigger_flags[ message ] = []; } else if ( !isdefined( level.trigger_flags[ message ] ) ) { level.trigger_flags[ message ] = []; } if ( issuffix( message, "aa_" ) ) { thread [[ level.sp_stat_tracking_func ]]( message ); } } empty_init_func( empty ) { } issuffix( msg, suffix ) { if ( suffix.size > msg.size ) return false; for ( i = 0; i < suffix.size; i++ ) { if ( msg[ i ] != suffix[ i ] ) return false; } return true; } /* ============= ///ScriptDocBegin "Name: flag_set( )" "Summary: Sets the specified flag, all scripts using flag_wait will now continue." "Module: Flag" "CallOn: " "MandatoryArg: : name of the flag to set" "Example: flag_set( "hq_cleared" );" "SPMP: both" ///ScriptDocEnd ============= */ flag_set( message ) { /# assertEx( isDefined( level.flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message ); assert( level.flag[ message ] == level.flags_lock[ message ] ); level.flags_lock[ message ] = true; #/ level.flag[ message ] = true; level notify( message ); set_trigger_flag_permissions( message ); } /* ============= ///ScriptDocBegin "Name: flag_wait( )" "Summary: Waits until the specified flag is set." "Module: Flag" "CallOn: " "MandatoryArg: : name of the flag to wait on" "Example: flag_wait( "hq_cleared" );" "SPMP: both" ///ScriptDocEnd ============= */ flag_wait( msg ) { while( !level.flag[ msg ] ) level waittill( msg ); } /* ============= ///ScriptDocBegin "Name: flag_clear( )" "Summary: Clears the specified flag." "Module: Flag" "CallOn: " "MandatoryArg: : name of the flag to clear" "Example: flag_clear( "hq_cleared" );" "SPMP: both" ///ScriptDocEnd ============= */ flag_clear( message ) { /# assertEx( isDefined( level.flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message ); assert( level.flag[ message ] == level.flags_lock[ message ] ); level.flags_lock[ message ] = false; #/ //do this check so we don't unneccessarily send a notify if ( level.flag[ message ] ) { level.flag[ message ] = false; level notify( message ); set_trigger_flag_permissions( message ); } } /* ============= ///ScriptDocBegin "Name: flag_waitopen( )" "Summary: Waits for the flag to open" "Module: Flag" "MandatoryArg: : The flag" "Example: flag_waitopen( "get_me_bagels" );" "SPMP: singleplayer" ///ScriptDocEnd ============= */ flag_waitopen( msg ) { while( level.flag[ msg ] ) level waittill( msg ); } script_gen_dump_addline( string, signature ) { if ( !isdefined( string ) ) string = "nowrite";// some things like the standardized CSV sound entries don't really need anything in script. just the asset if ( !isdefined( level._loadstarted ) ) { // stashes commands away so they can be handled in the correct place within load if ( !isdefined( level.script_gen_dump_preload ) ) level.script_gen_dump_preload = []; struct = spawnstruct(); struct.string = string; struct.signature = signature; level.script_gen_dump_preload[ level.script_gen_dump_preload.size ] = struct; return; } if ( !isdefined( level.script_gen_dump[ signature ] ) ) level.script_gen_dump_reasons[ level.script_gen_dump_reasons.size ] = "Added: " + string;// console print as well as triggering the dump level.script_gen_dump[ signature ] = string; level.script_gen_dump2[ signature ] = string;// second array gets compared later with saved array. When something is missing dump is generated } /* ============= ///ScriptDocBegin "Name: array_thread( , , , , )" "Summary: Threads the < process > function on every entity in the < entities > array. The entity will become "self" in the specified function." "Module: Array" "CallOn: " "MandatoryArg: : array of entities to thread the process" "MandatoryArg: : pointer to a script function" "OptionalArg: : parameter 1 to pass to the process" "OptionalArg: : parameter 2 to pass to the process" "OptionalArg: : parameter 3 to pass to the process" "Example: array_thread( getaiarray( "allies" ), ::set_ignoreme, false );" "SPMP: both" ///ScriptDocEnd ============= */ 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 ); return; } if ( isdefined( var2 ) ) { for( i = 0 ; i < keys.size ; i ++ ) entities[ keys[ i ] ] thread [[ process ]]( var1, var2 ); return; } if ( isdefined( var1 ) ) { for( i = 0 ; i < keys.size ; i ++ ) entities[ keys[ i ] ] thread [[ process ]]( var1 ); return; } for( i = 0 ; i < keys.size ; i ++ ) entities[ keys[ i ] ] thread [[ process ]](); } array_thread4( entities, process, var1, var2, var3, var4 ) { keys = getArrayKeys( entities ); for( i = 0 ; i < keys.size ; i ++ ) entities[ keys[ i ] ] thread [[ process ]]( var1, var2, var3, var4 ); } array_thread5( entities, process, var1, var2, var3, var4, var5 ) { keys = getArrayKeys( entities ); for( i = 0 ; i < keys.size ; i ++ ) entities[ keys[ i ] ] thread [[ process ]]( var1, var2, var3, var4, var5 ); } remove_undefined_from_array( array ) { newarray = []; for( i = 0; i < array.size; i ++ ) { if ( !isdefined( array[ i ] ) ) continue; newarray[ newarray.size ] = array[ i ]; } return newarray; } /* ============= ///ScriptDocBegin "Name: trigger_on( , )" "Summary: Turns a trigger on. This only needs to be called if it was previously turned off" "Module: Trigger" "CallOn: A trigger" "OptionalArg: : the name corrisponding to a targetname or script_noteworthy to grab the trigger internally" "OptionalArg: : the type( targetname, or script_noteworthy ) corrisponding to a name to grab the trigger internally" "Example: trigger trigger_on(); -or- trigger_on( "base_trigger", "targetname" )" "SPMP: both" ///ScriptDocEnd ============= */ trigger_on( name, type ) { if ( isdefined ( name ) && isdefined( type ) ) { ents = getentarray( name, type ); array_thread( ents, ::trigger_on_proc ); } else self trigger_on_proc(); } trigger_on_proc() { if ( isDefined( self.realOrigin ) ) self.origin = self.realOrigin; self.trigger_off = undefined; } /* ============= ///ScriptDocBegin "Name: trigger_off( , )" "Summary: Turns a trigger off so it can no longer be triggered." "Module: Trigger" "CallOn: A trigger" "OptionalArg: : the name corrisponding to a targetname or script_noteworthy to grab the trigger internally" "OptionalArg: : the type( targetname, or script_noteworthy ) corrisponding to a name to grab the trigger internally" "Example: trigger trigger_off();" "SPMP: both" ///ScriptDocEnd ============= */ trigger_off( name, type ) { if ( isdefined ( name ) && isdefined( type ) ) { ents = getentarray( name, type ); array_thread( ents, ::trigger_off_proc ); } else self trigger_off_proc(); } trigger_off_proc() { if ( !isDefined( self.realOrigin ) ) self.realOrigin = self.origin; if ( self.origin == self.realorigin ) self.origin += ( 0, 0, -10000 ); self.trigger_off = true; } set_trigger_flag_permissions( msg ) { // turns triggers on or off depending on if they have the proper flags set, based on their shift-g menu settings // this can be init before _load has run, thanks to AI. if ( !isdefined( level.trigger_flags ) ) return; // cheaper to do the upkeep at this time rather than with endons and waittills on the individual triggers level.trigger_flags[ msg ] = remove_undefined_from_array( level.trigger_flags[ msg ] ); array_thread( level.trigger_flags[ msg ], ::update_trigger_based_on_flags ); } update_trigger_based_on_flags() { true_on = true; if ( isdefined( self.script_flag_true ) ) { true_on = false; tokens = create_flags_and_return_tokens( self.script_flag_true ); // stay off unless all the flags are false for( i=0; i < tokens.size; i++ ) { if ( flag( tokens[ i ] ) ) { true_on = true; break; } } } false_on = true; if ( isdefined( self.script_flag_false ) ) { tokens = create_flags_and_return_tokens( self.script_flag_false ); // stay off unless all the flags are false for( i=0; i < tokens.size; i++ ) { if ( flag( tokens[ i ] ) ) { false_on = false; break; } } } [ [ level.trigger_func[ true_on && false_on ] ] ](); } create_flags_and_return_tokens( flags ) { tokens = strtok( flags, " " ); // create the flag if level script does not for( i=0; i < tokens.size; i++ ) { if ( !isdefined( level.flag[ tokens[ i ] ] ) ) { flag_init( tokens[ i ] ); } } return tokens; } init_trigger_flags() { level.trigger_flags = []; level.trigger_func[ true ] = ::trigger_on; level.trigger_func[ false ] = ::trigger_off; } /* ============= ///ScriptDocBegin "Name: getstructarray( , : " "MandatoryArg: : " "Example: fxemitters = getstructarray( "streetlights", "targetname" )" "SPMP: both" ///ScriptDocEnd ============= */ getstructarray( name, type ) { assertEx( isdefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); array = level.struct_class_names[ type ][ name ]; if ( !isdefined( array ) ) return []; return array; } struct_class_init() { assertEx( !isdefined( level.struct_class_names ), "level.struct_class_names is being initialized in the wrong place! It shouldn't be initialized yet." ); level.struct_class_names = []; level.struct_class_names[ "target" ] = []; level.struct_class_names[ "targetname" ] = []; level.struct_class_names[ "script_noteworthy" ] = []; level.struct_class_names[ "script_linkname" ] = []; for ( i=0; i < level.struct.size; i++ ) { if ( isdefined( level.struct[ i ].targetname ) ) { if ( !isdefined( level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ] ) ) level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ] = []; size = level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ].size; level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ][ size ] = level.struct[ i ]; } if ( isdefined( level.struct[ i ].target ) ) { if ( !isdefined( level.struct_class_names[ "target" ][ level.struct[ i ].target ] ) ) level.struct_class_names[ "target" ][ level.struct[ i ].target ] = []; size = level.struct_class_names[ "target" ][ level.struct[ i ].target ].size; level.struct_class_names[ "target" ][ level.struct[ i ].target ][ size ] = level.struct[ i ]; } if ( isdefined( level.struct[ i ].script_noteworthy ) ) { if ( !isdefined( level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ] ) ) level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ] = []; size = level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ].size; level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ][ size ] = level.struct[ i ]; } if ( isdefined( level.struct[ i ].script_linkname ) ) { assertex( !isdefined( level.struct_class_names[ "script_linkname" ][ level.struct[ i ].script_linkname ] ), "Two structs have the same linkname" ); level.struct_class_names[ "script_linkname" ][ level.struct[ i ].script_linkname ][ 0 ] = level.struct[ i ]; } } } fileprint_start( file ) { /# filename = file; //hackery here, sometimes the file just doesn't open so keep trying // file = -1; // while( file == -1 ) // { file = openfile( filename, "write" ); // if (file == -1) // wait .05; // try every frame untill the file becomes writeable // } level.fileprint = file; level.fileprintlinecount = 0; level.fileprint_filename = filename; #/ } /* ============= ///ScriptDocBegin "Name: fileprint_map_start( )" "Summary: starts map export with the file trees\cod3\cod3\map_source\xenon_export\ < filename > .map adds header / worldspawn entity to the map. Use this if you want to start a .map export." "Module: Fileprint" "CallOn: Level" "MandatoryArg: : " "OptionalArg: : " "Example: fileprint_map_start( filename );" "SPMP: singleplayer" ///ScriptDocEnd ============= */ fileprint_map_start( file ) { /# file = "map_source/" + file + ".map"; fileprint_start( file ); // for the entity count level.fileprint_mapentcount = 0; fileprint_map_header( true ); #/ } fileprint_chk( file , str ) { /# //dodging infinite loops for file dumping. kind of dangerous level.fileprintlinecount++; if (level.fileprintlinecount>400) { wait .05; level.fileprintlinecount++; level.fileprintlinecount = 0; } fprintln( file, str ); #/ } fileprint_map_header( bInclude_blank_worldspawn ) { if ( !isdefined( bInclude_blank_worldspawn ) ) bInclude_blank_worldspawn = false; // this may need to be updated if map format changes assert( isdefined( level.fileprint ) ); /# fileprint_chk( level.fileprint, "iwmap 4" ); fileprint_chk( level.fileprint, "\"000_Global\" flags active" ); fileprint_chk( level.fileprint, "\"The Map\" flags" ); if ( !bInclude_blank_worldspawn ) return; fileprint_map_entity_start(); fileprint_map_keypairprint( "classname", "worldspawn" ); fileprint_map_entity_end(); #/ } /* ============= ///ScriptDocBegin "Name: fileprint_map_keypairprint( , )" "Summary: prints a pair of keys to the current open map( by fileprint_map_start() )" "Module: Fileprint" "CallOn: Level" "MandatoryArg: : " "MandatoryArg: : " "Example: fileprint_map_keypairprint( "classname", "script_model" );" "SPMP: singleplayer" ///ScriptDocEnd ============= */ fileprint_map_keypairprint( key1, key2 ) { /# assert( isdefined( level.fileprint ) ); fileprint_chk( level.fileprint, "\"" + key1 + "\" \"" + key2 + "\"" ); #/ } /* ============= ///ScriptDocBegin "Name: fileprint_map_entity_start()" "Summary: prints entity number and opening bracket to currently opened file" "Module: Fileprint" "CallOn: Level" "Example: fileprint_map_entity_start();" "SPMP: singleplayer" ///ScriptDocEnd ============= */ fileprint_map_entity_start() { /# assert( !isdefined( level.fileprint_entitystart ) ); level.fileprint_entitystart = true; assert( isdefined( level.fileprint ) ); fileprint_chk( level.fileprint, "// entity " + level.fileprint_mapentcount ); fileprint_chk( level.fileprint, "{" ); level.fileprint_mapentcount ++ ; #/ } /* ============= ///ScriptDocBegin "Name: fileprint_map_entity_end()" "Summary: close brackets an entity, required for the next entity to begin" "Module: Fileprint" "CallOn: Level" "Example: fileprint_map_entity_end();" "SPMP: singleplayer" ///ScriptDocEnd ============= */ fileprint_map_entity_end() { /# assert( isdefined( level.fileprint_entitystart ) ); assert( isdefined( level.fileprint ) ); level.fileprint_entitystart = undefined; fileprint_chk( level.fileprint, "}" ); #/ } /* ============= ///ScriptDocBegin "Name: fileprint_end()" "Summary: saves the currently opened file" "Module: Fileprint" "CallOn: Level" "Example: fileprint_end();" "SPMP: singleplayer" ///ScriptDocEnd ============= */ fileprint_end() { /# assert( !isdefined( level.fileprint_entitystart ) ); saved = closefile( level.fileprint ); if (saved != 1) { println("-----------------------------------"); println(" "); println("file write failure"); println("file with name: "+level.fileprint_filename); println("make sure you checkout the file you are trying to save"); println("note: USE P4 Search to find the file and check that one out"); println(" Do not checkin files in from the xenonoutput folder, "); println(" this is junctioned to the proper directory where you need to go"); println("junctions looks like this"); println(" "); println("..\\xenonOutput\\scriptdata\\createfx ..\\share\\raw\\maps\\createfx"); println("..\\xenonOutput\\scriptdata\\createart ..\\share\\raw\\maps\\createart"); println("..\\xenonOutput\\scriptdata\\vision ..\\share\\raw\\vision"); println("..\\xenonOutput\\scriptdata\\scriptgen ..\\share\\raw\\maps\\scriptgen"); println("..\\xenonOutput\\scriptdata\\zone_source ..\\xenon\\zone_source"); println("..\\xenonOutput\\accuracy ..\\share\\raw\\accuracy"); println("..\\xenonOutput\\scriptdata\\map_source ..\\map_source\\xenon_export"); println(" "); println("-----------------------------------"); println( "File not saved( see console.log for info ) " ); } level.fileprint = undefined; level.fileprint_filename = undefined; #/ } /* ============= ///ScriptDocBegin "Name: fileprint_radiant_vec( )" "Summary: this converts a vector to a .map file readable format" "Module: Fileprint" "CallOn: An entity" "MandatoryArg: : " "Example: origin_string = fileprint_radiant_vec( vehicle.angles )" "SPMP: singleplayer" ///ScriptDocEnd ============= */ fileprint_radiant_vec( vector ) { /# string = "" + vector[ 0 ] + " " + vector[ 1 ] + " " + vector[ 2 ] + ""; return string; #/ }