#include maps/mp/_utility; #include maps/mp/_createfx; #include maps/mp/gametypes/_hud_util; #include common_scripts/utility; addcallback( event, func ) { /# assert( isDefined( event ), "Trying to set a callback on an undefined event." ); #/ if ( !isDefined( level._callbacks ) || !isDefined( level._callbacks[ event ] ) ) { level._callbacks[ event ] = []; } level._callbacks[ event ] = add_to_array( level._callbacks[ event ], func, 0 ); } callback( event ) { while ( isDefined( level._callbacks ) && isDefined( level._callbacks[ event ] ) ) { i = 0; while ( i < level._callbacks[ event ].size ) { callback = level._callbacks[ event ][ i ]; if ( isDefined( callback ) ) { self thread [[ callback ]](); } i++; } } } onfinalizeinitialization_callback( func ) { addcallback( "on_finalize_initialization", func ); } triggeroff() { if ( !isDefined( self.realorigin ) ) { self.realorigin = self.origin; } if ( self.origin == self.realorigin ) { self.origin += vectorScale( ( 0, 0, 1 ), 10000 ); } } triggeron() { if ( isDefined( self.realorigin ) ) { self.origin = self.realorigin; } } error( msg ) { /# println( "^c*ERROR* ", msg ); wait 0,05; if ( getDvar( "debug" ) != "1" ) { assertmsg( "This is a forced error - attach the log file" ); #/ } } warning( msg ) { /# println( "^1WARNING: " + msg ); #/ } spawn_array_struct() { s = spawnstruct(); s.a = []; return s; } 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; } append_array_struct( dst_s, src_s ) { i = 0; while ( i < src_s.a.size ) { dst_s.a[ dst_s.a.size ] = src_s.a[ i ]; i++; } } exploder( num ) { [[ level.exploderfunction ]]( num ); } exploder_stop( num ) { stop_exploder( num ); } exploder_sound() { if ( isDefined( self.script_delay ) ) { wait self.script_delay; } self playsound( level.scr_sound[ self.script_sound ] ); } cannon_effect() { if ( isDefined( self.v[ "repeat" ] ) ) { i = 0; while ( i < self.v[ "repeat" ] ) { playfx( level._effect[ self.v[ "fxid" ] ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); self exploder_delay(); i++; } return; } self exploder_delay(); if ( isDefined( self.looper ) ) { self.looper delete(); } self.looper = spawnfx( getfx( self.v[ "fxid" ] ), self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); triggerfx( self.looper ); exploder_playsound(); } exploder_delay() { if ( !isDefined( self.v[ "delay" ] ) ) { self.v[ "delay" ] = 0; } min_delay = self.v[ "delay" ]; max_delay = self.v[ "delay" ] + 0,001; if ( isDefined( self.v[ "delay_min" ] ) ) { min_delay = self.v[ "delay_min" ]; } if ( isDefined( self.v[ "delay_max" ] ) ) { max_delay = self.v[ "delay_max" ]; } if ( min_delay > 0 ) { wait randomfloatrange( min_delay, max_delay ); } } exploder_playsound() { if ( !isDefined( self.v[ "soundalias" ] ) || self.v[ "soundalias" ] == "nil" ) { return; } play_sound_in_space( self.v[ "soundalias" ], self.v[ "origin" ] ); } brush_delete() { num = self.v[ "exploder" ]; if ( isDefined( self.v[ "delay" ] ) ) { wait self.v[ "delay" ]; } else { wait 0,05; } if ( !isDefined( self.model ) ) { return; } /# assert( isDefined( self.model ) ); #/ if ( level.createfx_enabled ) { if ( isDefined( self.exploded ) ) { return; } self.exploded = 1; 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" ) { } 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 ( level.createfx_enabled ) { if ( isDefined( self.exploded ) ) { return; } self.exploded = 1; 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 ) ) { 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 ]; 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 = 1; wait 3; self.exploded = undefined; self.v[ "origin" ] = startorg; self.v[ "angles" ] = startang; self.model hide(); return; } wait 6; self.model delete(); } getplant() { start = self.origin + vectorScale( ( 0, 0, 1 ), 10 ); range = 11; forward = anglesToForward( self.angles ); forward = vectorScale( forward, range ); traceorigins[ 0 ] = start + forward; traceorigins[ 1 ] = start; trace = bullettrace( traceorigins[ 0 ], traceorigins[ 0 ] + vectorScale( ( 0, 0, 1 ), 18 ), 0, undefined ); if ( trace[ "fraction" ] < 1 ) { temp = spawnstruct(); temp.origin = trace[ "position" ]; temp.angles = orienttonormal( trace[ "normal" ] ); return temp; } trace = bullettrace( traceorigins[ 1 ], traceorigins[ 1 ] + vectorScale( ( 0, 0, 1 ), 18 ), 0, undefined ); if ( trace[ "fraction" ] < 1 ) { temp = spawnstruct(); temp.origin = trace[ "position" ]; temp.angles = orienttonormal( trace[ "normal" ] ); return temp; } traceorigins[ 2 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); traceorigins[ 3 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); traceorigins[ 4 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); traceorigins[ 5 ] = start + vectorScale( ( 0, 0, 1 ), 16 ); besttracefraction = undefined; besttraceposition = undefined; i = 0; while ( i < traceorigins.size ) { trace = bullettrace( traceorigins[ i ], traceorigins[ i ] + vectorScale( ( 0, 0, 1 ), 1000 ), 0, undefined ); if ( !isDefined( besttracefraction ) || trace[ "fraction" ] < besttracefraction ) { besttracefraction = trace[ "fraction" ]; besttraceposition = trace[ "position" ]; } i++; } if ( besttracefraction == 1 ) { besttraceposition = self.origin; } temp = spawnstruct(); temp.origin = besttraceposition; temp.angles = orienttonormal( trace[ "normal" ] ); return temp; } orienttonormal( normal ) { hor_normal = ( normal[ 0 ], normal[ 1 ], 0 ); hor_length = length( hor_normal ); if ( !hor_length ) { return ( 0, 0, 1 ); } hor_dir = vectornormalize( hor_normal ); neg_height = normal[ 2 ] * -1; tangent = ( hor_dir[ 0 ] * neg_height, hor_dir[ 1 ] * neg_height, hor_length ); plant_angle = vectorToAngle( tangent ); return plant_angle; } array_levelthread( ents, process, var, excluders ) { exclude = []; i = 0; while ( i < ents.size ) { exclude[ i ] = 0; i++; } while ( isDefined( excluders ) ) { i = 0; while ( i < ents.size ) { p = 0; while ( p < excluders.size ) { if ( ents[ i ] == excluders[ p ] ) { exclude[ i ] = 1; } p++; } i++; } } i = 0; while ( i < ents.size ) { if ( !exclude[ i ] ) { if ( isDefined( var ) ) { level thread [[ process ]]( ents[ i ], var ); i++; continue; } else { level thread [[ process ]]( ents[ i ] ); } } i++; } } deleteplacedentity( entity ) { entities = getentarray( entity, "classname" ); i = 0; while ( i < entities.size ) { entities[ i ] delete(); i++; } } playsoundonplayers( sound, team ) { /# assert( isDefined( level.players ) ); #/ if ( level.splitscreen ) { if ( isDefined( level.players[ 0 ] ) ) { level.players[ 0 ] playlocalsound( sound ); } } else if ( isDefined( team ) ) { i = 0; while ( i < level.players.size ) { player = level.players[ i ]; if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) { player playlocalsound( sound ); } i++; } } else i = 0; while ( i < level.players.size ) { level.players[ i ] playlocalsound( sound ); i++; } } get_player_height() { return 70; } isbulletimpactmod( smeansofdeath ) { if ( !issubstr( smeansofdeath, "BULLET" ) ) { return smeansofdeath == "MOD_HEAD_SHOT"; } } get_team_alive_players_s( teamname ) { teamplayers_s = spawn_array_struct(); while ( isDefined( teamname ) && isDefined( level.aliveplayers ) && isDefined( level.aliveplayers[ teamname ] ) ) { i = 0; while ( i < level.aliveplayers[ teamname ].size ) { teamplayers_s.a[ teamplayers_s.a.size ] = level.aliveplayers[ teamname ][ i ]; i++; } } return teamplayers_s; } get_all_alive_players_s() { allplayers_s = spawn_array_struct(); while ( isDefined( level.aliveplayers ) ) { keys = getarraykeys( level.aliveplayers ); i = 0; while ( i < keys.size ) { team = keys[ i ]; j = 0; while ( j < level.aliveplayers[ team ].size ) { allplayers_s.a[ allplayers_s.a.size ] = level.aliveplayers[ team ][ j ]; j++; } i++; } } return allplayers_s; } waitrespawnbutton() { self endon( "disconnect" ); self endon( "end_respawn" ); while ( self usebuttonpressed() != 1 ) { wait 0,05; } } setlowermessage( text, time, combinemessageandtimer ) { if ( !isDefined( self.lowermessage ) ) { return; } if ( isDefined( self.lowermessageoverride ) && text != &"" ) { text = self.lowermessageoverride; time = undefined; } self notify( "lower_message_set" ); self.lowermessage settext( text ); if ( isDefined( time ) && time > 0 ) { if ( !isDefined( combinemessageandtimer ) || !combinemessageandtimer ) { self.lowertimer.label = &""; } else { self.lowermessage settext( "" ); self.lowertimer.label = text; } self.lowertimer settimer( time ); } else { self.lowertimer settext( "" ); self.lowertimer.label = &""; } if ( self issplitscreen() ) { self.lowermessage.fontscale = 1,4; } self.lowermessage fadeovertime( 0,05 ); self.lowermessage.alpha = 1; self.lowertimer fadeovertime( 0,05 ); self.lowertimer.alpha = 1; } setlowermessagevalue( text, value, combinemessage ) { if ( !isDefined( self.lowermessage ) ) { return; } if ( isDefined( self.lowermessageoverride ) && text != &"" ) { text = self.lowermessageoverride; time = undefined; } self notify( "lower_message_set" ); if ( !isDefined( combinemessage ) || !combinemessage ) { self.lowermessage settext( text ); } else { self.lowermessage settext( "" ); } if ( isDefined( value ) && value > 0 ) { if ( !isDefined( combinemessage ) || !combinemessage ) { self.lowertimer.label = &""; } else { self.lowertimer.label = text; } self.lowertimer setvalue( value ); } else { self.lowertimer settext( "" ); self.lowertimer.label = &""; } if ( self issplitscreen() ) { self.lowermessage.fontscale = 1,4; } self.lowermessage fadeovertime( 0,05 ); self.lowermessage.alpha = 1; self.lowertimer fadeovertime( 0,05 ); self.lowertimer.alpha = 1; } clearlowermessage( fadetime ) { if ( !isDefined( self.lowermessage ) ) { return; } self notify( "lower_message_set" ); if ( !isDefined( fadetime ) || fadetime == 0 ) { setlowermessage( &"" ); } else { self endon( "disconnect" ); self endon( "lower_message_set" ); self.lowermessage fadeovertime( fadetime ); self.lowermessage.alpha = 0; self.lowertimer fadeovertime( fadetime ); self.lowertimer.alpha = 0; wait fadetime; self setlowermessage( "" ); } } printonteam( text, team ) { /# assert( isDefined( level.players ) ); #/ i = 0; while ( i < level.players.size ) { player = level.players[ i ]; if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) { player iprintln( text ); } i++; } } printboldonteam( text, team ) { /# assert( isDefined( level.players ) ); #/ i = 0; while ( i < level.players.size ) { player = level.players[ i ]; if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) { player iprintlnbold( text ); } i++; } } printboldonteamarg( text, team, arg ) { /# assert( isDefined( level.players ) ); #/ i = 0; while ( i < level.players.size ) { player = level.players[ i ]; if ( isDefined( player.pers[ "team" ] ) && player.pers[ "team" ] == team ) { player iprintlnbold( text, arg ); } i++; } } printonteamarg( text, team, arg ) { } printonplayers( text, team ) { players = level.players; i = 0; while ( i < players.size ) { if ( isDefined( team ) ) { if ( isDefined( players[ i ].pers[ "team" ] ) && players[ i ].pers[ "team" ] == team ) { players[ i ] iprintln( text ); } i++; continue; } else { players[ i ] iprintln( text ); } i++; } } printandsoundoneveryone( team, enemyteam, printfriendly, printenemy, soundfriendly, soundenemy, printarg ) { shoulddosounds = isDefined( soundfriendly ); shoulddoenemysounds = 0; if ( isDefined( soundenemy ) ) { /# assert( shoulddosounds ); #/ shoulddoenemysounds = 1; } if ( !isDefined( printarg ) ) { printarg = ""; } if ( level.splitscreen || !shoulddosounds ) { i = 0; while ( i < level.players.size ) { player = level.players[ i ]; playerteam = player.pers[ "team" ]; if ( isDefined( playerteam ) ) { if ( playerteam == team && isDefined( printfriendly ) && printfriendly != &"" ) { player iprintln( printfriendly, printarg ); i++; continue; } else { if ( isDefined( printenemy ) && printenemy != &"" ) { if ( isDefined( enemyteam ) && playerteam == enemyteam ) { player iprintln( printenemy, printarg ); i++; continue; } else { if ( !isDefined( enemyteam ) && playerteam != team ) { player iprintln( printenemy, printarg ); } } } } } i++; } if ( shoulddosounds ) { /# assert( level.splitscreen ); #/ level.players[ 0 ] playlocalsound( soundfriendly ); } } else { /# assert( shoulddosounds ); #/ if ( shoulddoenemysounds ) { i = 0; while ( i < level.players.size ) { player = level.players[ i ]; playerteam = player.pers[ "team" ]; if ( isDefined( playerteam ) ) { if ( playerteam == team ) { if ( isDefined( printfriendly ) && printfriendly != &"" ) { player iprintln( printfriendly, printarg ); } player playlocalsound( soundfriendly ); i++; continue; } else { if ( isDefined( enemyteam ) || playerteam == enemyteam && !isDefined( enemyteam ) && playerteam != team ) { if ( isDefined( printenemy ) && printenemy != &"" ) { player iprintln( printenemy, printarg ); } player playlocalsound( soundenemy ); } } } i++; } } else i = 0; while ( i < level.players.size ) { player = level.players[ i ]; playerteam = player.pers[ "team" ]; if ( isDefined( playerteam ) ) { if ( playerteam == team ) { if ( isDefined( printfriendly ) && printfriendly != &"" ) { player iprintln( printfriendly, printarg ); } player playlocalsound( soundfriendly ); i++; continue; } else if ( isDefined( printenemy ) && printenemy != &"" ) { if ( isDefined( enemyteam ) && playerteam == enemyteam ) { player iprintln( printenemy, printarg ); i++; continue; } else { if ( !isDefined( enemyteam ) && playerteam != team ) { player iprintln( printenemy, printarg ); } } } } i++; } } } _playlocalsound( soundalias ) { if ( level.splitscreen && !self ishost() ) { return; } self playlocalsound( soundalias ); } dvarintvalue( dvar, defval, minval, maxval ) { dvar = "scr_" + level.gametype + "_" + dvar; if ( getDvar( dvar ) == "" ) { setdvar( dvar, defval ); return defval; } value = getDvarInt( dvar ); if ( value > maxval ) { value = maxval; } else if ( value < minval ) { value = minval; } else { return value; } setdvar( dvar, value ); return value; } dvarfloatvalue( dvar, defval, minval, maxval ) { dvar = "scr_" + level.gametype + "_" + dvar; if ( getDvar( dvar ) == "" ) { setdvar( dvar, defval ); return defval; } value = getDvarFloat( dvar ); if ( value > maxval ) { value = maxval; } else if ( value < minval ) { value = minval; } else { return value; } setdvar( dvar, value ); return value; } play_sound_on_tag( alias, tag ) { if ( isDefined( tag ) ) { org = spawn( "script_origin", self gettagorigin( tag ) ); org linkto( self, tag, ( 0, 0, 1 ), ( 0, 0, 1 ) ); } else { org = spawn( "script_origin", ( 0, 0, 1 ) ); org.origin = self.origin; org.angles = self.angles; org linkto( self ); } org playsound( alias ); wait 5; org delete(); } createloopeffect( fxid ) { ent = maps/mp/_createfx::createeffect( "loopfx", fxid ); ent.v[ "delay" ] = 0,5; return ent; } createoneshoteffect( fxid ) { ent = maps/mp/_createfx::createeffect( "oneshotfx", fxid ); ent.v[ "delay" ] = -15; return ent; } loop_fx_sound( alias, origin, ender, timeout ) { org = spawn( "script_origin", ( 0, 0, 1 ) ); if ( isDefined( ender ) ) { thread loop_sound_delete( ender, org ); self endon( ender ); } org.origin = origin; org playloopsound( alias ); if ( !isDefined( timeout ) ) { return; } wait timeout; } 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; radiusdamage( origin, radius, damage, damage ); } exploder_before_load( num ) { waittillframeend; waittillframeend; activate_exploder( num ); } exploder_after_load( num ) { activate_exploder( num ); } 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" ] ]; } 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; } deactivateclientexploder( level._exploder_ids[ num ] ); } 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" ] ) ) { /# println( "Exploder " + self.v[ "exploder" ] + " created on 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[ "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(); } } trail_effect() { self exploder_delay(); if ( !isDefined( self.v[ "trailfxtag" ] ) ) { self.v[ "trailfxtag" ] = "tag_origin"; } temp_ent = undefined; if ( self.v[ "trailfxtag" ] == "tag_origin" ) { playfxontag( level._effect[ self.v[ "trailfx" ] ], self.model, self.v[ "trailfxtag" ] ); } else { temp_ent = spawn( "script_model", self.model.origin ); temp_ent setmodel( "tag_origin" ); temp_ent linkto( self.model, self.v[ "trailfxtag" ] ); playfxontag( level._effect[ self.v[ "trailfx" ] ], temp_ent, "tag_origin" ); } if ( isDefined( self.v[ "trailfxsound" ] ) ) { if ( !isDefined( temp_ent ) ) { self.model playloopsound( self.v[ "trailfxsound" ] ); } else { temp_ent playloopsound( self.v[ "trailfxsound" ] ); } } if ( isDefined( self.v[ "ender" ] ) && isDefined( temp_ent ) ) { level thread trail_effect_ender( temp_ent, self.v[ "ender" ] ); } if ( !isDefined( self.v[ "trailfxtimeout" ] ) ) { return; } wait self.v[ "trailfxtimeout" ]; if ( isDefined( temp_ent ) ) { temp_ent delete(); } } trail_effect_ender( ent, ender ) { ent endon( "death" ); self waittill( ender ); ent delete(); } activate_exploder( num ) { num = int( num ); /# if ( level.createfx_enabled ) { i = 0; while ( i < level.createfxent.size ) { ent = level.createfxent[ i ]; if ( !isDefined( ent ) ) { i++; continue; } else if ( ent.v[ "type" ] != "exploder" ) { i++; continue; } else if ( !isDefined( ent.v[ "exploder" ] ) ) { i++; continue; } else if ( ent.v[ "exploder" ] != num ) { i++; continue; } else { if ( isDefined( ent.v[ "exploder_server" ] ) ) { client_send = 0; } ent activate_individual_exploder(); } i++; } return; #/ } client_send = 1; while ( isDefined( level.createfxexploders[ num ] ) ) { i = 0; while ( i < level.createfxexploders[ num ].size ) { if ( client_send && isDefined( level.createfxexploders[ num ][ i ].v[ "exploder_server" ] ) ) { client_send = 0; } level.createfxexploders[ num ][ i ] activate_individual_exploder(); i++; } } if ( level.clientscripts ) { if ( !level.createfx_enabled && client_send == 1 ) { activate_exploder_on_clients( num ); } } } stop_exploder( num ) { num = int( num ); if ( level.clientscripts ) { if ( !level.createfx_enabled ) { delete_exploder_on_clients( num ); } } while ( isDefined( level.createfxexploders[ num ] ) ) { i = 0; while ( i < level.createfxexploders[ num ].size ) { if ( !isDefined( level.createfxexploders[ num ][ i ].looper ) ) { i++; continue; } else { level.createfxexploders[ num ][ i ].looper delete(); } i++; } } } sound_effect() { self effect_soundalias(); } effect_soundalias() { if ( !isDefined( self.v[ "delay" ] ) ) { self.v[ "delay" ] = 0; } origin = self.v[ "origin" ]; alias = self.v[ "soundalias" ]; wait self.v[ "delay" ]; play_sound_in_space( alias, origin ); } 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 ); } else { org playsound( alias ); } wait 10; org delete(); } loop_sound_in_space( alias, origin, ender ) { org = spawn( "script_origin", ( 0, 0, 1 ) ); if ( !isDefined( origin ) ) { origin = self.origin; } org.origin = origin; org playloopsound( alias ); level waittill( ender ); org stoploopsound(); wait 0,1; org delete(); } fire_effect() { if ( !isDefined( self.v[ "delay" ] ) ) { self.v[ "delay" ] = 0; } delay = self.v[ "delay" ]; if ( isDefined( self.v[ "delay_min" ] ) && isDefined( self.v[ "delay_max" ] ) ) { delay = self.v[ "delay_min" ] + randomfloat( self.v[ "delay_max" ] - self.v[ "delay_min" ] ); } forward = self.v[ "forward" ]; up = self.v[ "up" ]; org = undefined; firefxsound = self.v[ "firefxsound" ]; origin = self.v[ "origin" ]; firefx = self.v[ "firefx" ]; ender = self.v[ "ender" ]; if ( !isDefined( ender ) ) { ender = "createfx_effectStopper"; } timeout = self.v[ "firefxtimeout" ]; firefxdelay = 0,5; if ( isDefined( self.v[ "firefxdelay" ] ) ) { firefxdelay = self.v[ "firefxdelay" ]; } wait delay; if ( isDefined( firefxsound ) ) { level thread loop_fx_sound( firefxsound, origin, ender, timeout ); } playfx( level._effect[ firefx ], self.v[ "origin" ], forward, up ); } loop_sound_delete( ender, ent ) { ent endon( "death" ); self waittill( ender ); ent delete(); } createexploder( fxid ) { ent = maps/mp/_createfx::createeffect( "exploder", fxid ); ent.v[ "delay" ] = 0; ent.v[ "exploder" ] = 1; ent.v[ "exploder_type" ] = "normal"; return ent; } getotherteam( team ) { if ( team == "allies" ) { return "axis"; } else { if ( team == "axis" ) { return "allies"; } else { return "allies"; } } /# assertmsg( "getOtherTeam: invalid team " + team ); #/ } getteammask( team ) { if ( level.teambased || !isDefined( team ) && !isDefined( level.spawnsystem.ispawn_teammask[ team ] ) ) { return level.spawnsystem.ispawn_teammask_free; } return level.spawnsystem.ispawn_teammask[ team ]; } getotherteamsmask( skip_team ) { mask = 0; _a1408 = level.teams; _k1408 = getFirstArrayKey( _a1408 ); while ( isDefined( _k1408 ) ) { team = _a1408[ _k1408 ]; if ( team == skip_team ) { } else { mask |= getteammask( team ); } _k1408 = getNextArrayKey( _a1408, _k1408 ); } return mask; } wait_endon( waittime, endonstring, endonstring2, endonstring3, endonstring4 ) { self endon( endonstring ); if ( isDefined( endonstring2 ) ) { self endon( endonstring2 ); } if ( isDefined( endonstring3 ) ) { self endon( endonstring3 ); } if ( isDefined( endonstring4 ) ) { self endon( endonstring4 ); } wait waittime; return 1; } ismg( weapon ) { return issubstr( weapon, "_bipod_" ); } plot_points( plotpoints, r, g, b, timer ) { /# lastpoint = plotpoints[ 0 ]; if ( !isDefined( r ) ) { r = 1; } if ( !isDefined( g ) ) { g = 1; } if ( !isDefined( b ) ) { b = 1; } if ( !isDefined( timer ) ) { timer = 0,05; } i = 1; while ( i < plotpoints.size ) { line( lastpoint, plotpoints[ i ], ( r, g, b ), 1, timer ); lastpoint = plotpoints[ i ]; i++; #/ } } 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 = []; } /# assert( !isDefined( self.flag[ message ] ), "Attempt to reinitialize existing message: " + message ); #/ self.flag[ message ] = 0; /# self.flags_lock[ message ] = 0; #/ } player_flag_set_delayed( message, delay ) { wait delay; player_flag_set( message ); } player_flag_set( message ) { /# assert( isDefined( self.flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message ); assert( self.flag[ message ] == self.flags_lock[ message ] ); self.flags_lock[ message ] = 1; #/ self.flag[ message ] = 1; self notify( message ); } player_flag_clear( message ) { /# assert( isDefined( self.flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message ); assert( self.flag[ message ] == self.flags_lock[ message ] ); self.flags_lock[ message ] = 0; #/ self.flag[ message ] = 0; self notify( message ); } player_flag( message ) { /# assert( isDefined( message ), "Tried to check flag but the flag was not defined." ); #/ if ( !self.flag[ message ] ) { return 0; } return 1; } 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; } } getclientsysstate( ssysname ) { if ( !isDefined( level._clientsys ) ) { /# error( "Cannot getClientSysState before registering any client systems." ); #/ return ""; } if ( !isDefined( level._clientsys[ ssysname ] ) ) { /# error( "Client system " + ssysname + " cannot return state, as it is unregistered." ); #/ return ""; } if ( isDefined( level._clientsys[ ssysname ].sysstate ) ) { return level._clientsys[ ssysname ].sysstate; } return ""; } clientnotify( event ) { if ( level.clientscripts ) { if ( isplayer( self ) ) { maps/mp/_utility::setclientsysstate( "levelNotify", event, self ); return; } else { maps/mp/_utility::setclientsysstate( "levelNotify", event ); } } } alphabet_compare( a, b ) { list = []; val = 1; list[ "0" ] = val; val++; list[ "1" ] = val; val++; list[ "2" ] = val; val++; list[ "3" ] = val; val++; list[ "4" ] = val; val++; list[ "5" ] = val; val++; list[ "6" ] = val; val++; list[ "7" ] = val; val++; list[ "8" ] = val; val++; list[ "9" ] = val; val++; list[ "_" ] = val; val++; list[ "a" ] = val; val++; list[ "b" ] = val; val++; list[ "c" ] = val; val++; list[ "d" ] = val; val++; list[ "e" ] = val; val++; list[ "f" ] = val; val++; list[ "g" ] = val; val++; list[ "h" ] = val; val++; list[ "i" ] = val; val++; list[ "j" ] = val; val++; list[ "k" ] = val; val++; list[ "l" ] = val; val++; list[ "m" ] = val; val++; list[ "n" ] = val; val++; list[ "o" ] = val; val++; list[ "p" ] = val; val++; list[ "q" ] = val; val++; list[ "r" ] = val; val++; list[ "s" ] = val; val++; list[ "t" ] = val; val++; list[ "u" ] = val; val++; list[ "v" ] = val; val++; list[ "w" ] = val; val++; list[ "x" ] = val; val++; list[ "y" ] = val; val++; list[ "z" ] = val; val++; a = tolower( a ); b = tolower( b ); val1 = 0; if ( isDefined( list[ a ] ) ) { val1 = list[ a ]; } val2 = 0; if ( isDefined( list[ b ] ) ) { val2 = list[ b ]; } if ( val1 > val2 ) { return "1st"; } if ( val1 < val2 ) { return "2nd"; } return "same"; } is_later_in_alphabet( string1, string2 ) { count = string1.size; if ( count >= string2.size ) { count = string2.size; } i = 0; while ( i < count ) { val = alphabet_compare( string1[ i ], string2[ i ] ); if ( val == "1st" ) { return 1; } if ( val == "2nd" ) { return 0; } i++; } return string1.size > string2.size; } alphabetize( array ) { if ( array.size <= 1 ) { return array; } count = 0; for ( ;; ) { changed = 0; i = 0; while ( i < ( array.size - 1 ) ) { if ( is_later_in_alphabet( array[ i ], array[ i + 1 ] ) ) { val = array[ i ]; array[ i ] = array[ i + 1 ]; array[ i + 1 ] = val; changed = 1; count++; if ( count >= 9 ) { count = 0; wait 0,05; } } i++; } if ( !changed ) { return array; } } return array; } get_players() { players = getplayers(); return players; } getfx( fx ) { /# assert( isDefined( level._effect[ fx ] ), "Fx " + fx + " is not defined in level._effect." ); #/ return level._effect[ fx ]; } 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.lastindex--; } structarray_swaptolast( struct, object ) { struct structarray_swap( struct.array[ struct.lastindex - 1 ], object ); } structarray_shuffle( struct, shuffle ) { i = 0; while ( i < shuffle ) { struct structarray_swap( struct.array[ i ], struct.array[ randomint( struct.lastindex ) ] ); i++; } } structarray_swap( object1, object2 ) { index1 = object1.struct_array_index; index2 = object2.struct_array_index; self.array[ index2 ] = object1; self.array[ index1 ] = object2; self.array[ index1 ].struct_array_index = index1; self.array[ index2 ].struct_array_index = index2; } waittill_either( msg1, msg2 ) { self endon( msg1 ); self waittill( msg2 ); } combinearrays( array1, array2 ) { /# if ( !isDefined( array1 ) ) { assert( isDefined( array2 ) ); } #/ if ( !isDefined( array1 ) && isDefined( array2 ) ) { return array2; } if ( !isDefined( array2 ) && isDefined( array1 ) ) { return array1; } _a1822 = array2; _k1822 = getFirstArrayKey( _a1822 ); while ( isDefined( _k1822 ) ) { elem = _a1822[ _k1822 ]; array1[ array1.size ] = elem; _k1822 = getNextArrayKey( _a1822, _k1822 ); } return array1; } getclosest( org, array, dist ) { return comparesizes( org, array, dist, ::closerfunc ); } getclosestfx( org, fxarray, dist ) { return comparesizesfx( org, fxarray, 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 ) ) { distsqr = dist * dist; struct = undefined; keys = getarraykeys( array ); i = 0; while ( i < keys.size ) { newdistsqr = distancesquared( array[ keys[ i ] ].v[ "origin" ], org ); if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) { i++; continue; } else { distsqr = newdistsqr; struct = array[ keys[ i ] ]; } i++; } return struct; } keys = getarraykeys( array ); struct = array[ keys[ 0 ] ]; distsqr = distancesquared( struct.v[ "origin" ], org ); i = 1; while ( i < keys.size ) { newdistsqr = distancesquared( array[ keys[ i ] ].v[ "origin" ], org ); if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) { i++; continue; } else { distsqr = newdistsqr; struct = array[ keys[ i ] ]; } i++; } return struct; } comparesizes( org, array, dist, comparefunc ) { if ( !array.size ) { return undefined; } if ( isDefined( dist ) ) { distsqr = dist * dist; ent = undefined; keys = getarraykeys( array ); i = 0; while ( i < keys.size ) { if ( !isDefined( array[ keys[ i ] ] ) ) { i++; continue; } else newdistsqr = distancesquared( array[ keys[ i ] ].origin, org ); if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) { i++; continue; } else { distsqr = newdistsqr; ent = array[ keys[ i ] ]; } i++; } return ent; } keys = getarraykeys( array ); ent = array[ keys[ 0 ] ]; distsqr = distancesquared( ent.origin, org ); i = 1; while ( i < keys.size ) { if ( !isDefined( array[ keys[ i ] ] ) ) { i++; continue; } else newdistsqr = distancesquared( array[ keys[ i ] ].origin, org ); if ( [[ comparefunc ]]( newdistsqr, distsqr ) ) { i++; continue; } else { distsqr = newdistsqr; ent = array[ keys[ i ] ]; } i++; } return ent; } closerfunc( dist1, dist2 ) { return dist1 >= dist2; } fartherfunc( dist1, dist2 ) { return dist1 <= dist2; } 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 = []; i = 0; while ( i < array.size ) { if ( !isDefined( array[ i ] ) ) { i++; continue; } else excluded = 0; p = 0; while ( p < excluders.size ) { if ( array[ i ] != excluders[ p ] ) { p++; continue; } else { excluded = 1; break; } p++; } if ( excluded ) { i++; continue; } else length = distancesquared( org, array[ i ].origin ); if ( isDefined( maxdists2rd ) && maxdists2rd < length ) { i++; continue; } else { dist[ dist.size ] = length; index[ index.size ] = i; } i++; } for ( ;; ) { change = 0; i = 0; while ( i < ( dist.size - 1 ) ) { if ( dist[ i ] <= dist[ i + 1 ] ) { i++; continue; } else { change = 1; temp = dist[ i ]; dist[ i ] = dist[ i + 1 ]; dist[ i + 1 ] = temp; temp = index[ i ]; index[ i ] = index[ i + 1 ]; index[ i + 1 ] = temp; } i++; } if ( !change ) { break; } else { } } newarray = []; if ( max > dist.size ) { max = dist.size; } i = 0; while ( i < max ) { newarray[ i ] = array[ index[ i ] ]; i++; } return newarray; } set_dvar_if_unset( dvar, value, reset ) { if ( !isDefined( reset ) ) { reset = 0; } if ( reset || getDvar( dvar ) == "" ) { setdvar( dvar, value ); return value; } return getDvar( dvar ); } set_dvar_float_if_unset( dvar, value, reset ) { if ( !isDefined( reset ) ) { reset = 0; } if ( reset || getDvar( dvar ) == "" ) { setdvar( dvar, value ); } return getDvarFloat( dvar ); } set_dvar_int_if_unset( dvar, value, reset ) { if ( !isDefined( reset ) ) { reset = 0; } if ( reset || getDvar( dvar ) == "" ) { setdvar( dvar, value ); return int( value ); } return getDvarInt( dvar ); } drawcylinder( pos, rad, height, duration, stop_notify ) { /# if ( !isDefined( duration ) ) { duration = 0; } level thread drawcylinder_think( pos, rad, height, duration, stop_notify ); #/ } drawcylinder_think( pos, rad, height, seconds, stop_notify ) { /# if ( isDefined( stop_notify ) ) { level endon( stop_notify ); } stop_time = getTime() + ( seconds * 1000 ); currad = rad; curheight = height; for ( ;; ) { if ( seconds > 0 && stop_time <= getTime() ) { return; } r = 0; while ( r < 20 ) { theta = ( r / 20 ) * 360; theta2 = ( ( r + 1 ) / 20 ) * 360; line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) ); line( pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) ); line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ) ); r++; } wait 0,05; #/ } } is_bot() { if ( isplayer( self ) && isDefined( self.pers[ "isBot" ] ) ) { return self.pers[ "isBot" ] != 0; } } add_trigger_to_ent( ent ) { if ( !isDefined( ent._triggers ) ) { ent._triggers = []; } ent._triggers[ self getentitynumber() ] = 1; } remove_trigger_from_ent( ent ) { if ( !isDefined( ent ) ) { return; } 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 0; } if ( !isDefined( self._triggers[ trig getentitynumber() ] ) ) { return 0; } if ( !self._triggers[ trig getentitynumber() ] ) { return 0; } return 1; } trigger_thread_death_monitor( ent, ender ) { ent waittill( "death" ); self endon( ender ); self remove_trigger_from_ent( ent ); } 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 ); ender = "end_trig_death_monitor" + self getentitynumber() + " " + ent getentitynumber(); self thread trigger_thread_death_monitor( ent, ender ); 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 ); } self notify( ender ); } isoneround() { if ( level.roundlimit == 1 ) { return 1; } return 0; } isfirstround() { if ( level.roundlimit > 1 && game[ "roundsplayed" ] == 0 ) { return 1; } return 0; } islastround() { if ( level.roundlimit > 1 && game[ "roundsplayed" ] >= ( level.roundlimit - 1 ) ) { return 1; } return 0; } waslastround() { if ( level.forcedend ) { return 1; } if ( isDefined( level.shouldplayovertimeround ) ) { if ( [[ level.shouldplayovertimeround ]]() ) { level.nextroundisovertime = 1; return 0; } else { if ( isDefined( game[ "overtime_round" ] ) ) { return 1; } } } if ( !hitroundlimit() || hitscorelimit() && hitroundwinlimit() ) { return 1; } return 0; } hitroundlimit() { if ( level.roundlimit <= 0 ) { return 0; } return getroundsplayed() >= level.roundlimit; } anyteamhitroundwinlimit() { _a2296 = level.teams; _k2296 = getFirstArrayKey( _a2296 ); while ( isDefined( _k2296 ) ) { team = _a2296[ _k2296 ]; if ( getroundswon( team ) >= level.roundwinlimit ) { return 1; } _k2296 = getNextArrayKey( _a2296, _k2296 ); } return 0; } anyteamhitroundlimitwithdraws() { tie_wins = game[ "roundswon" ][ "tie" ]; _a2309 = level.teams; _k2309 = getFirstArrayKey( _a2309 ); while ( isDefined( _k2309 ) ) { team = _a2309[ _k2309 ]; if ( ( getroundswon( team ) + tie_wins ) >= level.roundwinlimit ) { return 1; } _k2309 = getNextArrayKey( _a2309, _k2309 ); } return 0; } getroundwinlimitwinningteam() { max_wins = 0; winning_team = undefined; _a2323 = level.teams; _k2323 = getFirstArrayKey( _a2323 ); while ( isDefined( _k2323 ) ) { team = _a2323[ _k2323 ]; wins = getroundswon( team ); if ( !isDefined( winning_team ) ) { max_wins = wins; winning_team = team; } else if ( wins == max_wins ) { winning_team = "tie"; } else { if ( wins > max_wins ) { max_wins = wins; winning_team = team; } } _k2323 = getNextArrayKey( _a2323, _k2323 ); } return winning_team; } hitroundwinlimit() { if ( !isDefined( level.roundwinlimit ) || level.roundwinlimit <= 0 ) { return 0; } if ( anyteamhitroundwinlimit() ) { return 1; } if ( anyteamhitroundlimitwithdraws() ) { if ( getroundwinlimitwinningteam() != "tie" ) { return 1; } } return 0; } anyteamhitscorelimit() { _a2379 = level.teams; _k2379 = getFirstArrayKey( _a2379 ); while ( isDefined( _k2379 ) ) { team = _a2379[ _k2379 ]; if ( game[ "teamScores" ][ team ] >= level.scorelimit ) { return 1; } _k2379 = getNextArrayKey( _a2379, _k2379 ); } return 0; } hitscorelimit() { if ( isscoreroundbased() ) { return 0; } if ( level.scorelimit <= 0 ) { return 0; } if ( level.teambased ) { if ( anyteamhitscorelimit() ) { return 1; } } else { i = 0; while ( i < level.players.size ) { player = level.players[ i ]; if ( isDefined( player.pointstowin ) && player.pointstowin >= level.scorelimit ) { return 1; } i++; } } return 0; } getroundswon( team ) { return game[ "roundswon" ][ team ]; } getotherteamsroundswon( skip_team ) { roundswon = 0; _a2423 = level.teams; _k2423 = getFirstArrayKey( _a2423 ); while ( isDefined( _k2423 ) ) { team = _a2423[ _k2423 ]; if ( team == skip_team ) { } else { roundswon += game[ "roundswon" ][ team ]; } _k2423 = getNextArrayKey( _a2423, _k2423 ); } return roundswon; } getroundsplayed() { return game[ "roundsplayed" ]; } isscoreroundbased() { return level.scoreroundbased; } isroundbased() { if ( level.roundlimit != 1 && level.roundwinlimit != 1 ) { return 1; } return 0; } waittillnotmoving() { if ( self ishacked() ) { wait 0,05; return; } if ( self.classname == "grenade" ) { self waittill( "stationary" ); } else prevorigin = self.origin; while ( 1 ) { wait 0,15; if ( self.origin == prevorigin ) { return; } else { prevorigin = self.origin; } } } mayapplyscreeneffect() { /# assert( isDefined( self ) ); #/ /# assert( isplayer( self ) ); #/ return !isDefined( self.viewlockedentity ); } getdvarfloatdefault( dvarname, defaultvalue ) { value = getDvar( dvarname ); if ( value != "" ) { return float( value ); } return defaultvalue; } getdvarintdefault( dvarname, defaultvalue ) { value = getDvar( dvarname ); if ( value != "" ) { return int( value ); } return defaultvalue; } closestpointonline( point, linestart, lineend ) { linemagsqrd = lengthsquared( lineend - linestart ); t = ( ( ( ( point[ 0 ] - linestart[ 0 ] ) * ( lineend[ 0 ] - linestart[ 0 ] ) ) + ( ( point[ 1 ] - linestart[ 1 ] ) * ( lineend[ 1 ] - linestart[ 1 ] ) ) ) + ( ( point[ 2 ] - linestart[ 2 ] ) * ( lineend[ 2 ] - linestart[ 2 ] ) ) ) / linemagsqrd; if ( t < 0 ) { return linestart; } else { if ( t > 1 ) { return lineend; } } start_x = linestart[ 0 ] + ( t * ( lineend[ 0 ] - linestart[ 0 ] ) ); start_y = linestart[ 1 ] + ( t * ( lineend[ 1 ] - linestart[ 1 ] ) ); start_z = linestart[ 2 ] + ( t * ( lineend[ 2 ] - linestart[ 2 ] ) ); return ( start_x, start_y, start_z ); } isstrstart( string1, substr ) { return getsubstr( string1, 0, substr.size ) == substr; } spread_array_thread( entities, process, var1, var2, var3 ) { keys = getarraykeys( entities ); if ( isDefined( var3 ) ) { i = 0; while ( i < keys.size ) { entities[ keys[ i ] ] thread [[ process ]]( var1, var2, var3 ); wait 0,1; i++; } return; } if ( isDefined( var2 ) ) { i = 0; while ( i < keys.size ) { entities[ keys[ i ] ] thread [[ process ]]( var1, var2 ); wait 0,1; i++; } return; } if ( isDefined( var1 ) ) { i = 0; while ( i < keys.size ) { entities[ keys[ i ] ] thread [[ process ]]( var1 ); wait 0,1; i++; } return; } i = 0; while ( i < keys.size ) { entities[ keys[ i ] ] thread [[ process ]](); wait 0,1; i++; } } freeze_player_controls( boolean ) { /# assert( isDefined( boolean ), "'freeze_player_controls()' has not been passed an argument properly." ); #/ if ( boolean && isDefined( self ) ) { self freezecontrols( boolean ); } else { if ( !boolean && isDefined( self ) && !level.gameended ) { self freezecontrols( boolean ); } } } gethostplayer() { players = get_players(); index = 0; while ( index < players.size ) { if ( players[ index ] ishost() ) { return players[ index ]; } index++; } } gethostplayerforbots() { players = get_players(); index = 0; while ( index < players.size ) { if ( players[ index ] ishostforbots() ) { return players[ index ]; } index++; } } ispregame() { if ( isDefined( level.pregame ) ) { return level.pregame; } } iskillstreaksenabled() { if ( isDefined( level.killstreaksenabled ) ) { return level.killstreaksenabled; } } isrankenabled() { if ( isDefined( level.rankenabled ) ) { return level.rankenabled; } } playsmokesound( position, duration, startsound, stopsound, loopsound ) { smokesound = spawn( "script_origin", ( 0, 0, 1 ) ); smokesound.origin = position; smokesound playsound( startsound ); smokesound playloopsound( loopsound ); if ( duration > 0,5 ) { wait ( duration - 0,5 ); } thread playsoundinspace( stopsound, position ); smokesound stoploopsound( 0,5 ); wait 0,5; smokesound delete(); } playsoundinspace( 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 ); } else { org playsound( alias ); } wait 10; org delete(); } get2dyaw( start, end ) { yaw = 0; vector = ( end[ 0 ] - start[ 0 ], end[ 1 ] - start[ 1 ], 0 ); return vectoangles( vector ); } vectoangles( vector ) { yaw = 0; vecx = vector[ 0 ]; vecy = vector[ 1 ]; if ( vecx == 0 && vecy == 0 ) { return 0; } if ( vecy < 0,001 && vecy > -0,001 ) { vecy = 0,001; } yaw = atan( vecx / vecy ); if ( vecy < 0 ) { yaw += 180; } return 90 - yaw; } deleteaftertime( time ) { /# assert( isDefined( self ) ); #/ /# assert( isDefined( time ) ); #/ /# assert( time >= 0,05 ); #/ self thread deleteaftertimethread( time ); } deleteaftertimethread( time ) { self endon( "death" ); wait time; self delete(); } setusingremote( remotename ) { if ( isDefined( self.carryicon ) ) { self.carryicon.alpha = 0; } /# assert( !self isusingremote() ); #/ self.usingremote = remotename; self disableoffhandweapons(); self notify( "using_remote" ); } getremotename() { /# assert( self isusingremote() ); #/ return self.usingremote; } isusingremote() { return isDefined( self.usingremote ); } getlastweapon() { last_weapon = undefined; if ( self hasweapon( self.lastnonkillstreakweapon ) ) { last_weapon = self.lastnonkillstreakweapon; } else { if ( self hasweapon( self.lastdroppableweapon ) ) { last_weapon = self.lastdroppableweapon; } } /# assert( isDefined( last_weapon ) ); #/ return last_weapon; } freezecontrolswrapper( frozen ) { if ( isDefined( level.hostmigrationtimer ) ) { self freeze_player_controls( 1 ); return; } self freeze_player_controls( frozen ); } setobjectivetext( team, text ) { game[ "strings" ][ "objective_" + team ] = text; precachestring( text ); } setobjectivescoretext( team, text ) { game[ "strings" ][ "objective_score_" + team ] = text; precachestring( text ); } setobjectivehinttext( team, text ) { game[ "strings" ][ "objective_hint_" + team ] = text; precachestring( text ); } getobjectivetext( team ) { return game[ "strings" ][ "objective_" + team ]; } getobjectivescoretext( team ) { return game[ "strings" ][ "objective_score_" + team ]; } getobjectivehinttext( team ) { return game[ "strings" ][ "objective_hint_" + team ]; } registerroundswitch( minvalue, maxvalue ) { level.roundswitch = clamp( getgametypesetting( "roundSwitch" ), minvalue, maxvalue ); level.roundswitchmin = minvalue; level.roundswitchmax = maxvalue; } registerroundlimit( minvalue, maxvalue ) { level.roundlimit = clamp( getgametypesetting( "roundLimit" ), minvalue, maxvalue ); level.roundlimitmin = minvalue; level.roundlimitmax = maxvalue; } registerroundwinlimit( minvalue, maxvalue ) { level.roundwinlimit = clamp( getgametypesetting( "roundWinLimit" ), minvalue, maxvalue ); level.roundwinlimitmin = minvalue; level.roundwinlimitmax = maxvalue; } registerscorelimit( minvalue, maxvalue ) { level.scorelimit = clamp( getgametypesetting( "scoreLimit" ), minvalue, maxvalue ); level.scorelimitmin = minvalue; level.scorelimitmax = maxvalue; setdvar( "ui_scorelimit", level.scorelimit ); } registertimelimit( minvalue, maxvalue ) { level.timelimit = clamp( getgametypesetting( "timeLimit" ), minvalue, maxvalue ); level.timelimitmin = minvalue; level.timelimitmax = maxvalue; setdvar( "ui_timelimit", level.timelimit ); } registernumlives( minvalue, maxvalue ) { level.numlives = clamp( getgametypesetting( "playerNumLives" ), minvalue, maxvalue ); level.numlivesmin = minvalue; level.numlivesmax = maxvalue; } getplayerfromclientnum( clientnum ) { if ( clientnum < 0 ) { return undefined; } i = 0; while ( i < level.players.size ) { if ( level.players[ i ] getentitynumber() == clientnum ) { return level.players[ i ]; } i++; } return undefined; } setclientfield( field_name, value ) { if ( self == level ) { codesetworldclientfield( field_name, value ); } else { codesetclientfield( self, field_name, value ); } } setclientfieldtoplayer( field_name, value ) { codesetplayerstateclientfield( self, field_name, value ); } getclientfield( field_name ) { if ( self == level ) { return codegetworldclientfield( field_name ); } else { return codegetclientfield( self, field_name ); } } getclientfieldtoplayer( field_name ) { return codegetplayerstateclientfield( self, field_name ); } isenemyplayer( player ) { /# assert( isDefined( player ) ); #/ if ( !isplayer( player ) ) { return 0; } if ( level.teambased ) { if ( player.team == self.team ) { return 0; } } else { if ( player == self ) { return 0; } } return 1; } getweaponclass( weapon ) { /# assert( isDefined( weapon ) ); #/ if ( !isDefined( weapon ) ) { return undefined; } if ( !isDefined( level.weaponclassarray ) ) { level.weaponclassarray = []; } if ( isDefined( level.weaponclassarray[ weapon ] ) ) { return level.weaponclassarray[ weapon ]; } baseweaponindex = getbaseweaponitemindex( weapon ) + 1; weaponclass = tablelookupcolumnforrow( "mp/statstable.csv", baseweaponindex, 2 ); level.weaponclassarray[ weapon ] = weaponclass; return weaponclass; } ispressbuild() { buildtype = getDvar( #"19B966D7" ); if ( isDefined( buildtype ) && buildtype == "press" ) { return 1; } return 0; } isflashbanged() { if ( isDefined( self.flashendtime ) ) { return getTime() < self.flashendtime; } } ishacked() { if ( isDefined( self.hacked ) ) { return self.hacked; } } domaxdamage( origin, attacker, inflictor, headshot, mod ) { if ( isDefined( self.damagedtodeath ) && self.damagedtodeath ) { return; } if ( isDefined( self.maxhealth ) ) { damage = self.maxhealth + 1; } else { damage = self.health + 1; } self.damagedtodeath = 1; self dodamage( damage, origin, attacker, inflictor, headshot, mod ); }