From c83a9abfb05d482e1a4efd72d389a4f4db587ff0 Mon Sep 17 00:00:00 2001 From: diamante0018 Date: Wed, 21 May 2025 18:37:50 +0200 Subject: [PATCH] feat: add dev script --- .gitea/workflows/lint.yml | 1 + raw/maps/mp/gametypes/_dev.gsc | 2929 ++++++++++++++++++++++++++ raw/maps/mp/gametypes/_gamelogic.gsc | 2650 +++++++++++++++++++++++ 3 files changed, 5580 insertions(+) create mode 100644 raw/maps/mp/gametypes/_dev.gsc create mode 100644 raw/maps/mp/gametypes/_gamelogic.gsc diff --git a/.gitea/workflows/lint.yml b/.gitea/workflows/lint.yml index a3a9aa3..99401d6 100644 --- a/.gitea/workflows/lint.yml +++ b/.gitea/workflows/lint.yml @@ -19,3 +19,4 @@ jobs: run: | cd ${{ github.workspace }} gsc-tool --dry -m parse -g iw5 -s pc "raw/scripts" + gsc-tool --dry -m comp -g iw5 -s pc "raw/maps" diff --git a/raw/maps/mp/gametypes/_dev.gsc b/raw/maps/mp/gametypes/_dev.gsc new file mode 100644 index 0000000..aad8219 --- /dev/null +++ b/raw/maps/mp/gametypes/_dev.gsc @@ -0,0 +1,2929 @@ +// IW5 GSC SOURCE +// Generated by https://github.com/xensik/gsc-tool + +init() +{ + /# + setdevdvarifuninitialized( "scr_showspawns", "0" ); + precacheitem( "defaultweapon_mp" ); + precachemodel( "test_sphere_silver" ); + precachemodel( "test_sphere_redchrome" ); + level.devspawnfxid = loadfx( maps\mp\gametypes\_teams::getteamflagfx( "axis" ) ); + thread addtestclients(); + thread havetestclientkillplayer(); + thread havetestclientcallkillstreak(); + thread havetestclientplantexplosive(); + thread havetestclientthrowdeployablevest(); + thread addtestclientjuggernaut(); + thread addtestclientspawnpoint(); + thread warpenemies(); + thread warpfriendlies(); + thread giveequipment(); + thread givespecialgrenade(); + thread watchnoclip(); + thread watchufo(); + thread printperks(); + thread devgiveperks(); + thread devclearperks(); + thread devhurtplayer(); + thread devhurtplayerreset(); + thread devhurtplayerdirectional(); + thread devchangetimelimit(); + thread devweaponxp(); + thread devplayerxp(); + thread devscriptmoversdebugdraw(); + thread devhelipathdebugdraw(); + thread devpredatormissiledebugdraw(); + thread devprintdailyweeklychallenges(); + setdevdvarifuninitialized( "scr_testclients", "0" ); + setdevdvarifuninitialized( "scr_testclients_killplayer", "0" ); + setdevdvarifuninitialized( "scr_testclients_givekillstreak", "" ); + setdevdvarifuninitialized( "scr_testclients_givekillstreak_toggleall", "0" ); + setdevdvarifuninitialized( "scr_testclients_givekillstreak_toggleall_sametime", "0" ); + setdevdvarifuninitialized( "scr_testclients_plantexplosive", "" ); + setdevdvarifuninitialized( "scr_testclients_throw_deployable_vest", "0" ); + setdevdvarifuninitialized( "scr_testclients_jugg", "" ); + setdevdvarifuninitialized( "scr_testclients_spawnpoint", "0" ); + setdevdvarifuninitialized( "scr_warpenemies", "0" ); + setdevdvarifuninitialized( "scr_warpfriendlies", "0" ); + setdevdvarifuninitialized( "scr_debuguav", "0" ); + setdevdvarifuninitialized( "scr_debugairstrike", "0" ); + setdevdvarifuninitialized( "scr_printperks", "0" ); + setdevdvarifuninitialized( "scr_devnoclip", "0" ); + setdevdvarifuninitialized( "scr_devufo", "0" ); + setdevdvarifuninitialized( "scr_devgiveperk", "" ); + setdevdvarifuninitialized( "scr_devgivedeathstreak", "0" ); + setdevdvarifuninitialized( "scr_devdeathstreakoverride", "specialty_null" ); + setdevdvarifuninitialized( "scr_devclearperks", "0" ); + setdevdvarifuninitialized( "scr_devhurtplayer", "0" ); + setdevdvarifuninitialized( "scr_devhurtplayerreset", "0" ); + setdevdvarifuninitialized( "scr_devhurtplayerdirectional", "" ); + setdevdvarifuninitialized( "scr_dir_blood", "0" ); + setdevdvarifuninitialized( "scr_devchangetimelimit", "0" ); + setdevdvarifuninitialized( "scr_devweaponxp", "0" ); + setdevdvarifuninitialized( "scr_devresetweaponxp", "0" ); + setdevdvarifuninitialized( "scr_devplayerxp", "0" ); + setdevdvarifuninitialized( "scr_devScriptMoversDebugDraw", "0" ); + setdevdvarifuninitialized( "scr_devHeliPathsDebugDraw", "0" ); + setdevdvarifuninitialized( "scr_devPredatorMissileDebugDraw", "0" ); + setdevdvarifuninitialized( "scr_devPrintDailyWeeklyChallenges", "" ); + setdevdvar( "scr_givspecialgrenade", "" ); + setdevdvar( "scr_giveequipment", "" ); + setdevdvar( "scr_list_weapons", "" ); + setdevdvar( "scr_givekillstreak", "" ); + setdevdvar( "scr_devgivecarepackage", "" ); + setdevdvar( "scr_devgivecarepackagetype", "" ); + setdevdvar( "scr_useGambit", "" ); + setdevdvar( "scr_predatorme", "" ); + setdevdvar( "scr_setdefcon", "" ); + setdevdvar( "scr_showcard", "" ); + setdevdvar( "scr_showoutcome", "" ); + setdevdvar( "scr_enemykillhost", "" ); + setdevdvar( "scr_giveperk", "" ); + setdevdvar( "scr_takeperk", "" ); + setdevdvar( "scr_sre", "" ); + setdevdvar( "scr_testmigration", "" ); + setdevdvar( "scr_show_splash", "" ); + setdevdvar( "scr_spam_splashes", "" ); + setdevdvar( "scr_spam_usedsplash", "" ); + setdevdvar( "scr_spam_eventsplash", "" ); + setdevdvar( "scr_spam_boteventsplash", "" ); + setdevdvar( "scr_spam_ranksplash", "" ); + setdevdvar( "scr_spam_weaponranksplash", "" ); + setdevdvar( "scr_show_endgameupdate", "" ); + setdevdvar( "scr_goto_spawn", "" ); + setdevdvar( "scr_showOrigin", "" ); + setdevdvar( "scr_forceEnd", "" ); + level.baseweaponlist = maps\mp\gametypes\_weapons::buildweapondata( 1 ); + setdevdvarifuninitialized( "debug_reflection", "0" ); + level thread onplayerconnect(); + + for (;;) + { + wait 0.05; + updatedevsettings(); + } + #/ +} + +/# +updatedevsettings() +{ + var_0 = getdvarint( "scr_showspawns" ); + + if ( var_0 > 1 ) + var_0 = 1; + else if ( var_0 < 0 ) + var_0 = 0; + + if ( !isdefined( level.showspawns ) || level.showspawns != var_0 ) + { + level.showspawns = var_0; + setdevdvar( "scr_showspawns", level.showspawns ); + + if ( level.showspawns ) + showspawnpoints(); + else + hidespawnpoints(); + } + + updateminimapsetting(); + + if ( getdvar( "scr_test_weapon" ) != "" ) + { + foreach ( var_2 in level.players ) + { + var_2 thread initforweapontests(); + var_2 settestweapon( getdvar( "scr_test_weapon" ) ); + } + + setdevdvar( "scr_test_weapon", "" ); + } + + if ( getdvar( "scr_dump_ranks" ) != "" ) + { + setdevdvar( "scr_dump_ranks", "" ); + + for ( var_4 = 0; var_4 <= level.maxrank; var_4++ ) + { + var_5 = tablelookupistring( "mp/rankTable.csv", 0, var_4, 5 ); + iprintln( "REFERENCE UNLOCKED_AT_LV" + ( var_4 + 1 ) ); + iprintln( "LANG_ENGLISH Unlocked at ", var_5, " (Lv" + ( var_4 + 1 ) + ")" ); + wait 0.05; + } + } + + if ( getdvar( "scr_list_weapons" ) != "" ) + { + foreach ( var_8, var_7 in level.baseweaponlist ) + iprintln( var_8 ); + + setdevdvar( "scr_list_weapons", "" ); + } + + if ( getdvarint( "scr_setdefcon" ) != 0 ) + { + maps\mp\_defcon::updatedefcon( getdvarint( "scr_setdefcon" ) ); + setdevdvar( "scr_setdefcon", "" ); + } + + if ( getdvar( "scr_givekillstreak" ) != "" ) + { + var_9 = getdvar( "scr_givekillstreak" ); + var_10 = 0; + var_11 = undefined; + + if ( var_9 == "emp_quick" ) + { + var_10 = 1; + var_11 = getdvarfloat( "scr_emp_timeout" ); + var_9 = "emp"; + setdevdvar( "scr_emp_timeout", 1.0 ); + } + + if ( var_9 == "juggernaut" || var_9 == "juggernaut_recon" ) + { + if ( level.players[0] maps\mp\_utility::isjuggernaut() ) + { + level.players[0] notify( "lost_juggernaut" ); + wait 0.05; + } + + level.players[0] thread maps\mp\killstreaks\_juggernaut::givejuggernaut( var_9 ); + } + else if ( isdefined( level.killstreakfuncs[var_9] ) && tablelookup( "mp/killstreakTable.csv", 1, var_9, 0 ) != "" ) + { + foreach ( var_2 in level.players ) + { + if ( isdefined( var_2.pers["isBot"] ) && var_2.pers["isBot"] ) + continue; + + if ( var_2.team != "spectator" ) + var_2 maps\mp\killstreaks\_killstreaks::givekillstreak( var_9 ); + } + } + else + { + println( "\"" + getdvar( "scr_givekillstreak" ) + "\" is not a valid value for scr_givekillstreak. Try:" ); + + foreach ( var_16, var_15 in level.killstreakfuncs ) + { + if ( tablelookup( "mp/killstreakTable.csv", 1, var_16, 0 ) != "" ) + println( " " + var_16 ); + } + + println( "" ); + } + + if ( var_10 ) + level thread waitresetdvar( 5.0, "scr_emp_timeout", var_11 ); + + setdevdvar( "scr_givekillstreak", "" ); + } + + if ( getdvarint( "scr_devgivedeathstreak" ) > 0 ) + { + var_9 = getdvar( "scr_devdeathstreakoverride" ); + + foreach ( var_2 in level.players ) + { + if ( isdefined( var_2.pers["isBot"] ) && var_2.pers["isBot"] ) + continue; + + if ( var_2.team == "spectator" ) + continue; + + var_2.pers["cur_death_streak"] = int( tablelookup( "mp/perkTable.csv", 1, var_9, 6 ) ); + setdevdvar( "scr_testclients_killplayer", 1 ); + } + + setdevdvar( "scr_devgivedeathstreak", 0 ); + } + + if ( getdvar( "scr_devgivecarepackage" ) != "" ) + { + var_9 = getdvar( "scr_devgivecarepackage" ); + var_19 = getdvar( "scr_devgivecarepackagetype" ); + + if ( isdefined( level.killstreakfuncs[var_9] ) && tablelookup( "mp/killstreakTable.csv", 1, var_9, 0 ) != "" || var_9 == "random" ) + { + foreach ( var_2 in level.players ) + { + if ( isdefined( var_2.pers["isBot"] ) && var_2.pers["isBot"] ) + continue; + + if ( var_2.team != "spectator" ) + var_2 maps\mp\killstreaks\_killstreaks::givekillstreak( "airdrop_assault" ); + + if ( var_9 != "random" ) + { + setdevdvar( "scr_crateOverride", var_9 ); + setdevdvar( "scr_crateTypeOverride", var_19 ); + continue; + } + + setdevdvar( "scr_crateOverride", "" ); + setdevdvar( "scr_crateTypeOverride", "" ); + } + } + else + { + println( "\"" + getdvar( "scr_devgivecarepackage" ) + "\" is not a valid value for scr_devgivecarepackage. Try:" ); + + foreach ( var_16, var_15 in level.killstreakfuncs ) + { + if ( tablelookup( "mp/killstreakTable.csv", 1, var_16, 0 ) != "" ) + println( " " + var_16 ); + } + + println( "" ); + } + + setdevdvar( "scr_devgivecarepackage", "" ); + setdevdvar( "scr_devgivecarepackagetype", "" ); + } + + if ( getdvar( "scr_showcard" ) != "" ) + { + var_23 = strtok( getdvar( "scr_showcard" ), " " ); + + if ( var_23.size ) + { + var_24 = var_23[0]; + + if ( isdefined( var_23[1] ) ) + var_25 = int( var_23[1] ); + else + var_25 = 0; + + var_26 = undefined; + + foreach ( var_2 in level.players ) + { + if ( var_2.name == var_24 ) + { + var_26 = var_2; + var_2 setcarddisplayslot( var_2, var_25 ); + break; + } + } + + if ( !isdefined( var_26 ) ) + println( "Player " + var_24 + "not found!" ); + } + + setdevdvar( "scr_showcard", "" ); + } + + if ( getdvar( "scr_usekillstreak" ) != "" ) + { + var_23 = strtok( getdvar( "scr_usekillstreak" ), " " ); + + if ( var_23.size > 1 ) + { + var_24 = var_23[0]; + var_9 = var_23[1]; + + if ( !isdefined( level.killstreakfuncs[var_9] ) ) + println( "Killstreak " + var_9 + "not found!" ); + + var_26 = undefined; + + foreach ( var_2 in level.players ) + { + if ( var_2.name == var_24 ) + { + var_26 = var_2; + var_2 maps\mp\killstreaks\_killstreaks::givekillstreak( var_9 ); + + if ( isdefined( var_23[2] ) ) + var_2 thread maps\mp\killstreaks\_killstreaks::killstreakusepressed(); + else + var_2 thread [[ level.killstreakfuncs[var_9] ]](); + + if ( issubstr( var_9, "airstrike" ) ) + { + wait 0.05; + var_2 notify( "confirm_location", level.mapcenter, 0 ); + } + + if ( issubstr( var_9, "airdrop" ) ) + { + wait 0.05; + + switch ( var_9 ) + { + case "airdrop_assault": + case "airdrop_support": + level thread maps\mp\killstreaks\_airdrop::doflyby( var_2, level.mapcenter, randomfloat( 360 ), var_9 ); + break; + case "airdrop_mega": + level thread maps\mp\killstreaks\_airdrop::doc130flyby( var_2, level.mapcenter, randomfloat( 360 ), var_9 ); + break; + } + } + + break; + } + } + + if ( !isdefined( var_26 ) ) + println( "Player " + var_24 + "not found!" ); + } + + setdevdvar( "scr_usekillstreak", "" ); + } + + if ( getdvar( "scr_playertoorigin" ) != "" ) + { + var_23 = strtok( getdvar( "scr_playertoorigin" ), " " ); + var_31 = ( int( var_23[0] ), int( var_23[1] ), int( var_23[2] ) ); + var_24 = var_23[3]; + + foreach ( var_2 in level.players ) + { + if ( var_2.name == var_24 ) + { + var_2 setorigin( var_31 ); + break; + } + } + + setdevdvar( "scr_playertoorigin", "" ); + } + + if ( getdvar( "scr_useGambit" ) != "" ) + { + var_23 = strtok( getdvar( "scr_useGambit" ), " " ); + + if ( var_23.size > 1 ) + { + var_24 = var_23[0]; + var_34 = var_23[1]; + + if ( !isdefined( level.scriptperks[var_34] ) ) + println( "Gambit " + var_34 + "not found!" ); + + var_26 = undefined; + + foreach ( var_2 in level.players ) + { + if ( var_2.name == var_24 ) + { + var_26 = var_2; + var_2 notify( "gambit_on" ); + break; + } + } + + if ( !isdefined( var_26 ) ) + println( "Player " + var_24 + "not found!" ); + } + + setdevdvar( "scr_useGambit", "" ); + } + + if ( getdvar( "scr_levelnotify" ) != "" ) + { + level notify( getdvar( "scr_levelnotify" ) ); + setdevdvar( "scr_levelnotify", "" ); + } + + if ( getdvar( "scr_giveperk" ) != "" ) + { + var_37 = getdvar( "scr_giveperk" ); + + for ( var_38 = 0; var_38 < level.players.size; var_38++ ) + level.players[var_38] thread maps\mp\_utility::giveperk( var_37, 0 ); + + setdevdvar( "scr_giveperk", "" ); + } + + if ( getdvar( "scr_takeperk" ) != "" ) + { + var_37 = getdvar( "scr_takeperk" ); + + for ( var_38 = 0; var_38 < level.players.size; var_38++ ) + { + level.players[var_38] unsetperk( var_37, 1 ); + level.players[var_38].extraperks[var_37] = undefined; + } + + setdevdvar( "scr_takeperk", "" ); + } + + if ( getdvar( "scr_x_kills_y" ) != "" ) + { + var_39 = strtok( getdvar( "scr_x_kills_y" ), " " ); + + if ( var_39.size > 1 ) + thread xkillsy( var_39[0], var_39[1] ); + + setdevdvar( "scr_x_kills_y", "" ); + } + + if ( getdvar( "scr_enemykillhost" ) != "" ) + { + var_40 = undefined; + var_41 = undefined; + + foreach ( var_2 in level.players ) + { + if ( !var_2 ishost() ) + continue; + + var_40 = var_2; + break; + } + + foreach ( var_2 in level.players ) + { + if ( level.teambased ) + { + if ( var_2.team == var_40.team ) + continue; + + var_41 = var_2; + break; + } + else + { + if ( var_2 ishost() ) + continue; + + var_41 = var_2; + break; + } + } + + if ( isdefined( var_41 ) ) + thread xkillsy( var_41.name, var_40.name ); + + setdevdvar( "scr_enemykillhost", "" ); + } + + if ( getdvar( "scr_drop_weapon" ) != "" ) + { + var_46 = spawn( "weapon_" + getdvar( "scr_drop_weapon" ), level.players[0].origin ); + setdevdvar( "scr_drop_weapon", "" ); + } + + if ( getdvar( "scr_set_rank" ) != "" ) + { + level.players[0].pers["rank"] = 0; + level.players[0].pers["rankxp"] = 0; + var_47 = min( getdvarint( "scr_set_rank" ), 54 ); + var_47 = max( var_47, 1 ); + setdevdvar( "scr_set_rank", "" ); + + if ( level.teambased && ( !level.teamcount["allies"] || !level.teamcount["axis"] ) ) + println( "scr_set_rank may not work because there are not players on both teams" ); + else if ( !level.teambased && level.teamcount["allies"] + level.teamcount["axis"] < 2 ) + println( "scr_set_rank may not work because there are not at least two players" ); + + level.players[0] setplayerdata( "restXPGoal", 0 ); + var_48 = 0; + + for ( var_49 = 0; var_49 <= var_47; var_49++ ) + { + var_50 = maps\mp\gametypes\_rank::getrankinfominxp( var_49 ); + level.players[0] thread maps\mp\gametypes\_rank::giverankxp( "kill", var_50 - var_48 ); + var_48 = var_50; + wait 0.25; + self notify( "cancel_notify" ); + } + } + + if ( getdvar( "scr_givexp" ) != "" ) + { + level.players[0] thread maps\mp\gametypes\_rank::giverankxp( "challenge", getdvarint( "scr_givexp" ) ); + setdevdvar( "scr_givexp", "" ); + } + + if ( getdvar( "scr_do_notify" ) != "" ) + { + for ( var_38 = 0; var_38 < level.players.size; var_38++ ) + level.players[var_38] maps\mp\gametypes\_hud_message::oldnotifymessage( getdvar( "scr_do_notify" ), getdvar( "scr_do_notify" ), game["icons"]["allies"] ); + + announcement( getdvar( "scr_do_notify" ) ); + setdevdvar( "scr_do_notify", "" ); + } + + if ( getdvar( "scr_spam_splashes" ) != "" ) + { + foreach ( var_2 in level.players ) + { + var_2 thread maps\mp\gametypes\_hud_message::splashnotifydelayed( "longshot" ); + var_2 thread maps\mp\gametypes\_hud_message::splashnotifydelayed( "headshot" ); + var_2 thread maps\mp\gametypes\_hud_message::challengesplashnotify( "ch_marksman_iw5_m4" ); + var_2 thread maps\mp\gametypes\_hud_message::splashnotifydelayed( "execution" ); + var_2 thread maps\mp\gametypes\_hud_message::killstreaksplashnotify( "uav", 3 ); + var_2 thread maps\mp\gametypes\_hud_message::killstreaksplashnotify( "ac130", 11 ); + level thread maps\mp\_utility::teamplayercardsplash( "used_emp", var_2, var_2.team ); + var_2 thread maps\mp\gametypes\_rank::updaterankannouncehud(); + var_2 thread maps\mp\gametypes\_rank::updateweaponrankannouncehud(); + var_2 setcarddisplayslot( var_2, 8 ); + var_2 openmenu( "youkilled_card_display" ); + wait 2.0; + var_2 setcarddisplayslot( var_2, 7 ); + var_2 openmenu( "killedby_card_display" ); + } + + setdevdvar( "scr_spam_splashes", "" ); + } + + if ( getdvar( "scr_spam_usedsplash" ) != "" ) + { + foreach ( var_2 in level.players ) + { + level thread maps\mp\_utility::teamplayercardsplash( "used_emp", var_2, var_2.team ); + level thread maps\mp\_utility::teamplayercardsplash( "used_ac130", var_2, var_2.team ); + level thread maps\mp\_utility::teamplayercardsplash( "used_sentry", var_2, var_2.team ); + level thread maps\mp\_utility::teamplayercardsplash( "used_remote_mortar", var_2, var_2.team ); + level thread maps\mp\_utility::teamplayercardsplash( "used_remote_mg_turret", var_2, var_2.team ); + level thread maps\mp\_utility::teamplayercardsplash( "used_littlebird_support", var_2, var_2.team ); + level thread maps\mp\_utility::teamplayercardsplash( "used_littlebird_flock", var_2, var_2.team ); + level thread maps\mp\_utility::teamplayercardsplash( "used_ims", var_2, var_2.team ); + level thread maps\mp\_utility::teamplayercardsplash( "used_remote_tank", var_2, var_2.team ); + } + + setdevdvar( "scr_spam_usedsplash", "" ); + } + + if ( getdvar( "scr_spam_eventsplash" ) != "" ) + { + foreach ( var_2 in level.players ) + { + level thread maps\mp\_utility::teamplayercardsplash( "callout_firstblood", var_2 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_grabbedtheflag", var_2 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_lastenemyalive", var_2 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_lastteammemberalive", var_2 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_eliminated", var_2 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_destroyed_helicopter_flares", var_2 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_destroyed_little_bird", var_2 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_bombdefused", var_2 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_3xpluskill", var_2 ); + } + + setdevdvar( "scr_spam_eventsplash", "" ); + } + + if ( getdvar( "scr_spam_boteventsplash" ) != "" ) + { + var_57 = level.players[0]; + + foreach ( var_2 in level.players ) + { + if ( !isdefined( var_2.pers["isBot"] ) || isdefined( var_2.pers["isBot"] ) && !var_2.pers["isBot"] ) + { + var_57 = var_2; + break; + } + } + + var_60 = getbot( var_57 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_firstblood", var_60 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_grabbedtheflag", var_60 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_lastenemyalive", var_60 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_lastteammemberalive", var_60 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_eliminated", var_60 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_destroyed_helicopter_flares", var_60 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_destroyed_little_bird", var_60 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_bombdefused", var_60 ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_3xpluskill", var_60 ); + setdevdvar( "scr_spam_boteventsplash", "" ); + } + + if ( getdvar( "scr_spam_ranksplash" ) != "" ) + { + foreach ( var_2 in level.players ) + var_2 thread ranksplash( 5, 2.0 ); + + setdevdvar( "scr_spam_ranksplash", "" ); + } + + if ( getdvar( "scr_spam_weaponranksplash" ) != "" ) + { + foreach ( var_2 in level.players ) + var_2 thread weaponranksplash( 5, 2.0 ); + + setdevdvar( "scr_spam_weaponranksplash", "" ); + } + + if ( getdvar( "scr_show_splash" ) != "" ) + { + var_65 = getdvar( "scr_show_splash" ); + var_66 = 1; + var_67 = tablelookup( "mp/splashTable.csv", 0, var_65, 11 ); + + if ( var_67 == "" || var_67 == "none" ) + println( "splash not found in splash table" ); + else + { + switch ( var_67 ) + { + case "splash": + foreach ( var_2 in level.players ) + var_2 thread maps\mp\gametypes\_hud_message::splashnotify( var_65, var_66 ); + + break; + case "killstreak": + foreach ( var_2 in level.players ) + var_2 thread maps\mp\gametypes\_hud_message::killstreaksplashnotify( var_65, var_66 ); + + break; + case "challenge": + case "perk_challenge": + foreach ( var_2 in level.players ) + { + var_2 maps\mp\gametypes\_hud_util::ch_setstate( var_65, 2 ); + var_2.challengedata[var_65] = 2; + var_2 thread maps\mp\gametypes\_hud_message::challengesplashnotify( var_65 ); + } + + break; + case "splooge": + foreach ( var_2 in level.players ) + { + var_2 thread maps\mp\gametypes\_hud_message::challengesplashnotify( "ch_marksman_m16" ); + var_2 thread maps\mp\gametypes\_hud_message::killstreaksplashnotify( "uav", 3 ); + var_2 thread maps\mp\gametypes\_hud_message::killstreaksplashnotify( "ac130", 11 ); + } + + break; + default: + break; + } + } + + setdevdvar( "scr_show_splash", "" ); + } + + if ( getdvar( "scr_addlower" ) != "" ) + { + foreach ( var_2 in level.players ) + var_2 thread testlowermessage(); + + setdevdvar( "scr_addlower", "" ); + } + + if ( getdvar( "scr_entdebug" ) != "" ) + { + var_78 = getentarray(); + level.entarray = []; + level.entcounts = []; + level.entgroups = []; + + for ( var_49 = 0; var_49 < var_78.size; var_49++ ) + { + var_79 = var_78[var_49].classname; + + if ( !issubstr( var_79, "_spawn" ) ) + { + var_80 = var_78[var_49]; + level.entarray[level.entarray.size] = var_80; + + if ( !isdefined( level.entcounts[var_79] ) ) + level.entcounts[var_79] = 0; + + level.entcounts[var_79]++; + + if ( !isdefined( level.entgroups[var_79] ) ) + level.entgroups[var_79] = []; + + level.entgroups[var_79][level.entgroups[var_79].size] = var_80; + } + } + } + + if ( getdvar( "scr_sre" ) != "" ) + setdevdvar( "scr_sre", "" ); + + if ( getdvar( "scr_testmigration" ) != "" ) + { + setdevdvar( "scr_testmigration", "" ); + thread maps\mp\gametypes\_hostmigration::callback_hostmigration(); + thread hostmigrationendtimer_dev(); + } + + if ( getdvar( "scr_show_endgameupdate" ) != "" ) + { + var_81 = getdvar( "scr_show_endgameupdate" ) == "2"; + + foreach ( var_2 in level.players ) + var_2 thread testendgameupdate( var_81 ); + + setdevdvar( "scr_show_endgameupdate", "" ); + } + + if ( getdvar( "scr_goto_spawn" ) != "" ) + { + if ( getdvar( "scr_goto_spawn" ) == "next" ) + gotonextspawn(); + else if ( getdvar( "scr_goto_spawn" ) == "prev" ) + gotoprevspawn(); + + setdevdvar( "scr_goto_spawn", "" ); + } + + if ( getdvar( "scr_showOrigin" ) != "" ) + { + var_84 = undefined; + + if ( isdefined( level.player ) ) + var_84 = level.player; + else if ( isdefined( level.players[0] ) ) + var_84 = level.players[0]; + + if ( isdefined( var_84 ) ) + println( "Player origin - X: " + var_84.origin[0] + ", Y: " + var_84.origin[1] + ", Z: " + var_84.origin[2] ); + else + println( "NO PLAYER" ); + + setdevdvar( "scr_showOrigin", "" ); + } +} + +ranksplash( var_0, var_1 ) +{ + for ( var_2 = 0; var_2 < var_0; var_2++ ) + { + self thread maps\mp\gametypes\_rank::updaterankannouncehud(); + wait( var_1 ); + } +} + +weaponranksplash( var_0, var_1 ) +{ + for ( var_2 = 0; var_2 < var_0; var_2++ ) + { + self thread maps\mp\gametypes\_rank::updateweaponrankannouncehud(); + wait( var_1 ); + } +} + +testendgameupdate( var_0 ) +{ + self setclientdvars( "ui_challenge_1_ref", "ch_marksman_ak47", "ui_challenge_2_ref", "ch_ak47_gl", "ui_challenge_3_ref", "ch_ak47_reflex", "ui_challenge_4_ref", "ch_ak47_silencer", "ui_challenge_5_ref", "ch_ak47_acog", "ui_challenge_6_ref", "ch_ak47_fmj", "ui_challenge_7_ref", "ch_ak47_mastery" ); + + if ( isdefined( var_0 ) && var_0 ) + self setclientdvar( "ui_promotion", 1 ); + else + self setclientdvar( "ui_promotion", 0 ); + + self closepopupmenu(); + self closeingamemenu(); + self openmenu( game["menu_endgameupdate"] ); + var_1 = 4.0 + min( 7, 3 ); + + while ( var_1 ) + { + wait 0.25; + var_1 = var_1 - 0.25; + self openmenu( game["menu_endgameupdate"] ); + } + + self closemenu( game["menu_endgameupdate"] ); +} + +hostmigrationendtimer_dev() +{ + level endon( "host_migration_begin" ); + wait( randomfloat( 20 ) ); + level notify( "hostmigration_enoughplayers" ); +} + +testlowermessage() +{ + self maps\mp\_utility::setlowermessage( "spawn_info", game["strings"]["waiting_to_spawn"], 10 ); + wait 3.0; + self maps\mp\_utility::setlowermessage( "last_stand", &"PLATFORM_COWARDS_WAY_OUT", undefined, 50 ); + wait 3.0; + self maps\mp\_utility::clearlowermessage( "last_stand" ); + wait 10.0; + self maps\mp\_utility::clearlowermessage( "spawn_info" ); +} + +giveextraperks() +{ + if ( !isdefined( self.extraperks ) ) + return; + + var_0 = getarraykeys( self.extraperks ); + + for ( var_1 = 0; var_1 < var_0.size; var_1++ ) + self maps\mp\_utility::giveperk( var_0[var_1], 0 ); +} + +xkillsy( var_0, var_1 ) +{ + var_2 = undefined; + var_3 = undefined; + + for ( var_4 = 0; var_4 < level.players.size; var_4++ ) + { + if ( level.players[var_4].name == var_0 ) + { + var_2 = level.players[var_4]; + continue; + } + + if ( level.players[var_4].name == var_1 ) + var_3 = level.players[var_4]; + } + + if ( !isalive( var_2 ) || !isalive( var_3 ) ) + return; + + var_3 thread [[ level.callbackplayerdamage ]]( var_2, var_2, 500, 0, "MOD_RIFLE_BULLET", "iw5_scar_mp", ( 0, 0, 0 ), ( 0, 0, 0 ), "none", 0 ); +} + +commitsuicide( var_0 ) +{ + var_1 = undefined; + + for ( var_2 = 0; var_2 < level.players.size; var_2++ ) + { + if ( level.players[var_2].name == var_0 ) + var_1 = level.players[var_2]; + } + + if ( !isalive( var_1 ) ) + return; + + var_1 suicide(); +} + +updateminimapsetting() +{ + var_0 = getdvarfloat( "scr_requiredMapAspectRatio", 1 ); + + if ( !isdefined( level.minimapheight ) ) + { + setdevdvar( "scr_minimap_height", "0" ); + level.minimapheight = 0; + } + + var_1 = getdvarfloat( "scr_minimap_height" ); + + if ( var_1 != level.minimapheight ) + { + if ( isdefined( level.minimaporigin ) ) + { + level.minimapplayer unlink(); + level.minimaporigin delete(); + level notify( "end_draw_map_bounds" ); + } + + if ( var_1 > 0 ) + { + level.minimapheight = var_1; + var_2 = getentarray( "player", "classname" ); + + if ( var_2.size > 0 ) + { + var_3 = var_2[0]; + var_4 = getentarray( "minimap_corner", "targetname" ); + + if ( var_4.size == 2 ) + { + var_5 = var_4[0].origin + var_4[1].origin; + var_5 = ( var_5[0] * 0.5, var_5[1] * 0.5, var_5[2] * 0.5 ); + var_6 = ( var_4[0].origin[0], var_4[0].origin[1], var_5[2] ); + var_7 = ( var_4[0].origin[0], var_4[0].origin[1], var_5[2] ); + + if ( var_4[1].origin[0] > var_4[0].origin[0] ) + var_6 = ( var_4[1].origin[0], var_6[1], var_6[2] ); + else + var_7 = ( var_4[1].origin[0], var_7[1], var_7[2] ); + + if ( var_4[1].origin[1] > var_4[0].origin[1] ) + var_6 = ( var_6[0], var_4[1].origin[1], var_6[2] ); + else + var_7 = ( var_7[0], var_4[1].origin[1], var_7[2] ); + + var_8 = var_6 - var_5; + var_5 = ( var_5[0], var_5[1], var_5[2] + var_1 ); + var_9 = spawn( "script_origin", var_3.origin ); + var_10 = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 ); + var_11 = ( var_10[1], 0 - var_10[0], 0 ); + var_12 = vectordot( var_10, var_8 ); + + if ( var_12 < 0 ) + var_12 = 0 - var_12; + + var_13 = vectordot( var_11, var_8 ); + + if ( var_13 < 0 ) + var_13 = 0 - var_13; + + if ( var_0 > 0 ) + { + var_14 = var_13 / var_12; + + if ( var_14 < var_0 ) + { + var_15 = var_0 / var_14; + var_13 = var_13 * var_15; + var_16 = vecscale( var_11, vectordot( var_11, var_6 - var_5 ) * ( var_15 - 1 ) ); + var_7 = var_7 - var_16; + var_6 = var_6 + var_16; + } + else + { + var_15 = var_14 / var_0; + var_12 = var_12 * var_15; + var_16 = vecscale( var_10, vectordot( var_10, var_6 - var_5 ) * ( var_15 - 1 ) ); + var_7 = var_7 - var_16; + var_6 = var_6 + var_16; + } + } + + if ( level.console ) + { + var_17 = 16.0 / 9.0; + var_18 = 2 * atan( var_13 * 0.8 / var_1 ); + var_19 = 2 * atan( var_12 * var_17 * 0.8 / var_1 ); + } + else + { + var_17 = 4.0 / 3.0; + var_18 = 2 * atan( var_13 / var_1 ); + var_19 = 2 * atan( var_12 * var_17 / var_1 ); + } + + if ( var_18 > var_19 ) + var_20 = var_18; + else + var_20 = var_19; + + var_21 = var_1 - 1000; + + if ( var_21 < 16 ) + var_21 = 16; + + if ( var_21 > 10000 ) + var_21 = 10000; + + var_3 playerlinkto( var_9 ); + var_9.origin = var_5 + ( 0, 0, -62 ); + var_9.angles = ( 90, getnorthyaw(), 0 ); + var_3 takeallweapons(); + var_3 maps\mp\_utility::_giveweapon( "defaultweapon_mp" ); + var_3 setclientdvar( "cg_drawgun", "0" ); + var_3 setclientdvar( "cg_draw2d", "0" ); + var_3 setclientdvar( "cg_drawfps", "0" ); + var_3 setclientdvar( "fx_enable", "0" ); + var_3 setclientdvar( "r_fog", "0" ); + var_3 setclientdvar( "r_highLodDist", "0" ); + var_3 setclientdvar( "r_znear", var_21 ); + var_3 setclientdvar( "r_lodscale", "0" ); + var_3 setclientdvar( "cg_drawversion", "0" ); + var_3 setclientdvar( "sm_enable", "1" ); + setdevdvar( "player_view_pitch_down", "90" ); + setdevdvar( "player_view_pitch_up", "0" ); + var_3 setclientdvar( "cg_fov", var_20 ); + var_3 setclientdvar( "cg_fovmin", "1" ); + + if ( isdefined( level.objpoints ) ) + { + for ( var_22 = 0; var_22 < level.objpointnames.size; var_22++ ) + { + if ( isdefined( level.objpoints[level.objpointnames[var_22]] ) ) + level.objpoints[level.objpointnames[var_22]] destroy(); + } + + level.objpoints = []; + level.objpointnames = []; + } + + level.minimapplayer = var_3; + level.minimaporigin = var_9; + thread drawminimapbounds( var_5, var_7, var_6 ); + wait 0.05; + var_3 setplayerangles( var_9.angles ); + return; + } + + println( "^1Error: There are not exactly 2 \"minimap_corner\" entities in the level." ); + return; + } + else + setdevdvar( "scr_minimap_height", "0" ); + } + } +} + +vecscale( var_0, var_1 ) +{ + return ( var_0[0] * var_1, var_0[1] * var_1, var_0[2] * var_1 ); +} + +drawminimapbounds( var_0, var_1, var_2 ) +{ + level notify( "end_draw_map_bounds" ); + level endon( "end_draw_map_bounds" ); + var_3 = var_0[2] - var_2[2]; + var_4 = ( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 ); + var_5 = length( var_1 - var_2 ); + var_6 = var_1 - var_0; + var_6 = vectornormalize( ( var_6[0], var_6[1], 0 ) ); + var_1 = var_1 + vecscale( var_6, var_5 * 1 / 800 ); + var_7 = var_2 - var_0; + var_7 = vectornormalize( ( var_7[0], var_7[1], 0 ) ); + var_2 = var_2 + vecscale( var_7, var_5 * 1 / 800 ); + var_8 = var_2 - var_1; + var_9 = vecscale( var_4, vectordot( var_8, var_4 ) ); + var_10 = vecscale( var_4, abs( vectordot( var_8, var_4 ) ) ); + var_11 = var_1; + var_12 = var_1 + var_9; + var_13 = var_2; + var_14 = var_2 - var_9; + var_15 = vecscale( var_1 + var_2, 0.5 ) + vecscale( var_10, 0.51 ); + var_16 = var_5 * 0.003; + + for (;;) + { + line( var_11, var_12, ( 0, 1, 0 ) ); + line( var_12, var_13, ( 0, 1, 0 ) ); + line( var_13, var_14, ( 0, 1, 0 ) ); + line( var_14, var_11, ( 0, 1, 0 ) ); + print3d( var_15, "This Side Up", ( 1, 1, 1 ), 1, var_16 ); + wait 0.05; + } +} + +addtestclients() +{ + wait 5; + + for (;;) + { + if ( getdvarint( "scr_testclients" ) > 0 ) + break; + + wait 1; + } + + var_0 = getdvarint( "scr_testclients" ); + setdevdvar( "scr_testclients", 0 ); + + for ( var_1 = 0; var_1 < var_0; var_1++ ) + { + var_2[var_1] = addtestclient(); + + if ( !isdefined( var_2[var_1] ) ) + { + println( "Could not add test client" ); + wait 1; + continue; + } + + var_2[var_1].pers["isBot"] = 1; + var_2[var_1] testclient( "autoassign" ); + } + + if ( maps\mp\_utility::matchmakinggame() ) + setmatchdata( "hasBots", 1 ); + + thread addtestclients(); +} + +testclient( var_0 ) +{ + self endon( "disconnect" ); + + while ( !isdefined( self.pers["team"] ) ) + wait 0.05; + + if ( maps\mp\_utility::allowteamchoice() ) + { + self notify( "menuresponse", game["menu_team"], var_0 ); + wait 0.5; + } + + if ( maps\mp\_utility::allowclasschoice() ) + { + var_1 = "class" + randomint( 5 ); + self notify( "menuresponse", "changeclass", var_1 ); + } + + self common_scripts\utility::waittill_notify_or_timeout( "spawned_player", 0.5 ); + wait 0.1; +} + +havetestclientkillplayer() +{ + for (;;) + { + if ( getdvarint( "scr_testclients_killplayer" ) > 0 ) + break; + + wait 1; + } + + setdevdvar( "scr_testclients_killplayer", 0 ); + var_0 = level.players[0]; + + foreach ( var_2 in level.players ) + { + if ( !isdefined( var_2.pers["isBot"] ) || isdefined( var_2.pers["isBot"] ) && !var_2.pers["isBot"] ) + { + var_0 = var_2; + break; + } + } + + var_4 = getbot( var_0 ); + + if ( isdefined( var_4 ) ) + var_0 thread [[ level.callbackplayerdamage ]]( var_4, var_4, 500, 0, "MOD_RIFLE_BULLET", var_4.primaryweapon, var_4.origin, ( 0, 0, 0 ), "none", 0 ); + + wait 1; + thread havetestclientkillplayer(); +} + +havetestclientcallkillstreak() +{ + for (;;) + { + if ( getdvar( "scr_testclients_givekillstreak" ) != "" ) + break; + + wait 1; + } + + var_0 = getdvar( "scr_testclients_givekillstreak" ); + setdevdvar( "scr_testclients_givekillstreak", "" ); + var_1 = level.players[0]; + + foreach ( var_3 in level.players ) + { + if ( !isdefined( var_3.pers["isBot"] ) || isdefined( var_3.pers["isBot"] ) && !var_3.pers["isBot"] ) + { + var_1 = var_3; + break; + } + } + + var_5 = getbot( var_1 ); + + if ( getdvarint( "scr_testclients_givekillstreak_toggleall" ) ) + { + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.pers["isBot"] ) && var_3.pers["isBot"] ) + var_5 = var_3; + + if ( isdefined( var_5 ) ) + var_5 botusekillstreak( var_0 ); + } + } + else if ( getdvarint( "scr_testclients_givekillstreak_toggleall_sametime" ) ) + { + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.pers["isBot"] ) && var_3.pers["isBot"] ) + var_5 = var_3; + + if ( isdefined( var_5 ) ) + var_5 thread botusekillstreak( var_0 ); + } + } + else if ( isdefined( var_5 ) ) + var_5 botusekillstreak( var_0 ); + + thread havetestclientcallkillstreak(); +} + +botusekillstreak( var_0 ) +{ + var_1 = 0; + var_2 = undefined; + + if ( var_0 == "emp_quick" ) + { + var_1 = 1; + var_2 = getdvarfloat( "scr_emp_timeout" ); + var_0 = "emp"; + setdevdvar( "scr_emp_timeout", 1.0 ); + } + + self maps\mp\killstreaks\_killstreaks::givekillstreak( var_0 ); + wait 0.1; + + switch ( var_0 ) + { + case "littlebird_flock": + case "osprey_gunner": + case "precision_airstrike": + case "stealth_airstrike": + self thread maps\mp\killstreaks\_killstreaks::killstreakusepressed(); + wait 1.0; + self notify( "confirm_location", level.mapcenter, 0 ); + break; + case "ims": + self thread maps\mp\killstreaks\_killstreaks::killstreakusepressed(); + wait 1.0; + self notify( "place_ims" ); + break; + case "sentry": + case "sam_turret": + self thread maps\mp\killstreaks\_killstreaks::killstreakusepressed(); + wait 1.0; + self notify( "place_sentry" ); + break; + case "remote_mg_turret": + self thread maps\mp\killstreaks\_killstreaks::killstreakusepressed(); + wait 1.0; + self notify( "place_turret" ); + break; + case "remote_tank": + self thread maps\mp\killstreaks\_killstreaks::killstreakusepressed(); + wait 1.0; + self notify( "place_tank" ); + case "remote_uav": + self thread maps\mp\killstreaks\_killstreaks::killstreakusepressed(); + wait 1.0; + self notify( "place_carryRemoteUAV" ); + break; + case "airdrop_trap": + case "airdrop_assault": + var_3 = self maps\mp\killstreaks\_killstreaks::killstreakusepressed(); + + if ( !var_3 ) + return; + + wait 1.0; + level thread maps\mp\killstreaks\_airdrop::doflyby( self, self.origin, randomfloat( 360 ), var_0 ); + break; + case "escort_airdrop": + var_3 = self maps\mp\killstreaks\_killstreaks::killstreakusepressed(); + + if ( !var_3 ) + return; + + wait 1.0; + self maps\mp\killstreaks\_escortairdrop::finishsupportescortusage( -1, self.origin, randomfloat( 360 ), var_0 ); + break; + default: + self thread maps\mp\killstreaks\_killstreaks::killstreakusepressed(); + break; + } + + if ( var_1 ) + level thread waitresetdvar( 1.0, "scr_emp_timeout", var_2 ); +} + +waitresetdvar( var_0, var_1, var_2 ) +{ + wait( var_0 ); + setdevdvar( var_1, var_2 ); +} + +havetestclientplantexplosive() +{ + for (;;) + { + if ( getdvar( "scr_testclients_plantexplosive" ) != "" ) + break; + + wait 1; + } + + var_0 = getdvar( "scr_testclients_plantexplosive" ); + setdevdvar( "scr_testclients_plantexplosive", "" ); + var_1 = level.players[0]; + + foreach ( var_3 in level.players ) + { + if ( !isdefined( var_3.pers["isBot"] ) || isdefined( var_3.pers["isBot"] ) && !var_3.pers["isBot"] ) + { + var_1 = var_3; + break; + } + } + + var_5 = getbot( var_1 ); + + if ( isdefined( var_5 ) ) + { + var_6 = bullettrace( var_5.origin + ( 0, 0, 4 ), var_5.origin - ( 0, 0, 4 ), 0, var_5 ); + var_7 = vectornormalize( var_6["normal"] ); + var_8 = vectortoangles( var_7 ); + var_8 = var_8 + ( 90, 0, 0 ); + + switch ( var_0 ) + { + case "bouncing_betty": + var_9 = maps\mp\gametypes\_weapons::spawnmine( var_5.origin, var_5, "equipment", var_8 ); + var_9.trigger = spawn( "script_origin", var_9.origin + ( 0, 0, 25 ) ); + var_9 thread maps\mp\gametypes\_weapons::equipmentwatchuse( var_5 ); + var_9.killcament = spawn( "script_model", var_9.origin + ( 0, 0, 5 ) ); + var_9.killcament setscriptmoverkillcam( "explosive" ); + break; + case "claymore": + break; + } + } + + thread havetestclientplantexplosive(); +} + +havetestclientthrowdeployablevest() +{ + for (;;) + { + if ( getdvarint( "scr_testclients_throw_deployable_vest" ) > 0 ) + break; + + wait 1; + } + + setdevdvar( "scr_testclients_throw_deployable_vest", 0 ); + var_0 = level.players[0]; + + foreach ( var_2 in level.players ) + { + if ( !isdefined( var_2.pers["isBot"] ) || isdefined( var_2.pers["isBot"] ) && !var_2.pers["isBot"] ) + { + var_0 = var_2; + break; + } + } + + var_4 = getbot( var_0 ); + + if ( isdefined( var_4 ) ) + { + var_5 = bullettrace( var_4.origin + ( 0, 0, 4 ), var_4.origin - ( 0, 0, 4 ), 0, var_4 ); + var_6 = maps\mp\killstreaks\_deployablebox::createboxforplayer( "deployable_vest", var_5["position"], var_4 ); + wait 0.05; + var_6 thread maps\mp\killstreaks\_deployablebox::box_setactive(); + } + + thread havetestclientthrowdeployablevest(); +} + +addtestclientjuggernaut() +{ + for (;;) + { + if ( getdvar( "scr_testclients_jugg" ) != "" ) + break; + + wait 1; + } + + var_0 = getdvar( "scr_testclients_jugg" ); + setdevdvar( "scr_testclients_jugg", "" ); + var_1 = level.players[0]; + + foreach ( var_3 in level.players ) + { + if ( !isdefined( var_3.pers["isBot"] ) || isdefined( var_3.pers["isBot"] ) && !var_3.pers["isBot"] ) + { + var_1 = var_3; + break; + } + } + + var_5 = getbot( var_1 ); + + if ( isdefined( var_5 ) ) + var_5 thread maps\mp\killstreaks\_juggernaut::givejuggernaut( var_0 ); + + thread addtestclientjuggernaut(); +} + +addtestclientspawnpoint() +{ + for (;;) + { + if ( getdvarint( "scr_testclients_spawnpoint" ) > 0 ) + break; + + wait 1; + } + + var_0 = level.players[0]; + + foreach ( var_2 in level.players ) + { + if ( !isdefined( var_2.pers["isBot"] ) || isdefined( var_2.pers["isBot"] ) && !var_2.pers["isBot"] ) + { + var_0 = var_2; + break; + } + } + + if ( !isdefined( var_0 ) ) + { + setdevdvar( "scr_testclients_spawnpoint", 0 ); + thread addtestclientspawnpoint(); + return; + } + + if ( !isalive( var_0 ) ) + { + setdevdvar( "scr_testclients_spawnpoint", 0 ); + thread addtestclientspawnpoint(); + return; + } + + var_4 = bullettrace( var_0 geteye(), var_0.origin + anglestoforward( var_0 getplayerangles() ) * 10000, 0, var_0 ); + var_5 = spawn( "script_model", var_4["position"] ); + var_5 setmodel( "projectile_bouncing_betty_grenade" ); + var_6 = bullettrace( var_5.origin + ( 0, 0, 50 ), var_5.origin + ( 0, 0, -100 ), 0, var_5 ); + var_5.origin = var_6["position"]; + var_5 thread showfx(); + + while ( getdvarint( "scr_testclients_spawnpoint" ) > 0 ) + { + var_4 = bullettrace( var_0 geteye(), var_0.origin + anglestoforward( var_0 getplayerangles() ) * 10000, 0, var_5 ); + var_5.origin = var_4["position"]; + var_6 = bullettrace( var_5.origin + ( 0, 0, 50 ), var_5.origin + ( 0, 0, -100 ), 0, var_5 ); + var_5.origin = var_6["position"]; + + if ( var_0 usebuttonpressed() ) + { + var_7 = addtestclient(); + + if ( !isdefined( var_7 ) ) + { + println( "Could not add test client" ); + wait 1; + continue; + } + + var_7.pers["isBot"] = 1; + var_7 thread testclient( maps\mp\_utility::getotherteam( var_0.team ) ); + var_7 common_scripts\utility::waittill_notify_or_timeout( "spawned_player", 3.0 ); + var_7 setorigin( var_5.origin ); + + if ( maps\mp\_utility::matchmakinggame() ) + setmatchdata( "hasBots", 1 ); + + break; + } + + wait 0.05; + } + + var_5 delete(); + setdevdvar( "scr_testclients_spawnpoint", 0 ); + thread addtestclientspawnpoint(); +} + +showfx() +{ + self endon( "death" ); + wait 1.0; + playfxontag( level.devspawnfxid, self, "tag_fx" ); +} + +warpenemies() +{ + for (;;) + { + if ( getdvarint( "scr_warpenemies" ) > 0 ) + break; + + wait 1; + } + + setdevdvar( "scr_warpenemies", 0 ); + var_0 = level.players[0]; + + foreach ( var_2 in level.players ) + { + if ( !isdefined( var_2.pers["isBot"] ) || isdefined( var_2.pers["isBot"] ) && !var_2.pers["isBot"] ) + { + var_0 = var_2; + break; + } + } + + foreach ( var_2 in level.players ) + { + if ( level.teambased ) + { + if ( var_2.team != var_0.team ) + var_2 setorigin( var_0.origin ); + + continue; + } + + var_2 setorigin( var_0.origin ); + } + + thread warpenemies(); +} + +warpfriendlies() +{ + for (;;) + { + if ( getdvarint( "scr_warpfriendlies" ) > 0 ) + break; + + wait 1; + } + + setdevdvar( "scr_warpfriendlies", 0 ); + var_0 = level.players[0]; + + foreach ( var_2 in level.players ) + { + if ( !isdefined( var_2.pers["isBot"] ) || isdefined( var_2.pers["isBot"] ) && !var_2.pers["isBot"] ) + { + var_0 = var_2; + break; + } + } + + foreach ( var_2 in level.players ) + { + if ( level.teambased ) + { + if ( var_2.team == var_0.team ) + var_2 setorigin( var_0.origin ); + + continue; + } + + var_2 setorigin( var_0.origin ); + } + + thread warpfriendlies(); +} + +giveequipment() +{ + for (;;) + { + if ( getdvar( "scr_giveequipment" ) != "" ) + break; + + wait 1; + } + + var_0 = getdvar( "scr_giveequipment" ); + + if ( isdefined( var_0 ) ) + { + foreach ( var_2 in level.players ) + { + var_3 = var_2 getcurrentoffhand(); + var_2 takeweapon( var_3 ); + var_2 setoffhandprimaryclass( "other" ); + var_0 = maps\mp\perks\_perks::validateperk( 1, var_0 ); + var_2 maps\mp\_utility::giveperk( var_0, 1 ); + } + } + + setdevdvar( "scr_giveequipment", "" ); + thread giveequipment(); +} + +givespecialgrenade() +{ + for (;;) + { + if ( getdvar( "scr_givespecialgrenade" ) != "" ) + break; + + wait 1; + } + + var_0 = getdvar( "scr_givespecialgrenade" ); + + if ( isdefined( var_0 ) ) + { + foreach ( var_2 in level.players ) + { + var_3 = var_2 getweaponslistoffhands(); + + foreach ( var_5 in var_3 ) + { + switch ( var_5 ) + { + case "flash_grenade_mp": + case "concussion_grenade_mp": + case "smoke_grenade_mp": + case "flare_mp": + case "trophy_mp": + case "scrambler_mp": + case "portable_radar_mp": + case "emp_grenade_mp": + var_2 takeweapon( var_5 ); + break; + } + } + + if ( var_0 == "flash_grenade_mp" ) + var_2 setoffhandsecondaryclass( "flash" ); + else if ( var_0 == "smoke_grenade_mp" || var_0 == "concussion_grenade_mp" ) + var_2 setoffhandsecondaryclass( "smoke" ); + else + var_2 setoffhandsecondaryclass( "flash" ); + + switch ( var_0 ) + { + case "smoke_grenade_mp": + var_2 giveweapon( var_0 ); + var_2 setweaponammoclip( var_0, 1 ); + break; + case "flash_grenade_mp": + var_2 giveweapon( var_0 ); + var_2 setweaponammoclip( var_0, 2 ); + break; + case "concussion_grenade_mp": + var_2 giveweapon( var_0 ); + var_2 setweaponammoclip( var_0, 2 ); + break; + case "emp_grenade_mp": + var_2 giveweapon( var_0 ); + var_2 setweaponammoclip( var_0, 1 ); + break; + case "specialty_portable_radar": + var_2 maps\mp\_utility::giveperk( var_0, 0 ); + var_2 setweaponammoclip( "portable_radar_mp", 1 ); + break; + case "specialty_scrambler": + var_2 maps\mp\_utility::giveperk( var_0, 0 ); + var_2 setweaponammoclip( "scrambler_mp", 1 ); + break; + case "specialty_tacticalinsertion": + var_2 maps\mp\_utility::giveperk( var_0, 0 ); + var_2 setweaponammoclip( "flare_mp", 1 ); + break; + case "trophy_mp": + var_2 maps\mp\_utility::giveperk( var_0, 0 ); + var_2 setweaponammoclip( var_0, 1 ); + break; + default: + var_2 giveweapon( var_0 ); + var_2 setweaponammoclip( var_0, 1 ); + break; + } + } + } + + setdevdvar( "scr_givespecialgrenade", "" ); + thread givespecialgrenade(); +} + +initforweapontests() +{ + if ( isdefined( self.initforweapontests ) ) + return; + + self.initforweapontests = 1; + self thread changecamolistener(); + self thread thirdpersontoggle(); + self waittill( "death" ); + self.initforweapontests = undefined; +} + +settestweapon( var_0 ) +{ + if ( !isdefined( level.baseweaponlist[var_0] ) ) + { + self iprintlnbold( "Unknown weapon: " + var_0 ); + return; + } + + self notify( "new_test_weapon" ); + self.baseweapon = var_0; + self thread weaponchangelistener(); + self updatetestweapon(); +} + +thirdpersontoggle() +{ + self endon( "death" ); + self notifyonplayercommand( "dpad_down", "+actionslot 2" ); + var_0 = self maps\mp\gametypes\_hud_util::createfontstring( "default", 1.5 ); + var_0 maps\mp\gametypes\_hud_util::setpoint( "TOPRIGHT", "TOPRIGHT", 0, 72 + 260 ); + var_0 settext( "3rd Person: " + getdvarint( "camera_thirdPerson" ) + " [{+actionslot 2}]" ); + self thread destroyondeath( var_0 ); + + for (;;) + { + self waittill( "dpad_down" ); + setdvar( "camera_thirdPerson", !getdvarint( "camera_thirdPerson" ) ); + var_0 settext( "3rd Person: " + getdvarint( "camera_thirdPerson" ) + " [{+actionslot 2}]" ); + } +} + +changecamolistener() +{ + self endon( "death" ); + self notifyonplayercommand( "dpad_up", "+actionslot 1" ); + var_0 = []; + + for ( var_1 = 0; tablelookupbyrow( "mp/camoTable.csv", var_1, 1 ) != ""; var_1++ ) + var_0[var_0.size] = tablelookupbyrow( "mp/camoTable.csv", var_1, 1 ); + + self.camoindex = 0; + var_2 = self maps\mp\gametypes\_hud_util::createfontstring( "default", 1.5 ); + var_2 maps\mp\gametypes\_hud_util::setpoint( "TOPRIGHT", "TOPRIGHT", 0, 52 + 260 ); + var_2 settext( "Camo: " + tablelookup( "mp/camoTable.csv", 0, self.camoindex, 1 ) + " [{+actionslot 1}]" ); + self thread destroyondeath( var_2 ); + + for (;;) + { + self waittill( "dpad_up" ); + self.camoindex++; + + if ( self.camoindex > var_0.size - 1 ) + self.camoindex = 0; + + var_2 settext( "Camo: " + tablelookup( "mp/camoTable.csv", 0, self.camoindex, 1 ) + " [{+actionslot 1}]" ); + self updatetestweapon(); + } +} + +weaponchangelistener() +{ + self endon( "death" ); + self endon( "new_test_weapon" ); + self notifyonplayercommand( "next_weapon", "weapnext" ); + + if ( !isdefined( self.weaponelem ) ) + { + self.weaponelem = self maps\mp\gametypes\_hud_util::createfontstring( "default", 1.5 ); + self.weaponelem maps\mp\gametypes\_hud_util::setpoint( "TOPRIGHT", "TOPRIGHT", 0, 32 + 260 ); + self thread destroyondeath( self.weaponelem ); + } + + self.variantindex = 0; + self.weaponelem settext( "Weapon: " + level.baseweaponlist[self.baseweapon].variants[self.variantindex] + " [{weapnext}]" ); + + for (;;) + { + self waittill( "next_weapon" ); + self.variantindex++; + + if ( self.variantindex > level.baseweaponlist[self.baseweapon].variants.size - 1 ) + self.variantindex = 0; + + self.weaponelem settext( "Weapon: " + level.baseweaponlist[self.baseweapon].variants[self.variantindex] + " [{weapnext}]" ); + self updatetestweapon(); + } +} + +destroyondeath( var_0 ) +{ + self waittill( "death" ); + var_0 destroy(); +} + +updatetestweapon() +{ + self takeallweapons(); + wait 0.05; + var_0 = level.baseweaponlist[self.baseweapon].variants[self.variantindex]; + self maps\mp\_utility::_giveweapon( var_0, int( self.camoindex ) ); + self switchtoweapon( var_0 ); + self givemaxammo( var_0 ); +} + +watchnoclip() +{ + level waittill( "player_spawned", var_0 ); + + if ( !isdefined( var_0.pers["isBot"] ) ) + { + var_0 notifyonplayercommand( "ls_down_noclip", "+breath_sprint" ); + var_0 notifyonplayercommand( "dpad_down_noclip", "+actionslot 2" ); + var_0 thread playernoclip(); + } + + level thread watchnoclip(); +} + +playernoclip() +{ + self endon( "disconnect" ); + self endon( "death" ); + self endon( "faux_spawn" ); + self.devnoclipls = 0; + self.devnoclipdpad = 0; + self thread watchnoclipls(); + self thread watchnoclipdpad(); + + for (;;) + { + if ( getdvarint( "scr_devnoclip" ) > 0 ) + { + if ( self.devnoclipls && self.devnoclipdpad ) + self noclip(); + } + + wait 0.2; + } +} + +watchnoclipls() +{ + self endon( "disconnect" ); + self endon( "death" ); + self endon( "faux_spawn" ); + + for (;;) + { + self waittill( "ls_down_noclip" ); + self.devnoclipls = 1; + wait 0.2; + self.devnoclipls = 0; + } +} + +watchnoclipdpad() +{ + self endon( "disconnect" ); + self endon( "death" ); + self endon( "faux_spawn" ); + + for (;;) + { + self waittill( "dpad_down_noclip" ); + self.devnoclipdpad = 1; + wait 0.2; + self.devnoclipdpad = 0; + } +} + +watchufo() +{ + level waittill( "player_spawned", var_0 ); + + if ( !isdefined( var_0.pers["isBot"] ) ) + { + var_0 notifyonplayercommand( "ls_down_ufo", "+breath_sprint" ); + var_0 notifyonplayercommand( "dpad_up_ufo", "+actionslot 1" ); + var_0 thread playerufo(); + } + + level thread watchufo(); +} + +playerufo() +{ + self endon( "disconnect" ); + self endon( "death" ); + self endon( "faux_spawn" ); + self.devufols = 0; + self.devufodpad = 0; + self thread watchufols(); + self thread watchufodpad(); + + for (;;) + { + if ( getdvarint( "scr_devufo" ) > 0 ) + { + if ( self.devufols && self.devufodpad ) + self ufo(); + } + + wait 0.2; + } +} + +watchufols() +{ + self endon( "disconnect" ); + self endon( "death" ); + self endon( "faux_spawn" ); + + for (;;) + { + self waittill( "ls_down_ufo" ); + self.devufols = 1; + wait 0.2; + self.devufols = 0; + } +} + +watchufodpad() +{ + self endon( "disconnect" ); + self endon( "death" ); + self endon( "faux_spawn" ); + + for (;;) + { + self waittill( "dpad_up_ufo" ); + self.devufodpad = 1; + wait 0.2; + self.devufodpad = 0; + } +} + +printperks() +{ + for (;;) + { + if ( getdvarint( "scr_printperks" ) > 0 ) + break; + + wait 1; + } + + foreach ( var_1 in level.players ) + { + if ( getdvarint( "scr_printperks" ) == 1 && !isdefined( var_1.pers["isBot"] ) ) + { + println( var_1.name ); + + foreach ( var_4, var_3 in var_1.perks ) + println( var_4 ); + + continue; + } + + if ( getdvarint( "scr_printperks" ) == 2 && isdefined( var_1.pers["isBot"] ) && var_1.pers["isBot"] ) + { + println( var_1.name ); + + foreach ( var_4, var_3 in var_1.perks ) + println( var_4 ); + } + } + + setdevdvar( "scr_printperks", 0 ); + thread printperks(); +} + +devgiveperks() +{ + for (;;) + { + if ( getdvar( "scr_devgiveperk" ) != "" ) + break; + + wait 1; + } + + var_0 = getdvar( "scr_devgiveperk" ); + + foreach ( var_2 in level.players ) + var_2 thread maps\mp\_utility::giveperk( var_0, 0 ); + + setdevdvar( "scr_devgiveperk", "" ); + thread devgiveperks(); +} + +devclearperks() +{ + for (;;) + { + if ( getdvarint( "scr_devclearperks" ) > 0 ) + break; + + wait 1; + } + + setdevdvar( "scr_devclearperks", 0 ); + + foreach ( var_1 in level.players ) + var_1 thread maps\mp\_utility::_clearperks(); + + thread devclearperks(); +} + +devhurtplayer() +{ + for (;;) + { + if ( getdvarint( "scr_devhurtplayer" ) > 0 ) + break; + + wait 1; + } + + var_0 = getdvarint( "scr_devhurtplayer" ); + var_1 = level.players[0]; + + foreach ( var_3 in level.players ) + { + if ( !isdefined( var_3.pers["isBot"] ) || isdefined( var_3.pers["isBot"] ) && !var_3.pers["isBot"] ) + { + var_1 = var_3; + break; + } + } + + if ( var_0 >= 100 ) + var_0 = var_1.health - 1; + + var_5 = getbot( var_1 ); + + if ( isdefined( var_5 ) ) + var_1 thread [[ level.callbackplayerdamage ]]( var_5, var_5, var_0, 0, "MOD_RIFLE_BULLET", var_5.primaryweapon, var_5.origin, ( 0, 0, 0 ), "none", 0 ); + + setdevdvar( "scr_devhurtplayer", 0 ); + thread devhurtplayer(); +} + +devhurtplayerreset() +{ + for (;;) + { + if ( getdvarint( "scr_devhurtplayerreset" ) > 0 ) + break; + + wait 1; + } + + var_0 = level.players[0]; + + foreach ( var_2 in level.players ) + { + if ( !isdefined( var_2.pers["isBot"] ) || isdefined( var_2.pers["isBot"] ) && !var_2.pers["isBot"] ) + { + var_0 = var_2; + break; + } + } + + var_0.health = 100; + setdevdvar( "scr_devhurtplayerreset", 0 ); + thread devhurtplayerreset(); +} + +devhurtplayerdirectional() +{ + for (;;) + { + if ( getdvar( "scr_devhurtplayerdirectional" ) != "" ) + break; + + wait 1; + } + + var_0 = undefined; + var_1 = level.players[0]; + + foreach ( var_3 in level.players ) + { + if ( !isdefined( var_3.pers["isBot"] ) || isdefined( var_3.pers["isBot"] ) && !var_3.pers["isBot"] ) + { + var_1 = var_3; + break; + } + } + + var_0 = getbot( var_1 ); + + if ( isdefined( var_0 ) ) + { + switch ( getdvar( "scr_devhurtplayerdirectional" ) ) + { + case "right100": + var_0 setorigin( var_1.origin + ( 0, 0, 5 ) + anglestoright( var_1.angles ) * 100 ); + break; + case "left100": + var_0 setorigin( var_1.origin + ( 0, 0, 5 ) + anglestoright( var_1.angles ) * 100 * -1 ); + break; + case "center100": + var_0 setorigin( var_1.origin + ( 0, 0, 5 ) + anglestoforward( var_1.angles ) * 100 ); + break; + case "right600": + var_0 setorigin( var_1.origin + ( 0, 0, 5 ) + anglestoright( var_1.angles ) * 600 ); + break; + case "left600": + var_0 setorigin( var_1.origin + ( 0, 0, 5 ) + anglestoright( var_1.angles ) * 600 * -1 ); + break; + case "center600": + var_0 setorigin( var_1.origin + ( 0, 0, 5 ) + anglestoforward( var_1.angles ) * 600 ); + break; + } + + wait 0.1; + magicbullet( "iw5_usp45_mp", var_0.origin + ( 0, 0, 35 ), var_1.origin + ( 0, 0, 35 ), var_0 ); + } + + setdevdvar( "scr_devhurtplayerdirectional", "" ); + thread devhurtplayerdirectional(); +} + +getbot( var_0 ) +{ + var_1 = undefined; + + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.pers["isBot"] ) && var_3.pers["isBot"] ) + var_1 = var_3; + + if ( isdefined( var_1 ) && isdefined( var_0 ) ) + { + if ( level.teambased ) + { + if ( var_1.team != var_0.team ) + break; + } + else + break; + } + } + + if ( !isdefined( var_1 ) ) + { + setdevdvar( "scr_testclients", 1 ); + wait 3.0; + + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.pers["isBot"] ) && var_3.pers["isBot"] ) + var_1 = var_3; + + if ( isdefined( var_1 ) ) + { + if ( level.teambased ) + { + if ( var_1.team != var_0.team ) + break; + } + else + break; + } + } + } + + return var_1; +} + +devchangetimelimit() +{ + for (;;) + { + if ( getdvarfloat( "scr_devchangetimelimit" ) > 0.0 ) + break; + + wait 1; + } + + var_0 = getdvarfloat( "scr_devchangetimelimit" ) / 60; + level.starttime = gettime(); + var_1 = "scr_" + level.gametype + "_timelimit"; + level.watchdvars[var_1].value = var_0; + setdevdvar( var_1, var_0 ); + setdevdvar( "scr_devchangetimelimit", 0 ); + thread devchangetimelimit(); +} + +devweaponxp() +{ + var_0 = getdvarint( "scr_devweaponxp" ); + + for (;;) + { + if ( getdvarint( "scr_devweaponxp" ) != var_0 ) + break; + + wait 1; + } + + var_1 = level.players[0]; + + foreach ( var_3 in level.players ) + { + if ( !isdefined( var_3.pers["isBot"] ) || isdefined( var_3.pers["isBot"] ) && !var_3.pers["isBot"] ) + { + var_1 = var_3; + break; + } + } + + switch ( getdvarint( "scr_devweaponxp" ) ) + { + case 0: + var_1 notify( "devStopWeaponXP" ); + + if ( isdefined( var_1.devweaponxpbar ) ) + var_1.devweaponxpbar maps\mp\gametypes\_hud_util::destroyelem(); + + if ( isdefined( var_1.devweaponxpbartext ) ) + var_1.devweaponxpbartext maps\mp\gametypes\_hud_util::destroyelem(); + + break; + case 1: + var_1.devweaponxpbar = var_1 maps\mp\gametypes\_hud_util::createprimaryprogressbar( 200, 250 ); + var_1.devweaponxpbartext = var_1 maps\mp\gametypes\_hud_util::createprimaryprogressbartext( 200, 250 ); + var_1.devweaponxpbartext maps\mp\gametypes\_hud_util::setpoint( "RIGHT", undefined, level.primaryprogressbartextx - 150, level.primaryprogressbartexty + 250 ); + var_1.devweaponxpbartext settext( "weapon xp" ); + var_1 thread devwatchweaponxp(); + break; + } + + thread devweaponxp(); +} + +devwatchweaponxp() +{ + level endon( "game_ended" ); + self endon( "devStopWeaponXP" ); + var_0 = self getcurrentweapon(); + var_1 = strtok( var_0, "_" ); + + if ( var_1[0] == "iw5" ) + var_2 = var_1[0] + "_" + var_1[1]; + else if ( var_1[0] == "alt" ) + var_2 = var_1[1] + "_" + var_1[2]; + else + var_2 = var_1[0]; + + if ( var_1[0] == "gl" ) + var_2 = var_1[1]; + + var_3 = self maps\mp\gametypes\_rank::getweaponrankxp( var_2 ); + + for (;;) + { + var_0 = self getcurrentweapon(); + + if ( var_0 != "none" && !self maps\mp\_utility::isjuggernaut() ) + { + var_4 = weaponinventorytype( var_0 ); + + if ( var_4 == "primary" || var_4 == "altmode" ) + { + var_0 = self getcurrentweapon(); + var_1 = strtok( var_0, "_" ); + + if ( var_1[0] == "iw5" ) + var_2 = var_1[0] + "_" + var_1[1]; + else if ( var_1[0] == "alt" ) + var_2 = var_1[1] + "_" + var_1[2]; + else + var_2 = var_1[0]; + + if ( var_1[0] == "gl" ) + var_2 = var_1[1]; + + var_5 = self maps\mp\gametypes\_rank::getweaponrankxp( var_2 ); + + if ( var_3 != var_5 ) + { + var_6 = maps\mp\gametypes\_rank::getweaponrankforxp( var_5, var_2 ); + var_7 = maps\mp\gametypes\_rank::getweaponrankinfominxp( var_6 ); + var_8 = maps\mp\gametypes\_rank::getweaponrankinfoxpamt( var_6 ); + var_9 = ( var_5 - var_7 ) / var_8; + + if ( var_9 > 1.0 ) + var_9 = 1.0; + + self.devweaponxpbar maps\mp\gametypes\_hud_util::updatebar( var_9, 0 ); + var_3 = var_5; + self.devweaponxpbartext settext( var_0 + " xp:" + var_5 + " xp to next:" + var_8 + " rank:" + ( var_6 + 1 ) ); + } + } + } + + wait 0.05; + } +} + +devplayerxp() +{ + var_0 = getdvarint( "scr_devplayerxp" ); + + for (;;) + { + if ( getdvarint( "scr_devplayerxp" ) != var_0 ) + break; + + wait 1; + } + + var_1 = level.players[0]; + + foreach ( var_3 in level.players ) + { + if ( !isdefined( var_3.pers["isBot"] ) || isdefined( var_3.pers["isBot"] ) && !var_3.pers["isBot"] ) + { + var_1 = var_3; + break; + } + } + + switch ( getdvarint( "scr_devplayerxp" ) ) + { + case 0: + var_1 notify( "devStopPlayerXP" ); + + if ( isdefined( var_1.devplayerxpbar ) ) + var_1.devplayerxpbar maps\mp\gametypes\_hud_util::destroyelem(); + + if ( isdefined( var_1.devplayerxpbartext ) ) + var_1.devplayerxpbartext maps\mp\gametypes\_hud_util::destroyelem(); + + break; + case 1: + var_1.devplayerxpbar = var_1 maps\mp\gametypes\_hud_util::createprimaryprogressbar( 200, 200 ); + var_1.devplayerxpbartext = var_1 maps\mp\gametypes\_hud_util::createprimaryprogressbartext( 200, 200 ); + var_1.devplayerxpbartext settext( "player xp" ); + var_1 thread devwatchplayerxp(); + break; + } + + thread devplayerxp(); +} + +devwatchplayerxp() +{ + level endon( "game_ended" ); + self endon( "devStopPlayerXP" ); + var_0 = self maps\mp\gametypes\_rank::getrankxp(); + + for (;;) + { + var_1 = self maps\mp\gametypes\_rank::getrankxp(); + + if ( var_0 != var_1 ) + { + var_2 = maps\mp\gametypes\_rank::getrankforxp( var_1 ); + var_3 = maps\mp\gametypes\_rank::getrankinfominxp( var_2 ); + var_4 = maps\mp\gametypes\_rank::getrankinfoxpamt( var_2 ); + var_5 = ( var_1 - var_3 ) / var_4; + + if ( var_5 > 1.0 ) + var_5 = 1.0; + + self.devplayerxpbar maps\mp\gametypes\_hud_util::updatebar( var_5, 0 ); + var_0 = var_1; + self.devplayerxpbartext settext( "player xp:" + var_1 + " xp to next:" + var_4 + " rank:" + ( var_2 + 1 ) ); + } + + wait 0.05; + } +} + +devscriptmoversdebugdraw() +{ + var_0 = ( 1, 1, 1 ); + var_1 = ( 1, 0, 0 ); + var_2 = ( 0, 1, 0 ); + var_3 = ( 0, 0, 1 ); + + for (;;) + { + if ( getdvarint( "scr_devScriptMoversDebugDraw" ) > 0 ) + { + var_4 = getentarray( "script_model", "classname" ); + var_5 = getentarray( "script_origin", "classname" ); + + foreach ( var_7 in var_4 ) + { + line( var_7.origin, var_7.origin + anglestoforward( var_7.angles ) * 10, var_1 ); + line( var_7.origin, var_7.origin + anglestoright( var_7.angles ) * 10, var_2 ); + line( var_7.origin, var_7.origin + anglestoup( var_7.angles ) * 10, var_3 ); + + if ( isdefined( var_7.targetname ) ) + { + var_8 = var_0; + var_9 = 1; + var_10 = 1; + print3d( var_7.origin, var_7.targetname, var_8, var_9, var_10 ); + var_11 = "(" + var_7.origin[0] + ", " + var_7.origin[1] + ", " + var_7.origin[2] + ")"; + print3d( var_7.origin + ( 0, 0, -20 ), var_11, var_8, var_9, var_10 ); + } + } + + foreach ( var_7 in var_5 ) + { + line( var_7.origin, var_7.origin + anglestoforward( var_7.angles ) * 10, var_1 ); + line( var_7.origin, var_7.origin + anglestoright( var_7.angles ) * 10, var_2 ); + line( var_7.origin, var_7.origin + anglestoup( var_7.angles ) * 10, var_3 ); + + if ( isdefined( var_7.targetname ) ) + { + var_8 = var_0; + var_9 = 1; + var_10 = 1; + + switch ( var_7.targetname ) + { + case "airstrikeheight": + var_8 = var_1; + var_10 = 3; + break; + case "heli_start": + case "heli_leave": + var_8 = var_2; + var_10 = 3; + break; + } + + print3d( var_7.origin, var_7.targetname, var_8, var_9, var_10 ); + var_11 = "(" + var_7.origin[0] + ", " + var_7.origin[1] + ", " + var_7.origin[2] + ")"; + print3d( var_7.origin + ( 0, 0, -20 ), var_11, var_8, var_9, var_10 ); + } + } + } + + wait 0.05; + } +} + +devhelipathdebugdraw() +{ + var_0 = ( 1, 1, 1 ); + var_1 = ( 1, 0, 0 ); + var_2 = ( 0, 1, 0 ); + var_3 = ( 0, 0, 1 ); + var_4 = var_0; + var_5 = 1; + var_6 = 1; + var_7 = 10; + var_8 = var_7; + var_9 = ( 0, 0, -30 ); + var_10 = "devStopHeliPathsDebugDraw"; + + for (;;) + { + if ( getdvarint( "scr_devHeliPathsDebugDraw" ) > 0 ) + { + var_11 = getentarray( "script_origin", "classname" ); + + foreach ( var_13 in var_11 ) + { + if ( isdefined( var_13.targetname ) ) + { + switch ( var_13.targetname ) + { + case "heli_start": + var_4 = var_3; + var_5 = 1; + var_6 = 3; + break; + case "heli_loop_start": + var_4 = var_2; + var_5 = 1; + var_6 = 3; + break; + case "heli_attack_area": + var_4 = var_1; + var_5 = 1; + var_6 = 3; + break; + case "heli_leave": + var_4 = var_0; + var_5 = 1; + var_6 = 3; + break; + } + + switch ( var_13.targetname ) + { + case "heli_start": + case "heli_loop_start": + case "heli_attack_area": + case "heli_leave": + if ( var_8 == var_7 ) + var_13 thread drawpath( var_4, var_0, var_5, var_6, var_9, var_8, var_10 ); + + var_13 draworiginlines(); + var_13 drawtargetnametext( var_4, var_5, var_6 ); + var_13 draworigintext( var_4, var_5, var_6, var_9 ); + break; + } + } + } + + var_8 = var_8 - 0.05; + + if ( var_8 < 0 ) + var_8 = var_7; + } + + if ( getdvarint( "scr_devHeliPathsDebugDraw" ) == 0 ) + { + level notify( var_10 ); + var_8 = var_7; + } + + wait 0.05; + } +} + +draworiginlines() +{ + var_0 = ( 1, 0, 0 ); + var_1 = ( 0, 1, 0 ); + var_2 = ( 0, 0, 1 ); + line( self.origin, self.origin + anglestoforward( self.angles ) * 10, var_0 ); + line( self.origin, self.origin + anglestoright( self.angles ) * 10, var_1 ); + line( self.origin, self.origin + anglestoup( self.angles ) * 10, var_2 ); +} + +drawtargetnametext( var_0, var_1, var_2, var_3 ) +{ + if ( !isdefined( var_3 ) ) + var_3 = ( 0, 0, 0 ); + + print3d( self.origin + var_3, self.targetname, var_0, var_1, var_2 ); +} + +draworigintext( var_0, var_1, var_2, var_3 ) +{ + if ( !isdefined( var_3 ) ) + var_3 = ( 0, 0, 0 ); + + var_4 = "(" + self.origin[0] + ", " + self.origin[1] + ", " + self.origin[2] + ")"; + print3d( self.origin + var_3, var_4, var_0, var_1, var_2 ); +} + +drawspeedacceltext( var_0, var_1, var_2, var_3 ) +{ + if ( isdefined( self.script_airspeed ) ) + print3d( self.origin + ( 0, 0, var_3[2] * 2 ), "script_airspeed:" + self.script_airspeed, var_0, var_1, var_2 ); + + if ( isdefined( self.script_accel ) ) + print3d( self.origin + ( 0, 0, var_3[2] * 3 ), "script_accel:" + self.script_accel, var_0, var_1, var_2 ); +} + +drawpath( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) +{ + level endon( var_6 ); + var_7 = self; + var_8 = var_7.targetname; + + while ( isdefined( var_7.target ) ) + { + var_9 = getent( var_7.target, "targetname" ); + var_7 thread drawpathsegment( var_9, var_0, var_1, var_2, var_3, var_4, var_5, var_6 ); + + if ( var_7.targetname == "heli_loop_start" ) + var_8 = var_7.target; + else if ( var_7.target == var_8 ) + break; + + var_7 = var_9; + wait 0.05; + } +} + +drawpathsegment( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 ) +{ + level endon( var_7 ); + + while ( var_6 > 0 ) + { + line( self.origin, var_0.origin, var_1 ); + self drawspeedacceltext( var_2, var_3, var_4, var_5 ); + var_6 = var_6 - 0.05; + wait 0.05; + } +} + +devpredatormissiledebugdraw() +{ + var_0 = ( 1, 1, 1 ); + var_1 = ( 1, 0, 0 ); + var_2 = ( 0, 1, 0 ); + var_3 = ( 0, 0, 1 ); + var_4 = var_0; + var_5 = 1; + var_6 = 1; + var_7 = 10; + var_8 = var_7; + var_9 = ( 0, 0, -30 ); + var_10 = "devStopPredatorMissileDebugDraw"; + + for (;;) + { + if ( getdvarint( "scr_devPredatorMissileDebugDraw" ) > 0 ) + { + var_11 = getentarray( "remoteMissileSpawn", "targetname" ); + + foreach ( var_13 in var_11 ) + { + var_4 = var_1; + var_5 = 1; + var_6 = 1; + + if ( var_8 == var_7 ) + var_13 thread drawpath( var_4, var_0, var_5, var_6, var_9, var_8, var_10 ); + + var_13 draworiginlines(); + var_13 drawtargetnametext( var_4, var_5, var_6 ); + var_13 draworigintext( var_4, var_5, var_6, var_9 ); + } + + var_8 = var_8 - 0.05; + + if ( var_8 < 0 ) + var_8 = var_7; + } + + if ( getdvarint( "scr_devPredatorMissileDebugDraw" ) == 0 ) + { + level notify( var_10 ); + var_8 = var_7; + } + + wait 0.05; + } +} + +devprintdailyweeklychallenges() +{ + for (;;) + { + if ( getdvar( "scr_devPrintDailyWeeklyChallenges" ) != "" ) + break; + + wait 1; + } + + foreach ( var_1 in level.players ) + { + if ( isdefined( var_1.pers["isBot"] ) && var_1.pers["isBot"] ) + continue; + + if ( getdvar( "scr_devPrintDailyWeeklyChallenges" ) == "daily" ) + { + println( var_1.name ); + + foreach ( var_4, var_3 in var_1.challengedata ) + { + if ( issubstr( var_4, "_daily" ) && var_3 ) + println( "Daily: " + var_4 ); + } + + continue; + } + + if ( getdvar( "scr_devPrintDailyWeeklyChallenges" ) == "weekly" ) + { + println( var_1.name ); + + foreach ( var_4, var_3 in var_1.challengedata ) + { + if ( issubstr( var_4, "_weekly" ) && var_3 ) + println( "Weekly: " + var_4 ); + } + } + } + + setdevdvar( "scr_devPrintDailyWeeklyChallenges", "" ); + thread devprintdailyweeklychallenges(); +} +#/ + +onplayerconnect() +{ + for (;;) + { + level waittill( "connected", var_0 ); + var_0 thread updatereflectionprobe(); + } +} + +showspawnpoint( var_0, var_1, var_2 ) +{ + /# + var_3 = var_0.origin; + var_4 = anglestoforward( var_0.angles ); + var_5 = anglestoright( var_0.angles ); + var_4 = var_4 * 16; + var_5 = var_5 * 16; + var_6 = var_3 + var_4 - var_5; + var_7 = var_3 + var_4 + var_5; + var_8 = var_3 - var_4 + var_5; + var_9 = var_3 - var_4 - var_5; + thread lineuntilnotified( var_6, var_7, var_2, 0 ); + thread lineuntilnotified( var_7, var_8, var_2, 0 ); + thread lineuntilnotified( var_8, var_9, var_2, 0 ); + thread lineuntilnotified( var_9, var_6, var_2, 0 ); + thread lineuntilnotified( var_6, var_6 + ( 0, 0, 72 ), var_2, 0 ); + thread lineuntilnotified( var_7, var_7 + ( 0, 0, 72 ), var_2, 0 ); + thread lineuntilnotified( var_8, var_8 + ( 0, 0, 72 ), var_2, 0 ); + thread lineuntilnotified( var_9, var_9 + ( 0, 0, 72 ), var_2, 0 ); + var_6 = var_6 + ( 0, 0, 72 ); + var_7 = var_7 + ( 0, 0, 72 ); + var_8 = var_8 + ( 0, 0, 72 ); + var_9 = var_9 + ( 0, 0, 72 ); + thread lineuntilnotified( var_6, var_7, var_2, 0 ); + thread lineuntilnotified( var_7, var_8, var_2, 0 ); + thread lineuntilnotified( var_8, var_9, var_2, 0 ); + thread lineuntilnotified( var_9, var_6, var_2, 0 ); + var_3 = var_3 + ( 0, 0, 36 ); + var_10 = anglestoforward( var_0.angles ); + var_11 = anglestoforward( var_0.angles ); + var_12 = anglestoright( var_0.angles ); + var_10 = var_10 * 32; + var_11 = var_11 * 24; + var_12 = var_12 * 8; + var_6 = var_3 + var_10; + var_7 = var_3 + var_11 - var_12; + var_8 = var_3 + var_11 + var_12; + thread lineuntilnotified( var_3, var_6, ( 1, 1, 1 ), 0 ); + thread lineuntilnotified( var_6, var_7, ( 1, 1, 1 ), 0 ); + thread lineuntilnotified( var_6, var_8, ( 1, 1, 1 ), 0 ); + + foreach ( var_14 in var_0.alternates ) + thread lineuntilnotified( var_0.origin, var_14, var_2, 0 ); + + thread print3duntilnotified( var_0.origin + ( 0, 0, 72 ), var_1, var_2, 1, 1 ); + #/ +} + +showspawnpoints() +{ + /# + if ( isdefined( level.spawnpoints ) ) + { + foreach ( var_1 in level.spawnpoints ) + showspawnpoint( var_1, var_1.classname, ( 1, 1, 1 ) ); + } + + if ( isdefined( level.extraspawnpointsused ) ) + { + foreach ( var_1 in level.extraspawnpointsused ) + showspawnpoint( var_1, var_1.fakeclassname, ( 0.5, 0.5, 0.5 ) ); + } + #/ +} + +print3duntilnotified( var_0, var_1, var_2, var_3, var_4 ) +{ + /# + level endon( "hide_spawnpoints" ); + + for (;;) + { + print3d( var_0, var_1, var_2, var_3, var_4 ); + wait 0.05; + } + #/ +} + +lineuntilnotified( var_0, var_1, var_2, var_3 ) +{ + /# + level endon( "hide_spawnpoints" ); + + for (;;) + { + line( var_0, var_1, var_2, var_3 ); + wait 0.05; + } + #/ +} + +hidespawnpoints() +{ + /# + level notify( "hide_spawnpoints" ); + #/ +} + +updatereflectionprobe() +{ + /# + for (;;) + { + if ( getdvarint( "debug_reflection" ) == 1 ) + { + if ( !isdefined( self.debug_reflectionobject ) ) + { + self.debug_reflectionobject = spawn( "script_model", self geteye() + anglestoforward( self.angles ) * 100 ); + self.debug_reflectionobject setmodel( "test_sphere_silver" ); + self.debug_reflectionobject.origin = self geteye() + anglestoforward( self getplayerangles() ) * 100; + self thread reflectionprobebuttons(); + } + } + else if ( getdvarint( "debug_reflection" ) == 0 ) + { + if ( isdefined( self.debug_reflectionobject ) ) + self.debug_reflectionobject delete(); + } + + wait 0.05; + } + #/ +} + +reflectionprobebuttons() +{ + /# + var_0 = 100; + var_1 = 50; + + while ( getdvarint( "debug_reflection" ) == 1 ) + { + if ( self buttonpressed( "BUTTON_X" ) ) + var_0 = var_0 + var_1; + + if ( self buttonpressed( "BUTTON_Y" ) ) + var_0 = var_0 - var_1; + + if ( var_0 > 1000 ) + var_0 = 1000; + + if ( var_0 < 64 ) + var_0 = 64; + + self.debug_reflectionobject.origin = self geteye() + anglestoforward( self getplayerangles() ) * var_0; + wait 0.05; + } + #/ +} + +gotonextspawn() +{ + /# + if ( isdefined( level.spawnpoints ) ) + { + foreach ( var_1 in level.players ) + { + if ( !isdefined( var_1.debug_next_spawnpoint ) ) + var_1.debug_next_spawnpoint = 0; + + var_1.spawnpos = level.spawnpoints[var_1.debug_next_spawnpoint].origin; + var_1 spawn( level.spawnpoints[var_1.debug_next_spawnpoint].origin, level.spawnpoints[var_1.debug_next_spawnpoint].angles ); + var_1.debug_prev_spawnpoint = var_1.debug_next_spawnpoint - 1; + + if ( var_1.debug_prev_spawnpoint < 0 ) + var_1.debug_prev_spawnpoint = level.spawnpoints.size - 1; + + var_1.debug_next_spawnpoint++; + + if ( var_1.debug_next_spawnpoint == level.spawnpoints.size ) + var_1.debug_next_spawnpoint = 0; + } + } + #/ +} + +gotoprevspawn() +{ + /# + if ( isdefined( level.spawnpoints ) ) + { + foreach ( var_1 in level.players ) + { + if ( !isdefined( var_1.debug_prev_spawnpoint ) ) + var_1.debug_prev_spawnpoint = level.spawnpoints.size - 1; + + var_1.spawnpos = level.spawnpoints[var_1.debug_prev_spawnpoint].origin; + var_1 spawn( level.spawnpoints[var_1.debug_prev_spawnpoint].origin, level.spawnpoints[var_1.debug_prev_spawnpoint].angles ); + var_1.debug_next_spawnpoint = var_1.debug_prev_spawnpoint + 1; + + if ( var_1.debug_next_spawnpoint == level.spawnpoints.size ) + var_1.debug_next_spawnpoint = 0; + + var_1.debug_prev_spawnpoint--; + + if ( var_1.debug_prev_spawnpoint < 0 ) + var_1.debug_prev_spawnpoint = level.spawnpoints.size - 1; + } + } + #/ +} diff --git a/raw/maps/mp/gametypes/_gamelogic.gsc b/raw/maps/mp/gametypes/_gamelogic.gsc new file mode 100644 index 0000000..4433685 --- /dev/null +++ b/raw/maps/mp/gametypes/_gamelogic.gsc @@ -0,0 +1,2650 @@ +// IW5 GSC SOURCE +// Generated by https://github.com/xensik/gsc-tool + +onforfeit( var_0 ) +{ + if ( isdefined( level.forfeitinprogress ) ) + return; + + level endon( "abort_forfeit" ); + level thread forfeitwaitforabort(); + level.forfeitinprogress = 1; + + if ( !level.teambased && level.players.size > 1 && getdvarint( "party_maxplayers" ) > 2 ) + wait 10; + + level.forfeit_aborted = 0; + + if ( getdvarint( "party_maxplayers" ) > 2 ) + { + var_1 = 20.0; + matchforfeittimer( var_1 ); + } + + var_2 = &""; + + if ( !isdefined( var_0 ) ) + { + level.finalkillcam_winner = "none"; + var_2 = game["strings"]["players_forfeited"]; + var_3 = level.players[0]; + } + else if ( var_0 == "allies" ) + { + level.finalkillcam_winner = "axis"; + var_2 = game["strings"]["allies_forfeited"]; + var_3 = "axis"; + } + else if ( var_0 == "axis" ) + { + level.finalkillcam_winner = "allies"; + var_2 = game["strings"]["axis_forfeited"]; + var_3 = "allies"; + } + else + { + level.finalkillcam_winner = "none"; + var_3 = "tie"; + } + + level.forcedend = 1; + + if ( isplayer( var_3 ) ) + logstring( "forfeit, win: " + var_3 getxuid() + "(" + var_3.name + ")" ); + else + logstring( "forfeit, win: " + var_3 + ", allies: " + game["teamScores"]["allies"] + ", opfor: " + game["teamScores"]["axis"] ); + + thread endgame( var_3, var_2 ); +} + +forfeitwaitforabort() +{ + level endon( "game_ended" ); + level waittill( "abort_forfeit" ); + level.forfeit_aborted = 1; + + if ( isdefined( level.matchforfeittimer ) ) + level.matchforfeittimer maps\mp\gametypes\_hud_util::destroyelem(); + + if ( isdefined( level.matchforfeittext ) ) + level.matchforfeittext maps\mp\gametypes\_hud_util::destroyelem(); +} + +matchforfeittimer_internal( var_0, var_1 ) +{ + waittillframeend; + level endon( "match_forfeit_timer_beginning" ); + + while ( var_0 > 0 && !level.gameended && !level.forfeit_aborted && !level.ingraceperiod ) + { + var_1 thread maps\mp\gametypes\_hud::fontpulse( level ); + wait( var_1.inframes * 0.05 ); + var_1 setvalue( var_0 ); + var_0--; + wait( 1 - var_1.inframes * 0.05 ); + } +} + +matchforfeittimer( var_0 ) +{ + level notify( "match_forfeit_timer_beginning" ); + var_1 = maps\mp\gametypes\_hud_util::createserverfontstring( "objective", 1.5 ); + var_1 maps\mp\gametypes\_hud_util::setpoint( "CENTER", "CENTER", 0, -40 ); + var_1.sort = 1001; + var_1 settext( game["strings"]["opponent_forfeiting_in"] ); + var_1.foreground = 0; + var_1.hidewheninmenu = 1; + var_2 = maps\mp\gametypes\_hud_util::createserverfontstring( "hudbig", 1 ); + var_2 maps\mp\gametypes\_hud_util::setpoint( "CENTER", "CENTER", 0, 0 ); + var_2.sort = 1001; + var_2.color = ( 1, 1, 0 ); + var_2.foreground = 0; + var_2.hidewheninmenu = 1; + var_2 maps\mp\gametypes\_hud::fontpulseinit(); + var_3 = int( var_0 ); + level.matchforfeittimer = var_2; + level.matchforfeittext = var_1; + matchforfeittimer_internal( var_3, var_2 ); + var_2 maps\mp\gametypes\_hud_util::destroyelem(); + var_1 maps\mp\gametypes\_hud_util::destroyelem(); +} + +default_ondeadevent( var_0 ) +{ + level.finalkillcam_winner = "none"; + + if ( var_0 == "allies" ) + { + iprintln( game["strings"]["allies_eliminated"] ); + logstring( "team eliminated, win: opfor, allies: " + game["teamScores"]["allies"] + ", opfor: " + game["teamScores"]["axis"] ); + level.finalkillcam_winner = "axis"; + thread endgame( "axis", game["strings"]["allies_eliminated"] ); + } + else if ( var_0 == "axis" ) + { + iprintln( game["strings"]["axis_eliminated"] ); + logstring( "team eliminated, win: allies, allies: " + game["teamScores"]["allies"] + ", opfor: " + game["teamScores"]["axis"] ); + level.finalkillcam_winner = "allies"; + thread endgame( "allies", game["strings"]["axis_eliminated"] ); + } + else + { + logstring( "tie, allies: " + game["teamScores"]["allies"] + ", opfor: " + game["teamScores"]["axis"] ); + level.finalkillcam_winner = "none"; + + if ( level.teambased ) + thread endgame( "tie", game["strings"]["tie"] ); + else + thread endgame( undefined, game["strings"]["tie"] ); + } +} + +default_ononeleftevent( var_0 ) +{ + if ( level.teambased ) + { + var_1 = maps\mp\_utility::getlastlivingplayer( var_0 ); + var_1 thread givelastonteamwarning(); + } + else + { + var_1 = maps\mp\_utility::getlastlivingplayer(); + logstring( "last one alive, win: " + var_1.name ); + level.finalkillcam_winner = "none"; + thread endgame( var_1, &"MP_ENEMIES_ELIMINATED" ); + } + + return 1; +} + +default_ontimelimit() +{ + var_0 = undefined; + level.finalkillcam_winner = "none"; + + if ( level.teambased ) + { + if ( game["teamScores"]["allies"] == game["teamScores"]["axis"] ) + var_0 = "tie"; + else if ( game["teamScores"]["axis"] > game["teamScores"]["allies"] ) + { + level.finalkillcam_winner = "axis"; + var_0 = "axis"; + } + else + { + level.finalkillcam_winner = "allies"; + var_0 = "allies"; + } + + logstring( "time limit, win: " + var_0 + ", allies: " + game["teamScores"]["allies"] + ", opfor: " + game["teamScores"]["axis"] ); + } + else + { + var_0 = maps\mp\gametypes\_gamescore::gethighestscoringplayer(); + + if ( isdefined( var_0 ) ) + logstring( "time limit, win: " + var_0.name ); + else + logstring( "time limit, tie" ); + } + + thread endgame( var_0, game["strings"]["time_limit_reached"] ); +} + +default_onhalftime() +{ + var_0 = undefined; + level.finalkillcam_winner = "none"; + thread endgame( "halftime", game["strings"]["time_limit_reached"] ); +} + +forceend() +{ + if ( level.hostforcedend || level.forcedend ) + return; + + var_0 = undefined; + level.finalkillcam_winner = "none"; + + if ( level.teambased ) + { + if ( game["teamScores"]["allies"] == game["teamScores"]["axis"] ) + var_0 = "tie"; + else if ( game["teamScores"]["axis"] > game["teamScores"]["allies"] ) + { + level.finalkillcam_winner = "axis"; + var_0 = "axis"; + } + else + { + level.finalkillcam_winner = "allies"; + var_0 = "allies"; + } + + logstring( "host ended game, win: " + var_0 + ", allies: " + game["teamScores"]["allies"] + ", opfor: " + game["teamScores"]["axis"] ); + } + else + { + var_0 = maps\mp\gametypes\_gamescore::gethighestscoringplayer(); + + if ( isdefined( var_0 ) ) + logstring( "host ended game, win: " + var_0.name ); + else + logstring( "host ended game, tie" ); + } + + level.forcedend = 1; + level.hostforcedend = 1; + + if ( level.splitscreen ) + var_1 = &"MP_ENDED_GAME"; + else + var_1 = &"MP_HOST_ENDED_GAME"; + + thread endgame( var_0, var_1 ); +} + +onscorelimit() +{ + var_0 = game["strings"]["score_limit_reached"]; + var_1 = undefined; + level.finalkillcam_winner = "none"; + + if ( level.teambased ) + { + if ( game["teamScores"]["allies"] == game["teamScores"]["axis"] ) + var_1 = "tie"; + else if ( game["teamScores"]["axis"] > game["teamScores"]["allies"] ) + { + var_1 = "axis"; + level.finalkillcam_winner = "axis"; + } + else + { + var_1 = "allies"; + level.finalkillcam_winner = "allies"; + } + + logstring( "scorelimit, win: " + var_1 + ", allies: " + game["teamScores"]["allies"] + ", opfor: " + game["teamScores"]["axis"] ); + } + else + { + var_1 = maps\mp\gametypes\_gamescore::gethighestscoringplayer(); + + if ( isdefined( var_1 ) ) + logstring( "scorelimit, win: " + var_1.name ); + else + logstring( "scorelimit, tie" ); + } + + thread endgame( var_1, var_0 ); + return 1; +} + +updategameevents() +{ + if ( maps\mp\_utility::matchmakinggame() && !level.ingraceperiod ) + { + if ( level.teambased ) + { + if ( level.teamcount["allies"] < 1 && level.teamcount["axis"] > 0 && game["state"] == "playing" ) + { + thread onforfeit( "allies" ); + return; + } + + if ( level.teamcount["axis"] < 1 && level.teamcount["allies"] > 0 && game["state"] == "playing" ) + { + thread onforfeit( "axis" ); + return; + } + + if ( level.teamcount["axis"] > 0 && level.teamcount["allies"] > 0 ) + { + level.forfeitinprogress = undefined; + level notify( "abort_forfeit" ); + } + } + else + { + if ( level.teamcount["allies"] + level.teamcount["axis"] == 1 && level.maxplayercount > 1 ) + { + thread onforfeit(); + return; + } + + if ( level.teamcount["axis"] + level.teamcount["allies"] > 1 ) + { + level.forfeitinprogress = undefined; + level notify( "abort_forfeit" ); + } + } + } + + if ( !maps\mp\_utility::getgametypenumlives() && ( !isdefined( level.disablespawning ) || !level.disablespawning ) ) + return; + + if ( !maps\mp\_utility::gamehasstarted() ) + return; + + if ( level.ingraceperiod ) + return; + + if ( level.teambased ) + { + var_0["allies"] = level.livescount["allies"]; + var_0["axis"] = level.livescount["axis"]; + + if ( isdefined( level.disablespawning ) && level.disablespawning ) + { + var_0["allies"] = 0; + var_0["axis"] = 0; + } + + if ( !level.alivecount["allies"] && !level.alivecount["axis"] && !var_0["allies"] && !var_0["axis"] ) + return [[ level.ondeadevent ]]( "all" ); + + if ( !level.alivecount["allies"] && !var_0["allies"] ) + return [[ level.ondeadevent ]]( "allies" ); + + if ( !level.alivecount["axis"] && !var_0["axis"] ) + return [[ level.ondeadevent ]]( "axis" ); + + if ( level.alivecount["allies"] == 1 && !var_0["allies"] ) + { + if ( !isdefined( level.onelefttime["allies"] ) ) + { + level.onelefttime["allies"] = gettime(); + return [[ level.ononeleftevent ]]( "allies" ); + } + } + + if ( level.alivecount["axis"] == 1 && !var_0["axis"] ) + { + if ( !isdefined( level.onelefttime["axis"] ) ) + { + level.onelefttime["axis"] = gettime(); + return [[ level.ononeleftevent ]]( "axis" ); + return; + } + + return; + } + } + else + { + if ( !level.alivecount["allies"] && !level.alivecount["axis"] && ( !level.livescount["allies"] && !level.livescount["axis"] ) ) + return [[ level.ondeadevent ]]( "all" ); + + var_1 = maps\mp\_utility::getpotentiallivingplayers(); + + if ( var_1.size == 1 ) + return [[ level.ononeleftevent ]]( "all" ); + } +} + +waittillfinalkillcamdone() +{ + if ( !isdefined( level.finalkillcam_winner ) ) + return 0; + + level waittill( "final_killcam_done" ); + return 1; +} + +timelimitclock_intermission( var_0 ) +{ + setgameendtime( gettime() + int( var_0 * 1000 ) ); + var_1 = spawn( "script_origin", ( 0, 0, 0 ) ); + var_1 hide(); + + if ( var_0 >= 10.0 ) + wait( var_0 - 10.0 ); + + for (;;) + { + var_1 playsound( "ui_mp_timer_countdown" ); + wait 1.0; + } +} + +waitforplayers( var_0 ) +{ + var_1 = gettime() + var_0 * 1000 - 200; + + if ( level.teambased ) + { + while ( ( !level.hasspawned["axis"] || !level.hasspawned["allies"] ) && gettime() < var_1 ) + wait 0.05; + } + else + { + while ( level.maxplayercount < 2 && gettime() < var_1 ) + wait 0.05; + } +} + +prematchperiod() +{ + level endon( "game_ended" ); + + if ( level.prematchperiod > 0 ) + { + if ( level.console ) + { + thread matchstarttimer( "match_starting_in", level.prematchperiod ); + wait( level.prematchperiod ); + } + else + matchstarttimerpc(); + } + else + matchstarttimerskip(); + + for ( var_0 = 0; var_0 < level.players.size; var_0++ ) + { + level.players[var_0] maps\mp\_utility::freezecontrolswrapper( 0 ); + level.players[var_0] enableweapons(); + var_1 = maps\mp\_utility::getobjectivehinttext( level.players[var_0].pers["team"] ); + + if ( !isdefined( var_1 ) || !level.players[var_0].hasspawned ) + continue; + + level.players[var_0] setclientdvar( "scr_objectiveText", var_1 ); + level.players[var_0] thread maps\mp\gametypes\_hud_message::hintmessage( var_1 ); + } + + if ( game["state"] != "playing" ) + return; +} + +graceperiod() +{ + level endon( "game_ended" ); + + while ( level.ingraceperiod > 0 ) + { + wait 1.0; + level.ingraceperiod--; + } + + level notify( "grace_period_ending" ); + wait 0.05; + maps\mp\_utility::gameflagset( "graceperiod_done" ); + level.ingraceperiod = 0; + + if ( game["state"] != "playing" ) + return; + + if ( maps\mp\_utility::getgametypenumlives() ) + { + var_0 = level.players; + + for ( var_1 = 0; var_1 < var_0.size; var_1++ ) + { + var_2 = var_0[var_1]; + + if ( !var_2.hasspawned && var_2.sessionteam != "spectator" && !isalive( var_2 ) ) + var_2.statusicon = "hud_status_dead"; + } + } + + level thread updategameevents(); +} + +sethasdonecombat( var_0, var_1 ) +{ + var_0.hasdonecombat = var_1; + var_2 = !isdefined( var_0.hasdoneanycombat ) || !var_0.hasdoneanycombat; + + if ( var_2 && var_1 ) + { + var_0.hasdoneanycombat = 1; + game[var_0.guid] = 1; + updatelossstats( var_0 ); + } +} + +updatewinstats( var_0 ) +{ + if ( !var_0 maps\mp\_utility::rankingenabled() ) + return; + + if ( !isdefined( var_0.hasdoneanycombat ) || !var_0.hasdoneanycombat ) + return; + + var_0 maps\mp\gametypes\_persistence::statadd( "losses", -1 ); + var_0 maps\mp\gametypes\_persistence::statadd( "wins", 1 ); + var_0 maps\mp\_utility::updatepersratio( "winLossRatio", "wins", "losses" ); + var_0 maps\mp\gametypes\_persistence::statadd( "currentWinStreak", 1 ); + var_1 = var_0 maps\mp\gametypes\_persistence::statget( "currentWinStreak" ); + + if ( var_1 > var_0 maps\mp\gametypes\_persistence::statget( "winStreak" ) ) + var_0 maps\mp\gametypes\_persistence::statset( "winStreak", var_1 ); + + var_0 maps\mp\gametypes\_persistence::statsetchild( "round", "win", 1 ); + var_0 maps\mp\gametypes\_persistence::statsetchild( "round", "loss", 0 ); +} + +updatelossstats( var_0 ) +{ + if ( !var_0 maps\mp\_utility::rankingenabled() ) + return; + + if ( !isdefined( var_0.hasdoneanycombat ) || !var_0.hasdoneanycombat ) + return; + + var_0 maps\mp\gametypes\_persistence::statadd( "losses", 1 ); + var_0 maps\mp\_utility::updatepersratio( "winLossRatio", "wins", "losses" ); + var_0 maps\mp\gametypes\_persistence::statsetchild( "round", "loss", 1 ); +} + +updatetiestats( var_0 ) +{ + if ( !var_0 maps\mp\_utility::rankingenabled() ) + return; + + if ( !isdefined( var_0.hasdoneanycombat ) || !var_0.hasdoneanycombat ) + return; + + var_0 maps\mp\gametypes\_persistence::statadd( "losses", -1 ); + var_0 maps\mp\gametypes\_persistence::statadd( "ties", 1 ); + var_0 maps\mp\_utility::updatepersratio( "winLossRatio", "wins", "losses" ); + var_0 maps\mp\gametypes\_persistence::statset( "currentWinStreak", 0 ); +} + +updatewinlossstats( var_0 ) +{ + if ( maps\mp\_utility::privatematch() ) + return; + + if ( !maps\mp\_utility::waslastround() ) + return; + + var_1 = level.players; + + if ( !isdefined( var_0 ) || isdefined( var_0 ) && isstring( var_0 ) && var_0 == "tie" ) + { + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.connectedpostgame ) ) + continue; + + if ( level.hostforcedend && var_3 ishost() ) + { + var_3 maps\mp\gametypes\_persistence::statset( "currentWinStreak", 0 ); + continue; + } + + updatetiestats( var_3 ); + } + } + else if ( isplayer( var_0 ) ) + { + if ( level.hostforcedend && var_0 ishost() ) + { + var_0 maps\mp\gametypes\_persistence::statset( "currentWinStreak", 0 ); + return; + } + + updatewinstats( var_0 ); + } + else if ( isstring( var_0 ) ) + { + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.connectedpostgame ) ) + continue; + + if ( level.hostforcedend && var_3 ishost() ) + { + var_3 maps\mp\gametypes\_persistence::statset( "currentWinStreak", 0 ); + continue; + } + + if ( var_0 == "tie" ) + { + updatetiestats( var_3 ); + continue; + } + + if ( var_3.pers["team"] == var_0 ) + { + updatewinstats( var_3 ); + continue; + } + + var_3 maps\mp\gametypes\_persistence::statset( "currentWinStreak", 0 ); + } + } +} + +freezeplayerforroundend( var_0 ) +{ + self endon( "disconnect" ); + maps\mp\_utility::clearlowermessages(); + + if ( !isdefined( var_0 ) ) + var_0 = 0.05; + + self closepopupmenu(); + self closeingamemenu(); + wait( var_0 ); + maps\mp\_utility::freezecontrolswrapper( 1 ); +} + +updatematchbonusscores( var_0 ) +{ + if ( !game["timePassed"] ) + return; + + if ( !maps\mp\_utility::matchmakinggame() ) + return; + + if ( !maps\mp\_utility::gettimelimit() || level.forcedend ) + { + var_1 = maps\mp\_utility::gettimepassed() / 1000; + var_1 = min( var_1, 1200 ); + } + else + var_1 = maps\mp\_utility::gettimelimit() * 60; + + if ( level.teambased ) + { + if ( var_0 == "allies" ) + { + var_2 = "allies"; + var_3 = "axis"; + } + else if ( var_0 == "axis" ) + { + var_2 = "axis"; + var_3 = "allies"; + } + else + { + var_2 = "tie"; + var_3 = "tie"; + } + + if ( var_2 != "tie" ) + { + var_4 = maps\mp\gametypes\_rank::getscoreinfovalue( "win" ); + var_5 = maps\mp\gametypes\_rank::getscoreinfovalue( "loss" ); + setwinningteam( var_2 ); + } + else + { + var_4 = maps\mp\gametypes\_rank::getscoreinfovalue( "tie" ); + var_5 = maps\mp\gametypes\_rank::getscoreinfovalue( "tie" ); + } + + foreach ( var_7 in level.players ) + { + if ( isdefined( var_7.connectedpostgame ) ) + continue; + + if ( !var_7 maps\mp\_utility::rankingenabled() ) + continue; + + if ( var_7.timeplayed["total"] < 1 || var_7.pers["participation"] < 1 ) + { + var_7 thread maps\mp\gametypes\_rank::endgameupdate(); + continue; + } + + if ( level.hostforcedend && var_7 ishost() ) + continue; + + if ( !isdefined( var_7.hasdoneanycombat ) || !var_7.hasdoneanycombat ) + continue; + + var_8 = var_7 maps\mp\gametypes\_rank::getspm(); + + if ( var_2 == "tie" ) + { + var_9 = int( var_4 * ( var_1 / 60 * var_8 ) * var_7.timeplayed["total"] / var_1 ); + var_7 thread givematchbonus( "tie", var_9 ); + var_7.matchbonus = var_9; + continue; + } + + if ( isdefined( var_7.pers["team"] ) && var_7.pers["team"] == var_2 ) + { + var_9 = int( var_4 * ( var_1 / 60 * var_8 ) * var_7.timeplayed["total"] / var_1 ); + var_7 thread givematchbonus( "win", var_9 ); + var_7.matchbonus = var_9; + continue; + } + + if ( isdefined( var_7.pers["team"] ) && var_7.pers["team"] == var_3 ) + { + var_9 = int( var_5 * ( var_1 / 60 * var_8 ) * var_7.timeplayed["total"] / var_1 ); + var_7 thread givematchbonus( "loss", var_9 ); + var_7.matchbonus = var_9; + } + } + } + else + { + if ( isdefined( var_0 ) ) + { + var_4 = maps\mp\gametypes\_rank::getscoreinfovalue( "win" ); + var_5 = maps\mp\gametypes\_rank::getscoreinfovalue( "loss" ); + } + else + { + var_4 = maps\mp\gametypes\_rank::getscoreinfovalue( "tie" ); + var_5 = maps\mp\gametypes\_rank::getscoreinfovalue( "tie" ); + } + + foreach ( var_7 in level.players ) + { + if ( isdefined( var_7.connectedpostgame ) ) + continue; + + if ( var_7.timeplayed["total"] < 1 || var_7.pers["participation"] < 1 ) + { + var_7 thread maps\mp\gametypes\_rank::endgameupdate(); + continue; + } + + if ( !isdefined( var_7.hasdoneanycombat ) || !var_7.hasdoneanycombat ) + continue; + + var_8 = var_7 maps\mp\gametypes\_rank::getspm(); + var_12 = 0; + + for ( var_13 = 0; var_13 < min( level.placement["all"].size, 3 ); var_13++ ) + { + if ( level.placement["all"][var_13] != var_7 ) + continue; + + var_12 = 1; + } + + if ( var_12 ) + { + var_9 = int( var_4 * ( var_1 / 60 * var_8 ) * var_7.timeplayed["total"] / var_1 ); + var_7 thread givematchbonus( "win", var_9 ); + var_7.matchbonus = var_9; + continue; + } + + var_9 = int( var_5 * ( var_1 / 60 * var_8 ) * var_7.timeplayed["total"] / var_1 ); + var_7 thread givematchbonus( "loss", var_9 ); + var_7.matchbonus = var_9; + } + } +} + +givematchbonus( var_0, var_1 ) +{ + self endon( "disconnect" ); + level waittill( "give_match_bonus" ); + maps\mp\gametypes\_rank::giverankxp( var_0, var_1 ); + maps\mp\gametypes\_rank::endgameupdate(); +} + +setxenonranks( var_0 ) +{ + var_1 = level.players; + + for ( var_2 = 0; var_2 < var_1.size; var_2++ ) + { + var_3 = var_1[var_2]; + + if ( !isdefined( var_3.score ) || !isdefined( var_3.pers["team"] ) ) + continue; + } + + for ( var_2 = 0; var_2 < var_1.size; var_2++ ) + { + var_3 = var_1[var_2]; + + if ( !isdefined( var_3.score ) || !isdefined( var_3.pers["team"] ) ) + continue; + + setplayerteamrank( var_3, var_3.clientid, var_3.score - 5 * var_3.deaths ); + } +} + +checktimelimit( var_0 ) +{ + if ( isdefined( level.timelimitoverride ) && level.timelimitoverride ) + return; + + if ( game["state"] != "playing" ) + { + setgameendtime( 0 ); + return; + } + + if ( maps\mp\_utility::gettimelimit() <= 0 ) + { + if ( isdefined( level.starttime ) ) + setgameendtime( level.starttime ); + else + setgameendtime( 0 ); + + return; + } + + if ( !maps\mp\_utility::gameflag( "prematch_done" ) ) + { + setgameendtime( 0 ); + return; + } + + if ( !isdefined( level.starttime ) ) + return; + + var_1 = gettimeremaining(); + setgameendtime( gettime() + int( var_1 ) ); + + if ( var_1 > 0 ) + { + if ( maps\mp\_utility::gethalftime() && checkhalftime( var_0 ) ) + [[ level.onhalftime ]](); + + return; + } + + [[ level.ontimelimit ]](); +} + +checkhalftime( var_0 ) +{ + if ( !level.teambased ) + return 0; + + if ( maps\mp\_utility::gettimelimit() ) + { + var_1 = maps\mp\_utility::gettimelimit() * 60 * 1000 * 0.5; + + if ( maps\mp\_utility::gettimepassed() >= var_1 && var_0 < var_1 && var_0 > 0 ) + { + game["roundMillisecondsAlreadyPassed"] = maps\mp\_utility::gettimepassed(); + return 1; + } + } + + return 0; +} + +gettimeremaining() +{ + return maps\mp\_utility::gettimelimit() * 60 * 1000 - maps\mp\_utility::gettimepassed(); +} + +checkteamscorelimitsoon( var_0 ) +{ + if ( maps\mp\_utility::getwatcheddvar( "scorelimit" ) <= 0 || maps\mp\_utility::isobjectivebased() ) + return; + + if ( isdefined( level.scorelimitoverride ) && level.scorelimitoverride ) + return; + + if ( level.gametype == "conf" || level.gametype == "jugg" ) + return; + + if ( !level.teambased ) + return; + + if ( maps\mp\_utility::gettimepassed() < 60000 ) + return; + + var_1 = estimatedtimetillscorelimit( var_0 ); + + if ( var_1 < 2 ) + level notify( "match_ending_soon", "score" ); +} + +checkplayerscorelimitsoon() +{ + if ( maps\mp\_utility::getwatcheddvar( "scorelimit" ) <= 0 || maps\mp\_utility::isobjectivebased() ) + return; + + if ( level.teambased ) + return; + + if ( maps\mp\_utility::gettimepassed() < 60000 ) + return; + + var_0 = estimatedtimetillscorelimit(); + + if ( var_0 < 2 ) + level notify( "match_ending_soon", "score" ); +} + +checkscorelimit() +{ + if ( maps\mp\_utility::isobjectivebased() ) + return 0; + + if ( isdefined( level.scorelimitoverride ) && level.scorelimitoverride ) + return 0; + + if ( game["state"] != "playing" ) + return 0; + + if ( maps\mp\_utility::getwatcheddvar( "scorelimit" ) <= 0 ) + return 0; + + if ( level.teambased ) + { + if ( game["teamScores"]["allies"] < maps\mp\_utility::getwatcheddvar( "scorelimit" ) && game["teamScores"]["axis"] < maps\mp\_utility::getwatcheddvar( "scorelimit" ) ) + return 0; + } + else + { + if ( !isplayer( self ) ) + return 0; + + if ( self.score < maps\mp\_utility::getwatcheddvar( "scorelimit" ) ) + return 0; + } + + return onscorelimit(); +} + +updategametypedvars() +{ + level endon( "game_ended" ); + + while ( game["state"] == "playing" ) + { + if ( isdefined( level.starttime ) ) + { + if ( gettimeremaining() < 3000 ) + { + wait 0.1; + continue; + } + } + + wait 1; + } +} + +matchstarttimerpc() +{ + if ( !isdefined( level.prematchwaitforteams ) || level.prematchwaitforteams ) + { + thread matchstarttimer( "waiting_for_teams", level.prematchperiod + level.prematchperiodend ); + waitforplayers( level.prematchperiod ); + } + + if ( level.prematchperiodend > 0 ) + matchstarttimer( "match_starting_in", level.prematchperiodend ); +} + +matchstarttimer_internal( var_0, var_1 ) +{ + waittillframeend; + visionsetnaked( "mpIntro", 0 ); + level endon( "match_start_timer_beginning" ); + + while ( var_0 > 0 && !level.gameended ) + { + var_1 thread maps\mp\gametypes\_hud::fontpulse( level ); + wait( var_1.inframes * 0.05 ); + var_1 setvalue( var_0 ); + + if ( var_0 == 0 ) + visionsetnaked( "", 0 ); + + var_0--; + wait( 1 - var_1.inframes * 0.05 ); + } +} + +matchstarttimer( var_0, var_1 ) +{ + level notify( "match_start_timer_beginning" ); + var_2 = maps\mp\gametypes\_hud_util::createserverfontstring( "objective", 1.5 ); + var_2 maps\mp\gametypes\_hud_util::setpoint( "CENTER", "CENTER", 0, -40 ); + var_2.sort = 1001; + var_2 settext( game["strings"]["waiting_for_teams"] ); + var_2.foreground = 0; + var_2.hidewheninmenu = 1; + var_2 settext( game["strings"][var_0] ); + var_3 = maps\mp\gametypes\_hud_util::createserverfontstring( "hudbig", 1 ); + var_3 maps\mp\gametypes\_hud_util::setpoint( "CENTER", "CENTER", 0, 0 ); + var_3.sort = 1001; + var_3.color = ( 1, 1, 0 ); + var_3.foreground = 0; + var_3.hidewheninmenu = 1; + var_3 maps\mp\gametypes\_hud::fontpulseinit(); + var_4 = int( var_1 ); + + if ( var_4 >= 2 ) + { + matchstarttimer_internal( var_4, var_3 ); + visionsetnaked( "", 3.0 ); + } + else + { + visionsetnaked( "mpIntro", 0 ); + visionsetnaked( "", 1.0 ); + } + + var_3 maps\mp\gametypes\_hud_util::destroyelem(); + var_2 maps\mp\gametypes\_hud_util::destroyelem(); +} + +matchstarttimerskip() +{ + visionsetnaked( "", 0 ); +} + +onroundswitch() +{ + if ( !isdefined( game["switchedsides"] ) ) + game["switchedsides"] = 0; + + if ( game["roundsWon"]["allies"] == maps\mp\_utility::getwatcheddvar( "winlimit" ) - 1 && game["roundsWon"]["axis"] == maps\mp\_utility::getwatcheddvar( "winlimit" ) - 1 ) + { + var_0 = getbetterteam(); + + if ( var_0 != game["defenders"] ) + game["switchedsides"] = !game["switchedsides"]; + else + level.halftimesubcaption = ""; + + level.halftimetype = "overtime"; + } + else + { + level.halftimetype = "halftime"; + game["switchedsides"] = !game["switchedsides"]; + } +} + +checkroundswitch() +{ + if ( !level.teambased ) + return 0; + + if ( !isdefined( level.roundswitch ) || !level.roundswitch ) + return 0; + + if ( game["roundsPlayed"] % level.roundswitch == 0 ) + { + onroundswitch(); + return 1; + } + + return 0; +} + +timeuntilroundend() +{ + if ( level.gameended ) + { + var_0 = ( gettime() - level.gameendtime ) / 1000; + var_1 = level.postroundtime - var_0; + + if ( var_1 < 0 ) + return 0; + + return var_1; + } + + if ( maps\mp\_utility::gettimelimit() <= 0 ) + return undefined; + + if ( !isdefined( level.starttime ) ) + return undefined; + + var_2 = maps\mp\_utility::gettimelimit(); + var_0 = ( gettime() - level.starttime ) / 1000; + var_1 = maps\mp\_utility::gettimelimit() * 60 - var_0; + + if ( isdefined( level.timepaused ) ) + var_1 = var_1 + level.timepaused; + + return var_1 + level.postroundtime; +} + +freegameplayhudelems() +{ + if ( isdefined( self.perkicon ) ) + { + if ( isdefined( self.perkicon[0] ) ) + { + self.perkicon[0] maps\mp\gametypes\_hud_util::destroyelem(); + self.perkname[0] maps\mp\gametypes\_hud_util::destroyelem(); + } + + if ( isdefined( self.perkicon[1] ) ) + { + self.perkicon[1] maps\mp\gametypes\_hud_util::destroyelem(); + self.perkname[1] maps\mp\gametypes\_hud_util::destroyelem(); + } + + if ( isdefined( self.perkicon[2] ) ) + { + self.perkicon[2] maps\mp\gametypes\_hud_util::destroyelem(); + self.perkname[2] maps\mp\gametypes\_hud_util::destroyelem(); + } + } + + self notify( "perks_hidden" ); + self.lowermessage maps\mp\gametypes\_hud_util::destroyelem(); + self.lowertimer maps\mp\gametypes\_hud_util::destroyelem(); + + if ( isdefined( self.proxbar ) ) + self.proxbar maps\mp\gametypes\_hud_util::destroyelem(); + + if ( isdefined( self.proxbartext ) ) + self.proxbartext maps\mp\gametypes\_hud_util::destroyelem(); +} + +gethostplayer() +{ + var_0 = getentarray( "player", "classname" ); + + for ( var_1 = 0; var_1 < var_0.size; var_1++ ) + { + if ( var_0[var_1] ishost() ) + return var_0[var_1]; + } +} + +hostidledout() +{ + var_0 = gethostplayer(); + + if ( isdefined( var_0 ) && !var_0.hasspawned && !isdefined( var_0.selectedclass ) ) + return 1; + + return 0; +} + +roundendwait( var_0, var_1 ) +{ + var_2 = 0; + + while ( !var_2 ) + { + var_3 = level.players; + var_2 = 1; + + foreach ( var_5 in var_3 ) + { + if ( !isdefined( var_5.doingsplash ) ) + continue; + + if ( !var_5 maps\mp\gametypes\_hud_message::isdoingsplash() ) + continue; + + var_2 = 0; + } + + wait 0.5; + } + + if ( !var_1 ) + { + wait( var_0 ); + level notify( "round_end_finished" ); + return; + } + + wait( var_0 / 2 ); + level notify( "give_match_bonus" ); + wait( var_0 / 2 ); + var_2 = 0; + + while ( !var_2 ) + { + var_3 = level.players; + var_2 = 1; + + foreach ( var_5 in var_3 ) + { + if ( !isdefined( var_5.doingsplash ) ) + continue; + + if ( !var_5 maps\mp\gametypes\_hud_message::isdoingsplash() ) + continue; + + var_2 = 0; + } + + wait 0.5; + } + + level notify( "round_end_finished" ); +} + +roundenddof( var_0 ) +{ + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); +} + +fixbootlegbrush() +{ + var_0 = spawn( "script_model", ( -297, -1356.3, 159.2 ) ); + var_0.angles = ( 270, 102, 0 ); + var_0 setmodel( "me_chainlink_fence_pole" ); + var_1 = spawn( "script_model", ( -277.8, -1444.8, 70 ) ); + var_1.angles = ( 0, 0, 0 ); + var_1 setmodel( "me_chainlink_fence_pole" ); + var_2 = spawn( "script_model", ( -267.7, -1526.8, 159.5 ) ); + var_2.angles = ( 296, 97, -180 ); + var_2 setmodel( "me_chainlink_fence_pole" ); + var_3 = spawn( "script_model", ( -273.2, -1480.3, 159.1 ) ); + var_3.angles = ( 270, 97, 0 ); + var_3 setmodel( "me_chainlink_fence_pole" ); + var_4 = spawn( "script_model", ( -266.7, -1534.8, 159.1 ) ); + var_4.angles = ( 270, 277, 0 ); + var_4 setmodel( "me_chainlink_fence_pole" ); + var_5 = spawn( "script_model", ( -158.7, -1479.5, 159.2 ) ); + var_5.angles = ( 270, 90, 0 ); + var_5 setmodel( "me_chainlink_fence_pole" ); + var_6 = spawn( "script_model", ( -158.8, -1535.5, 159.2 ) ); + var_6.angles = ( 270, 270, 0 ); + var_6 setmodel( "me_chainlink_fence_pole" ); + var_7 = spawn( "script_model", ( -158.8, -1525.8, 159.5 ) ); + var_7.angles = ( 296, 90, -180 ); + var_7 setmodel( "me_chainlink_fence_pole" ); + var_8 = spawn( "script_model", ( -158.8, -1444.3, 70 ) ); + var_8.angles = ( 0, 0, 0 ); + var_8 setmodel( "me_chainlink_fence_pole" ); + var_9 = spawn( "script_model", ( -249.5, -1444.7, 159.2 ) ); + var_9.angles = ( 270, 180, 0 ); + var_9 setmodel( "me_chainlink_fence_pole" ); + var_10 = spawn( "script_model", ( -185, -1444.8, 159.2 ) ); + var_10.angles = ( 270, 360, 0 ); + var_10 setmodel( "me_chainlink_fence_pole" ); + var_11 = spawn( "script_model", ( -172, -1570.5, 159 ) ); + var_11.angles = ( 270, 361, 0 ); + var_11 setmodel( "me_chainlink_fence_pole" ); + var_12 = spawn( "script_model", ( -248.5, -1572, 159 ) ); + var_12.angles = ( 270, 181, 0 ); + var_12 setmodel( "me_chainlink_fence_pole" ); + var_13 = spawn( "script_model", ( -200, -1511, 161.5 ) ); + var_13.angles = ( 0, 181, -90 ); + var_13 setmodel( "me_corrugated_metal8x8" ); + var_14 = spawn( "script_model", ( -229.5, -1510.5, 161 ) ); + var_14.angles = ( 0, 181, -90 ); + var_14 setmodel( "me_corrugated_metal8x8" ); +} + +fixranktable() +{ + var_0 = 11; + var_1 = 0; + + for ( var_0 = 11; var_0 <= 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 ) ); + } +} + +callback_startgametype() +{ + maps\mp\_load::main(); + maps\mp\_utility::levelflaginit( "round_over", 0 ); + maps\mp\_utility::levelflaginit( "game_over", 0 ); + maps\mp\_utility::levelflaginit( "block_notifies", 0 ); + level.prematchperiod = 0; + level.prematchperiodend = 0; + level.postgamenotifies = 0; + level.intermission = 0; + makedvarserverinfo( "cg_thirdPersonAngle", 356 ); + makedvarserverinfo( "scr_gameended", 0 ); + + if ( !isdefined( game["gamestarted"] ) ) + { + game["clientid"] = 0; + var_0 = getmapcustom( "allieschar" ); + + if ( !isdefined( var_0 ) || var_0 == "" ) + { + if ( !isdefined( game["allies"] ) ) + var_0 = "sas_urban"; + else + var_0 = game["allies"]; + } + + var_1 = getmapcustom( "axischar" ); + + if ( !isdefined( var_1 ) || var_1 == "" ) + { + if ( !isdefined( game["axis"] ) ) + var_1 = "opforce_henchmen"; + else + var_1 = game["axis"]; + } + + game["allies"] = var_0; + game["axis"] = var_1; + + if ( !isdefined( game["attackers"] ) || !isdefined( game["defenders"] ) ) + thread common_scripts\utility::error( "No attackers or defenders team defined in level .gsc." ); + + if ( !isdefined( game["attackers"] ) ) + game["attackers"] = "allies"; + + if ( !isdefined( game["defenders"] ) ) + game["defenders"] = "axis"; + + if ( !isdefined( game["state"] ) ) + game["state"] = "playing"; + + precachestatusicon( "hud_status_dead" ); + precachestatusicon( "hud_status_connecting" ); + precachestring( &"MPUI_REVIVING" ); + precachestring( &"MPUI_BEING_REVIVED" ); + precacherumble( "damage_heavy" ); + precacheshader( "white" ); + precacheshader( "black" ); + game["strings"]["press_to_spawn"] = &"PLATFORM_PRESS_TO_SPAWN"; + + if ( level.teambased ) + { + game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_TEAMS"; + game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN"; + } + else + { + game["strings"]["waiting_for_teams"] = &"MP_WAITING_FOR_MORE_PLAYERS"; + game["strings"]["opponent_forfeiting_in"] = &"MP_OPPONENT_FORFEITING_IN"; + } + + game["strings"]["match_starting_in"] = &"MP_MATCH_STARTING_IN"; + game["strings"]["match_resuming_in"] = &"MP_MATCH_RESUMING_IN"; + game["strings"]["waiting_for_players"] = &"MP_WAITING_FOR_PLAYERS"; + game["strings"]["spawn_next_round"] = &"MP_SPAWN_NEXT_ROUND"; + game["strings"]["waiting_to_spawn"] = &"MP_WAITING_TO_SPAWN"; + game["strings"]["waiting_to_safespawn"] = &"MP_WAITING_TO_SAFESPAWN"; + game["strings"]["match_starting"] = &"MP_MATCH_STARTING"; + game["strings"]["change_class"] = &"MP_CHANGE_CLASS_NEXT_SPAWN"; + game["strings"]["last_stand"] = &"MPUI_LAST_STAND"; + game["strings"]["final_stand"] = &"MPUI_FINAL_STAND"; + game["strings"]["c4_death"] = &"MPUI_C4_DEATH"; + game["strings"]["cowards_way"] = &"PLATFORM_COWARDS_WAY_OUT"; + game["strings"]["tie"] = &"MP_MATCH_TIE"; + game["strings"]["round_draw"] = &"MP_ROUND_DRAW"; + game["strings"]["grabbed_flag"] = &"MP_GRABBED_FLAG_FIRST"; + game["strings"]["enemies_eliminated"] = &"MP_ENEMIES_ELIMINATED"; + game["strings"]["score_limit_reached"] = &"MP_SCORE_LIMIT_REACHED"; + game["strings"]["round_limit_reached"] = &"MP_ROUND_LIMIT_REACHED"; + game["strings"]["time_limit_reached"] = &"MP_TIME_LIMIT_REACHED"; + game["strings"]["players_forfeited"] = &"MP_PLAYERS_FORFEITED"; + game["strings"]["S.A.S Win"] = &"SAS_WIN"; + game["strings"]["Spetsnaz Win"] = &"SPETSNAZ_WIN"; + game["colors"]["blue"] = ( 0.25, 0.25, 0.75 ); + game["colors"]["red"] = ( 0.75, 0.25, 0.25 ); + game["colors"]["white"] = ( 1, 1, 1 ); + game["colors"]["black"] = ( 0, 0, 0 ); + game["colors"]["green"] = ( 0.25, 0.75, 0.25 ); + game["colors"]["yellow"] = ( 0.65, 0.65, 0 ); + game["colors"]["orange"] = ( 1, 0.45, 0 ); + game["strings"]["allies_eliminated"] = maps\mp\gametypes\_teams::getteameliminatedstring( "allies" ); + game["strings"]["allies_forfeited"] = maps\mp\gametypes\_teams::getteamforfeitedstring( "allies" ); + game["strings"]["allies_name"] = maps\mp\gametypes\_teams::getteamname( "allies" ); + game["icons"]["allies"] = maps\mp\gametypes\_teams::getteamicon( "allies" ); + game["colors"]["allies"] = maps\mp\gametypes\_teams::getteamcolor( "allies" ); + game["strings"]["axis_eliminated"] = maps\mp\gametypes\_teams::getteameliminatedstring( "axis" ); + game["strings"]["axis_forfeited"] = maps\mp\gametypes\_teams::getteamforfeitedstring( "axis" ); + game["strings"]["axis_name"] = maps\mp\gametypes\_teams::getteamname( "axis" ); + game["icons"]["axis"] = maps\mp\gametypes\_teams::getteamicon( "axis" ); + game["colors"]["axis"] = maps\mp\gametypes\_teams::getteamcolor( "axis" ); + + if ( game["colors"]["allies"] == ( 0, 0, 0 ) ) + game["colors"]["allies"] = ( 0.5, 0.5, 0.5 ); + + if ( game["colors"]["axis"] == ( 0, 0, 0 ) ) + game["colors"]["axis"] = ( 0.5, 0.5, 0.5 ); + + [[ level.onprecachegametype ]](); + + if ( getdvarint( "xblive_competitionmatch" ) && ( getdvarint( "systemlink" ) || !level.console && ( getdvar( "dedicated" ) == "dedicated LAN server" || getdvar( "dedicated" ) == "dedicated internet server" ) ) ) + level.prematchperiod = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "playerwaittime_comp" ); + else + level.prematchperiod = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "playerwaittime" ); + + level.prematchperiodend = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "matchstarttime" ); + } + else if ( level.console ) + { + if ( !level.splitscreen ) + level.prematchperiod = 5; + } + else + { + level.prematchperiod = 5; + level.prematchperiodend = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "matchstarttime" ); + } + + if ( !isdefined( game["status"] ) ) + game["status"] = "normal"; + + makedvarserverinfo( "ui_overtime", game["status"] == "overtime" ); + + if ( game["status"] != "overtime" && game["status"] != "halftime" ) + { + game["teamScores"]["allies"] = 0; + game["teamScores"]["axis"] = 0; + } + + if ( !isdefined( game["timePassed"] ) ) + game["timePassed"] = 0; + + if ( !isdefined( game["roundsPlayed"] ) ) + game["roundsPlayed"] = 0; + + if ( !isdefined( game["roundsWon"] ) ) + game["roundsWon"] = []; + + if ( level.teambased ) + { + if ( !isdefined( game["roundsWon"]["axis"] ) ) + game["roundsWon"]["axis"] = 0; + + if ( !isdefined( game["roundsWon"]["allies"] ) ) + game["roundsWon"]["allies"] = 0; + } + + level.gameended = 0; + level.forcedend = 0; + level.hostforcedend = 0; + level.hardcoremode = getdvarint( "g_hardcore" ); + + if ( level.hardcoremode ) + logstring( "game mode: hardcore" ); + + level.diehardmode = getdvarint( "scr_diehard" ); + + if ( !level.teambased ) + level.diehardmode = 0; + + if ( level.diehardmode ) + logstring( "game mode: diehard" ); + + level.killstreakrewards = getdvarint( "scr_game_hardpoints" ); + level.usestartspawn = 1; + level.objectivepointsmod = 1; + + if ( maps\mp\_utility::matchmakinggame() ) + level.maxallowedteamkills = 2; + else + level.maxallowedteamkills = -1; + + thread maps\mp\gametypes\_persistence::init(); + thread maps\mp\gametypes\_menus::init(); + thread maps\mp\gametypes\_hud::init(); + thread maps\mp\gametypes\_serversettings::init(); + thread maps\mp\gametypes\_teams::init(); + thread maps\mp\gametypes\_weapons::init(); + thread maps\mp\gametypes\_killcam::init(); + thread maps\mp\gametypes\_shellshock::init(); + thread maps\mp\gametypes\_deathicons::init(); + thread maps\mp\gametypes\_damagefeedback::init(); + thread maps\mp\gametypes\_healthoverlay::init(); + thread maps\mp\gametypes\_spectating::init(); + thread maps\mp\gametypes\_objpoints::init(); + thread maps\mp\gametypes\_gameobjects::init(); + thread maps\mp\gametypes\_spawnlogic::init(); + thread maps\mp\gametypes\_battlechatter_mp::init(); + thread maps\mp\gametypes\_music_and_dialog::init(); + thread maps\mp\_matchdata::init(); + thread maps\mp\_awards::init(); + thread maps\mp\_skill::init(); + thread maps\mp\_areas::init(); + thread maps\mp\killstreaks\_killstreaks::init(); + thread maps\mp\perks\_perks::init(); + thread maps\mp\_events::init(); + thread maps\mp\_defcon::init(); + thread maps\mp\_matchevents::init(); + thread maps\mp\gametypes\_damage::initfinalkillcam(); + + if ( level.teambased ) + thread maps\mp\gametypes\_friendicons::init(); + + thread maps\mp\gametypes\_hud_message::init(); + + if ( !level.console ) + thread maps\mp\gametypes\_quickmessages::init(); + + foreach ( var_3 in game["strings"] ) + precachestring( var_3 ); + + foreach ( var_6 in game["icons"] ) + precacheshader( var_6 ); + + game["gamestarted"] = 1; + level.maxplayercount = 0; + level.wavedelay["allies"] = 0; + level.wavedelay["axis"] = 0; + level.lastwave["allies"] = 0; + level.lastwave["axis"] = 0; + level.waveplayerspawnindex["allies"] = 0; + level.waveplayerspawnindex["axis"] = 0; + level.aliveplayers["allies"] = []; + level.aliveplayers["axis"] = []; + level.activeplayers = []; + makedvarserverinfo( "ui_scorelimit", 0 ); + makedvarserverinfo( "ui_allow_classchange", getdvar( "ui_allow_classchange" ) ); + makedvarserverinfo( "ui_allow_teamchange", 1 ); + setdvar( "ui_allow_teamchange", 1 ); + + if ( maps\mp\_utility::getgametypenumlives() ) + setdvar( "g_deadChat", 0 ); + else + setdvar( "g_deadChat", 1 ); + + var_8 = getdvarint( "scr_" + level.gametype + "_waverespawndelay" ); + + if ( var_8 ) + { + level.wavedelay["allies"] = var_8; + level.wavedelay["axis"] = var_8; + level.lastwave["allies"] = 0; + level.lastwave["axis"] = 0; + level thread wavespawntimer(); + } + + maps\mp\_utility::gameflaginit( "prematch_done", 0 ); + level.graceperiod = 15; + level.ingraceperiod = level.graceperiod; + maps\mp\_utility::gameflaginit( "graceperiod_done", 0 ); + level.roundenddelay = 4; + level.halftimeroundenddelay = 4; + level.noragdollents = getentarray( "noragdoll", "targetname" ); + + if ( level.teambased ) + { + maps\mp\gametypes\_gamescore::updateteamscore( "axis" ); + maps\mp\gametypes\_gamescore::updateteamscore( "allies" ); + } + else + thread maps\mp\gametypes\_gamescore::initialdmscoreupdate(); + + thread updateuiscorelimit(); + level notify( "update_scorelimit" ); + [[ level.onstartgametype ]](); + + /# + thread maps\mp\gametypes\_dev::init(); + #/ + + if ( level.script == "mp_bootleg" ) + fixbootlegbrush(); + + fixranktable(); + thread startgame(); + level thread maps\mp\_utility::updatewatcheddvars(); + level thread timelimitthread(); + level thread maps\mp\gametypes\_damage::dofinalkillcam(); +} + +callback_codeendgame() +{ + endparty(); + + if ( !level.gameended ) + level thread forceend(); +} + +verifydedicatedconfiguration() +{ + +} + +timelimitthread() +{ + level endon( "game_ended" ); + var_0 = maps\mp\_utility::gettimepassed(); + + while ( game["state"] == "playing" ) + { + thread checktimelimit( var_0 ); + var_0 = maps\mp\_utility::gettimepassed(); + + if ( isdefined( level.starttime ) ) + { + if ( gettimeremaining() < 3000 ) + { + wait 0.1; + continue; + } + } + + wait 1; + } +} + +updateuiscorelimit() +{ + for (;;) + { + level common_scripts\utility::waittill_either( "update_scorelimit", "update_winlimit" ); + + if ( !maps\mp\_utility::isroundbased() || !maps\mp\_utility::isobjectivebased() ) + { + setdvar( "ui_scorelimit", maps\mp\_utility::getwatcheddvar( "scorelimit" ) ); + thread checkscorelimit(); + continue; + } + + setdvar( "ui_scorelimit", maps\mp\_utility::getwatcheddvar( "winlimit" ) ); + } +} + +playtickingsound() +{ + self endon( "death" ); + self endon( "stop_ticking" ); + level endon( "game_ended" ); + var_0 = level.bombtimer; + + for (;;) + { + self playsound( "ui_mp_suitcasebomb_timer" ); + + if ( var_0 > 10 ) + { + var_0 = var_0 - 1; + wait 1; + } + else if ( var_0 > 4 ) + { + var_0 = var_0 - 0.5; + wait 0.5; + } + else if ( var_0 > 1 ) + { + var_0 = var_0 - 0.4; + wait 0.4; + } + else + { + var_0 = var_0 - 0.3; + wait 0.3; + } + + maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); + } +} + +stoptickingsound() +{ + self notify( "stop_ticking" ); +} + +timelimitclock() +{ + level endon( "game_ended" ); + wait 0.05; + var_0 = spawn( "script_origin", ( 0, 0, 0 ) ); + var_0 hide(); + + while ( game["state"] == "playing" ) + { + if ( !level.timerstopped && maps\mp\_utility::gettimelimit() ) + { + var_1 = gettimeremaining() / 1000; + var_2 = int( var_1 + 0.5 ); + + if ( maps\mp\_utility::gethalftime() && var_2 > maps\mp\_utility::gettimelimit() * 60 * 0.5 ) + var_2 = var_2 - int( maps\mp\_utility::gettimelimit() * 60 * 0.5 ); + + if ( var_2 >= 30 && var_2 <= 60 ) + level notify( "match_ending_soon", "time" ); + + if ( var_2 <= 10 || var_2 <= 30 && var_2 % 2 == 0 ) + { + level notify( "match_ending_very_soon" ); + + if ( var_2 == 0 ) + break; + + var_0 playsound( "ui_mp_timer_countdown" ); + } + + if ( var_1 - floor( var_1 ) >= 0.05 ) + wait( var_1 - floor( var_1 ) ); + } + + wait 1.0; + } +} + +gametimer() +{ + level endon( "game_ended" ); + level waittill( "prematch_over" ); + level.starttime = gettime(); + level.discardtime = 0; + + if ( isdefined( game["roundMillisecondsAlreadyPassed"] ) ) + { + level.starttime = level.starttime - game["roundMillisecondsAlreadyPassed"]; + game["roundMillisecondsAlreadyPassed"] = undefined; + } + + var_0 = gettime(); + + while ( game["state"] == "playing" ) + { + if ( !level.timerstopped ) + game["timePassed"] = game["timePassed"] + ( gettime() - var_0 ); + + var_0 = gettime(); + wait 1.0; + } +} + +updatetimerpausedness() +{ + var_0 = level.timerstoppedforgamemode || isdefined( level.hostmigrationtimer ); + + if ( !maps\mp\_utility::gameflag( "prematch_done" ) ) + var_0 = 0; + + if ( !level.timerstopped && var_0 ) + { + level.timerstopped = 1; + level.timerpausetime = gettime(); + } + else if ( level.timerstopped && !var_0 ) + { + level.timerstopped = 0; + level.discardtime = level.discardtime + gettime() - level.timerpausetime; + } +} + +pausetimer() +{ + level.timerstoppedforgamemode = 1; + updatetimerpausedness(); +} + +resumetimer() +{ + level.timerstoppedforgamemode = 0; + updatetimerpausedness(); +} + +startgame() +{ + thread gametimer(); + level.timerstopped = 0; + level.timerstoppedforgamemode = 0; + thread maps\mp\gametypes\_spawnlogic::spawnperframeupdate(); + prematchperiod(); + maps\mp\_utility::gameflagset( "prematch_done" ); + level notify( "prematch_over" ); + updatetimerpausedness(); + thread timelimitclock(); + thread graceperiod(); + thread maps\mp\gametypes\_missions::roundbegin(); +} + +wavespawntimer() +{ + level endon( "game_ended" ); + + while ( game["state"] == "playing" ) + { + var_0 = gettime(); + + if ( var_0 - level.lastwave["allies"] > level.wavedelay["allies"] * 1000 ) + { + level notify( "wave_respawn_allies" ); + level.lastwave["allies"] = var_0; + level.waveplayerspawnindex["allies"] = 0; + } + + if ( var_0 - level.lastwave["axis"] > level.wavedelay["axis"] * 1000 ) + { + level notify( "wave_respawn_axis" ); + level.lastwave["axis"] = var_0; + level.waveplayerspawnindex["axis"] = 0; + } + + wait 0.05; + } +} + +getbetterteam() +{ + var_0["allies"] = 0; + var_0["axis"] = 0; + var_1["allies"] = 0; + var_1["axis"] = 0; + + foreach ( var_3 in level.players ) + { + var_4 = var_3.pers["team"]; + + if ( isdefined( var_4 ) && ( var_4 == "allies" || var_4 == "axis" ) ) + { + var_0[var_4] = var_0[var_4] + var_3.kills; + var_1[var_4] = var_1[var_4] + var_3.deaths; + } + } + + if ( var_0["allies"] > var_0["axis"] ) + return "allies"; + else if ( var_0["axis"] > var_0["allies"] ) + return "axis"; + + if ( var_1["allies"] < var_1["axis"] ) + return "allies"; + else if ( var_1["axis"] < var_1["allies"] ) + return "axis"; + + if ( randomint( 2 ) == 0 ) + return "allies"; + + return "axis"; +} + +rankedmatchupdates( var_0 ) +{ + if ( maps\mp\_utility::matchmakinggame() ) + { + setxenonranks(); + + if ( hostidledout() ) + { + level.hostforcedend = 1; + logstring( "host idled out" ); + endlobby(); + } + + updatematchbonusscores( var_0 ); + } + + updatewinlossstats( var_0 ); +} + +displayroundend( var_0, var_1 ) +{ + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.connectedpostgame ) || var_3.pers["team"] == "spectator" ) + continue; + + if ( level.teambased ) + { + var_3 thread maps\mp\gametypes\_hud_message::teamoutcomenotify( var_0, 1, var_1 ); + continue; + } + + var_3 thread maps\mp\gametypes\_hud_message::outcomenotify( var_0, var_1 ); + } + + if ( !maps\mp\_utility::waslastround() ) + level notify( "round_win", var_0 ); + + if ( maps\mp\_utility::waslastround() ) + roundendwait( level.roundenddelay, 0 ); + else + roundendwait( level.roundenddelay, 1 ); +} + +displaygameend( var_0, var_1 ) +{ + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.connectedpostgame ) || var_3.pers["team"] == "spectator" ) + continue; + + if ( level.teambased ) + { + var_3 thread maps\mp\gametypes\_hud_message::teamoutcomenotify( var_0, 0, var_1 ); + continue; + } + + var_3 thread maps\mp\gametypes\_hud_message::outcomenotify( var_0, var_1 ); + } + + level notify( "game_win", var_0 ); + roundendwait( level.postroundtime, 1 ); +} + +displayroundswitch() +{ + var_0 = level.halftimetype; + + if ( var_0 == "halftime" ) + { + if ( maps\mp\_utility::getwatcheddvar( "roundlimit" ) ) + { + if ( game["roundsPlayed"] * 2 == maps\mp\_utility::getwatcheddvar( "roundlimit" ) ) + var_0 = "halftime"; + else + var_0 = "intermission"; + } + else if ( maps\mp\_utility::getwatcheddvar( "winlimit" ) ) + { + if ( game["roundsPlayed"] == maps\mp\_utility::getwatcheddvar( "winlimit" ) - 1 ) + var_0 = "halftime"; + else + var_0 = "intermission"; + } + else + var_0 = "intermission"; + } + + level notify( "round_switch", var_0 ); + + foreach ( var_2 in level.players ) + { + if ( isdefined( var_2.connectedpostgame ) || var_2.pers["team"] == "spectator" ) + continue; + + var_2 thread maps\mp\gametypes\_hud_message::teamoutcomenotify( var_0, 1, level.halftimesubcaption ); + } + + roundendwait( level.halftimeroundenddelay, 0 ); +} + +endgameovertime( var_0, var_1 ) +{ + visionsetnaked( "mpOutro", 0.5 ); + setdvar( "scr_gameended", 3 ); + + foreach ( var_3 in level.players ) + { + var_3 thread freezeplayerforroundend( 0 ); + var_3 thread roundenddof( 4.0 ); + var_3 freegameplayhudelems(); + var_3 setclientdvars( "cg_everyoneHearsEveryone", 1 ); + var_3 setclientdvars( "cg_drawSpectatorMessages", 0, "g_compassShowEnemies", 0 ); + + if ( var_3.pers["team"] == "spectator" ) + var_3 thread maps\mp\gametypes\_playerlogic::spawnintermission(); + } + + level notify( "round_switch", "overtime" ); + + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.connectedpostgame ) || var_3.pers["team"] == "spectator" ) + continue; + + if ( level.teambased ) + { + var_3 thread maps\mp\gametypes\_hud_message::teamoutcomenotify( var_0, 0, var_1 ); + continue; + } + + var_3 thread maps\mp\gametypes\_hud_message::outcomenotify( var_0, var_1 ); + } + + roundendwait( level.roundenddelay, 0 ); + + if ( isdefined( level.finalkillcam_winner ) ) + { + level.finalkillcam_timegameended[level.finalkillcam_winner] = maps\mp\_utility::getsecondspassed(); + + foreach ( var_3 in level.players ) + var_3 notify( "reset_outcome" ); + + level notify( "game_cleanup" ); + waittillfinalkillcamdone(); + } + + game["status"] = "overtime"; + level notify( "restarting" ); + game["state"] = "playing"; + map_restart( 1 ); +} + +endgamehalftime() +{ + visionsetnaked( "mpOutro", 0.5 ); + setdvar( "scr_gameended", 2 ); + game["switchedsides"] = !game["switchedsides"]; + + foreach ( var_1 in level.players ) + { + var_1 thread freezeplayerforroundend( 0 ); + var_1 thread roundenddof( 4.0 ); + var_1 freegameplayhudelems(); + var_1 setclientdvars( "cg_everyoneHearsEveryone", 1 ); + var_1 setclientdvars( "cg_drawSpectatorMessages", 0, "g_compassShowEnemies", 0 ); + + if ( var_1.pers["team"] == "spectator" ) + var_1 thread maps\mp\gametypes\_playerlogic::spawnintermission(); + } + + foreach ( var_1 in level.players ) + var_1.pers["stats"] = var_1.stats; + + level notify( "round_switch", "halftime" ); + + foreach ( var_1 in level.players ) + { + if ( isdefined( var_1.connectedpostgame ) || var_1.pers["team"] == "spectator" ) + continue; + + var_1 thread maps\mp\gametypes\_hud_message::teamoutcomenotify( "halftime", 1, level.halftimesubcaption ); + } + + roundendwait( level.roundenddelay, 0 ); + + if ( isdefined( level.finalkillcam_winner ) ) + { + level.finalkillcam_timegameended[level.finalkillcam_winner] = maps\mp\_utility::getsecondspassed(); + + foreach ( var_1 in level.players ) + var_1 notify( "reset_outcome" ); + + level notify( "game_cleanup" ); + waittillfinalkillcamdone(); + } + + game["status"] = "halftime"; + level notify( "restarting" ); + game["state"] = "playing"; + map_restart( 1 ); +} + +endgame( var_0, var_1, var_2 ) +{ + if ( !isdefined( var_2 ) ) + var_2 = 0; + + if ( game["state"] == "postgame" || level.gameended && ( !isdefined( level.gtnw ) || !level.gtnw ) ) + return; + + game["state"] = "postgame"; + level.gameendtime = gettime(); + level.gameended = 1; + level.ingraceperiod = 0; + level notify( "game_ended", var_0 ); + maps\mp\_utility::levelflagset( "game_over" ); + maps\mp\_utility::levelflagset( "block_notifies" ); + common_scripts\utility::waitframe(); + setgameendtime( 0 ); + var_3 = getmatchdata( "gameLength" ); + var_3 = var_3 + int( maps\mp\_utility::getsecondspassed() ); + setmatchdata( "gameLength", var_3 ); + maps\mp\gametypes\_playerlogic::printpredictedspawnpointcorrectness(); + + if ( isdefined( var_0 ) && isstring( var_0 ) && var_0 == "overtime" ) + { + level.finalkillcam_winner = "none"; + endgameovertime( var_0, var_1 ); + return; + } + + if ( isdefined( var_0 ) && isstring( var_0 ) && var_0 == "halftime" ) + { + level.finalkillcam_winner = "none"; + endgamehalftime(); + return; + } + + if ( isdefined( level.finalkillcam_winner ) ) + level.finalkillcam_timegameended[level.finalkillcam_winner] = maps\mp\_utility::getsecondspassed(); + + game["roundsPlayed"]++; + + if ( level.teambased ) + { + if ( var_0 == "axis" || var_0 == "allies" ) + game["roundsWon"][var_0]++; + + maps\mp\gametypes\_gamescore::updateteamscore( "axis" ); + maps\mp\gametypes\_gamescore::updateteamscore( "allies" ); + } + else if ( isdefined( var_0 ) && isplayer( var_0 ) ) + game["roundsWon"][var_0.guid]++; + + maps\mp\gametypes\_gamescore::updateplacement(); + rankedmatchupdates( var_0 ); + + foreach ( var_5 in level.players ) + { + var_5 setclientdvar( "ui_opensummary", 1 ); + + if ( maps\mp\_utility::wasonlyround() || maps\mp\_utility::waslastround() ) + var_5 maps\mp\killstreaks\_killstreaks::clearkillstreaks(); + } + + setdvar( "g_deadChat", 1 ); + setdvar( "ui_allow_teamchange", 0 ); + + foreach ( var_5 in level.players ) + { + var_5 thread freezeplayerforroundend( 1.0 ); + var_5 thread roundenddof( 4.0 ); + var_5 freegameplayhudelems(); + var_5 setclientdvars( "cg_everyoneHearsEveryone", 1 ); + var_5 setclientdvars( "cg_drawSpectatorMessages", 0, "g_compassShowEnemies", 0, "cg_fovScale", 1 ); + + if ( var_5.pers["team"] == "spectator" ) + var_5 thread maps\mp\gametypes\_playerlogic::spawnintermission(); + } + + if ( !var_2 ) + visionsetnaked( "mpOutro", 0.5 ); + + if ( !maps\mp\_utility::wasonlyround() && !var_2 ) + { + setdvar( "scr_gameended", 2 ); + displayroundend( var_0, var_1 ); + + if ( isdefined( level.finalkillcam_winner ) ) + { + foreach ( var_5 in level.players ) + var_5 notify( "reset_outcome" ); + + level notify( "game_cleanup" ); + waittillfinalkillcamdone(); + } + + if ( !maps\mp\_utility::waslastround() ) + { + maps\mp\_utility::levelflagclear( "block_notifies" ); + + if ( checkroundswitch() ) + displayroundswitch(); + + foreach ( var_5 in level.players ) + var_5.pers["stats"] = var_5.stats; + + level notify( "restarting" ); + game["state"] = "playing"; + map_restart( 1 ); + return; + } + + if ( !level.forcedend ) + var_1 = updateendreasontext( var_0 ); + } + + if ( var_1 == game["strings"]["time_limit_reached"] ) + setdvar( "scr_gameended", 3 ); + else + { + switch ( level.gametype ) + { + case "koth": + case "sab": + case "sd": + case "dom": + case "ctf": + case "conf": + setdvar( "scr_gameended", 4 ); + break; + default: + setdvar( "scr_gameended", 1 ); + break; + } + } + + if ( !isdefined( game["clientMatchDataDef"] ) ) + { + game["clientMatchDataDef"] = "mp/clientmatchdata.def"; + setclientmatchdatadef( game["clientMatchDataDef"] ); + } + + maps\mp\gametypes\_missions::roundend( var_0 ); + displaygameend( var_0, var_1 ); + + if ( isdefined( level.finalkillcam_winner ) && maps\mp\_utility::wasonlyround() ) + { + foreach ( var_5 in level.players ) + var_5 notify( "reset_outcome" ); + + level notify( "game_cleanup" ); + waittillfinalkillcamdone(); + } + + maps\mp\_utility::levelflagclear( "block_notifies" ); + level.intermission = 1; + level notify( "spawning_intermission" ); + + foreach ( var_5 in level.players ) + { + var_5 closepopupmenu(); + var_5 closeingamemenu(); + var_5 notify( "reset_outcome" ); + var_5 thread maps\mp\gametypes\_playerlogic::spawnintermission(); + } + + processlobbydata(); + wait 1.0; + checkforpersonalbests(); + + if ( level.teambased ) + { + if ( var_0 == "axis" || var_0 == "allies" ) + setmatchdata( "victor", var_0 ); + else + setmatchdata( "victor", "none" ); + + setmatchdata( "alliesScore", getteamscore( "allies" ) ); + setmatchdata( "axisScore", getteamscore( "axis" ) ); + } + else + setmatchdata( "victor", "none" ); + + setmatchdata( "host", level.sendmatchdata ); + sendmatchdata(); + + foreach ( var_5 in level.players ) + var_5.pers["stats"] = var_5.stats; + + if ( !var_2 && !level.postgamenotifies ) + { + if ( !maps\mp\_utility::wasonlyround() ) + wait 6.0; + else + wait 3.0; + } + else + wait( min( 10.0, 4.0 + level.postgamenotifies ) ); + + level notify( "exitLevel_called" ); + exitlevel( 0 ); +} + +updateendreasontext( var_0 ) +{ + if ( !level.teambased ) + return 1; + + if ( maps\mp\_utility::hitroundlimit() ) + return &"MP_ROUND_LIMIT_REACHED"; + + if ( maps\mp\_utility::hitwinlimit() ) + return &"MP_SCORE_LIMIT_REACHED"; + + if ( var_0 == "axis" ) + return &"SPETSNAZ_WIN"; + else + return &"SAS_WIN"; +} + +estimatedtimetillscorelimit( var_0 ) +{ + var_1 = getscoreperminute( var_0 ); + var_2 = getscoreperremaining( var_0 ); + var_3 = 999999; + + if ( var_1 ) + var_3 = var_2 / var_1; + + return var_3; +} + +getscoreperminute( var_0 ) +{ + var_1 = maps\mp\_utility::getwatcheddvar( "scorelimit" ); + var_2 = maps\mp\_utility::gettimelimit(); + var_3 = maps\mp\_utility::gettimepassed() / 60000 + 0.0001; + + if ( isplayer( self ) ) + var_4 = self.score / var_3; + else + var_4 = getteamscore( var_0 ) / var_3; + + return var_4; +} + +getscoreperremaining( var_0 ) +{ + var_1 = maps\mp\_utility::getwatcheddvar( "scorelimit" ); + + if ( isplayer( self ) ) + var_2 = var_1 - self.score; + else + var_2 = var_1 - getteamscore( var_0 ); + + return var_2; +} + +givelastonteamwarning() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + maps\mp\_utility::waittillrecoveredhealth( 3 ); + var_0 = maps\mp\_utility::getotherteam( self.pers["team"] ); + thread maps\mp\_utility::teamplayercardsplash( "callout_lastteammemberalive", self, self.pers["team"] ); + thread maps\mp\_utility::teamplayercardsplash( "callout_lastenemyalive", self, var_0 ); + level notify( "last_alive", self ); +} + +processlobbydata() +{ + var_0 = 0; + + foreach ( var_2 in level.players ) + { + if ( !isdefined( var_2 ) ) + continue; + + var_2.clientmatchdataid = var_0; + var_0++; + + if ( level.ps3 && var_2.name.size > level.maxnamelength ) + { + var_3 = ""; + + for ( var_4 = 0; var_4 < level.maxnamelength - 3; var_4++ ) + var_3 = var_3 + var_2.name[var_4]; + + var_3 = var_3 + "..."; + } + else + var_3 = var_2.name; + + setclientmatchdata( "players", var_2.clientmatchdataid, "xuid", var_3 ); + } + + maps\mp\_awards::assignawards(); + maps\mp\gametypes\_scoreboard::processlobbyscoreboards(); + sendclientmatchdata(); +} + +trackleaderboarddeathstats( var_0, var_1 ) +{ + thread threadedsetweaponstatbyname( var_0, 1, "deaths" ); +} + +trackattackerleaderboarddeathstats( var_0, var_1 ) +{ + if ( isdefined( self ) && isplayer( self ) ) + { + if ( var_1 != "MOD_FALLING" ) + { + if ( var_1 == "MOD_MELEE" && issubstr( var_0, "tactical" ) ) + { + maps\mp\_matchdata::logattachmentstat( "tactical", "kills", 1 ); + maps\mp\_matchdata::logattachmentstat( "tactical", "hits", 1 ); + maps\mp\gametypes\_persistence::incrementattachmentstat( "tactical", "kills", 1 ); + maps\mp\gametypes\_persistence::incrementattachmentstat( "tactical", "hits", 1 ); + return; + } + + if ( var_1 == "MOD_MELEE" && !issubstr( var_0, "riotshield" ) ) + { + maps\mp\_matchdata::logattachmentstat( "none", "kills", 1 ); + maps\mp\_matchdata::logattachmentstat( "none", "hits", 1 ); + maps\mp\gametypes\_persistence::incrementattachmentstat( "none", "kills", 1 ); + maps\mp\gametypes\_persistence::incrementattachmentstat( "none", "hits", 1 ); + return; + } + + thread threadedsetweaponstatbyname( var_0, 1, "kills" ); + } + + if ( var_1 == "MOD_HEAD_SHOT" ) + thread threadedsetweaponstatbyname( var_0, 1, "headShots" ); + } +} + +setweaponstat( var_0, var_1, var_2 ) +{ + if ( !var_1 ) + return; + + var_3 = maps\mp\_utility::getweaponclass( var_0 ); + + if ( maps\mp\_utility::iskillstreakweapon( var_0 ) || var_3 == "killstreak" || var_3 == "deathstreak" || var_3 == "other" ) + return; + + if ( maps\mp\_utility::isenvironmentweapon( var_0 ) ) + return; + + if ( var_3 == "weapon_grenade" || var_3 == "weapon_riot" || var_3 == "weapon_explosive" ) + { + var_4 = maps\mp\_utility::strip_suffix( var_0, "_mp" ); + maps\mp\gametypes\_persistence::incrementweaponstat( var_4, var_2, var_1 ); + maps\mp\_matchdata::logweaponstat( var_4, var_2, var_1 ); + return; + } + + if ( var_2 != "deaths" && var_3 != "weapon_projectile" ) + var_0 = self getcurrentweapon(); + + if ( maps\mp\_utility::iskillstreakweapon( var_0 ) || var_3 == "killstreak" || var_3 == "deathstreak" || var_3 == "other" ) + return; + + if ( !isdefined( self.trackingweaponname ) ) + self.trackingweaponname = var_0; + + if ( var_0 != self.trackingweaponname ) + { + maps\mp\gametypes\_persistence::updateweaponbufferedstats(); + self.trackingweaponname = var_0; + } + + switch ( var_2 ) + { + case "shots": + self.trackingweaponshots++; + break; + case "hits": + self.trackingweaponhits++; + break; + case "headShots": + self.trackingweaponheadshots++; + self.trackingweaponhits++; + break; + case "kills": + self.trackingweaponkills++; + break; + } + + if ( var_2 == "deaths" ) + { + var_5 = var_0; + var_6 = strtok( var_0, "_" ); + var_7 = undefined; + + if ( var_6[0] == "iw5" ) + var_4 = var_6[0] + "_" + var_6[1]; + else if ( var_6[0] == "alt" ) + var_4 = var_6[1] + "_" + var_6[2]; + else + var_4 = var_6[0]; + + if ( !maps\mp\_utility::iscacprimaryweapon( var_4 ) && !maps\mp\_utility::iscacsecondaryweapon( var_4 ) ) + return; + + if ( var_6[0] == "alt" ) + { + var_4 = var_6[1] + "_" + var_6[2]; + + foreach ( var_9 in var_6 ) + { + if ( var_9 == "gl" || var_9 == "gp25" || var_9 == "m320" ) + { + var_7 = "gl"; + break; + } + + if ( var_9 == "shotgun" ) + { + var_7 = "shotgun"; + break; + } + } + } + + if ( isdefined( var_7 ) && ( var_7 == "gl" || var_7 == "shotgun" ) ) + { + maps\mp\gametypes\_persistence::incrementattachmentstat( var_7, var_2, var_1 ); + maps\mp\_matchdata::logattachmentstat( var_7, var_2, var_1 ); + return; + } + + maps\mp\gametypes\_persistence::incrementweaponstat( var_4, var_2, var_1 ); + maps\mp\_matchdata::logweaponstat( var_4, "deaths", var_1 ); + + if ( var_6[0] != "none" ) + { + for ( var_11 = 0; var_11 < var_6.size; var_11++ ) + { + if ( var_6[var_11] == "alt" ) + { + var_11 = var_11 + 2; + continue; + } + + if ( var_6[var_11] == "iw5" ) + { + var_11 = var_11 + 1; + continue; + } + + if ( var_6[var_11] == "mp" ) + continue; + + if ( issubstr( var_6[var_11], "camo" ) ) + continue; + + if ( issubstr( var_6[var_11], "scope" ) && !issubstr( var_6[var_11], "vz" ) ) + continue; + + if ( issubstr( var_6[var_11], "scope" ) && issubstr( var_6[var_11], "vz" ) ) + var_6[var_11] = "vzscope"; + + var_6[var_11] = maps\mp\_utility::validateattachment( var_6[var_11] ); + + if ( var_11 == 0 && ( var_6[var_11] != "iw5" && var_6[var_11] != "alt" ) ) + continue; + + maps\mp\gametypes\_persistence::incrementattachmentstat( var_6[var_11], var_2, var_1 ); + maps\mp\_matchdata::logattachmentstat( var_6[var_11], var_2, var_1 ); + } + } + } +} + +setinflictorstat( var_0, var_1, var_2 ) +{ + if ( !isdefined( var_1 ) ) + return; + + if ( !isdefined( var_0 ) ) + { + var_1 setweaponstat( var_2, 1, "hits" ); + return; + } + + if ( !isdefined( var_0.playeraffectedarray ) ) + var_0.playeraffectedarray = []; + + var_3 = 1; + + for ( var_4 = 0; var_4 < var_0.playeraffectedarray.size; var_4++ ) + { + if ( var_0.playeraffectedarray[var_4] == self ) + { + var_3 = 0; + break; + } + } + + if ( var_3 ) + { + var_0.playeraffectedarray[var_0.playeraffectedarray.size] = self; + var_1 setweaponstat( var_2, 1, "hits" ); + } +} + +threadedsetweaponstatbyname( var_0, var_1, var_2 ) +{ + self endon( "disconnect" ); + waittillframeend; + setweaponstat( var_0, var_1, var_2 ); +} + +checkforpersonalbests() +{ + foreach ( var_1 in level.players ) + { + if ( !isdefined( var_1 ) ) + continue; + + if ( var_1 maps\mp\_utility::rankingenabled() ) + { + var_2 = var_1 getplayerdata( "round", "kills" ); + var_3 = var_1 getplayerdata( "round", "deaths" ); + var_4 = var_1.pers["summary"]["xp"]; + var_5 = var_1 getplayerdata( "bestKills" ); + var_6 = var_1 getplayerdata( "mostDeaths" ); + var_7 = var_1 getplayerdata( "mostXp" ); + + if ( var_2 > var_5 ) + var_1 setplayerdata( "bestKills", var_2 ); + + if ( var_4 > var_7 ) + var_1 setplayerdata( "mostXp", var_4 ); + + if ( var_3 > var_6 ) + var_1 setplayerdata( "mostDeaths", var_3 ); + + var_1 checkforbestweapon(); + var_1 maps\mp\_matchdata::logplayerxp( var_4, "totalXp" ); + var_1 maps\mp\_matchdata::logplayerxp( var_1.pers["summary"]["score"], "scoreXp" ); + var_1 maps\mp\_matchdata::logplayerxp( var_1.pers["summary"]["challenge"], "challengeXp" ); + var_1 maps\mp\_matchdata::logplayerxp( var_1.pers["summary"]["match"], "matchXp" ); + var_1 maps\mp\_matchdata::logplayerxp( var_1.pers["summary"]["misc"], "miscXp" ); + } + + if ( isdefined( var_1.pers["confirmed"] ) ) + var_1 maps\mp\_matchdata::logkillsconfirmed(); + + if ( isdefined( var_1.pers["denied"] ) ) + var_1 maps\mp\_matchdata::logkillsdenied(); + } +} + +checkforbestweapon() +{ + var_0 = maps\mp\_matchdata::buildbaseweaponlist(); + + for ( var_1 = 0; var_1 < var_0.size; var_1++ ) + { + var_2 = var_0[var_1]; + var_3 = strtok( var_2, "_" ); + + if ( var_3[0] == "iw5" ) + var_2 = var_3[0] + "_" + var_3[1]; + + if ( var_3[0] == "alt" ) + var_2 = var_3[1] + "_" + var_3[2]; + + var_4 = maps\mp\_utility::getweaponclass( var_2 ); + + if ( !maps\mp\_utility::iskillstreakweapon( var_2 ) && var_4 != "killstreak" && var_4 != "deathstreak" && var_4 != "other" ) + { + var_5 = self getplayerdata( "bestWeapon", "kills" ); + var_6 = getmatchdata( "players", self.clientid, "weaponStats", var_2, "kills" ); + + if ( var_6 > var_5 ) + { + self setplayerdata( "bestWeapon", "kills", var_6 ); + var_7 = getmatchdata( "players", self.clientid, "weaponStats", var_2, "shots" ); + var_8 = getmatchdata( "players", self.clientid, "weaponStats", var_2, "headShots" ); + var_9 = getmatchdata( "players", self.clientid, "weaponStats", var_2, "hits" ); + var_10 = getmatchdata( "players", self.clientid, "weaponStats", var_2, "deaths" ); + var_11 = getmatchdata( "players", self.clientid, "weaponStats", var_2, "XP" ); + self setplayerdata( "bestWeapon", "shots", var_7 ); + self setplayerdata( "bestWeapon", "headShots", var_8 ); + self setplayerdata( "bestWeapon", "hits", var_9 ); + self setplayerdata( "bestWeapon", "deaths", var_10 ); + self setplayerdata( "bestWeaponXP", var_11 ); + self setplayerdata( "bestWeaponIndex", var_1 ); + } + } + } +}