diff --git a/data/common_scripts/utility.gsc b/data/common_scripts/utility.gsc deleted file mode 100644 index 4582dd6..0000000 --- a/data/common_scripts/utility.gsc +++ /dev/null @@ -1,2853 +0,0 @@ -// IW6 GSC SOURCE -// Generated by https://github.com/xensik/gsc-tool - -noself_func( var_0, var_1, var_2, var_3, var_4 ) -{ - if ( !isdefined( level.func ) ) - return; - - if ( !isdefined( level.func[var_0] ) ) - return; - - if ( !isdefined( var_1 ) ) - { - call [[ level.func[var_0] ]](); - return; - } - - if ( !isdefined( var_2 ) ) - { - call [[ level.func[var_0] ]]( var_1 ); - return; - } - - if ( !isdefined( var_3 ) ) - { - call [[ level.func[var_0] ]]( var_1, var_2 ); - return; - } - - if ( !isdefined( var_4 ) ) - { - call [[ level.func[var_0] ]]( var_1, var_2, var_3 ); - return; - } - - call [[ level.func[var_0] ]]( var_1, var_2, var_3, var_4 ); -} - -self_func( var_0, var_1, var_2, var_3, var_4 ) -{ - if ( !isdefined( level.func[var_0] ) ) - return; - - if ( !isdefined( var_1 ) ) - { - self call [[ level.func[var_0] ]](); - return; - } - - if ( !isdefined( var_2 ) ) - { - self call [[ level.func[var_0] ]]( var_1 ); - return; - } - - if ( !isdefined( var_3 ) ) - { - self call [[ level.func[var_0] ]]( var_1, var_2 ); - return; - } - - if ( !isdefined( var_4 ) ) - { - self call [[ level.func[var_0] ]]( var_1, var_2, var_3 ); - return; - } - - self call [[ level.func[var_0] ]]( var_1, var_2, var_3, var_4 ); -} - -randomvector( var_0 ) -{ - return ( randomfloat( var_0 ) - var_0 * 0.5, randomfloat( var_0 ) - var_0 * 0.5, randomfloat( var_0 ) - var_0 * 0.5 ); -} - -randomvectorrange( var_0, var_1 ) -{ - var_2 = randomfloatrange( var_0, var_1 ); - - if ( randomint( 2 ) == 0 ) - var_2 = var_2 * -1; - - var_3 = randomfloatrange( var_0, var_1 ); - - if ( randomint( 2 ) == 0 ) - var_3 = var_3 * -1; - - var_4 = randomfloatrange( var_0, var_1 ); - - if ( randomint( 2 ) == 0 ) - var_4 = var_4 * -1; - - return ( var_2, var_3, var_4 ); -} - -sign( var_0 ) -{ - if ( var_0 >= 0 ) - return 1; - - return -1; -} - -mod( var_0, var_1 ) -{ - var_2 = int( var_0 / var_1 ); - - if ( var_0 * var_1 < 0 ) - var_2 = var_2 - 1; - - return var_0 - var_2 * var_1; -} - -track( var_0 ) -{ - if ( isdefined( self.current_target ) ) - { - if ( var_0 == self.current_target ) - return; - } - - self.current_target = var_0; -} - -get_enemy_team( var_0 ) -{ - var_1 = []; - var_1["axis"] = "allies"; - var_1["allies"] = "axis"; - return var_1[var_0]; -} - -clear_exception( var_0 ) -{ - self.exception[var_0] = anim.defaultexception; -} - -set_exception( var_0, var_1 ) -{ - self.exception[var_0] = var_1; -} - -set_all_exceptions( var_0 ) -{ - var_1 = getarraykeys( self.exception ); - - for ( var_2 = 0; var_2 < var_1.size; var_2++ ) - self.exception[var_1[var_2]] = var_0; -} - -cointoss() -{ - return randomint( 100 ) >= 50; -} - -choose_from_weighted_array( var_0, var_1 ) -{ - var_2 = randomint( var_1[var_1.size - 1] + 1 ); - - for ( var_3 = 0; var_3 < var_1.size; var_3++ ) - { - if ( var_2 <= var_1[var_3] ) - return var_0[var_3]; - } -} - -get_cumulative_weights( var_0 ) -{ - var_1 = []; - var_2 = 0; - - for ( var_3 = 0; var_3 < var_0.size; var_3++ ) - { - var_2 = var_2 + var_0[var_3]; - var_1[var_3] = var_2; - } - - return var_1; -} - -waittill_string( var_0, var_1 ) -{ - if ( var_0 != "death" ) - self endon( "death" ); - - var_1 endon( "die" ); - self waittill( var_0 ); - var_1 notify( "returned", var_0 ); -} - -waittill_string_no_endon_death( var_0, var_1 ) -{ - var_1 endon( "die" ); - self waittill( var_0 ); - var_1 notify( "returned", var_0 ); -} - -waittill_multiple( var_0, var_1, var_2, var_3, var_4 ) -{ - self endon( "death" ); - var_5 = spawnstruct(); - var_5.threads = 0; - - if ( isdefined( var_0 ) ) - { - childthread waittill_string( var_0, var_5 ); - var_5.threads++; - } - - if ( isdefined( var_1 ) ) - { - childthread waittill_string( var_1, var_5 ); - var_5.threads++; - } - - if ( isdefined( var_2 ) ) - { - childthread waittill_string( var_2, var_5 ); - var_5.threads++; - } - - if ( isdefined( var_3 ) ) - { - childthread waittill_string( var_3, var_5 ); - var_5.threads++; - } - - if ( isdefined( var_4 ) ) - { - childthread waittill_string( var_4, var_5 ); - var_5.threads++; - } - - while ( var_5.threads ) - { - var_5 waittill( "returned" ); - var_5.threads--; - } - - var_5 notify( "die" ); -} - -waittill_multiple_ents( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 ) -{ - self endon( "death" ); - var_8 = spawnstruct(); - var_8.threads = 0; - - if ( isdefined( var_0 ) ) - { - var_0 childthread waittill_string( var_1, var_8 ); - var_8.threads++; - } - - if ( isdefined( var_2 ) ) - { - var_2 childthread waittill_string( var_3, var_8 ); - var_8.threads++; - } - - if ( isdefined( var_4 ) ) - { - var_4 childthread waittill_string( var_5, var_8 ); - var_8.threads++; - } - - if ( isdefined( var_6 ) ) - { - var_6 childthread waittill_string( var_7, var_8 ); - var_8.threads++; - } - - while ( var_8.threads ) - { - var_8 waittill( "returned" ); - var_8.threads--; - } - - var_8 notify( "die" ); -} - -waittill_any_return( var_0, var_1, var_2, var_3, var_4, var_5 ) -{ - if ( ( !isdefined( var_0 ) || var_0 != "death" ) && ( !isdefined( var_1 ) || var_1 != "death" ) && ( !isdefined( var_2 ) || var_2 != "death" ) && ( !isdefined( var_3 ) || var_3 != "death" ) && ( !isdefined( var_4 ) || var_4 != "death" ) && ( !isdefined( var_5 ) || var_5 != "death" ) ) - self endon( "death" ); - - var_6 = spawnstruct(); - - if ( isdefined( var_0 ) ) - childthread waittill_string( var_0, var_6 ); - - if ( isdefined( var_1 ) ) - childthread waittill_string( var_1, var_6 ); - - if ( isdefined( var_2 ) ) - childthread waittill_string( var_2, var_6 ); - - if ( isdefined( var_3 ) ) - childthread waittill_string( var_3, var_6 ); - - if ( isdefined( var_4 ) ) - childthread waittill_string( var_4, var_6 ); - - if ( isdefined( var_5 ) ) - childthread waittill_string( var_5, var_6 ); - - var_6 waittill( "returned", var_7 ); - var_6 notify( "die" ); - return var_7; -} - -waittill_any_return_no_endon_death( var_0, var_1, var_2, var_3, var_4, var_5 ) -{ - var_6 = spawnstruct(); - - if ( isdefined( var_0 ) ) - childthread waittill_string_no_endon_death( var_0, var_6 ); - - if ( isdefined( var_1 ) ) - childthread waittill_string_no_endon_death( var_1, var_6 ); - - if ( isdefined( var_2 ) ) - childthread waittill_string_no_endon_death( var_2, var_6 ); - - if ( isdefined( var_3 ) ) - childthread waittill_string_no_endon_death( var_3, var_6 ); - - if ( isdefined( var_4 ) ) - childthread waittill_string_no_endon_death( var_4, var_6 ); - - if ( isdefined( var_5 ) ) - childthread waittill_string_no_endon_death( var_5, var_6 ); - - var_6 waittill( "returned", var_7 ); - var_6 notify( "die" ); - return var_7; -} - -waittill_any_in_array_return( var_0 ) -{ - var_1 = spawnstruct(); - var_2 = 0; - - foreach ( var_4 in var_0 ) - { - childthread waittill_string( var_4, var_1 ); - - if ( var_4 == "death" ) - var_2 = 1; - } - - if ( !var_2 ) - self endon( "death" ); - - var_1 waittill( "returned", var_6 ); - var_1 notify( "die" ); - return var_6; -} - -waittill_any_in_array_return_no_endon_death( var_0 ) -{ - var_1 = spawnstruct(); - - foreach ( var_3 in var_0 ) - childthread waittill_string_no_endon_death( var_3, var_1 ); - - var_1 waittill( "returned", var_5 ); - var_1 notify( "die" ); - return var_5; -} - -waittill_any_in_array_or_timeout( var_0, var_1 ) -{ - var_2 = spawnstruct(); - var_3 = 0; - - foreach ( var_5 in var_0 ) - { - childthread waittill_string( var_5, var_2 ); - - if ( var_5 == "death" ) - var_3 = 1; - } - - if ( !var_3 ) - self endon( "death" ); - - var_2 childthread _timeout( var_1 ); - var_2 waittill( "returned", var_7 ); - var_2 notify( "die" ); - return var_7; -} - -waittill_any_in_array_or_timeout_no_endon_death( var_0, var_1 ) -{ - var_2 = spawnstruct(); - - foreach ( var_4 in var_0 ) - childthread waittill_string_no_endon_death( var_4, var_2 ); - - var_2 thread _timeout( var_1 ); - var_2 waittill( "returned", var_6 ); - var_2 notify( "die" ); - return var_6; -} - -waittill_any_timeout( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) -{ - if ( ( !isdefined( var_1 ) || var_1 != "death" ) && ( !isdefined( var_2 ) || var_2 != "death" ) && ( !isdefined( var_3 ) || var_3 != "death" ) && ( !isdefined( var_4 ) || var_4 != "death" ) && ( !isdefined( var_5 ) || var_5 != "death" ) && ( !isdefined( var_6 ) || var_6 != "death" ) ) - self endon( "death" ); - - var_7 = spawnstruct(); - - if ( isdefined( var_1 ) ) - childthread waittill_string( var_1, var_7 ); - - if ( isdefined( var_2 ) ) - childthread waittill_string( var_2, var_7 ); - - if ( isdefined( var_3 ) ) - childthread waittill_string( var_3, var_7 ); - - if ( isdefined( var_4 ) ) - childthread waittill_string( var_4, var_7 ); - - if ( isdefined( var_5 ) ) - childthread waittill_string( var_5, var_7 ); - - if ( isdefined( var_6 ) ) - childthread waittill_string( var_6, var_7 ); - - var_7 childthread _timeout( var_0 ); - var_7 waittill( "returned", var_8 ); - var_7 notify( "die" ); - return var_8; -} - -_timeout( var_0 ) -{ - self endon( "die" ); - wait( var_0 ); - self notify( "returned", "timeout" ); -} - -waittill_any_timeout_no_endon_death( var_0, var_1, var_2, var_3, var_4, var_5 ) -{ - var_6 = spawnstruct(); - - if ( isdefined( var_1 ) ) - childthread waittill_string_no_endon_death( var_1, var_6 ); - - if ( isdefined( var_2 ) ) - childthread waittill_string_no_endon_death( var_2, var_6 ); - - if ( isdefined( var_3 ) ) - childthread waittill_string_no_endon_death( var_3, var_6 ); - - if ( isdefined( var_4 ) ) - childthread waittill_string_no_endon_death( var_4, var_6 ); - - if ( isdefined( var_5 ) ) - childthread waittill_string_no_endon_death( var_5, var_6 ); - - var_6 childthread _timeout( var_0 ); - var_6 waittill( "returned", var_7 ); - var_6 notify( "die" ); - return var_7; -} - -waittill_any( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 ) -{ - if ( isdefined( var_1 ) ) - self endon( var_1 ); - - if ( isdefined( var_2 ) ) - self endon( var_2 ); - - if ( isdefined( var_3 ) ) - self endon( var_3 ); - - if ( isdefined( var_4 ) ) - self endon( var_4 ); - - if ( isdefined( var_5 ) ) - self endon( var_5 ); - - if ( isdefined( var_6 ) ) - self endon( var_6 ); - - if ( isdefined( var_7 ) ) - self endon( var_7 ); - - self waittill( var_0 ); -} - -waittill_any_ents( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12, var_13 ) -{ - if ( isdefined( var_2 ) && isdefined( var_3 ) ) - var_2 endon( var_3 ); - - if ( isdefined( var_4 ) && isdefined( var_5 ) ) - var_4 endon( var_5 ); - - if ( isdefined( var_6 ) && isdefined( var_7 ) ) - var_6 endon( var_7 ); - - if ( isdefined( var_8 ) && isdefined( var_9 ) ) - var_8 endon( var_9 ); - - if ( isdefined( var_10 ) && isdefined( var_11 ) ) - var_10 endon( var_11 ); - - if ( isdefined( var_12 ) && isdefined( var_13 ) ) - var_12 endon( var_13 ); - - var_0 waittill( var_1 ); -} - -isflashed() -{ - if ( !isdefined( self.flashendtime ) ) - return 0; - - return gettime() < self.flashendtime; -} - -flag_exist( var_0 ) -{ - return isdefined( level.flag[var_0] ); -} - -flag( var_0 ) -{ - return level.flag[var_0]; -} - -init_flags() -{ - level.flag = []; - level.flags_lock = []; - level.generic_index = 0; - - if ( !isdefined( level.sp_stat_tracking_func ) ) - level.sp_stat_tracking_func = ::empty_init_func; - - level.flag_struct = spawnstruct(); - level.flag_struct assign_unique_id(); -} - -flag_init( var_0 ) -{ - if ( !isdefined( level.flag ) ) - init_flags(); - - /# - if ( isdefined( level.first_frame ) && level.first_frame == -1 ) - assertex( !isdefined( level.flag[var_0] ), "Attempt to reinitialize existing message: " + var_0 ); - #/ - - level.flag[var_0] = 0; - - if ( !isdefined( level.trigger_flags ) ) - { - init_trigger_flags(); - level.trigger_flags[var_0] = []; - } - else if ( !isdefined( level.trigger_flags[var_0] ) ) - level.trigger_flags[var_0] = []; - - if ( issuffix( var_0, "aa_" ) ) - thread [[ level.sp_stat_tracking_func ]]( var_0 ); -} - -empty_init_func( var_0 ) -{ - -} - -issuffix( var_0, var_1 ) -{ - if ( var_1.size > var_0.size ) - return 0; - - for ( var_2 = 0; var_2 < var_1.size; var_2++ ) - { - if ( var_0[var_2] != var_1[var_2] ) - return 0; - } - - return 1; -} - -flag_set( var_0, var_1 ) -{ -/# - assertex( isdefined( level.flag[var_0] ), "Attempted to set a flag before calling flag_init: " + var_0 ); -#/ - - level.flag[var_0] = 1; - set_trigger_flag_permissions( var_0 ); - - if ( isdefined( var_1 ) ) - level notify( var_0, var_1 ); - else - level notify( var_0 ); -} - -assign_unique_id() -{ - self.unique_id = "generic" + level.generic_index; - level.generic_index++; -} - -flag_wait( var_0 ) -{ - var_1 = undefined; - - while ( !flag( var_0 ) ) - { - var_1 = undefined; - level waittill( var_0, var_1 ); - } - - if ( isdefined( var_1 ) ) - return var_1; -} - -flag_clear( var_0 ) -{ - if ( !flag( var_0 ) ) - return; - - level.flag[var_0] = 0; - set_trigger_flag_permissions( var_0 ); - level notify( var_0 ); -} - -flag_waitopen( var_0 ) -{ - while ( flag( var_0 ) ) - level waittill( var_0 ); -} - -waittill_either( var_0, var_1 ) -{ - self endon( var_0 ); - self waittill( var_1 ); -} - -array_thread_amortized( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 ) -{ - if ( !isdefined( var_3 ) ) - { - foreach ( var_13 in var_0 ) - { - var_13 thread [[ var_1 ]](); - wait( var_2 ); - } - } - else - { - if ( !isdefined( var_4 ) ) - { - foreach ( var_13 in var_0 ) - { - var_13 thread [[ var_1 ]]( var_3 ); - wait( var_2 ); - } - - return; - } - - if ( !isdefined( var_5 ) ) - { - foreach ( var_13 in var_0 ) - { - var_13 thread [[ var_1 ]]( var_3, var_4 ); - wait( var_2 ); - } - - return; - } - - if ( !isdefined( var_6 ) ) - { - foreach ( var_13 in var_0 ) - { - var_13 thread [[ var_1 ]]( var_3, var_4, var_5 ); - wait( var_2 ); - } - - return; - } - - if ( !isdefined( var_7 ) ) - { - foreach ( var_13 in var_0 ) - { - var_13 thread [[ var_1 ]]( var_3, var_4, var_5, var_6 ); - wait( var_2 ); - } - - return; - } - - if ( !isdefined( var_8 ) ) - { - foreach ( var_13 in var_0 ) - { - var_13 thread [[ var_1 ]]( var_3, var_4, var_5, var_6, var_7 ); - wait( var_2 ); - } - - return; - } - - if ( !isdefined( var_9 ) ) - { - foreach ( var_13 in var_0 ) - { - var_13 thread [[ var_1 ]]( var_3, var_4, var_5, var_6, var_7, var_8 ); - wait( var_2 ); - } - - return; - } - - if ( !isdefined( var_10 ) ) - { - foreach ( var_13 in var_0 ) - { - var_13 thread [[ var_1 ]]( var_3, var_4, var_5, var_6, var_7, var_8, var_9 ); - wait( var_2 ); - } - - return; - } - - if ( !isdefined( var_11 ) ) - { - foreach ( var_13 in var_0 ) - { - var_13 thread [[ var_1 ]]( var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ); - wait( var_2 ); - } - - return; - } - - foreach ( var_13 in var_0 ) - { - var_13 thread [[ var_1 ]]( var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 ); - wait( var_2 ); - } - } -} - -array_thread( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ) -{ - if ( !isdefined( var_2 ) ) - { - foreach ( var_12 in var_0 ) - var_12 thread [[ var_1 ]](); - } - else - { - if ( !isdefined( var_3 ) ) - { - foreach ( var_12 in var_0 ) - var_12 thread [[ var_1 ]]( var_2 ); - - return; - } - - if ( !isdefined( var_4 ) ) - { - foreach ( var_12 in var_0 ) - var_12 thread [[ var_1 ]]( var_2, var_3 ); - - return; - } - - if ( !isdefined( var_5 ) ) - { - foreach ( var_12 in var_0 ) - var_12 thread [[ var_1 ]]( var_2, var_3, var_4 ); - - return; - } - - if ( !isdefined( var_6 ) ) - { - foreach ( var_12 in var_0 ) - var_12 thread [[ var_1 ]]( var_2, var_3, var_4, var_5 ); - - return; - } - - if ( !isdefined( var_7 ) ) - { - foreach ( var_12 in var_0 ) - var_12 thread [[ var_1 ]]( var_2, var_3, var_4, var_5, var_6 ); - - return; - } - - if ( !isdefined( var_8 ) ) - { - foreach ( var_12 in var_0 ) - var_12 thread [[ var_1 ]]( var_2, var_3, var_4, var_5, var_6, var_7 ); - - return; - } - - if ( !isdefined( var_9 ) ) - { - foreach ( var_12 in var_0 ) - var_12 thread [[ var_1 ]]( var_2, var_3, var_4, var_5, var_6, var_7, var_8 ); - - return; - } - - if ( !isdefined( var_10 ) ) - { - foreach ( var_12 in var_0 ) - var_12 thread [[ var_1 ]]( var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ); - - return; - } - - foreach ( var_12 in var_0 ) - var_12 thread [[ var_1 ]]( var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ); - } -} - -array_call( var_0, var_1, var_2, var_3, var_4 ) -{ - if ( isdefined( var_4 ) ) - { - foreach ( var_6 in var_0 ) - var_6 call [[ var_1 ]]( var_2, var_3, var_4 ); - - return; - } - - if ( isdefined( var_3 ) ) - { - foreach ( var_6 in var_0 ) - var_6 call [[ var_1 ]]( var_2, var_3 ); - - return; - } - - if ( isdefined( var_2 ) ) - { - foreach ( var_6 in var_0 ) - var_6 call [[ var_1 ]]( var_2 ); - - return; - } - - foreach ( var_6 in var_0 ) - var_6 call [[ var_1 ]](); -} - -noself_array_call( var_0, var_1, var_2, var_3, var_4 ) -{ - if ( isdefined( var_4 ) ) - { - foreach ( var_6 in var_0 ) - call [[ var_1 ]]( var_6, var_2, var_3, var_4 ); - - return; - } - - if ( isdefined( var_3 ) ) - { - foreach ( var_6 in var_0 ) - call [[ var_1 ]]( var_6, var_2, var_3 ); - - return; - } - - if ( isdefined( var_2 ) ) - { - foreach ( var_6 in var_0 ) - call [[ var_1 ]]( var_6, var_2 ); - - return; - } - - foreach ( var_6 in var_0 ) - call [[ var_1 ]]( var_6 ); -} - -array_thread4( var_0, var_1, var_2, var_3, var_4, var_5 ) -{ - array_thread( var_0, var_1, var_2, var_3, var_4, var_5 ); -} - -array_thread5( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) -{ - array_thread( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ); -} - -trigger_on( var_0, var_1 ) -{ - if ( isdefined( var_0 ) && isdefined( var_1 ) ) - { - var_2 = getentarray( var_0, var_1 ); - array_thread( var_2, ::trigger_on_proc ); - } - else - trigger_on_proc(); -} - -trigger_on_proc() -{ - if ( isdefined( self.realorigin ) ) - self.origin = self.realorigin; - - self.trigger_off = undefined; -} - -trigger_off( var_0, var_1 ) -{ - if ( isdefined( var_0 ) && isdefined( var_1 ) ) - { - var_2 = getentarray( var_0, var_1 ); - array_thread( var_2, ::trigger_off_proc ); - } - else - trigger_off_proc(); -} - -trigger_off_proc() -{ - if ( !isdefined( self.realorigin ) ) - self.realorigin = self.origin; - - if ( self.origin == self.realorigin ) - self.origin = self.origin + ( 0, 0, -10000 ); - - self.trigger_off = 1; -} - -set_trigger_flag_permissions( var_0 ) -{ - if ( !isdefined( level.trigger_flags ) || !isdefined( level.trigger_flags[var_0] ) ) - return; - - level.trigger_flags[var_0] = array_removeundefined( level.trigger_flags[var_0] ); - array_thread( level.trigger_flags[var_0], ::update_trigger_based_on_flags ); -} - -update_trigger_based_on_flags() -{ - var_0 = 1; - - if ( isdefined( self.script_flag_true ) ) - { - var_0 = 0; - var_1 = create_flags_and_return_tokens( self.script_flag_true ); - - foreach ( var_3 in var_1 ) - { - if ( flag( var_3 ) ) - { - var_0 = 1; - break; - } - } - } - - var_5 = 1; - - if ( isdefined( self.script_flag_false ) ) - { - var_1 = create_flags_and_return_tokens( self.script_flag_false ); - - foreach ( var_3 in var_1 ) - { - if ( flag( var_3 ) ) - { - var_5 = 0; - break; - } - } - } - - [[ level.trigger_func[var_0 && var_5] ]](); -} - -create_flags_and_return_tokens( var_0 ) -{ - var_1 = strtok( var_0, " " ); - - for ( var_2 = 0; var_2 < var_1.size; var_2++ ) - { - if ( !isdefined( level.flag[var_1[var_2]] ) ) - flag_init( var_1[var_2] ); - } - - return var_1; -} - -init_trigger_flags() -{ - level.trigger_flags = []; - level.trigger_func[1] = ::trigger_on; - level.trigger_func[0] = ::trigger_off; -} - -getstruct( var_0, var_1 ) -{ - var_2 = level.struct_class_names[var_1][var_0]; - - if ( !isdefined( var_2 ) ) - return undefined; - - if ( var_2.size > 1 ) - return undefined; - - return var_2[0]; -} - -getstructarray( var_0, var_1 ) -{ - var_2 = level.struct_class_names[var_1][var_0]; - - if ( !isdefined( var_2 ) ) - return []; - - return var_2; -} - -struct_class_init() -{ - 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"] = []; - - foreach ( var_1 in level.struct ) - { - if ( isdefined( var_1.targetname ) ) - { - if ( !isdefined( level.struct_class_names["targetname"][var_1.targetname] ) ) - level.struct_class_names["targetname"][var_1.targetname] = []; - - var_2 = level.struct_class_names["targetname"][var_1.targetname].size; - level.struct_class_names["targetname"][var_1.targetname][var_2] = var_1; - } - - if ( isdefined( var_1.target ) ) - { - if ( !isdefined( level.struct_class_names["target"][var_1.target] ) ) - level.struct_class_names["target"][var_1.target] = []; - - var_2 = level.struct_class_names["target"][var_1.target].size; - level.struct_class_names["target"][var_1.target][var_2] = var_1; - } - - if ( isdefined( var_1.script_noteworthy ) ) - { - if ( !isdefined( level.struct_class_names["script_noteworthy"][var_1.script_noteworthy] ) ) - level.struct_class_names["script_noteworthy"][var_1.script_noteworthy] = []; - - var_2 = level.struct_class_names["script_noteworthy"][var_1.script_noteworthy].size; - level.struct_class_names["script_noteworthy"][var_1.script_noteworthy][var_2] = var_1; - } - - if ( isdefined( var_1.script_linkname ) ) - { - if ( !isdefined( level.struct_class_names["script_linkname"][var_1.script_linkname] ) ) - level.struct_class_names["script_linkname"][var_1.script_linkname] = []; - - var_2 = level.struct_class_names["script_linkname"][var_1.script_linkname].size; - level.struct_class_names["script_linkname"][var_1.script_linkname][0] = var_1; - } - } -} - -fileprint_start( var_0 ) -{ - -} - -fileprint_map_start() -{ - -} - -fileprint_map_header( var_0 ) -{ - if ( !isdefined( var_0 ) ) - var_0 = 0; -} - -fileprint_map_keypairprint( var_0, var_1 ) -{ - -} - -fileprint_map_entity_start() -{ - -} - -fileprint_map_entity_end() -{ - -} - -fileprint_radiant_vec( var_0 ) -{ - -} - -array_remove( var_0, var_1 ) -{ - var_2 = []; - - foreach ( var_4 in var_0 ) - { - if ( var_4 != var_1 ) - var_2[var_2.size] = var_4; - } - - return var_2; -} - -array_remove_array( var_0, var_1 ) -{ - foreach ( var_3 in var_1 ) - var_0 = array_remove( var_0, var_3 ); - - return var_0; -} - -array_removeundefined( var_0 ) -{ - var_1 = []; - - foreach ( var_4, var_3 in var_0 ) - { - if ( !isdefined( var_3 ) ) - continue; - - var_1[var_1.size] = var_3; - } - - return var_1; -} - -array_remove_duplicates( var_0 ) -{ - var_1 = []; - - foreach ( var_3 in var_0 ) - { - if ( !isdefined( var_3 ) ) - continue; - - var_4 = 1; - - foreach ( var_6 in var_1 ) - { - if ( var_3 == var_6 ) - { - var_4 = 0; - break; - } - } - - if ( var_4 ) - var_1[var_1.size] = var_3; - } - - return var_1; -} - -array_levelthread( var_0, var_1, var_2, var_3, var_4 ) -{ - if ( isdefined( var_4 ) ) - { - foreach ( var_6 in var_0 ) - thread [[ var_1 ]]( var_6, var_2, var_3, var_4 ); - - return; - } - - if ( isdefined( var_3 ) ) - { - foreach ( var_6 in var_0 ) - thread [[ var_1 ]]( var_6, var_2, var_3 ); - - return; - } - - if ( isdefined( var_2 ) ) - { - foreach ( var_6 in var_0 ) - thread [[ var_1 ]]( var_6, var_2 ); - - return; - } - - foreach ( var_6 in var_0 ) - thread [[ var_1 ]]( var_6 ); -} - -array_levelcall( var_0, var_1, var_2, var_3, var_4 ) -{ - if ( isdefined( var_4 ) ) - { - foreach ( var_6 in var_0 ) - call [[ var_1 ]]( var_6, var_2, var_3, var_4 ); - - return; - } - - if ( isdefined( var_3 ) ) - { - foreach ( var_6 in var_0 ) - call [[ var_1 ]]( var_6, var_2, var_3 ); - - return; - } - - if ( isdefined( var_2 ) ) - { - foreach ( var_6 in var_0 ) - call [[ var_1 ]]( var_6, var_2 ); - - return; - } - - foreach ( var_6 in var_0 ) - call [[ var_1 ]]( var_6 ); -} - -add_to_array( var_0, var_1 ) -{ - if ( !isdefined( var_1 ) ) - return var_0; - - if ( !isdefined( var_0 ) ) - var_0[0] = var_1; - else - var_0[var_0.size] = var_1; - - return var_0; -} - -flag_assert( var_0 ) -{ - -} - -flag_wait_either( var_0, var_1 ) -{ - for (;;) - { - if ( flag( var_0 ) ) - return; - - if ( flag( var_1 ) ) - return; - - level waittill_either( var_0, var_1 ); - } -} - -flag_wait_either_return( var_0, var_1 ) -{ - for (;;) - { - if ( flag( var_0 ) ) - return var_0; - - if ( flag( var_1 ) ) - return var_1; - - var_2 = level waittill_any_return( var_0, var_1 ); - return var_2; - } -} - -flag_wait_any( var_0, var_1, var_2, var_3, var_4, var_5 ) -{ - var_6 = []; - - if ( isdefined( var_5 ) ) - { - var_6[var_6.size] = var_0; - var_6[var_6.size] = var_1; - var_6[var_6.size] = var_2; - var_6[var_6.size] = var_3; - var_6[var_6.size] = var_4; - var_6[var_6.size] = var_5; - } - else if ( isdefined( var_4 ) ) - { - var_6[var_6.size] = var_0; - var_6[var_6.size] = var_1; - var_6[var_6.size] = var_2; - var_6[var_6.size] = var_3; - var_6[var_6.size] = var_4; - } - else if ( isdefined( var_3 ) ) - { - var_6[var_6.size] = var_0; - var_6[var_6.size] = var_1; - var_6[var_6.size] = var_2; - var_6[var_6.size] = var_3; - } - else if ( isdefined( var_2 ) ) - { - var_6[var_6.size] = var_0; - var_6[var_6.size] = var_1; - var_6[var_6.size] = var_2; - } - else if ( isdefined( var_1 ) ) - { - flag_wait_either( var_0, var_1 ); - return; - } - else - return; - - for (;;) - { - for ( var_7 = 0; var_7 < var_6.size; var_7++ ) - { - if ( flag( var_6[var_7] ) ) - return; - } - - level waittill_any( var_0, var_1, var_2, var_3, var_4, var_5 ); - } -} - -flag_wait_any_return( var_0, var_1, var_2, var_3, var_4 ) -{ - var_5 = []; - - if ( isdefined( var_4 ) ) - { - var_5[var_5.size] = var_0; - var_5[var_5.size] = var_1; - var_5[var_5.size] = var_2; - var_5[var_5.size] = var_3; - var_5[var_5.size] = var_4; - } - else if ( isdefined( var_3 ) ) - { - var_5[var_5.size] = var_0; - var_5[var_5.size] = var_1; - var_5[var_5.size] = var_2; - var_5[var_5.size] = var_3; - } - else if ( isdefined( var_2 ) ) - { - var_5[var_5.size] = var_0; - var_5[var_5.size] = var_1; - var_5[var_5.size] = var_2; - } - else if ( isdefined( var_1 ) ) - { - var_6 = flag_wait_either_return( var_0, var_1 ); - return var_6; - } - else - return; - - for (;;) - { - for ( var_7 = 0; var_7 < var_5.size; var_7++ ) - { - if ( flag( var_5[var_7] ) ) - return var_5[var_7]; - } - - var_6 = level waittill_any_return( var_0, var_1, var_2, var_3, var_4 ); - return var_6; - } -} - -flag_wait_all( var_0, var_1, var_2, var_3 ) -{ - if ( isdefined( var_0 ) ) - flag_wait( var_0 ); - - if ( isdefined( var_1 ) ) - flag_wait( var_1 ); - - if ( isdefined( var_2 ) ) - flag_wait( var_2 ); - - if ( isdefined( var_3 ) ) - flag_wait( var_3 ); -} - -flag_wait_or_timeout( var_0, var_1 ) -{ - var_2 = var_1 * 1000; - var_3 = gettime(); - - for (;;) - { - if ( flag( var_0 ) ) - break; - - if ( gettime() >= var_3 + var_2 ) - break; - - var_4 = var_2 - ( gettime() - var_3 ); - var_5 = var_4 / 1000; - wait_for_flag_or_time_elapses( var_0, var_5 ); - } -} - -flag_waitopen_or_timeout( var_0, var_1 ) -{ - var_2 = gettime(); - - for (;;) - { - if ( !flag( var_0 ) ) - break; - - if ( gettime() >= var_2 + var_1 * 1000 ) - break; - - wait_for_flag_or_time_elapses( var_0, var_1 ); - } -} - -wait_for_flag_or_time_elapses( var_0, var_1 ) -{ - level endon( var_0 ); - wait( var_1 ); -} - -delaycall( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ) -{ - thread delaycall_proc( var_1, var_0, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ); -} - -delaycall_proc( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ) -{ - if ( issp() ) - { - self endon( "death" ); - self endon( "stop_delay_call" ); - } - - wait( var_1 ); - - if ( isdefined( var_9 ) ) - self call [[ var_0 ]]( var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ); - else if ( isdefined( var_8 ) ) - self call [[ var_0 ]]( var_2, var_3, var_4, var_5, var_6, var_7, var_8 ); - else if ( isdefined( var_7 ) ) - self call [[ var_0 ]]( var_2, var_3, var_4, var_5, var_6, var_7 ); - else if ( isdefined( var_6 ) ) - self call [[ var_0 ]]( var_2, var_3, var_4, var_5, var_6 ); - else if ( isdefined( var_5 ) ) - self call [[ var_0 ]]( var_2, var_3, var_4, var_5 ); - else if ( isdefined( var_4 ) ) - self call [[ var_0 ]]( var_2, var_3, var_4 ); - else if ( isdefined( var_3 ) ) - self call [[ var_0 ]]( var_2, var_3 ); - else if ( isdefined( var_2 ) ) - self call [[ var_0 ]]( var_2 ); - else - self call [[ var_0 ]](); -} - -noself_delaycall( var_0, var_1, var_2, var_3, var_4, var_5 ) -{ - thread noself_delaycall_proc( var_1, var_0, var_2, var_3, var_4, var_5 ); -} - -noself_delaycall_proc( var_0, var_1, var_2, var_3, var_4, var_5 ) -{ - wait( var_1 ); - - if ( isdefined( var_5 ) ) - call [[ var_0 ]]( var_2, var_3, var_4, var_5 ); - else if ( isdefined( var_4 ) ) - call [[ var_0 ]]( var_2, var_3, var_4 ); - else if ( isdefined( var_3 ) ) - call [[ var_0 ]]( var_2, var_3 ); - else if ( isdefined( var_2 ) ) - call [[ var_0 ]]( var_2 ); - else - call [[ var_0 ]](); -} - -issp() -{ - if ( !isdefined( level.issp ) ) - level.issp = !string_starts_with( getdvar( "mapname" ), "mp_" ); - - return level.issp; -} - -issp_towerdefense() -{ - if ( !isdefined( level.issp_towerdefense ) ) - level.issp_towerdefense = string_starts_with( getdvar( "mapname" ), "so_td_" ); - - return level.issp_towerdefense; -} - -string_starts_with( var_0, var_1 ) -{ - if ( var_0.size < var_1.size ) - return 0; - - for ( var_2 = 0; var_2 < var_1.size; var_2++ ) - { - if ( tolower( var_0[var_2] ) != tolower( var_1[var_2] ) ) - return 0; - } - - return 1; -} - -plot_points( var_0, var_1, var_2, var_3, var_4 ) -{ - var_5 = var_0[0]; - - if ( !isdefined( var_1 ) ) - var_1 = 1; - - if ( !isdefined( var_2 ) ) - var_2 = 1; - - if ( !isdefined( var_3 ) ) - var_3 = 1; - - if ( !isdefined( var_4 ) ) - var_4 = 0.05; - - for ( var_6 = 1; var_6 < var_0.size; var_6++ ) - { - thread draw_line_for_time( var_5, var_0[var_6], var_1, var_2, var_3, var_4 ); - var_5 = var_0[var_6]; - } -} - -draw_line_for_time( var_0, var_1, var_2, var_3, var_4, var_5 ) -{ - var_5 = gettime() + var_5 * 1000; - - while ( gettime() < var_5 ) - wait 0.05; -} - -table_combine( var_0, var_1 ) -{ - var_2 = []; - - foreach ( var_5, var_4 in var_0 ) - var_2[var_5] = var_4; - - foreach ( var_5, var_4 in var_1 ) - var_2[var_5] = var_4; - - return var_2; -} - -array_combine( var_0, var_1 ) -{ - var_2 = []; - - foreach ( var_4 in var_0 ) - var_2[var_2.size] = var_4; - - foreach ( var_4 in var_1 ) - var_2[var_2.size] = var_4; - - return var_2; -} - -array_combine_non_integer_indices( var_0, var_1 ) -{ - var_2 = []; - - foreach ( var_5, var_4 in var_0 ) - var_2[var_5] = var_4; - - foreach ( var_5, var_4 in var_1 ) - var_2[var_5] = var_4; - - return var_2; -} - -array_randomize( var_0 ) -{ - for ( var_1 = 0; var_1 < var_0.size; var_1++ ) - { - var_2 = randomint( var_0.size ); - var_3 = var_0[var_1]; - var_0[var_1] = var_0[var_2]; - var_0[var_2] = var_3; - } - - return var_0; -} - -array_add( var_0, var_1 ) -{ - var_0[var_0.size] = var_1; - return var_0; -} - -array_insert( var_0, var_1, var_2 ) -{ - if ( var_2 == var_0.size ) - { - var_3 = var_0; - var_3[var_3.size] = var_1; - return var_3; - } - - var_3 = []; - var_4 = 0; - - for ( var_5 = 0; var_5 < var_0.size; var_5++ ) - { - if ( var_5 == var_2 ) - { - var_3[var_5] = var_1; - var_4 = 1; - } - - var_3[var_5 + var_4] = var_0[var_5]; - } - - return var_3; -} - -array_contains( var_0, var_1 ) -{ - if ( var_0.size <= 0 ) - return 0; - - foreach ( var_3 in var_0 ) - { - if ( var_3 == var_1 ) - return 1; - } - - return 0; -} - -array_find( var_0, var_1 ) -{ - foreach ( var_4, var_3 in var_0 ) - { - if ( var_3 == var_1 ) - return var_4; - } - - return undefined; -} - -flat_angle( var_0 ) -{ - var_1 = ( 0, var_0[1], 0 ); - return var_1; -} - -flat_origin( var_0 ) -{ - var_1 = ( var_0[0], var_0[1], 0 ); - return var_1; -} - -draw_arrow_time( var_0, var_1, var_2, var_3 ) -{ - level endon( "newpath" ); - var_4 = []; - var_5 = vectortoangles( var_0 - var_1 ); - var_6 = anglestoright( var_5 ); - var_7 = anglestoforward( var_5 ); - var_8 = anglestoup( var_5 ); - var_9 = distance( var_0, var_1 ); - var_10 = []; - var_11 = 0.1; - var_10[0] = var_0; - var_10[1] = var_0 + var_6 * ( var_9 * var_11 ) + var_7 * ( var_9 * -0.1 ); - var_10[2] = var_1; - var_10[3] = var_0 + var_6 * ( var_9 * ( -1 * var_11 ) ) + var_7 * ( var_9 * -0.1 ); - var_10[4] = var_0; - var_10[5] = var_0 + var_8 * ( var_9 * var_11 ) + var_7 * ( var_9 * -0.1 ); - var_10[6] = var_1; - var_10[7] = var_0 + var_8 * ( var_9 * ( -1 * var_11 ) ) + var_7 * ( var_9 * -0.1 ); - var_10[8] = var_0; - var_12 = var_2[0]; - var_13 = var_2[1]; - var_14 = var_2[2]; - plot_points( var_10, var_12, var_13, var_14, var_3 ); -} - -get_linked_ents() -{ - var_0 = []; - - if ( isdefined( self.script_linkto ) ) - { - var_1 = get_links(); - - foreach ( var_3 in var_1 ) - { - var_4 = getentarray( var_3, "script_linkname" ); - - if ( var_4.size > 0 ) - var_0 = array_combine( var_0, var_4 ); - } - } - - return var_0; -} - -get_linked_vehicle_nodes() -{ - var_0 = []; - - if ( isdefined( self.script_linkto ) ) - { - var_1 = get_links(); - - foreach ( var_3 in var_1 ) - { - var_4 = getvehiclenodearray( var_3, "script_linkname" ); - - if ( var_4.size > 0 ) - var_0 = array_combine( var_0, var_4 ); - } - } - - return var_0; -} - -get_linked_ent() -{ - var_0 = get_linked_ents(); - return var_0[0]; -} - -get_linked_vehicle_node() -{ - var_0 = get_linked_vehicle_nodes(); - return var_0[0]; -} - -get_links() -{ - return strtok( self.script_linkto, " " ); -} - -run_thread_on_targetname( var_0, var_1, var_2, var_3, var_4 ) -{ - var_5 = getentarray( var_0, "targetname" ); - array_thread( var_5, var_1, var_2, var_3, var_4 ); - var_5 = getstructarray( var_0, "targetname" ); - array_thread( var_5, var_1, var_2, var_3, var_4 ); - var_5 = call [[ level.getnodearrayfunction ]]( var_0, "targetname" ); - array_thread( var_5, var_1, var_2, var_3, var_4 ); - var_5 = getvehiclenodearray( var_0, "targetname" ); - array_thread( var_5, var_1, var_2, var_3, var_4 ); -} - -run_thread_on_noteworthy( var_0, var_1, var_2, var_3, var_4 ) -{ - var_5 = getentarray( var_0, "script_noteworthy" ); - array_thread( var_5, var_1, var_2, var_3, var_4 ); - var_5 = getstructarray( var_0, "script_noteworthy" ); - array_thread( var_5, var_1, var_2, var_3, var_4 ); - var_5 = call [[ level.getnodearrayfunction ]]( var_0, "script_noteworthy" ); - array_thread( var_5, var_1, var_2, var_3, var_4 ); - var_5 = getvehiclenodearray( var_0, "script_noteworthy" ); - array_thread( var_5, var_1, var_2, var_3, var_4 ); -} - -draw_arrow( var_0, var_1, var_2 ) -{ - level endon( "newpath" ); - var_3 = []; - var_4 = vectortoangles( var_0 - var_1 ); - var_5 = anglestoright( var_4 ); - var_6 = anglestoforward( var_4 ); - var_7 = distance( var_0, var_1 ); - var_8 = []; - var_9 = 0.05; - var_8[0] = var_0; - var_8[1] = var_0 + var_5 * ( var_7 * var_9 ) + var_6 * ( var_7 * -0.2 ); - var_8[2] = var_1; - var_8[3] = var_0 + var_5 * ( var_7 * ( -1 * var_9 ) ) + var_6 * ( var_7 * -0.2 ); - - for ( var_10 = 0; var_10 < 4; var_10++ ) - { - var_11 = var_10 + 1; - - if ( var_11 >= 4 ) - var_11 = 0; - } -} - -draw_entity_bounds( var_0, var_1, var_2, var_3, var_4 ) -{ - if ( !isdefined( var_2 ) ) - var_2 = ( 0, 1, 0 ); - - if ( !isdefined( var_3 ) ) - var_3 = 0; - - if ( !isdefined( var_4 ) ) - var_4 = 0.05; - - if ( var_3 ) - var_5 = int( var_4 / 0.05 ); - else - var_5 = int( var_1 / 0.05 ); - - var_6 = []; - var_7 = []; - var_8 = gettime(); - - for ( var_9 = var_8 + var_1 * 1000; var_8 < var_9 && isdefined( var_0 ); var_8 = gettime() ) - { - var_6[0] = var_0 getpointinbounds( 1, 1, 1 ); - var_6[1] = var_0 getpointinbounds( 1, 1, -1 ); - var_6[2] = var_0 getpointinbounds( -1, 1, -1 ); - var_6[3] = var_0 getpointinbounds( -1, 1, 1 ); - var_7[0] = var_0 getpointinbounds( 1, -1, 1 ); - var_7[1] = var_0 getpointinbounds( 1, -1, -1 ); - var_7[2] = var_0 getpointinbounds( -1, -1, -1 ); - var_7[3] = var_0 getpointinbounds( -1, -1, 1 ); - - for ( var_10 = 0; var_10 < 4; var_10++ ) - { - var_11 = var_10 + 1; - - if ( var_11 == 4 ) - var_11 = 0; - } - - if ( !var_3 ) - return; - - wait( var_4 ); - } -} - -draw_volume( var_0, var_1, var_2, var_3, var_4 ) -{ - draw_entity_bounds( var_0, var_1, var_2, var_3, var_4 ); -} - -draw_trigger( var_0, var_1, var_2, var_3, var_4 ) -{ - draw_entity_bounds( var_0, var_1, var_2, var_3, var_4 ); -} - -getfx( var_0 ) -{ - return level._effect[var_0]; -} - -fxexists( var_0 ) -{ - return isdefined( level._effect[var_0] ); -} - -print_csv_asset( var_0, var_1 ) -{ - var_2 = var_1 + "," + var_0; - - if ( isdefined( level.csv_lines[var_2] ) ) - return; - - level.csv_lines[var_2] = 1; -} - -fileprint_csv_start( var_0 ) -{ - -} - -getlastweapon() -{ - return self.saved_lastweapon; -} - -playerunlimitedammothread() -{ - -} - -isusabilityenabled() -{ - return !self.disabledusability; -} - -_disableusability() -{ - if ( !isdefined( self.disabledusability ) ) - self.disabledusability = 0; - - self.disabledusability++; - self disableusability(); -} - -_enableusability() -{ - if ( !isdefined( self.disabledusability ) ) - self.disabledusability = 0; - else if ( self.disabledusability > 0 ) - { - self.disabledusability--; - - if ( self.disabledusability == 0 ) - self enableusability(); - } -} - -resetusability() -{ - self.disabledusability = 0; - self enableusability(); -} - -_disableweapon() -{ - if ( !isdefined( self.disabledweapon ) ) - self.disabledweapon = 0; - - self.disabledweapon++; - self disableweapons(); -} - -_enableweapon() -{ - if ( !isdefined( self.disabledweapon ) ) - self.disabledweapon = 0; - - self.disabledweapon--; - - if ( !self.disabledweapon ) - self enableweapons(); -} - -isweaponenabled() -{ - return !self.disabledweapon; -} - -_disableweaponswitch() -{ - if ( !isdefined( self.disabledweaponswitch ) ) - self.disabledweaponswitch = 0; - - self.disabledweaponswitch++; - self disableweaponswitch(); -} - -_enableweaponswitch() -{ - if ( !isdefined( self.disabledweaponswitch ) ) - self.disabledweaponswitch = 0; - - self.disabledweaponswitch--; - - if ( !self.disabledweaponswitch ) - self enableweaponswitch(); -} - -isweaponswitchenabled() -{ - return !self.disabledweaponswitch; -} - -_disableoffhandweapons() -{ - if ( !isdefined( self.disabledoffhandweapons ) ) - self.disabledoffhandweapons = 0; - - self.disabledoffhandweapons++; - self disableoffhandweapons(); -} - -_enableoffhandweapons() -{ - if ( !isdefined( self.disabledoffhandweapons ) ) - self.disabledoffhandweapons = 0; - - self.disabledoffhandweapons--; - - if ( !self.disabledoffhandweapons ) - self enableoffhandweapons(); -} - -isoffhandweaponenabled() -{ - return !self.disabledoffhandweapons; -} - -random( var_0 ) -{ - var_1 = []; - - foreach ( var_4, var_3 in var_0 ) - var_1[var_1.size] = var_3; - - if ( !var_1.size ) - return undefined; - - return var_1[randomint( var_1.size )]; -} - -random_weight_sorted( var_0 ) -{ - var_1 = []; - - foreach ( var_4, var_3 in var_0 ) - var_1[var_1.size] = var_3; - - if ( !var_1.size ) - return undefined; - - var_5 = randomint( var_1.size * var_1.size ); - return var_1[var_1.size - 1 - int( sqrt( var_5 ) )]; -} - -spawn_tag_origin() -{ - var_0 = spawn( "script_model", ( 0, 0, 0 ) ); - var_0 setmodel( "tag_origin" ); - var_0 hide(); - - if ( isdefined( self.origin ) ) - var_0.origin = self.origin; - - if ( isdefined( self.angles ) ) - var_0.angles = self.angles; - - return var_0; -} - -waittill_notify_or_timeout( var_0, var_1 ) -{ - self endon( var_0 ); - wait( var_1 ); -} - -waittill_notify_or_timeout_return( var_0, var_1 ) -{ - self endon( var_0 ); - wait( var_1 ); - return "timeout"; -} - -fileprint_launcher_start_file() -{ - level.fileprintlauncher_linecount = 0; - level.fileprint_launcher = 1; - fileprint_launcher( "GAMEPRINTSTARTFILE:" ); -} - -fileprint_launcher( var_0 ) -{ - level.fileprintlauncher_linecount++; - - if ( level.fileprintlauncher_linecount > 200 ) - { - wait 0.05; - level.fileprintlauncher_linecount = 0; - } -} - -fileprint_launcher_end_file( var_0, var_1 ) -{ - if ( !isdefined( var_1 ) ) - var_1 = 0; - - if ( var_1 ) - fileprint_launcher( "GAMEPRINTENDFILE:GAMEPRINTP4ENABLED:" + var_0 ); - else - fileprint_launcher( "GAMEPRINTENDFILE:" + var_0 ); - - var_2 = gettime() + 4000; - - while ( getdvarint( "LAUNCHER_PRINT_SUCCESS" ) == 0 && getdvar( "LAUNCHER_PRINT_FAIL" ) == "0" && gettime() < var_2 ) - wait 0.05; - - if ( !( gettime() < var_2 ) ) - { - iprintlnbold( "LAUNCHER_PRINT_FAIL:( TIMEOUT ): launcherconflict? restart launcher and try again? " ); - level.fileprint_launcher = undefined; - return 0; - } - - var_3 = getdvar( "LAUNCHER_PRINT_FAIL" ); - - if ( var_3 != "0" ) - { - iprintlnbold( "LAUNCHER_PRINT_FAIL:( " + var_3 + " ): launcherconflict? restart launcher and try again? " ); - level.fileprint_launcher = undefined; - return 0; - } - - level.fileprint_launcher = undefined; - return 1; -} - -launcher_write_clipboard( var_0 ) -{ - level.fileprintlauncher_linecount = 0; - fileprint_launcher( "LAUNCHER_CLIP:" + var_0 ); -} - -isdestructible() -{ - if ( !isdefined( self ) ) - return 0; - - return isdefined( self.destructible_type ); -} - -pauseeffect() -{ - common_scripts\_createfx::stop_fx_looper(); -} - -activate_individual_exploder() -{ - common_scripts\_exploder::activate_individual_exploder_proc(); -} - -waitframe() -{ - wait 0.05; -} - -get_target_ent( var_0 ) -{ - if ( !isdefined( var_0 ) ) - var_0 = self.target; - - var_1 = getent( var_0, "targetname" ); - - if ( isdefined( var_1 ) ) - return var_1; - - if ( issp() ) - { - var_1 = call [[ level.getnodefunction ]]( var_0, "targetname" ); - - if ( isdefined( var_1 ) ) - return var_1; - } - - var_1 = getstruct( var_0, "targetname" ); - - if ( isdefined( var_1 ) ) - return var_1; - - var_1 = getvehiclenode( var_0, "targetname" ); - - if ( isdefined( var_1 ) ) - return var_1; -} - -get_noteworthy_ent( var_0 ) -{ - var_1 = getent( var_0, "script_noteworthy" ); - - if ( isdefined( var_1 ) ) - return var_1; - - if ( issp() ) - { - var_1 = call [[ level.getnodefunction ]]( var_0, "script_noteworthy" ); - - if ( isdefined( var_1 ) ) - return var_1; - } - - var_1 = getstruct( var_0, "script_noteworthy" ); - - if ( isdefined( var_1 ) ) - return var_1; - - var_1 = getvehiclenode( var_0, "script_noteworthy" ); - - if ( isdefined( var_1 ) ) - return var_1; -} - -do_earthquake( var_0, var_1 ) -{ - var_2 = level.earthquake[var_0]; - earthquake( var_2["magnitude"], var_2["duration"], var_1, var_2["radius"] ); -} - -play_loopsound_in_space( var_0, var_1 ) -{ - var_2 = spawn( "script_origin", ( 0, 0, 0 ) ); - - if ( !isdefined( var_1 ) ) - var_1 = self.origin; - - var_2.origin = var_1; - var_2 playloopsound( var_0 ); - return var_2; -} - -play_sound_in_space_with_angles( var_0, var_1, var_2, var_3 ) -{ - var_4 = spawn( "script_origin", ( 0, 0, 1 ) ); - - if ( !isdefined( var_1 ) ) - var_1 = self.origin; - - var_4.origin = var_1; - var_4.angles = var_2; - - if ( issp() ) - { - if ( isdefined( var_3 ) && var_3 ) - var_4 playsoundasmaster( var_0, "sounddone" ); - else - var_4 playsound( var_0, "sounddone" ); - - var_4 waittill( "sounddone" ); - } - else if ( isdefined( var_3 ) && var_3 ) - var_4 playsoundasmaster( var_0 ); - else - var_4 playsound( var_0 ); - - var_4 delete(); -} - -play_sound_in_space( var_0, var_1, var_2 ) -{ - play_sound_in_space_with_angles( var_0, var_1, ( 0, 0, 0 ), var_2 ); -} - -loop_fx_sound( var_0, var_1, var_2, var_3, var_4 ) -{ - loop_fx_sound_with_angles( var_0, var_1, ( 0, 0, 0 ), var_2, var_3, var_4 ); -} - -loop_fx_sound_with_angles( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) -{ - if ( isdefined( var_3 ) && var_3 ) - { - if ( !isdefined( level.first_frame ) || level.first_frame == 1 ) - spawnloopingsound( var_0, var_1, var_2 ); - } - else - { - if ( level.createfx_enabled && isdefined( var_5.loopsound_ent ) ) - var_7 = var_5.loopsound_ent; - else - var_7 = spawn( "script_origin", ( 0, 0, 0 ) ); - - if ( isdefined( var_4 ) ) - { - thread loop_sound_delete( var_4, var_7 ); - self endon( var_4 ); - } - - var_7.origin = var_1; - var_7.angles = var_2; - var_7 playloopsound( var_0 ); - - if ( level.createfx_enabled ) - var_5.loopsound_ent = var_7; - else - var_7 willneverchange(); - } -} - -loop_fx_sound_interval( var_0, var_1, var_2, var_3, var_4, var_5 ) -{ - loop_fx_sound_interval_with_angles( var_0, var_1, ( 0, 0, 0 ), var_2, var_3, var_4, var_5 ); -} - -loop_fx_sound_interval_with_angles( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) -{ - var_7 = spawn( "script_origin", ( 0, 0, 0 ) ); - - if ( isdefined( var_3 ) ) - { - thread loop_sound_delete( var_3, var_7 ); - self endon( var_3 ); - } - - var_7.origin = var_1; - var_7.angles = var_2; - - if ( var_5 >= var_6 ) - { - for (;;) - wait 0.05; - } - - if ( !soundexists( var_0 ) ) - { - for (;;) - wait 0.05; - } - - for (;;) - { - wait( randomfloatrange( var_5, var_6 ) ); - lock( "createfx_looper" ); - thread play_sound_in_space_with_angles( var_0, var_7.origin, var_7.angles, undefined ); - unlock( "createfx_looper" ); - } -} - -loop_sound_delete( var_0, var_1 ) -{ - var_1 endon( "death" ); - self waittill( var_0 ); - var_1 delete(); -} - -createloopeffect( var_0 ) -{ - var_1 = common_scripts\_createfx::createeffect( "loopfx", var_0 ); - var_1.v["delay"] = common_scripts\_createfx::getloopeffectdelaydefault(); - return var_1; -} - -createoneshoteffect( var_0 ) -{ - var_1 = common_scripts\_createfx::createeffect( "oneshotfx", var_0 ); - var_1.v["delay"] = common_scripts\_createfx::getoneshoteffectdelaydefault(); - return var_1; -} - -createexploder( var_0 ) -{ - var_1 = common_scripts\_createfx::createeffect( "exploder", var_0 ); - var_1.v["delay"] = common_scripts\_createfx::getexploderdelaydefault(); - var_1.v["exploder_type"] = "normal"; - return var_1; -} - -alphabetize( var_0 ) -{ - if ( var_0.size <= 1 ) - return var_0; - - var_1 = 0; - - for ( var_2 = var_0.size - 1; var_2 >= 1; var_2-- ) - { - var_3 = var_0[var_2]; - var_4 = var_2; - - for ( var_5 = 0; var_5 < var_2; var_5++ ) - { - var_6 = var_0[var_5]; - - if ( stricmp( var_6, var_3 ) > 0 ) - { - var_3 = var_6; - var_4 = var_5; - } - } - - if ( var_4 != var_2 ) - { - var_0[var_4] = var_0[var_2]; - var_0[var_2] = var_3; - } - } - - return var_0; -} - -is_later_in_alphabet( var_0, var_1 ) -{ - return stricmp( var_0, var_1 ) > 0; -} - -play_loop_sound_on_entity( var_0, var_1 ) -{ - var_2 = spawn( "script_origin", ( 0, 0, 0 ) ); - var_2 endon( "death" ); - thread delete_on_death( var_2 ); - - if ( isdefined( var_1 ) ) - { - var_2.origin = self.origin + var_1; - var_2.angles = self.angles; - var_2 linkto( self ); - } - else - { - var_2.origin = self.origin; - var_2.angles = self.angles; - var_2 linkto( self ); - } - - var_2 playloopsound( var_0 ); - self waittill( "stop sound" + var_0 ); - var_2 stoploopsound( var_0 ); - var_2 delete(); -} - -stop_loop_sound_on_entity( var_0 ) -{ - self notify( "stop sound" + var_0 ); -} - -delete_on_death( var_0 ) -{ - var_0 endon( "death" ); - self waittill( "death" ); - - if ( isdefined( var_0 ) ) - var_0 delete(); -} - -error( var_0 ) -{ - waitframe(); -} - -exploder( var_0, var_1, var_2 ) -{ - [[ level._fx.exploderfunction ]]( var_0, var_1, var_2 ); -} - -create_dvar( var_0, var_1 ) -{ - setdvarifuninitialized( var_0, var_1 ); -} - -void() -{ - -} - -tag_project( var_0, var_1 ) -{ - var_2 = self gettagorigin( var_0 ); - var_3 = self gettagangles( var_0 ); - var_4 = anglestoforward( var_3 ); - var_4 = vectornormalize( var_4 ) * var_1; - return var_2 + var_4; -} - -ter_op( var_0, var_1, var_2 ) -{ - if ( var_0 ) - return var_1; - - return var_2; -} - -create_lock( var_0, var_1 ) -{ - if ( !isdefined( var_1 ) ) - var_1 = 1; - - if ( !isdefined( level.lock ) ) - level.lock = []; - - var_2 = spawnstruct(); - var_2.max_count = var_1; - var_2.count = 0; - level.lock[var_0] = var_2; -} - -lock_exists( var_0 ) -{ - if ( !isdefined( level.lock ) ) - return 0; - - return isdefined( level.lock[var_0] ); -} - -lock( var_0 ) -{ - var_1 = level.lock[var_0]; - - while ( var_1.count >= var_1.max_count ) - var_1 waittill( "unlocked" ); - - var_1.count++; -} - -is_locked( var_0 ) -{ - var_1 = level.lock[var_0]; - return var_1.count > var_1.max_count; -} - -unlock_wait( var_0 ) -{ - thread unlock_thread( var_0 ); - wait 0.05; -} - -unlock( var_0 ) -{ - thread unlock_thread( var_0 ); -} - -unlock_thread( var_0 ) -{ - wait 0.05; - var_1 = level.lock[var_0]; - var_1.count--; - var_1 notify( "unlocked" ); -} - -get_template_level() -{ - var_0 = level.script; - - if ( isdefined( level.template_script ) ) - var_0 = level.template_script; - - return var_0; -} - -is_player_gamepad_enabled() -{ - if ( !level.console ) - { - var_0 = self usinggamepad(); - - if ( isdefined( var_0 ) ) - return var_0; - else - return 0; - } - - return 1; -} - -array_reverse( var_0 ) -{ - var_1 = []; - - for ( var_2 = var_0.size - 1; var_2 >= 0; var_2-- ) - var_1[var_1.size] = var_0[var_2]; - - return var_1; -} - -distance_2d_squared( var_0, var_1 ) -{ - return length2dsquared( var_0 - var_1 ); -} - -get_array_of_farthest( var_0, var_1, var_2, var_3, var_4, var_5 ) -{ - var_6 = get_array_of_closest( var_0, var_1, var_2, var_3, var_4, var_5 ); - var_6 = array_reverse( var_6 ); - return var_6; -} - -get_array_of_closest( var_0, var_1, var_2, var_3, var_4, var_5 ) -{ - if ( !isdefined( var_3 ) ) - var_3 = var_1.size; - - if ( !isdefined( var_2 ) ) - var_2 = []; - - var_6 = undefined; - - if ( isdefined( var_4 ) ) - var_6 = var_4 * var_4; - - var_7 = 0; - - if ( isdefined( var_5 ) ) - var_7 = var_5 * var_5; - - if ( var_2.size == 0 && var_3 >= var_1.size && var_7 == 0 && !isdefined( var_6 ) ) - return sortbydistance( var_1, var_0 ); - - var_8 = []; - - foreach ( var_10 in var_1 ) - { - var_11 = 0; - - foreach ( var_13 in var_2 ) - { - if ( var_10 == var_13 ) - { - var_11 = 1; - break; - } - } - - if ( var_11 ) - continue; - - var_15 = distancesquared( var_0, var_10.origin ); - - if ( isdefined( var_6 ) && var_15 > var_6 ) - continue; - - if ( var_15 < var_7 ) - continue; - - var_8[var_8.size] = var_10; - } - - var_8 = sortbydistance( var_8, var_0 ); - - if ( var_3 >= var_8.size ) - return var_8; - - var_17 = []; - - for ( var_18 = 0; var_18 < var_3; var_18++ ) - var_17[var_18] = var_8[var_18]; - - return var_17; -} - -drop_to_ground( var_0, var_1, var_2 ) -{ - if ( !isdefined( var_1 ) ) - var_1 = 1500; - - if ( !isdefined( var_2 ) ) - var_2 = -12000; - - return physicstrace( var_0 + ( 0, 0, var_1 ), var_0 + ( 0, 0, var_2 ) ); -} - -add_destructible_type_function( var_0, var_1 ) -{ - if ( !isdefined( level.destructible_functions ) ) - level.destructible_functions = []; - - level.destructible_functions[var_0] = var_1; -} - -add_destructible_type_transient( var_0, var_1 ) -{ - if ( !isdefined( level.destructible_transient ) ) - level.destructible_transient = []; - - level.destructible_transient[var_0] = var_1; -} - -within_fov( var_0, var_1, var_2, var_3 ) -{ - var_4 = vectornormalize( var_2 - var_0 ); - var_5 = anglestoforward( var_1 ); - var_6 = vectordot( var_5, var_4 ); - return var_6 >= var_3; -} - -entity_path_disconnect_thread( var_0 ) -{ - self notify( "entity_path_disconnect_thread" ); - self endon( "entity_path_disconnect_thread" ); - self endon( "death" ); - level endon( "game_ended" ); - var_1 = 0; - self.forcedisconnectuntil = 0; - - for (;;) - { - var_2 = self.origin; - var_3 = waittill_any_timeout( var_0, "path_disconnect" ); - var_4 = 0; - var_5 = distancesquared( self.origin, var_2 ) > 0; - - if ( var_5 ) - var_4 = 1; - - if ( isdefined( var_3 ) && var_3 == "path_disconnect" ) - var_4 = 1; - - if ( gettime() < self.forcedisconnectuntil ) - var_4 = 1; - - foreach ( var_7 in level.characters ) - { - if ( isai( var_7 ) && distancesquared( self.origin, var_7.origin ) < 250000 ) - { - var_4 = 1; - self.forcedisconnectuntil = max( gettime() + 30000, self.forcedisconnectuntil ); - } - } - - if ( var_4 != var_1 || var_5 ) - { - if ( var_4 ) - self disconnectpaths(); - else - self connectpaths(); - - var_1 = var_4; - } - } -} - -make_entity_sentient_mp( var_0, var_1 ) -{ - if ( level.gametype == "aliens" && isdefined( level.aliens_make_entity_sentient_func ) ) - return self [[ level.aliens_make_entity_sentient_func ]]( var_0, var_1 ); - - if ( isdefined( level.bot_funcs ) && isdefined( level.bot_funcs["bots_make_entity_sentient"] ) ) - return self [[ level.bot_funcs["bots_make_entity_sentient"] ]]( var_0, var_1 ); -} - -ai_3d_sighting_model( var_0 ) -{ - if ( isdefined( level.bot_funcs ) && isdefined( level.bot_funcs["ai_3d_sighting_model"] ) ) - return self [[ level.bot_funcs["ai_3d_sighting_model"] ]]( var_0 ); -} - -set_basic_animated_model( var_0, var_1, var_2 ) -{ - if ( !isdefined( level.anim_prop_models ) ) - level.anim_prop_models = []; - - var_3 = tolower( getdvar( "mapname" ) ); - var_4 = 1; - - if ( string_starts_with( var_3, "mp_" ) ) - var_4 = 0; - - if ( var_4 ) - level.anim_prop_models[var_0]["basic"] = var_1; - else - level.anim_prop_models[var_0]["basic"] = var_2; -} - -getclosest( var_0, var_1, var_2 ) -{ - if ( !isdefined( var_2 ) ) - var_2 = 500000; - - var_3 = undefined; - - foreach ( var_5 in var_1 ) - { - var_6 = distance( var_5.origin, var_0 ); - - if ( var_6 >= var_2 ) - continue; - - var_2 = var_6; - var_3 = var_5; - } - - return var_3; -} - -getfarthest( var_0, var_1, var_2 ) -{ - if ( !isdefined( var_2 ) ) - var_2 = 500000; - - var_3 = 0; - var_4 = undefined; - - foreach ( var_6 in var_1 ) - { - var_7 = distance( var_6.origin, var_0 ); - - if ( var_7 <= var_3 || var_7 >= var_2 ) - continue; - - var_3 = var_7; - var_4 = var_6; - } - - return var_4; -} - -missile_settargetandflightmode( var_0, var_1, var_2 ) -{ - var_2 = ter_op( isdefined( var_2 ), var_2, ( 0, 0, 0 ) ); - self missile_settargetent( var_0, var_2 ); - - switch ( var_1 ) - { - case "direct": - self missile_setflightmodedirect(); - break; - case "top": - self missile_setflightmodetop(); - break; - } -} - -add_fx( var_0, var_1 ) -{ - if ( !isdefined( level._effect ) ) - level._effect = []; - - level._effect[var_0] = loadfx( var_1 ); -} - -array_sort_by_handler( var_0, var_1 ) -{ - for ( var_2 = 0; var_2 < var_0.size - 1; var_2++ ) - { - for ( var_3 = var_2 + 1; var_3 < var_0.size; var_3++ ) - { - if ( var_0[var_3] [[ var_1 ]]() < var_0[var_2] [[ var_1 ]]() ) - { - var_4 = var_0[var_3]; - var_0[var_3] = var_0[var_2]; - var_0[var_2] = var_4; - } - } - } - - return var_0; -} - -array_sort_with_func( var_0, var_1 ) -{ - for ( var_2 = 1; var_2 < var_0.size; var_2++ ) - { - var_3 = var_0[var_2]; - - for ( var_4 = var_2 - 1; var_4 >= 0 && ![[ var_1 ]]( var_0[var_4], var_3 ); var_4-- ) - var_0[var_4 + 1] = var_0[var_4]; - - var_0[var_4 + 1] = var_3; - } - - return var_0; -} diff --git a/data/maps/mp/gametypes/_menus.gsc b/data/maps/mp/gametypes/_menus.gsc index 13180b7..4719fc2 100644 --- a/data/maps/mp/gametypes/_menus.gsc +++ b/data/maps/mp/gametypes/_menus.gsc @@ -312,7 +312,7 @@ showloadoutmenu() autoassign() { - if ( maps\mp\_utility::is_aliens() || level.gametype == "infect" ) + if ( maps\mp\_utility::is_aliens() ) thread setteam( "allies" ); else if ( ( getdvarint( "squad_match" ) == 1 || getdvarint( "squad_vs_squad" ) == 1 || getdvarint( "squad_use_hosts_squad" ) == 1 ) && isdefined( self.bot_team ) ) thread setteam( self.bot_team ); @@ -431,12 +431,6 @@ waitforclassselect() for (;;) { - if ( level.gametype == "infect" ) - { - bypassclasschoice(); - break; - } - if ( maps\mp\_utility::allowclasschoice() || maps\mp\_utility::showfakeloadout() && !isai( self ) ) self waittill( "luinotifyserver", var_0, var_1 ); else diff --git a/data/scripts/mp/_patches.gsc b/data/scripts/mp/_patches.gsc new file mode 100644 index 0000000..d43f862 --- /dev/null +++ b/data/scripts/mp/_patches.gsc @@ -0,0 +1,110 @@ +#include common_scripts\utility; + +main() +{ + replacefunc( maps\mp\gametypes\_rank::init, ::init_stub ); + replacefunc( maps\mp\gametypes\_rank::syncxpstat, ::syncxpstat_stub ); + + replacefunc( common_scripts\utility::set_trigger_flag_permissions, ::set_trigger_flag_permissions_stub ); +} + +init_stub() +{ + level.scoreinfo = []; + level.xpscale = getdvarint( "scr_xpscale" ); + + level.xpscale = max( level.xpscale, 1 ); + level.teamxpscale["axis"] = 1; + level.teamxpscale["allies"] = 1; + level.ranktable = []; + level.weaponranktable = []; + level.maxrank = int( tablelookup( "mp/rankTable.csv", 0, "maxrank", 1 ) ); + level.maxprestige = int( tablelookup( "mp/rankTable.csv", 0, "maxprestige", 1 ) ); + level.maxforbotmatch = getdvarint( "max_xp_per_match", 0 ); + var_0 = 0; + var_1 = 0; + + for ( var_0 = 0; var_0 <= min( 10, level.maxprestige ); var_0++ ) + { + for ( var_1 = 0; var_1 <= level.maxrank; var_1++ ) + precacheshader( tablelookup( "mp/rankIconTable.csv", 0, var_1, var_0 + 1 ) ); + } + + var_2 = 0; + + for ( var_3 = tablelookup( "mp/rankTable.csv", 0, var_2, 1 ); isdefined( var_3 ) && var_3 != ""; var_3 = tablelookup( "mp/rankTable.csv", 0, var_2, 1 ) ) + { + level.ranktable[var_2][1] = tablelookup( "mp/rankTable.csv", 0, var_2, 1 ); + level.ranktable[var_2][2] = tablelookup( "mp/rankTable.csv", 0, var_2, 2 ); + level.ranktable[var_2][3] = tablelookup( "mp/rankTable.csv", 0, var_2, 3 ); + level.ranktable[var_2][7] = tablelookup( "mp/rankTable.csv", 0, var_2, 7 ); + precachestring( tablelookupistring( "mp/rankTable.csv", 0, var_2, 16 ) ); + var_2++; + } + + var_4 = int( tablelookup( "mp/weaponRankTable.csv", 0, "maxrank", 1 ) ); + + for ( var_5 = 0; var_5 < var_4 + 1; var_5++ ) + { + level.weaponranktable[var_5][1] = tablelookup( "mp/weaponRankTable.csv", 0, var_5, 1 ); + level.weaponranktable[var_5][2] = tablelookup( "mp/weaponRankTable.csv", 0, var_5, 2 ); + level.weaponranktable[var_5][3] = tablelookup( "mp/weaponRankTable.csv", 0, var_5, 3 ); + } + + maps\mp\gametypes\_missions::buildchallegeinfo(); + level thread maps\mp\gametypes\_rank::patientzerowaiter(); + level thread maps\mp\gametypes\_rank::onplayerconnect(); +} + +syncxpstat_stub() +{ + var_0 = maps\mp\gametypes\_rank::getrankxp(); + var_1 = self.pers["activeSquadMember"]; + + /# + // Attempt to catch xp regression + old_xp = self getrankedplayerdata( "squadMembers", var_1, "squadMemXP" ); + assert( var_0 >= old_xp, "Attempted XP regression in syncXPStat - " + old_xp + " -> " + var_0 + " for player " + self.name ); + #/ + + self setrankedplayerdata( "squadMembers", var_1, "squadMemXP", var_0 ); + self setrankedplayerdata( "experience", var_0 ); + + if ( var_0 >= maps\mp\gametypes\_rank::getrankinfomaxxp( level.maxrank ) ) + { + var_3 = self getrankedplayerdata( "characterXP", var_1 ); + + if ( var_3 == 0 ) + { + var_4 = getsystemtime(); + self setrankedplayerdata( "characterXP", var_1, var_4 ); + var_5 = self getrankedplayerdatareservedint( "prestigeLevel" ); + var_6 = var_5 + 1; + self setrankedplayerdatareservedint( "prestigeLevel", var_6 ); + self setrank( level.maxrank, var_6 ); + thread maps\mp\gametypes\_hud_message::splashnotifyurgent( "prestige" + var_6 ); + var_7 = self.pers["team"]; + + for ( var_8 = 0; var_8 < level.players.size; var_8++ ) + { + var_9 = level.players[var_8]; + var_10 = var_9.pers["team"]; + + if ( isdefined( var_10 ) && var_9 != self ) + { + if ( var_10 == var_7 ) + var_9 iprintln( &"RANK_PLAYER_WAS_PROMOTED", self, &"MPUI_PRESTIGE" ); + } + } + } + } +} + +set_trigger_flag_permissions_stub( var_0 ) +{ + if ( !isdefined( level.trigger_flags ) || !isdefined( level.trigger_flags[var_0] ) ) + return; + + level.trigger_flags[var_0] = array_removeundefined( level.trigger_flags[var_0] ); + array_thread( level.trigger_flags[var_0], ::update_trigger_based_on_flags ); +} diff --git a/data/scripts/_team_balance.gsc b/data/scripts/mp/_team_balance.gsc similarity index 100% rename from data/scripts/_team_balance.gsc rename to data/scripts/mp/_team_balance.gsc diff --git a/data/ui_scripts/infect/__init__.lua b/data/ui_scripts/infect/__init__.lua new file mode 100644 index 0000000..a82f52a --- /dev/null +++ b/data/ui_scripts/infect/__init__.lua @@ -0,0 +1,556 @@ +f0_local0 = function ( f1_arg0, f1_arg1 ) + f1_arg0:processEvent( LUI.ButtonHelperText.CommonEvents.addBackButton ) +end + +f0_local1 = function ( f2_arg0, f2_arg1, f2_arg2 ) + Engine.NotifyServer( "class_select", f2_arg2 ) + LUI.FlowManager.RequestLeaveMenu( f2_arg0 ) +end + +f0_local2 = function ( f3_arg0, f3_arg1 ) + local f3_local0 = LUI.FlowManager.GetMenuScopedDataFromElement( f3_arg0 ) + if f3_local0.defaultLoadouts then + f3_arg0:dispatchEventToMenuRoot( { + name = "refresh_char_select_list", + defaultLoadouts = false + } ) + else + LUI.FlowManager.RequestLeaveMenu( f3_arg0 ) + end +end + +local f0_local3 = function ( f4_arg0, f4_arg1, f4_arg2 ) + local f4_local0 = GameX.GetGameMode() + if f4_local0 == "infect" and not Cac.IsClassInUse( f4_arg0, f4_arg1, f4_arg2, "defaultClassesTeam" .. Game.GetPlayerTeam(), 0 ) then + return true + elseif f4_local0 ~= "infect" and GameX.UsesFakeLoadout() then + return true + else + return false + end +end + +local f0_local4 = function ( f5_arg0 ) + if f5_arg0 == "infect" then + return true + else + + end +end + +local f0_local5 = function ( f6_arg0 ) + local f6_local0 = "" + if GameX.GetGameMode() == "infect" then + if f6_arg0 == Teams.allies then + f6_local0 = Engine.Localize( Engine.Localize( "LUA_MENU_MP_SURVIVOR_LOADOUT" ) ) + elseif f6_arg0 == Teams.axis then + f6_local0 = Engine.Localize( Engine.Localize( "LUA_MENU_MP_INFECTED_LOADOUT" ) ) + end + else + f6_local0 = Engine.Localize( "@LUA_MENU_DEFAULT_LOADOUT" ) + end + return f6_local0 +end + +local f0_local6 = function ( f7_arg0, f7_arg1 ) + if f7_arg1.value > -1 then + return + else + f7_arg0:dispatchEventToRoot( { + name = "toggle_pause_off" + } ) + LUI.FlowManager.RequestCloseAllMenus( f7_arg0 ) + end +end + +local f0_local7 = function ( f8_arg0, f8_arg1 ) + f8_arg0:dispatchEventToMenuRoot( { + name = "cac_set_slot", + slot = f8_arg0.properties.slot, + controller = f8_arg0.properties.controller, + classLocation = f8_arg0.properties.classLocation, + immediate = true + } ) + f8_arg0:processEvent( { + name = "hide_restrictions_icon" + } ) + f8_arg0:dispatchEventToMenuRoot( { + name = "refresh_specialist_abilities_recap", + controller = f8_arg0.properties.controller, + specialistType = Cac.GetPerk( f8_arg0.properties.controller, f8_arg0.properties.squadLocation, f8_arg0.properties.squadMemberIndex, f8_arg0.properties.classLocation, f8_arg0.properties.slot, Cac.Indices.StreakType ) == "streaktype_specialist", + selected = false, + immediate = true + } ) +end + +local f0_local8 = function ( f9_arg0, f9_arg1, f9_arg2, f9_arg3 ) + if GameX.GetGameMode() == "sd" or GameX.GetGameMode() == "sr" then + for f9_local0 = 0, Cac.GetNumCustomSlots( f9_arg0, f9_arg3 ) - 1, 1 do + if f9_local0 ~= 5 and Cac.IsClassInUse( f9_arg0, f9_arg1, f9_arg2, f9_arg3, f9_local0 ) then + return false + end + end + return true + else + + end +end + +function UpdateRestrictionsIcon( f10_arg0, f10_arg1 ) + local f10_local0 = f10_arg0:getParent() + if MatchRules.AllowCustomClasses( f10_arg0.properties.classLocation ) and MatchRules.CustomClassIsRestricted( f10_arg0.properties.controller, CoD.GetStatsGroupForGameMode(), f10_arg0.properties.squadLocation, f10_arg0.properties.squadMemberIndex, f10_arg0.properties.classLocation, f10_arg0.properties.slot ) then + f10_arg0:animateToState( "visible" ) + else + f10_arg0:animateToState( "default" ) + end +end + +function HideRestrictionsIcon( f11_arg0, f11_arg1 ) + if MatchRules.AllowCustomClasses( f11_arg0.properties.classLocation ) and MatchRules.CustomClassIsRestricted( f11_arg0.properties.controller, CoD.GetStatsGroupForGameMode(), f11_arg0.properties.squadLocation, f11_arg0.properties.squadMemberIndex, f11_arg0.properties.classLocation, f11_arg0.properties.slot ) then + f11_arg0:dispatchEventToMenuRoot( { + name = "show_class_restrictions_warning" + } ) + else + f11_arg0:dispatchEventToMenuRoot( { + name = "hide_class_restrictions_warning" + } ) + end + f11_arg0:animateToState( "default" ) +end + +local f0_local9 = function ( f12_arg0, f12_arg1, f12_arg2, f12_arg3, f12_arg4, f12_arg5, f12_arg6, f12_arg7 ) + local f12_local0 = Game.GetPlayerTeam() + if f12_local0 == Teams.free then + f12_local0 = Teams.allies + end + if Cac.IsDefaultClass( f12_arg3 ) then + f12_arg6 = f12_arg6 - Cac.Settings.DataLoc[f12_arg7].maxClassSlots + Cac.Settings.DataLoc[f12_arg3].maxClassSlots * (f12_local0 - 1) + end + local f12_local1 = { + type = "UIGenericButton", + id = "btn_MPLoadout_" .. f12_arg3 .. f12_arg4, + disabledFunc = function ( f13_arg0, f13_arg1 ) + local f13_local0 = Cac.IsCaCSlotLocked( f12_arg0, f12_arg1, f12_arg2, f12_arg3, f12_arg4 ) + if not f13_local0 then + f13_local0 = Cac.IsCaCSlotRestricted( f12_arg0, f12_arg1, f12_arg2, f12_arg3, f12_arg4 ) + end + return f13_local0 + end + } + local f12_local2 = { + childNum = f12_arg4 + 1, + squadLocation = f12_arg1, + squadMemberIndex = f12_arg2, + classLocation = f12_arg3, + slot = f12_arg4, + controller = f12_arg0, + button_text = f12_arg5, + button_action_func = function ( f14_arg0, f14_arg1 ) + local f14_local0 = f12_arg4 + if Cac.IsDefaultClass( f14_arg0.properties.classLocation ) and f12_arg7 then + f14_local0 = f14_local0 + Cac.Settings.DataLoc[f12_arg7].maxClassSlots + Cac.Settings.DataLoc[f12_arg3].maxClassSlots * (f12_local0 - 1) + end + Engine.ExecNow( "set current_class_location " .. f12_arg3 ) + Engine.NotifyServer( "class_select", f14_local0 ) + local f14_local1 = MBh.EmitEventToRoot( "toggle_pause_off" ) + f14_local1( f14_arg0 ) + LUI.FlowManager.RequestCloseAllMenus( f14_arg0 ) + end, + button_over_func = f0_local7, + button_over_disable_func = f0_local7, + button_up_func = MBh.EmitEvent( { + name = "show_restrictions_icon" + } ) + } + if f12_arg6 == f12_arg4 then + local f12_local3 = Engine.GetDvarString( "current_class_location" ) + local f12_local4 = Colors.yellow + end + f12_local2.text_default_color = f12_local3 and f12_local4 or Colors.generic_button_text_default_color + f12_local1.properties = f12_local2 + f12_local1.handlers = { + menu_create = function ( f15_arg0, f15_arg1 ) + f15_arg0.listDefaultFocus = f12_arg6 == f12_arg4 + end, + button_disable = MBh.EmitEvent( { + name = "show_restrictions_icon" + } ) + } + f12_local1.children = { + { + type = "UIImage", + id = "weapon_restriction_icon", + states = { + default = { + rightAnchor = true, + leftAnchor = false, + topAnchor = false, + bottomAnchor = true, + right = 32, + bottom = -7, + width = 32, + height = 32, + material = RegisterMaterial( "icon_new_3" ), + alpha = 0 + }, + visible = { + alpha = 1 + } + }, + properties = { + controller = MBh.Property( "controller" ), + squadLocation = MBh.Property( "squadLocation" ), + squadMemberIndex = MBh.Property( "squadMemberIndex" ), + classLocation = MBh.Property( "classLocation" ), + slot = MBh.Property( "slot" ) + }, + handlers = { + hide_restrictions_icon = HideRestrictionsIcon, + show_restrictions_icon = UpdateRestrictionsIcon, + menu_create = UpdateRestrictionsIcon + } + } + } + return f12_local1 +end + +local f0_local10 = function ( f16_arg0, f16_arg1 ) + local f16_local0 = f16_arg0.exclusiveController + if not f16_local0 then + DebugPrint( "[WARNING] CAC: using controller index 0, this is only ok if you are editing a menu" ) + f16_local0 = 0 + end + local f16_local1 = Cac.Settings.DataLoc.privateMatchSquadMembers.maxClassSlots + if Engine.UsingSplitscreenUpscaling() then + local f16_local2 = f16_local1 + end + local self = LUI.UIElement.new( { + topAnchor = true, + leftAnchor = true, + bottomAnchor = false, + rightAnchor = false, + top = GenericMenuDims.menu_top, + left = GenericMenuDims.menu_left, + height = GenericButtonSettings.Styles.GradientButton.height * (f16_local2 or f16_local1 * 2 + 1), + right = GenericMenuDims.menu_right, + alignment = LUI.Alignment.Top + } ) + self:setUseStencil( true ) + local f16_local4 = LUI.UIVerticalList.new( { + topAnchor = true, + leftAnchor = true, + bottomAnchor = true, + rightAnchor = true, + alignment = LUI.Alignment.Top + }, true ) + f16_local4.id = "change_loadout_selections_id" + f16_local4:makeFocusable() + local f16_local5 = Cac.GetCustomClassLoc( "loadouts" ) + local f16_local6 = Cac.GetSquadLoc() + local f16_local7 = Cac.GetActiveSquadMember( f16_local0 ) + local f16_local8 = Game.GetOmnvar( "ui_loadout_selected" ) + local f16_local9 = Game.GetPlayerTeam() + local f16_local10 = f0_local5( f16_local9 ) + if f0_local3( f16_local0, f16_local6, f16_local7 ) then + LUI.MenuBuilder.BuildAddChild( f16_local4, { + type = "UIGenericButton", + id = "btn_fakeLoadout", + properties = { + childNum = 1, + button_text = f16_local10, + button_action_func = function ( f17_arg0, f17_arg1 ) + Engine.NotifyServer( "class_select", 0 ) + local f17_local0 = MBh.EmitEventToRoot( "toggle_pause_off" ) + f17_local0( f17_arg0 ) + LUI.FlowManager.RequestCloseAllMenus( f17_arg0 ) + end, + text_default_color = Colors.yellow + } + } ) + else + if not f16_arg1 and GameX.GetGameMode() ~= "infect" then + for f16_local11 = 0, Cac.GetNumCustomSlots( f16_local0, "loadouts" ) - 1, 1 do + LUI.MenuBuilder.BuildAddChild( f16_local4, f0_local9( f16_local0, f16_local6, f16_local7, f16_local5, f16_local11, Cac.GetLoadoutName( f16_local0, f16_local6, f16_local7, f16_local5, f16_local11 ), f16_local8 ) ) + end + end + local f16_local11 = "defaultClassesTeam" .. Game.GetPlayerTeam() + if f16_local11 == "defaultClassesTeam0" then + f16_local11 = "defaultClassesTeam2" + end + if Cac.HasCustomClasses( f16_local0, f16_local6, f16_local7, f16_local11 ) and not f0_local8( f16_local0, f16_local6, f16_local7, f16_local11 ) then + if not f16_arg1 and GameX.GetGameMode() ~= "infect" then + LUI.MenuBuilder.BuildAddChild( f16_local4, { + type = "UIImage", + id = "dividing_line", + states = { + default = { + leftAnchor = true, + rightAnchor = false, + topAnchor = true, + bottomAnchor = false, + left = 8, + right = 450, + top = 0, + bottom = 2, + material = RegisterMaterial( "white" ), + alpha = 0.3 + } + } + } ) + LUI.MenuBuilder.BuildAddChild( f16_local4, { + type = "UIImage", + id = "dividing_spacer", + states = { + default = { + leftAnchor = true, + rightAnchor = true, + topAnchor = true, + bottomAnchor = false, + left = 0, + right = 0, + top = 0, + height = 5, + alpha = 0 + } + } + } ) + LUI.MenuBuilder.BuildAddChild( f16_local4, { + type = "UIGenericButton", + id = "default_loadouts_btn", + properties = { + squadLocation = f16_local6, + squadMemberIndex = f16_local7, + classLocation = f16_local11, + slot = Cac.GetFirstCustomClass( f16_local0, f16_local6, f16_local7, f16_local11 ), + controller = f16_local0, + button_text = Engine.Localize( "@LUA_MENU_DEFAULT_CLASSES" ), + button_action_func = function ( f18_arg0, f18_arg1 ) + f18_arg0:dispatchEventToMenuRoot( { + name = "refresh_char_select_list", + defaultLoadouts = true + } ) + end, + text_default_color = Cac.Settings.DataLoc[f16_local5].maxClassSlots and Colors.yellow or Colors.generic_button_text_default_color, + button_over_func = f0_local7 + } + } ) + else + for f16_local12 = 0, Cac.GetNumCustomSlots( f16_local0, f16_local11 ) - 1, 1 do + if Cac.IsClassInUse( f16_local0, f16_local6, f16_local7, f16_local11, f16_local12 ) then + if (GameX.GetGameMode() == "sd" or GameX.GetGameMode() == "sr") and f16_local12 == 5 then + break + end + local f16_local15 = Cac.GetLoadoutName( f16_local0, f16_local6, f16_local7, f16_local11, f16_local12 ) + if GameX.GetGameMode() == "infect" then + if f16_local9 == Teams.allies and f16_local12 == 0 then + f16_local15 = Engine.Localize( "LUA_MENU_MP_SURVIVOR_LOADOUT" ) + elseif f16_local9 == Teams.axis and f16_local12 == 0 then + f16_local15 = Engine.Localize( "LUA_MENU_MP_INFECTED_LOADOUT" ) + elseif f16_local9 == Teams.axis and f16_local12 == 1 then + break + end + end + LUI.MenuBuilder.BuildAddChild( f16_local4, f0_local9( f16_local0, f16_local6, f16_local7, f16_local11, f16_local12, f16_local15, f16_local8, f16_local5 ) ) + end + end + end + end + end + self:addElement( f16_local4 ) + return self +end + +local f0_local11 = function () + local self = LUI.UIElement.new() + self.id = "class_restrictions_warning" + self:registerAnimationState( "default", { + leftAnchor = false, + rightAnchor = true, + topAnchor = true, + bottomAnchor = false, + top = 54, + right = -100, + width = 500, + height = 28, + alpha = 0 + } ) + self:registerAnimationState( "visible", { + alpha = 1 + } ) + self:animateToState( "default" ) + self:registerEventHandler( "show_class_restrictions_warning", function ( element, event ) + element:animateToState( "visible" ) + return true + end ) + self:registerEventHandler( "hide_class_restrictions_warning", function ( element, event ) + element:animateToState( "default" ) + return true + end ) + local f19_local1 = LUI.UIImage.new() + f19_local1.id = "class_restrictions_warning_icon" + f19_local1:registerAnimationState( "default", { + leftAnchor = false, + rightAnchor = true, + topAnchor = true, + bottomAnchor = false, + right = 0, + top = 2, + width = 28, + height = 28, + material = RegisterMaterial( "icon_new_3" ), + alpha = 1 + } ) + f19_local1:animateToState( "default" ) + self:addElement( f19_local1 ) + local f19_local2 = LUI.UIText.new() + f19_local2.id = "class_restrictions_warning_text" + f19_local2:setText( Engine.Localize( "PATCH_MENU_ITEM_RESTRICTED" ) ) + f19_local2:registerAnimationState( "default", CoD.ColorizeState( Colors.orange, { + leftAnchor = true, + rightAnchor = true, + topAnchor = true, + bottomAnchor = false, + font = CoD.TextSettings.NormalFont.Font, + left = 0, + right = -35, + top = 5, + bottom = 5 + CoD.TextSettings.NormalFont.Height, + alignment = LUI.Alignment.Right + } ) ) + f19_local2:animateToState( "default" ) + self:addElement( f19_local2 ) + return self +end + +local f0_local12 = function ( f22_arg0 ) + local self = LUI.UIElement.new() + self.id = "change_loadout_display_id" + self:registerAnimationState( "default", { + topAnchor = true, + leftAnchor = true, + bottomAnchor = true, + rightAnchor = true, + top = 0, + left = 130, + bottom = 0, + right = 0, + alpha = 1 + } ) + self:animateToState( "default", 0 ) + self:registerEventHandler( "menu_create", function ( element, event ) + element:disableTreeFocus() + end ) + local f22_local1 = "defaultClassesTeam" .. Game.GetPlayerTeam() + local f22_local2 = GameX.GetGameMode() + local f22_local3 = LUI.MenuBuilder.BuildRegisteredType + local f22_local4 = "cac_recap" + local f22_local5 = { + exclusiveController = f22_arg0.exclusiveController, + squad_location = Cac.GetSquadLoc(), + member_index = Cac.GetActiveSquadMember( f22_arg0.exclusiveController ) + } + if f0_local4( f22_local2 ) then + local f22_local6 = f22_local1 + end + f22_local5.class_location = f22_local6 or Cac.GetCustomClassLoc( "loadouts" ) + f22_local5.loadout_slot = 0 + f22_local3 = f22_local3( f22_local4, f22_local5 ) + f22_local3.id = "change_loadout_recap_id" + self:addElement( f22_local3 ) + if Engine.UsingSplitscreenUpscaling() then + f22_local4 = {} + f22_local4 = GameX.GetSafeZoneSize() + f22_local5 = {} + f22_local5 = f22_local3:getLocalRect() + f22_local3:registerAnimationState( "default", { + topAnchor = true, + bottomAnchor = false, + rightAnchor = true, + leftAnchor = false, + top = f22_local5[2], + bottom = f22_local5[4], + right = f22_local4[3], + width = f22_local5[3] - f22_local5[1] + } ) + f22_local3:animateToState( "default", 0 ) + end + return self +end + +LUI.MenuBuilder.m_types["class_select_main"] = function ( f24_arg0, f24_arg1, f24_arg2 ) + local f24_local0 = Engine.Localize( "@LUA_MENU_CHOOSE_CLASS_CAPS" ) + local self = LUI.UIElement.new() + self.id = "mp_change_loadout_id" + self:registerAnimationState( "default", { + topAnchor = true, + leftAnchor = true, + bottomAnchor = true, + rightAnchor = true, + top = 0, + left = 0, + bottom = 0, + right = 0, + alpha = 1 + } ) + self:animateToState( "default", 0 ) + self:registerEventHandler( "menu_create", f0_local0 ) + self:registerOmnvarHandler( "ui_pause_menu_show", LUI.mp_hud.OptionsMenu.pauseMenuUpdate ) + self:registerOmnvarHandler( "ui_options_menu", f0_local6 ) + local f24_local2 = LUI.UIElement.new( { + worldBlur = 5 + } ) + f24_local2:setupWorldBlur() + f24_local2.id = "csWorldBlurOverlay" + self:addElement( f24_local2 ) + self:addElement( LUI.mp_hud.OptionsMenu.mp_pause_menu_background_def() ) + LUI.MenuBuilder.BuildAddChild( self, { + type = "button_helper_text_main", + id = "cshelper_text_id" + } ) + if GameX.IsOnlineMatch() and not GameX.IsSplitscreen() then + local f24_local3 = LUI.MenuBuilder.BuildRegisteredType( "online_friends_widget" ) + f24_local3.id = "csfriends_widget_id" + self:addElement( f24_local3 ) + end + local f24_local3 = LUI.UIBindButton.new() + f24_local3.id = "clBackToGameStartButton" + f24_local3:registerEventHandler( "button_start", f0_local2 ) + f24_local3:registerEventHandler( "button_secondary", f0_local2 ) + self:addElement( f0_local11() ) + self:addElement( LUI.mp_hud.OptionsMenu.mp_pause_menu_title_def( f24_local0 ) ) + self:addElement( f24_local3 ) + self:addElement( f0_local12( f24_arg1 ) ) + local f24_local4 = LUI.UITimer.new( 250, { + name = "menuCreationTimer" + }, nil, true, self, false ) + f24_local4.id = "updateTimer" + self:addElement( f24_local4 ) + self:registerEventHandler( "menuCreationTimer", function ( element, event ) + element.listOfLoadouts = f0_local10( f24_arg1 ) + self:addElement( element.listOfLoadouts ) + element.listOfLoadouts:processEvent( { + name = "gain_focus" + } ) + end ) + self:registerEventHandler( "refresh_char_select_list", function ( element, event ) + local f26_local0 = LUI.FlowManager.GetMenuScopedDataFromElement( element ) + f26_local0.defaultLoadouts = event.defaultLoadouts + local f26_local1 = nil + if event.defaultLoadouts then + f26_local1 = Engine.Localize( "@PATCH_MENU_DEFAULT_CLASSES_CAPS" ) + else + f26_local1 = Engine.Localize( "@LUA_MENU_CHOOSE_CLASS_CAPS" ) + end + element:dispatchEventToMenuRoot( { + name = "update_header_text", + string = f26_local1 + } ) + element.listOfLoadouts:close() + element.listOfLoadouts = f0_local10( f24_arg1, event.defaultLoadouts ) + self:addElement( element.listOfLoadouts ) + element.listOfLoadouts:processEvent( { + name = "gain_focus" + } ) + end ) + return self +end diff --git a/data/ui_scripts/main_menu/__init__.lua b/data/ui_scripts/main_menu/__init__.lua index 5ac99e6..19d5ac5 100644 --- a/data/ui_scripts/main_menu/__init__.lua +++ b/data/ui_scripts/main_menu/__init__.lua @@ -40,6 +40,10 @@ local SquadsModeButtonAction = function( f4_arg1 , f4_arg0) end end +local ModsMenuButtonAction = function() + LUI.FlowManager.RequestAddMenu( nil, "mods_menu", false, controller, false ) +end + local main_menu_options_feeder = function( f17_arg0 ) local f17_local0 = Engine.IsAliensMode() local f17_local1 = SvS.IsSvS() @@ -122,6 +126,20 @@ local main_menu_options_feeder = function( f17_arg0 ) end } } + f17_local6[#f17_local6 + 1] = { + type = "UIGenericButton", + id = "btn_MPMain_10", + disabled = f17_local3, + disabledFunc = Engine.DoWeNeedCompatibilityPacks, + properties = { + button_text = "MODS", + button_action_func = ModsMenuButtonAction, + desc_text = "Load Mods", + button_over_func = function ( f18_arg0, f18_arg1 ) + PersistentBackground.SetToDefault() + end + } + } f17_local6[#f17_local6 + 1] = { type = "generic_separator", id = "main_menu_spacer_id" diff --git a/data/ui_scripts/menu_mods/__init__.lua b/data/ui_scripts/menu_mods/__init__.lua new file mode 100644 index 0000000..c76f563 --- /dev/null +++ b/data/ui_scripts/menu_mods/__init__.lua @@ -0,0 +1,139 @@ +function ModFeeder( f1_arg0 ) + local mod_buttons = {} + if (not directoryexists("mods")) then + return mod_buttons + end + + local mods = listfiles("mods/") + for i = 1, #mods do + local mod_button = nil + local mod_path = mods[i] + local mod_name = mod_path:gsub("mods/", "") + if (directoryexists(mods[i]) and not directoryisempty(mods[i])) then + mod_button = { + type = "UIGenericButton", + id = "mod_button_" .. i, + properties = { + button_text = mod_name, + button_action_func = MBh.EmitEventToRoot( { + name = "select_mod", + modtoload = mod_path + } ) + } + } + end + mod_buttons[#mod_buttons + 1] = mod_button + end + return mod_buttons +end + +function SelectMod( f6_arg0, f6_arg1 ) + Engine.Exec("loadmod " .. f6_arg1.modtoload) +end + +function UnloadMod() + Engine.Exec("unloadmod") +end + +function BackButtonFunc( f13_arg0 ) + LUI.FlowManager.RequestLeaveMenu( f13_arg0 ) +end + +function ModsMenuButtons( f2_arg0 ) + f2_arg0:dispatchEventToRoot( { + name = "add_button_helper_text", + button_ref = "button_secondary", + helper_text = Engine.Localize( "@LUA_MENU_BACK" ), + side = "left", + clickable = true, + immediate = true + } ) + f2_arg0:dispatchEventToRoot( { + name = "add_button_helper_text", + button_ref = "button_action", + helper_text = Engine.Localize( "@LUA_MENU_SELECT" ), + side = "left", + clickable = true, + immediate = true + } ) + f2_arg0:dispatchEventToRoot( { + name = "add_button_helper_text", + button_ref = "button_alt1", + helper_text = "Unload Mod", + side = "left", + clickable = true, + immediate = true + } ) +end + +function mods_menu() + return { + type = "UIElement", + id = "mods_menu_root", + properties = { + menu_title = "MODS", + rotationAllowed = false + }, + states = { + default = { + topAnchor = true, + bottomAnchor = true, + leftAnchor = true, + rightAnchor = true, + top = 0, + bottom = 0, + left = 0, + right = 0 + } + }, + handlers = { + menu_create = ModsMenuButtons, + select_mod = SelectMod + }, + children = { + { + type = "generic_menu_title", + id = "mod_menu_title", + properties = { + menu_title = MBh.Property( "menu_title" ) + } + }, + { + type = "UIScrollingVerticalList", + id = "modlist", + childrenFeeder = ModFeeder, + properties = { + use_arrows = true, + use_scrollbar = false, + bar_width = 20 + }, + states = { + default = { + leftAnchor = true, + rightAnchor = false, + topAnchor = true, + bottomAnchor = false, + left = GenericMenuDims.menu_left, + right = GenericMenuDims.menu_right, + top = GenericMenuDims.menu_top, + bottom = GenericMenuDims.menu_top + GenericButtonSettings.Styles.GradientButton.height * 11 + 2 + 60 + } + } + }, + { + type = "UIBindButton", + id = "mods_menu_bindbuttons", + handlers = { + button_secondary = BackButtonFunc, + button_alt1 = UnloadMod + } + }, + { + type = "button_helper_text_main", + id = "mods_menu_button_helper_text_id" + } + } + } +end + +LUI.MenuBuilder.registerDef( "mods_menu", mods_menu )