diff --git a/cfg/!start_client.bat b/cfg/!start_client.bat new file mode 100644 index 0000000..c5dfe61 --- /dev/null +++ b/cfg/!start_client.bat @@ -0,0 +1,14 @@ +@echo off + +:: Either put the batch in the Advanced Warfare install dir, or change the value below to the Advanced Warfare install dir +set AW_INSTALL=%~dp0 + +:: Remove this line if automatic updates on start should be disabled +start /W alterware-launcher.exe --update + +:://///////////////////////////////////////////////////////////////////// +:://You're done!! WARNING!!! Don't mess with anything below this line // +:://///////////////////////////////////////////////////////////////////// + +set GAME_EXE=s1-mod.exe +start %GAME_EXE% diff --git a/cfg/!start_horde_server.bat b/cfg/!start_horde_server.bat new file mode 100644 index 0000000..6a6305c --- /dev/null +++ b/cfg/!start_horde_server.bat @@ -0,0 +1,23 @@ +@echo off + +set ServerFilename=server_horde.cfg + +::///////////////////////////////////////////////////////////////////////////// +::// What port do you want the server to run on? // +::// You must port forward this port & allow it through your firewall // +::///////////////////////////////////////////////////////////////////////////// +set port=27016 + + +:: Either put the batch in the Advanced Warfare install dir, or change the value below to the Advanced Warfare install dir +set AW_INSTALL=%~dp0 + +:: Remove this line if automatic updates on start should be disabled +start /W alterware-launcher.exe --update + +:://///////////////////////////////////////////////////////////////////// +:://You're done!! WARNING!!! Don't mess with anything below this line // +:://///////////////////////////////////////////////////////////////////// + +set GAME_EXE=s1-mod.exe +start %GAME_EXE% -dedicated +survival 1 +set net_port "%port%" +exec %ServerFilename% +map_rotate diff --git a/cfg/!start_mp_server.bat b/cfg/!start_mp_server.bat new file mode 100644 index 0000000..c88975e --- /dev/null +++ b/cfg/!start_mp_server.bat @@ -0,0 +1,22 @@ +@echo off + +set ServerFilename=server.cfg + +::///////////////////////////////////////////////////////////////////////////// +::// What port do you want the server to run on? // +::// You must port forward this port & allow it through your firewall // +::///////////////////////////////////////////////////////////////////////////// +set port=27016 + +:: Either put the batch in the Advanced Warfare install dir, or change the value below to the Advanced Warfare install dir +set AW_INSTALL=%~dp0 + +:: Remove this line if automatic updates on start should be disabled +start /W alterware-launcher.exe --update + +:://///////////////////////////////////////////////////////////////////// +:://You're done!! WARNING!!! Don't mess with anything below this line // +:://///////////////////////////////////////////////////////////////////// + +set GAME_EXE=s1-mod.exe +start %GAME_EXE% -dedicated +set net_port "%port%" +exec %ServerFilename% +map_rotate diff --git a/cfg/!start_zm_server.bat b/cfg/!start_zm_server.bat new file mode 100644 index 0000000..929e4bb --- /dev/null +++ b/cfg/!start_zm_server.bat @@ -0,0 +1,23 @@ +@echo off + +set ServerFilename=server_zm.cfg + +::///////////////////////////////////////////////////////////////////////////// +::// What port do you want the server to run on? // +::// You must port forward this port & allow it through your firewall // +::///////////////////////////////////////////////////////////////////////////// +set port=27016 + + +:: Either put the batch in the Advanced Warfare install dir, or change the value below to the Advanced Warfare install dir +set AW_INSTALL=%~dp0 + +:: Remove this line if automatic updates on start should be disabled +start /W alterware-launcher.exe --update + +:://///////////////////////////////////////////////////////////////////// +:://You're done!! WARNING!!! Don't mess with anything below this line // +:://///////////////////////////////////////////////////////////////////// + +set GAME_EXE=s1-mod.exe +start %GAME_EXE% -dedicated +zombiesMode 1 +set net_port "%port%" +exec %ServerFilename% +map_rotate diff --git a/cfg/s1/server.cfg b/cfg/s1/server.cfg new file mode 100644 index 0000000..82f16b3 --- /dev/null +++ b/cfg/s1/server.cfg @@ -0,0 +1,255 @@ +////////////////////////////////////////////////// +/// S1 Server Configuration // +////////////////////////////////////////////////// + +////////////////////////////////////////////////// +// SERVER NAME & COLORS TIPS // +////////////////////////////////////////////////// +// // +// ^1 Red // +// ^2 Green // +// ^3 Yellow // +// ^4 Blue // +// ^5 Cyan // +// ^6 Pink // +// ^7 White // +// ^8 Depends on the team colors playing. // +// ^9 Grey // +// ^0 Black // +// ^: Rainbow colors // +// // +////////////////////////////////////////////////// + +set sv_hostname "S1 Default Server" // Sets the server hostname. +set sv_motd "" // Sets a custom motd which is shown on the intel message loadscreen when a player joins. Leave blank for default intel messages. + +////////////////////////////////////////////////// +// ADMIN INFO (Optional) // +////////////////////////////////////////////////// + +set _Admin "" // Your username. +set _Email "" // E-mail address. you can leave blank +set _Website "" // Website. (IW4MAdmin uses this.) +set _Location "Earth" // Location + +////////////////////////////////////////////////// +// NON-GAMEPLAY CONFIGURATION // +////////////////////////////////////////////////// + +set scr_game_high_jump 1 // Disable Exos? +set party_maxplayers "18" // Max players in your server. +set rcon_password "" // Access to your server to change stuff remotely or ingame. (Empty = disabled) +set g_password "" // Password Protected Server. Leave blank if you want players to join or set password if you want to keep public out. +set sv_privateClients "0" // Maximum number of private clients allowed on the server (range 0-18 (clamped to sv_maxclients) ) +set sv_privatePassword "" // Password for reserved slots. +set sv_voice "2" // Server voice chat configuration ( 0 = "No Chat", 1 = "Free Chat", 2 = "Team Chat" (default) ) +set g_allowVote "1" // Toggle voting for [player kick/map restart/next map] (0 or 1 (default) ) +set g_deadChat "0" // Toggle allowing dead players to chat with living players (0 (default) or 1) +set g_inactivity "420" // Time in seconds before the server will kick a user for inactivity (range 0 - 10000) +set sv_kickBanTime "3600" // Time in seconds for a player temporary ban (on kick/tempban) (range 0 - 3600) +set sv_allowClientConsole "1" // Enable or Disable players ability to access server commands +set sv_timeout "60" // Timeout time period. You will timeout after (60) seconds when attempting to connect or if you are getting connection interruptions +set sv_reconnectlimit "3" // How many times you can try to reconnect +set sv_pure "1" // verifying cilent files +set sv_floodProtect "1" // Chat Spam Protection +set sv_sayName "console" // name server-side 'say' commands show up as +set logfile "2" // Enable loging 1-2? enable. 0 disable. Leave it on if you plan on using B3 or IW4MAdmin. +set g_logSync "1" // 1 always flush games_mp.log, 0 only flush on game end. Recommended to stay on for b3 and IW4MAdmin +set g_log "s1/logs/games_mp.log" // Gamelog filename. If you edit this, Make sure you change B3.xml if you have bigbrotherbot. IW4MAdmin auto-detects however. + +////////////////////////////////////////////////// +// BASE GAME CONFIGURATION // +////////////////////////////////////////////////// +// // +// dm - Free-for-all // +// war - Team Deathmatch // +// twar - Momentum // +// ball - Uplink // +// sd - Search and Destroy // +// sr - Search and Rescue // +// dom - Domination // +// conf - Kill Confirmed // +// ctf - Capture the Flag // +// hp - Hardpoint // +// infect - Infected // +// // +////////////////////////////////////////////////// + +set g_gametype "war" // Default gametype in case map rotation doesn't have any gametypes. Choose a gametype from the list above. +set scr_game_allowkillcam "1" // Allow Killcam +set team_rebalance "1" // Auto Balance teams? +set scr_teambalance "1" // Enable or Disable auto balance. +set scr_game_spectatetype "2" // Allow Spectators. 0 Disabled, 1 Team/Player only, 2 Free +set scr_thirdPerson "0" // third-person mode +set scr_game_hardpoints "1" // Enable/Disable Killstreak rewards +set scr_game_perks "1" // Allow players to have perks +set scr_nukeTimer "10" // Timer when nuke goes off +set scr_game_killstreakdelay "12" // Delay killstreak from the start of the round. + +////////////////////////////////////////////////// +// HARDCORE CONFIGURATION // +////////////////////////////////////////////////// +// uncomment below commands for some hardcore // +// by removing the // before each set dvar. // +////////////////////////////////////////////////// + +// set g_hardcore "1" // Enable hardcore mode +// set scr_hardcore "1" // Enable hardcore mode again... +// set ui_hud_hardcore "1" // Removes Heads up display which can be used both regular and HC +// set scr_player_maxhealth "30" // Percent of Health players will have on Respawn. (100 is normal. 30 is hardcore) +// set scr_team_fftype "1" // Enable or Disable Friendly Fire. (1 on, 2 reflect, 3 shared) +// set scr_player_healthregentime "0" // Time it takes you to recover damage. (5 is normal, 0 is hardcore) +// set scr_game_onlyheadshots "0" // Enable/Disable Only Headshots mode. You can only kill players by taking headshots. + +////////////////////////////////////////////////// +// FREE FOR ALL GAMETYPE SETTINGS // +////////////////////////////////////////////////// + +set scr_dm_scorelimit "30" // Score limit to win the game. +set scr_dm_timelimit "10" // Duration in minutes for the game to end if the score limit isn't reached. +set scr_dm_playerrespawndelay "-1" // How long player will wait until respawn. +set scr_dm_numlives "0" // Number of lives per player. 0 for unlimited. +set scr_dm_roundlimit "1" // Rounds per game. +set scr_dm_winlimit "1" // amount of wins needed to win a round-based game +set scr_dm_promode "0" + +////////////////////////////////////////////////// +// TEAM DEATHMATCH GAMETYPE SETTINGS // +////////////////////////////////////////////////// + +set scr_war_scorelimit "75" // Score limit to win the game. +set scr_war_timelimit "10" // Duration in minutes for the game to end if the score limit isn't reached. +set scr_war_playerrespawndelay "0" // How long player will wait until respawn. +set scr_war_waverespawndelay "0" // Duration is seconds before the first respawn in each round. +set scr_war_numlives "0" // Number of lives per player 0 for unlimited. +set scr_war_roundlimit "1" // Rounds per game. +set scr_war_winlimit "1" // amount of wins needed to win a round-based game +set scr_war_promode "0" + +////////////////////////////////////////////////// +// SEARCH AND DESTROY GAMETYPE SETTINGS // +////////////////////////////////////////////////// + +set scr_sd_scorelimit "1" // Score limit required to win the game. +set scr_sd_timelimit "2.5" // Duration in minutes for the game to end if the score limit isn't reached. +set scr_sd_playerrespawndelay "0" // How long player will wait until respawn. +set scr_sd_waverespawndelay "0" // Duration is seconds before the first respawn in each round. +set scr_sd_numlives "1" // Number of lives per player per game. +set scr_sd_roundlimit "0" // Rounds the game is limited to 0 for unlimited. +set scr_sd_winlimit "4" // amount of wins needed to win a round-based game. +set scr_sd_roundswitch "3" // after X rounds, switch sides. +set scr_sd_bombtimer "45" // Time taken for the bomb to detonate. +set scr_sd_defusetime "5" // Time taken to defuse the bomb. +set scr_sd_multibomb "0" // allow multiple people to 'have the bomb'. +set scr_sd_planttime "5" // How long will it take player to 'plant the bomb'. +set scr_sd_promode "0" + +////////////////////////////////////////////////// +// SEARCH AND RESCUE GAMETYPE SETTINGS // +////////////////////////////////////////////////// + +set scr_sr_scorelimit "1" // Score limit required to win the game. +set scr_sr_timelimit "2.5" // Duration in minutes for the game to end if the score limit isn't reached. +set scr_sr_playerrespawndelay "0" // How long player will wait until respawn. +set scr_sr_waverespawndelay "0" // Duration is seconds before the first respawn in each round. +set scr_sr_numlives "1" // Number of lives per player per game. +set scr_sr_roundlimit "0" // Rounds the game is limited to 0 for unlimited. +set scr_sr_winlimit "4" // amount of wins needed to win a round-based game. +set scr_sr_roundswitch "3" // after X rounds, switch sides. +set scr_sr_bombtimer "45" // Time taken for the bomb to detonate. +set scr_sr_defusetime "5" // Time taken to defuse the bomb. +set scr_sr_multibomb "0" // allow multiple people to 'have the bomb'. +set scr_sr_planttime "5" // How long will it take player to 'plant the bomb'. +set scr_sr_promode "0" + +////////////////////////////////////////////////// +// DOMINATION GAMETYPE SETTINGS // +////////////////////////////////////////////////// + +set scr_dom_scorelimit "200" // Score limit to win the game. +set scr_dom_timelimit "0" // Duration in minutes for the game to end if the score limit isn't reached. +set scr_dom_playerrespawndelay "0" // How long player will wait until respawn. +set scr_dom_waverespawndelay "0" // Duration is seconds before the first respawn in each round. +set scr_dom_numlives "0" // Number of lives per player per game. 0 is unlimited. +set scr_dom_roundlimit "1" // Rounds per game +set scr_dom_winlimit "1" // amount of wins needed to win a round-based game +set scr_dom_promode "0" + +////////////////////////////////////////////////// +// KILL CONFIRMED GAMETYPE SETTINGS // +////////////////////////////////////////////////// + +set scr_conf_scorelimit "65" // Score limit to win the game. +set scr_conf_timelimit "10" // Duration in minutes for the game to end if the score limit isn't reached. +set scr_conf_playerrespawndelay "0" // How long player will wait until respawn. +set scr_conf_waverespawndelay "0" // Duration is seconds before the first respawn in each round. +set scr_conf_numlives "0" // Number of lives per player 0 for unlimited. +set scr_conf_roundlimit "1" // Rounds per game. +set scr_conf_winlimit "1" // amount of wins needed to win a round-based game +set scr_conf_promode "0" + +////////////////////////////////////////////////// +// CAPTURE THE FLAG GAMETYPE SETTINGS // +////////////////////////////////////////////////// + +set scr_ctf_scorelimit "0" // Target score before the round ends. +set scr_ctf_timelimit "10" // Duration in minutes for the game to end if the score limit isn't reached. +set scr_ctf_numlives "0" // Number of lives per player 0 for unlimited. +set scr_ctf_halftime "1" // Half-Time +set scr_ctf_roundlimit "1" // How many rounds match would last. +set scr_ctf_returntime "30" // How many seconds before flag returns to base without nobody touching it. +set scr_ctf_playerrespawndelay "0" // Respawn wait in seconds. +set scr_ctf_waverespawndelay "10" // Time delay for first respawn before the game. +set scr_ctf_promode "0" + +////////////////////////////////////////////////// +// INFECTED GAMETYPE SETTINGS // +////////////////////////////////////////////////// + +set scr_infect_timelimit "10" // Duration in minutes for the game to end if the score limit isn't reached. +set scr_infect_playerrespawndelay "0" // How long player will wait until respawn. +set scr_infect_waverespawndelay "0" // Duration is seconds before the first respawn in each round. +set scr_infect_numlives "0" // Number of lives per player 0 for unlimited. +set scr_infect_roundlimit "1" // Rounds per game. +set scr_infect_winlimit "1" // amount of wins needed to win a round-based game +set scr_infect_promode "0" + +////////////////////////////////////////////////////////// +// MAP SHORT NAMES ROTATION LIST // +////////////////////////////////////////////////////////// +// // +// Ascend - mp_refraction // +// Bio Lab - mp_lab2 // +// Comeback - mp_comeback // +// Defender - mp_laser2 // +// Detroit - mp_detroit // +// Greenband - mp_greenband // +// Horizon - mp_levity // +// Instinct - mp_instinct // +// Recovery - mp_recovery // +// Retreat - mp_venus // +// Riot - mp_prison // +// Solar - mp_solar // +// Terrace - mp_terrace // +// // +// Atlas Gorge - mp_dam // +// Chop Shop - mp_spark // +// Climate - mp_climate_3 // +// Compound - mp_sector17 // +// Core - mp_lost // +// Drift - mp_torqued // +// Fracture - mp_fracture // +// Kremlin - mp_kremlin // +// Overload - mp_lair // +// Parliament - mp_bigben2 // +// Perplex - mp_perplex_1 // +// Quarantine - mp_liberty // +// Sideshow - mp_clowntown3 // +// Site 244 - mp_blackbox // +// Skyrise - mp_highrise2 // +// Swarm - mp_seoul2 // +// Urban - mp_urban // +// // +////////////////////////////////////////////////////////// + +set sv_maprotation "gametype war map mp_refraction map mp_lab2 map mp_comeback map mp_laser2 map mp_detroit map mp_greenband map mp_levity map mp_instinct map mp_recovery map mp_venus map mp_prison map mp_solar map mp_terrace map mp_dam map mp_torqued map mp_clowntown3 map mp_lost map mp_urban map mp_blackbox map mp_climate_3 map mp_perplex_1 map mp_kremlin map mp_bigbend map mp_sector17 map mp_fracture map mp_lair map mp_liberty map mp_seoul2" diff --git a/cfg/s1/server_horde.cfg b/cfg/s1/server_horde.cfg new file mode 100644 index 0000000..4628773 --- /dev/null +++ b/cfg/s1/server_horde.cfg @@ -0,0 +1,107 @@ +////////////////////////////////////////////////// +/// S1 Server Configuration // +////////////////////////////////////////////////// + +////////////////////////////////////////////////// +// SERVER NAME & COLORS TIPS // +////////////////////////////////////////////////// +// // +// ^1 Red // +// ^2 Green // +// ^3 Yellow // +// ^4 Blue // +// ^5 Cyan // +// ^6 Pink // +// ^7 White // +// ^8 Depends on the team colors playing. // +// ^9 Grey // +// ^0 Black // +// ^: Rainbow colors // +// // +////////////////////////////////////////////////// + +set sv_hostname "S1 Default Server" // Sets the server hostname. +set sv_motd "" // Sets a custom motd which is shown on the intel message loadscreen when a player joins. Leave blank for default intel messages. + +////////////////////////////////////////////////// +// ADMIN INFO (Optional) // +////////////////////////////////////////////////// + +set _Admin "" // Your username. +set _Email "" // E-mail address. you can leave blank +set _Website "" // Website. (IW4MAdmin uses this.) +set _Location "Earth" // Location + +////////////////////////////////////////////////// +// NON-GAMEPLAY CONFIGURATION // +////////////////////////////////////////////////// + +set party_maxplayers "4" // Max players in your server. +set rcon_password "" // Access to your server to change stuff remotely or ingame. (Empty = disabled) +set g_password "" // Password Protected Server. Leave blank if you want players to join or set password if you want to keep public out. +set sv_privateClients "0" // Maximum number of private clients allowed on the server (range 0-18 (clamped to sv_maxclients) ) +set sv_privatePassword "" // Password for reserved slots. +set sv_voice "2" // Server voice chat configuration ( 0 = "No Chat", 1 = "Free Chat", 2 = "Team Chat" (default) ) +set g_allowVote "1" // Toggle voting for [player kick/map restart/next map] (0 or 1 (default) ) +set g_deadChat "0" // Toggle allowing dead players to chat with living players (0 (default) or 1) +set g_inactivity "420" // Time in seconds before the server will kick a user for inactivity (range 0 - 10000) +set sv_kickBanTime "3600" // Time in seconds for a player temporary ban (on kick/tempban) (range 0 - 3600) +set sv_allowClientConsole "1" // Enable or Disable players ability to access server commands +set sv_timeout "60" // Timeout time period. You will timeout after (60) seconds when attempting to connect or if you are getting connection interruptions +set sv_reconnectlimit "3" // How many times you can try to reconnect +set sv_pure "1" // verifying cilent files +set sv_floodProtect "1" // Chat Spam Protection +set sv_sayName "console" // name server-side 'say' commands show up as +set logfile "2" // Enable loging 1-2? enable. 0 disable. Leave it on if you plan on using B3 or IW4MAdmin. +set g_logSync "1" // 1 always flush games_mp.log, 0 only flush on game end. Recommended to stay on for b3 and IW4MAdmin +set g_log "s1/logs/games_h.log" // Gamelog filename. If you edit this, Make sure you change B3.xml if you have bigbrotherbot. IW4MAdmin auto-detects however. + + +////////////////////////////////////////////////// +// EXO SURVIVAL GAMETYPE SETTINGS // +////////////////////////////////////////////////// + +set scr_horde_scorelimit "0" // Target score before the round ends. +set scr_horde_timelimit "0" // Duration in minutes for the game to end if the score limit isn't reached. +set scr_horde_numlives "1" // Number of lives per player 0 for unlimited. +set scr_horde_promode "0" + +////////////////////////////////////////////////////////// +// EXO SURVIVAL ROTATION LIST // +////////////////////////////////////////////////////////// +// // +// TIER 1 // +// // +// Bio Lab - mp_lab2 // +// Retreat - mp_venus // +// Detroit - mp_detroit // +// Ascend - mp_refraction // +// // +// TIER 2 // +// // +// Horizon - mp_levity // +// Comeback - mp_comeback // +// Terrace - mp_terrace // +// Instinct - mp_instinct // +// // +// TIER 3 // +// // +// Greenband - mp_greenband // +// Solar - mp_solar // +// Recovery - mp_recovery // +// Defender - mp_laser2 // +// // +// TIER 4 // +// // +// Riot - mp_prison // +// // +// BONUS // +// // +// Sideshow - mp_clowntown3 // +// Core - mp_lost // +// Drift - mp_torqued // +// Urban - mp_urban // +// // +////////////////////////////////////////////////////////// + +set sv_maprotation "gametype horde map mp_lab2 mp_venus mp_detroit mp_refraction mp_levity mp_comeback mp_terrace mp_instinct mp_greenband mp_solar mp_recovery mp_laser2 mp_prison mp_clowntown3 mp_lost mp_torqued mp_urban" diff --git a/cfg/s1/server_zm.cfg b/cfg/s1/server_zm.cfg new file mode 100644 index 0000000..72cd61e --- /dev/null +++ b/cfg/s1/server_zm.cfg @@ -0,0 +1,80 @@ +////////////////////////////////////////////////// +/// S1 Server Configuration // +////////////////////////////////////////////////// + +////////////////////////////////////////////////// +// SERVER NAME & COLORS TIPS // +////////////////////////////////////////////////// +// // +// ^1 Red // +// ^2 Green // +// ^3 Yellow // +// ^4 Blue // +// ^5 Cyan // +// ^6 Pink // +// ^7 White // +// ^8 Depends on the team colors playing. // +// ^9 Grey // +// ^0 Black // +// ^: Rainbow colors // +// // +////////////////////////////////////////////////// + +set sv_hostname "S1 Default Server" // Sets the server hostname. +set sv_motd "" // Sets a custom motd which is shown on the intel message loadscreen when a player joins. Leave blank for default intel messages. + +////////////////////////////////////////////////// +// ADMIN INFO (Optional) // +////////////////////////////////////////////////// + +set _Admin "" // Your username. +set _Email "" // E-mail address. you can leave blank +set _Website "" // Website. (IW4MAdmin uses this.) +set _Location "Earth" // Location + +////////////////////////////////////////////////// +// NON-GAMEPLAY CONFIGURATION // +////////////////////////////////////////////////// + +set party_maxplayers "4" // Max players in your server. +set rcon_password "" // Access to your server to change stuff remotely or ingame. (Empty = disabled) +set g_password "" // Password Protected Server. Leave blank if you want players to join or set password if you want to keep public out. +set sv_privateClients "0" // Maximum number of private clients allowed on the server (range 0-18 (clamped to sv_maxclients) ) +set sv_privatePassword "" // Password for reserved slots. +set sv_voice "2" // Server voice chat configuration ( 0 = "No Chat", 1 = "Free Chat", 2 = "Team Chat" (default) ) +set g_allowVote "1" // Toggle voting for [player kick/map restart/next map] (0 or 1 (default) ) +set g_deadChat "0" // Toggle allowing dead players to chat with living players (0 (default) or 1) +set g_inactivity "420" // Time in seconds before the server will kick a user for inactivity (range 0 - 10000) +set sv_kickBanTime "3600" // Time in seconds for a player temporary ban (on kick/tempban) (range 0 - 3600) +set sv_allowClientConsole "1" // Enable or Disable players ability to access server commands +set sv_timeout "60" // Timeout time period. You will timeout after (60) seconds when attempting to connect or if you are getting connection interruptions +set sv_reconnectlimit "3" // How many times you can try to reconnect +set sv_pure "1" // verifying cilent files +set sv_floodProtect "1" // Chat Spam Protection +set sv_sayName "console" // name server-side 'say' commands show up as +set logfile "2" // Enable loging 1-2? enable. 0 disable. Leave it on if you plan on using B3 or IW4MAdmin. +set g_logSync "1" // 1 always flush games_mp.log, 0 only flush on game end. Recommended to stay on for b3 and IW4MAdmin +set g_log "s1/logs/games_zm.log" // Gamelog filename. If you edit this, Make sure you change B3.xml if you have bigbrotherbot. IW4MAdmin auto-detects however. + + +////////////////////////////////////////////////// +// EXO ZOMBIES GAMETYPE SETTINGS // +////////////////////////////////////////////////// + +set scr_zombies_scorelimit "0" // Target score before the round ends. +set scr_zombies_timelimit "0" // Duration in minutes for the game to end if the score limit isn't reached. +set scr_zombies_numlives "1" // Number of lives per player 0 for unlimited. +set scr_zombies_promode "0" + +////////////////////////////////////////////////////////// +// EXO ZOMBIE ROTATION LIST // +////////////////////////////////////////////////////////// +// // +// Outbreak - mp_zombie_lab // +// Infection - mp_zombie_brg // +// Carrier - mp_zombie_ark // +// Descent - mp_zombie_h2o // +// // +////////////////////////////////////////////////////////// + +set sv_maprotation "gametype zombies map mp_zombie_ark map mp_zombie_brg map mp_zombie_h2o map mp_zombie_lab" diff --git a/data/dw/entitlement_config.info b/data/dw/entitlement_config.info new file mode 100644 index 0000000..1bae79a --- /dev/null +++ b/data/dw/entitlement_config.info @@ -0,0 +1,228 @@ +version 7 + +// Entitlement ID Ranges +// 0 - 299 ??? +// 300 - 399 Clan Entitlements +// 400 - 599 ??? +// 600 - 699 Clan War Entitlements +// 700 - 799 Generic Elite Entitlements + +// Number of keys to read from the key archive +keys_to_read 16 + +// unlocks in game - type, key index, bit, name, payload... +unlock 0 0 600 //clan wars demon_skull_p +unlock 0 1 601 //clan wars dead_ninja_p +unlock 0 2 602 //clan wars mummy_p +unlock 0 3 603 //clan wars skull_bow_p +unlock 0 4 604 //clan wars cyclops_skull_p +unlock 0 5 605 //clan wars dead_gnome_p +unlock 0 6 606 //clan wars gold_grill_p +unlock 0 7 607 //clan wars pirate_skull_p +unlock 0 8 608 //clan wars gargoyle_p +unlock 0 9 609 //clan wars vulture_p +unlock 0 10 610 //clan wars warrior_mask_p +unlock 0 11 611 //clan wars yeti_p +unlock 0 12 612 //clan wars dead_owl_p +unlock 0 13 613 //clan wars money_bags_p +unlock 0 14 614 //clan wars injured_octopus_p +unlock 0 15 615 //clan wars hotdog_p +unlock 0 16 616 //clan wars crab_p +unlock 0 17 617 //clan wars angry_robot_p +unlock 0 18 618 //clan wars triangle_dot_ret +unlock 0 19 619 //clan wars gold_chain_emb +unlock 0 20 620 //clan wars wing_emb +unlock 0 21 621 //clan wars brass_knuck_emb +unlock 0 22 622 //clan wars ninja_emb +unlock 0 25 623 //clan wars reaper head +unlock 0 26 624 //clan wars merc head +unlock 0 27 625 //clan wars body +unlock 0 28 460 //clan wars diamond division reticle +unlock 0 29 401 //clan wars diamond division camo +unlock 0 30 627 //clan wars diamond division assassin head +unlock 0 31 626 //clan wars diamond division savage head +unlock 0 32 628 //clan wars diamond division body + +unlock 3 0 700 //Download the mobile app +unlock 3 1 701 //Founder Skull + +unlock 3 4 500 //NEVERSOFT +unlock 3 3 501 //IW +unlock 3 5 502 //RAVEN +unlock 3 7 503 //HIGH_MOON +unlock 3 6 504 //BEACHHEAD + +unlock 13 0 209 //monster beast patch +unlock 13 2 210 //monster beast playercard +unlock 13 1 211 //monster viper patch +unlock 13 3 212 //monster viper playercard + +unlock 13 4 216 //riley / classic ghost head + +unlock 13 30 217 //watcher patch +unlock 13 31 213 //federation patch +unlock 13 32 215 //into the deep patch +unlock 13 33 214 //no man's land patch + +//Platform Unlocks +platform 200 255161 //team leader head +platform 201 255161 //team leader playercard +platform 202 255161 //team leader patch +platform 403 255161 //team leader camo +platform 451 255161 //team leader reticle + +platform 200 255160 //team leader head +platform 201 255160 //team leader playercard +platform 202 255160 //team leader patch +platform 403 255160 //team leader camo +platform 451 255160 //team leader reticle + +platform 206 255162 //insignia playercard +platform 205 255162 //insignia patch + +platform 216 255165 //classic ghost character + +platform 213 255167 //federation patch +platform 214 255168 //no mans land patch +platform 215 255169 //into the deep patch + +platform 207 255163 //digital hardened patch +platform 208 255163 //digital hardened playercard + +platform 217 255166 //Steam Patch - The Watcher + +platform 222 268100 //festive playercard +platform 221 268100 //festive patch +platform 410 268100 //festive camo +platform 453 268100 //festive reticle + +platform 550 268101 //wolf + +platform 551 277670 //extra slots + +platform 552 277671 // hero character - elias +platform 553 277672 // hero character - hesh +platform 554 277673 // hero character - merrick +platform 555 277674 // hero character - keegan +platform 556 277675 // hero character - price + +platform 557 281343 // Hazmat character +platform 558 281340 // Makarov Legend Pack +platform 559 281342 // Rorke Character +platform 560 281341 // Zakhaev Character + +platform 561 286632 // Soap Legend Pack +platform 562 286633 // Extinction Squad +platform 563 286634 // TF141 + +platform 490 277676 // Personalization pack 1 - Ducky +platform 491 277677 // Personalization pack 2 - Blood +platform 492 277678 // Personalization pack 3 - Inferno +platform 493 277679 // Personalization pack 4 - Kittens + +platform 494 281344 // Personalization pack 5 +platform 495 281345 // Personalization pack 6 +platform 496 281346 // Personalization pack 7 +platform 497 281347 // Personalization pack 8 +platform 498 286630 // Personalization pack 9 +platform 499 286631 // Personalization pack 10 + +platform 510 295430 // Personalization pack 11 +platform 511 295431 // Personalization pack 12 +platform 512 295432 // Personalization pack 13 +platform 513 295433 // Personalization pack 14 +platform 515 295434 // Personalization pack 15 +platform 516 295435 // Personalization pack 16 + +platform 517 295439 // Personalization pack 17 +platform 518 295440 // Personalization pack 18 +platform 519 301111 // Personalization pack 19 +platform 520 301112 // Personalization pack 20 +platform 521 301113 // Personalization pack 21 +platform 522 301114 // Personalization pack 22 +platform 523 301110 // Personalization pack Flags + +platform 564 295436 // Spectrum Character +platform 565 295437 // Astronaut Character +platform 566 295438 // Resistance Squad + +platform 567 309870 // Bluntforce Character +platform 568 309871 // Inferno Character +platform 569 309872 // Bling Character + +platform 480 259250 //dlc gun 1 +platform 480 301116 //dlc gun 1 +platform 481 259250 //dlc gun 1 +platform 481 301116 //dlc gun 1 + +platform 482 259251 //Ripper from Devastation +platform 482 255161 //Ripper from Season Pass +platform 482 301115 //Ripper from mDLC + +//Clan Entitlements - ID 300 - 399 - type, bit, entitlement id +clan 0 300 +clan 0 301 +clan 1 302 +clan 2 303 +clan 3 304 +clan 3 305 +clan 3 306 +clan 4 307 +clan 4 308 +clan 4 309 +clan 5 310 +clan 5 311 +clan 6 312 +clan 7 313 +clan 8 314 +clan 8 315 +clan 8 316 +clan 9 317 +clan 10 318 +clan 10 319 +clan 10 320 +clan 10 321 +clan 10 322 +clan 11 323 +clan 12 324 +clan 13 325 +clan 13 326 +clan 13 327 +clan 13 328 +clan 13 329 +clan 14 330 +clan 15 331 +clan 15 332 +clan 15 333 +clan 16 334 +clan 16 335 +clan 16 336 +clan 16 337 +clan 16 338 +clan 17 339 +clan 18 340 +clan 19 341 +clan 19 342 +clan 19 343 +clan 19 344 +clan 20 345 +clan 20 346 +clan 21 347 +clan 21 348 +clan 21 349 +clan 22 350 +clan 23 351 +clan 24 352 +clan 25 353 +clan 26 354 +clan 26 355 +clan 26 356 +clan 26 357 +clan 27 358 + +//Clan Level Challenges - type, required level, challenge id +clanlevelchallenge 23 ch_cam_clan_02 // Kiss of Death Camo + +//Clan War Challenges - type, key index, bit offset, challenge id +entitlementchallenge 0 18 ch_ret_clan // clan wars reticle - Triad +entitlementchallenge 0 24 ch_cam_clan_01 // clan wars camo - Body Count diff --git a/data/dw/ffotd-1.22.1.ff b/data/dw/ffotd-1.22.1.ff new file mode 100644 index 0000000..7473585 Binary files /dev/null and b/data/dw/ffotd-1.22.1.ff differ diff --git a/data/dw/lootConfig_tu22.csv b/data/dw/lootConfig_tu22.csv new file mode 100644 index 0000000..76fd2d5 --- /dev/null +++ b/data/dw/lootConfig_tu22.csv @@ -0,0 +1,1050 @@ +#item name ( must match unlocktable.csv),unused,Global Unique Item ID,rarity( 0 = common 1 = special 2 = rare ),productionLevel +#This file is AUTOGENERATED and shouldn't be edited. +#run s1-depot/s1/game/bin/COD.Net/COD.GameStudio.exe to make changes, save and export +iw5_exocrossbowloot3,,0x100017F,2,Gold +iw5_mahemloot3,,0x1000180,2,Gold +iw5_ak12loot0,,0x100003C,0,Gold +iw5_ak12loot1,,0x100003D,0,Gold +iw5_ak12loot2,,0x100003E,0,Gold +iw5_ak12loot3,,0x100003F,0,Gold +iw5_ak12loot4,,0x1000040,1,Gold +iw5_ak12loot5,,0x1000041,1,Gold +iw5_ak12loot7,,0x1000043,1,Gold +iw5_ak12loot8,,0x1000044,2,Gold +iw5_ak12loot9,,0x1000045,2,Gold +iw5_bal27loot0,,0x1000046,0,Gold +iw5_bal27loot1,,0x1000047,0,Gold +iw5_bal27loot2,,0x1000048,0,Gold +iw5_bal27loot3,,0x1000049,0,Gold +iw5_bal27loot4,,0x100004A,1,Gold +iw5_bal27loot5,,0x100004B,1,Gold +iw5_bal27loot6,,0x100004C,1,Gold +iw5_bal27loot8,,0x100004E,2,Gold +iw5_bal27loot9,,0x100004F,2,Gold +iw5_sn6loot0,,0x1000050,0,Gold +iw5_sn6loot1,,0x1000051,0,Gold +iw5_sn6loot2,,0x1000052,0,Gold +iw5_sn6loot3,,0x1000053,0,Gold +iw5_sn6loot5,,0x1000055,1,Gold +iw5_sn6loot6,,0x1000056,1,Gold +iw5_sn6loot7,,0x1000057,1,Gold +iw5_sn6loot8,,0x1000058,2,Gold +iw5_sn6loot9,,0x1000059,2,Gold +iw5_morsloot0,,0x100005D,0,Gold +iw5_morsloot1,,0x100005E,0,Gold +iw5_morsloot2,,0x100005F,0,Gold +iw5_morsloot3,,0x1000060,0,Gold +iw5_morsloot6,,0x1000063,1,Gold +iw5_morsloot7,,0x1000064,1,Gold +iw5_morsloot8,,0x1000065,2,Gold +iw5_morsloot9,,0x1000066,2,Gold +iw5_titan45loot0,,0x1000071,0,Gold +iw5_titan45loot1,,0x1000072,0,Gold +iw5_titan45loot2,,0x1000073,0,Gold +iw5_titan45loot3,,0x1000074,4,Gold +iw5_titan45loot4,,0x1000075,1,Gold +iw5_titan45loot5,,0x1000076,1,Gold +iw5_titan45loot6,,0x1000077,1,Gold +iw5_titan45loot8,,0x1000079,2,Gold +iw5_titan45loot9,,0x100007A,2,Gold +iw5_em1loot0,,0x100007B,0,Gold +iw5_em1loot1,,0x100007C,0,Gold +iw5_em1loot2,,0x100007D,0,Gold +iw5_em1loot3,,0x100007E,0,Gold +iw5_em1loot4,,0x100007F,1,Gold +iw5_em1loot5,,0x1000080,1,Gold +iw5_em1loot6,,0x1000081,1,Gold +iw5_em1loot8,,0x1000083,2,Gold +iw5_em1loot9,,0x1000084,2,Gold +iw5_uts19loot0,,0x1000085,0,Gold +iw5_uts19loot1,,0x1000086,0,Gold +iw5_uts19loot2,,0x1000087,0,Gold +iw5_uts19loot3,,0x1000088,0,Gold +iw5_uts19loot4,,0x1000089,1,Gold +iw5_uts19loot5,,0x100008A,1,Gold +iw5_uts19loot7,,0x100008C,1,Gold +iw5_uts19loot8,,0x100008D,2,Gold +iw5_uts19loot9,,0x100008E,2,Gold +iw5_pbwloot0,,0x1000090,0,Gold +iw5_pbwloot1,,0x1000091,0,Gold +iw5_pbwloot2,,0x1000092,0,Gold +iw5_pbwloot3,,0x1000093,4,Gold +iw5_pbwloot5,,0x1000095,1,Gold +iw5_pbwloot6,,0x1000096,1,Gold +iw5_pbwloot7,,0x1000097,1,Gold +iw5_pbwloot8,,0x1000098,2,Gold +iw5_pbwloot9,,0x1000099,2,Gold +iw5_maulloot0,,0x100009C,0,Gold +iw5_maulloot1,,0x100009D,0,Gold +iw5_maulloot2,,0x100009E,0,Gold +iw5_maulloot3,,0x100009F,0,Gold +iw5_maulloot4,,0x10000A0,1,Gold +iw5_maulloot6,,0x10000A2,1,Gold +iw5_maulloot7,,0x10000A3,1,Gold +iw5_maulloot8,,0x10000A4,2,Gold +iw5_maulloot9,,0x10000A5,2,Gold +iw5_gm6loot0,,0x10000A6,0,Gold +iw5_gm6loot1,,0x10000A7,0,Gold +iw5_gm6loot2,,0x10000A8,0,Gold +iw5_gm6loot3,,0x10000A9,0,Gold +iw5_gm6loot4,,0x10000AA,1,Gold +iw5_gm6loot6,,0x10000AC,1,Gold +iw5_gm6loot7,,0x10000AD,1,Gold +iw5_gm6loot8,,0x10000AE,2,Gold +iw5_gm6loot9,,0x10000AF,2,Gold +iw5_vbrloot0,,0x10000B0,4,Gold +iw5_vbrloot1,,0x10000B1,0,Gold +iw5_vbrloot2,,0x10000B2,0,Gold +iw5_vbrloot3,,0x10000B3,0,Gold +iw5_vbrloot4,,0x10000B4,1,Gold +iw5_vbrloot5,,0x10000B5,1,Gold +iw5_vbrloot7,,0x10000B7,1,Gold +iw5_vbrloot8,,0x10000B8,2,Gold +iw5_vbrloot9,,0x10000B9,2,Gold +iw5_arx160loot0,,0x10000BA,0,Gold +iw5_arx160loot1,,0x10000BB,0,Gold +iw5_arx160loot2,,0x10000BC,0,Gold +iw5_arx160loot3,,0x10000BD,0,Gold +iw5_arx160loot5,,0x10000BF,1,Gold +iw5_arx160loot6,,0x10000C0,1,Gold +iw5_arx160loot7,,0x10000C1,1,Gold +iw5_arx160loot8,,0x10000C2,2,Gold +iw5_arx160loot9,,0x10000C3,2,Gold +iw5_m182sprloot0,,0x10000C4,0,Gold +iw5_m182sprloot1,,0x10000C5,0,Gold +iw5_m182sprloot2,,0x10000C6,0,Gold +iw5_m182sprloot3,,0x10000C7,0,Gold +iw5_m182sprloot5,,0x10000C9,1,Gold +iw5_m182sprloot6,,0x10000CA,1,Gold +iw5_m182sprloot7,,0x10000CB,1,Gold +iw5_m182sprloot8,,0x10000CC,2,Gold +iw5_m182sprloot9,,0x10000CD,2,Gold +iw5_maawsloot0,,0x10000D0,0,Gold +iw5_maawsloot2,,0x10000D2,2,Gold +iw5_maawsloot3,,0x10000D3,2,Gold +iw5_stingerm7loot0,,0x10000D4,0,Gold +iw5_stingerm7loot2,,0x10000D6,2,Gold +iw5_stingerm7loot3,,0x10000D7,2,Gold +iw5_microdronelauncherloot0,,0x10000D8,0,Gold +iw5_microdronelauncherloot2,,0x10000DA,2,Gold +iw5_microdronelauncherloot3,,0x10000DB,2,Gold +iw5_himarloot0,,0x10000E1,0,Gold +iw5_himarloot1,,0x10000E2,0,Gold +iw5_himarloot2,,0x10000E3,0,Gold +iw5_himarloot3,,0x10000E4,0,Gold +iw5_himarloot5,,0x10000E6,1,Gold +iw5_himarloot6,,0x10000E7,1,Gold +iw5_himarloot7,,0x10000E8,1,Gold +iw5_himarloot8,,0x10000E9,2,Gold +iw5_himarloot9,,0x10000EA,2,Gold +iw5_hbra3loot0,,0x10000EB,0,Gold +iw5_hbra3loot1,,0x10000EC,0,Gold +iw5_hbra3loot2,,0x10000ED,0,Gold +iw5_hbra3loot3,,0x10000EE,0,Gold +iw5_hbra3loot4,,0x10000EF,1,Gold +iw5_hbra3loot7,,0x10000F2,1,Gold +iw5_hbra3loot8,,0x10000F3,2,Gold +iw5_hbra3loot9,,0x10000F4,2,Gold +iw5_asm1loot0,,0x10000F5,0,Gold +iw5_asm1loot1,,0x10000F6,0,Gold +iw5_asm1loot2,,0x10000F7,0,Gold +iw5_asm1loot3,,0x10000F8,0,Gold +iw5_asm1loot4,,0x10000F9,1,Gold +iw5_asm1loot5,,0x10000FA,1,Gold +iw5_asm1loot7,,0x10000FC,1,Gold +iw5_asm1loot8,,0x10000FD,2,Gold +iw5_asm1loot9,,0x10000FE,2,Gold +iw5_kf5loot0,,0x10000FF,0,Gold +iw5_kf5loot1,,0x1000100,0,Gold +iw5_kf5loot2,,0x1000101,0,Gold +iw5_kf5loot3,,0x1000102,0,Gold +iw5_kf5loot4,,0x1000103,1,Gold +iw5_kf5loot6,,0x1000105,1,Gold +iw5_kf5loot7,,0x1000106,1,Gold +iw5_kf5loot8,,0x1000107,2,Gold +iw5_kf5loot9,,0x1000108,2,Gold +reinforcement1,,0x100010D,0,Gold +reinforcement2,,0x100010E,1,Gold +reinforcement3,,0x100010F,2,Gold +iw5_hmr9loot0,,0x1000186,0,Gold +iw5_hmr9loot1,,0x1000187,0,Gold +iw5_hmr9loot2,,0x1000188,0,Gold +iw5_hmr9loot3,,0x1000189,0,Gold +iw5_hmr9loot4,,0x1000111,1,Gold +iw5_hmr9loot5,,0x1000112,1,Gold +iw5_hmr9loot6,,0x1000113,1,Gold +iw5_hmr9loot8,,0x1000115,2,Gold +iw5_hmr9loot9,,0x1000116,2,Gold +iw5_mp11loot0,,0x1000117,0,Gold +iw5_mp11loot1,,0x1000118,0,Gold +iw5_mp11loot2,,0x1000119,0,Gold +iw5_mp11loot3,,0x100011A,0,Gold +iw5_mp11loot4,,0x100011B,1,Gold +iw5_mp11loot5,,0x100011C,1,Gold +iw5_mp11loot7,,0x100011E,1,Gold +iw5_mp11loot8,,0x100011F,2,Gold +iw5_mp11loot9,,0x1000120,2,Gold +iw5_sac3loot0,,0x1000121,0,Gold +iw5_sac3loot1,,0x1000122,0,Gold +iw5_sac3loot2,,0x1000123,0,Gold +iw5_sac3loot3,,0x1000124,0,Gold +iw5_sac3loot4,,0x1000125,1,Gold +iw5_sac3loot5,,0x1000126,1,Gold +iw5_sac3loot7,,0x1000128,1,Gold +iw5_sac3loot8,,0x1000129,2,Gold +iw5_sac3loot9,,0x100012A,2,Gold +iw5_epm3loot0,,0x100012B,0,Gold +iw5_epm3loot1,,0x100012C,0,Gold +iw5_epm3loot2,,0x100012D,0,Gold +iw5_epm3loot3,,0x100012E,0,Gold +iw5_epm3loot4,,0x100012F,1,Gold +iw5_epm3loot5,,0x1000130,1,Gold +iw5_epm3loot7,,0x1000132,1,Gold +iw5_epm3loot8,,0x1000133,2,Gold +iw5_epm3loot9,,0x1000134,2,Gold +iw5_exocrossbowloot0,,0x1000135,0,Gold +iw5_exocrossbowloot2,,0x1000137,2,Gold +iw5_exoxmgloot0,,0x1000138,0,Gold +iw5_exoxmgloot1,,0x1000139,0,Gold +iw5_exoxmgloot2,,0x100013A,0,Gold +iw5_exoxmgloot3,,0x100013B,0,Gold +iw5_exoxmgloot4,,0x100013C,1,Gold +iw5_exoxmgloot6,,0x100013E,1,Gold +iw5_exoxmgloot7,,0x100013F,1,Gold +iw5_exoxmgloot8,,0x1000140,2,Gold +iw5_exoxmgloot9,,0x1000141,2,Gold +iw5_lsatloot0,,0x1000142,0,Gold +iw5_lsatloot1,,0x1000143,0,Gold +iw5_lsatloot2,,0x1000144,0,Gold +iw5_lsatloot3,,0x1000145,0,Gold +iw5_lsatloot4,,0x1000146,1,Gold +iw5_lsatloot5,,0x1000147,1,Gold +iw5_lsatloot6,,0x1000148,1,Gold +iw5_lsatloot8,,0x100014A,2,Gold +iw5_lsatloot9,,0x100014B,2,Gold +iw5_m990loot0,,0x100014C,0,Gold +iw5_m990loot1,,0x100014D,0,Gold +iw5_m990loot2,,0x100014E,0,Gold +iw5_m990loot3,,0x100014F,0,Gold +iw5_m990loot4,,0x1000150,1,Gold +iw5_m990loot5,,0x1000151,1,Gold +iw5_m990loot6,,0x1000152,1,Gold +iw5_m990loot8,,0x1000154,2,Gold +iw5_m990loot9,,0x1000155,2,Gold +iw5_mahemloot0,,0x1000156,0,Gold +iw5_mahemloot2,,0x1000158,2,Gold +iw5_rhinoloot0,,0x1000159,0,Gold +iw5_rhinoloot1,,0x100015A,0,Gold +iw5_rhinoloot2,,0x100015B,0,Gold +iw5_rhinoloot3,,0x100015C,0,Gold +iw5_rhinoloot4,,0x100015D,1,Gold +iw5_rhinoloot5,,0x100015E,1,Gold +iw5_rhinoloot6,,0x100015F,1,Gold +iw5_rhinoloot8,,0x1000161,2,Gold +iw5_rhinoloot9,,0x1000162,2,Gold +iw5_rw1loot0,,0x1000163,0,Gold +iw5_rw1loot1,,0x1000164,0,Gold +iw5_rw1loot2,,0x1000165,0,Gold +iw5_rw1loot3,,0x1000166,0,Gold +iw5_rw1loot4,,0x1000167,1,Gold +iw5_rw1loot5,,0x1000168,1,Gold +iw5_rw1loot6,,0x1000169,1,Gold +iw5_rw1loot8,,0x100016B,2,Gold +iw5_rw1loot9,,0x100016C,2,Gold +iw5_thorloot0,,0x100016D,0,Gold +iw5_thorloot1,,0x100016E,0,Gold +iw5_thorloot2,,0x100016F,0,Gold +iw5_thorloot3,,0x1000170,0,Gold +iw5_thorloot4,,0x1000171,1,Gold +iw5_thorloot6,,0x1000173,1,Gold +iw5_thorloot8,,0x1000175,2,Gold +iw5_thorloot9,,0x1000176,2,Gold +iw5_asawloot0,,0x1000177,0,Gold +iw5_asawloot1,,0x1000178,0,Gold +iw5_asawloot2,,0x1000179,0,Gold +iw5_asawloot3,,0x100017A,0,Gold +iw5_asawloot5,,0x100017C,1,Gold +iw5_asawloot6,,0x100017D,1,Gold +iw5_asawloot7,,0x100017E,1,Gold +iw5_thorloot7,,0x1000181,1,Gold +iw5_asawloot8,,0x1000182,2,Gold +iw5_asawloot9,,0x1000183,2,Gold +iw5_riotshieldt6loot0,,0x1000195,0,Gold +iw5_riotshieldt6loot2,,0x1000197,2,Gold +iw5_riotshieldt6loot3,,0x1000198,2,Gold +doublexp,,0x10001B4,0,Gold +doublexp,,0x10001B5,1,Gold +doublexp,,0x10001B6,2,Gold +doublelp,,0x10001BA,0,Gold +doublelp,,0x10001BB,1,Gold +doublelp,,0x10001BC,2,Gold +iw5_dlcgun1loot1,,0x10001CB,0,DLC1 +iw5_dlcgun1loot2,,0x10001CC,0,DLC1 +iw5_dlcgun1loot3,,0x10001CD,0,DLC1 +iw5_dlcgun1loot4,,0x10001CE,1,DLC1 +iw5_dlcgun1loot6,,0x10001D0,1,DLC1 +iw5_dlcgun1loot7,,0x10001D1,1,DLC1 +iw5_dlcgun1loot8,,0x10001D2,2,DLC1 +iw5_dlcgun1loot9,,0x10001D3,2,DLC1 +iw5_dlcgun2loot1,,0x1000223,0,DLC2 +iw5_dlcgun2loot2,,0x1000224,0,DLC2 +iw5_dlcgun2loot3,,0x1000225,0,DLC2 +iw5_dlcgun2loot4,,0x1000226,1,DLC2 +iw5_dlcgun2loot6,,0x1000228,1,DLC2 +iw5_dlcgun2loot7,,0x1000229,1,DLC2 +iw5_dlcgun2loot8,,0x100022A,2,DLC2 +iw5_dlcgun2loot9,,0x100022B,2,DLC2 +iw5_dlcgun3loot0,,0x10002A1,0,DLC2_5 +iw5_dlcgun3loot1,,0x10002A2,0,DLC2_5 +iw5_dlcgun3loot2,,0x10002A3,0,DLC2_5 +iw5_dlcgun3loot3,,0x10002A4,0,DLC2_5 +iw5_dlcgun3loot4,,0x10002A5,1,DLC2_5 +iw5_dlcgun3loot5,,0x10002A6,1,DLC2_5 +iw5_dlcgun3loot6,,0x10002A7,1,DLC2_5 +iw5_dlcgun3loot7,,0x10002A8,1,DLC2_5 +iw5_dlcgun3loot8,,0x10002A9,2,DLC2_5 +iw5_dlcgun3loot9,,0x10002AA,2,DLC2_5 +iw5_dlcgun5loot0,,0x10002EB,1,MDLC3 +iw5_dlcgun5loot1,,0x10002EC,1,MDLC3 +iw5_dlcgun5loot2,,0x10002ED,2,MDLC3 +iw5_dlcgun5loot3,,0x10002EE,2,MDLC3 +iw5_dlcgun5loot4,,0x10002EF,2,MDLC3 +iw5_dlcgun5loot5,,0x10002F2,2,MDLC3 +iw5_dlcgun8loot4,,0x10002F3,2,MDLC3 +iw5_dlcgun8loot5,,0x10002F5,2,MDLC3 +iw5_dlcgun8loot6,,0x10002F6,2,MDLC3 +iw5_dlcgun8loot7,,0x10002F7,2,MDLC3 +iw5_dlcgun8loot8,,0x10002F8,2,MDLC3 +iw5_dlcgun8loot9,,0x10002FA,2,MDLC3 +iw5_dlcgun9,,0x10002FB,2,MDLC3 +iw5_dlcgun9loot0,,0x10002FC,2,MDLC3 +iw5_dlcgun9loot2,,0x10002FF,2,MDLC3 +iw5_dlcgun9loot1,,0x1000300,2,MDLC3 +iw5_dlcgun9loot3,,0x1000318,2,MDLC3 +iw5_dlcgun9loot4,,0x1000319,2,MDLC3 +iw5_dlcgun9loot5,,0x100031A,2,MDLC3 +iw5_dlcgun9loot6,,0x100031B,2,MDLC3 +iw5_dlcgun9loot7,,0x100031D,2,MDLC3 +iw5_dlcgun9loot8,,0x100031F,2,MDLC3 +iw5_dlcgun9loot9,,0x1000320,2,MDLC3 +iw5_dlcgun10,,0x1000322,2,MDLC3 +iw5_dlcgun10loot0,,0x1000323,2,MDLC3 +iw5_dlcgun10loot1,,0x1000324,2,MDLC3 +iw5_dlcgun10loot2,,0x1000325,2,MDLC3 +iw5_dlcgun10loot3,,0x1000326,2,MDLC3 +iw5_dlcgun10loot4,,0x1000327,2,MDLC3 +iw5_dlcgun10loot5,,0x1000329,2,MDLC3 +iw5_dlcgun10loot6,,0x100032A,2,MDLC3 +iw5_dlcgun10loot7,,0x100032B,2,MDLC3 +iw5_dlcgun10loot8,,0x100032C,2,MDLC3 +iw5_dlcgun10loot9,,0x100032D,2,MDLC3 +iw5_dlcgun11,,0x100032E,2,MDLC3 +iw5_dlcgun11loot0,,0x100032F,2,MDLC3 +iw5_dlcgun11loot1,,0x1000330,2,MDLC3 +iw5_dlcgun11loot2,,0x1000331,2,MDLC3 +iw5_dlcgun11loot3,,0x1000332,2,MDLC3 +iw5_dlcgun11loot4,,0x1000333,2,MDLC3 +iw5_dlcgun4loot0,,0x1000337,0,MDLC3 +iw5_dlcgun4loot1,,0x1000338,0,MDLC3 +iw5_dlcgun4loot2,,0x1000339,0,MDLC3 +iw5_dlcgun4loot3,,0x100033A,0,MDLC3 +iw5_dlcgun4loot4,,0x100033B,1,MDLC3 +iw5_dlcgun4loot5,,0x100033C,1,MDLC3 +iw5_dlcgun4loot6,,0x100033D,1,MDLC3 +iw5_dlcgun4loot7,,0x100033E,1,MDLC3 +iw5_dlcgun4loot8,,0x100033F,2,MDLC3 +iw5_dlcgun4loot9,,0x1000340,3,MDLC3 +iw5_dlcgun5loot6,,0x1000341,2,MDLC3 +iw5_dlcgun6loot0,,0x100034C,0,MDLC3 +iw5_dlcgun6loot1,,0x100034D,1,MDLC3 +iw5_dlcgun6loot2,,0x100034E,3,MDLC3 +iw5_dlcgun6loot3,,0x100034F,2,MDLC3 +iw5_dlcgun6loot4,,0x1000350,2,MDLC3 +iw5_dlcgun6loot6,,0x1000352,0,MDLC3 +iw5_dlcgun6loot7,,0x1000353,1,MDLC3 +iw5_dlcgun6loot8,,0x1000354,3,MDLC3 +iw5_dlcgun6loot9,,0x1000355,2,MDLC3 +iw5_dlcgun7,,0x1000356,2,MDLC3 +iw5_dlcgun7loot1,,0x100035B,0,MDLC3 +iw5_dlcgun7loot2,,0x100035C,1,MDLC3 +iw5_dlcgun7loot3,,0x100035D,3,MDLC3 +iw5_dlcgun7loot4,,0x100035E,2,MDLC3 +iw5_dlcgun7loot5,,0x100035F,2,MDLC3 +iw5_dlcgun7loot7,,0x1000361,0,MDLC3 +iw5_dlcgun7loot8,,0x1000362,1,MDLC3 +iw5_dlcgun7loot9,,0x1000363,3,MDLC3 +iw5_dlcgun8,,0x1000364,2,MDLC3 +iw5_dlcgun8loot0,,0x1000365,2,MDLC3 +iw5_dlcgun8loot2,,0x1000367,0,MDLC3 +iw5_dlcgun8loot3,,0x1000368,3,MDLC3 +iw5_dlcgun14,,0x100036D,0,MDLC3 +iw5_dlcgun15,,0x100036E,1,MDLC3 +iw5_dlcgun16,,0x100036F,2,MDLC3 +iw5_dlcgun17,,0x1000370,3,MDLC3 +iw5_dlcgun19,,0x1000373,0,MDLC3 +iw5_dlcgun20,,0x1000374,1,MDLC3 +iw5_dlcgun21,,0x1000375,2,MDLC3 +iw5_dlcgun22,,0x1000376,3,MDLC3 +iw5_dlcgun24,,0x100037E,0,MDLC6_B +iw5_dlcgun25,,0x100037F,1,MDLC6_B +iw5_dlcgun26,,0x1000380,2,MDLC6_B +iw5_dlcgun27,,0x1000381,3,MDLC6_B +iw5_dlcgun29,,0x1000383,0,Never +iw5_dlcgun30,,0x1000384,1,Never +iw5_dlcgun31,,0x1000385,2,Never +iw5_dlcgun32,,0x1000386,3,Never +iw5_dlcgun34,,0x1000388,0,Never +iw5_dlcgun35,,0x1000389,1,Never +iw5_dlcgun36,,0x100038A,3,Never +iw5_dlcgun37,,0x100038B,2,Never +iw5_dlcgun39,,0x100038F,0,MDLC6_B +iw5_dlcgun40,,0x1000390,1,MDLC6_B +iw5_dlcgun41,,0x1000391,3,Never +iw5_dlcgun42,,0x1000392,2,MDLC6_B +iw5_dlcgun43,,0x10003DF,3,Never +shirt1_1,,0x6202001,2,MDLC2 +shirt1_2,,0x6204001,1,Gold +shirt1_4,,0x6208001,2,MDLC2 +shirt1_5,,0x620A001,2,Gold +shirt1_7,,0x620E001,2,MDLC3 +shirt16,,0x620000A,4,Gold +shirt16_3,,0x620600A,2,Gold +shirt16_4,,0x620800A,0,Gold +shirt16_5,,0x620A00A,2,MDLC3 +shirt16_6,,0x620C00A,3,MDLC6_A +shirt16_7,,0x620E00A,2,MDLC6_A +shirt4_1,,0x620200B,1,Gold +shirt4_2,,0x620400B,1,Gold +shirt4_4,,0x620800B,2,Gold +shirt4_5,,0x620A00B,2,MDLC3 +shirt4_6,,0x620C00B,2,MDLC3 +shirt9,,0x620000C,0,Gold +shirt9_1,,0x620200C,1,Gold +shirt9_2,,0x620400C,1,Gold +shirt9_5,,0x620A00C,2,Gold +shirt9_6,,0x620C00C,2,MDLC2 +shirt9_7,,0x620E00C,2,MDLC3 +shirt10,,0x6200002,0,Gold +shirt10_1,,0x6202002,2,MDLC2 +shirt10_2,,0x6204002,2,MDLC2 +shirt10_3,,0x6206002,1,Gold +shirt10_4,,0x6208002,2,Gold +shirt10_5,,0x620A002,2,MDLC3 +shirt10_6,,0x620C002,2,MDLC3 +shirt10_7,,0x620E002,2,MDLC3 +shirt8_1,,0x6202004,3,Gold +shirt8_3,,0x6206004,2,Gold +shirt8_4,,0x6208004,2,MDLC2 +shirt8_5,,0x620A004,2,MDLC3 +shirt8_6,,0x620C004,2,MDLC3 +shirt8_7,,0x620E004,2,MDLC3 +shirt18,,0x6200005,1,Gold +shirt19,,0x6200006,0,Gold +shirt19_1,,0x6202006,3,MDLC3 +shirt19_2,,0x6204006,3,MDLC3 +shirt19_3,,0x6206006,2,MDLC6_B +shirt14,,0x6200007,0,Gold +shirt14_1,,0x6202007,2,Gold +shirt14_2,,0x6204007,4,Gold +shirt14_3,,0x6206007,2,MDLC3 +shirt14_4,,0x6208007,2,MDLC3 +shirt14_5,,0x620A007,2,MDLC3 +shirt14_6,,0x620C007,2,MDLC6_A +shirt2_1,,0x6202008,4,Gold +shirt2_2,,0x6204008,0,Gold +shirt2_3,,0x6206008,0,Gold +shirt2_4,,0x6208008,1,Gold +shirt2_5,,0x620A008,3,Gold +shirt2_6,,0x620C008,2,MDLC3 +shirt2_7,,0x620E008,2,MDLC6_B +shirt17,,0x6200009,2,Gold +shirt17_2,,0x6204009,2,Gold +shirt17_3,,0x6206009,2,Gold +shirt17_4,,0x6208009,2,MDLC2 +pants1_1,,0x6402001,1,Gold +pants1_2,,0x6404001,1,Gold +pants1_4,,0x6408001,2,Gold +pants1_6,,0x640C001,4,Gold +pants1_7,,0x640E001,2,Gold +pants3_1,,0x640200C,4,Gold +pants3_2,,0x640400C,0,Gold +pants3_3,,0x640600C,0,Gold +pants3_5,,0x640A00C,3,Gold +pants4_1,,0x640200D,2,MDLC2 +pants4_2,,0x640400D,2,MDLC2 +pants4_3,,0x640600D,1,Gold +pants4_4,,0x640A00D,2,Gold +pants4_5,,0x640C00D,2,MDLC2 +pants4_6,,0x640E00D,1,Gold +pants2,,0x6400002,0,Gold +pants2_1,,0x6402002,2,MDLC2 +pants2_2,,0x6404002,2,MDLC2 +pants2_3,,0x6406002,1,Gold +pants2_4,,0x6408002,2,MDLC2 +pants5_1,,0x6404003,3,Gold +pants5_4,,0x640A003,2,Gold +pants5_5,,0x640C003,2,Gold +pants7,,0x6400004,1,Gold +pants7_1,,0x6402004,2,MDLC2 +pants7_3,,0x6406004,2,MDLC3 +pants7_4,,0x6408004,2,MDLC3 +pants7_5,,0x640A004,2,MDLC3 +pants7_6,,0x640C004,2,MDLC3 +pants7_7,,0x640E004,2,MDLC3 +pants15,,0x6400008,0,Gold +pants15_1,,0x6402008,1,Gold +pants15_2,,0x6404008,1,Gold +pants8,,0x6400009,0,Gold +pants8_2,,0x6404009,2,Gold +pants8_3,,0x6406009,4,Gold +pants8_4,,0x6408009,2,Gold +pants8_5,,0x640A009,2,MDLC3 +pants8_6,,0x640C009,2,MDLC3 +pants8_7,,0x640E009,2,MDLC3 +gloves1_1,,0x6902001,0,Gold +gloves1_3,,0x6906001,1,Gold +gloves1_4,,0x6908001,1,Gold +gloves10,,0x690000B,0,Gold +gloves22,,0x690000C,4,Gold +gloves22_1,,0x690200C,2,MDLC2 +gloves22_2,,0x690400C,2,MDLC2 +gloves22_3,,0x690600C,1,Gold +gloves22_4,,0x690800C,2,Gold +gloves22_6,,0x690C00C,2,MDLC2 +gloves22_7,,0x690E00C,0,Gold +gloves24_1,,0x690200E,0,Gold +gloves24_4,,0x690800E,2,MDLC2 +gloves24_5,,0x690A00E,3,Gold +gloves11,,0x6900010,0,Gold +gloves7,,0x6900013,2,Gold +gloves8_1,,0x6902002,2,Gold +gloves9,,0x6900014,4,Gold +gloves2,,0x6900003,0,Gold +gloves2_1,,0x6902003,0,Gold +gloves2_3,,0x6906003,2,Gold +gloves2_4,,0x6908003,1,Gold +gloves2_5,,0x690A003,2,MDLC2 +gloves15,,0x6900007,2,MDLC2 +gloves17,,0x6900008,1,Gold +boots1_1,,0x6A02001,1,Gold +boots1_2,,0x6A04001,2,MDLC2 +boots1_3,,0x6A06001,1,Gold +boots1_4,,0x6A08001,2,MDLC2 +boots1_6,,0x6A0C001,2,MDLC3 +boots5,,0x6A0000A,0,Gold +boots7_1,,0x6A0200B,2,Gold +boots7_2,,0x6A0400B,2,MDLC3 +boots7_3,,0x6A0600B,2,MDLC3 +boots7_4,,0x6A0800B,2,MDLC3 +boots7_5,,0x6A0A00B,2,MDLC6_B +boots6,,0x6A0000D,4,Gold +boots6_2,,0x6A0400D,2,Gold +boots6_3,,0x6A0600D,2,MDLC2 +boots6_4,,0x6A0800D,0,Gold +boots6_5,,0x6A0A00D,2,MDLC3 +boots12,,0x6A00002,0,Gold +boots12_2,,0x6A04002,2,MDLC2 +boots12_3,,0x6A06002,2,MDLC2 +boots12_4,,0x6A08002,1,Gold +boots12_6,,0x6A0C002,2,Gold +boots12_7,,0x6A0E002,3,MDLC3 +boots3,,0x6A00003,2,Gold +boots3_1,,0x6A02003,3,Gold +boots4,,0x6A00004,0,Gold +boots4_1,,0x6A02004,1,Gold +boots4_3,,0x6A06004,2,Gold +boots4_4,,0x6A08004,4,Gold +boots4_5,,0x6A0A004,2,Gold +boots4_7,,0x6A0E004,2,MDLC2 +boots13,,0x6A00005,2,Gold +boots15_1,,0x6A02007,3,Gold +boots15_3,,0x6A06007,2,MDLC3 +boots16,,0x6A00008,2,Gold +boots16_1,,0x6A02008,2,MDLC2 +boots16_5,,0x6A0A008,3,MDLC3 +boots16_6,,0x6A0C008,2,MDLC3 +boots16_7,,0x6A0E008,2,MDLC3 +boots2_1,,0x6A02009,4,Gold +boots2_2,,0x6A04009,0,Gold +boots2_3,,0x6A06009,0,Gold +boots2_4,,0x6A0A009,1,Gold +boots2_5,,0x6A0C009,1,Gold +boots2_6,,0x6A0E009,2,MDLC2 +kneeshin1_1,,0x6802001,4,Gold +kneeshin1_2,,0x6804001,0,Gold +kneeshin1_3,,0x6806001,0,Gold +kneeshin1_4,,0x6808001,1,Gold +kneeshin24,,0x680000A,1,Gold +kneeshin10_1,,0x680200B,2,Gold +kneeshin10_3,,0x680600B,1,Gold +kneeshin10_4,,0x680800B,1,Gold +kneeshin10_6,,0x680C00B,2,MDLC3 +kneeshin10_7,,0x680E00B,2,MDLC3 +kneeshin4_1,,0x680200C,4,Gold +kneeshin4_2,,0x680400C,1,Gold +kneeshin6_1,,0x680200D,2,MDLC2 +kneeshin6_2,,0x680400D,2,MDLC2 +kneeshin6_3,,0x680600D,1,Gold +kneeshin6_5,,0x680A00D,2,Gold +kneeshin9,,0x680000F,0,Gold +kneeshin9_1,,0x680200F,3,MDLC3 +kneeshin9_2,,0x680400F,2,MDLC6_B +kneeshin20,,0x6800004,0,Gold +kneeshin20_2,,0x6804004,2,Gold +kneeshin23_2,,0x6804006,4,Gold +kneeshin23_3,,0x6806006,2,Gold +kneeshin23_4,,0x6808006,1,Gold +kneeshin23_5,,0x680A006,2,MDLC3 +kneeshin23_6,,0x680C006,3,MDLC3 +kneeshin5,,0x6800007,2,Gold +kneeshin5_3,,0x6808007,2,Gold +kneeshin5_4,,0x680A007,2,MDLC2 +kneeshin5_5,,0x680C007,2,Gold +kneeshin3,,0x6800008,0,Gold +kneeshin3_1,,0x6802008,1,Gold +kneeshin3_2,,0x6804008,2,MDLC2 +kneeshin3_4,,0x6808008,2,MDLC3 +kneeshin3_5,,0x680A008,2,MDLC3 +kneeshin21,,0x6800009,0,Gold +gear1_1,,0x6702001,2,MDLC2 +gear1_2,,0x6704001,2,MDLC2 +gear1_3,,0x6706001,1,Gold +gear1_6,,0x670C001,2,MDLC2 +gear22,,0x670000A,2,Gold +gear23,,0x670000B,1,Gold +gear24,,0x670000C,0,Gold +gear24_1,,0x670200C,1,Gold +gear3_1,,0x670200D,4,Gold +gear3_2,,0x670400D,0,Gold +gear3_3,,0x670600D,0,Gold +gear3_4,,0x670800D,1,Gold +gear3_5,,0x670A00D,3,Gold +gear17,,0x670000E,0,Gold +gear2,,0x670000F,0,Gold +gear2_1,,0x670200F,2,MDLC2 +gear20,,0x6700010,0,Gold +gear20_1,,0x6702010,2,MDLC3 +gear7,,0x6700011,0,Gold +gear7_1,,0x6702011,4,Gold +gear7_2,,0x6704011,2,MDLC3 +gear15,,0x6700002,0,Gold +gear18_1,,0x6702003,3,Gold +gear18_2,,0x6704003,2,Gold +gear18_4,,0x6708003,2,MDLC2 +gear18_5,,0x670A003,2,MDLC3 +gear4,,0x6700004,4,Gold +gear4_3,,0x6706004,2,Gold +gear4_4,,0x6708004,0,Gold +gear4_5,,0x670A004,2,MDLC3 +gear4_7,,0x670E004,2,MDLC3 +gear5_1,,0x6702005,1,Gold +gear5_2,,0x6704005,1,Gold +gear5_4,,0x6708005,2,Gold +gear5_5,,0x670A005,2,MDLC3 +gear16,,0x6700006,0,Gold +gear16_1,,0x6702006,1,Gold +gear16_2,,0x6704006,1,Gold +gear16_4,,0x6708006,2,MDLC2 +gear19,,0x6700007,2,Gold +gear19_2,,0x6704007,2,Gold +gear19_3,,0x6706007,2,MDLC2 +gear19_4,,0x6708007,2,Gold +gear8,,0x6700008,0,Gold +gear8_1,,0x6702008,2,MDLC2 +gear8_2,,0x6704008,2,MDLC2 +gear21,,0x6700009,2,Gold +gear21_2,,0x6704009,2,Gold +gear21_3,,0x6706009,2,MDLC3 +gear21_4,,0x6708009,2,MDLC3 +hats1_2,,0x6604001,4,Gold +hats1_3,,0x6606001,1,Gold +hats1_5,,0x660A001,3,Gold +hats1_6,,0x660C001,2,DLC2_5 +hats23,,0x660000A,0,Gold +hats23_1,,0x660200A,2,Gold +hats25,,0x660000B,1,Gold +hats25_2,,0x660400B,2,Gold +hats28,,0x660000D,1,Gold +hats16,,0x660000F,0,Gold +hats16_1,,0x660200F,2,MDLC2 +hats2_2,,0x6604010,1,Gold +hats2_3,,0x6606010,2,MDLC2 +hats2_4,,0x6608010,2,MDLC2 +hats2_10,,0x6614010,2,MDLC2_5 +hats2_11,,0x6616010,2,DLC2_5 +hats2_12,,0x6618010,2,DLC2_5 +hats2_13,,0x661A010,2,MDLC2_5 +hats2_14,,0x661C010,2,MDLC6_B +hats3,,0x6600011,0,Gold +hats3_1,,0x6602011,2,MDLC2 +hats3_2,,0x6604011,2,MDLC2 +hats3_3,,0x6606011,0,Gold +hats3_4,,0x6608011,2,Gold +hats3_5,,0x660A011,2,DLC2_5 +hats3_6,,0x660C011,2,MDLC3 +hats20,,0x6600012,2,Gold +hats20_2,,0x6604012,2,Gold +hats20_3,,0x6606012,2,MDLC2 +hats20_4,,0x6608012,2,Gold +hats30_1,,0x6602013,1,Gold +hats30_2,,0x6604013,1,Gold +hats30_3,,0x6606013,2,Gold +hats10,,0x6600002,4,Gold +hats10_3,,0x6606002,2,Gold +hats10_4,,0x6608002,0,Gold +hats32,,0x6600014,0,Gold +hats33_1,,0x6602015,2,MDLC2 +hats33_2,,0x6604015,2,MDLC3 +hats34,,0x6600016,2,Gold +hats17,,0x6600017,0,Gold +hats5_1,,0x6602018,1,Gold +hats8,,0x6600019,1,Gold +hats11,,0x6600003,0,Gold +hats11_1,,0x6602003,4,Gold +hats12_1,,0x6602004,3,Gold +hats15,,0x6600005,1,Gold +hats15_1,,0x6602005,1,Gold +hats18,,0x6600006,4,Gold +hats18_1,,0x6602006,2,MDLC2 +hats18_2,,0x6604006,2,MDLC6_B +hats9,,0x6600007,2,Gold +hats21,,0x6600008,1,Gold +hats22,,0x6600009,0,Gold +eye3,,0x6C00002,1,Gold +eye7,,0x6C00003,0,Gold +eye8,,0x6C00004,2,Gold +eye2,,0x6C00006,0,Gold +eye9,,0x6C00007,0,Gold +eye9_1,,0x6C02007,2,MDLC2 +eye9_2,,0x6C04007,2,MDLC3 +eye9_3,,0x6C06007,2,MDLC3 +eye9_4,,0x6C08007,2,DLC3 +eye9_5,,0x6C0A007,2,MDLC3 +eye9_6,,0x6C0C007,2,MDLC6_A +eye5_1,,0x6C02009,2,MDLC3 +eye5_2,,0x6C04009,2,MDLC3 +eye5_3,,0x6C06009,2,MDLC3 +exo1_4,,0x6B08001,2,Gold +exo1_5,,0x6B0A001,2,Gold +exo1_7,,0x6B0E001,2,Gold +exo1_9,,0x6B12001,2,Gold +exo1_10,,0x6B14001,2,MDLC2 +exo1_11,,0x6B16001,4,Gold +exo1_12,,0x6B18001,2,Gold +exo1_15,,0x6B1E001,2,MDLC2 +exo1_16,,0x6B20001,2,Gold +exo1_18,,0x6B24001,2,DLC2_5 +exo1_20,,0x6B28001,2,Gold +exo1_21,,0x6B2A001,2,Gold +exo1_23,,0x6B2E001,3,Gold +exo10_1,,0x6B02002,2,Gold +exo10_4,,0x6B08002,3,Gold +exo10_5,,0x6B0A002,2,MDLC2 +exo10_6,,0x6B0C002,2,Gold +exo10_7,,0x6B0E002,2,Gold +exo10_10,,0x6B14002,2,DLC2_5 +exo10_11,,0x6B16002,2,DLC2_5 +exo10_12,,0x6B18002,2,MDLC2_5 +exo10_13,,0x6B1A002,2,MDLC2_5 +exo10_17,,0x6B22002,2,MDLC3 +exo10_19,,0x6B26002,2,MDLC3 +exo10_20,,0x6B28002,2,MDLC3 +exo11,,0x6B00003,2,Gold +exo11_1,,0x6B02003,2,Gold +exo11_3,,0x6B06003,2,Gold +exo11_4,,0x6B08003,4,Gold +exo11_5,,0x6B0A003,2,Gold +exo11_6,,0x6B0C003,2,Gold +exo11_7,,0x6B0E003,2,Gold +exo11_8,,0x6B10003,2,Gold +exo11_9,,0x6B12003,2,Gold +exo3_1,,0x6B02006,2,MDLC2 +exo3_2,,0x6B04006,2,MDLC3 +exo3_3,,0x6B06006,2,MDLC3 +exo3_4,,0x6B08006,3,MDLC6_A +exo3_5,,0x6B0A006,2,MDLC6_B +exo4,,0x6B00007,2,Gold +exo4_1,,0x6B02007,2,MDLC2 +exo4_2,,0x6B04007,2,MDLC2 +exo4_3,,0x6B06007,2,Gold +exo5,,0x6B00008,4,Gold +exo5_1,,0x6B02008,2,Gold +exo5_2,,0x6B04008,2,MDLC2 +exo5_4,,0x6B08008,2,Gold +exo5_5,,0x6B0A008,2,MDLC2 +shirt13_3,,0x620600D,2,MDLC3 +shirt13_4,,0x620800D,2,MDLC3 +shirt13_5,,0x620A00D,3,MDLC3 +shirt13_6,,0x620C00D,2,MDLC3 +pants17_1,,0x640200F,2,MDLC2 +pants17_2,,0x640400F,2,MDLC3 +pants17_3,,0x640600F,2,MDLC3 +pants17_4,,0x640800F,2,MDLC3 +gloves25,,0x6900015,1,Gold +hats35,,0x660001B,2,Gold +kneeshin25,,0x6800010,4,Gold +kneeshin25_1,,0x6802010,2,Gold +kneeshin25_2,,0x6804010,2,MDLC2 +kneeshin25_3,,0x6806010,1,Gold +kneeshin26,,0x6800011,2,Gold +gloves26,,0x6900016,4,Gold +boots17_1,,0x6A0200E,2,MDLC2 +pants18_2,,0x6404010,1,Gold +pants18_3,,0x6406010,2,MDLC3 +pants18_4,,0x6408010,2,MDLC3 +pants18_5,,0x640A010,3,MDLC3 +pants18_6,,0x640C010,2,MDLC3 +pants18_7,,0x640E010,2,MDLC6_B +hats38,,0x660001E,0,Gold +gloves29,,0x6900019,2,Gold +gloves30,,0x690001A,3,Gold +hats39,,0x660001F,2,Gold +hats40_1,,0x6602020,2,MDLC3 +kneeshin28,,0x6800013,2,Gold +gear26,,0x6700013,2,Gold +kneeshin30,,0x6800015,3,Gold +kneeshin31,,0x6800016,2,MDLC2 +eye11,,0x6C0000B,0,Gold +exo14_2,,0x6B04009,2,MDLC3 +hats41_2,,0x6604021,2,MDLC3 +hats41_3,,0x6606021,2,MDLC3 +hats41_4,,0x6608021,2,MDLC3 +hats41_5,,0x660A021,2,MDLC3 +hats41_6,,0x660C021,2,MDLC3 +hats41_7,,0x660E021,3,MDLC6_A +exo15_17,,0x6B2C00A,2,DLC2_5 +exo16_2,,0x6B0400B,3,MDLC3 +exo16_3,,0x6B0600B,3,MDLC3 +exo16_4,,0x6B0800B,2,MDLC3 +exo16_6,,0x6B0C00B,2,MDLC3 +exo16_7,,0x6B0E00B,2,MDLC6_B +boots18,,0x6A0000F,2,MDLC2_5 +boots18_1,,0x6A0200F,2,MDLC3 +boots18_2,,0x6A0400F,3,MDLC3 +boots18_3,,0x6A0600F,2,MDLC3 +gear27,,0x6700014,2,MDLC2 +kneeshin32,,0x6800017,2,MDLC2 +kneeshin32_1,,0x6802017,2,MDLC3 +kneeshin32_2,,0x6804017,2,MDLC3 +kneeshin32_3,,0x6806017,2,MDLC3 +kneeshin32_4,,0x6808017,2,MDLC3 +gloves31,,0x690001B,2,MDLC2 +gloves31_1,,0x690201B,2,MDLC3 +gloves31_2,,0x690401B,2,MDLC3 +gloves31_3,,0x690601B,3,MDLC6_A +pants19,,0x6400011,2,MDLC2 +shirt15,,0x620000E,2,MDLC2 +shirt15_1,,0x620200E,2,MDLC6_B +shirt15_2,,0x620400E,2,MDLC6_B +exo12,,0x6B0000C,2,MDLC2_5 +exo13,,0x6B0000D,2,DLC2_5 +shirt20,,0x620000F,2,DLC2_5 +shirt20_1,,0x620200F,2,MDLC3 +shirt20_2,,0x620400F,2,MDLC3 +shirt20_3,,0x620600F,2,MDLC3 +shirt20_4,,0x620800F,2,MDLC3 +hats49,,0x6600029,2,MDLC2_5 +exo17,,0x6B0000E,2,MDLC2 +exo17_1,,0x6B0600E,2,DLC2_5 +exo17_2,,0x6B0800E,2,DLC2_5 +exo17_3,,0x6B0A00E,2,MDLC3 +pants20_2,,0x6404012,2,MDLC3 +pants20_3,,0x6406012,2,MDLC3 +pants20_4,,0x6408012,2,MDLC3 +pants20_5,,0x640A012,2,MDLC3 +pants20_6,,0x640C012,3,MDLC3 +pants20_7,,0x640E012,3,MDLC3 +kneeshin33_2,,0x6804018,2,MDLC3 +hats45,,0x660002B,2,MDLC2 +hats50,,0x660002C,2,MDLC2 +hats50_1,,0x660202C,2,DLC2_5 +hats50_2,,0x660402C,2,DLC2_5 +hats50_3,,0x660602C,2,MDLC3 +hats51,,0x660002D,2,DLC2_5 +hats52,,0x660002E,2,DLC2_5 +pants21,,0x6400013,2,MDLC2 +pants21_1,,0x6402013,2,MDLC3 +pants21_2,,0x6404013,2,MDLC3 +pants21_3,,0x6406013,2,MDLC6_B +gear28,,0x6700015,2,DLC2_5 +gear28_1,,0x6702015,2,MDLC3 +exo19,,0x6B00010,2,DLC2_5 +hats46,,0x660002F,2,MDLC3 +shirt21_1,,0x6202010,3,MDLC3 +shirt21_2,,0x6204010,3,MDLC3 +shirt21_3,,0x6206010,2,MDLC3 +exo20,,0x6B00011,2,MDLC2_5 +exo20_1,,0x6B02011,2,MDLC3 +hats47,,0x6600030,2,MDLC2_5 +hats47_1,,0x6602030,2,MDLC3 +gear29,,0x6700016,2,MDLC2_5 +gear29_1,,0x6702016,2,MDLC3 +gear29_2,,0x6704016,2,MDLC3 +gear29_3,,0x6706016,2,MDLC3 +gear29_5,,0x670A016,2,MDLC3 +gear29_6,,0x670C016,2,MDLC3 +kneeshin34,,0x6800019,2,MDLC2_5 +kneeshin34_1,,0x6802019,2,MDLC3 +kneeshin34_2,,0x6804019,2,MDLC3 +boots19,,0x6A00010,2,MDLC2_5 +boots19_1,,0x6A02010,2,MDLC3 +boots19_2,,0x6A04010,2,MDLC3 +boots19_4,,0x6A08010,2,MDLC3 +boots19_5,,0x6A0A010,2,MDLC3 +boots19_7,,0x6A0E010,2,MDLC3 +gloves32,,0x690001C,2,MDLC2_5 +gloves32_1,,0x690201C,2,MDLC3 +pants22,,0x6400014,2,MDLC2_5 +pants22_1,,0x6402014,2,MDLC3 +pants22_2,,0x6404014,2,MDLC3 +pants22_3,,0x6406014,2,MDLC3 +pants22_5,,0x640A014,2,MDLC3 +pants22_6,,0x640C014,2,MDLC3 +pants22_7,,0x640E014,2,MDLC3 +shirt22,,0x6200011,2,MDLC2_5 +shirt22_1,,0x6202011,2,MDLC3 +shirt22_2,,0x6204011,2,MDLC3 +shirt22_4,,0x6208011,2,MDLC3 +shirt22_5,,0x620A011,2,MDLC3 +shirt22_6,,0x620C011,2,MDLC3 +shirt22_7,,0x620E011,2,MDLC3 +exo21,,0x6B00012,2,DLC2_5 +exo22,,0x6B00013,2,DLC2_5 +exo22_1,,0x6B02013,2,MDLC3 +exo22_2,,0x6B04013,2,MDLC3 +exo22_3,,0x6B06013,2,MDLC6_A +hats53,,0x6600031,3,MDLC3 +hats53_1,,0x6602031,2,MDLC3 +hats54,,0x6600032,2,MDLC3 +hats55,,0x6600033,2,DLC2_5 +hats55_1,,0x6602033,3,MDLC3 +hats55_3,,0x6606033,2,MDLC3 +hats56,,0x6600034,2,DLC2_5 +gear30,,0x6700017,3,MDLC3 +gear30_1,,0x6702017,2,MDLC3 +gear30_2,,0x6704017,2,MDLC3 +exo23,,0x6B00014,2,MDLC3 +exo23_1,,0x6B02014,2,MDLC3 +exo23_2,,0x6B04014,2,MDLC3 +exo24,,0x6B00015,2,MDLC3 +gear31,,0x6700018,2,MDLC3 +gear31_1,,0x6702018,3,MDLC6_A +gear32,,0x6700019,2,MDLC3 +gear32_1,,0x6702019,2,MDLC6_B +gear33,,0x670001A,2,MDLC3 +hats58,,0x6600036,2,MDLC3 +hats59,,0x6600037,2,MDLC3 +hats60,,0x6600038,2,MDLC3 +exo25,,0x6B00016,2,MDLC3 +exo25_1,,0x6B02016,2,MDLC3 +hats61,,0x6600039,2,MDLC3 +exo26,,0x6B00017,2,MDLC3 +exo26_1,,0x6B02017,3,MDLC3 +hats62,,0x660003B,2,MDLC3 +gear34,,0x670001B,2,MDLC3 +gear34_1,,0x670201B,3,MDLC3 +gear34_2,,0x670401B,3,MDLC3 +gear34_3,,0x670601B,2,MDLC3 +gear34_4,,0x670801B,2,MDLC3 +gear34_5,,0x670A01B,2,MDLC3 +gear34_6,,0x670C01B,2,MDLC3 +hats63,,0x660003C,3,MDLC3 +pants23,,0x6400015,3,MDLC3 +hats64,,0x660003D,2,MDLC3 +hats64_1,,0x660203D,2,MDLC6_A +gear35,,0x670001C,2,MDLC3 +gear35_1,,0x670201C,2,MDLC3 +gear35_2,,0x670401C,3,MDLC3 +hats65,,0x660003E,2,MDLC3 +gear37,,0x670001E,2,MDLC3 +exo27,,0x6B00018,2,Never +exo27_1,,0x6B02018,2,MDLC3 +gear38,,0x670001F,2,MDLC3 +gear38_1,,0x670201F,2,MDLC3 +gear39,,0x6700020,2,MDLC3 +exo28,,0x6B00019,2,MDLC3 +hats66,,0x660003F,3,MDLC3 +gloves33,,0x690001D,2,MDLC3 +gloves33_1,,0x690201D,2,MDLC6_B +boots20,,0x6A00011,2,Never +boots20_1,,0x6A02011,2,Never +shirt23,,0x6200012,2,MDLC3 +shirt24,,0x6200013,2,MDLC3 +boots14,,0x6A00012,2,MDLC3 +boots14_1,,0x6A02012,2,MDLC6_B +boots21,,0x6A00013,2,MDLC3 +boots21_1,,0x6A02013,2,MDLC3 +boots21_2,,0x6A04013,2,MDLC3 +boots21_3,,0x6A06013,3,MDLC6_A +kneeshin35,,0x680001A,2,MDLC3 +kneeshin35_1,,0x680201A,2,MDLC3 +gear40,,0x6700021,2,MDLC3 +pants24,,0x6400016,2,MDLC3 +pants24_1,,0x6402016,2,MDLC3 +pants25,,0x6400017,2,MDLC3 +pants25_1,,0x6402017,2,MDLC3 +pants25_2,,0x6404017,2,MDLC3 +hats67,,0x6600040,3,MDLC3 +gear41,,0x6700022,3,MDLC3 +pants26,,0x6400018,2,MDLC3 +pants26_1,,0x6402018,2,MDLC3 +pants26_2,,0x6404018,2,MDLC3 +pants26_3,,0x6406018,2,MDLC6_B +pants26_4,,0x6408018,3,MDLC6_A +shirt25,,0x6200014,2,MDLC3 +shirt25_1,,0x6202014,2,MDLC3 +shirt25_2,,0x6204014,2,MDLC3 +shirt25_3,,0x6206014,2,MDLC3 +shirt25_5,,0x620A014,3,MDLC6_A +shirt26,,0x6200015,2,MDLC3 +gear42,,0x6700023,2,MDLC3 +hats68,,0x6600041,2,MDLC3 +exo29,,0x6B0001A,2,MDLC3 +exo29_1,,0x6B0201A,3,MDLC3 +boots22,,0x6A00014,2,MDLC3 +boots5_1,,0x6A02014,2,MDLC3 +boots5_2,,0x6A04014,2,MDLC3 +boots5_3,,0x6A06014,2,MDLC3 +boots5_4,,0x6A08014,2,MDLC3 +boots5_5,,0x6A0A014,2,MDLC3 +boots5_6,,0x6A0C014,2,MDLC3 +boots22_7,,0x6A0E014,2,MDLC3 +hats69,,0x6600042,3,MDLC3 +gear43,,0x6700024,2,MDLC3 +pants27,,0x6400019,3,MDLC3 +exo30,,0x6B0001B,2,MDLC3 +hats70,,0x6600043,2,MDLC3 +pants28,,0x640001A,2,MDLC3 +gear44,,0x6700025,2,MDLC3 +gear44_1,,0x6702025,2,MDLC3 +gear44_2,,0x6704025,2,MDLC6_A +hats71,,0x6600044,2,MDLC3 +pants29,,0x640001B,2,MDLC3 +pants29_1,,0x640201B,2,MDLC6_A +pants29_2,,0x640401B,2,MDLC6_B +boots23,,0x6A00015,2,MDLC3 +exo31,,0x6B0001C,3,MDLC3 +boots24,,0x6A00016,2,MDLC3 +gear45,,0x6700026,2,MDLC3 +hats72,,0x6600045,2,MDLC3 +pants30,,0x640001C,2,MDLC3 +exo32,,0x6B0001D,2,MDLC3 +gear46,,0x6700027,2,MDLC3 +hats73,,0x6600046,3,MDLC6_A +pants31,,0x640001D,3,MDLC6_A +exo33,,0x6B0001E,2,MDLC3 +gear47,,0x6700028,3,MDLC6_A +gear48,,0x6700029,2,MDLC6_B +gear49,,0x670002A,2,MDLC6_B +eye12,,0x6C0000C,2,MDLC6_B +exo34,,0x6B0001F,2,MDLC6_B +exo35,,0x6B00020,2,MDLC6_A +hats74,,0x6600047,2,MDLC6_A +gear50,,0x670002B,2,MDLC6_A +gloves34,,0x690001E,2,MDLC6_A +hats75,,0x6600048,2,MDLC6_B +pants32,,0x640001E,2,MDLC6_A +gear51,,0x670002C,2,MDLC6_B +boots25,,0x6A00017,2,MDLC6_A +exo36,,0x6B00021,2,MDLC6_B +exo37,,0x6B00022,3,MDLC6_A diff --git a/data/dw/mm.cfg b/data/dw/mm.cfg new file mode 100644 index 0000000..cbb31dc --- /dev/null +++ b/data/dw/mm.cfg @@ -0,0 +1 @@ +XX 0 D150 0 G5 4 F 6 H 60 S 30 B 20 M49152 40 M14336 0 P50 8 P75 16 P100 24 P120 32 P150 \ No newline at end of file diff --git a/data/dw/playlists_tu22.aggr b/data/dw/playlists_tu22.aggr new file mode 100644 index 0000000..9879777 Binary files /dev/null and b/data/dw/playlists_tu22.aggr differ diff --git a/data/dw/social_tu22.cfg b/data/dw/social_tu22.cfg new file mode 100644 index 0000000..cb45290 --- /dev/null +++ b/data/dw/social_tu22.cfg @@ -0,0 +1,171 @@ +// increment this version number when making changes to the social config +set social_config_version 40 + +set netinfo_logging 0 + +set ui_show_store 1 +set igs_td 1 +set igs_sosp 1 +set matchdata_active 1 +set sp_matchdata_active 1 +set theater_active 1 +set facebook_active 0 +set entitlements_active 1 +set userGroup_active 1 +set prestige_shop_active 1 +set gamedvr_active 1 +set livestreaming_active 0 +set screenshots_active 1 +set comscore_active 1 +set zombies_show_menu_option 1 + +set userGroup_max_retry_time 10000 + +set elite_clan_active 0 +set elite_clan_remote_view_active 0 +set elite_clan_emblem_upload_active 0 + +set dw_presence_active 1 +set dw_presence_put_delay 5000 +set dw_presence_put_rate 60000 +set dw_presence_get_delay 5000 +set dw_presence_get_rate 120000 +set dw_presence_coop_join_active 1 +set dw_shared_presence_active 1 +set dw_shared_presence_put_rate 300000 +set dw_leaderboard_write_active 1 + +set elite_clan_delay -1 +set elite_clan_division_icon_active 1 +set splitscreen_online_enabled 1 +set motd_store_link 0 +set ca_intra_only 0 + +#ifdef MP +set live_qosec_lastupdatems 5000 +set ca_do_mlc 1 + +set ds_pingclient_maxpings 10 +set ds_pingclient_minpings 4 +set ds_pingclient_maxpings_per_tick 1 + +set ds_serverConnectTimeout 3000 +set ds_listenServerConnectTimeout 10000 +set ds_serverAcquireTimeout 2000 +set ds_introRequestTimeout 2000 +set ds_serverListExpiryPeriod 60000 +set ds_serverAcquisitionPeriod 7000 + +set max_party_share_ds_pings 8 +set dc_lobbymerge 1 +set s_avg_max_weighting 0 +#endif + +set mm_skill_lower_bucket 806 +set mm_skill_upper_bucket 1051 +set mm_feed_performance 1 + +#ifdef MP +set past_title_data_active 0 +set past_title_data_read_failure_interval_hours 72 +set past_title_data_read_success_interval_hours 192 +#endif + +set mm_skill_enforcement 0 +set mm_use_onboarding_skill 1 +set mm_bucket_option 1 // isolate onboarding pool + +set comscore_active 1 + +#ifdef MP +set enable_emblemAppDownload 0 +set marketing_active 0 +set emblems_active 1 +set selfie_active 0 +#endif + +set enable_video_options_preload_shader_controls 1 + +// ChurnScore +set churnscore_scaling_param1 818.1 +set churnscore_scaling_param2 6288.3 +set churnscore_scoring_param1 3.53478575181172 +set churnscore_scoring_multiplier_totalkillscap -0.527447816986428 +set churnscore_scoring_multiplier_gameperformance -0.32373506559784 +set churnscore_scoring_multiplier_daysbetweentitles 0.00058954962393 +set churnscore_scoring_multiplier_previoustitlematches -0.00003043977270 +set churnscore_scoring_multiplier_currenttitlematches -0.00112090114056 +set churnscore_scoring_multiplier_dayssincelaunch 0 +set churnscore_scoring_multiplier_disconnectflag 1.02002532365439 +set churnscore_scoring_multiplier_spflag -0.06442491477533 +set churnscore_scoring_multiplier_timesincelastmatch 5.94629549261903E-07 + +// RedeemCoupons +set inventory_taskRedeemCouponTimeout 10.0 // in sec +set inventory_fullRedeemCouponTimeout 15000 // in ms +set inventory_handleRedeemCouponErrorAsSuccess 1 +set inventory_handleRedeemCouponErrorCode 8045 +set inventory_ignoreOldPushNotifications 1 +set inventory_maxRewardRollsClaimed 35 + +// DLC +set inventory_exchangeRetryMax 1 +set useCPMarkerForCPOwnership 1 +set earlyAccessDLC 3 +set inventory_handleRedeemCouponErrorAsSuccess 1 +set inventory_handleRedeemCouponErrorCode 8045 +set inventory_ignoreOldPushNotifications 1 + +set igs_version 10 +set igs_config_dw_filename "winStoreConfig_tu22.csv" +set armory_contentpacks_enabled 5 + +set msg_field_delta2 0 // matched in socialds + +// DAILY Challenges +set dailychallenge_killswitch 1727554559 // all enabled +set dailychallenge_killswitch2 2041 // all enabled + +// Ranked Play +set rankedPlaylistLockoutDuration 900 +set rankedPlayEndMatchKeepLobby 1 +set scr_game_season 10 // matched in socialds + +set zombiesAllowSoloPause 1 + +set csdRewardRanks32 537395200 +set csdRewardRanks64 128 + +// Skill-Based Matchmaking Control +set mm_skill_param_xi 1.0341387 +set mm_skill_param_lambda 0.1631656 +set mm_skill_param_gamma -0.02225907 +set mm_skill_param_delta 0.8303422 + +set prestige30EasterEggEnabled 1 + +set enableS1TUSpawnSightTraces 1 // matched in socialds + +// Special Base Weapon Killswitch +set baseWeaponsKillswitch "" // matched in socialds + +// Loot Config +set lootConfig_dw_enabled 1 +set lootConfig_dw_filename "lootConfig_tu22.csv" +set lootConfig_redeem_xp "500,1000,2000,4000,3000" +set lootConfig_redeem_codpoint "500,1000,2000,4000,3000" + +set codPointStore_enabled 0 +set codPointStore_dw_filename "codPointStoreConfig_tu22.csv" + +// must match socialds +set bg_customization_gearSetBonusEnabled 1 +set bg_customization_gearSetBonusXP .05 +set bg_customization_gearSetKillswitch_1 16777215 +set bg_customization_gearSetKillswitch_2 16777215 +set bg_customization_gearSetKillswitch_3 16646143 +set bg_customization_gearSetKillswitch_4 12582399 +set bg_customization_gearSetKillswitch_5 16777215 + +// Redeem 50 Duplicate +set lui_loot_duplicateredemption 0 diff --git a/data/dw/winStoreConfig_tu22.csv b/data/dw/winStoreConfig_tu22.csv new file mode 100644 index 0000000..b3302de --- /dev/null +++ b/data/dw/winStoreConfig_tu22.csv @@ -0,0 +1,206 @@ +#Game Language to offerids mapping +#english,EN +#french,FR +#frenchcan,FR +#german,DE-LV +#austrian,DE-FV +#italian,IT +#spanish,ES +#british,EN +#russian,RU +#polish,PL +#korean,EN +#japanese,EN-JA +#fulljap,JA + +#visibility refer to igsProductVisibility_e +# 0 - Visible Always +# 1 - Hide Always ( Hide in store and in Front End ) +# 2 - Visible for season pass holders ( Hide in store if player does not own season pass ) +# 3 - Visible for non season pass holders ( Hide in store if player owns season pass ) +# 4 - Hide in CAC / CAO ( Show in Store,Hide in Front End ) +# 5 - Early Access ( Hide in the store,Show in Front End ) + +version,version_id,10 + +#type = product,UID,Product ID,Image Name,dlcName,category,#Language List separated by space delimiter,#visibility,#productgroup,#seenIndex,#name +product,product_1,317660,img_store_season_pass,seasonpass,seasonpass,english french german italian spanish russian polish korean taiwanese chinese thai czech spanishna portuguese arabic,0,,,# Season Pass + +product,product_2,318791,img_store_mappacks_havok,dlc2,mappacks,all,0,,,# Havoc +product,product_3,318792,img_store_mappacks_ascendance,dlc3,mappacks,all,0,,32,# Ascendance +product,product_4,318793,img_store_mappacks_supremacy,dlc4,mappacks,all,0,,,# Supremacy +product,product_5,318794,img_store_mappacks_reckoning,dlc5,mappacks,all,0,,,# Reckoning + +# MDLC 2.5 - Standard Packs +product,product_137,343596,img_store_personpacks_ice,mdlc62,personpacks,all,0,,34,# Ice Pack +product,product_138,343597,img_store_personpacks_disco,mdlc63,personpacks,all,0,,35,# Disco Pack +product,product_139,343598,img_store_personpacks_cards,mdlc64,personpacks,all,0,,36,# Cards Pack +product,product_140,343599,img_store_personpacks_jackpot,mdlc65,personpacks,all,0,,37,# Jackpot Pack +product,product_141,343590,img_store_personpacks_blackout,mdlc66,personpacks,all,1,,38,# BLOPS3 Pack + +# MDLC 2 - Standard Packs +product,product_6,343591,img_store_personpacks_tiki,mdlc34,personpacks,all,0,,,# Tiki +product,product_7,343592,img_store_personpacks_gasfire,mdlc35,personpacks,all,0,,,# Gas Fire +product,product_8,343593,img_store_personpacks_leaf,mdlc36,personpacks,all,0,,,# Leaf +product,product_9,343594,img_store_personpacks_psych,mdlc37,personpacks,all,0,,,# Psychadelic + +product,product_10,331060,img_store_personpacks_magma,mdlc7,personpacks,all,0,,,# Magma +product,product_11,331061,img_store_personpacks_lightning,mdlc8,personpacks,all,0,,,# Lightning +product,product_12,331062,img_store_personpacks_hide,mdlc9,personpacks,all,0,,,# Hide +product,product_13,331063,img_store_personpacks_nanotech,mdlc10,personpacks,all,0,,,# Nanotech + +# MDLC 2.5 Premium Personalization Packs +product,product_136,343590,img_store_personpacks_premium_blackout,mdlc61,PREMPERSONPACKS,all,1,,33,# BLOPS3 Prem Pack + +# MDLC 2 - Premium Personalization Packs +product,product_14,343596,img_store_personpacks_premium_tiki,mdlc38,prempersonpacks,all,1,,,# Premium Tiki +product,product_15,343597,img_store_personpacks_premium_gasfire,mdlc39,prempersonpacks,all,1,,,# Premium Gas Fire +product,product_16,343598,img_store_personpacks_premium_leaf,mdlc40,prempersonpacks,all,1,,,# Premium Leaf +product,product_17,343599,img_store_personpacks_premium_psych,mdlc41,prempersonpacks,all,1,,,# Premium Psychadelic + +product,product_18,343600,img_store_personpacks_premium_cod_champs,mdlc42,prempersonpacks,all,0,,,# Premium Cod Champs +product,product_19,331064,img_store_personpacks_premium_magma,mdlc11,prempersonpacks,all,0,,,# Premium Magma +product,product_20,331065,img_store_personpacks_premium_lightning,mdlc12,prempersonpacks,all,0,,,# Premium Lightning +product,product_21,331066,img_store_personpacks_premium_hide,mdlc13,prempersonpacks,all,0,,,# Premium Hide +product,product_22,331067,img_store_personpacks_premium_nanotech,mdlc14,prempersonpacks,all,0,,,# Premium Nanotech + +# MDLC 2 - Exo Packs +product,product_23,343601,img_store_operatorpacks_cowboy,mdlc101,operatorpacks,all,1,,,# Cowboy +product,product_24,343602,img_store_operatorpacks_surfer,mdlc43,operatorpacks,all,1,,,# Surfer +product,product_25,343604,img_store_operatorpacks_octopus,mdlc45,operatorpacks,all,1,,,# Octopus +# MDLC 2 - Lady Gear Exo Packs +product,product_26,345600,img_store_operatorpacks_rose_camo,mdlc59,OPERATORPACKS,all,1,,,# Rose Camo / Passionate +product,product_27,345601,img_store_operatorpacks_white_blue,mdlc60,OPERATORPACKS,all,1,,,# White Blue / Tenacious + +product,product_28,5f3f93ca-03ab-4fdd-aa00-63f17fb08d79,img_store_operatorpacks_steam_punk,mdlc15,operatorpacks,all,0,,,# Steam Punk +product,product_29,beb1715c-5825-4ae3-844d-1f72231f9306,img_store_operatorpacks_panda,mdlc16,operatorpacks,all,0,,,# Panda +product,product_30,05e1b887-e323-4aaf-b95b-12e9512f76aa,img_store_operatorpacks_bali_mask,mdlc17,operatorpacks,all,0,,,#Bali Mask +product,product_31,33c64260-e212-4794-8abe-9810f04471e7,img_store_operatorpacks_classic_biker,mdlc18,operatorpacks,all,0,,,#Classic Biker + +# MDLC 2 - Flags +product,product_32,334460,img_store_flag_packs_argentinia,mdlc46,flagpacks,all,1,,,# Argentina Flag +product,product_33,343605,img_store_flag_packs_austria,mdlc47,flagpacks,all,1,,,# Austria Flag +product,product_34,333086,img_store_flag_packs_brazil,mdlc26,flagpacks,all,1,,,# Brazil Flag +product,product_35,343606,img_store_flag_packs_columbia,mdlc48,flagpacks,all,1,,,# Columbia Flag +product,product_36,343607,img_store_flag_packs_ireland,mdlc49,flagpacks,all,1,,,# Ireland Flag +product,product_37,343608,img_store_flag_packs_new_zealand,mdlc50,flagpacks,all,1,,,# New Zealand Flag +product,product_38,343609,img_store_flag_packs_portugal,mdlc51,flagpacks,all,1,,,# Portugal Flag + +product,product_39,331072,img_store_flag_packs_usa,mdlc19,flagpacks,all,0,,,# USA Flag +product,product_40,333080,img_store_flag_packs_uk,mdlc20,flagpacks,all,0,,,# UK Flag +product,product_41,333081,img_store_flag_packs_canada,mdlc21,flagpacks,all,0,,,# Canada Flag +product,product_42,333082,img_store_flag_packs_france,mdlc22,flagpacks,all,0,,,# France Flag +product,product_43,333083,img_store_flag_packs_germany,mdlc23,flagpacks,all,0,,,# Germany Flag +product,product_44,333084,img_store_flag_packs_australia,mdlc24,flagpacks,all,0,,,# Australia Flag +product,product_45,333087,img_store_flag_packs_italy,mdlc27,flagpacks,all,0,,,# Italy Flag +product,product_46,333088,img_store_flag_packs_spain,mdlc28,flagpacks,all,0,,,# Spain Flag +product,product_47,334220,img_store_flag_packs_netherlands,mdlc29,flagpacks,all,0,,,# Netherlands Flag +product,product_48,334221,img_store_flag_packs_japan,mdlc30,flagpacks,all,0,,,# Japan Flag + +product,product_49,343610,img_store_cac_slots,mdlc52,otheritems,all,0,,,# Create A Class Slots +product,product_50,343612,img_store_armory_slots1,mdlc54,otheritems,all,0,armoryslots,,# Armory Slots +product,product_51,343613,img_store_armory_slots2,mdlc55,otheritems,all,0,armoryslots,,# Armory Slots +product,product_52,343614,img_store_armory_slots3,mdlc56,otheritems,all,0,armoryslots,,# Armory Slots +product,product_53,343615,img_store_armory_slots4,mdlc57,otheritems,all,0,armoryslots,,# Armory Slots +product,product_54,343616,img_store_armory_slots5,mdlc58,otheritems,all,0,armoryslots,,# Armory Slots +product,product_55,318790,img_store_mappacks_atlas_gorge,dlc1,otheritems,all,0,,,# Atlas Gorge + +product,product_56,00000,img_store_supplydrops_1,supdrp61,supplydrops,all,1,supplydrops_1,,# Supply Drops 1 +product,product_57,76a554fb-c4b4-4a3e-b913-dcd0c61de638,img_store_supplydrops_1,supdrp62,supplydrops,all,1,supplydrops_1,,# Supply Drops 1 +product,product_58,ed37f45c-1d3c-451c-87c3-0bb46ca51fa6,img_store_supplydrops_1,supdrp63,supplydrops,all,1,supplydrops_1,,# Supply Drops 1 +product,product_59,518865ed-dfae-4d8a-836e-e0e5dc2c3d08,img_store_supplydrops_1,supdrp64,supplydrops,all,1,supplydrops_1,,# Supply Drops 1 +product,product_60,3b9f4478-900d-43f9-b4b1-eb1f901ce961,img_store_supplydrops_1,supdrp65,supplydrops,all,1,supplydrops_1,,# Supply Drops 1 +product,product_61,f20bfb05-cca9-4a61-971b-c6c620b928b0,img_store_supplydrops_1,supdrp66,supplydrops,all,1,supplydrops_1,,# Supply Drops 1 +product,product_62,a75ee2b8-42f6-46b1-a45f-db6e64a98872,img_store_supplydrops_1,supdrp67,supplydrops,all,1,supplydrops_1,,# Supply Drops 1 +product,product_63,20f97f87-52a7-461e-8b78-9a54080bd400,img_store_supplydrops_1,supdrp68,supplydrops,all,1,supplydrops_1,,# Supply Drops 1 +product,product_64,f03ad620-bc8a-4f4f-a3b0-3630347b8a30,img_store_supplydrops_1,supdrp69,supplydrops,all,1,supplydrops_1,,# Supply Drops 1 +product,product_65,ebe31b71-f8cc-4f0d-9915-6a13d53af74b,img_store_supplydrops_1,supdrp70,supplydrops,all,1,supplydrops_1,,# Supply Drops 1 +product,product_111,b05003d8-bf77-4d04-a0cc-d8a36425b813,img_store_supplydrops_1,supdrp72,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1 +product,product_112,2b7b516c-8e7e-45b7-92fd-dc2040c08d6e,img_store_supplydrops_1,supdrp73,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1 +product,product_113,5de14218-1543-4fc5-ae89-eb4037109234,img_store_supplydrops_1,supdrp74,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1 +product,product_114,3404d799-4341-46de-95ea-c6bdd47c8e39,img_store_supplydrops_1,supdrp75,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1 +product,product_115,3f05faaf-a59b-4807-ad58-0bd28f520cc9,img_store_supplydrops_1,supdrp76,supplydrops,all,1,supplydrops_1,22,# Supply Drops 1 + +product,product_66,6031ecd6-a183-4c71-9022-9685dde26ebd,img_store_supplydrops_3,supdrp91,supplydrops,all,1,supplydrops_3,,# Supply Drops 3 +product,product_67,6aebd756-0b60-4ad4-8639-d27db2ae79e0,img_store_supplydrops_3,supdrp92,supplydrops,all,1,supplydrops_3,,# Supply Drops 3 +product,product_68,93a0c86c-c7af-464c-88d7-6e0519d482f4,img_store_supplydrops_3,supdrp93,supplydrops,all,1,supplydrops_3,,# Supply Drops 3 +product,product_69,6ca3fa67-8844-4128-89e0-8d4b7b8c5e3a,img_store_supplydrops_3,supdrp94,supplydrops,all,1,supplydrops_3,,# Supply Drops 3 +product,product_70,55c76436-50d8-401e-8761-b9ceeb18c7c4,img_store_supplydrops_3,supdrp95,supplydrops,all,1,supplydrops_3,,# Supply Drops 3 +product,product_71,844742d6-baa0-4079-892e-649a45564b56,img_store_supplydrops_3,supdrp96,supplydrops,all,1,supplydrops_3,,# Supply Drops 3 +product,product_72,605fb575-1482-4e0f-8934-165e290d26ca,img_store_supplydrops_3,supdrp97,supplydrops,all,1,supplydrops_3,,# Supply Drops 3 +product,product_73,64d0e219-b602-4906-b714-895d020bae2a,img_store_supplydrops_3,supdrp98,supplydrops,all,1,supplydrops_3,,# Supply Drops 3 +product,product_74,fc0e23af-fc91-4711-b3ca-a45c3ab03049,img_store_supplydrops_3,supdrp99,supplydrops,all,1,supplydrops_3,,# Supply Drops 3 +product,product_75,e9886801-697b-4b40-93bd-6f9b37b6102b,img_store_supplydrops_3,supdrp100,supplydrops,all,1,supplydrops_3,,# Supply Drops 3 +product,product_116,3c32e23a-514d-487c-9733-c9c8ec6fd55b,img_store_supplydrops_3,supdrp77,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3 +product,product_117,906884d7-2864-4cd2-b725-1129c111abab,img_store_supplydrops_3,supdrp78,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3 +product,product_118,28e9c053-da80-4f8a-b1b3-26cf9e6cad59,img_store_supplydrops_3,supdrp79,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3 +product,product_119,13668620-fb95-4e3b-b15b-05ca33cb90dc,img_store_supplydrops_3,supdrp80,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3 +product,product_120,e9e772ce-aeb5-4831-9672-f2ab1c0459f5,img_store_supplydrops_3,supdrp81,supplydrops,all,1,supplydrops_3,23,# Supply Drops 3 + +product,product_76,156f40b5-3683-4c26-a6d0-f2358701df53,img_store_supplydrops_5,supdrp71,supplydrops,all,1,supplydrops_5,,# Supply Drops 5 +product,product_77,3ec7cec9-91ff-4931-8785-e7092495c5cb,img_store_supplydrops_5,supdrp72,supplydrops,all,1,supplydrops_5,,# Supply Drops 5 +product,product_78,29af6a13-c4ce-469c-aee1-82bdcef9307f,img_store_supplydrops_5,supdrp73,supplydrops,all,1,supplydrops_5,,# Supply Drops 5 +product,product_79,92334032-5350-4319-ad0b-a5dac31e491f,img_store_supplydrops_5,supdrp74,supplydrops,all,1,supplydrops_5,,# Supply Drops 5 +product,product_80,9974b492-3253-4873-97cc-68a47117f09f,img_store_supplydrops_5,supdrp75,supplydrops,all,1,supplydrops_5,,# Supply Drops 5 +product,product_81,d3a71cec-ceb3-452a-baa1-97ce8360cee8,img_store_supplydrops_5,supdrp76,supplydrops,all,1,supplydrops_5,,# Supply Drops 5 +product,product_82,93e9ba95-0738-4302-9880-33774f4e4b2a,img_store_supplydrops_5,supdrp77,supplydrops,all,1,supplydrops_5,,# Supply Drops 5 +product,product_83,5998caba-5f9f-475c-bc45-a4f2d9386105,img_store_supplydrops_5,supdrp78,supplydrops,all,1,supplydrops_5,,# Supply Drops 5 +product,product_84,5afa84ac-abe3-4db9-917e-29933134d4be,img_store_supplydrops_5,supdrp79,supplydrops,all,1,supplydrops_5,,# Supply Drops 5 +product,product_85,4f7350d9-90aa-4f91-a974-8fe399280d7c,img_store_supplydrops_5,supdrp80,supplydrops,all,1,supplydrops_5,,# Supply Drops 5 +product,product_121,19938ec4-0047-4d17-8002-97c6584413fa,img_store_supplydrops_5,supdrp82,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5 +product,product_122,e2bb0ca8-66cc-4658-a34c-0c80babdb0df,img_store_supplydrops_5,supdrp83,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5 +product,product_123,411f8663-77fd-4821-8eef-8e213ba1f4ed,img_store_supplydrops_5,supdrp84,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5 +product,product_124,2a9140a1-946b-4a07-a790-6f7d4ee541d7,img_store_supplydrops_5,supdrp85,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5 +product,product_125,af7f50e7-dc1b-4b14-b78d-61ae560b2a00,img_store_supplydrops_5,supdrp86,supplydrops,all,1,supplydrops_5,24,# Supply Drops 5 + +product,product_86,5de0f259-b94b-40a9-a2ea-dba2f95f8b87,img_store_supplydrops_10,supdrp81,supplydrops,all,1,supplydrops_10,,# Supply Drops 10 +product,product_87,89f452a5-5c6f-4d8e-a203-35de25a73805,img_store_supplydrops_10,supdrp82,supplydrops,all,1,supplydrops_10,,# Supply Drops 10 +product,product_88,c503ee82-39c2-4a0e-93fe-e9acfc846a81,img_store_supplydrops_10,supdrp83,supplydrops,all,1,supplydrops_10,,# Supply Drops 10 +product,product_89,e2c670f6-567b-4bd1-ae36-c2f039e22add,img_store_supplydrops_10,supdrp84,supplydrops,all,1,supplydrops_10,,# Supply Drops 10 +product,product_90,b38a63b5-2c14-445f-a9d7-31ad59b4fe5c,img_store_supplydrops_10,supdrp85,supplydrops,all,1,supplydrops_10,,# Supply Drops 10 +product,product_91,8c448893-0809-4c4f-be73-fa574be15333,img_store_supplydrops_10,supdrp86,supplydrops,all,1,supplydrops_10,,# Supply Drops 10 +product,product_92,82a96d7b-859b-46a9-a7c7-ba082558066b,img_store_supplydrops_10,supdrp87,supplydrops,all,1,supplydrops_10,,# Supply Drops 10 +product,product_93,9bc7070b-4a5a-4d39-9957-734eafd3f8e0,img_store_supplydrops_10,supdrp88,supplydrops,all,1,supplydrops_10,,# Supply Drops 10 +product,product_94,dda9be88-d5cc-4827-aecf-40e9598f4adb,img_store_supplydrops_10,supdrp89,supplydrops,all,1,supplydrops_10,,# Supply Drops 10 +product,product_95,4067a17b-23c7-4999-a514-8ed9041e8a02,img_store_supplydrops_10,supdrp90,supplydrops,all,1,supplydrops_10,,# Supply Drops 10 +product,product_126,10cd1171-2eb4-4dcb-a281-372b747319f6,img_store_supplydrops_10,supdrp87,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10 +product,product_127,8706ff47-4cc7-4957-a4f3-d9589be39d78,img_store_supplydrops_10,supdrp88,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10 +product,product_128,ff9063ee-79ef-4b4a-8e22-df83f700e292,img_store_supplydrops_10,supdrp89,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10 +product,product_129,31cdd8b7-2c6a-414b-8e02-a2d7f6f64f12,img_store_supplydrops_10,supdrp90,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10 +product,product_130,de53b351-a6ab-4089-a30b-0396f6fad455,img_store_supplydrops_10,supdrp91,supplydrops,all,1,supplydrops_10,25,# Supply Drops 10 + +# Consumable Supply Drops +product,product_96,c5f202f9-3386-4d8b-9f5f-fc4f16f78ed3,img_store_supplydrops_1,supdrp46,supplydrops_v2,all,1,,26,# Consumable Supply Drops 1 +product,product_97,0463b195-81cb-43c8-87a4-814043492ac1,img_store_supplydrops_3,supdrp50,supplydrops_v2,all,1,,27,# Consumable Supply Drops 3 +product,product_98,ef8577d9-0cab-433d-8955-8dd96089218e,img_store_supplydrops_5,supdrp47,supplydrops_v2,all,1,,28,# Consumable Supply Drops 5 +product,product_99,4b49d2af-d9ed-4f4a-8aa1-0fc3c2e70f87,img_store_supplydrops_10,supdrp48,supplydrops_v2,all,1,,29,# Consumable Supply Drops 10 +product,product_100,ca0012ef-1206-4173-8979-d2d4f3d66a57,img_store_supplydrops_20,supdrp71,supplydrops_v2,all,1,,31,# Consumable Supply Drops 20 + +# More Durable Supply Drops +product,product_101,48a1c3f1-c47f-4752-95c8-658630e29cd1,img_store_supplydrops_20,supdrp61,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_102,e0556d68-6bbf-4fce-affb-28c4eec8eb25,img_store_supplydrops_20,supdrp62,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_103,d627860d-bf3a-4972-9eb5-51a68bf4eb44,img_store_supplydrops_20,supdrp63,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_104,641bb491-7dda-42c9-850f-a9d6774236a0,img_store_supplydrops_20,supdrp64,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_105,c53a24c9-c07b-468d-bbc5-1d57ccdfd82c,img_store_supplydrops_20,supdrp65,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_106,fcc7f36b-3158-4129-a13d-8437924eb9ee,img_store_supplydrops_20,supdrp66,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_107,a21a0bda-abed-47a2-9d97-40bede8bfd7b,img_store_supplydrops_20,supdrp67,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_108,c7492ab3-7a7c-46d7-8efd-2a6ecd844dd7,img_store_supplydrops_20,supdrp68,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_109,e6a955fb-c723-42f7-b391-615dce049592,img_store_supplydrops_20,supdrp69,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_110,a4f8bf5c-4af4-4f4b-9996-e0816475ff6b,img_store_supplydrops_20,supdrp70,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_131,0b917713-e3a1-406b-9a61-dd1afa2212f5,img_store_supplydrops_20,supdrp92,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_132,69377444-37e1-4b99-8008-376a1da8d886,img_store_supplydrops_20,supdrp93,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_133,c3ae1aee-1445-4601-9577-033496317972,img_store_supplydrops_20,supdrp94,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_134,7d66fdd5-ebac-4893-be48-439867faccda,img_store_supplydrops_20,supdrp95,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 +product,product_135,466f1cd8-ce9e-4ee8-ad7b-79d9e8c4e57b,img_store_supplydrops_20,supdrp96,supplydrops,all,1,supplydrops_20,30,# Supply Drops 20 + +#MDLC 4 OHM Standalone +product,product_142,343595,img_store_ohm,mdlc70,OTHERITEMS,all,0,,,#OHM Standalone Pack +#type = category,UID,category ID,title,Language List separated by space delimiter,visibility (0-show,1-hide) +category,category_1,1,seasonpass,LUA_MENU_STORE_SEASON_PASS,english french german italian spanish russian polish korean taiwanese chinese thai czech spanishna portuguese arabic,0 +category,category_2,2,mappacks,LUA_MENU_STORE_MAP_PACKS,all,0 +category,category_3,3,prempersonpacks,LUA_MENU_STORE_PREMIUM_PERSONALIZATION_PACKS,all,0 +category,category_4,4,personpacks,LUA_MENU_STORE_PERSONALIZATION_PACKS,all,0 +category,category_5,5,operatorpacks,LUA_MENU_STORE_PREMIUM_EXO_PACKS,all,0 +category,category_6,6,flagpacks,LUA_MENU_STORE_EXO_PACKS,all,0 +category,category_7,7,supplydrops,LUA_MENU_STORE_SUPPLYDROPS,all,1 +category,category_8,8,otheritems,LUA_MENU_STORE_ADDITIONAL_ITEMS,all,0 diff --git a/data/maps/mp/gametypes/_damage.gsc b/data/maps/mp/gametypes/_damage.gsc new file mode 100644 index 0000000..8332d39 --- /dev/null +++ b/data/maps/mp/gametypes/_damage.gsc @@ -0,0 +1,3637 @@ +// S1 GSC SOURCE +// Dumped by https://github.com/xensik/gsc-tool + +isswitchingteams() +{ + if ( isdefined( self.switching_teams ) ) + return 1; + + return 0; +} + +isteamswitchbalanced() +{ + var_0 = maps\mp\gametypes\_teams::countplayers(); + var_0[self.leaving_team]--; + var_0[self.joining_team]++; + return var_0[self.joining_team] - var_0[self.leaving_team] < 2; +} + +isfriendlyfire( var_0, var_1 ) +{ + if ( !level.teambased ) + return 0; + + if ( !isdefined( var_1 ) ) + return 0; + + if ( !isplayer( var_1 ) && !isdefined( var_1.team ) ) + return 0; + + if ( var_0.team != var_1.team ) + return 0; + + if ( var_0 == var_1 ) + return 0; + + return 1; +} + +killedself( var_0 ) +{ + if ( !isplayer( var_0 ) ) + return 0; + + if ( var_0 != self ) + return 0; + + return 1; +} + +handleteamchangedeath() +{ + if ( !level.teambased ) + return; + + if ( self.joining_team == "spectator" || !isteamswitchbalanced() ) + { + self thread [[ level.onxpevent ]]( "suicide" ); + maps\mp\_utility::incpersstat( "suicides", 1 ); + self.suicides = maps\mp\_utility::getpersstat( "suicides" ); + } +} + +handleworlddeath( var_0, var_1, var_2, var_3 ) +{ + if ( !isdefined( var_0 ) ) + return; + + if ( !isdefined( var_0.team ) ) + { + handlesuicidedeath( var_2, var_3 ); + return; + } + + if ( level.teambased && var_0.team != self.team || !level.teambased ) + { + if ( isdefined( level.onnormaldeath ) && ( isplayer( var_0 ) || isagent( var_0 ) ) && var_0.team != "spectator" ) + [[ level.onnormaldeath ]]( self, var_0, var_1 ); + } +} + +givescoreloss( var_0 ) +{ + var_1 = int( max( 0, maps\mp\gametypes\_gamescore::_getplayerscore( self ) - var_0 ) ); + maps\mp\gametypes\_gamescore::_setplayerscore( self, var_1 ); +} + +handlesuicidedeath( var_0, var_1 ) +{ + self thread [[ level.onxpevent ]]( "suicide" ); + maps\mp\_utility::incpersstat( "suicides", 1 ); + self.suicides = maps\mp\_utility::getpersstat( "suicides" ); + + if ( !maps\mp\_utility::privatematch() && self.suicides == 15 ) + thread delayedsuicidekick(); + + var_2 = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "suicidepointloss" ); + givescoreloss( var_2 ); + + if ( var_0 == "MOD_SUICIDE" && var_1 == "none" && isdefined( self.throwinggrenade ) ) + self.lastgrenadesuicidetime = gettime(); + + if ( isdefined( level.onsuicidedeath ) ) + [[ level.onsuicidedeath ]]( self ); + + if ( isdefined( self.friendlydamage ) ) + self iprintlnbold( &"MP_FRIENDLY_FIRE_WILL_NOT" ); + + self.pers["suicideSpawnDelay"] = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "suicidespawndelay" ); +} + +delayedsuicidekick() +{ + self endon( "disconnect" ); + level endon( "game_ended" ); + wait(randomintrange( 1, 60 )); + kick( self getentitynumber() ); +} + +handlefriendlyfiredeath( var_0 ) +{ + var_0 thread [[ level.onxpevent ]]( "teamkill" ); + var_0.pers["teamkills"] += 1.0; + var_0.pers["totalTeamKills"] += 1.0; + var_0.teamkillsthisround++; + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "team", "teamkillpointloss" ) ) + { + var_1 = maps\mp\gametypes\_rank::getscoreinfovalue( "kill" ); + var_0 givescoreloss( var_1 ); + } + + var_2 = var_0 maps\mp\gametypes\_playerlogic::teamkilldelay(); + + if ( var_2 > 0 ) + { + var_0.pers["teamKillPunish"] = 1; + var_0 maps\mp\_utility::_suicide(); + } + + var_3 = maps\mp\gametypes\_tweakables::gettweakablevalue( "team", "teamkillkicklimit" ); + + if ( var_3 > 0 ) + { + var_4 = var_0.pers["totalTeamKills"]; + + if ( var_4 >= var_3 ) + thread friendlyfirekick( var_0 ); + } +} + +friendlyfirekick( var_0 ) +{ + waittillframeend; + kick( var_0 getentitynumber(), "EXE_PLAYERKICKED_TEAMKILL" ); + level thread maps\mp\gametypes\_gamelogic::updategameevents(); +} + +handlenormaldeath( var_0, var_1, var_2, var_3, var_4 ) +{ + var_1 thread maps\mp\_events::killedplayer( var_0, self, var_3, var_4, var_2 ); + var_1 killnotification(); + + if ( var_4 == "MOD_HEAD_SHOT" ) + { + var_1 playlocalsound( "mp_headshot_killer" ); + self playsound( "mp_headshot_killed" ); + } + + var_1 thread maps\mp\_events::killedplayerevent( self, var_3, var_4 ); + var_5 = var_1.pers["cur_kill_streak"]; + + if ( isalive( var_1 ) ) + { + if ( maps\mp\_utility::ismeleemod( var_4 ) && !var_1 maps\mp\_utility::isjuggernaut() || var_1 maps\mp\_utility::killshouldaddtokillstreak( var_3 ) ) + { + var_1.pers["cur_kill_streak"]++; + var_1.killstreakcount = var_1.pers["cur_kill_streak"]; + var_1 notify( "kill_streak_increased" ); + + if ( !maps\mp\_utility::iskillstreakweapon( var_3 ) ) + var_1.pers["cur_kill_streak_for_nuke"]++; + + var_6 = 30; + + if ( var_1 maps\mp\_utility::_hasperk( "specialty_hardline" ) ) + var_6--; + + if ( !maps\mp\_utility::iskillstreakweapon( var_3 ) && var_1.pers["cur_kill_streak_for_nuke"] == var_6 ) + { + var_7 = var_1 maps\mp\killstreaks\_killstreaks::getnextkillstreakslotindex( "nuke", 0 ); + var_1 thread maps\mp\killstreaks\_killstreaks::givekillstreak( "nuke", 0, 1, var_1 ); + var_1 thread maps\mp\gametypes\_hud_message::killstreaksplashnotify( "nuke", var_6, undefined, undefined, var_7 ); + } + } + + var_1 maps\mp\_utility::setplayerstatifgreater( "longestkillstreak", var_1.pers["cur_kill_streak"] ); + + if ( var_1.pers["cur_kill_streak"] > var_1 maps\mp\_utility::getpersstat( "longestStreak" ) ) + var_1 maps\mp\_utility::setpersstat( "longestStreak", var_1.pers["cur_kill_streak"] ); + } + + var_1.pers["cur_death_streak"] = 0; + + if ( var_1.pers["cur_kill_streak"] > var_1 maps\mp\gametypes\_persistence::statgetchild( "round", "killStreak" ) ) + var_1 maps\mp\gametypes\_persistence::statsetchild( "round", "killStreak", var_1.pers["cur_kill_streak"] ); + + if ( var_1 maps\mp\_utility::rankingenabled() ) + { + if ( var_1.pers["cur_kill_streak"] > var_1.kill_streak ) + { + var_1 maps\mp\gametypes\_persistence::statset( "killStreak", var_1.pers["cur_kill_streak"] ); + var_1.kill_streak = var_1.pers["cur_kill_streak"]; + } + } + + var_8 = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "deathpointloss" ); + givescoreloss( var_8 ); + level notify( "player_got_killstreak_" + var_1.pers["cur_kill_streak"], var_1 ); + var_1 notify( "got_killstreak", var_1.pers["cur_kill_streak"] ); + var_1 notify( "killed_enemy" ); + + if ( isdefined( level.onnormaldeath ) && var_1.pers["team"] != "spectator" ) + [[ level.onnormaldeath ]]( self, var_1, var_0 ); + + if ( !level.teambased ) + { + self.attackers = []; + return; + } + + level thread maps\mp\gametypes\_battlechatter_mp::saylocalsounddelayed( var_1, "kill", 0.75 ); + + if ( isdefined( self.lastattackedshieldplayer ) && isdefined( self.lastattackedshieldtime ) && self.lastattackedshieldplayer != var_1 ) + { + if ( gettime() - self.lastattackedshieldtime < 5000 ) + self.lastattackedshieldplayer thread maps\mp\_events::processassistevent( self, "assist_riot_shield" ); + } + + if ( !maps\mp\_utility::iskillstreakweapon( var_3 ) ) + { + if ( isdefined( self.is_being_tracked ) && self.is_being_tracked && isdefined( self.trackedbyplayer ) ) + { + if ( self.trackedbyplayer != var_1 ) + self.trackedbyplayer thread maps\mp\killstreaks\_marking_util::playerprocesstaggedassist( self ); + } + + var_9 = []; + + foreach ( var_11 in level.uavmodels[var_1.team] ) + { + if ( !isdefined( var_11.owner ) || var_11.owner == var_1 ) + continue; + + if ( common_scripts\utility::array_contains( var_9, var_11.owner ) ) + continue; + + var_9[var_9.size] = var_11.owner; + + if ( var_11.assistpoints ) + var_11.owner thread maps\mp\_events::processassistevent( self, "assist_uav_plus" ); + else + var_11.owner thread maps\mp\_events::processassistevent( self, "assist_uav" ); + + var_11.owner thread maps\mp\gametypes\_missions::processchallenge( "ch_streak_uav" ); + } + } + + if ( isdefined( self.tagmarkedby ) ) + self.tagmarkedby = undefined; + + if ( level.teambased && level.teamemped[self.team] || !level.teambased && isdefined( level.empplayer ) && level.empplayer != self ) + { + if ( isdefined( level.empowner ) && level.empassistpoints && level.empowner != var_1 ) + level.empowner thread maps\mp\_events::processassistevent( self, "assist_emp" ); + } + + if ( isdefined( self.attackers ) ) + { + foreach ( var_14 in self.attackers ) + { + if ( !isdefined( maps\mp\_utility::_validateattacker( var_14 ) ) ) + continue; + + if ( var_14 == var_1 ) + continue; + + if ( self == var_14 ) + continue; + + var_14 thread maps\mp\_events::processassistevent( self ); + } + + self.attackers = []; + } +} + +isplayerweapon( var_0 ) +{ + if ( weaponclass( var_0 ) == "non-player" ) + return 0; + + if ( weaponclass( var_0 ) == "turret" ) + return 0; + + if ( weaponinventorytype( var_0 ) == "primary" || weaponinventorytype( var_0 ) == "altmode" ) + return 1; + + return 0; +} + +callback_playerkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 ) +{ + playerkilled_internal( var_0, var_1, self, var_2, var_3, var_4, var_5, var_6, var_7, var_8, 0 ); +} + +callback_playergrenadesuicide( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 ) +{ + if ( isdefined( level.ishorde ) && level.ishorde ) + { + var_8 = 0; + + if ( level.players.size > 1 ) + var_8 = 1; + else if ( self.hasselfrevive ) + var_8 = 1; + + if ( var_8 ) + var_0 laststanddie(); + + [[ level.callbackplayerlaststand ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, 0 ); + } +} + +callback_entityoutofworld() +{ + self delete(); +} + +launchshield( var_0, var_1 ) +{ + self refreshshieldmodels(); + maps\mp\_riotshield::riotshield_clear(); +} + +playerkilled_internal( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ) +{ + var_2 endon( "spawned" ); + var_2 notify( "killed_player" ); + + if ( isdefined( var_1 ) && isplayer( var_1 ) && isdefined( var_1.exo_ping_on ) && var_1.exo_ping_on == 1 ) + var_1 maps\mp\gametypes\_missions::processchallenge( "ch_exoability_ping" ); + + if ( isdefined( var_2.prekilledfunc ) ) + var_2 [[ var_2.prekilledfunc ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ); + + var_2 maps\mp\gametypes\_playerlogic::resetuidvarsondeath(); + var_2.abilitychosen = 0; + var_2.perkoutlined = 0; + var_2.sensoroutlined = 0; + var_1 = maps\mp\_utility::_validateattacker( var_1 ); + + if ( isdefined( var_1 ) ) + var_1.assistedsuicide = undefined; + + if ( !isdefined( var_2.idflags ) ) + { + if ( var_4 == "MOD_SUICIDE" ) + var_2.idflags = 0; + else if ( var_4 == "MOD_GRENADE" ) + { + if ( ( issubstr( var_5, "frag_grenade" ) || issubstr( var_5, "thermobaric_grenade" ) ) && var_3 == 100000 ) + var_2.idflags = 0; + else if ( var_5 == "nuke_mp" ) + var_2.idflags = 0; + else if ( level.friendlyfire >= 2 ) + var_2.idflags = 0; + else + { + + } + } + } + + if ( var_2 maps\mp\_riotshield::hasriotshieldequipped() ) + var_2 launchshield( var_3, var_4 ); + + var_11 = maps\mp\_utility::ismeleemod( var_4 ) && ( issubstr( var_5, "knife" ) || issubstr( var_5, "tactical" ) ); + var_11 = var_11 || var_5 == maps\mp\_grappling_hook::get_grappling_hook_weapon(); + + if ( var_11 ) + { + if ( isdefined( common_scripts\utility::getfx( "exo_knife_blood" ) ) ) + { + if ( isdefined( var_7 ) && isdefined( var_6 ) && isdefined( gethitloctag( var_7 ) ) ) + playimpactheadfatalfx( var_2 gettagorigin( gethitloctag( var_7 ) ), var_6 ); + else + playimpactheadfatalfx( var_2 gettagorigin( "j_neck" ), anglestoforward( var_2 gettagangles( "j_neck" ) ) ); + } + } + + maps\mp\gametypes\_weapons::recordtogglescopestates(); + + if ( !var_10 ) + { + if ( isdefined( var_2.endgame ) ) + maps\mp\_utility::revertvisionsetforplayer( 2 ); + else + { + maps\mp\_utility::revertvisionsetforplayer( 0 ); + var_2 thermalvisionoff(); + } + } + else + { + var_2.fauxdead = 1; + self notify( "death", var_1, var_4, var_5 ); + } + + if ( game["state"] == "postgame" ) + return; + + var_12 = 0; + + if ( !isplayer( var_0 ) && isdefined( var_0.primaryweapon ) ) + var_13 = var_0.primaryweapon; + else if ( isdefined( var_1 ) && isplayer( var_1 ) && var_1 getcurrentprimaryweapon() != "none" ) + var_13 = var_1 getcurrentprimaryweapon(); + else if ( issubstr( var_5, "alt_" ) ) + var_13 = getsubstr( var_5, 4, var_5.size ); + else + var_13 = undefined; + + if ( isdefined( var_2.uselaststandparams ) || isdefined( var_2.laststandparams ) && var_4 == "MOD_SUICIDE" ) + { + var_2 ensurelaststandparamsvalidity(); + var_2.uselaststandparams = undefined; + var_0 = var_2.laststandparams.einflictor; + var_1 = maps\mp\_utility::_validateattacker( var_2.laststandparams.attacker ); + var_3 = var_2.laststandparams.idamage; + var_4 = var_2.laststandparams.smeansofdeath; + var_5 = var_2.laststandparams.sweapon; + var_13 = var_2.laststandparams.sprimaryweapon; + var_6 = var_2.laststandparams.vdir; + var_7 = var_2.laststandparams.shitloc; + var_12 = ( gettime() - var_2.laststandparams.laststandstarttime ) / 1000; + var_2.laststandparams = undefined; + } + + if ( ( !isdefined( var_1 ) || var_1.classname == "trigger_hurt" || var_1.classname == "worldspawn" || var_1.classname == "script_model" && ( isdefined( var_1.isenvironmentweapon ) && var_1.isenvironmentweapon == 1 ) || var_1 == var_2 ) && isdefined( self.attackers ) ) + { + var_14 = undefined; + + foreach ( var_16 in self.attackers ) + { + if ( !isdefined( maps\mp\_utility::_validateattacker( var_16 ) ) ) + continue; + + if ( !isdefined( var_2.attackerdata[var_16.guid].damage ) ) + continue; + + if ( var_16 == var_2 || level.teambased && var_16.team == var_2.team ) + continue; + + if ( var_2.attackerdata[var_16.guid].lasttimedamaged + 2500 < gettime() && ( var_1 != var_2 && ( isdefined( var_2.laststand ) && var_2.laststand ) ) ) + continue; + + if ( var_2.attackerdata[var_16.guid].damage > 1 && !isdefined( var_14 ) ) + { + var_14 = var_16; + continue; + } + + if ( isdefined( var_14 ) && var_2.attackerdata[var_16.guid].damage > var_2.attackerdata[var_14.guid].damage ) + var_14 = var_16; + } + + if ( isdefined( var_14 ) ) + { + var_1 = var_14; + var_1.assistedsuicide = 1; + var_5 = var_2.attackerdata[var_14.guid].weapon; + var_6 = var_2.attackerdata[var_14.guid].vdir; + var_7 = var_2.attackerdata[var_14.guid].shitloc; + var_8 = var_2.attackerdata[var_14.guid].psoffsettime; + var_4 = var_2.attackerdata[var_14.guid].smeansofdeath; + var_3 = var_2.attackerdata[var_14.guid].damage; + var_13 = var_2.attackerdata[var_14.guid].sprimaryweapon; + var_0 = var_1; + } + } + else if ( isdefined( var_1 ) ) + var_1.assistedsuicide = undefined; + + if ( maps\mp\_utility::isheadshot( var_5, var_7, var_4, var_1 ) ) + var_4 = "MOD_HEAD_SHOT"; + else if ( !maps\mp\_utility::ismeleemod( var_4 ) && !isdefined( var_2.nuked ) ) + var_2 maps\mp\_utility::playdeathsound(); + + var_18 = isfriendlyfire( var_2, var_1 ); + + if ( isdefined( var_1 ) ) + { + if ( var_1.code_classname == "script_vehicle" && isdefined( var_1.owner ) ) + var_1 = var_1.owner; + + if ( var_1.code_classname == "misc_turret" && isdefined( var_1.owner ) ) + { + if ( isdefined( var_1.vehicle ) ) + var_1.vehicle notify( "killedPlayer", var_2 ); + + var_1 = var_1.owner; + } + + if ( isagent( var_1 ) && isdefined( var_1.owner ) ) + { + var_1 = var_1.owner; + var_5 = "agent_mp"; + var_4 = "MOD_RIFLE_BULLET"; + } + + if ( var_1.code_classname == "script_model" && isdefined( var_1.owner ) ) + { + var_1 = var_1.owner; + + if ( !isfriendlyfire( var_2, var_1 ) && var_1 != var_2 ) + var_1 notify( "crushed_enemy" ); + } + } + + if ( var_4 != "MOD_SUICIDE" && ( maps\mp\_utility::isaigameparticipant( var_2 ) || maps\mp\_utility::isaigameparticipant( var_1 ) ) && isdefined( level.bot_funcs ) && isdefined( level.bot_funcs["get_attacker_ent"] ) ) + { + var_19 = [[ level.bot_funcs["get_attacker_ent"] ]]( var_1, var_0 ); + + if ( isdefined( var_19 ) ) + { + if ( maps\mp\_utility::isaigameparticipant( var_2 ) ) + var_2 botmemoryevent( "death", var_5, var_19.origin, var_2.origin, var_19 ); + + if ( maps\mp\_utility::isaigameparticipant( var_1 ) ) + { + var_20 = 1; + + if ( var_19.classname == "script_vehicle" && isdefined( var_19.helitype ) || var_19.classname == "rocket" || var_19.classname == "misc_turret" ) + var_20 = 0; + + if ( var_20 ) + var_1 botmemoryevent( "kill", var_5, var_19.origin, var_2.origin, var_2 ); + } + } + } + + var_21 = var_2 getcurrentweapon(); + var_2 thread maps\mp\gametypes\_weapons::dropscavengerfordeath( var_1 ); + + if ( !isdefined( var_2.agentbody ) ) + var_2 thread [[ level.weapondropfunction ]]( var_1, var_4 ); + else + var_2.agentbody thread [[ level.weapondropfunction ]]( var_1, var_4 ); + + if ( !var_10 ) + var_2 maps\mp\_utility::updatesessionstate( "dead" ); + + var_22 = isdefined( var_2.fauxdead ) && var_2.fauxdead && isdefined( var_2.switching_teams ) && var_2.switching_teams; + + if ( !var_22 ) + var_2 maps\mp\gametypes\_playerlogic::removefromalivecount(); + + if ( !isdefined( var_2.switching_teams ) && !( isdefined( level.iszombiegame ) && level.iszombiegame ) ) + { + var_23 = var_2; + + if ( isdefined( var_2.commanding_bot ) ) + var_23 = var_2.commanding_bot; + + var_23 maps\mp\_utility::incpersstat( "deaths", 1 ); + var_23.deaths = var_23 maps\mp\_utility::getpersstat( "deaths" ); + var_23 maps\mp\_utility::updatepersratio( "kdRatio", "kills", "deaths" ); + var_23 maps\mp\gametypes\_persistence::statsetchild( "round", "deaths", var_23.deaths ); + var_23 maps\mp\_utility::incplayerstat( "deaths", 1 ); + } + + if ( !maps\mp\_utility::practiceroundgame() ) + obituary( var_2, var_1, var_5, var_4 ); + + var_24 = 0; + var_2 logprintplayerdeath( self.lifeid, var_1, var_3, var_4, var_5, var_13, var_7 ); + var_2 maps\mp\_matchdata::logplayerlife( 1 ); + var_2 maps\mp\_matchdata::logplayerdeath( self.lifeid, var_1, var_3, var_4, var_5, var_13, var_7, var_21 ); + + if ( maps\mp\_utility::ismeleemod( var_4 ) && isplayer( var_1 ) && !issubstr( var_5, "riotshield" ) ) + var_1 maps\mp\_utility::incplayerstat( "knifekills", 1 ); + + if ( var_2 isswitchingteams() ) + handleteamchangedeath(); + else if ( !isplayer( var_1 ) || isplayer( var_1 ) && var_4 == "MOD_FALLING" ) + { + handleworlddeath( var_1, self.lifeid, var_4, var_7 ); + + if ( isagent( var_1 ) ) + var_24 = 1; + + if ( maps\mp\gametypes\_killcam::isworldkillcam( var_0, var_1 ) ) + var_24 = 1; + } + else if ( var_1 == var_2 && ( isdefined( var_0 ) && ( !isdefined( var_0.isorbitalcam ) || var_0.isorbitalcam == 0 ) ) ) + handlesuicidedeath( var_4, var_7 ); + else if ( var_18 ) + { + if ( !isdefined( var_2.nuked ) && ( !isdefined( level.iszombiegame ) || !level.iszombiegame ) ) + handlefriendlyfiredeath( var_1 ); + } + else + { + if ( var_4 == "MOD_GRENADE" && var_0 == var_1 || var_4 == "MOD_IMPACT" || var_4 == "MOD_GRENADE_SPLASH" || var_4 == "MOD_EXPLOSIVE" ) + addattacker( var_2, var_1, var_0, var_5, var_3, ( 0, 0, 0 ), var_6, var_7, var_8, var_4 ); + + var_24 = 1; + + if ( isai( var_2 ) && isdefined( level.bot_funcs ) && isdefined( level.bot_funcs["should_do_killcam"] ) ) + var_24 = var_2 [[ level.bot_funcs["should_do_killcam"] ]](); + + if ( isdefined( var_0 ) && ( !isdefined( var_0.isorbitalcam ) || var_0.isorbitalcam == 0 ) ) + { + handlenormaldeath( self.lifeid, var_1, var_0, var_5, var_4 ); + var_2 thread maps\mp\gametypes\_missions::playerkilled( var_0, var_1, var_3, var_4, var_5, var_13, var_7, var_1.modifiers ); + } + + var_2.pers["cur_death_streak"]++; + + if ( isplayer( var_1 ) && var_2 maps\mp\_utility::isjuggernaut() ) + var_1 thread maps\mp\_utility::teamplayercardsplash( "callout_killed_juggernaut", var_1 ); + } + + var_25 = 0; + var_26 = undefined; + + if ( isdefined( self.previousprimary ) ) + { + var_25 = 1; + var_26 = self.previousprimary; + self.previousprimary = undefined; + } + + if ( isplayer( var_1 ) && var_1 != self && ( !level.teambased || level.teambased && self.team != var_1.team ) ) + { + if ( var_25 && isdefined( var_26 ) ) + var_27 = var_26; + else + var_27 = self.lastdroppableweapon; + + thread maps\mp\gametypes\_gamelogic::trackleaderboarddeathstats( var_27, var_4 ); + var_1 thread maps\mp\gametypes\_gamelogic::trackattackerleaderboarddeathstats( var_5, var_4, var_0 ); + } + + var_2.wasswitchingteamsforonplayerkilled = undefined; + + if ( isdefined( var_2.switching_teams ) ) + var_2.wasswitchingteamsforonplayerkilled = 1; + + var_2 resetplayervariables(); + var_2.lastattacker = var_1; + var_2.lastinflictor = var_0; + + if ( !isdefined( var_2.agentbody ) ) + var_2.lastdeathpos = var_2.origin; + else + var_2.lastdeathpos = var_2.agentbody.origin; + + var_2.deathtime = gettime(); + var_2.wantsafespawn = 0; + var_2.revived = 0; + var_2.sameshotdamage = 0; + var_2 maps\mp\killstreaks\_killstreaks::resetadrenaline( 0 ); + var_28 = maps\mp\_awards::gettotalscore( var_2 ) - var_2.scoreatlifestart; + var_2 maps\mp\_utility::setplayerstatifgreater( "mostScorePerLife", var_28 ); + var_29 = undefined; + + if ( maps\mp\_utility::isrocketcorpse() ) + { + var_24 = 1; + var_10 = 0; + var_29 = self.killcament; + self waittill( "final_rocket_corpse_death" ); + } + else + { + if ( var_10 ) + { + var_24 = 0; + + if ( !isdefined( var_2.agentbody ) ) + var_9 = var_2 playerforcedeathanim( var_0, var_4, var_5, var_7, var_6 ); + } + + if ( isdefined( var_2.hideondeath ) && var_2.hideondeath ) + { + var_2 playerhide(); + thread maps\mp\gametypes\_deathicons::adddeathicon( var_2, var_2, var_2.team, 5.0, var_1 ); + } + else if ( !isdefined( var_2.agentbody ) ) + { + var_2.body = var_2 cloneplayer( var_9 ); + + if ( var_10 ) + var_2 playerhide(); + + if ( var_2 isonladder() || var_2 ismantling() || !var_2 isonground() || isdefined( var_2.nuked ) ) + var_2.body startragdoll(); + + if ( !isdefined( var_2.switching_teams ) ) + thread maps\mp\gametypes\_deathicons::adddeathicon( var_2.body, var_2, var_2.team, 5.0, var_1 ); + + thread delaystartragdoll( var_2.body, var_7, var_6, var_5, var_0, var_4 ); + } + else if ( !isdefined( var_2.switching_teams ) ) + thread maps\mp\gametypes\_deathicons::adddeathicon( var_2.agentbody, var_2, var_2.team, 5.0, var_1 ); + } + + var_2 thread [[ level.onplayerkilled ]]( var_0, var_1, var_3, var_4, var_5, var_6, var_7, var_8, var_9, self.lifeid ); + + if ( isai( var_2 ) && isdefined( level.bot_funcs ) && isdefined( level.bot_funcs["on_killed"] ) ) + var_2 thread [[ level.bot_funcs["on_killed"] ]]( var_0, var_1, var_3, var_4, var_5, var_6, var_7, var_8, var_9, self.lifeid ); + + if ( maps\mp\_utility::isgameparticipant( var_1 ) ) + var_30 = var_1 getentitynumber(); + else + var_30 = -1; + + if ( isdefined( level.iszombiegame ) && level.iszombiegame ) + var_30 = -1; + + if ( !isdefined( var_29 ) && isdefined( var_1 ) ) + var_29 = var_2 getkillcamentity( var_1, var_0, var_5 ); + + var_31 = -1; + var_32 = 0; + var_33 = 0; + + if ( isdefined( var_29 ) ) + { + var_31 = var_29 getentitynumber(); + var_32 = var_29.birthtime; + + if ( isdefined( var_29.killcamstarttime ) ) + { + var_32 = var_29.killcamstarttime; + var_33 = 1; + } + + if ( !isdefined( var_32 ) ) + var_32 = 0; + } + else if ( var_5 == "orbital_laser_fov_mp" && isdefined( var_0 ) && isdefined( var_0.killcamstarttime ) ) + { + var_32 = var_0.killcamstarttime; + var_33 = 1; + } + + if ( isdefined( var_1 ) && isdefined( var_1.lastspawntime ) ) + var_34 = ( gettime() - var_1.lastspawntime ) / 1000.0; + else + var_34 = 0; + + if ( var_4 != "MOD_SUICIDE" && !( !isdefined( var_1 ) || var_1.classname == "trigger_hurt" || var_1.classname == "worldspawn" || var_1 == var_2 ) ) + recordfinalkillcam( 5.0, var_2, var_1, var_30, var_31, var_32, var_5, var_12, var_8, var_4, "normal", var_33 ); + + if ( maps\mp\gametypes\_killcam::killcamvalid( var_2, var_24 ) ) + { + var_35 = maps\mp\gametypes\_playerlogic::timeuntilspawn( 1 ); + var_36 = maps\mp\gametypes\_gamelogic::timeuntilroundend(); + var_37 = maps\mp\gametypes\_killcam::killcamtime( var_32, var_5, 0, var_35, var_36, var_33, 0 ); + var_38 = maps\mp\gametypes\_killcam::killcamarchivetime( var_37, var_34, var_12, var_8 / 1000 ); + var_2 maps\mp\gametypes\_killcam::prekillcamnotify( var_0, var_1, var_38, var_21 ); + } + else if ( maps\mp\_utility::isvalidclass( var_2.class ) ) + var_2 maps\mp\gametypes\_playerlogic::streamclassweapons(); + + var_39 = gettime() + 5000; + + if ( !var_10 ) + { + wait 0.25; + var_2 thread maps\mp\gametypes\_killcam::cancelkillcamonuse(); + wait 0.25; + self.respawntimerstarttime = gettime() + 1000; + var_35 = maps\mp\gametypes\_playerlogic::timeuntilspawn( 1 ); + + if ( var_35 < 1 ) + var_35 = 1; + + wait 1.0; + + if ( isdefined( self.streamweapons ) && self.streamweapons.size > 0 ) + { + while ( maps\mp\gametypes\_killcam::killcamvalid( var_2, var_24 ) && isplayer( self ) && isplayer( var_1 ) && !self hasloadedcustomizationplayerview( var_1, self.streamweapons ) && gettime() < var_39 ) + waitframe(); + } + + var_2 notify( "death_delay_finished" ); + } + + var_40 = ( gettime() - var_2.deathtime ) / 1000; + self.respawntimerstarttime = gettime(); + var_41 = gettime() >= var_39; + + if ( maps\mp\gametypes\_killcam::killcamvalid( var_2, var_24 ) && !var_41 ) + { + var_42 = !( maps\mp\_utility::getgametypenumlives() && !var_2.pers["lives"] ); + var_35 = maps\mp\gametypes\_playerlogic::timeuntilspawn( 1 ); + var_43 = var_42 && var_35 <= 0; + + if ( !var_42 ) + { + var_35 = -1; + level notify( "player_eliminated", var_2 ); + } + + var_2 maps\mp\gametypes\_killcam::killcam( var_0, var_30, var_31, var_32, var_5, var_40 + var_12, var_8, var_35, maps\mp\gametypes\_gamelogic::timeuntilroundend(), var_1, var_2, var_4, "normal", var_34, var_33 ); + } + + if ( game["state"] != "playing" ) + { + if ( !level.showingfinalkillcam ) + { + var_2 maps\mp\_utility::updatesessionstate( "dead" ); + var_2 maps\mp\_utility::clearkillcamstate(); + } + + return; + } + + var_44 = maps\mp\_utility::getgametypenumlives(); + var_45 = self.pers["lives"]; + + if ( self == var_2 && isdefined( var_2.battlebuddy ) && maps\mp\_utility::isreallyalive( var_2.battlebuddy ) && ( !maps\mp\_utility::getgametypenumlives() || self.pers["lives"] ) && !var_2 maps\mp\_utility::isusingremote() ) + maps\mp\gametypes\_battlebuddy::waitforplayerrespawnchoice(); + + if ( maps\mp\_utility::isvalidclass( var_2.class ) ) + var_2 thread maps\mp\gametypes\_playerlogic::spawnclient(); +} + +waittimerforspawn() +{ + self endon( "randomSpawnPressed" ); + self.kc_teamspawntext settext( &"PLATFORM_PRESS_TO_TEAMSPAWN" ); + self.kc_teamspawntext.alpha = 1; + self.kc_randomspawntext settext( &"PLATFORM_PRESS_TO_RESPAWN" ); + self.kc_randomspawntext.alpha = 1; + thread waitteamspawnbutton(); + thread waitspawnrandombutton(); + + if ( isdefined( self.skippedkillcam ) && self.skippedkillcam ) + var_0 = 8; + else + var_0 = 9; + + if ( isdefined( self.timestartedtowait ) ) + var_1 = int( ceil( var_0 - ( gettime() - self.timestartedtowait ) / 1000 ) ); + else + var_1 = var_0; + + self.partnerspawning = 0; + wait 0.5; + + for ( var_2 = var_1; var_2 > 0; var_2-- ) + { + maps\mp\_utility::setlowermessage( "kc_info", &"MP_TIME_TILL_SPAWN", var_1, 1, 1 ); + wait 1; + } + + self.kc_randomspawntext.alpha = 0; + self.kc_teamspawntext.alpha = 0; + maps\mp\_utility::clearlowermessage( "kc_info" ); + self notify( "abort_fireteam_spawn" ); +} + +waitspawnrandombutton() +{ + self endon( "disconnect" ); + self endon( "abort_fireteam_spawn" ); + + while ( self usebuttonpressed() ) + wait 0.05; + + while ( !self usebuttonpressed() ) + { + wait 0.05; + + if ( !maps\mp\_utility::isreallyalive( self.partner ) ) + break; + } + + self.partnerspawning = 0; + self notify( "randomSpawnPressed" ); + self.kc_randomspawntext.alpha = 0; + self.kc_teamspawntext.alpha = 0; + maps\mp\_utility::clearlowermessage( "kc_info" ); + self notify( "abort_fireteam_spawn" ); +} + +waitteamspawnbutton() +{ + self endon( "disconnect" ); + self endon( "abort_fireteam_spawn" ); + + while ( self attackbuttonpressed() ) + wait 0.05; + + while ( !self attackbuttonpressed() ) + wait 0.05; + + self.partnerspawning = 1; + self playlocalsound( "copycat_steal_class" ); + self notify( "teamSpawnPressed" ); + self.kc_randomspawntext.alpha = 0; + self.kc_teamspawntext.alpha = 0; +} + +checkforcebleedout() +{ + if ( level.diehardmode != 1 ) + return 0; + + if ( !maps\mp\_utility::getgametypenumlives() ) + return 0; + + if ( level.livescount[self.team] > 0 ) + return 0; + + foreach ( var_1 in level.players ) + { + if ( !isalive( var_1 ) ) + continue; + + if ( var_1.team != self.team ) + continue; + + if ( var_1 == self ) + continue; + + if ( !var_1.inlaststand ) + return 0; + } + + foreach ( var_1 in level.players ) + { + if ( !isalive( var_1 ) ) + continue; + + if ( var_1.team != self.team ) + continue; + + if ( var_1.inlaststand && var_1 != self ) + var_1 laststandbleedout( 0 ); + } + + return 1; +} + +initfinalkillcam() +{ + level.finalkillcam_delay = []; + level.finalkillcam_victim = []; + level.finalkillcam_attacker = []; + level.finalkillcam_attackernum = []; + level.finalkillcam_killcamentityindex = []; + level.finalkillcam_killcamentitystarttime = []; + level.finalkillcam_sweapon = []; + level.finalkillcam_deathtimeoffset = []; + level.finalkillcam_psoffsettime = []; + level.finalkillcam_timerecorded = []; + level.finalkillcam_timegameended = []; + level.finalkillcam_smeansofdeath = []; + level.finalkillcam_type = []; + level.finalkillcam_usestarttime = []; + + if ( level.multiteambased ) + { + foreach ( var_1 in level.teamnamelist ) + { + level.finalkillcam_delay[var_1] = undefined; + level.finalkillcam_victim[var_1] = undefined; + level.finalkillcam_attacker[var_1] = undefined; + level.finalkillcam_attackernum[var_1] = undefined; + level.finalkillcam_killcamentityindex[var_1] = undefined; + level.finalkillcam_killcamentitystarttime[var_1] = undefined; + level.finalkillcam_sweapon[var_1] = undefined; + level.finalkillcam_deathtimeoffset[var_1] = undefined; + level.finalkillcam_psoffsettime[var_1] = undefined; + level.finalkillcam_timerecorded[var_1] = undefined; + level.finalkillcam_timegameended[var_1] = undefined; + level.finalkillcam_smeansofdeath[var_1] = undefined; + level.finalkillcam_type[var_1] = undefined; + level.finalkillcam_usestarttime[var_1] = undefined; + } + } + else + { + level.finalkillcam_delay["axis"] = undefined; + level.finalkillcam_victim["axis"] = undefined; + level.finalkillcam_attacker["axis"] = undefined; + level.finalkillcam_attackernum["axis"] = undefined; + level.finalkillcam_killcamentityindex["axis"] = undefined; + level.finalkillcam_killcamentitystarttime["axis"] = undefined; + level.finalkillcam_sweapon["axis"] = undefined; + level.finalkillcam_deathtimeoffset["axis"] = undefined; + level.finalkillcam_psoffsettime["axis"] = undefined; + level.finalkillcam_timerecorded["axis"] = undefined; + level.finalkillcam_timegameended["axis"] = undefined; + level.finalkillcam_smeansofdeath["axis"] = undefined; + level.finalkillcam_type["axis"] = undefined; + level.finalkillcam_usestarttime["axis"] = undefined; + level.finalkillcam_delay["allies"] = undefined; + level.finalkillcam_victim["allies"] = undefined; + level.finalkillcam_attacker["allies"] = undefined; + level.finalkillcam_attackernum["allies"] = undefined; + level.finalkillcam_killcamentityindex["allies"] = undefined; + level.finalkillcam_killcamentitystarttime["allies"] = undefined; + level.finalkillcam_sweapon["allies"] = undefined; + level.finalkillcam_deathtimeoffset["allies"] = undefined; + level.finalkillcam_psoffsettime["allies"] = undefined; + level.finalkillcam_timerecorded["allies"] = undefined; + level.finalkillcam_timegameended["allies"] = undefined; + level.finalkillcam_smeansofdeath["allies"] = undefined; + level.finalkillcam_type["allies"] = undefined; + level.finalkillcam_usestarttime["allies"] = undefined; + } + + level.finalkillcam_delay["none"] = undefined; + level.finalkillcam_victim["none"] = undefined; + level.finalkillcam_attacker["none"] = undefined; + level.finalkillcam_attackernum["none"] = undefined; + level.finalkillcam_killcamentityindex["none"] = undefined; + level.finalkillcam_killcamentitystarttime["none"] = undefined; + level.finalkillcam_sweapon["none"] = undefined; + level.finalkillcam_deathtimeoffset["none"] = undefined; + level.finalkillcam_psoffsettime["none"] = undefined; + level.finalkillcam_timerecorded["none"] = undefined; + level.finalkillcam_timegameended["none"] = undefined; + level.finalkillcam_smeansofdeath["none"] = undefined; + level.finalkillcam_type["none"] = undefined; + level.finalkillcam_usestarttime["none"] = undefined; + level.finalkillcam_winner = undefined; +} + +recordfinalkillcam( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 ) +{ + if ( level.teambased && isdefined( var_2.team ) ) + { + level.finalkillcam_delay[var_2.team] = var_0; + level.finalkillcam_victim[var_2.team] = var_1; + level.finalkillcam_attacker[var_2.team] = var_2; + level.finalkillcam_attackernum[var_2.team] = var_3; + level.finalkillcam_killcamentityindex[var_2.team] = var_4; + level.finalkillcam_killcamentitystarttime[var_2.team] = var_5; + level.finalkillcam_sweapon[var_2.team] = var_6; + level.finalkillcam_deathtimeoffset[var_2.team] = var_7; + level.finalkillcam_psoffsettime[var_2.team] = var_8; + level.finalkillcam_timerecorded[var_2.team] = maps\mp\_utility::getsecondspassed(); + level.finalkillcam_timegameended[var_2.team] = maps\mp\_utility::getsecondspassed(); + level.finalkillcam_smeansofdeath[var_2.team] = var_9; + level.finalkillcam_type[var_2.team] = var_10; + level.finalkillcam_usestarttime[var_2.team] = isdefined( var_11 ) && var_11; + } + + level.finalkillcam_delay["none"] = var_0; + level.finalkillcam_victim["none"] = var_1; + level.finalkillcam_attacker["none"] = var_2; + level.finalkillcam_attackernum["none"] = var_3; + level.finalkillcam_killcamentityindex["none"] = var_4; + level.finalkillcam_killcamentitystarttime["none"] = var_5; + level.finalkillcam_sweapon["none"] = var_6; + level.finalkillcam_deathtimeoffset["none"] = var_7; + level.finalkillcam_psoffsettime["none"] = var_8; + level.finalkillcam_timerecorded["none"] = maps\mp\_utility::getsecondspassed(); + level.finalkillcam_timegameended["none"] = maps\mp\_utility::getsecondspassed(); + level.finalkillcam_timegameended["none"] = maps\mp\_utility::getsecondspassed(); + level.finalkillcam_smeansofdeath["none"] = var_9; + level.finalkillcam_type["none"] = var_10; + level.finalkillcam_usestarttime["none"] = isdefined( var_11 ) && var_11; +} + +erasefinalkillcam() +{ + if ( level.multiteambased ) + { + for ( var_0 = 0; var_0 < level.teamnamelist.size; var_0++ ) + { + level.finalkillcam_delay[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_victim[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_attacker[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_attackernum[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_killcamentityindex[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_killcamentitystarttime[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_sweapon[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_deathtimeoffset[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_psoffsettime[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_timerecorded[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_timegameended[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_smeansofdeath[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_type[level.teamnamelist[var_0]] = undefined; + level.finalkillcam_usestarttime[level.teamnamelist[var_0]] = undefined; + } + } + else + { + level.finalkillcam_delay["axis"] = undefined; + level.finalkillcam_victim["axis"] = undefined; + level.finalkillcam_attacker["axis"] = undefined; + level.finalkillcam_attackernum["axis"] = undefined; + level.finalkillcam_killcamentityindex["axis"] = undefined; + level.finalkillcam_killcamentitystarttime["axis"] = undefined; + level.finalkillcam_sweapon["axis"] = undefined; + level.finalkillcam_deathtimeoffset["axis"] = undefined; + level.finalkillcam_psoffsettime["axis"] = undefined; + level.finalkillcam_timerecorded["axis"] = undefined; + level.finalkillcam_timegameended["axis"] = undefined; + level.finalkillcam_smeansofdeath["axis"] = undefined; + level.finalkillcam_type["axis"] = undefined; + level.finalkillcam_usestarttime["axis"] = undefined; + level.finalkillcam_delay["allies"] = undefined; + level.finalkillcam_victim["allies"] = undefined; + level.finalkillcam_attacker["allies"] = undefined; + level.finalkillcam_attackernum["allies"] = undefined; + level.finalkillcam_killcamentityindex["allies"] = undefined; + level.finalkillcam_killcamentitystarttime["allies"] = undefined; + level.finalkillcam_sweapon["allies"] = undefined; + level.finalkillcam_deathtimeoffset["allies"] = undefined; + level.finalkillcam_psoffsettime["allies"] = undefined; + level.finalkillcam_timerecorded["allies"] = undefined; + level.finalkillcam_timegameended["allies"] = undefined; + level.finalkillcam_smeansofdeath["allies"] = undefined; + level.finalkillcam_type["allies"] = undefined; + level.finalkillcam_usestarttime["allies"] = undefined; + } + + level.finalkillcam_delay["none"] = undefined; + level.finalkillcam_victim["none"] = undefined; + level.finalkillcam_attacker["none"] = undefined; + level.finalkillcam_attackernum["none"] = undefined; + level.finalkillcam_killcamentityindex["none"] = undefined; + level.finalkillcam_killcamentitystarttime["none"] = undefined; + level.finalkillcam_sweapon["none"] = undefined; + level.finalkillcam_deathtimeoffset["none"] = undefined; + level.finalkillcam_psoffsettime["none"] = undefined; + level.finalkillcam_timerecorded["none"] = undefined; + level.finalkillcam_timegameended["none"] = undefined; + level.finalkillcam_smeansofdeath["none"] = undefined; + level.finalkillcam_type["none"] = undefined; + level.finalkillcam_usestarttime["none"] = undefined; + level.finalkillcam_winner = undefined; +} + +streamfinalkillcam() +{ + if ( isai( self ) ) + return; + + var_0 = "none"; + + if ( isdefined( level.finalkillcam_winner ) ) + var_0 = level.finalkillcam_winner; + + var_1 = level.finalkillcam_victim[var_0]; + var_2 = level.finalkillcam_attacker[var_0]; + var_3 = level.finalkillcam_timegameended[var_0]; + var_4 = level.finalkillcam_timerecorded[var_0]; + + if ( !finalkillcamvalid( var_1, var_2, var_3, var_4 ) ) + return; + + var_5 = level.finalkillcam_killcamentitystarttime[var_0]; + var_6 = level.finalkillcam_sweapon[var_0]; + var_7 = level.finalkillcam_usestarttime[var_0]; + var_8 = level.finalkillcam_psoffsettime[var_0]; + var_9 = level.finalkillcam_deathtimeoffset[var_0]; + var_10 = ( gettime() - var_1.deathtime ) / 1000; + var_11 = var_10 + var_9; + var_12 = maps\mp\gametypes\_killcam::killcamtime( var_5, var_6, var_11, 0, getkillcambuffertime(), var_7, 1 ); + var_13 = var_12 + var_11 + var_8 / 1000; + self onlystreamactiveweapon( 1 ); + thread maps\mp\gametypes\_killcam::prekillcamnotify( level.finalkillcam_attacker[var_0], level.finalkillcam_attacker[var_0], var_13, "none" ); +} + +streamcheck( var_0 ) +{ + level endon( "stream_end" ); + + foreach ( var_2 in level.players ) + { + if ( isai( var_2 ) ) + continue; + + if ( isdefined( var_2.streamweapons ) && var_2.streamweapons.size > 0 ) + { + while ( isplayer( var_2 ) && isplayer( var_0 ) && !var_2 hasloadedcustomizationplayerview( var_0, var_2.streamweapons[0] ) ) + waitframe(); + } + } + + level notify( "stream_end" ); +} + +resetonlystreamactive() +{ + foreach ( var_1 in level.players ) + { + if ( !isai( var_1 ) ) + var_1 onlystreamactiveweapon( 0 ); + } +} + +streamtimeout( var_0 ) +{ + level endon( "stream_end" ); + wait(var_0); + level notify( "stream_end" ); +} + +waitforstream( var_0 ) +{ + thread streamtimeout( 5.0 ); + streamcheck( var_0 ); +} + +getkillcambuffertime() +{ + return 15; +} + +finalkillcamvalid( var_0, var_1, var_2, var_3 ) +{ + var_4 = isdefined( var_0 ) && isdefined( var_1 ) && !maps\mp\_utility::practiceroundgame(); + + if ( var_4 ) + { + var_5 = getkillcambuffertime(); + var_6 = var_2 - var_3; + + if ( var_6 <= var_5 ) + return 1; + } + + return 0; +} + +endfinalkillcam() +{ + resetonlystreamactive(); + level.showingfinalkillcam = 0; + level notify( "final_killcam_done" ); +} + +dofinalkillcam() +{ + level waittill( "round_end_finished" ); + level.showingfinalkillcam = 1; + var_0 = "none"; + + if ( isdefined( level.finalkillcam_winner ) ) + var_0 = level.finalkillcam_winner; + + var_1 = level.finalkillcam_delay[var_0]; + var_2 = level.finalkillcam_victim[var_0]; + var_3 = level.finalkillcam_attacker[var_0]; + var_4 = level.finalkillcam_attackernum[var_0]; + var_5 = level.finalkillcam_killcamentityindex[var_0]; + var_6 = level.finalkillcam_killcamentitystarttime[var_0]; + var_7 = level.finalkillcam_usestarttime[var_0]; + var_8 = level.finalkillcam_sweapon[var_0]; + var_9 = level.finalkillcam_deathtimeoffset[var_0]; + var_10 = level.finalkillcam_psoffsettime[var_0]; + var_11 = level.finalkillcam_timerecorded[var_0]; + var_12 = level.finalkillcam_timegameended[var_0]; + var_13 = level.finalkillcam_smeansofdeath[var_0]; + var_14 = level.finalkillcam_type[var_0]; + + if ( !finalkillcamvalid( var_2, var_3, var_12, var_11 ) ) + { + endfinalkillcam(); + return; + } + + if ( isdefined( var_3 ) ) + { + var_3.finalkill = 1; + + if ( level.gametype == "conf" && isdefined( level.finalkillcam_attacker[var_3.team] ) && level.finalkillcam_attacker[var_3.team] == var_3 ) + { + var_3 maps\mp\gametypes\_missions::processchallenge( "ch_theedge" ); + + if ( isdefined( var_3.modifiers["revenge"] ) ) + var_3 maps\mp\gametypes\_missions::processchallenge( "ch_moneyshot" ); + + if ( isdefined( var_3.infinalstand ) && var_3.infinalstand ) + var_3 maps\mp\gametypes\_missions::processchallenge( "ch_lastresort" ); + + if ( isdefined( var_2 ) && isdefined( var_2.explosiveinfo ) && isdefined( var_2.explosiveinfo["stickKill"] ) && var_2.explosiveinfo["stickKill"] ) + var_3 maps\mp\gametypes\_missions::processchallenge( "ch_stickman" ); + + if ( isdefined( var_2.attackerdata[var_3.guid] ) && isdefined( var_2.attackerdata[var_3.guid].smeansofdeath ) && isdefined( var_2.attackerdata[var_3.guid].weapon ) && issubstr( var_2.attackerdata[var_3.guid].smeansofdeath, "MOD_MELEE" ) && issubstr( var_2.attackerdata[var_3.guid].weapon, "riotshield_mp" ) ) + var_3 maps\mp\gametypes\_missions::processchallenge( "ch_owned" ); + + switch ( level.finalkillcam_sweapon[var_3.team] ) + { + case "artillery_mp": + var_3 maps\mp\gametypes\_missions::processchallenge( "ch_finishingtouch" ); + break; + case "stealth_bomb_mp": + var_3 maps\mp\gametypes\_missions::processchallenge( "ch_technokiller" ); + break; + case "sentry_minigun_mp": + var_3 maps\mp\gametypes\_missions::processchallenge( "ch_absentee" ); + break; + case "ac130_40mm_mp": + case "ac130_105mm_mp": + case "ac130_25mm_mp": + var_3 maps\mp\gametypes\_missions::processchallenge( "ch_deathfromabove" ); + break; + case "remotemissile_projectile_mp": + var_3 maps\mp\gametypes\_missions::processchallenge( "ch_dronekiller" ); + break; + default: + break; + } + } + } + + waitforstream( var_3 ); + var_15 = ( gettime() - var_2.deathtime ) / 1000; + + foreach ( var_17 in level.players ) + { + var_17 maps\mp\_utility::revertvisionsetforplayer( 0 ); + var_17 setblurforplayer( 0, 0 ); + var_17.killcamentitylookat = var_2 getentitynumber(); + + if ( isdefined( var_3 ) && isdefined( var_3.lastspawntime ) ) + var_18 = ( gettime() - var_3.lastspawntime ) / 1000.0; + else + var_18 = 0; + + var_17 thread maps\mp\gametypes\_killcam::killcam( var_3, var_4, var_5, var_6, var_8, var_15 + var_9, var_10, 0, getkillcambuffertime(), var_3, var_2, var_13, var_14, var_18, var_7 ); + } + + wait 0.1; + + while ( anyplayersinkillcam() ) + wait 0.05; + + endfinalkillcam(); +} + +anyplayersinkillcam() +{ + foreach ( var_1 in level.players ) + { + if ( isdefined( var_1.killcam ) ) + return 1; + } + + return 0; +} + +resetplayervariables() +{ + self.killedplayerscurrent = []; + self.switching_teams = undefined; + self.joining_team = undefined; + self.leaving_team = undefined; + self.pers["cur_kill_streak"] = 0; + self.pers["cur_kill_streak_for_nuke"] = 0; + self.killstreakcount = 0; + maps\mp\gametypes\_gameobjects::detachusemodels(); +} + +getkillcamentity( var_0, var_1, var_2 ) +{ + if ( isdefined( var_0.didturretexplosion ) && var_0.didturretexplosion && isdefined( var_0.turret ) ) + { + var_0.didturretexplosion = undefined; + return var_0.turret.killcament; + } + + switch ( var_2 ) + { + case "boost_slam_mp": + return var_1; + case "iw5_dlcgun12loot6_mp": + case "remotemissile_projectile_cluster_child_mp": + case "orbital_carepackage_pod_plane_mp": + case "refraction_turret_mp": + case "agent_mp": + case "stealth_bomb_mp": + case "artillery_mp": + case "orbital_carepackage_droppod_mp": + case "orbital_carepackage_pod_mp": + case "explosive_drone_mp": + case "bouncingbetty_mp": + case "bomb_site_mp": + return var_1.killcament; + case "killstreak_laser2_mp": + if ( isdefined( var_1.samturret ) && isdefined( var_1.samturret.killcament ) ) + return var_1.samturret.killcament; + + break; + case "ball_drone_projectile_mp": + case "ball_drone_gun_mp": + if ( isplayer( var_0 ) && isdefined( var_0.balldrone ) && isdefined( var_0.balldrone.turret ) && isdefined( var_0.balldrone.turret.killcament ) ) + return var_0.balldrone.turret.killcament; + + break; + case "drone_assault_remote_turret_mp": + case "ugv_missile_mp": + if ( isdefined( var_1.killcament ) ) + return var_1.killcament; + else + return undefined; + case "assaultdrone_c4_mp": + if ( isdefined( var_1.hasaioption ) && var_1.hasaioption ) + return var_1; + else + return undefined; + case "warbird_missile_mp": + case "dam_turret_mp": + case "killstreak_solar_mp": + if ( isdefined( var_1 ) && isdefined( var_1.killcament ) ) + return var_1.killcament; + + break; + case "warbird_remote_turret_mp": + if ( isdefined( var_1 ) && isdefined( var_1.killcament ) ) + return var_1.killcament; + else + return undefined; + case "orbital_laser_fov_mp": + return undefined; + case "killstreakmahem_mp": + case "remote_energy_turret_mp": + case "sentry_minigun_mp": + if ( isdefined( var_1 ) && isdefined( var_1.remotecontrolled ) ) + return undefined; + + break; + case "none": + if ( isdefined( var_1.targetname ) && var_1.targetname == "care_package" ) + return var_1.killcament; + + break; + case "killstreak_terrace_mp": + case "detroit_tram_turret_mp": + case "remote_turret_mp": + case "ugv_turret_mp": + case "ac130_40mm_mp": + case "ac130_105mm_mp": + case "ac130_25mm_mp": + return undefined; + case "iw5_dlcgun12loot8_mp": + if ( isdefined( var_1.killcament ) ) + return var_1.killcament; + else + return undefined; + } + + if ( maps\mp\_utility::isdestructibleweapon( var_2 ) || maps\mp\_utility::isbombsiteweapon( var_2 ) ) + { + if ( isdefined( var_1.killcament ) && !var_0 attackerinremotekillstreak() ) + return var_1.killcament; + else + return undefined; + } + + if ( maps\mp\gametypes\_killcam::isworldkillcam( var_1, var_0 ) ) + return var_0.killcament; + + if ( !isdefined( var_1 ) || var_0 == var_1 && !isagent( var_0 ) ) + return undefined; + + return var_1; +} + +attackerinremotekillstreak() +{ + if ( !isdefined( self ) ) + return 0; + + if ( isdefined( level.chopper ) && isdefined( level.chopper.gunner ) && self == level.chopper.gunner ) + return 1; + + if ( isdefined( self.using_remote_turret ) && self.using_remote_turret ) + return 1; + + if ( isdefined( self.using_remote_tank ) && self.using_remote_tank ) + return 1; + + return 0; +} + +hitlocdebug( var_0, var_1, var_2, var_3, var_4 ) +{ + var_5 = []; + var_5[0] = 2; + var_5[1] = 3; + var_5[2] = 5; + var_5[3] = 7; + + if ( !getdvarint( "scr_hitloc_debug" ) ) + return; + + if ( !isdefined( var_0.hitlocinited ) ) + { + for ( var_6 = 0; var_6 < 6; var_6++ ) + var_0 setclientdvar( "ui_hitloc_" + var_6, "" ); + + var_0.hitlocinited = 1; + } + + if ( level.splitscreen || !isplayer( var_0 ) ) + return; + + var_7 = 6; + + if ( !isdefined( var_0.damageinfo ) ) + { + var_0.damageinfo = []; + + for ( var_6 = 0; var_6 < var_7; var_6++ ) + { + var_0.damageinfo[var_6] = spawnstruct(); + var_0.damageinfo[var_6].damage = 0; + var_0.damageinfo[var_6].hitloc = ""; + var_0.damageinfo[var_6].bp = 0; + var_0.damageinfo[var_6].jugg = 0; + var_0.damageinfo[var_6].colorindex = 0; + } + + var_0.damageinfocolorindex = 0; + var_0.damageinfovictim = undefined; + } + + for ( var_6 = var_7 - 1; var_6 > 0; var_6-- ) + { + var_0.damageinfo[var_6].damage = var_0.damageinfo[var_6 - 1].damage; + var_0.damageinfo[var_6].hitloc = var_0.damageinfo[var_6 - 1].hitloc; + var_0.damageinfo[var_6].bp = var_0.damageinfo[var_6 - 1].bp; + var_0.damageinfo[var_6].jugg = var_0.damageinfo[var_6 - 1].jugg; + var_0.damageinfo[var_6].colorindex = var_0.damageinfo[var_6 - 1].colorindex; + } + + var_0.damageinfo[0].damage = var_2; + var_0.damageinfo[0].hitloc = var_3; + var_0.damageinfo[0].bp = var_4 & level.idflags_penetration; + var_0.damageinfo[0].jugg = var_1 maps\mp\_utility::isjuggernaut(); + + if ( isdefined( var_0.damageinfovictim ) && var_0.damageinfovictim != var_1 ) + { + var_0.damageinfocolorindex++; + + if ( var_0.damageinfocolorindex == var_5.size ) + var_0.damageinfocolorindex = 0; + } + + var_0.damageinfovictim = var_1; + var_0.damageinfo[0].colorindex = var_0.damageinfocolorindex; + + for ( var_6 = 0; var_6 < var_7; var_6++ ) + { + var_8 = "^" + var_5[var_0.damageinfo[var_6].colorindex]; + + if ( var_0.damageinfo[var_6].hitloc != "" ) + { + var_9 = var_8 + var_0.damageinfo[var_6].hitloc; + + if ( var_0.damageinfo[var_6].bp ) + var_9 += " (BP)"; + + if ( var_0.damageinfo[var_6].jugg ) + var_9 += " (Jugg)"; + + var_0 setclientdvar( "ui_hitloc_" + var_6, var_9 ); + } + + var_0 setclientdvar( "ui_hitloc_damage_" + var_6, var_8 + var_0.damageinfo[var_6].damage ); + } +} + +ishardwrireprotected( var_0 ) +{ + if ( !maps\mp\_utility::_hasperk( "specialty_stun_resistance" ) ) + return 0; + + switch ( var_0 ) + { + case "mp_lab_gas": + case "killstreak_strike_missile_gas_mp": + return 1; + } + + return 0; +} + +callback_playerdamage_internal( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ) +{ + if ( getdvarint( "virtuallobbyactive", 0 ) ) + return "virtuallobbyactive"; + + var_1 = maps\mp\_utility::_validateattacker( var_1 ); + var_11 = maps\mp\_utility::strip_suffix( var_6, "_lefthand" ); + + if ( isdefined( var_5 ) && var_5 == "MOD_CRUSH" && isdefined( var_0 ) && isdefined( var_0.classname ) && var_0.classname == "script_vehicle" ) + return "crushed"; + + if ( !maps\mp\_utility::isreallyalive( var_2 ) && !isdefined( var_2.inliveplayerkillstreak ) ) + return "!isReallyAlive( victim )"; + + if ( isdefined( var_1 ) && var_1.classname == "script_origin" && isdefined( var_1.type ) && var_1.type == "soft_landing" ) + return "soft_landing"; + + if ( var_6 == "killstreak_emp_mp" ) + return "sWeapon == killstreak_emp_mp"; + + if ( var_2 ishardwrireprotected( var_6 ) ) + return "specialty_stun_resistance"; + + if ( ( var_11 == "emp_grenade_mp" || var_11 == "emp_grenade_var_mp" || var_11 == "emp_grenade_killstreak_mp" ) && var_5 != "MOD_IMPACT" ) + var_2 notify( "emp_grenaded", var_1 ); + + if ( isdefined( level.hostmigrationtimer ) ) + return "level.hostMigrationTimer"; + + if ( var_5 == "MOD_FALLING" ) + var_2 thread emitfalldamage( var_3 ); + + if ( var_5 == "MOD_EXPLOSIVE_BULLET" && var_3 != 1 ) + { + var_3 *= getdvarfloat( "scr_explBulletMod" ); + var_3 = int( var_3 ); + } + + if ( isdefined( var_1 ) && var_1.classname == "worldspawn" ) + var_1 = undefined; + + if ( isdefined( var_1 ) && isdefined( var_1.gunner ) ) + var_1 = var_1.gunner; + + if ( isdefined( var_1 ) && var_1 == var_2 && var_6 == "killstreak_strike_missile_gas_mp" ) + return "gasCloudOwner"; + + if ( isdefined( var_1 ) && isplayer( var_1 ) && isexplosivedamagemod( var_5 ) && issubstr( var_6, "explosive_drone" ) && var_2 maps\mp\_utility::_hasperk( "_specialty_blastshield" ) && maps\mp\_utility::isreallyalive( var_2 ) ) + var_2.explosive_drone_owner = var_1; + + var_12 = maps\mp\_utility::attackerishittingteam( var_2, var_1 ); + var_13 = isdefined( var_1 ) && isdefined( var_0 ) && isdefined( var_2 ) && isplayer( var_1 ) && var_1 == var_0 && var_1 == var_2 && !isdefined( var_0.poison ); + + if ( var_13 ) + return "attackerIsInflictorVictim"; + + var_14 = 0.0; + + if ( var_4 & level.idflags_stun ) + { + var_14 = 0.0; + var_3 = 0.0; + } + else if ( var_9 == "shield" ) + { + if ( var_12 && level.friendlyfire == 0 ) + return "attackerIsHittingTeammate"; + + if ( var_5 == "MOD_PISTOL_BULLET" || var_5 == "MOD_RIFLE_BULLET" || var_5 == "MOD_EXPLOSIVE_BULLET" && !var_12 ) + { + if ( isplayer( var_1 ) ) + { + var_1.lastattackedshieldplayer = var_2; + var_1.lastattackedshieldtime = gettime(); + } + + if ( maps\mp\_utility::isenvironmentweapon( var_6 ) ) + var_16 = 25; + else + var_16 = maps\mp\perks\_perks::cac_modified_damage( var_2, var_1, var_3, var_5, var_6, var_7, var_8, var_9 ); + + var_2.shielddamage += var_16; + + if ( !maps\mp\_utility::isenvironmentweapon( var_6 ) || common_scripts\utility::cointoss() ) + { + var_2.shieldbullethits++; + + if ( isdefined( var_2.pers["bulletsBlockedByShield"] ) ) + var_2.pers["bulletsBlockedByShield"]++; + } + + if ( var_2.shieldbullethits >= level.riotshieldxpbullets ) + { + var_2.shielddamage = 0; + var_2.shieldbullethits = 0; + } + } + + if ( var_4 & level.idflags_shield_explosive_impact ) + { + var_9 = "none"; + + if ( !( var_4 & level.idflags_shield_explosive_impact_huge ) ) + var_3 *= 0.0; + } + else if ( var_4 & level.idflags_shield_explosive_splash ) + { + if ( isdefined( var_0 ) && isdefined( var_0.stuckenemyentity ) && var_0.stuckenemyentity == var_2 ) + var_3 = 51; + + var_9 = "none"; + } + else + return "hit shield"; + } + else if ( maps\mp\_utility::ismeleemod( var_5 ) && issubstr( var_6, "riotshield" ) ) + { + if ( !( var_12 && level.friendlyfire == 0 ) ) + { + var_14 = 0.0; + var_2 stunplayer( 0.0 ); + } + } + + if ( !var_12 ) + var_3 = maps\mp\perks\_perks::cac_modified_damage( var_2, var_1, var_3, var_5, var_6, var_7, var_8, var_9, var_0 ); + + if ( isdefined( level.modifyplayerdamage ) ) + var_3 = [[ level.modifyplayerdamage ]]( var_2, var_0, var_1, var_3, var_5, var_6, var_7, var_8, var_9 ); + + if ( var_2 maps\mp\_utility::isjuggernaut() && !isagent( var_2 ) ) + { + if ( isdefined( level.customjuggernautdamagefunc ) ) + var_3 = [[ level.customjuggernautdamagefunc ]]( var_2, var_1, var_3, var_5, var_6, var_7, var_8, var_9, var_0 ); + else + var_3 = maps\mp\killstreaks\_juggernaut::juggernautmodifydamage( var_2, var_1, var_3, var_5, var_6, var_7, var_8, var_9, var_0 ); + } + + var_17 = isdefined( var_1 ) && !isdefined( var_1.gunner ) && ( var_1.classname == "script_vehicle" || var_1.classname == "misc_turret" || var_1.classname == "script_model" ); + var_12 = maps\mp\_utility::attackerishittingteam( var_2, var_1 ); + + if ( !var_3 ) + return "!iDamage"; + + var_2.idflags = var_4; + var_2.idflagstime = gettime(); + + if ( game["state"] == "postgame" ) + return "game[ state ] == postgame"; + + if ( var_2.sessionteam == "spectator" ) + return "victim.sessionteam == spectator"; + + if ( isdefined( var_2.candocombat ) && !var_2.candocombat ) + return "!victim.canDoCombat"; + + if ( isdefined( var_1 ) && isplayer( var_1 ) && isdefined( var_1.candocombat ) && !var_1.candocombat ) + return "!eAttacker.canDoCombat"; + + if ( isdefined( var_1 ) && isalive( var_1 ) && !isdefined( var_1.perkoutlined ) ) + var_1.perkoutlined = 0; + + if ( var_17 && var_12 ) + { + if ( var_5 == "MOD_CRUSH" ) + { + var_2 maps\mp\_utility::_suicide(); + return "suicide crush"; + } + + if ( !level.friendlyfire ) + return "!level.friendlyfire"; + } + + if ( isai( self ) ) + self [[ level.bot_funcs["on_damaged"] ]]( var_1, var_3, var_5, var_6, var_0, var_9 ); + + if ( !isdefined( var_8 ) ) + var_4 |= level.idflags_no_knockback; + + var_18 = 0; + + if ( var_2.health == var_2.maxhealth && ( !isdefined( var_2.laststand ) || !var_2.laststand ) || !isdefined( var_2.attackers ) && !isdefined( var_2.laststand ) ) + { + var_2.attackers = []; + var_2.attackerdata = []; + } + + if ( maps\mp\_utility::isheadshot( var_6, var_9, var_5, var_1 ) ) + var_5 = "MOD_HEAD_SHOT"; + + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "onlyheadshots" ) ) + { + if ( var_5 == "MOD_PISTOL_BULLET" || var_5 == "MOD_RIFLE_BULLET" || var_5 == "MOD_EXPLOSIVE_BULLET" ) + return "getTweakableValue( game, onlyheadshots )"; + else if ( var_5 == "MOD_HEAD_SHOT" ) + { + if ( var_2 maps\mp\_utility::isjuggernaut() ) + var_3 = 75; + else + var_3 = 150; + } + } + + if ( var_6 == "none" && isdefined( var_0 ) ) + { + if ( isdefined( var_0.destructible_type ) && issubstr( var_0.destructible_type, "vehicle_" ) ) + var_6 = "destructible_car"; + } + + if ( gettime() < var_2.spawntime + level.killstreakspawnshield ) + { + var_19 = int( max( var_2.health / 4, 1 ) ); + + if ( var_3 >= var_19 && maps\mp\_utility::iskillstreakweapon( var_6 ) && !maps\mp\_utility::ismeleemod( var_5 ) ) + var_3 = var_19; + } + + if ( !( var_4 & level.idflags_no_protection ) ) + { + if ( !level.teambased && var_17 && isdefined( var_1.owner ) && var_1.owner == var_2 ) + { + if ( var_5 == "MOD_CRUSH" ) + var_2 maps\mp\_utility::_suicide(); + + return "ffa suicide"; + } + + if ( ( issubstr( var_5, "MOD_GRENADE" ) || issubstr( var_5, "MOD_EXPLOSIVE" ) || issubstr( var_5, "MOD_PROJECTILE" ) ) && isdefined( var_0 ) && isdefined( var_1 ) ) + { + if ( var_2 != var_1 && var_0.classname == "grenade" && var_2.lastspawntime + 3500 > gettime() && isdefined( var_2.lastspawnpoint ) && distance( var_0.origin, var_2.lastspawnpoint.origin ) < 250 ) + return "spawnkill grenade protection"; + + var_2.explosiveinfo = []; + var_2.explosiveinfo["damageTime"] = gettime(); + var_2.explosiveinfo["damageId"] = var_0 getentitynumber(); + var_2.explosiveinfo["returnToSender"] = 0; + var_2.explosiveinfo["counterKill"] = 0; + var_2.explosiveinfo["chainKill"] = 0; + var_2.explosiveinfo["cookedKill"] = 0; + var_2.explosiveinfo["throwbackKill"] = 0; + var_2.explosiveinfo["suicideGrenadeKill"] = 0; + var_2.explosiveinfo["weapon"] = var_6; + var_20 = issubstr( var_6, "frag_" ); + + if ( var_1 != var_2 ) + { + if ( ( issubstr( var_6, "c4_" ) || issubstr( var_6, "claymore_" ) ) && isdefined( var_1 ) && isdefined( var_0.owner ) ) + { + var_2.explosiveinfo["returnToSender"] = var_0.owner == var_2; + var_2.explosiveinfo["counterKill"] = isdefined( var_0.wasdamaged ); + var_2.explosiveinfo["chainKill"] = isdefined( var_0.waschained ); + var_2.explosiveinfo["bulletPenetrationKill"] = isdefined( var_0.wasdamagedfrombulletpenetration ); + var_2.explosiveinfo["cookedKill"] = 0; + } + + if ( isdefined( var_1.lastgrenadesuicidetime ) && var_1.lastgrenadesuicidetime >= gettime() - 50 && var_20 ) + var_2.explosiveinfo["suicideGrenadeKill"] = 1; + } + + if ( var_20 ) + { + var_2.explosiveinfo["cookedKill"] = isdefined( var_0.iscooked ); + var_2.explosiveinfo["throwbackKill"] = isdefined( var_0.threwback ); + } + + var_2.explosiveinfo["stickKill"] = isdefined( var_0.isstuck ) && var_0.isstuck == "enemy"; + var_2.explosiveinfo["stickFriendlyKill"] = isdefined( var_0.isstuck ) && var_0.isstuck == "friendly"; + + if ( isplayer( var_1 ) && var_1 != self ) + maps\mp\gametypes\_gamelogic::setinflictorstat( var_0, var_1, var_6 ); + } + + if ( issubstr( var_5, "MOD_IMPACT" ) && ( var_6 == "m320_mp" || issubstr( var_6, "gl" ) || issubstr( var_6, "gp25" ) ) ) + { + if ( isplayer( var_1 ) && var_1 != self ) + maps\mp\gametypes\_gamelogic::setinflictorstat( var_0, var_1, var_6 ); + } + + if ( var_12 ) + { + if ( level.friendlyfire == 0 || !isplayer( var_1 ) && level.friendlyfire != 1 ) + { + if ( var_6 == "artillery_mp" || var_6 == "stealth_bomb_mp" ) + var_2 damageshellshockandrumble( var_0, var_6, var_5, var_3, var_4, var_1 ); + + return "friendly fire"; + } + else if ( level.friendlyfire == 1 ) + { + if ( var_3 < 1 ) + var_3 = 1; + + if ( var_2 maps\mp\_utility::isjuggernaut() ) + var_3 = maps\mp\perks\_perks::cac_modified_damage( var_2, var_1, var_3, var_5, var_6, var_7, var_8, var_9 ); + + var_2.lastdamagewasfromenemy = 0; + var_2 finishplayerdamagewrapper( var_0, var_1, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_14 ); + } + else if ( level.friendlyfire == 2 && maps\mp\_utility::isreallyalive( var_1 ) ) + { + var_3 = int( var_3 * 0.5 ); + + if ( var_3 < 1 ) + var_3 = 1; + + var_1.lastdamagewasfromenemy = 0; + var_1.friendlydamage = 1; + var_1 finishplayerdamagewrapper( var_0, var_1, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_14 ); + var_1.friendlydamage = undefined; + } + else if ( level.friendlyfire == 3 && maps\mp\_utility::isreallyalive( var_1 ) ) + { + var_3 = int( var_3 * 0.5 ); + + if ( var_3 < 1 ) + var_3 = 1; + + var_2.lastdamagewasfromenemy = 0; + var_1.lastdamagewasfromenemy = 0; + var_2 finishplayerdamagewrapper( var_0, var_1, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_14 ); + + if ( maps\mp\_utility::isreallyalive( var_1 ) ) + { + var_1.friendlydamage = 1; + var_1 finishplayerdamagewrapper( var_0, var_1, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_14 ); + var_1.friendlydamage = undefined; + } + } + + var_18 = 1; + } + else + { + if ( var_3 < 1 ) + var_3 = 1; + + if ( isdefined( var_1 ) && isplayer( var_1 ) ) + addattacker( var_2, var_1, var_0, var_6, var_3, var_7, var_8, var_9, var_10, var_5 ); + + if ( isdefined( var_1 ) && !isplayer( var_1 ) && isdefined( var_1.owner ) && ( !isdefined( var_1.scrambled ) || !var_1.scrambled ) ) + addattacker( var_2, var_1.owner, var_0, var_6, var_3, var_7, var_8, var_9, var_10, var_5 ); + else if ( isdefined( var_1 ) && !isplayer( var_1 ) && isdefined( var_1.secondowner ) && isdefined( var_1.scrambled ) && var_1.scrambled ) + addattacker( var_2, var_1.secondowner, var_0, var_6, var_3, var_7, var_8, var_9, var_10, var_5 ); + + if ( var_5 == "MOD_EXPLOSIVE" || var_5 == "MOD_GRENADE_SPLASH" && var_3 < var_2.health ) + var_2 notify( "survived_explosion", var_1 ); + + if ( isdefined( var_1 ) && isplayer( var_1 ) && isdefined( var_6 ) ) + var_1 thread maps\mp\gametypes\_weapons::checkhit( var_6, var_2 ); + + var_2.attackerposition = undefined; + + if ( isdefined( var_1 ) && isplayer( var_1 ) && isdefined( var_6 ) && var_1 != var_2 ) + var_2.attackerposition = var_1.origin; + + if ( issubstr( var_5, "MOD_GRENADE" ) && isdefined( var_0 ) && isdefined( var_0.iscooked ) ) + var_2.wascooked = gettime(); + else + var_2.wascooked = undefined; + + if ( issubstr( var_5, "MOD_IMPACT" ) && isdefined( var_0 ) && isdefined( var_0.recall ) && var_0.recall ) + var_2.wasrecall = 1; + else + var_2.wasrecall = 0; + + var_2.lastdamagewasfromenemy = isdefined( var_1 ) && var_1 != var_2; + + if ( var_2.lastdamagewasfromenemy ) + { + var_21 = gettime(); + var_1.damagedplayers[var_2.guid] = var_21; + var_2.lastdamagedtime = var_21; + } + + var_2 finishplayerdamagewrapper( var_0, var_1, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_14 ); + var_2 thread maps\mp\gametypes\_missions::playerdamaged( var_0, var_1, var_3, var_5, var_6, var_9 ); + } + + if ( var_3 > 0 && var_5 != "MOD_FALLING" ) + var_2 setclientomnvar( "ui_damage_flash", 1 ); + + if ( var_17 && isdefined( var_1.gunner ) ) + var_22 = var_1.gunner; + else + var_22 = var_1; + + if ( isdefined( var_22 ) && ( var_22 != var_2 || maps\mp\_utility::iskillstreakweapon( var_6 ) ) && var_3 > 0 && ( !isdefined( var_9 ) || var_9 != "shield" ) ) + { + if ( !maps\mp\_utility::isreallyalive( var_2 ) ) + { + if ( var_9 == "head" ) + var_23 = "killshot_headshot"; + else + var_23 = "killshot"; + } + else if ( var_4 & level.idflags_stun ) + var_23 = "stun"; + else if ( var_9 == "head" ) + var_23 = "headshot"; + else if ( isdefined( var_2.exo_health_on ) && var_2.exo_health_on == 1 ) + var_23 = "hitmorehealth"; + else if ( isexplosivedamagemod( var_5 ) && var_2 maps\mp\_utility::_hasperk( "_specialty_blastshield" ) ) + var_23 = "hitblastshield"; + else if ( isdefined( var_2.lightarmorhp ) && var_5 != "MOD_HEAD_SHOT" && !maps\mp\_utility::isfmjdamage( var_6, var_5, var_1 ) ) + var_23 = "hitlightarmor"; + else if ( var_2 maps\mp\_utility::isjuggernaut() ) + var_23 = "hitjuggernaut"; + else if ( !shouldweaponfeedback( var_6 ) ) + var_23 = "none"; + else if ( var_6 == "killstreak_solar_mp" ) + var_23 = "mp_solar"; + else if ( var_6 == "killstreak_laser2_mp" ) + var_23 = "laser"; + else if ( isdefined( var_2.exo_health_on ) && var_2.exo_health_on ) + var_23 = "hitjuggernaut"; + else + var_23 = "standard"; + + var_22 thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( var_23 ); + } + + maps\mp\gametypes\_gamelogic::sethasdonecombat( var_2, 1 ); + } + + if ( isdefined( var_1 ) && var_1 != var_2 && !var_18 ) + level.usestartspawns = 0; + + if ( var_2.sessionstate != "dead" ) + { + var_24 = var_2 getentitynumber(); + var_25 = var_2.name; + var_26 = var_2.pers["team"]; + var_27 = var_2.guid; + var_28 = ""; + + if ( isplayer( var_1 ) ) + { + var_29 = var_1 getentitynumber(); + var_30 = var_1.guid; + var_31 = var_1.name; + var_28 = var_1.pers["team"]; + } + else + { + var_29 = -1; + var_30 = ""; + var_31 = ""; + var_28 = "world"; + } + + if ( isplayer( var_1 ) ) + { + var_32 = var_1.name; + var_33 = var_1.origin; + var_34 = var_1.lifeid; + } + else + { + var_32 = "world"; + var_33 = var_2.origin; + var_34 = -1; + } + + var_35 = gettime(); + + if ( !isagent( var_2 ) && isdefined( var_2.spawninfo ) && isdefined( var_2.spawninfo.spawntime ) ) + { + var_36 = ( var_35 - var_2.spawninfo.spawntime ) / 1000.0; + + if ( var_36 <= 3.0 && var_2.spawninfo.damagereceivedtoofast == 0 ) + { + if ( !isdefined( level.matchdata ) ) + level.matchdata = []; + + if ( !isdefined( level.matchdata["badSpawnDmgReceivedCount"] ) ) + level.matchdata["badSpawnDmgReceivedCount"] = 1; + else + level.matchdata["badSpawnDmgReceivedCount"]++; + + var_2.spawninfo.damagereceivedtoofast = 1; + + if ( var_2.spawninfo.badspawn == 0 ) + { + if ( !isdefined( level.matchdata["badSpawnByAnyMeansCount"] ) ) + level.matchdata["badSpawnByAnyMeansCount"] = 1; + else + level.matchdata["badSpawnByAnyMeansCount"]++; + + var_2.spawninfo.badspawn = 1; + } + } + } + else + var_36 = -1; + + if ( isdefined( var_1 ) && isdefined( var_1.spawninfo ) && isdefined( var_1.spawninfo.spawntime ) && isplayer( var_1 ) ) + { + var_37 = ( var_35 - var_1.spawninfo.spawntime ) / 1000.0; + + if ( var_37 <= 3.0 && var_1.spawninfo.damagedealttoofast == 0 ) + { + if ( !isdefined( level.matchdata ) ) + level.matchdata = []; + + if ( !isdefined( level.matchdata["badSpawnDmgDealtCount"] ) ) + level.matchdata["badSpawnDmgDealtCount"] = 1; + else + level.matchdata["badSpawnDmgDealtCount"]++; + + var_1.spawninfo.damagedealttoofast = 1; + + if ( var_1.spawninfo.badspawn == 0 ) + { + if ( !isdefined( level.matchdata["badSpawnByAnyMeansCount"] ) ) + level.matchdata["badSpawnByAnyMeansCount"] = 1; + else + level.matchdata["badSpawnByAnyMeansCount"]++; + + var_1.spawninfo.badspawn = 1; + } + } + } + else + var_37 = -1; + + if ( !isagent( var_2 ) ) + reconspatialevent( var_2.origin, "script_mp_damage: player_name %s, player_angles %v, hit_loc %s, attacker_name %s, attacker_pos %v, damage %d, weapon %s, damage_type %s, gameTime %d, life_id %d, attacker_life_id %d, spawnToDamageReceivedTime %f, spawnToDamageDealtTime %f", var_2.name, var_2.angles, var_9, var_32, var_33, var_3, var_6, var_5, var_35, var_2.lifeid, var_34, var_36, var_37 ); + + logprint( "D;" + var_27 + ";" + var_24 + ";" + var_26 + ";" + var_25 + ";" + var_30 + ";" + var_29 + ";" + var_28 + ";" + var_31 + ";" + var_6 + ";" + var_3 + ";" + var_5 + ";" + var_9 + "\n" ); + } + + hitlocdebug( var_1, var_2, var_3, var_9, var_4 ); + + if ( isagent( self ) ) + self [[ maps\mp\agents\_agent_utility::agentfunc( "on_damaged_finished" ) ]]( var_0, var_1, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ); + + return "finished"; +} + +shouldweaponfeedback( var_0 ) +{ + switch ( var_0 ) + { + case "stealth_bomb_mp": + case "artillery_mp": + return 0; + } + + return 1; +} + +addattacker( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ) +{ + if ( !isdefined( var_0.attackerdata ) ) + var_0.attackerdata = []; + + if ( !isdefined( var_0.attackerdata[var_1.guid] ) ) + { + var_0.attackers[var_1.guid] = var_1; + var_0.attackerdata[var_1.guid] = spawnstruct(); + var_0.attackerdata[var_1.guid].damage = 0; + var_0.attackerdata[var_1.guid].attackerent = var_1; + var_0.attackerdata[var_1.guid].firsttimedamaged = gettime(); + } + + if ( maps\mp\gametypes\_weapons::isprimaryweapon( var_3 ) && !maps\mp\gametypes\_weapons::issidearm( var_3 ) ) + var_0.attackerdata[var_1.guid].isprimary = 1; + + var_0.attackerdata[var_1.guid].damage += var_4; + var_0.attackerdata[var_1.guid].weapon = var_3; + var_0.attackerdata[var_1.guid].vpoint = var_5; + var_0.attackerdata[var_1.guid].vdir = var_6; + var_0.attackerdata[var_1.guid].shitloc = var_7; + var_0.attackerdata[var_1.guid].psoffsettime = var_8; + var_0.attackerdata[var_1.guid].smeansofdeath = var_9; + var_0.attackerdata[var_1.guid].attackerent = var_1; + var_0.attackerdata[var_1.guid].lasttimedamaged = gettime(); + + if ( isdefined( var_2 ) && !isplayer( var_2 ) && isdefined( var_2.primaryweapon ) ) + var_0.attackerdata[var_1.guid].sprimaryweapon = var_2.primaryweapon; + else if ( isdefined( var_1 ) && isplayer( var_1 ) && var_1 getcurrentprimaryweapon() != "none" ) + var_0.attackerdata[var_1.guid].sprimaryweapon = var_1 getcurrentprimaryweapon(); + else + var_0.attackerdata[var_1.guid].sprimaryweapon = undefined; + + if ( !isdefined( var_0.enemyhitcounts ) ) + var_0.enemyhitcounts = []; + + if ( isplayer( var_1 ) ) + { + if ( !isdefined( var_0.enemyhitcounts[var_1.guid] ) ) + var_0.enemyhitcounts[var_1.guid] = 0; + + var_0.enemyhitcounts[var_1.guid]++; + var_0.lastshotby = var_1.clientid; + } +} + +resetattackerlist() +{ + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); + clearfirefightdata(); + wait 1.75; + self.attackers = []; + self.attackerdata = []; +} + +clearfirefightdata() +{ + self.enemyhitcounts = []; + self.currentfirefightshots = 0; +} + +clearfirefightshotsoninterval() +{ + self endon( "disconnect" ); + self endon( "death" ); + level endon( "game_ended" ); + + for (;;) + { + wait 3; + + if ( isdefined( self.enemyhitcounts ) && self.enemyhitcounts.size > 0 ) + continue; + else + self.currentfirefightshots = 0; + } +} + +is_countered_by_hardwired( var_0 ) +{ + switch ( var_0 ) + { + case "paint_grenade_var_mp": + case "emp_grenade_var_mp": + case "stun_grenade_var_mp": + case "emp_grenade_mp": + case "paint_grenade_mp": + case "stun_grenade_mp": + return 1; + } + + return 0; +} + +callback_playerdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ) +{ + var_10 = callback_playerdamage_internal( var_0, var_1, self, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ); +} + +finishplayerdamagewrapper( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ) +{ + var_11 = 0; + + if ( maps\mp\_utility::isusingremote() && var_2 >= self.health && !( var_3 & level.idflags_stun ) && !isdefined( self.inliveplayerkillstreak ) && !self isgod() ) + var_11 = 1; + + if ( isdefined( level.ishorde ) && level.ishorde ) + var_11 = 0; + + if ( var_11 || maps\mp\_utility::isrocketcorpse() ) + { + if ( !isdefined( var_7 ) ) + var_7 = ( 0, 0, 0 ); + + if ( !isdefined( var_1 ) && !isdefined( var_0 ) ) + { + var_1 = self; + var_0 = var_1; + } + + playerkilled_internal( var_0, var_1, self, var_2, var_4, var_5, var_7, var_8, var_9, 0, 1 ); + } + else + { + if ( !callback_killingblow( var_0, var_1, var_2 - var_2 * var_10, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ) ) + return; + + if ( !isalive( self ) ) + return; + + if ( isplayer( self ) ) + { + var_12 = shouldplayblastimpact( var_3, var_4, var_5 ); + var_13 = self finishplayerdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_12 ); + + if ( isdefined( var_13 ) ) + thread finishplayerdamage_impactfxwrapper( var_13[0], var_13[1], var_13[2], var_13[3], var_13[4], var_13[5], var_13[6] ); + } + } + + if ( var_4 == "MOD_EXPLOSIVE_BULLET" ) + self shellshock( "damage_mp", getdvarfloat( "scr_csmode" ) ); + + damageshellshockandrumble( var_0, var_5, var_4, var_2, var_3, var_1 ); +} + +shouldplayblastimpact( var_0, var_1, var_2 ) +{ + if ( var_0 & level.idflags_radius && isexplosivedamagemod( var_1 ) ) + { + if ( is_countered_by_hardwired( var_2 ) ) + { + if ( !maps\mp\_utility::_hasperk( "specialty_class_hardwired" ) ) + return 1; + } + else if ( !maps\mp\_utility::_hasperk( "specialty_hard_shell" ) ) + return 1; + } + + return 0; +} + +finishplayerdamage_impactfxwrapper( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) +{ + waittillframeend; + + if ( !isdefined( self ) || !isdefined( var_0 ) ) + return; + + self finishplayerdamage_impactfx( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ); +} + +callback_playerlaststand( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 ) +{ + var_9 = spawnstruct(); + var_9.einflictor = var_0; + var_9.attacker = var_1; + var_9.idamage = var_2; + var_9.attackerposition = var_1.origin; + + if ( var_1 == self ) + var_9.smeansofdeath = "MOD_SUICIDE"; + else + var_9.smeansofdeath = var_3; + + var_9.sweapon = var_4; + + if ( isdefined( var_1 ) && isplayer( var_1 ) && var_1 getcurrentprimaryweapon() != "none" ) + var_9.sprimaryweapon = var_1 getcurrentprimaryweapon(); + else + var_9.sprimaryweapon = undefined; + + var_9.vdir = var_5; + var_9.shitloc = var_6; + var_9.laststandstarttime = gettime(); + var_10 = maydolaststand( var_4, var_3, var_6 ); + + if ( isdefined( self.endgame ) ) + var_10 = 0; + + if ( level.teambased && isdefined( var_1.team ) && var_1.team == self.team ) + var_10 = 0; + + if ( level.diehardmode ) + { + if ( level.teamcount[self.team] <= 1 ) + var_10 = 0; + else if ( maps\mp\_utility::isteaminlaststand() ) + { + var_10 = 0; + maps\mp\_utility::killteaminlaststand( self.team ); + } + } + + if ( !var_10 ) + { + self.laststandparams = var_9; + self.uselaststandparams = 1; + maps\mp\_utility::_suicide(); + } + else + { + self.inlaststand = 1; + var_11 = spawnstruct(); + + if ( maps\mp\_utility::_hasperk( "specialty_finalstand" ) ) + { + var_11.titletext = game["strings"]["final_stand"]; + var_11.iconname = level.specialty_finalstand_icon; + } + else + { + var_11.titletext = game["strings"]["last_stand"]; + var_11.iconname = level.specialty_finalstand_icon; + } + + var_11.glowcolor = ( 1, 0, 0 ); + var_11.sound = "mp_last_stand"; + var_11.duration = 2.0; + self.health = 1; + thread maps\mp\gametypes\_hud_message::notifymessage( var_11 ); + var_12 = "frag_grenade_mp"; + + if ( maps\mp\_utility::_hasperk( "specialty_finalstand" ) ) + { + self.laststandparams = var_9; + self.infinalstand = 1; + var_13 = self getweaponslistexclusives(); + + foreach ( var_15 in var_13 ) + self takeweapon( var_15 ); + + common_scripts\utility::_disableusability(); + thread enablelaststandweapons(); + thread laststandtimer( 20, 1 ); + } + else + { + if ( level.diehardmode ) + { + var_1 thread maps\mp\_events::killedplayerevent( self, var_4, var_3 ); + self.laststandparams = var_9; + common_scripts\utility::_disableweapon(); + thread laststandtimer( 20, 0 ); + common_scripts\utility::_disableusability(); + return; + } + + self.laststandparams = var_9; + var_17 = undefined; + var_18 = self getweaponslistprimaries(); + + foreach ( var_15 in var_18 ) + { + if ( maps\mp\gametypes\_weapons::issidearm( var_15 ) ) + var_17 = var_15; + } + + if ( !isdefined( var_17 ) ) + { + var_17 = "iw6_p226_mp"; + maps\mp\_utility::_giveweapon( var_17 ); + } + + self givemaxammo( var_17 ); + self disableweaponswitch(); + common_scripts\utility::_disableusability(); + + if ( !maps\mp\_utility::_hasperk( "specialty_laststandoffhand" ) ) + self disableoffhandweapons(); + + self switchtoweapon( var_17 ); + thread laststandtimer( 10, 0 ); + } + } +} + +dieaftertime( var_0 ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "joined_team" ); + level endon( "game_ended" ); + wait(var_0); + self.uselaststandparams = 1; + maps\mp\_utility::_suicide(); +} + +detonateonuse() +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "joined_team" ); + level endon( "game_ended" ); + self waittill( "detonate" ); + self.uselaststandparams = 1; + c4deathdetonate(); +} + +detonateondeath() +{ + self endon( "detonate" ); + self endon( "disconnect" ); + self endon( "joined_team" ); + level endon( "game_ended" ); + self waittill( "death" ); + c4deathdetonate(); +} + +c4deathdetonate() +{ + self playsound( "detpack_explo_default" ); + self.c4deatheffect = playfx( level.c4death, self.origin ); + radiusdamage( self.origin, 312, 100, 100, self ); + + if ( isalive( self ) ) + maps\mp\_utility::_suicide(); +} + +enablelaststandweapons() +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "game_ended" ); + maps\mp\_utility::freezecontrolswrapper( 1 ); + wait 0.3; + maps\mp\_utility::freezecontrolswrapper( 0 ); +} + +laststandtimer( var_0, var_1 ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "revive" ); + level endon( "game_ended" ); + level notify( "player_last_stand" ); + thread laststandwaittilldeath(); + self.laststand = 1; + + if ( !var_1 && ( !isdefined( self.inc4death ) || !self.inc4death ) ) + { + thread laststandallowsuicide(); + maps\mp\_utility::setlowermessage( "last_stand", &"PLATFORM_COWARDS_WAY_OUT", undefined, undefined, undefined, undefined, undefined, undefined, 1 ); + thread laststandkeepoverlay(); + } + + if ( level.diehardmode == 1 && level.diehardmode != 2 ) + { + var_2 = spawn( "script_model", self.origin ); + var_2 setmodel( "tag_origin" ); + var_2 setcursorhint( "HINT_NOICON" ); + var_2 sethintstring( &"PLATFORM_REVIVE" ); + var_2 revivesetup( self ); + var_2 endon( "death" ); + var_3 = newteamhudelem( self.team ); + var_3 setshader( "waypoint_revive", 8, 8 ); + var_3 setwaypoint( 1, 1 ); + var_3 settargetent( self ); + var_3 thread destroyonreviveentdeath( var_2 ); + var_3.color = ( 0.33, 0.75, 0.24 ); + maps\mp\_utility::playdeathsound(); + + if ( var_1 ) + { + wait(var_0); + + if ( self.infinalstand ) + thread laststandbleedout( var_1, var_2 ); + } + + return; + } + else if ( level.diehardmode == 2 ) + { + thread laststandkeepoverlay(); + var_2 = spawn( "script_model", self.origin ); + var_2 setmodel( "tag_origin" ); + var_2 setcursorhint( "HINT_NOICON" ); + var_2 sethintstring( &"PLATFORM_REVIVE" ); + var_2 revivesetup( self ); + var_2 endon( "death" ); + var_3 = newteamhudelem( self.team ); + var_3 setshader( "waypoint_revive", 8, 8 ); + var_3 setwaypoint( 1, 1 ); + var_3 settargetent( self ); + var_3 thread destroyonreviveentdeath( var_2 ); + var_3.color = ( 0.33, 0.75, 0.24 ); + maps\mp\_utility::playdeathsound(); + + if ( var_1 ) + { + wait(var_0); + + if ( self.infinalstand ) + thread laststandbleedout( var_1, var_2 ); + } + + wait(var_0 / 3); + var_3.color = ( 1, 0.64, 0 ); + + while ( var_2.inuse ) + wait 0.05; + + maps\mp\_utility::playdeathsound(); + wait(var_0 / 3); + var_3.color = ( 1, 0, 0 ); + + while ( var_2.inuse ) + wait 0.05; + + maps\mp\_utility::playdeathsound(); + wait(var_0 / 3); + + while ( var_2.inuse ) + wait 0.05; + + wait 0.05; + thread laststandbleedout( var_1 ); + return; + } + + thread laststandkeepoverlay(); + wait(var_0); + thread laststandbleedout( var_1 ); +} + +maxhealthoverlay( var_0, var_1 ) +{ + self endon( "stop_maxHealthOverlay" ); + self endon( "revive" ); + self endon( "death" ); + + for (;;) + { + self.health -= 1; + self.maxhealth = var_0; + wait 0.05; + self.maxhealth = 50; + self.health += 1; + wait 0.5; + } +} + +laststandbleedout( var_0, var_1 ) +{ + if ( var_0 ) + { + self.laststand = undefined; + self.infinalstand = 0; + self notify( "revive" ); + maps\mp\_utility::clearlowermessage( "last_stand" ); + maps\mp\gametypes\_playerlogic::laststandrespawnplayer(); + + if ( isdefined( var_1 ) ) + var_1 delete(); + } + else + { + self.uselaststandparams = 1; + self.beingrevived = 0; + maps\mp\_utility::_suicide(); + } +} + +laststandallowsuicide() +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "game_ended" ); + self endon( "revive" ); + + for (;;) + { + if ( self usebuttonpressed() ) + { + var_0 = gettime(); + + while ( self usebuttonpressed() ) + { + wait 0.05; + + if ( gettime() - var_0 > 700 ) + break; + } + + if ( gettime() - var_0 > 700 ) + break; + } + + wait 0.05; + } + + thread laststandbleedout( 0 ); +} + +laststandkeepoverlay() +{ + level endon( "game_ended" ); + self endon( "death" ); + self endon( "disconnect" ); + self endon( "revive" ); + + while ( !level.gameended ) + { + self.health = 2; + wait 0.05; + self.health = 1; + wait 0.5; + } + + self.health = self.maxhealth; +} + +laststandwaittilldeath() +{ + self endon( "disconnect" ); + self endon( "revive" ); + level endon( "game_ended" ); + self waittill( "death" ); + maps\mp\_utility::clearlowermessage( "last_stand" ); + self.laststand = undefined; +} + +maydolaststand( var_0, var_1, var_2 ) +{ + if ( var_1 == "MOD_TRIGGER_HURT" ) + return 0; + + if ( var_1 != "MOD_PISTOL_BULLET" && var_1 != "MOD_RIFLE_BULLET" && var_1 != "MOD_FALLING" && var_1 != "MOD_EXPLOSIVE_BULLET" ) + return 0; + + if ( var_1 == "MOD_IMPACT" && ( var_0 == "throwingknife_mp" || var_0 == "throwingknifejugg_mp" ) ) + return 0; + + if ( var_1 == "MOD_IMPACT" && ( var_0 == "m79_mp" || issubstr( var_0, "gl_" ) ) ) + return 0; + + if ( maps\mp\_utility::isheadshot( var_0, var_2, var_1 ) ) + return 0; + + if ( maps\mp\_utility::isusingremote() ) + return 0; + + return 1; +} + +ensurelaststandparamsvalidity() +{ + if ( !isdefined( self.laststandparams.attacker ) ) + self.laststandparams.attacker = self; +} + +gethitlocheight( var_0 ) +{ + switch ( var_0 ) + { + case "neck": + case "helmet": + case "head": + return 60; + case "left_hand": + case "right_hand": + case "left_arm_lower": + case "right_arm_lower": + case "left_arm_upper": + case "right_arm_upper": + case "torso_upper": + case "gun": + return 48; + case "torso_lower": + return 40; + case "left_leg_upper": + case "right_leg_upper": + return 32; + case "left_leg_lower": + case "right_leg_lower": + return 10; + case "left_foot": + case "right_foot": + return 5; + } + + return 48; +} + +gethitloctag( var_0 ) +{ + switch ( var_0 ) + { + case "helmet": + return "j_neck"; + case "head": + return "j_neck"; + case "neck": + return "j_neck"; + case "torso_upper": + return "j_neck"; + case "right_arm_upper": + return "J_Shoulder_RI"; + case "left_arm_upper": + return "J_Shoulder_LE"; + case "right_arm_lower": + return "J_Elbow_RI"; + case "left_arm_lower": + return "J_Elbow_LE"; + case "right_hand": + return "J_Wrist_RI"; + case "left_hand": + return "J_Wrist_LE"; + case "gun": + return "J_Wrist_RI"; + case "torso_lower": + return "J_SpineLower"; + case "right_leg_upper": + return "J_Hip_RI"; + case "left_leg_upper": + return "J_Hip_LE"; + case "right_leg_lower": + return "J_Knee_RI"; + case "left_leg_lower": + return "J_Knee_LE"; + case "right_foot": + return "J_Ankle_RI"; + case "left_foot": + return "J_Ankle_LE"; + } + + return undefined; +} + +delaystartragdoll( var_0, var_1, var_2, var_3, var_4, var_5 ) +{ + if ( isdefined( var_0 ) ) + { + var_6 = var_0 getcorpseanim(); + + if ( animhasnotetrack( var_6, "ignore_ragdoll" ) ) + return; + } + + if ( isdefined( level.noragdollents ) && level.noragdollents.size ) + { + foreach ( var_8 in level.noragdollents ) + { + if ( distancesquared( var_0.origin, var_8.origin ) < 65536 ) + return; + } + } + + wait 0.2; + + if ( !isdefined( var_0 ) ) + return; + + if ( var_0 isragdoll() ) + return; + + var_6 = var_0 getcorpseanim(); + var_10 = 0.35; + + if ( animhasnotetrack( var_6, "start_ragdoll" ) ) + { + var_11 = getnotetracktimes( var_6, "start_ragdoll" ); + + if ( isdefined( var_11 ) ) + var_10 = var_11[0]; + } + + var_12 = var_10 * getanimlength( var_6 ); + wait(var_12); + + if ( isdefined( var_0 ) ) + var_0 startragdoll(); +} + +getmostkilledby() +{ + var_0 = ""; + var_1 = 0; + var_2 = getarraykeys( self.killedby ); + + for ( var_3 = 0; var_3 < var_2.size; var_3++ ) + { + var_4 = var_2[var_3]; + + if ( self.killedby[var_4] <= var_1 ) + continue; + + var_1 = self.killedby[var_4]; + var_5 = var_4; + } + + return var_0; +} + +getmostkilled() +{ + var_0 = ""; + var_1 = 0; + var_2 = getarraykeys( self.killedplayers ); + + for ( var_3 = 0; var_3 < var_2.size; var_3++ ) + { + var_4 = var_2[var_3]; + + if ( self.killedplayers[var_4] <= var_1 ) + continue; + + var_1 = self.killedplayers[var_4]; + var_0 = var_4; + } + + return var_0; +} + +damageshellshockandrumble( var_0, var_1, var_2, var_3, var_4, var_5 ) +{ + thread maps\mp\gametypes\_weapons::onweapondamage( var_0, var_1, var_2, var_3, var_5 ); + self playrumbleonentity( "sniper_fire" ); +} + +revivesetup( var_0 ) +{ + var_1 = var_0.team; + self linkto( var_0, "tag_origin" ); + self.owner = var_0; + self.inuse = 0; + self makeusable(); + updateusablebyteam( var_1 ); + thread trackteamchanges( var_1 ); + thread revivetriggerthink( var_1 ); + thread deleteonreviveordeathordisconnect(); +} + +deleteonreviveordeathordisconnect() +{ + self endon( "death" ); + self.owner common_scripts\utility::waittill_any( "death", "disconnect" ); + self delete(); +} + +updateusablebyteam( var_0 ) +{ + foreach ( var_2 in level.players ) + { + if ( var_0 == var_2.team && var_2 != self.owner ) + { + self enableplayeruse( var_2 ); + continue; + } + + self disableplayeruse( var_2 ); + } +} + +trackteamchanges( var_0 ) +{ + self endon( "death" ); + + for (;;) + { + level waittill( "joined_team" ); + updateusablebyteam( var_0 ); + } +} + +tracklaststandchanges( var_0 ) +{ + self endon( "death" ); + + for (;;) + { + level waittill( "player_last_stand" ); + updateusablebyteam( var_0 ); + } +} + +revivetriggerthink( var_0 ) +{ + self endon( "death" ); + level endon( "game_ended" ); + + for (;;) + { + self waittill( "trigger", var_1 ); + self.owner.beingrevived = 1; + + if ( isdefined( var_1.beingrevived ) && var_1.beingrevived ) + { + self.owner.beingrevived = 0; + continue; + } + + self makeunusable(); + self.owner maps\mp\_utility::freezecontrolswrapper( 1 ); + var_2 = reviveholdthink( var_1 ); + self.owner.beingrevived = 0; + + if ( !isalive( self.owner ) ) + { + self delete(); + return; + } + + self.owner maps\mp\_utility::freezecontrolswrapper( 0 ); + + if ( var_2 ) + { + level thread maps\mp\gametypes\_rank::awardgameevent( "reviver", var_1 ); + self.owner.laststand = undefined; + self.owner maps\mp\_utility::clearlowermessage( "last_stand" ); + self.owner.movespeedscaler = level.baseplayermovescale; + + if ( self.owner maps\mp\_utility::_hasperk( "specialty_lightweight" ) ) + self.owner.movespeedscaler = maps\mp\_utility::lightweightscalar(); + + self.owner common_scripts\utility::_enableweapon(); + self.owner.maxhealth = 100; + self.owner maps\mp\gametypes\_weapons::updatemovespeedscale(); + self.owner maps\mp\gametypes\_playerlogic::laststandrespawnplayer(); + self.owner maps\mp\_utility::giveperk( "specialty_pistoldeath", 0 ); + self.owner.beingrevived = 0; + self delete(); + return; + } + + self makeusable(); + updateusablebyteam( var_0 ); + } +} + +reviveholdthink( var_0, var_1, var_2 ) +{ + var_3 = 3000; + var_4 = spawn( "script_origin", self.origin ); + var_4 hide(); + + if ( isplayer( var_0 ) ) + var_0 playerlinkto( var_4 ); + else + var_0 linkto( var_4 ); + + var_0 playerlinkedoffsetenable(); + + if ( !isdefined( var_2 ) ) + var_2 = 1; + + if ( var_2 ) + var_0 common_scripts\utility::_disableweapon(); + + self.curprogress = 0; + self.inuse = 1; + self.userate = 0; + + if ( isdefined( var_1 ) ) + self.usetime = var_1; + else + self.usetime = var_3; + + if ( isdefined( level.ishorde ) && level.ishorde ) + var_0 thread personalusebaroldstyle( self ); + else + var_0 thread personalusebar( self ); + + thread reviveholdthink_cleanup( var_0, var_2, var_4 ); + var_5 = reviveholdthinkloop( var_0 ); + self.inuse = 0; + var_4 delete(); + + if ( isdefined( var_5 ) && var_5 ) + { + self.owner thread maps\mp\gametypes\_hud_message::playercardsplashnotify( "revived", var_0 ); + self.owner.inlaststand = 0; + return 1; + } + + return 0; +} + +reviveholdthink_cleanup( var_0, var_1, var_2 ) +{ + common_scripts\utility::waittill_any_ents( self, "death", var_2, "death" ); + + if ( !isremovedentity( var_2 ) ) + var_2 delete(); + + if ( isdefined( var_0 ) && maps\mp\_utility::isreallyalive( var_0 ) ) + { + var_0 unlink(); + + if ( var_1 ) + var_0 common_scripts\utility::_enableweapon(); + } +} + +personalusebar( var_0 ) +{ + self setclientomnvar( "ui_use_bar_text", 3 ); + self setclientomnvar( "ui_use_bar_start_time", int( gettime() ) ); + var_1 = undefined; + + if ( isdefined( var_0 ) && isdefined( var_0.owner ) ) + { + var_1 = var_0.owner; + var_1 setclientomnvar( "ui_use_bar_text", 4 ); + var_1 setclientomnvar( "ui_use_bar_start_time", int( gettime() ) ); + } + + var_2 = -1; + + while ( maps\mp\_utility::isreallyalive( self ) && isdefined( var_0 ) && var_0.inuse && !level.gameended && isdefined( self ) ) + { + if ( var_2 != var_0.userate ) + { + if ( var_0.curprogress > var_0.usetime ) + var_0.curprogress = var_0.usetime; + + if ( var_0.userate > 0 ) + { + var_3 = gettime(); + var_4 = var_0.curprogress / var_0.usetime; + var_5 = var_3 + ( 1 - var_4 ) * var_0.usetime / var_0.userate; + self setclientomnvar( "ui_use_bar_end_time", int( var_5 ) ); + + if ( isdefined( var_1 ) ) + var_1 setclientomnvar( "ui_use_bar_end_time", int( var_5 ) ); + } + + var_2 = var_0.userate; + } + + wait 0.05; + } + + if ( isdefined( self ) ) + self setclientomnvar( "ui_use_bar_end_time", 0 ); + + if ( isdefined( var_1 ) ) + var_1 setclientomnvar( "ui_use_bar_end_time", 0 ); +} + +personalusebaroldstyle( var_0 ) +{ + var_1 = maps\mp\gametypes\_hud_util::createprimaryprogressbar(); + var_2 = maps\mp\gametypes\_hud_util::createprimaryprogressbartext(); + var_2 settext( &"MPUI_REVIVING" ); + var_3 = var_0.owner maps\mp\gametypes\_hud_util::createprimaryprogressbar(); + var_4 = var_0.owner maps\mp\gametypes\_hud_util::createprimaryprogressbartext(); + var_4 settext( &"MPUI_BEING_REVIVED" ); + var_5 = -1; + + while ( maps\mp\_utility::isreallyalive( self ) && isdefined( var_0 ) && var_0.inuse && !level.gameended && isdefined( self ) ) + { + if ( var_5 != var_0.userate ) + { + if ( var_0.curprogress > var_0.usetime ) + var_0.curprogress = var_0.usetime; + + var_1 maps\mp\gametypes\_hud_util::updatebar( var_0.curprogress / var_0.usetime, 1000 / var_0.usetime * var_0.userate ); + var_3 maps\mp\gametypes\_hud_util::updatebar( var_0.curprogress / var_0.usetime, 1000 / var_0.usetime * var_0.userate ); + + if ( !var_0.userate ) + { + var_1 maps\mp\gametypes\_hud_util::hideelem(); + var_2 maps\mp\gametypes\_hud_util::hideelem(); + var_3 maps\mp\gametypes\_hud_util::hideelem(); + var_4 maps\mp\gametypes\_hud_util::hideelem(); + } + else + { + var_1 maps\mp\gametypes\_hud_util::showelem(); + var_2 maps\mp\gametypes\_hud_util::showelem(); + var_3 maps\mp\gametypes\_hud_util::showelem(); + var_4 maps\mp\gametypes\_hud_util::showelem(); + } + } + + var_5 = var_0.userate; + wait 0.05; + } + + if ( isdefined( var_1 ) ) + var_1 maps\mp\gametypes\_hud_util::destroyelem(); + + if ( isdefined( var_2 ) ) + var_2 maps\mp\gametypes\_hud_util::destroyelem(); + + if ( isdefined( var_3 ) ) + var_3 maps\mp\gametypes\_hud_util::destroyelem(); + + if ( isdefined( var_4 ) ) + var_4 maps\mp\gametypes\_hud_util::destroyelem(); +} + +reviveholdthinkloop( var_0 ) +{ + level endon( "game_ended" ); + self.owner endon( "death" ); + self.owner endon( "disconnect" ); + + while ( maps\mp\_utility::isreallyalive( var_0 ) && var_0 usebuttonpressed() && self.curprogress < self.usetime && !( isdefined( var_0.inlaststand ) && var_0.inlaststand ) ) + { + self.curprogress += 50 * self.userate; + self.userate = 1; + + if ( self.curprogress >= self.usetime ) + { + self.inuse = 0; + return maps\mp\_utility::isreallyalive( var_0 ); + } + + wait 0.05; + } + + return 0; +} + +callback_killingblow( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ) +{ + if ( isdefined( self.lastdamagewasfromenemy ) && self.lastdamagewasfromenemy && var_2 >= self.health && isdefined( self.combathigh ) && self.combathigh == "specialty_endgame" ) + { + maps\mp\_utility::giveperk( "specialty_endgame", 0 ); + return 0; + } + + return 1; +} + +emitfalldamage( var_0 ) +{ + physicsexplosionsphere( self.origin, 64, 64, 1 ); + var_1 = []; + + for ( var_2 = 0; var_2 < 360; var_2 += 30 ) + { + var_3 = cos( var_2 ) * 16; + var_4 = sin( var_2 ) * 16; + var_5 = bullettrace( self.origin + ( var_3, var_4, 4 ), self.origin + ( var_3, var_4, -6 ), 1, self ); + + if ( isdefined( var_5["entity"] ) && isdefined( var_5["entity"].targetname ) && ( var_5["entity"].targetname == "destructible_vehicle" || var_5["entity"].targetname == "destructible_toy" ) ) + var_1[var_1.size] = var_5["entity"]; + } + + if ( var_1.size ) + { + var_6 = spawn( "script_origin", self.origin ); + var_6 hide(); + var_6.type = "soft_landing"; + var_6.destructibles = var_1; + radiusdamage( self.origin, 64, 100, 100, var_6 ); + wait 0.1; + var_6 delete(); + } +} + +_obituary( var_0, var_1, var_2, var_3 ) +{ + var_4 = var_0.team; + + foreach ( var_6 in level.players ) + { + var_7 = var_6.team; + + if ( var_7 == "spectator" ) + { + var_6 iprintln( &"MP_OBITUARY_NEUTRAL", var_1.name, var_0.name ); + continue; + } + + if ( var_7 == var_4 ) + { + var_6 iprintln( &"MP_OBITUARY_ENEMY", var_1.name, var_0.name ); + continue; + } + + var_6 iprintln( &"MP_OBITUARY_FRIENDLY", var_1.name, var_0.name ); + } +} + +logprintplayerdeath( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) +{ + var_7 = self getentitynumber(); + var_8 = self.name; + var_9 = self.team; + var_10 = self.guid; + + if ( isplayer( var_1 ) ) + { + var_11 = var_1.guid; + var_12 = var_1.name; + var_13 = var_1.team; + var_14 = var_1 getentitynumber(); + var_15 = var_1.xuid + "(" + var_12 + ")"; + } + else + { + var_11 = ""; + var_12 = ""; + var_13 = "world"; + var_14 = -1; + var_15 = "none"; + } + + logprint( "K;" + var_10 + ";" + var_7 + ";" + var_9 + ";" + var_8 + ";" + var_11 + ";" + var_14 + ";" + var_13 + ";" + var_12 + ";" + var_4 + ";" + var_2 + ";" + var_3 + ";" + var_6 + "\n" ); +} + +destroyonreviveentdeath( var_0 ) +{ + var_0 waittill( "death" ); + self destroy(); +} + +gamemodemodifyplayerdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 ) +{ + if ( isdefined( var_2 ) && isplayer( var_2 ) && isalive( var_2 ) ) + { + if ( level.matchrules_damagemultiplier ) + var_3 *= level.matchrules_damagemultiplier; + + if ( level.matchrules_vampirism ) + var_2.health = int( min( float( var_2.maxhealth ), float( var_2.health + 20 ) ) ); + } + + return var_3; +} + +setentitydamagecallback( var_0, var_1, var_2, var_3, var_4 ) +{ + if ( !isdefined( var_4 ) ) + var_4 = 0; + + if ( !isdefined( var_1 ) ) + var_1 = "normal"; + + if ( !isdefined( var_3 ) ) + var_3 = ::modifydamage; + + self setcandamage( 1 ); + + if ( isdefined( self.classname ) && self.classname != "script_vehicle" ) + self setdamagecallbackon( 1 ); + + self.health = 999999; + self.maxhealth = var_0; + self.damagetaken = 0; + self.biskillstreak = var_4; + self.damagefeedback = var_1; + self.damagecallback = ::processdamagetaken; + self.modifydamagefunc = var_3; + self.ondeathfunc = var_2; + self.attackerlist = []; +} + +processdamagetaken( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 ) +{ + if ( !isdefined( self ) ) + return; + + if ( !( isdefined( level.ishorde ) && level.ishorde ) && !( isdefined( level.iszombiegame ) && level.iszombiegame ) && isdefined( var_1 ) && !maps\mp\_utility::isgameparticipant( var_1 ) ) + return; + + if ( isdefined( var_1 ) && !maps\mp\gametypes\_weapons::friendlyfirecheck( self.owner, var_1 ) ) + return; + + var_1 playrumbleonentity( "damage_light" ); + + if ( isdefined( self.iscrashing ) && self.iscrashing ) + return; + + if ( isdefined( self.isleaving ) && self.isleaving ) + return; + + if ( isdefined( self.stopdamagefunc ) && self.stopdamagefunc ) + return; + + var_12 = var_2; + + if ( isdefined( var_5 ) ) + { + var_13 = maps\mp\_utility::strip_suffix( var_5, "_lefthand" ); + + switch ( var_13 ) + { + case "smoke_grenade_var_mp": + case "paint_grenade_var_mp": + case "smoke_grenade_mp": + case "paint_grenade_mp": + return; + } + + if ( isdefined( level.ishorde ) && level.ishorde ) + self.damageloc = var_11; + + var_12 = [[ self.modifydamagefunc ]]( var_1, var_5, var_4, var_2 ); + + if ( isdefined( level.ishorde ) && level.ishorde ) + self.damageloc = undefined; + } + + if ( var_12 < 0 ) + return 1; + + if ( isdefined( var_3 ) && var_3 & level.idflags_penetration ) + self.wasdamagedfrombulletpenetration = 1; + + self.wasdamaged = 1; + self.damagetaken += var_12; + maps\mp\killstreaks\_killstreaks::killstreakhit( var_1, var_5, self ); + + if ( isdefined( var_1 ) && isplayer( var_1 ) ) + { + var_1 maps\mp\gametypes\_damagefeedback::updatedamagefeedback( self.damagefeedback ); + + if ( isnewattacker( var_1 ) ) + self.attackerlist[self.attackerlist.size] = var_1; + } + + if ( self.damagetaken >= self.maxhealth ) + { + if ( self.biskillstreak && isplayer( var_1 ) ) + var_1 notify( "destroyed_killstreak", var_5 ); + + if ( self.classname == "script_vehicle" || self.classname == "script_model" ) + { + var_14 = maps\mp\_utility::getbaseweaponname( var_5, 1 ); + + if ( maps\mp\_utility::islootweapon( var_14 ) ) + var_14 = maps\mp\gametypes\_class::getbasefromlootversion( var_14 ); + + var_15 = maps\mp\gametypes\_missions::get_challenge_weapon_class( var_5, var_14 ); + + if ( isdefined( self.model ) && var_15 == "weapon_launcher" ) + { + if ( issubstr( self.model, "uav" ) ) + { + if ( isdefined( level.challengeinfo["ch_uav_" + var_14] ) ) + var_1 maps\mp\gametypes\_missions::processchallenge( "ch_uav_" + var_14 ); + } + + if ( issubstr( self.model, "warbird" ) ) + { + if ( isdefined( level.challengeinfo["ch_warbird_" + var_14] ) ) + var_1 maps\mp\gametypes\_missions::processchallenge( "ch_warbird_" + var_14 ); + } + + if ( issubstr( self.model, "orbital_platform" ) ) + { + if ( isdefined( level.challengeinfo["ch_paladin_" + var_14] ) ) + var_1 maps\mp\gametypes\_missions::processchallenge( "ch_paladin_" + var_14 ); + } + + if ( issubstr( self.model, "drone" ) && !issubstr( self.model, "uav" ) ) + { + if ( isdefined( level.challengeinfo["ch_drone_" + var_14] ) ) + var_1 maps\mp\gametypes\_missions::processchallenge( "ch_drone_" + var_14 ); + } + } + } + + self.stopdamagefunc = 1; + self thread [[ self.ondeathfunc ]]( var_1, var_5, var_4, var_2 ); + } +} + +isnewattacker( var_0 ) +{ + foreach ( var_2 in self.attackerlist ) + { + if ( var_0 == var_2 ) + return 0; + } + + return 1; +} + +modifydamage( var_0, var_1, var_2, var_3 ) +{ + var_4 = var_3; + var_4 = handlemeleedamage( var_1, var_2, var_4 ); + var_4 = handleempdamage( var_1, var_2, var_4, var_0 ); + var_4 = handlemissiledamage( var_1, var_2, var_4 ); + var_4 = handlegrenadedamage( var_1, var_2, var_4 ); + var_4 = handleapdamage( var_1, var_2, var_4, var_0 ); + return var_4; +} + +handlemissiledamage( var_0, var_1, var_2 ) +{ + var_3 = var_2; + + switch ( var_0 ) + { + case "orbitalsupport_missile_mp": + case "orbitalsupport_105mm_mp": + case "airstrike_missile_mp": + case "remotemissile_projectile_secondary_mp": + case "remotemissile_projectile_cluster_child_hellfire_mp": + case "warbird_missile_mp": + case "dam_turret_mp": + case "remotemissile_projectile_cluster_child_mp": + case "orbital_carepackage_pod_plane_mp": + case "stealth_bomb_mp": + case "stinger_mp": + case "orbital_carepackage_droppod_mp": + case "orbital_carepackage_pod_mp": + case "remotemissile_projectile_gas_mp": + case "remotemissile_projectile_cluster_parent_mp": + case "remotemissile_projectile_mp": + case "bomb_site_mp": + self.largeprojectiledamage = 1; + var_3 = self.maxhealth + 1; + break; + case "killstreak_laser2_mp": + self.largeprojectiledamage = 1; + var_4 = level.sentrygun.ownerlist; + var_5 = 0.34; + + if ( isdefined( var_4 ) && var_4.size > 0 ) + { + var_6 = var_4.size; + + if ( var_4.size >= 3 ) + var_6 = 3; + + var_5 *= var_6; + } + + var_3 = self.maxhealth * var_5; + break; + case "killstreak_orbital_laser_mp": + case "killstreakmahem_mp": + case "assaultdrone_c4_mp": + case "ugv_missile_mp": + case "turretheadrocket_mp": + self.largeprojectiledamage = 0; + var_3 = self.maxhealth + 1; + break; + case "orbitalsupport_40mmbuddy_mp": + case "orbitalsupport_40mm_mp": + self.largeprojectiledamage = 0; + var_3 *= 2; + break; + } + + return var_3; +} + +handlegrenadedamage( var_0, var_1, var_2 ) +{ + var_3 = maps\mp\_utility::strip_suffix( var_0, "_lefthand" ); + + if ( var_3 == "stun_grenade_mp" || var_3 == "stun_grenade_var_mp" || var_3 == "stun_grenade_horde_mp" ) + { + self notify( "concussed" ); + return 0; + } + else if ( isexplosivedamagemod( var_1 ) ) + { + switch ( var_3 ) + { + case "explosive_drone_mp": + case "semtex_mp": + case "frag_grenade_mp": + var_2 *= 4; + break; + default: + if ( maps\mp\_utility::isstrstart( var_0, "alt_" ) ) + var_2 *= 3; + + break; + } + } + + return var_2; +} + +handlemeleedamage( var_0, var_1, var_2 ) +{ + if ( maps\mp\_utility::ismeleemod( var_1 ) ) + { + var_3 = int( self.maxhealth / 3 ) + 1; + + if ( var_3 > var_2 ) + return var_3; + } + + return var_2; +} + +handleempdamage( var_0, var_1, var_2, var_3 ) +{ + var_4 = maps\mp\_utility::strip_suffix( var_0, "_lefthand" ); + + if ( ( var_4 == "emp_grenade_mp" || var_4 == "emp_grenade_var_mp" || var_4 == "emp_grenade_killstreak_mp" ) && ( var_1 == "MOD_GRENADE_SPLASH" || var_1 == "MOD_GRENADE" ) ) + { + self notify( "emp_damage", var_3, 8.0 ); + return 0; + } + + return var_2; +} + +handleapdamage( var_0, var_1, var_2, var_3 ) +{ + if ( var_1 == "MOD_RIFLE_BULLET" || var_1 == "MOD_PISTOL_BULLET" ) + { + if ( var_3 maps\mp\_utility::_hasperk( "specialty_armorpiercing" ) || maps\mp\_utility::isfmjdamage( var_0, var_1, var_3 ) ) + return var_2 * level.armorpiercingmod; + } + + return var_2; +} + +onkillstreakkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 ) +{ + var_8 = undefined; + + if ( isdefined( var_0 ) && isdefined( self.owner ) ) + { + if ( isdefined( var_0.owner ) && isplayer( var_0.owner ) ) + var_0 = var_0.owner; + + if ( var_0 == self.owner ) + return; + + if ( !isalliedsentient( self.owner, var_0 ) ) + var_8 = var_0; + } + + if ( isdefined( var_8 ) ) + { + var_8 notify( "destroyed_killstreak", var_1 ); + var_8 maps\mp\_utility::incplayerstat( var_4, 1 ); + level thread maps\mp\gametypes\_rank::awardgameevent( var_4, var_8, var_1, undefined, var_2 ); + + if ( isdefined( var_1 ) && var_1 == "killstreak_laser2_mp" && isdefined( level.sentrygun ) && isdefined( level.sentrygun.ownerlist ) ) + { + foreach ( var_10 in level.sentrygun.ownerlist ) + { + if ( var_10 != var_8 ) + { + var_10 notify( "destroyed_killstreak", var_1 ); + var_10 maps\mp\_utility::incplayerstat( var_4, 1 ); + level thread maps\mp\gametypes\_rank::awardgameevent( var_4, var_10, var_1, undefined, var_2 ); + } + } + } + + if ( isdefined( var_6 ) ) + level thread maps\mp\_utility::teamplayercardsplash( var_6, var_8 ); + + if ( isdefined( var_7 ) && var_7 ) + level thread maps\mp\gametypes\_missions::vehiclekilled( self.owner, self, undefined, var_8, var_3, var_2, var_1 ); + } + + thread maps\mp\_events::checkvandalismmedal( var_8 ); + + if ( isdefined( self.owner ) && isdefined( var_5 ) ) + self.owner thread maps\mp\_utility::leaderdialogonplayer( var_5, undefined, undefined, self.origin ); +} diff --git a/data/maps/mp/gametypes/_gamelogic.gsc b/data/maps/mp/gametypes/_gamelogic.gsc new file mode 100644 index 0000000..05384fb --- /dev/null +++ b/data/maps/mp/gametypes/_gamelogic.gsc @@ -0,0 +1,3548 @@ +// S1 GSC SOURCE +// Dumped 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 ) + wait 10; + else + wait 1.05; + + level.forfeit_aborted = 0; + var_1 = 20.0; + matchforfeittimer( var_1 ); + var_2 = &""; + + if ( !isdefined( var_0 ) ) + { + level.finalkillcam_winner = "none"; + var_2 = game["end_reason"]["players_forfeited"]; + var_3 = level.players[0]; + } + else if ( var_0 == "axis" ) + { + level.finalkillcam_winner = "axis"; + var_2 = game["end_reason"]["allies_forfeited"]; + + if ( level.gametype == "infect" ) + var_2 = game["end_reason"]["survivors_forfeited"]; + + var_3 = "axis"; + } + else if ( var_0 == "allies" ) + { + level.finalkillcam_winner = "allies"; + var_2 = game["end_reason"]["axis_forfeited"]; + + if ( level.gametype == "infect" ) + var_2 = game["end_reason"]["infected_forfeited"]; + + var_3 = "allies"; + } + else if ( level.multiteambased && issubstr( var_0, "team_" ) ) + var_3 = var_0; + 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; + setomnvar( "ui_match_countdown", 0 ); + setomnvar( "ui_match_countdown_title", 0 ); + setomnvar( "ui_match_countdown_toggle", 0 ); +} + +matchforfeittimer_internal( var_0 ) +{ + waittillframeend; + level endon( "match_forfeit_timer_beginning" ); + setomnvar( "ui_match_countdown_title", 3 ); + setomnvar( "ui_match_countdown_toggle", 1 ); + + while ( var_0 > 0 && !level.gameended && !level.forfeit_aborted && !level.ingraceperiod ) + { + setomnvar( "ui_match_countdown", var_0 ); + wait 1; + var_0--; + } +} + +matchforfeittimer( var_0 ) +{ + level notify( "match_forfeit_timer_beginning" ); + var_1 = int( var_0 ); + matchforfeittimer_internal( var_1 ); + setomnvar( "ui_match_countdown", 0 ); + setomnvar( "ui_match_countdown_title", 0 ); + setomnvar( "ui_match_countdown_toggle", 0 ); +} + +default_ondeadevent( var_0 ) +{ + level.finalkillcam_winner = "none"; + + if ( var_0 == "allies" ) + { + logstring( "team eliminated, win: opfor, allies: " + game["teamScores"]["allies"] + ", opfor: " + game["teamScores"]["axis"] ); + level.finalkillcam_winner = "axis"; + thread endgame( "axis", game["end_reason"]["allies_eliminated"] ); + } + else if ( var_0 == "axis" ) + { + logstring( "team eliminated, win: allies, allies: " + game["teamScores"]["allies"] + ", opfor: " + game["teamScores"]["axis"] ); + level.finalkillcam_winner = "allies"; + thread endgame( "allies", game["end_reason"]["axis_eliminated"] ); + } + else + { + logstring( "tie, allies: " + game["teamScores"]["allies"] + ", opfor: " + game["teamScores"]["axis"] ); + level.finalkillcam_winner = "none"; + + if ( level.teambased ) + thread endgame( "tie", game["end_reason"]["tie"] ); + else + thread endgame( undefined, game["end_reason"]["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, game["end_reason"]["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"; + } + + if ( maps\mp\_utility::practiceroundgame() ) + var_0 = "none"; + + 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["end_reason"]["time_limit_reached"] ); +} + +default_onhalftime( var_0 ) +{ + var_1 = undefined; + level.finalkillcam_winner = "none"; + thread endgame( "halftime", game["end_reason"][var_0] ); +} + +forceend() +{ + if ( level.hostforcedend || level.forcedend ) + return; + + var_0 = undefined; + level.finalkillcam_winner = "none"; + + if ( level.teambased ) + { + if ( isdefined( level.ishorde ) ) + var_0 = "axis"; + else 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 = game["end_reason"]["ended_game"]; + else + var_1 = game["end_reason"]["host_ended_game"]; + + thread endgame( var_0, var_1 ); +} + +onscorelimit() +{ + var_0 = game["end_reason"]["score_limit_reached"]; + var_1 = undefined; + level.finalkillcam_winner = "none"; + + if ( level.multiteambased ) + { + var_1 = maps\mp\gametypes\_gamescore::getwinningteam(); + + if ( var_1 == "none" ) + var_1 = "tie"; + } + else 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 && !getdvarint( "force_ranking" ) && ( !isdefined( level.disableforfeit ) || !level.disableforfeit ) ) + { + if ( level.multiteambased ) + { + var_0 = 0; + var_1 = 0; + + for ( var_2 = 0; var_2 < level.teamnamelist.size; var_2++ ) + { + var_0 += level.teamcount[level.teamnamelist[var_2]]; + + if ( level.teamcount[level.teamnamelist[var_2]] ) + var_1 += 1; + } + + for ( var_2 = 0; var_2 < level.teamnamelist.size; var_2++ ) + { + if ( var_0 == level.teamcount[level.teamnamelist[var_2]] && game["state"] == "playing" ) + { + thread onforfeit( level.teamnamelist[var_2] ); + return; + } + } + + if ( var_1 > 1 ) + { + level.forfeitinprogress = undefined; + level notify( "abort_forfeit" ); + } + } + else if ( level.teambased ) + { + if ( level.teamcount["allies"] < 1 && level.teamcount["axis"] > 0 && game["state"] == "playing" ) + { + thread onforfeit( "axis" ); + return; + } + + if ( level.teamcount["axis"] < 1 && level.teamcount["allies"] > 0 && game["state"] == "playing" ) + { + thread onforfeit( "allies" ); + 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 && !getdvarint( "virtualLobbyActive", 0 ) ) + { + 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.multiteambased ) + return; + + if ( level.teambased ) + { + var_3["allies"] = level.livescount["allies"]; + var_3["axis"] = level.livescount["axis"]; + + if ( isdefined( level.disablespawning ) && level.disablespawning ) + { + var_3["allies"] = 0; + var_3["axis"] = 0; + } + + if ( !level.alivecount["allies"] && !level.alivecount["axis"] && !var_3["allies"] && !var_3["axis"] ) + return [[ level.ondeadevent ]]( "all" ); + + if ( !level.alivecount["allies"] && !var_3["allies"] ) + return [[ level.ondeadevent ]]( "allies" ); + + if ( !level.alivecount["axis"] && !var_3["axis"] ) + return [[ level.ondeadevent ]]( "axis" ); + + var_4 = level.alivecount["allies"] == 1 && !var_3["allies"]; + var_5 = level.alivecount["axis"] == 1 && !var_3["axis"]; + + if ( ( var_4 || var_5 ) && !isdefined( level.bot_spawn_from_devgui_in_progress ) ) + { + var_6 = undefined; + + if ( var_4 && !isdefined( level.onelefttime["allies"] ) ) + { + level.onelefttime["allies"] = gettime(); + var_7 = [[ level.ononeleftevent ]]( "allies" ); + + if ( isdefined( var_7 ) ) + { + if ( !isdefined( var_6 ) ) + var_6 = var_7; + + var_6 = var_6 || var_7; + } + } + + if ( var_5 && !isdefined( level.onelefttime["axis"] ) ) + { + level.onelefttime["axis"] = gettime(); + var_8 = [[ level.ononeleftevent ]]( "axis" ); + + if ( isdefined( var_8 ) ) + { + if ( !isdefined( var_6 ) ) + var_6 = var_8; + + var_6 = var_6 || var_8; + } + } + + return var_6; + return; + } + } + else + { + if ( !level.alivecount["allies"] && !level.alivecount["axis"] && ( !level.livescount["allies"] && !level.livescount["axis"] ) ) + return [[ level.ondeadevent ]]( "all" ); + + var_9 = maps\mp\_utility::getpotentiallivingplayers(); + + if ( var_9.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_2 = var_1 + var_0 * 1000 - 200; + + if ( var_0 > 5 ) + var_3 = gettime() + getdvarint( "min_wait_for_players" ) * 1000; + else + var_3 = 0; + + if ( isdefined( level.iszombiegame ) && level.iszombiegame ) + var_4 = level.connectingplayers; + else + var_4 = level.connectingplayers / 3; + + var_5 = 0; + + for (;;) + { + if ( isdefined( game["roundsPlayed"] ) && game["roundsPlayed"] ) + break; + + var_6 = level.maxplayercount; + var_7 = gettime(); + + if ( var_6 >= var_4 && var_7 > var_3 || var_7 > var_2 ) + break; + + wait 0.05; + } +} + +prematchperiod() +{ + level endon( "game_ended" ); + level.connectingplayers = getdvarint( "party_partyPlayerCountNum" ); + + if ( level.prematchperiod > 0 ) + { + level.waitingforplayers = 1; + matchstarttimerwaitforplayers(); + level.waitingforplayers = 0; + } + 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(); + level.players[var_0] enableammogeneration(); + 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] thread maps\mp\gametypes\_hud_message::hintmessage( var_1 ); + } + + if ( game["state"] != "playing" ) + return; +} + +graceperiod() +{ + level endon( "game_ended" ); + + if ( !isdefined( game["clientActive"] ) ) + { + while ( getactiveclientcount() == 0 ) + wait 0.05; + + game["clientActive"] = 1; + } + + 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; + + level thread updategameevents(); +} + +sethasdonecombat( var_0, var_1 ) +{ + var_0.hasdonecombat = var_1; + var_0 notify( "hasDoneCombat" ); + var_2 = !isdefined( var_0.hasdoneanycombat ) || !var_0.hasdoneanycombat; + + if ( var_2 && var_1 ) + { + var_0.hasdoneanycombat = 1; + var_0.pers["participation"] = 1; + + if ( isdefined( var_0.pers["hasMatchLoss"] ) && var_0.pers["hasMatchLoss"] ) + return; + + updatelossstats( var_0 ); + } +} + +updatewinstats( var_0 ) +{ + if ( !var_0 maps\mp\_utility::rankingenabled() ) + return; + + if ( ( !isdefined( var_0.hasdoneanycombat ) || !var_0.hasdoneanycombat ) && !( level.gametype == "infect" ) ) + 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 ); + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_" + level.gametype + "_wins" ); + var_0.combatrecordwin = 1; + var_0 maps\mp\gametypes\_missions::processchallengedaily( 25, undefined, undefined ); + var_0 maps\mp\gametypes\_missions::processchallengedaily( 26, undefined, undefined ); + var_0 maps\mp\gametypes\_missions::processchallengedaily( 27, undefined, undefined ); + var_0 maps\mp\gametypes\_missions::processchallengedaily( 28, undefined, undefined ); + var_0 maps\mp\gametypes\_missions::processchallengedaily( 29, undefined, undefined ); + var_0 maps\mp\gametypes\_missions::processchallengedaily( 30, undefined, undefined ); + var_0 maps\mp\gametypes\_missions::processchallengedaily( 36, undefined, undefined ); + var_0 maps\mp\gametypes\_missions::processchallengedaily( 37, undefined, undefined ); + + if ( maps\mp\_utility::isgrapplinghookgamemode() ) + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_tier2_4_iw5_dlcgun12" ); + + if ( level.players.size > 5 ) + { + superstarchallenge( var_0 ); + + switch ( level.gametype ) + { + case "war": + if ( game["teamScores"][var_0.team] >= game["teamScores"][maps\mp\_utility::getotherteam( var_0.team )] + 20 ) + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_war_crushing" ); + + break; + case "hp": + if ( game["teamScores"][var_0.team] >= game["teamScores"][maps\mp\_utility::getotherteam( var_0.team )] + 70 ) + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_hp_crushing" ); + + break; + case "conf": + if ( game["teamScores"][var_0.team] >= game["teamScores"][maps\mp\_utility::getotherteam( var_0.team )] + 15 ) + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_conf_crushing" ); + + break; + case "ball": + if ( game["teamScores"][var_0.team] >= game["teamScores"][maps\mp\_utility::getotherteam( var_0.team )] + 7 ) + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_ball_crushing" ); + + break; + case "infect": + if ( var_0.team == "allies" ) + { + if ( game["teamScores"][var_0.team] >= 4 ) + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_infect_crushing" ); + + if ( game["teamScores"][maps\mp\_utility::getotherteam( var_0.team )] == 1 ) + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_infect_cleanup" ); + } + + break; + case "dm": + if ( isdefined( level.placement["all"][0] ) ) + { + var_2 = level.placement["all"][0]; + var_3 = 9999; + + if ( var_0 == var_2 ) + { + foreach ( var_5 in level.players ) + { + if ( var_0 == var_5 ) + continue; + + var_6 = var_0.score - var_5.score; + + if ( var_6 < var_3 ) + var_3 = var_6; + } + + if ( var_3 >= 7 ) + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_dm_crushing" ); + } + } + + break; + case "gun": + foreach ( var_9 in level.players ) + { + if ( var_0 == var_9 ) + continue; + + if ( var_0.score < var_9.score + 5 ) + break; + } + + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_gun_crushing" ); + break; + case "twar": + case "ctf": + if ( game["shut_out"][var_0.team] ) + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_" + level.gametype + "_crushing" ); + + break; + } + } +} + +superstarchallenge( var_0 ) +{ + var_1 = 0; + var_2 = 9999; + + foreach ( var_4 in level.players ) + { + if ( var_4.kills > var_1 ) + var_1 = var_4.kills; + + if ( var_4.deaths < var_2 ) + var_2 = var_4.deaths; + } + + if ( var_0.kills >= var_1 && var_0.deaths <= var_2 && var_0.kills > 0 && !isai( var_0 ) ) + var_0 maps\mp\gametypes\_missions::processchallenge( "ch_" + level.gametype + "_star" ); +} + +checkgameendchallenges() +{ + if ( level.gametype == "dom" ) + { + foreach ( var_1 in level.domflags ) + { + if ( !isdefined( var_1.ownedtheentireround ) || !var_1.ownedtheentireround ) + continue; + + var_2 = var_1 maps\mp\gametypes\_gameobjects::getownerteam(); + + foreach ( var_4 in level.players ) + { + if ( var_4.team != var_2 ) + continue; + + switch ( var_1.label ) + { + case "_a": + var_4 maps\mp\gametypes\_missions::processchallenge( "ch_dom_alphalock" ); + break; + case "_b": + var_4 maps\mp\gametypes\_missions::processchallenge( "ch_dom_bravolock" ); + break; + case "_c": + var_4 maps\mp\gametypes\_missions::processchallenge( "ch_dom_charlielock" ); + break; + } + } + } + } +} + +updatelossstats( var_0 ) +{ + if ( !var_0 maps\mp\_utility::rankingenabled() ) + return; + + if ( !isdefined( var_0.hasdoneanycombat ) || !var_0.hasdoneanycombat ) + return; + + var_0.pers["hasMatchLoss"] = 1; + 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 ); + var_0.combatrecordtie = 1; +} + +updatewinlossstats( var_0 ) +{ + if ( maps\mp\_utility::privatematch() ) + return; + + if ( maps\mp\_utility::practiceroundgame() ) + return; + + if ( !isdefined( var_0 ) || isdefined( var_0 ) && isstring( var_0 ) && var_0 == "tie" ) + { + foreach ( var_2 in level.players ) + { + if ( isdefined( var_2.connectedpostgame ) ) + continue; + + if ( level.hostforcedend && var_2 ishost() ) + { + var_2 maps\mp\gametypes\_persistence::statset( "currentWinStreak", 0 ); + continue; + } + + updatetiestats( var_2 ); + } + } + else if ( isplayer( var_0 ) ) + { + var_4[0] = var_0; + + if ( level.players.size > 5 ) + var_4 = maps\mp\gametypes\_gamescore::gethighestscoringplayersarray( 3 ); + + foreach ( var_2 in var_4 ) + { + if ( isdefined( var_2.connectedpostgame ) ) + continue; + + if ( level.hostforcedend && var_2 ishost() ) + { + var_2 maps\mp\gametypes\_persistence::statset( "currentWinStreak", 0 ); + continue; + } + + updatewinstats( var_2 ); + } + } + else if ( isstring( var_0 ) ) + { + foreach ( var_2 in level.players ) + { + if ( isdefined( var_2.connectedpostgame ) ) + continue; + + if ( level.hostforcedend && var_2 ishost() ) + { + var_2 maps\mp\gametypes\_persistence::statset( "currentWinStreak", 0 ); + continue; + } + + if ( var_0 == "tie" ) + { + updatetiestats( var_2 ); + continue; + } + + if ( var_2.pers["team"] == var_0 ) + { + updatewinstats( var_2 ); + continue; + } + + var_2 maps\mp\gametypes\_persistence::statset( "currentWinStreak", 0 ); + } + } + + if ( level.players.size > 5 ) + { + var_4 = maps\mp\gametypes\_gamescore::gethighestscoringplayersarray( 3 ); + + for ( var_9 = 0; var_9 < var_4.size; var_9++ ) + { + if ( var_9 == 0 ) + var_4[var_9] maps\mp\gametypes\_missions::processchallenge( "ch_" + level.gametype + "_mvp" ); + + var_4[var_9] maps\mp\gametypes\_missions::processchallenge( "ch_" + level.gametype + "_superior" ); + } + } +} + +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::practiceroundgame() ) + return; + + if ( level.teambased ) + { + if ( var_0 == "allies" ) + { + var_1 = "allies"; + var_2 = "axis"; + } + else if ( var_0 == "axis" ) + { + var_1 = "axis"; + var_2 = "allies"; + } + else + { + var_1 = "tie"; + var_2 = "tie"; + } + + if ( var_1 != "tie" ) + setwinningteam( var_1 ); + + foreach ( var_4 in level.players ) + { + if ( isdefined( var_4.connectedpostgame ) ) + continue; + + if ( !var_4 maps\mp\_utility::rankingenabled() ) + continue; + + if ( var_4.timeplayed["total"] < 1 || var_4.pers["participation"] < 1 ) + continue; + + if ( level.hostforcedend && var_4 ishost() ) + continue; + + var_5 = 0; + + if ( var_1 == "tie" ) + { + var_5 = maps\mp\gametypes\_rank::getscoreinfovalue( "tie" ); + var_4.didtie = 1; + var_4.iswinner = 0; + } + else if ( isdefined( var_4.pers["team"] ) && var_4.pers["team"] == var_1 ) + { + var_5 = maps\mp\gametypes\_rank::getscoreinfovalue( "win" ); + var_4.iswinner = 1; + } + else if ( isdefined( var_4.pers["team"] ) && var_4.pers["team"] == var_2 ) + { + var_5 = maps\mp\gametypes\_rank::getscoreinfovalue( "loss" ); + var_4.iswinner = 0; + } + + var_4.matchbonus = int( var_5 ); + } + } + else + { + foreach ( var_4 in level.players ) + { + if ( isdefined( var_4.connectedpostgame ) ) + continue; + + if ( !var_4 maps\mp\_utility::rankingenabled() ) + continue; + + if ( var_4.timeplayed["total"] < 1 || var_4.pers["participation"] < 1 ) + continue; + + if ( level.hostforcedend && var_4 ishost() ) + continue; + + var_4.iswinner = 0; + + for ( var_8 = 0; var_8 < min( level.placement["all"].size, 3 ); var_8++ ) + { + if ( level.placement["all"][var_8] != var_4 ) + continue; + + var_4.iswinner = 1; + } + + var_5 = 0; + + if ( var_4.iswinner ) + var_5 = maps\mp\gametypes\_rank::getscoreinfovalue( "win" ); + else + var_5 = maps\mp\gametypes\_rank::getscoreinfovalue( "loss" ); + + var_4.matchbonus = int( var_5 ); + } + } + + foreach ( var_4 in level.players ) + { + if ( !isdefined( var_4 ) ) + continue; + + if ( !isdefined( var_4.iswinner ) ) + continue; + + var_11 = "loss"; + + if ( var_4.iswinner ) + var_11 = "win"; + + if ( isdefined( var_4.didtie ) && var_4.didtie ) + var_11 = "tie"; + + var_4 thread givematchbonus( var_11, var_4.matchbonus ); + } +} + +givematchbonus( var_0, var_1 ) +{ + self endon( "disconnect" ); + level waittill( "give_match_bonus" ); + maps\mp\gametypes\_rank::giverankxp( var_0, var_1 ); + maps\mp\_utility::logxpgains(); +} + +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; + + var_4 = var_3.score; + + if ( maps\mp\_utility::getminutespassed() ) + var_4 = var_3.score / maps\mp\_utility::getminutespassed(); + + setplayerteamrank( var_3, var_3.clientid, int( var_4 ) ); + } +} + +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; + + if ( maps\mp\_utility::gettimepassedpercentage() > level.timepercentagecutoff ) + setnojiptime( 1 ); + + var_1 = gettimeremaining(); + + if ( maps\mp\_utility::gethalftime() && game["status"] != "halftime" ) + setgameendtime( gettime() + int( var_1 ) - int( maps\mp\_utility::gettimelimit() * 60 * 1000 * 0.5 ) ); + else + setgameendtime( gettime() + int( var_1 ) ); + + if ( var_1 > 0 ) + { + if ( maps\mp\_utility::gethalftime() && checkhalftime( var_0 ) ) + [[ level.onhalftime ]]( "time_limit_reached" ); + + return; + } + + [[ level.ontimelimit ]](); +} + +checkhalftimescore() +{ + if ( !level.halftimeonscorelimit ) + return 0; + + if ( !level.teambased ) + return 0; + + if ( game["status"] != "normal" ) + return 0; + + var_0 = maps\mp\_utility::getwatcheddvar( "scorelimit" ); + + if ( var_0 ) + { + if ( game["teamScores"]["allies"] >= var_0 || game["teamScores"]["axis"] >= var_0 ) + return 0; + + var_1 = int( var_0 / 2 + 0.5 ); + + if ( game["teamScores"]["allies"] >= var_1 || game["teamScores"]["axis"] >= var_1 ) + { + game["roundMillisecondsAlreadyPassed"] = maps\mp\_utility::gettimepassed(); + game["round_time_to_beat"] = maps\mp\_utility::getminutespassed(); + return 1; + } + } + + return 0; +} + +checkhalftime( var_0 ) +{ + if ( !level.teambased ) + return 0; + + if ( game["status"] != "normal" ) + 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() +{ + var_0 = maps\mp\_utility::gettimepassed(); + var_1 = maps\mp\_utility::gettimelimit() * 60 * 1000; + + if ( maps\mp\_utility::gethalftime() && game["status"] == "halftime" && isdefined( level.firsthalftimepassed ) ) + { + var_2 = var_1 * 0.5; + + if ( level.firsthalftimepassed < var_2 ) + { + if ( level.halftimeonscorelimit ) + var_0 = var_1 - level.firsthalftimepassed + var_0 - level.firsthalftimepassed; + else + var_0 += var_2 - level.firsthalftimepassed; + } + } + + return var_1 - var_0; +} + +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" ) + 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 ( maps\mp\_utility::gethalftime() && checkhalftimescore() ) + return [[ level.onhalftime ]]( "score_limit_reached" ); + else if ( level.multiteambased ) + { + var_0 = 0; + + for ( var_1 = 0; var_1 < level.teamnamelist.size; var_1++ ) + { + if ( game["teamScores"][level.teamnamelist[var_1]] >= maps\mp\_utility::getwatcheddvar( "scorelimit" ) ) + var_0 = 1; + } + + if ( !var_0 ) + return 0; + } + else 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; + } +} + +matchstarttimerwaitforplayers() +{ + setomnvar( "ui_match_countdown_title", 6 ); + setomnvar( "ui_match_countdown_toggle", 0 ); + + if ( level.currentgen ) + setomnvar( "ui_cg_world_blur", 1 ); + + waitforplayers( level.prematchperiod ); + + if ( level.prematchperiodend > 0 && !isdefined( level.hostmigrationtimer ) ) + matchstarttimer( level.prematchperiodend ); +} + +matchstarttimer_internal( var_0 ) +{ + waittillframeend; + level endon( "match_start_timer_beginning" ); + setomnvar( "ui_match_countdown_title", 1 ); + setomnvar( "ui_match_countdown_toggle", 1 ); + + while ( var_0 > 0 && !level.gameended ) + { + setomnvar( "ui_match_countdown", var_0 ); + var_0--; + + if ( level.currentgen ) + setomnvar( "ui_cg_world_blur", 1 ); + + wait 1; + } + + if ( level.currentgen ) + setomnvar( "ui_cg_world_blur_fade_out", 1 ); + + if ( level.xpscale > 1 && !( isdefined( level.ishorde ) && level.ishorde ) && !maps\mp\_utility::privatematch() && !maps\mp\_utility::practiceroundgame() && !( isdefined( level.iszombiegame ) && level.iszombiegame ) ) + { + foreach ( var_2 in level.players ) + var_2 thread maps\mp\gametypes\_hud_message::splashnotify( "double_xp" ); + } + + setomnvar( "ui_match_countdown_toggle", 0 ); + setomnvar( "ui_match_countdown", 0 ); + setomnvar( "ui_match_countdown_title", 2 ); + level endon( "match_forfeit_timer_beginning" ); + wait 1.5; + setomnvar( "ui_match_countdown_title", 0 ); +} + +matchstarttimer( var_0 ) +{ + self notify( "matchStartTimer" ); + self endon( "matchStartTimer" ); + level notify( "match_start_timer_beginning" ); + var_1 = int( var_0 ); + + if ( var_1 >= 2 ) + { + matchstarttimer_internal( var_1 ); + visionsetnaked( "", 3.0 ); + } + else + { + if ( level.currentgen ) + setomnvar( "ui_cg_world_blur_fade_out", 1 ); + + if ( level.xpscale > 1 && !( isdefined( level.ishorde ) && level.ishorde ) && !maps\mp\_utility::privatematch() && !maps\mp\_utility::practiceroundgame() && !( isdefined( level.iszombiegame ) && level.iszombiegame ) ) + { + foreach ( var_3 in level.players ) + var_3 thread maps\mp\gametypes\_hud_message::splashnotify( "double_xp" ); + } + + visionsetnaked( "", 1.0 ); + } +} + +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"]; + + level.halftimetype = "overtime"; + game["dynamicEvent_Overtime"] = 1; + } + 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 += 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 ) +{ + foreach ( var_3 in level.players ) + var_3 maps\mp\gametypes\_damage::streamfinalkillcam(); + + var_5 = 0; + + while ( !var_5 ) + { + var_6 = level.players; + var_5 = 1; + + foreach ( var_3 in var_6 ) + { + if ( !isdefined( var_3.doingsplash ) ) + continue; + + if ( !var_3 maps\mp\gametypes\_hud_message::isdoingsplash() ) + continue; + + var_5 = 0; + } + + wait 0.5; + } + + if ( !var_1 ) + { + wait(var_0); + var_6 = level.players; + + foreach ( var_3 in var_6 ) + var_3 setclientomnvar( "ui_round_end", 0 ); + + level notify( "round_end_finished" ); + return; + } + + wait(var_0 / 2); + level notify( "give_match_bonus" ); + wait(var_0 / 2); + var_5 = 0; + + while ( !var_5 ) + { + var_6 = level.players; + var_5 = 1; + + foreach ( var_3 in var_6 ) + { + if ( !isdefined( var_3.doingsplash ) ) + continue; + + if ( !var_3 maps\mp\gametypes\_hud_message::isdoingsplash() ) + continue; + + var_5 = 0; + } + + wait 0.5; + } + + var_6 = level.players; + + foreach ( var_3 in var_6 ) + var_3 setclientomnvar( "ui_round_end", 0 ); + + level notify( "round_end_finished" ); +} + +roundenddof( var_0 ) +{ + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); +} + +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; + setdvar( "bg_compassShowEnemies", getdvar( "scr_game_forceuav" ) ); + + if ( !isdefined( game["gamestarted"] ) ) + { + game["clientid"] = 0; + var_0 = getmapcustom( "allieschar" ); + + if ( !isdefined( var_0 ) || var_0 == "" ) + { + if ( !isdefined( game["allies"] ) ) + var_0 = "sentinel"; + else + var_0 = game["allies"]; + } + + var_1 = getmapcustom( "axischar" ); + + if ( !isdefined( var_1 ) || var_1 == "" ) + { + if ( !isdefined( game["axis"] ) ) + var_1 = "atlas"; + else + var_1 = game["axis"]; + } + + if ( level.multiteambased ) + { + var_2 = getmapcustom( "allieschar" ); + + if ( !isdefined( var_2 ) || var_2 == "" ) + var_2 = "delta_multicam"; + + for ( var_3 = 0; var_3 < level.teamnamelist.size; var_3++ ) + game[level.teamnamelist[var_3]] = var_2; + } + + 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"; + + 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"]["press_to_spawn"] = &"PLATFORM_PRESS_TO_SPAWN"; + 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_tag_wait"] = &"MP_SPAWN_TAG_WAIT"; + game["strings"]["spawn_next_round"] = &"MP_SPAWN_NEXT_ROUND"; + game["strings"]["waiting_to_spawn"] = &"MP_WAITING_TO_SPAWN"; + game["strings"]["match_starting"] = &"MP_MATCH_STARTING"; + game["strings"]["change_class"] = &"MP_CHANGE_CLASS_NEXT_SPAWN"; + game["strings"]["change_class_cancel"] = &"MP_CHANGE_CLASS_CANCEL"; + game["strings"]["change_class_wait"] = &"MP_CHANGE_CLASS_WAIT"; + game["strings"]["last_stand"] = &"MPUI_LAST_STAND"; + game["strings"]["final_stand"] = &"MPUI_FINAL_STAND"; + game["strings"]["cowards_way"] = &"PLATFORM_COWARDS_WAY_OUT"; + 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"]["grey"] = ( 0.5, 0.5, 0.5 ); + 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["colors"]["cyan"] = ( 0.35, 0.7, 0.9 ); + 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_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 ]](); + setdvarifuninitialized( "min_wait_for_players", 5 ); + + if ( level.console ) + { + if ( !level.splitscreen ) + { + if ( isdedicatedserver() ) + level.prematchperiod = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "graceperiod_ds" ); + else + level.prematchperiod = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "graceperiod" ); + + level.prematchperiodend = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "matchstarttime" ); + } + } + else + { + if ( isdedicatedserver() ) + level.prematchperiod = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "playerwaittime_ds" ); + else + level.prematchperiod = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "playerwaittime" ); + + level.prematchperiodend = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "matchstarttime" ); + } + } + else + { + setdvarifuninitialized( "min_wait_for_players", 5 ); + + if ( level.console ) + { + if ( !level.splitscreen ) + { + level.prematchperiod = 5; + level.prematchperiodend = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "roundstarttime" ); + } + } + else + { + level.prematchperiod = 5; + level.prematchperiodend = maps\mp\gametypes\_tweakables::gettweakablevalue( "game", "roundstarttime" ); + } + } + + if ( !isdefined( game["status"] ) ) + game["status"] = "normal"; + + if ( game["status"] != "overtime" && game["status"] != "halftime" && game["status"] != "overtime_halftime" ) + { + game["teamScores"]["allies"] = 0; + game["teamScores"]["axis"] = 0; + + if ( level.multiteambased ) + { + for ( var_3 = 0; var_3 < level.teamnamelist.size; var_3++ ) + game["teamScores"][level.teamnamelist[var_3]] = 0; + } + } + + if ( !isdefined( game["timePassed"] ) ) + game["timePassed"] = 0; + + if ( !isdefined( game["roundsPlayed"] ) ) + game["roundsPlayed"] = 0; + + setomnvar( "ui_current_round", game["roundsPlayed"] + 1 ); + + 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; + + if ( level.multiteambased ) + { + for ( var_3 = 0; var_3 < level.teamnamelist.size; var_3++ ) + { + if ( !isdefined( game["roundsWon"][level.teamnamelist[var_3]] ) ) + game["roundsWon"][level.teamnamelist[var_3]] = 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" ); + + if ( !isdefined( level.iszombiegame ) ) + level.iszombiegame = 0; + + level.usestartspawns = 1; + level.objectivepointsmod = 1; + level.baseplayermovescale = 1; + level.maxallowedteamkills = 2; + thread maps\mp\_teleport::main(); + 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\gametypes\_high_jump_mp::init(); + thread maps\mp\_grappling_hook::init(); + thread maps\mp\_matchdata::init(); + thread maps\mp\_awards::init(); + thread maps\mp\_areas::init(); + + if ( !maps\mp\_utility::invirtuallobby() ) + thread maps\mp\killstreaks\_killstreaks_init::init(); + + thread maps\mp\perks\_perks::init(); + thread maps\mp\_events::init(); + thread maps\mp\gametypes\_damage::initfinalkillcam(); + thread maps\mp\_threatdetection::init(); + thread maps\mp\_exo_suit::init(); + thread maps\mp\_reinforcements::init(); + thread maps\mp\_snd_common_mp::init(); + thread maps\mp\_utility::buildattachmentmaps(); + + if ( level.teambased ) + thread maps\mp\gametypes\_friendicons::init(); + + thread maps\mp\gametypes\_hud_message::init(); + thread maps\mp\gametypes\_divisions::init(); + + foreach ( var_5 in game["strings"] ) + precachestring( var_5 ); + + foreach ( var_8 in game["icons"] ) + precacheshader( var_8 ); + + 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 = []; + + if ( level.multiteambased ) + { + for ( var_3 = 0; var_3 < level.teamnamelist.size; var_3++ ) + { + level._wavedelay[level.teamnamelist[var_3]] = 0; + level._lastwave[level.teamnamelist[var_3]] = 0; + level._waveplayerspawnindex[level.teamnamelist[var_3]] = 0; + level._aliveplayers[level.teamnamelist[var_3]] = []; + } + } + + setdvar( "ui_scorelimit", 0 ); + setdvar( "ui_allow_teamchange", 1 ); + + if ( maps\mp\_utility::getgametypenumlives() ) + setdvar( "g_deadChat", 0 ); + else + setdvar( "g_deadChat", 1 ); + + var_10 = getdvarfloat( "scr_" + level.gametype + "_waverespawndelay" ); + + if ( var_10 > 0 ) + { + level.wavedelay["allies"] = var_10; + level.wavedelay["axis"] = var_10; + level.lastwave["allies"] = 0; + level.lastwave["axis"] = 0; + + if ( level.multiteambased ) + { + for ( var_3 = 0; var_3 < level.teamnamelist.size; var_3++ ) + { + level._wavedelay[level.teamnamelist[var_3]] = var_10; + level._lastwave[level.teamnamelist[var_3]] = 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" ); + + if ( level.multiteambased ) + { + for ( var_3 = 0; var_3 < level.teamnamelist.size; var_3++ ) + maps\mp\gametypes\_gamescore::updateteamscore( level.teamnamelist[var_3] ); + } + } + else + thread maps\mp\gametypes\_gamescore::initialdmscoreupdate(); + + thread updateuiscorelimit(); + level notify( "update_scorelimit" ); + [[ level.onstartgametype ]](); + level.scorepercentagecutoff = getdvarint( "scr_" + level.gametype + "_score_percentage_cut_off", 80 ); + level.timepercentagecutoff = getdvarint( "scr_" + level.gametype + "_time_percentage_cut_off", 80 ); + + if ( !level.console && ( getdvar( "dedicated" ) == "dedicated LAN server" || getdvar( "dedicated" ) == "dedicated internet server" ) ) + thread verifydedicatedconfiguration(); + + setattackingteam(); + thread startgame(); + level thread maps\mp\_utility::updatewatcheddvars(); + level thread timelimitthread(); + level thread maps\mp\gametypes\_damage::dofinalkillcam(); +} + +setattackingteam() +{ + if ( game["attackers"] == "axis" ) + var_0 = 1; + else if ( game["attackers"] == "allies" ) + var_0 = 2; + else + var_0 = 0; + + setomnvar( "ui_attacking_team", var_0 ); +} + +callback_codeendgame() +{ + endparty(); + + if ( !level.gameended ) + level thread forceend(); +} + +verifydedicatedconfiguration() +{ + for (;;) + { + if ( level.rankedmatch ) + exitlevel( 0 ); + + if ( !getdvarint( "xblive_privatematch" ) ) + exitlevel( 0 ); + + if ( getdvar( "dedicated" ) != "dedicated LAN server" && getdvar( "dedicated" ) != "dedicated internet server" ) + exitlevel( 0 ); + + wait 5; + } +} + +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 -= 1; + wait 1; + } + else if ( var_0 > 4 ) + { + var_0 -= 0.5; + wait 0.5; + } + else if ( var_0 > 1 ) + { + var_0 -= 0.4; + wait 0.4; + } + else + { + 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 ); + var_3 = int( maps\mp\_utility::gettimelimit() * 60 * 0.5 ); + + if ( maps\mp\_utility::gethalftime() && var_2 > var_3 ) + var_2 -= var_3; + + 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; + level.matchdurationstarttime = gettime(); + + if ( isdefined( game["roundMillisecondsAlreadyPassed"] ) ) + { + level.starttime -= game["roundMillisecondsAlreadyPassed"]; + level.firsthalftimepassed = game["roundMillisecondsAlreadyPassed"]; + game["roundMillisecondsAlreadyPassed"] = undefined; + } + + var_0 = gettime(); + + while ( game["state"] == "playing" ) + { + if ( !level.timerstopped ) + 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 += gettime() - level.timerpausetime; + } +} + +pausetimer() +{ + level.timerstoppedforgamemode = 1; + updatetimerpausedness(); +} + +resumetimer() +{ + level.timerstoppedforgamemode = 0; + updatetimerpausedness(); +} + +startgame() +{ + thread gametimer(); + level.timerstopped = 0; + level.timerstoppedforgamemode = 0; + setdvar( "ui_inprematch", 1 ); + prematchperiod(); + maps\mp\_utility::gameflagset( "prematch_done" ); + level notify( "prematch_over" ); + setdvar( "ui_inprematch", 0 ); + level.prematch_done_time = gettime(); + updatetimerpausedness(); + thread timelimitclock(); + thread graceperiod(); + thread maps\mp\gametypes\_missions::roundbegin(); + thread maps\mp\_matchdata::matchstarted(); + var_0 = isdefined( level.ishorde ) && level.ishorde; + var_1 = isdefined( level.iszombiegame ) && level.iszombiegame; + + if ( var_0 || var_1 ) + thread updategameduration(); + + lootserviceonstartgame(); +} + +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; + } + + if ( level.multiteambased ) + { + for ( var_1 = 0; var_1 < level.teamnamelist.size; var_1++ ) + { + if ( var_0 - level.lastwave[level.teamnamelist[var_1]] > level._wavedelay[level.teamnamelist[var_1]] * 1000 ) + { + var_2 = "wave_rewpawn_" + level.teamnamelist[var_1]; + level notify( var_2 ); + level.lastwave[level.teamnamelist[var_1]] = var_0; + level.waveplayerspawnindex[level.teamnamelist[var_1]] = 0; + } + } + } + + wait 0.05; + } +} + +getbetterteam() +{ + var_0["allies"] = 0; + var_0["axis"] = 0; + var_1["allies"] = 0; + var_1["axis"] = 0; + var_2["allies"] = 0; + var_2["axis"] = 0; + + foreach ( var_4 in level.players ) + { + var_5 = var_4.pers["team"]; + + if ( isdefined( var_5 ) && ( var_5 == "allies" || var_5 == "axis" ) ) + { + var_0[var_5] += var_4.score; + var_1[var_5] += var_4.kills; + var_2[var_5] += var_4.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 ( var_2["allies"] < var_2["axis"] ) + return "allies"; + else if ( var_2["axis"] < var_2["allies"] ) + return "axis"; + + if ( randomint( 2 ) == 0 ) + return "allies"; + + return "axis"; +} + +rankedmatchupdates( var_0 ) +{ + if ( !maps\mp\_utility::waslastround() ) + return; + + var_0 = getgamewinner( var_0, 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 ) +{ + if ( !maps\mp\_utility::practiceroundgame() ) + { + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.connectedpostgame ) || var_3.pers["team"] == "spectator" && !var_3 ismlgspectator() ) + 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 ) +{ + if ( !maps\mp\_utility::practiceroundgame() ) + { + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.connectedpostgame ) || var_3.pers["team"] == "spectator" && !var_3 ismlgspectator() ) + continue; + + if ( level.teambased ) + { + var_3 thread maps\mp\gametypes\_hud_message::teamoutcomenotify( var_0, 0, var_1, 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" && !var_2 ismlgspectator() ) + continue; + + var_2 thread maps\mp\gametypes\_hud_message::teamoutcomenotify( var_0, 1, game["end_reason"]["switching_sides"] ); + } + + roundendwait( level.halftimeroundenddelay, 0 ); +} + +freezeallplayers( var_0, var_1 ) +{ + if ( !isdefined( var_0 ) ) + var_0 = 0; + + foreach ( var_3 in level.players ) + { + var_3 disableammogeneration(); + var_3 thread freezeplayerforroundend( var_0 ); + var_3 thread roundenddof( 4.0 ); + var_3 freegameplayhudelems(); + + if ( isdefined( var_1 ) && var_1 ) + { + continue; + } + } + + if ( isdefined( level.agentarray ) ) + { + foreach ( var_6 in level.agentarray ) + var_6 maps\mp\_utility::freezecontrolswrapper( 1 ); + } +} + +endgameovertime( var_0, var_1 ) +{ + setdvar( "bg_compassShowEnemies", 0 ); + freezeallplayers( 1.0, 1 ); + + foreach ( var_3 in level.players ) + { + var_3.pers["stats"] = var_3.stats; + var_3.pers["segments"] = var_3.segments; + } + + level notify( "round_switch", "overtime" ); + var_5 = 0; + var_6 = var_0 == "overtime"; + + if ( level.gametype == "ctf" ) + { + var_0 = "tie"; + var_5 = 1; + + if ( game["teamScores"]["axis"] > game["teamScores"]["allies"] ) + var_0 = "axis"; + + if ( game["teamScores"]["allies"] > game["teamScores"]["axis"] ) + var_0 = "allies"; + } + + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.connectedpostgame ) || var_3.pers["team"] == "spectator" && !var_3 ismlgspectator() ) + continue; + + if ( level.teambased ) + { + var_3 thread maps\mp\gametypes\_hud_message::teamoutcomenotify( var_0, var_5, var_1 ); + continue; + } + + var_3 thread maps\mp\gametypes\_hud_message::outcomenotify( var_0, var_1 ); + } + + roundendwait( level.roundenddelay, 0 ); + + if ( level.gametype == "ctf" ) + var_0 = "overtime_halftime"; + + if ( isdefined( level.finalkillcam_winner ) && var_6 ) + { + 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(); + + if ( level.gametype == "ctf" ) + { + var_0 = "overtime"; + var_1 = game["end_reason"]["tie"]; + } + + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.connectedpostgame ) || var_3.pers["team"] == "spectator" && !var_3 ismlgspectator() ) + 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.halftimeroundenddelay, 0 ); + } + + game["status"] = var_0; + level notify( "restarting" ); + game["state"] = "playing"; + setdvar( "ui_game_state", game["state"] ); + map_restart( 1 ); +} + +endgamehalftime( var_0 ) +{ + setdvar( "bg_compassShowEnemies", 0 ); + var_1 = "halftime"; + var_2 = 1; + + if ( isdefined( level.halftime_switch_sides ) && !level.halftime_switch_sides ) + var_2 = 0; + + if ( var_2 ) + { + game["switchedsides"] = !game["switchedsides"]; + var_3 = game["end_reason"]["switching_sides"]; + } + else + var_3 = var_0; + + freezeallplayers( 1.0, 1 ); + + if ( level.gametype == "ctf" ) + { + var_3 = var_0; + var_1 = "tie"; + + if ( game["teamScores"]["axis"] > game["teamScores"]["allies"] ) + var_1 = "axis"; + + if ( game["teamScores"]["allies"] > game["teamScores"]["axis"] ) + var_1 = "allies"; + } + + foreach ( var_5 in level.players ) + { + var_5.pers["stats"] = var_5.stats; + var_5.pers["segments"] = var_5.segments; + } + + level notify( "round_switch", "halftime" ); + + foreach ( var_5 in level.players ) + { + if ( isdefined( var_5.connectedpostgame ) || var_5.pers["team"] == "spectator" && !var_5 ismlgspectator() ) + continue; + + var_5 thread maps\mp\gametypes\_hud_message::teamoutcomenotify( var_1, 1, var_3 ); + } + + roundendwait( level.roundenddelay, 0 ); + + if ( isdefined( level.finalkillcam_winner ) ) + { + level.finalkillcam_timegameended[level.finalkillcam_winner] = maps\mp\_utility::getsecondspassed(); + + foreach ( var_5 in level.players ) + var_5 notify( "reset_outcome" ); + + level notify( "game_cleanup" ); + waittillfinalkillcamdone(); + var_11 = game["end_reason"]["switching_sides"]; + + if ( !var_2 ) + var_11 = var_3; + + foreach ( var_5 in level.players ) + { + if ( isdefined( var_5.connectedpostgame ) || var_5.pers["team"] == "spectator" && !var_5 ismlgspectator() ) + continue; + + var_5 thread maps\mp\gametypes\_hud_message::teamoutcomenotify( "halftime", 1, var_11 ); + } + + roundendwait( level.halftimeroundenddelay, 0 ); + } + + game["status"] = "halftime"; + level notify( "restarting" ); + game["state"] = "playing"; + setdvar( "ui_game_state", game["state"] ); + map_restart( 1 ); +} + +updategameduration() +{ + level endon( "game_ended" ); + + for (;;) + { + var_0 = getgameduration(); + setomnvar( "ui_game_duration", var_0 * 1000 ); + wait 1.0; + } +} + +getgameduration() +{ + var_0 = maps\mp\_utility::getgametimepassedseconds(); + + if ( isdefined( level.ishorde ) && level.ishorde ) + var_0 = gamedurationclamp( var_0 ); + + return var_0; +} + +gamedurationclamp( var_0 ) +{ + if ( var_0 > 86399 ) + return 86399; + + return var_0; +} + +endgame( var_0, var_1, var_2 ) +{ + if ( !isdefined( var_2 ) ) + var_2 = 0; + + if ( game["state"] == "postgame" || level.gameended ) + return; + + game["state"] = "postgame"; + setdvar( "ui_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" ); + var_3 = getgameduration(); + setomnvar( "ui_game_duration", var_3 * 1000 ); + waitframe(); + setgameendtime( 0 ); + setmatchdata( "gameLengthSeconds", var_3 ); + setmatchdata( "endTimeUTC", getsystemtime() ); + checkgameendchallenges(); + + if ( isdefined( var_0 ) && isstring( var_0 ) && maps\mp\_utility::isovertimetext( var_0 ) ) + { + 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( var_1 ); + return; + } + + if ( isdefined( level.finalkillcam_winner ) ) + level.finalkillcam_timegameended[level.finalkillcam_winner] = maps\mp\_utility::getsecondspassed(); + + game["roundsPlayed"]++; + setomnvar( "ui_current_round", game["roundsPlayed"] ); + + if ( level.teambased ) + { + if ( ( var_0 == "axis" || var_0 == "allies" ) && level.gametype != "ctf" ) + 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( 1 ); + } + + setdvar( "g_deadChat", 1 ); + setdvar( "ui_allow_teamchange", 0 ); + setdvar( "bg_compassShowEnemies", 0 ); + freezeallplayers( 1.0, 1 ); + + if ( !maps\mp\_utility::wasonlyround() && !var_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; + var_5.pers["segments"] = var_5.segments; + } + + level notify( "restarting" ); + game["state"] = "playing"; + setdvar( "ui_game_state", "playing" ); + map_restart( 1 ); + return; + } + + if ( !level.forcedend ) + var_1 = updateendreasontext( var_0 ); + } + + if ( !isdefined( game["clientMatchDataDef"] ) ) + { + game["clientMatchDataDef"] = "mp/clientmatchdata.def"; + setclientmatchdatadef( game["clientMatchDataDef"] ); + } + + maps\mp\gametypes\_missions::roundend( var_0 ); + var_0 = getgamewinner( var_0, 1 ); + + if ( level.teambased ) + { + setomnvar( "ui_game_victor", 0 ); + + if ( var_0 == "allies" ) + setomnvar( "ui_game_victor", 2 ); + else if ( var_0 == "axis" ) + setomnvar( "ui_game_victor", 1 ); + } + + displaygameend( var_0, var_1 ); + var_11 = gettime(); + + 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(); + updatecombatrecord(); + + if ( level.teambased ) + { + if ( var_0 == "axis" || var_0 == "allies" ) + setmatchdata( "victor", var_0 ); + else + setmatchdata( "victor", "none" ); + + setmatchdata( "alliesScore", game["teamScores"]["allies"] ); + setmatchdata( "axisScore", game["teamScores"]["axis"] ); + tournamentreportwinningteam( var_0 ); + } + else + setmatchdata( "victor", "none" ); + + level maps\mp\_matchdata::endofgamesummarylogger(); + + foreach ( var_5 in level.players ) + { + if ( var_5 maps\mp\_utility::rankingenabled() ) + var_5 maps\mp\_matchdata::logfinalstats(); + + var_5 maps\mp\gametypes\_playerlogic::logplayerstats(); + } + + setmatchdata( "host", maps\mp\gametypes\_playerlogic::truncateplayername( level.hostname ) ); + + if ( maps\mp\_utility::matchmakinggame() ) + { + setmatchdata( "playlistVersion", getplaylistversion() ); + setmatchdata( "playlistID", getplaylistid() ); + setmatchdata( "isDedicated", isdedicatedserver() ); + } + + setmatchdata( "levelMaxClients", level.maxclients ); + sendmatchdata(); + + foreach ( var_5 in level.players ) + { + var_5.pers["stats"] = var_5.stats; + var_5.pers["segments"] = var_5.segments; + } + + tournamentreportendofgame(); + var_20 = 0; + + if ( maps\mp\_utility::practiceroundgame() ) + var_20 = 5.0; + + if ( isdefined( level.endgamewaitfunc ) ) + [[ level.endgamewaitfunc ]]( var_2, level.postgamenotifies, var_20, var_0 ); + else if ( !var_2 && !level.postgamenotifies ) + { + if ( !maps\mp\_utility::wasonlyround() ) + wait(6.0 + var_20); + else + wait(min( 10.0, 4.0 + var_20 + level.postgamenotifies )); + } + else + wait(min( 10.0, 4.0 + var_20 + level.postgamenotifies )); + + var_21 = "_gamelogic.gsc"; + var_22 = "all"; + + if ( level.teambased && isdefined( var_0 ) ) + var_22 = var_0; + + var_23 = "undefined"; + + if ( isdefined( var_1 ) ) + { + switch ( var_1 ) + { + case 1: + var_23 = "MP_SCORE_LIMIT_REACHED"; + break; + case 2: + var_23 = "MP_TIME_LIMIT_REACHED"; + break; + case 3: + var_23 = "MP_PLAYERS_FORFEITED"; + break; + case 4: + var_23 = "MP_TARGET_DESTROYED"; + break; + case 5: + var_23 = "MP_BOMB_DEFUSED"; + break; + case 6: + var_23 = "MP_GHOSTS_ELIMINATED"; + break; + case 7: + var_23 = "MP_FEDERATION_ELIMINATED"; + break; + case 8: + var_23 = "MP_GHOSTS_FORFEITED"; + break; + case 9: + var_23 = "MP_FEDERATION_FORFEITED"; + break; + case 10: + var_23 = "MP_ENEMIES_ELIMINATED"; + break; + case 11: + var_23 = "MP_MATCH_TIE"; + break; + case 12: + var_23 = "GAME_OBJECTIVECOMPLETED"; + break; + case 13: + var_23 = "GAME_OBJECTIVEFAILED"; + break; + case 14: + var_23 = "MP_SWITCHING_SIDES"; + break; + case 15: + var_23 = "MP_ROUND_LIMIT_REACHED"; + break; + case 16: + var_23 = "MP_ENDED_GAME"; + break; + case 17: + var_23 = "MP_HOST_ENDED_GAME"; + break; + default: + break; + } + } + + if ( !isdefined( var_11 ) ) + var_11 = -1; + + var_24 = 15; + var_25 = var_24; + var_26 = getmatchdata( "playerCount" ); + var_27 = getmatchdata( "lifeCount" ); + + if ( !isdefined( level.matchdata ) ) + { + var_28 = 0; + var_29 = 0; + var_30 = 0; + var_31 = 0; + var_32 = 0; + var_33 = 0; + var_34 = 0; + } + else + { + if ( isdefined( level.matchdata["botJoinCount"] ) ) + var_28 = level.matchdata["botJoinCount"]; + else + var_28 = 0; + + if ( isdefined( level.matchdata["deathCount"] ) ) + var_29 = level.matchdata["deathCount"]; + else + var_29 = 0; + + if ( isdefined( level.matchdata["badSpawnDiedTooFastCount"] ) ) + var_30 = level.matchdata["badSpawnDiedTooFastCount"]; + else + var_30 = 0; + + if ( isdefined( level.matchdata["badSpawnKilledTooFastCount"] ) ) + var_31 = level.matchdata["badSpawnKilledTooFastCount"]; + else + var_31 = 0; + + if ( isdefined( level.matchdata["badSpawnDmgDealtCount"] ) ) + var_32 = level.matchdata["badSpawnDmgDealtCount"]; + else + var_32 = 0; + + if ( isdefined( level.matchdata["badSpawnDmgReceivedCount"] ) ) + var_33 = level.matchdata["badSpawnDmgReceivedCount"]; + else + var_33 = 0; + + if ( isdefined( level.matchdata["badSpawnByAnyMeansCount"] ) ) + var_34 = level.matchdata["badSpawnByAnyMeansCount"]; + else + var_34 = 0; + } + + var_35 = 0; + + if ( isdefined( level.spawnsighttracesused_pres1tu ) ) + var_35 += 1; + + if ( isdefined( level.spawnsighttracesused_posts1tu ) ) + var_35 += 2; + + reconevent( "script_mp_match_end: script_file %s, gameTime %d, match_winner %s, win_reason %s, version %d, joinCount %d, botJoinCount %d, spawnCount %d, deathCount %d, badSpawnDiedTooFastCount %d, badSpawnKilledTooFastCount %d, badSpawnDmgDealtCount %d, badSpawnDmgReceivedCount %d, badSpawnByAnyMeansCount %d, sightTraceMethodsUsed %d", var_21, var_11, var_22, var_23, var_25, var_26, var_28, var_27, var_29, var_30, var_31, var_32, var_33, var_34, var_35 ); + + if ( isdefined( level.ishorde ) && level.ishorde ) + { + if ( isdefined( level.zombiescompleted ) && level.zombiescompleted ) + setdvar( "cg_drawCrosshair", 1 ); + } + + level notify( "exitLevel_called" ); + exitlevel( 0 ); +} + +getgamewinner( var_0, var_1 ) +{ + if ( !isstring( var_0 ) ) + return var_0; + + var_2 = var_0; + + if ( level.teambased && ( maps\mp\_utility::isroundbased() || level.gametype == "ctf" ) && level.gameended ) + { + var_3 = "roundsWon"; + + if ( isdefined( level.winbycaptures ) && level.winbycaptures ) + var_3 = "teamScores"; + + if ( game[var_3]["allies"] == game[var_3]["axis"] ) + var_2 = "tie"; + else if ( game[var_3]["axis"] > game[var_3]["allies"] ) + var_2 = "axis"; + else + var_2 = "allies"; + } + + if ( var_1 && ( var_2 == "allies" || var_2 == "axis" ) ) + level.finalkillcam_winner = var_2; + + return var_2; +} + +updateendreasontext( var_0 ) +{ + if ( !level.teambased ) + return 1; + + if ( maps\mp\_utility::hitroundlimit() ) + return game["end_reason"]["round_limit_reached"]; + + if ( maps\mp\_utility::hitwinlimit() ) + return game["end_reason"]["score_limit_reached"]; + + return game["end_reason"]["objective_completed"]; +} + +estimatedtimetillscorelimit( var_0 ) +{ + var_1 = getscoreperminute( var_0 ); + var_2 = getscoreremaining( 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; +} + +getscoreremaining( 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 ); + thread maps\mp\_utility::teamplayercardsplash( "callout_lastteammemberalive", self, self.pers["team"] ); + + if ( level.multiteambased ) + { + foreach ( var_1 in level.teamnamelist ) + { + if ( self.pers["team"] != var_1 ) + thread maps\mp\_utility::teamplayercardsplash( "callout_lastenemyalive", self, var_1 ); + } + } + else + { + var_3 = maps\mp\_utility::getotherteam( self.pers["team"] ); + thread maps\mp\_utility::teamplayercardsplash( "callout_lastenemyalive", self, var_3 ); + } + + 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 ( isdefined( level.iszombiegame ) && level.iszombiegame ) + var_2.clientmatchdataid = var_2 getentitynumber(); + + setclientmatchdata( "players", var_2.clientmatchdataid, "name", maps\mp\gametypes\_playerlogic::truncateplayername( var_2.name ) ); + setclientmatchdata( "players", var_2.clientmatchdataid, "xuid", var_2.xuid ); + } + + maps\mp\_awards::assignawards(); + maps\mp\_scoreboard::processlobbyscoreboards(); + sendclientmatchdata(); + lootserviceonendgame(); +} + +trackleaderboarddeathstats( var_0, var_1 ) +{ + thread threadedsetweaponstatbyname( var_0, 1, "deaths" ); +} + +trackattackerleaderboarddeathstats( var_0, var_1, var_2 ) +{ + if ( isdefined( self ) && isplayer( self ) ) + { + if ( var_1 != "MOD_FALLING" ) + { + if ( maps\mp\_utility::ismeleemod( var_1 ) && issubstr( var_0, "tactical" ) ) + return; + + if ( maps\mp\_utility::ismeleemod( var_1 ) && !issubstr( var_0, "riotshield" ) && !issubstr( var_0, "combatknife" ) ) + return; + + thread threadedsetweaponstatbyname( var_0, 1, "kills" ); + var_3 = 0; + + if ( isdefined( var_2 ) && isdefined( var_2.firedads ) ) + var_3 = var_2.firedads; + else + var_3 = self playerads(); + + if ( var_3 < 0.2 ) + thread threadedsetweaponstatbyname( var_0, 1, "hipfirekills" ); + } + + 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 ( var_3 == "killstreak" || var_3 == "other" ) + return; + + if ( maps\mp\_utility::isenvironmentweapon( var_0 ) ) + return; + + if ( maps\mp\_utility::isbombsiteweapon( var_0 ) ) + return; + + if ( var_0 == maps\mp\_grappling_hook::get_grappling_hook_weapon() ) + return; + + if ( var_3 == "weapon_grenade" || var_3 == "weapon_explosive" ) + { + var_4 = maps\mp\_utility::strip_suffix( var_0, "_lefthand" ); + var_4 = maps\mp\_utility::strip_suffix( var_4, "_mp" ); + maps\mp\gametypes\_persistence::incrementweaponstat( var_4, var_2, var_1 ); + maps\mp\_matchdata::logweaponstat( var_4, var_2, var_1 ); + return; + } + + var_5 = maps\mp\gametypes\_weapons::isprimaryorsecondaryprojectileweapon( var_0 ); + + if ( var_2 != "timeInUse" && var_2 != "deaths" && !var_5 ) + { + var_6 = var_0; + var_0 = self getcurrentweapon(); + + if ( var_0 != var_6 && maps\mp\_utility::iskillstreakweapon( var_0 ) ) + return; + } + + if ( !isdefined( self.trackingweaponname ) ) + self.trackingweaponname = var_0; + + if ( var_0 != self.trackingweaponname ) + { + maps\mp\gametypes\_persistence::updateweaponbufferedstats(); + self.trackingweaponname = var_0; + self.currentfirefightshots = 0; + } + + switch ( var_2 ) + { + case "shots": + self.trackingweaponshots++; + self.currentfirefightshots++; + break; + case "hits": + self.trackingweaponhits++; + break; + case "headShots": + self.trackingweaponheadshots++; + self.trackingweaponhits++; + break; + case "kills": + self.trackingweaponkills++; + break; + case "hipfirekills": + self.trackingweaponhipfirekills++; + break; + case "timeInUse": + self.trackingweaponusetime += var_1; + break; + } + + if ( var_2 == "deaths" ) + { + var_7 = maps\mp\_utility::getbaseweaponname( var_0 ); + + if ( !maps\mp\_utility::iscacprimaryweapon( var_7 ) && !maps\mp\_utility::iscacsecondaryweapon( var_7 ) ) + return; + + var_8 = maps\mp\_utility::getweaponattachmentsbasenames( var_0 ); + maps\mp\gametypes\_persistence::incrementweaponstat( var_7, var_2, var_1 ); + maps\mp\_matchdata::logweaponstat( var_7, "deaths", var_1 ); + + foreach ( var_10 in var_8 ) + maps\mp\gametypes\_persistence::incrementattachmentstat( var_10, 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 getcommonplayerdata( "round", "kills" ); + var_3 = var_1 getcommonplayerdata( "round", "deaths" ); + var_4 = var_1.pers["summary"]["xp"]; + var_5 = var_1.score; + var_6 = getroundaccuracy( var_1 ); + var_7 = var_1 getrankedplayerdata( "bestKills" ); + var_8 = var_1 getrankedplayerdata( "mostDeaths" ); + var_9 = var_1 getrankedplayerdata( "mostXp" ); + var_10 = var_1 getrankedplayerdata( "bestScore" ); + var_11 = var_1 getrankedplayerdata( "bestAccuracy" ); + + if ( var_2 > var_7 ) + var_1 setrankedplayerdata( "bestKills", var_2 ); + + if ( var_4 > var_9 ) + var_1 setrankedplayerdata( "mostXp", var_4 ); + + if ( var_3 > var_8 ) + var_1 setrankedplayerdata( "mostDeaths", var_3 ); + + if ( var_5 > var_10 ) + var_1 setrankedplayerdata( "bestScore", var_5 ); + + if ( var_6 > var_11 ) + var_1 setrankedplayerdata( "bestAccuracy", var_6 ); + + 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(); + } +} + +getroundaccuracy( var_0 ) +{ + var_1 = float( var_0 getrankedplayerdata( "totalShots" ) - var_0.pers["previous_shots"] ); + + if ( var_1 == 0 ) + return 0; + + var_2 = float( var_0 getrankedplayerdata( "hits" ) - var_0.pers["previous_hits"] ); + var_3 = clamp( var_2 / var_1, 0.0, 1.0 ) * 10000.0; + return int( var_3 ); +} + +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_2 = maps\mp\_utility::getbaseweaponname( var_2 ); + var_3 = maps\mp\_utility::getweaponclass( var_2 ); + + if ( !maps\mp\_utility::iskillstreakweapon( var_2 ) && var_3 != "killstreak" && var_3 != "other" ) + { + var_4 = self getrankedplayerdata( "bestWeapon", "kills" ); + var_5 = 0; + + if ( isdefined( self.pers["mpWeaponStats"][var_2] ) && isdefined( self.pers["mpWeaponStats"][var_2]["kills"] ) ) + { + var_5 = self.pers["mpWeaponStats"][var_2]["kills"]; + + if ( var_5 > var_4 ) + { + self setrankedplayerdata( "bestWeapon", "kills", var_5 ); + var_6 = 0; + + if ( isdefined( self.pers["mpWeaponStats"][var_2]["shots"] ) ) + var_6 = self.pers["mpWeaponStats"][var_2]["shots"]; + + var_7 = 0; + + if ( isdefined( self.pers["mpWeaponStats"][var_2]["headShots"] ) ) + var_7 = self.pers["mpWeaponStats"][var_2]["headShots"]; + + var_8 = 0; + + if ( isdefined( self.pers["mpWeaponStats"][var_2]["hits"] ) ) + var_8 = self.pers["mpWeaponStats"][var_2]["hits"]; + + var_9 = 0; + + if ( isdefined( self.pers["mpWeaponStats"][var_2]["deaths"] ) ) + var_9 = self.pers["mpWeaponStats"][var_2]["deaths"]; + + self setrankedplayerdata( "bestWeapon", "shots", var_6 ); + self setrankedplayerdata( "bestWeapon", "headShots", var_7 ); + self setrankedplayerdata( "bestWeapon", "hits", var_8 ); + self setrankedplayerdata( "bestWeapon", "deaths", var_9 ); + var_10 = int( tablelookup( "mp/statstable.csv", 4, var_2, 0 ) ); + self setrankedplayerdata( "bestWeaponIndex", var_10 ); + } + } + } + } +} + +updatecombatrecordforplayertrends() +{ + var_0 = 5; + var_1 = self getrankedplayerdata( "combatRecord", "numTrends" ); + var_1++; + + if ( var_1 > var_0 ) + { + var_1 = var_0; + + if ( var_0 > 1 ) + { + for ( var_2 = 0; var_2 < var_0 - 1; var_2++ ) + { + var_3 = self getrankedplayerdata( "combatRecord", "trend", var_2 + 1, "timestamp" ); + var_4 = self getrankedplayerdata( "combatRecord", "trend", var_2 + 1, "kills" ); + var_5 = self getrankedplayerdata( "combatRecord", "trend", var_2 + 1, "deaths" ); + self setrankedplayerdata( "combatRecord", "trend", var_2, "timestamp", var_3 ); + self setrankedplayerdata( "combatRecord", "trend", var_2, "kills", var_4 ); + self setrankedplayerdata( "combatRecord", "trend", var_2, "deaths", var_5 ); + } + } + } + + var_3 = maps\mp\_utility::gettimeutc_for_stat_recording(); + var_4 = self.kills; + var_5 = self.deaths; + self setrankedplayerdata( "combatRecord", "trend", var_1 - 1, "timestamp", var_3 ); + self setrankedplayerdata( "combatRecord", "trend", var_1 - 1, "kills", var_4 ); + self setrankedplayerdata( "combatRecord", "trend", var_1 - 1, "deaths", var_5 ); + self setrankedplayerdata( "combatRecord", "numTrends", var_1 ); +} + +updatecombatrecordcommondata() +{ + var_0 = maps\mp\_utility::gettimeutc_for_stat_recording(); + setcombatrecordstat( "timeStampLastGame", var_0 ); + incrementcombatrecordstat( "numMatches", 1 ); + incrementcombatrecordstat( "timePlayed", self.timeplayed["total"] ); + incrementcombatrecordstat( "kills", self.kills ); + incrementcombatrecordstat( "deaths", self.deaths ); + incrementcombatrecordstat( "xpEarned", self.pers["summary"]["xp"] ); + + if ( isdefined( self.combatrecordwin ) ) + incrementcombatrecordstat( "wins", 1 ); + + if ( isdefined( self.combatrecordtie ) ) + incrementcombatrecordstat( "ties", 1 ); + + var_1 = self getrankedplayerdata( "combatRecord", level.gametype, "timeStampFirstGame" ); + + if ( var_1 == 0 ) + setcombatrecordstat( "timeStampFirstGame", var_0 ); +} + +incrementcombatrecordstat( var_0, var_1 ) +{ + var_2 = self getrankedplayerdata( "combatRecord", level.gametype, var_0 ); + var_2 += var_1; + self setrankedplayerdata( "combatRecord", level.gametype, var_0, var_2 ); +} + +setcombatrecordstat( var_0, var_1 ) +{ + self setrankedplayerdata( "combatRecord", level.gametype, var_0, var_1 ); +} + +setcombatrecordstatifgreater( var_0, var_1 ) +{ + var_2 = self getrankedplayerdata( "combatRecord", level.gametype, var_0 ); + + if ( var_1 > var_2 ) + setcombatrecordstat( var_0, var_1 ); +} + +updatecombatrecordforplayergamemodes() +{ + if ( level.gametype == "war" || level.gametype == "dm" ) + { + updatecombatrecordcommondata(); + var_0 = self.deaths; + + if ( var_0 == 0 ) + var_0 = 1; + + var_1 = int( self.kills / var_0 ) * 1000; + setcombatrecordstatifgreater( "mostkills", self.kills ); + setcombatrecordstatifgreater( "bestkdr", var_1 ); + } + else if ( level.gametype == "ctf" ) + { + updatecombatrecordcommondata(); + var_2 = maps\mp\_utility::getpersstat( "captures" ); + var_3 = maps\mp\_utility::getpersstat( "returns" ); + incrementcombatrecordstat( "captures", var_2 ); + incrementcombatrecordstat( "returns", var_3 ); + setcombatrecordstatifgreater( "mostcaptures", var_2 ); + setcombatrecordstatifgreater( "mostreturns", var_3 ); + } + else if ( level.gametype == "dom" ) + { + updatecombatrecordcommondata(); + var_2 = maps\mp\_utility::getpersstat( "captures" ); + var_4 = maps\mp\_utility::getpersstat( "defends" ); + incrementcombatrecordstat( "captures", var_2 ); + incrementcombatrecordstat( "defends", var_4 ); + setcombatrecordstatifgreater( "mostcaptures", var_2 ); + setcombatrecordstatifgreater( "mostdefends", var_4 ); + } + else if ( level.gametype == "conf" ) + { + updatecombatrecordcommondata(); + var_5 = maps\mp\_utility::getpersstat( "confirmed" ); + var_6 = maps\mp\_utility::getpersstat( "denied" ); + incrementcombatrecordstat( "confirms", var_5 ); + incrementcombatrecordstat( "denies", var_6 ); + setcombatrecordstatifgreater( "mostconfirms", var_5 ); + setcombatrecordstatifgreater( "mostdenies", var_6 ); + } + else if ( level.gametype == "sd" ) + { + updatecombatrecordcommondata(); + var_7 = maps\mp\_utility::getpersstat( "plants" ); + var_8 = maps\mp\_utility::getpersstat( "defuses" ); + var_9 = maps\mp\_utility::getpersstat( "destructions" ); + incrementcombatrecordstat( "plants", var_7 ); + incrementcombatrecordstat( "defuses", var_8 ); + incrementcombatrecordstat( "detonates", var_9 ); + setcombatrecordstatifgreater( "mostplants", var_7 ); + setcombatrecordstatifgreater( "mostdefuses", var_8 ); + setcombatrecordstatifgreater( "mostdetonates", var_9 ); + } + else if ( level.gametype == "hp" ) + { + updatecombatrecordcommondata(); + var_2 = maps\mp\_utility::getpersstat( "captures" ); + var_4 = maps\mp\_utility::getpersstat( "defends" ); + incrementcombatrecordstat( "captures", var_2 ); + incrementcombatrecordstat( "defends", var_4 ); + setcombatrecordstatifgreater( "mostcaptures", var_2 ); + setcombatrecordstatifgreater( "mostdefends", var_4 ); + } + else if ( level.gametype == "sr" ) + { + updatecombatrecordcommondata(); + var_7 = maps\mp\_utility::getpersstat( "plants" ); + var_8 = maps\mp\_utility::getpersstat( "defuses" ); + var_9 = maps\mp\_utility::getpersstat( "destructions" ); + var_5 = maps\mp\_utility::getpersstat( "confirmed" ); + var_6 = maps\mp\_utility::getpersstat( "denied" ); + incrementcombatrecordstat( "plants", var_7 ); + incrementcombatrecordstat( "defuses", var_8 ); + incrementcombatrecordstat( "detonates", var_9 ); + incrementcombatrecordstat( "confirms", var_5 ); + incrementcombatrecordstat( "denies", var_6 ); + setcombatrecordstatifgreater( "mostplants", var_7 ); + setcombatrecordstatifgreater( "mostdefuses", var_8 ); + setcombatrecordstatifgreater( "mostdetonates", var_9 ); + setcombatrecordstatifgreater( "mostconfirms", var_5 ); + setcombatrecordstatifgreater( "mostdenies", var_6 ); + } + else if ( level.gametype == "infect" ) + { + updatecombatrecordcommondata(); + var_10 = maps\mp\_utility::getplayerstat( "contagious" ); + var_11 = self.kills - var_10; + incrementcombatrecordstat( "infectedKills", var_11 ); + incrementcombatrecordstat( "survivorKills", var_10 ); + setcombatrecordstatifgreater( "mostInfectedKills", var_11 ); + setcombatrecordstatifgreater( "mostSurvivorKills", var_10 ); + } + else if ( level.gametype == "gun" ) + { + updatecombatrecordcommondata(); + var_12 = maps\mp\_utility::getplayerstat( "levelup" ); + var_13 = maps\mp\_utility::getplayerstat( "humiliation" ); + incrementcombatrecordstat( "gunPromotions", var_12 ); + incrementcombatrecordstat( "stabs", var_13 ); + setcombatrecordstatifgreater( "mostGunPromotions", var_12 ); + setcombatrecordstatifgreater( "mostStabs", var_13 ); + } + else if ( level.gametype == "ball" ) + { + updatecombatrecordcommondata(); + var_14 = maps\mp\_utility::getplayerstat( "fieldgoal" ) + maps\mp\_utility::getplayerstat( "touchdown" ) * 2; + var_15 = maps\mp\_utility::getplayerstat( "killedBallCarrier" ); + incrementcombatrecordstat( "pointsScored", var_14 ); + incrementcombatrecordstat( "killedBallCarrier", var_15 ); + setcombatrecordstatifgreater( "mostPointsScored", var_14 ); + setcombatrecordstatifgreater( "mostKilledBallCarrier", var_15 ); + } + else if ( level.gametype == "twar" ) + { + updatecombatrecordcommondata(); + var_2 = maps\mp\_utility::getpersstat( "captures" ); + var_16 = maps\mp\_utility::getplayerstat( "kill_while_capture" ); + incrementcombatrecordstat( "captures", var_2 ); + incrementcombatrecordstat( "killWhileCaptures", var_16 ); + setcombatrecordstatifgreater( "mostCaptures", var_2 ); + setcombatrecordstatifgreater( "mostKillWhileCaptures", var_16 ); + } +} + +updatecombatrecordforplayer() +{ + updatecombatrecordforplayertrends(); + updatecombatrecordforplayergamemodes(); +} + +updatecombatrecord() +{ + foreach ( var_1 in level.players ) + { + if ( !isdefined( var_1 ) ) + continue; + + if ( var_1 maps\mp\_utility::rankingenabled() ) + var_1 updatecombatrecordforplayer(); + + level maps\mp\gametypes\_playerlogic::writesegmentdata( var_1 ); + + if ( maps\mp\_utility::practiceroundgame() ) + level maps\mp\gametypes\_playerlogic::checkpracticeroundlockout( var_1 ); + } +} diff --git a/data/maps/mp/gametypes/_playerlogic.gsc b/data/maps/mp/gametypes/_playerlogic.gsc new file mode 100644 index 0000000..bf1c9e7 --- /dev/null +++ b/data/maps/mp/gametypes/_playerlogic.gsc @@ -0,0 +1,2226 @@ +// S1 GSC SOURCE +// Dumped by https://github.com/xensik/gsc-tool + +timeuntilwavespawn( var_0 ) +{ + if ( !self.hasspawned ) + return 0; + + var_1 = gettime() + var_0 * 1000; + var_2 = level.lastwave[self.pers["team"]]; + var_3 = level.wavedelay[self.pers["team"]] * 1000; + var_4 = ( var_1 - var_2 ) / var_3; + var_5 = ceil( var_4 ); + var_6 = var_2 + var_5 * var_3; + + if ( isdefined( self.respawntimerstarttime ) ) + { + var_7 = ( gettime() - self.respawntimerstarttime ) / 1000.0; + + if ( self.respawntimerstarttime < var_2 ) + return 0; + } + + if ( isdefined( self.wavespawnindex ) ) + var_6 += 50 * self.wavespawnindex; + + return ( var_6 - gettime() ) / 1000; +} + +teamkilldelay() +{ + var_0 = self.pers["teamkills"]; + + if ( var_0 <= level.maxallowedteamkills ) + return 0; + + var_1 = var_0 - level.maxallowedteamkills; + return maps\mp\gametypes\_tweakables::gettweakablevalue( "team", "teamkillspawndelay" ) * var_1; +} + +timeuntilspawn( var_0 ) +{ + if ( level.ingraceperiod && !self.hasspawned || level.gameended ) + return 0; + + var_1 = 0; + + if ( self.hasspawned ) + { + var_2 = self [[ level.onrespawndelay ]](); + + if ( isdefined( var_2 ) ) + var_1 = var_2; + else + var_1 = getdvarint( "scr_" + level.gametype + "_playerrespawndelay" ); + + if ( var_0 ) + { + if ( isdefined( self.pers["teamKillPunish"] ) && self.pers["teamKillPunish"] ) + var_1 += teamkilldelay(); + + if ( isdefined( self.pers["suicideSpawnDelay"] ) ) + var_1 += self.pers["suicideSpawnDelay"]; + } + + if ( isdefined( self.respawntimerstarttime ) ) + { + var_3 = ( gettime() - self.respawntimerstarttime ) / 1000.0; + var_1 -= var_3; + + if ( var_1 < 0 ) + var_1 = 0; + } + + if ( isdefined( self.setspawnpoint ) ) + var_1 += level.tispawndelay; + } + + var_4 = getdvarfloat( "scr_" + level.gametype + "_waverespawndelay" ) > 0; + + if ( var_4 ) + return timeuntilwavespawn( var_1 ); + + return var_1; +} + +mayspawn() +{ + if ( maps\mp\_utility::getgametypenumlives() || isdefined( level.disablespawning ) ) + { + if ( isdefined( level.disablespawning ) && level.disablespawning ) + return 0; + + if ( isdefined( self.pers["teamKillPunish"] ) && self.pers["teamKillPunish"] ) + return 0; + + if ( !self.pers["lives"] && maps\mp\_utility::gamehasstarted() ) + return 0; + else if ( maps\mp\_utility::gamehasstarted() ) + { + if ( !level.ingraceperiod && !self.hasspawned && ( isdefined( level.allowlatecomers ) && !level.allowlatecomers ) ) + return 0; + } + + if ( isdefined( level.disablespawningforplayerfunc ) && [[ level.disablespawningforplayerfunc ]]( self ) ) + return 0; + } + + return 1; +} + +spawnclient() +{ + self endon( "becameSpectator" ); + + if ( isdefined( self.clientid ) ) + { + + } + else + { + + } + + if ( isdefined( self.waitingtoselectclass ) && self.waitingtoselectclass ) + self waittill( "notWaitingToSelectClass" ); + + if ( isdefined( self.addtoteam ) ) + { + maps\mp\gametypes\_menus::addtoteam( self.addtoteam ); + self.addtoteam = undefined; + } + + if ( !mayspawn() ) + { + wait 0.05; + self notify( "attempted_spawn" ); + var_0 = self.pers["teamKillPunish"]; + + if ( isdefined( var_0 ) && var_0 ) + { + self.pers["teamkills"] = max( self.pers["teamkills"] - 1, 0 ); + maps\mp\_utility::setlowermessage( "friendly_fire", &"MP_FRIENDLY_FIRE_WILL_NOT" ); + + if ( !self.hasspawned && teamkilldelay() <= 0 ) + self.pers["teamKillPunish"] = 0; + } + else if ( maps\mp\_utility::isroundbased() && !maps\mp\_utility::islastround() ) + { + if ( isdefined( self.tagavailable ) && self.tagavailable ) + maps\mp\_utility::setlowermessage( "spawn_info", game["strings"]["spawn_tag_wait"] ); + else + maps\mp\_utility::setlowermessage( "spawn_info", game["strings"]["spawn_next_round"] ); + + thread removespawnmessageshortly( 3.0 ); + } + + thread spawnspectator(); + return; + } + + if ( self.waitingtospawn ) + return; + + self.waitingtospawn = 1; + waitandspawnclient(); + + if ( isdefined( self ) ) + self.waitingtospawn = 0; +} + +streamprimaryweapons() +{ + if ( maps\mp\_utility::allowclasschoice() && !isai( self ) ) + { + var_0 = []; + var_1 = [ "custom1", "custom2", "custom3", "custom4", "custom5", "class0", "class1", "class2", "class3", "class4" ]; + + foreach ( var_3 in var_1 ) + { + var_4 = maps\mp\gametypes\_class::getloadout( self.team, var_3 ); + var_0[var_0.size] = var_4.primaryname; + } + + self loadweapons( var_0 ); + } +} + +gatherclassweapons( var_0, var_1 ) +{ + var_2 = []; + var_3 = var_1; + + if ( !maps\mp\_utility::isvalidclass( var_3 ) ) + var_3 = self.class; + + if ( maps\mp\_utility::isvalidclass( var_3 ) ) + { + var_4 = maps\mp\gametypes\_class::getloadout( self.team, var_3 ); + var_2[var_2.size] = var_4.primaryname; + + if ( !isdefined( var_0 ) || !var_0 ) + var_2[var_2.size] = var_4.secondaryname; + } + + return var_2; +} + +streamclassweapons( var_0, var_1, var_2 ) +{ + self.classweaponswait = 0; + self notify( "endStreamClassWeapons" ); + self endon( "endStreamClassWeapons" ); + self endon( "death" ); + self endon( "disconnect" ); + + if ( isai( self ) || !isdefined( var_0 ) ) + var_0 = 0; + + var_3 = gatherclassweapons( var_1, var_2 ); + + if ( var_3.size > 0 ) + { + while ( isdefined( self.loadingplayerweapons ) && self.loadingplayerweapons ) + wait 0.05; + + var_0 = !self loadweapons( var_3 ) && var_0; + self onlystreamactiveweapon( 1 ); + + for ( self.classweaponswait = var_0; var_0; var_0 = !self loadweapons( var_3 ) ) + waitframe(); + + self onlystreamactiveweapon( 0 ); + } + + self.classweaponswait = 0; + self notify( "streamClassWeaponsComplete" ); +} + +waitandspawnclient() +{ + self endon( "disconnect" ); + self endon( "end_respawn" ); + level endon( "game_ended" ); + self notify( "attempted_spawn" ); + + if ( isdefined( self.clientid ) ) + { + + } + else + { + + } + + var_0 = 0; + var_1 = getentarray( "mp_global_intermission", "classname" ); + var_2 = var_1[randomint( var_1.size )]; + var_3 = self.pers["teamKillPunish"]; + + if ( isdefined( var_3 ) && var_3 ) + { + var_4 = teamkilldelay(); + + if ( var_4 > 0 ) + { + maps\mp\_utility::setlowermessage( "friendly_fire", &"MP_FRIENDLY_FIRE_WILL_NOT", var_4, 1, 1 ); + thread respawn_asspectator( var_2.origin, var_2.angles ); + var_0 = 1; + wait(var_4); + maps\mp\_utility::clearlowermessage( "friendly_fire" ); + self.respawntimerstarttime = gettime(); + } + + self.pers["teamKillPunish"] = 0; + } + else if ( teamkilldelay() ) + self.pers["teamkills"] = max( self.pers["teamkills"] - 1, 0 ); + + var_5 = self.pers["suicideSpawnDelay"]; + + if ( isdefined( var_5 ) && var_5 > 0 ) + { + maps\mp\_utility::setlowermessage( "suicidePenalty", &"MP_SUICIDE_PUNISHED", var_5, 1, 1 ); + + if ( !var_0 ) + thread respawn_asspectator( var_2.origin, var_2.angles ); + + var_0 = 1; + wait(var_5); + maps\mp\_utility::clearlowermessage( "suicidePenalty" ); + self.respawntimerstarttime = gettime(); + self.pers["suicideSpawnDelay"] = 0; + } + + if ( maps\mp\_utility::isusingremote() ) + { + self.spawningafterremotedeath = 1; + self.deathposition = self.origin; + self waittill( "stopped_using_remote" ); + } + + if ( !isdefined( self.wavespawnindex ) && isdefined( level.waveplayerspawnindex[self.team] ) ) + { + self.wavespawnindex = level.waveplayerspawnindex[self.team]; + level.waveplayerspawnindex[self.team]++; + } + + var_6 = timeuntilspawn( 0 ); + + if ( var_6 > 0 ) + { + self setclientomnvar( "ui_killcam_time_until_spawn", gettime() + var_6 * 1000 ); + + if ( !var_0 ) + thread respawn_asspectator( var_2.origin, var_2.angles ); + + var_0 = 1; + maps\mp\_utility::waitfortimeornotify( var_6, "force_spawn" ); + self notify( "stop_wait_safe_spawn_button" ); + } + + if ( needsbuttontorespawn() ) + { + maps\mp\_utility::setlowermessage( "spawn_info", game["strings"]["press_to_spawn"], undefined, undefined, undefined, undefined, undefined, undefined, 1 ); + + if ( !var_0 ) + thread respawn_asspectator( var_2.origin, var_2.angles ); + + var_0 = 1; + waitrespawnbutton(); + } + + self.waitingtospawn = 0; + maps\mp\_utility::clearlowermessage( "spawn_info" ); + self.wavespawnindex = undefined; + thread spawnplayer(); +} + +needsbuttontorespawn() +{ + if ( maps\mp\gametypes\_tweakables::gettweakablevalue( "player", "forcerespawn" ) != 0 ) + return 0; + + if ( !self.hasspawned ) + return 0; + + var_0 = getdvarfloat( "scr_" + level.gametype + "_waverespawndelay" ) > 0; + + if ( var_0 ) + return 0; + + if ( self.wantsafespawn ) + return 0; + + return 1; +} + +waitrespawnbutton() +{ + self endon( "disconnect" ); + self endon( "end_respawn" ); + + for (;;) + { + if ( self usebuttonpressed() ) + break; + + wait 0.05; + } +} + +removespawnmessageshortly( var_0 ) +{ + self endon( "disconnect" ); + level endon( "game_ended" ); + waittillframeend; + self endon( "end_respawn" ); + wait(var_0); + maps\mp\_utility::clearlowermessage( "spawn_info" ); +} + +laststandrespawnplayer() +{ + self laststandrevive(); + + if ( maps\mp\_utility::_hasperk( "specialty_finalstand" ) && !level.diehardmode ) + maps\mp\_utility::_unsetperk( "specialty_finalstand" ); + + if ( level.diehardmode ) + self.headicon = ""; + + self setstance( "crouch" ); + self.revived = 1; + self notify( "revive" ); + + if ( isdefined( self.standardmaxhealth ) ) + self.maxhealth = self.standardmaxhealth; + + self.health = self.maxhealth; + common_scripts\utility::_enableusability(); + + if ( game["state"] == "postgame" ) + maps\mp\gametypes\_gamelogic::freezeplayerforroundend(); +} + +getdeathspawnpoint() +{ + var_0 = spawn( "script_origin", self.origin ); + var_0 hide(); + var_0.angles = self.angles; + return var_0; +} + +showspawnnotifies() +{ + +} + +getspawnorigin( var_0 ) +{ + if ( !positionwouldtelefrag( var_0.origin ) ) + return var_0.origin; + + if ( !isdefined( var_0.alternates ) ) + return var_0.origin; + + foreach ( var_2 in var_0.alternates ) + { + if ( !positionwouldtelefrag( var_2 ) ) + return var_2; + } + + return var_0.origin; +} + +tivalidationcheck() +{ + if ( !isdefined( self.setspawnpoint ) ) + return 0; + + var_0 = getentarray( "care_package", "targetname" ); + + foreach ( var_2 in var_0 ) + { + if ( distancesquared( var_2.origin, self.setspawnpoint.playerspawnpos ) > 4096 ) + continue; + + maps\mp\perks\_perkfunctions::deleteti( self.setspawnpoint ); + return 0; + } + + return 1; +} + +spawningclientthisframereset() +{ + self notify( "spawningClientThisFrameReset" ); + self endon( "spawningClientThisFrameReset" ); + wait 0.05; + level.numplayerswaitingtospawn--; +} + +setuioptionsmenu( var_0 ) +{ + self endon( "disconnect" ); + self endon( "joined_spectators" ); + + while ( self ismlgspectator() && !maps\mp\_utility::invirtuallobby() ) + waitframe(); + + self setclientomnvar( "ui_options_menu", var_0 ); +} + +gather_spawn_weapons() +{ + var_0 = []; + + if ( isdefined( self.loadout ) ) + { + var_0[var_0.size] = maps\mp\_utility::get_spawn_weapon_name( self.loadout ); + + if ( isdefined( self.loadout.secondaryname ) && self.loadout.secondaryname != "none" ) + var_0[var_0.size] = self.loadout.secondaryname; + } + else + { + if ( isdefined( self.primaryweapon ) && self.primaryweapon != "none" ) + var_0[var_0.size] = self.primaryweapon; + + if ( isdefined( self.secondaryweapon ) && self.secondaryweapon != "none" ) + var_0[var_0.size] = self.secondaryweapon; + } + + return var_0; +} + +spawnplayer( var_0, var_1 ) +{ + self endon( "disconnect" ); + self endon( "joined_spectators" ); + self notify( "spawned" ); + self notify( "end_respawn" ); + self notify( "started_spawnPlayer" ); + + if ( isdefined( self.clientid ) ) + { + + } + else + { + + } + + if ( !isdefined( var_0 ) ) + var_0 = 0; + + if ( !isdefined( var_1 ) ) + var_1 = 1; + + if ( var_1 ) + { + self.spawnplayergivingloadout = 1; + thread monitordelayedspawnloadouts(); + } + + self.lifeid = maps\mp\_utility::getnextlifeid(); + self.totallifetime = 0; + var_2 = undefined; + self.ti_spawn = 0; + thread setuioptionsmenu( 0 ); + self setclientomnvar( "ui_hud_shake", 0 ); + self setclientomnvar( "ui_exo_cooldown_in_use", 0 ); + self setdemigod( 0 ); + self disableforcefirstpersonwhenfollowed(); + + if ( !level.ingraceperiod && !self.hasdonecombat ) + { + level.numplayerswaitingtospawn++; + + if ( level.numplayerswaitingtospawn > 1 ) + { + self.waitingtospawnamortize = 1; + wait(0.05 * ( level.numplayerswaitingtospawn - 1 )); + } + + thread spawningclientthisframereset(); + self.waitingtospawnamortize = 0; + } + + if ( var_1 ) + { + var_3 = undefined; + + if ( isdefined( level.iszombiegame ) && level.iszombiegame ) + var_3 = 0; + + maps\mp\gametypes\_class::giveloadout( self.team, self.class, undefined, var_3 ); + var_4 = gather_spawn_weapons(); + self.loadingplayerweapons = 1; + + if ( !self hasloadedcustomizationplayerview( self, var_4 ) ) + { + self.waitingtospawnamortize = 1; + self onlystreamactiveweapon( 1 ); + + for (;;) + { + waitframe(); + var_4 = gather_spawn_weapons(); + + if ( self hasloadedcustomizationplayerview( self, var_4 ) ) + break; + } + + self onlystreamactiveweapon( 0 ); + self.waitingtospawnamortize = 0; + } + + self.loadingplayerweapons = 0; + } + + if ( isdefined( self.forcespawnorigin ) ) + { + var_5 = self.forcespawnorigin; + self.forcespawnorigin = undefined; + + if ( isdefined( self.forcespawnangles ) ) + { + var_6 = self.forcespawnangles; + self.forcespawnangles = undefined; + } + else + var_6 = ( 0, randomfloatrange( 0, 360 ), 0 ); + } + else if ( isdefined( self.setspawnpoint ) && ( isdefined( self.setspawnpoint.notti ) || tivalidationcheck() ) ) + { + var_2 = self.setspawnpoint; + + if ( !isdefined( self.setspawnpoint.notti ) ) + { + self.ti_spawn = 1; + self playlocalsound( "tactical_spawn" ); + + if ( level.multiteambased ) + { + foreach ( var_8 in level.teamnamelist ) + { + if ( var_8 != self.team ) + self playsoundtoteam( "tactical_spawn", var_8 ); + } + } + else if ( level.teambased ) + self playsoundtoteam( "tactical_spawn", level.otherteam[self.team] ); + else + self playsound( "tactical_spawn" ); + } + + foreach ( var_11 in level.ugvs ) + { + if ( distancesquared( var_11.origin, var_2.playerspawnpos ) < 1024 ) + var_11 notify( "damage", 5000, var_11.owner, ( 0, 0, 0 ), ( 0, 0, 0 ), "MOD_EXPLOSIVE", "", "", "", undefined, "killstreak_emp_mp" ); + } + + var_5 = self.setspawnpoint.playerspawnpos; + var_6 = self.setspawnpoint.angles; + + if ( isdefined( self.setspawnpoint.enemytrigger ) ) + self.setspawnpoint.enemytrigger delete(); + + self.setspawnpoint delete(); + var_2 = undefined; + } + else if ( isdefined( self.isspawningonbattlebuddy ) && isdefined( self.battlebuddy ) ) + { + var_5 = undefined; + var_6 = undefined; + var_13 = maps\mp\gametypes\_battlebuddy::checkbuddyspawn(); + + if ( var_13.status == 0 ) + { + var_5 = var_13.origin; + var_6 = var_13.angles; + } + else + { + var_2 = self [[ level.getspawnpoint ]](); + var_5 = var_2.origin; + var_6 = var_2.angles; + } + + maps\mp\gametypes\_battlebuddy::cleanupbuddyspawn(); + self setclientomnvar( "cam_scene_name", "battle_spawn" ); + self setclientomnvar( "cam_scene_lead", self.battlebuddy getentitynumber() ); + self setclientomnvar( "cam_scene_support", self getentitynumber() ); + } + else if ( isdefined( self.helispawning ) && ( !isdefined( self.firstspawn ) || isdefined( self.firstspawn ) && self.firstspawn ) && level.prematchperiod > 0 && self.team == "allies" ) + { + while ( !isdefined( level.allieschopper ) ) + wait 0.1; + + var_5 = level.allieschopper.origin; + var_6 = level.allieschopper.angles; + self.firstspawn = 0; + } + else if ( isdefined( self.helispawning ) && ( !isdefined( self.firstspawn ) || isdefined( self.firstspawn ) && self.firstspawn ) && level.prematchperiod > 0 && self.team == "axis" ) + { + while ( !isdefined( level.axischopper ) ) + wait 0.1; + + var_5 = level.axischopper.origin; + var_6 = level.axischopper.angles; + self.firstspawn = 0; + } + else + { + var_2 = self [[ level.getspawnpoint ]](); + var_5 = var_2.origin; + var_6 = var_2.angles; + } + + setspawnvariables(); + var_14 = self.hasspawned; + self.fauxdead = undefined; + + if ( !var_0 ) + { + self.killsthislife = []; + maps\mp\_utility::updatesessionstate( "playing" ); + maps\mp\_utility::clearkillcamstate(); + self.cancelkillcam = undefined; + self.maxhealth = maps\mp\gametypes\_tweakables::gettweakablevalue( "player", "maxhealth" ); + self.health = self.maxhealth; + self.friendlydamage = undefined; + self.hasspawned = 1; + self.spawntime = gettime(); + self.spawntimedecisecondsfrommatchstart = maps\mp\_utility::gettimepasseddecisecondsincludingrounds(); + self.wasti = !isdefined( var_2 ); + self.afk = 0; + self.damagedplayers = []; + self.killstreakscaler = 1; + self.objectivescaler = 1; + self.clampedhealth = undefined; + self.shielddamage = 0; + self.shieldbullethits = 0; + self.exocount = []; + self.exocount["exo_boost"] = 0; + self.exocount["ground_slam"] = 0; + self.exocount["exo_dodge"] = 0; + self.exocount["exo_slide"] = 0; + self.exomostrecenttimedeciseconds = []; + thread listenforexomoveevent(); + self.exo_shield_on = 0; + self.exo_hover_on = 0; + self.enemyhitcounts = []; + self.currentfirefightshots = 0; + + if ( !isai( self ) ) + thread maps\mp\gametypes\_damage::clearfirefightshotsoninterval(); + + self.scoreatlifestart = self.pers["score"]; + + if ( isdefined( self.pers["summary"] ) && isdefined( self.pers["summary"]["xp"] ) ) + self.xpatlifestart = self.pers["summary"]["xp"]; + } + + self.movespeedscaler = level.baseplayermovescale; + self.inlaststand = 0; + self.laststand = undefined; + self.infinalstand = undefined; + self.disabledweapon = 0; + self.disabledweaponswitch = 0; + self.disabledoffhandweapons = 0; + common_scripts\utility::resetusability(); + self.playerdisableabilitytypes = []; + + if ( !var_0 ) + { + self.avoidkillstreakonspawntimer = 5.0; + var_15 = self.pers["lives"]; + + if ( var_15 == maps\mp\_utility::getgametypenumlives() ) + addtolivescount(); + + if ( var_15 ) + self.pers["lives"]--; + + addtoalivecount(); + + if ( !var_14 || maps\mp\_utility::gamehasstarted() || maps\mp\_utility::gamehasstarted() && level.ingraceperiod && self.hasdonecombat ) + removefromlivescount(); + + if ( !self.wasaliveatmatchstart ) + { + var_16 = 20; + + if ( maps\mp\_utility::gettimelimit() > 0 && var_16 < maps\mp\_utility::gettimelimit() * 60 / 4 ) + var_16 = maps\mp\_utility::gettimelimit() * 60 / 4; + + if ( level.ingraceperiod || maps\mp\_utility::gettimepassed() < var_16 * 1000 ) + self.wasaliveatmatchstart = 1; + } + } + + if ( level.console ) + self setclientdvar( "cg_fov", "65" ); + + resetuidvarsonspawn(); + + if ( isdefined( var_2 ) ) + { + maps\mp\gametypes\_spawnlogic::finalizespawnpointchoice( var_2 ); + var_5 = getspawnorigin( var_2 ); + var_6 = var_2.angles; + } + else + self.lastspawntime = gettime(); + + self.spawnpos = var_5; + self spawn( var_5, var_6 ); + maps\mp\_utility::setdof( level.dofdefault ); + + if ( var_0 && isdefined( self.faux_spawn_stance ) ) + { + self setstance( self.faux_spawn_stance ); + self.faux_spawn_stance = undefined; + } + + [[ level.onspawnplayer ]](); + + if ( !var_0 ) + { + maps\mp\gametypes\_missions::playerspawned(); + + if ( isai( self ) && isdefined( level.bot_funcs ) && isdefined( level.bot_funcs["player_spawned"] ) ) + self [[ level.bot_funcs["player_spawned"] ]](); + } + + maps\mp\gametypes\_class::setclass( self.class ); + + if ( isdefined( level.custom_giveloadout ) ) + self [[ level.custom_giveloadout ]]( var_0 ); + else if ( var_1 ) + { + maps\mp\gametypes\_class::applyloadout(); + self notify( "spawnplayer_giveloadout" ); + } + + if ( getdvarint( "camera_thirdPerson" ) ) + maps\mp\_utility::setthirdpersondof( 1 ); + + if ( !maps\mp\_utility::gameflag( "prematch_done" ) ) + { + maps\mp\_utility::freezecontrolswrapper( 1 ); + self disableammogeneration(); + } + else + { + maps\mp\_utility::freezecontrolswrapper( 0 ); + self enableammogeneration(); + } + + if ( !maps\mp\_utility::gameflag( "prematch_done" ) || !var_14 && game["state"] == "playing" ) + { + var_17 = self.pers["team"]; + + if ( maps\mp\_utility::inovertime() ) + thread maps\mp\gametypes\_hud_message::oldnotifymessage( game["strings"]["overtime"], game["strings"]["overtime_hint"], undefined, ( 1, 0, 0 ), "mp_last_stand" ); + + thread showspawnnotifies(); + } + + if ( maps\mp\_utility::getintproperty( "scr_showperksonspawn", 1 ) == 1 && game["state"] != "postgame" ) + { + + } + + waittillframeend; + self.spawningafterremotedeath = undefined; + self notify( "spawned_player" ); + level notify( "player_spawned", self ); + + if ( game["state"] == "postgame" ) + maps\mp\gametypes\_gamelogic::freezeplayerforroundend(); + + if ( isdefined( level.matchrules_switchteamdisabled ) && level.matchrules_switchteamdisabled ) + self setclientomnvar( "ui_disable_team_change", 1 ); +} + +monitordelayedspawnloadouts() +{ + common_scripts\utility::waittill_any( "disconnected", "joined_spectators", "spawnplayer_giveloadout" ); + self.spawnplayergivingloadout = undefined; +} + +listenforexomoveevent() +{ + self endon( "disconnect" ); + self endon( "death" ); + + for (;;) + { + var_0 = common_scripts\utility::waittill_any_return( "exo_boost", "ground_slam", "exo_dodge", "exo_slide" ); + self.exocount[var_0]++; + self.exomostrecenttimedeciseconds[var_0] = maps\mp\_utility::gettimepasseddecisecondsincludingrounds(); + } +} + +spawnspectator( var_0, var_1 ) +{ + self notify( "spawned" ); + self notify( "end_respawn" ); + self notify( "joined_spectators" ); + in_spawnspectator( var_0, var_1 ); +} + +respawn_asspectator( var_0, var_1 ) +{ + in_spawnspectator( var_0, var_1 ); +} + +in_spawnspectator( var_0, var_1 ) +{ + setspawnvariables(); + var_2 = self.pers["team"]; + + if ( isdefined( var_2 ) && var_2 == "spectator" && !level.gameended ) + maps\mp\_utility::clearlowermessage( "spawn_info" ); + + maps\mp\_utility::updatesessionstate( "spectator" ); + maps\mp\_utility::clearkillcamstate(); + self.friendlydamage = undefined; + self.loadingplayerweapons = undefined; + resetuidvarsonspectate(); + maps\mp\gametypes\_spectating::setspectatepermissions(); + onspawnspectator( var_0, var_1 ); + + if ( level.teambased && !level.splitscreen && !self issplitscreenplayer() ) + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); +} + +getplayerfromclientnum( var_0 ) +{ + if ( var_0 < 0 ) + return undefined; + + for ( var_1 = 0; var_1 < level.players.size; var_1++ ) + { + if ( level.players[var_1] getentitynumber() == var_0 ) + return level.players[var_1]; + } + + return undefined; +} + +getrandomspectatorspawnpoint() +{ + var_0 = "mp_global_intermission"; + var_1 = getentarray( var_0, "classname" ); + var_2 = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( var_1 ); + return var_2; +} + +onspawnspectator( var_0, var_1 ) +{ + if ( isdefined( var_0 ) && isdefined( var_1 ) ) + { + self setspectatedefaults( var_0, var_1 ); + self spawn( var_0, var_1 ); + return; + } + + var_2 = getrandomspectatorspawnpoint(); + self setspectatedefaults( var_2.origin, var_2.angles ); + self spawn( var_2.origin, var_2.angles ); +} + +spawnintermission() +{ + self endon( "disconnect" ); + self notify( "spawned" ); + self notify( "end_respawn" ); + setspawnvariables(); + maps\mp\_utility::clearlowermessages(); + maps\mp\_utility::freezecontrolswrapper( 1 ); + self disableammogeneration(); + self setclientdvar( "cg_everyoneHearsEveryone", 1 ); + var_0 = self.pers["postGameChallenges"]; + + if ( level.rankedmatch && ( self.postgamepromotion || isdefined( var_0 ) && var_0 ) ) + { + if ( self.postgamepromotion ) + self playlocalsound( "mp_level_up" ); + else if ( isdefined( var_0 ) ) + self playlocalsound( "mp_challenge_complete" ); + + if ( self.postgamepromotion > level.postgamenotifies ) + level.postgamenotifies = 1; + + if ( isdefined( var_0 ) && var_0 > level.postgamenotifies ) + level.postgamenotifies = var_0; + + var_1 = 7.0; + + if ( isdefined( var_0 ) ) + var_1 = 4.0 + min( var_0, 3 ); + + while ( var_1 ) + { + wait 0.25; + var_1 -= 0.25; + } + } + + maps\mp\_utility::updatesessionstate( "intermission" ); + maps\mp\_utility::clearkillcamstate(); + self.friendlydamage = undefined; + var_2 = getentarray( "mp_global_intermission", "classname" ); + var_3 = var_2[0]; + self spawn( var_3.origin, var_3.angles ); + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); +} + +spawnendofgame() +{ + if ( 1 ) + { + maps\mp\_utility::freezecontrolswrapper( 1 ); + self disableammogeneration(); + spawnspectator(); + maps\mp\_utility::freezecontrolswrapper( 1 ); + self disableammogeneration(); + return; + } + + self notify( "spawned" ); + self notify( "end_respawn" ); + setspawnvariables(); + maps\mp\_utility::clearlowermessages(); + self setclientdvar( "cg_everyoneHearsEveryone", 1 ); + maps\mp\_utility::updatesessionstate( "dead" ); + maps\mp\_utility::clearkillcamstate(); + self.friendlydamage = undefined; + var_0 = getentarray( "mp_global_intermission", "classname" ); + var_1 = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( var_0 ); + self spawn( var_1.origin, var_1.angles ); + var_1 setmodel( "tag_origin" ); + self playerlinkto( var_1 ); + self playerhide(); + maps\mp\_utility::freezecontrolswrapper( 1 ); + self disableammogeneration(); + self setdepthoffield( 0, 128, 512, 4000, 6, 1.8 ); +} + +setspawnvariables() +{ + self stopshellshock(); + self stoprumble( "damage_heavy" ); + self.deathposition = undefined; +} + +notifyconnecting() +{ + waittillframeend; + + if ( isdefined( self ) ) + level notify( "connecting", self ); +} + +logexostats() +{ + if ( isdefined( self.pers["numberOfTimesCloakingUsed"] ) ) + setmatchdata( "players", self.clientid, "numberOfTimesCloakingUsed", maps\mp\_utility::clamptobyte( self.pers["numberOfTimesCloakingUsed"] ) ); + + if ( isdefined( self.pers["numberOfTimesHoveringUsed"] ) ) + setmatchdata( "players", self.clientid, "numberOfTimesHoveringUsed", maps\mp\_utility::clamptobyte( self.pers["numberOfTimesHoveringUsed"] ) ); + + if ( isdefined( self.pers["numberOfTimesShieldUsed"] ) ) + setmatchdata( "players", self.clientid, "numberOfTimesShieldUsed", maps\mp\_utility::clamptobyte( self.pers["numberOfTimesShieldUsed"] ) ); + + if ( isdefined( self.pers["bulletsBlockedByShield"] ) ) + setmatchdata( "players", self.clientid, "bulletsBlockedByShield", self.pers["bulletsBlockedByShield"] ); +} + +logplayerstats() +{ + logexostats(); + + if ( isdefined( self.pers["totalKillcamsSkipped"] ) ) + setmatchdata( "players", self.clientid, "totalKillcamsSkipped", maps\mp\_utility::clamptobyte( self.pers["totalKillcamsSkipped"] ) ); + + if ( isdefined( self.pers["weaponPickupsCount"] ) ) + setmatchdata( "players", self.clientid, "weaponPickupsCount", maps\mp\_utility::clamptobyte( self.pers["weaponPickupsCount"] ) ); + + if ( isdefined( self.pers["suicides"] ) ) + setmatchdata( "players", self.clientid, "suicidesTotal", maps\mp\_utility::clamptobyte( self.pers["suicides"] ) ); + + if ( isdefined( self.pers["headshots"] ) ) + setmatchdata( "players", self.clientid, "headshotsTotal", maps\mp\_utility::clamptoshort( self.pers["headshots"] ) ); + + if ( isdefined( self.pers["pingAccumulation"] ) && isdefined( self.pers["pingSampleCount"] ) ) + { + if ( self.pers["pingSampleCount"] > 0 ) + { + var_0 = maps\mp\_utility::clamptobyte( self.pers["pingAccumulation"] / self.pers["pingSampleCount"] ); + setmatchdata( "players", self.clientid, "averagePing", var_0 ); + } + } + + if ( maps\mp\_utility::rankingenabled() ) + { + var_1 = 3; + var_2 = 0; + + for ( var_3 = 0; var_3 < var_1; var_3++ ) + { + var_4 = self getrankedplayerdata( "xpMultiplier", var_3 ); + + if ( isdefined( var_4 ) && var_4 > var_2 ) + var_2 = var_4; + } + + if ( var_2 > 0 ) + setmatchdata( "players", self.clientid, "xpMultiplier", var_2 ); + } + + if ( isdefined( self.pers["summary"] ) && isdefined( self.pers["summary"]["clanWarsXP"] ) ) + setmatchdata( "players", self.clientid, "clanWarsXp", self.pers["summary"]["clanWarsXP"] ); + + if ( isdefined( level.ishorde ) && level.ishorde ) + [[ level.hordeupdatetimestats ]]( self ); +} + +callback_playerdisconnect( var_0 ) +{ + if ( !isdefined( self.connected ) ) + return; + + setmatchdata( "players", self.clientid, "disconnectTimeUTC", getsystemtime() ); + setmatchdata( "players", self.clientid, "disconnectReason", var_0 ); + + if ( maps\mp\_utility::rankingenabled() ) + maps\mp\_matchdata::logfinalstats(); + + if ( isdefined( self.pers["confirmed"] ) ) + maps\mp\_matchdata::logkillsconfirmed(); + + if ( isdefined( self.pers["denied"] ) ) + maps\mp\_matchdata::logkillsdenied(); + + logplayerstats(); + + if ( maps\mp\_utility::isroundbased() ) + { + var_1 = game["roundsPlayed"] + 1; + setmatchdata( "players", self.clientid, "playerQuitRoundNumber", var_1 ); + + if ( isdefined( self.team ) && ( self.team == "allies" || self.team == "axis" ) ) + { + if ( self.team == "allies" ) + { + setmatchdata( "players", self.clientid, "playerQuitTeamScore", game["roundsWon"]["allies"] ); + setmatchdata( "players", self.clientid, "playerQuitOpposingTeamScore", game["roundsWon"]["axis"] ); + } + else + { + setmatchdata( "players", self.clientid, "playerQuitTeamScore", game["roundsWon"]["axis"] ); + setmatchdata( "players", self.clientid, "playerQuitOpposingTeamScore", game["roundsWon"]["allies"] ); + } + } + } + else if ( isdefined( self.team ) && ( self.team == "allies" || self.team == "axis" ) && level.teambased ) + { + if ( self.team == "allies" ) + { + setmatchdata( "players", self.clientid, "playerQuitTeamScore", game["teamScores"]["allies"] ); + setmatchdata( "players", self.clientid, "playerQuitOpposingTeamScore", game["teamScores"]["axis"] ); + } + else + { + setmatchdata( "players", self.clientid, "playerQuitTeamScore", game["teamScores"]["axis"] ); + setmatchdata( "players", self.clientid, "playerQuitOpposingTeamScore", game["teamScores"]["allies"] ); + } + } + + removeplayerondisconnect(); + maps\mp\gametypes\_spawnlogic::removefromparticipantsarray(); + maps\mp\gametypes\_spawnlogic::removefromcharactersarray(); + var_2 = self getentitynumber(); + + if ( !level.teambased ) + game["roundsWon"][self.guid] = undefined; + + if ( !level.gameended ) + maps\mp\_utility::logxpgains(); + + if ( level.splitscreen ) + { + var_3 = level.players; + + if ( var_3.size <= 1 ) + level thread maps\mp\gametypes\_gamelogic::forceend(); + } + + if ( isdefined( self.score ) && isdefined( self.pers["team"] ) ) + { + var_4 = self.score; + + if ( maps\mp\_utility::getminutespassed() ) + var_4 = self.score / maps\mp\_utility::getminutespassed(); + + setplayerteamrank( self, self.clientid, int( var_4 ) ); + } + + reconevent( "script_mp_playerquit: player_name %s, player %d, gameTime %d", self.name, self.clientid, gettime() ); + var_5 = self getentitynumber(); + var_6 = self.guid; + logprint( "Q;" + var_6 + ";" + var_5 + ";" + self.name + "\n" ); + thread maps\mp\_events::disconnected(); + + if ( level.gameended ) + maps\mp\gametypes\_gamescore::removedisconnectedplayerfromplacement(); + + if ( isdefined( self.team ) ) + removefromteamcount(); + + if ( self.sessionstate == "playing" && !( isdefined( self.fauxdead ) && self.fauxdead ) ) + removefromalivecount( 1 ); + else if ( self.sessionstate == "spectator" || self.sessionstate == "dead" ) + level thread maps\mp\gametypes\_gamelogic::updategameevents(); +} + +removeplayerondisconnect() +{ + var_0 = 0; + + for ( var_1 = 0; var_1 < level.players.size; var_1++ ) + { + if ( level.players[var_1] == self ) + { + for ( var_0 = 1; var_1 < level.players.size - 1; var_1++ ) + level.players[var_1] = level.players[var_1 + 1]; + + level.players[var_1] = undefined; + break; + } + } +} + +initclientdvarssplitscreenspecific() +{ +} + +initclientdvars() +{ + setdvar( "cg_drawTalk", 1 ); + setdvar( "cg_drawCrosshair", 1 ); + setdvar( "cg_drawCrosshairNames", 1 ); + setdvar( "cg_hudGrenadeIconMaxRangeFrag", 250 ); + + if ( level.hardcoremode ) + { + setdvar( "cg_drawTalk", 3 ); + setdvar( "cg_drawCrosshair", 0 ); + setdvar( "cg_drawCrosshairNames", 1 ); + setdvar( "cg_hudGrenadeIconMaxRangeFrag", 0 ); + } + + if ( isdefined( level.alwaysdrawfriendlynames ) && level.alwaysdrawfriendlynames ) + setdvar( "cg_drawFriendlyNamesAlways", 1 ); + else + setdvar( "cg_drawFriendlyNamesAlways", 0 ); +} + +getlowestavailableclientid() +{ + var_0 = 0; + + for ( var_1 = 0; var_1 < 30; var_1++ ) + { + foreach ( var_3 in level.players ) + { + if ( !isdefined( var_3 ) ) + continue; + + if ( var_3.clientid == var_1 ) + { + var_0 = 1; + break; + } + + var_0 = 0; + } + + if ( !var_0 ) + return var_1; + } +} + +setupsavedactionslots() +{ + self.saved_actionslotdata = []; + + for ( var_0 = 1; var_0 <= 4; var_0++ ) + { + self.saved_actionslotdata[var_0] = spawnstruct(); + self.saved_actionslotdata[var_0].type = ""; + self.saved_actionslotdata[var_0].item = undefined; + } + + if ( !level.console ) + { + for ( var_0 = 5; var_0 <= 8; var_0++ ) + { + self.saved_actionslotdata[var_0] = spawnstruct(); + self.saved_actionslotdata[var_0].type = ""; + self.saved_actionslotdata[var_0].item = undefined; + } + } +} + +logplayerconsoleidandonwifiinmatchdata() +{ + var_0 = getcodanywherecurrentplatform(); + var_1 = self getcommonplayerdata( "consoleIDChunkLow", var_0 ); + var_2 = self getcommonplayerdata( "consoleIDChunkHigh", var_0 ); + + if ( isdefined( var_1 ) && var_1 != 0 ) + setmatchdata( "players", self.clientid, "consoleIDChunkLow", var_1 ); + + if ( isdefined( var_2 ) && var_2 != 0 ) + setmatchdata( "players", self.clientid, "consoleIDChunkHigh", var_2 ); + + var_3 = 3; + var_4 = -1; + + if ( isdefined( var_2 ) && var_2 != 0 && isdefined( var_1 ) && var_1 != 0 ) + { + for ( var_5 = 0; var_5 < var_3; var_5++ ) + { + var_6 = self getcommonplayerdata( "deviceConnectionHistory", var_5, "device_id_high" ); + var_7 = self getcommonplayerdata( "deviceConnectionHistory", var_5, "device_id_low" ); + + if ( var_6 == var_2 && var_7 == var_1 ) + { + var_4 = var_5; + break; + } + } + } + + if ( var_4 == -1 ) + { + var_8 = 0; + + for ( var_5 = 0; var_5 < var_3; var_5++ ) + { + var_9 = self getcommonplayerdata( "deviceConnectionHistory", var_5, "deviceUseFrequency" ); + + if ( var_9 > var_8 ) + { + var_8 = var_9; + var_4 = var_5; + } + } + } + + if ( var_4 == -1 ) + var_4 = 0; + + var_10 = self getcommonplayerdata( "deviceConnectionHistory", var_4, "onWifi" ); + + if ( var_10 ) + setmatchdata( "players", self.clientid, "playingOnWifi", 1 ); +} + +truncateplayername( var_0 ) +{ + if ( level.xb3 && var_0.size > 18 ) + { + var_1 = common_scripts\utility::string_find( var_0, "]" ); + + if ( var_1 >= 0 && common_scripts\utility::string_starts_with( var_0, "[" ) ) + var_0 = getsubstr( var_0, var_1 + 1 ); + } + + return var_0; +} + +callback_playerconnect() +{ + var_0 = getrandomspectatorspawnpoint(); + self setspectatedefaults( var_0.origin, var_0.angles ); + thread notifyconnecting(); + self waittill( "begin" ); + self.connecttime = gettime(); + level notify( "connected", self ); + self.connected = 1; + + if ( self ishost() ) + level.player = self; + + if ( !level.splitscreen && !isdefined( self.pers["score"] ) ) + iprintln( &"MP_CONNECTED", self ); + + self.usingonlinedataoffline = self isusingonlinedataoffline(); + initclientdvars(); + initplayerstats(); + + if ( getdvar( "r_reflectionProbeGenerate" ) == "1" ) + level waittill( "eternity" ); + + self.guid = self getguid(); + self.xuid = self getxuid(); + self.totallifetime = 0; + var_1 = 0; + + if ( !isdefined( self.pers["clientid"] ) ) + { + if ( game["clientid"] >= 30 ) + self.pers["clientid"] = getlowestavailableclientid(); + else + self.pers["clientid"] = game["clientid"]; + + if ( game["clientid"] < 30 ) + game["clientid"]++; + + var_1 = 1; + } + + if ( var_1 && !maps\mp\_utility::invirtuallobby() ) + maps\mp\killstreaks\_killstreaks::resetadrenaline( 1 ); + + if ( maps\mp\_utility::practiceroundgame() && var_1 ) + maps\mp\gametypes\_class::assignpracticeroundclasses(); + + if ( var_1 ) + streamprimaryweapons(); + + self.clientid = self.pers["clientid"]; + self.pers["teamKillPunish"] = 0; + self.pers["suicideSpawnDelay"] = 0; + + if ( var_1 ) + reconevent( "script_mp_playerjoin: player_name %s, player %d, gameTime %d", self.name, self.clientid, gettime() ); + + logprint( "J;" + self.guid + ";" + self getentitynumber() + ";" + self.name + "\n" ); + + if ( game["clientid"] <= 30 && game["clientid"] != getmatchdata( "playerCount" ) ) + { + var_2 = 0; + var_3 = 0; + + if ( !isai( self ) && maps\mp\_utility::matchmakinggame() ) + self registerparty( self.clientid ); + + setmatchdata( "playerCount", game["clientid"] ); + setmatchdata( "players", self.clientid, "playerID", "xuid", self getxuid() ); + setmatchdata( "players", self.clientid, "playerID", "ucdIDHigh", self getucdidhigh() ); + setmatchdata( "players", self.clientid, "playerID", "ucdIDLow", self getucdidlow() ); + setmatchdata( "players", self.clientid, "playerID", "clanIDHigh", self getclanidhigh() ); + setmatchdata( "players", self.clientid, "playerID", "clanIDLow", self getclanidlow() ); + setmatchdata( "players", self.clientid, "gamertag", truncateplayername( self.name ) ); + setmatchdata( "players", self.clientid, "isBot", isai( self ) ); + var_4 = self getentitynumber(); + setmatchdata( "players", self.clientid, "codeClientNum", maps\mp\_utility::clamptobyte( var_4 ) ); + var_5 = getcodanywherecurrentplatform(); + var_3 = self getcommonplayerdata( "connectionIDChunkLow", var_5 ); + var_2 = self getcommonplayerdata( "connectionIDChunkHigh", var_5 ); + setmatchdata( "players", self.clientid, "connectionIDChunkLow", var_3 ); + setmatchdata( "players", self.clientid, "connectionIDChunkHigh", var_2 ); + setmatchclientip( self, self.clientid ); + setmatchdata( "players", self.clientid, "joinType", self getjointype() ); + setmatchdata( "players", self.clientid, "connectTimeUTC", getsystemtime() ); + setmatchdata( "players", self.clientid, "isSplitscreen", issplitscreen() ); + logplayerconsoleidandonwifiinmatchdata(); + + if ( self ishost() ) + setmatchdata( "players", self.clientid, "wasAHost", 1 ); + + if ( maps\mp\_utility::rankingenabled() ) + maps\mp\_matchdata::loginitialstats(); + + if ( istestclient( self ) || isai( self ) ) + var_6 = 1; + else + var_6 = 0; + + if ( maps\mp\_utility::matchmakinggame() && maps\mp\_utility::allowteamchoice() && !var_6 ) + setmatchdata( "players", self.clientid, "team", self.sessionteam ); + + if ( maps\mp\_utility::isaiteamparticipant( self ) ) + { + if ( !isdefined( level.matchdata ) ) + level.matchdata = []; + + if ( !isdefined( level.matchdata["botJoinCount"] ) ) + level.matchdata["botJoinCount"] = 1; + else + level.matchdata["botJoinCount"]++; + } + } + + if ( !level.teambased ) + game["roundsWon"][self.guid] = 0; + + self.leaderdialogqueue = []; + self.leaderdialoglocqueue = []; + self.leaderdialogactive = ""; + self.leaderdialoggroups = []; + self.leaderdialoggroup = ""; + + if ( !isdefined( self.pers["cur_kill_streak"] ) ) + { + self.pers["cur_kill_streak"] = 0; + self.killstreakcount = 0; + } + + if ( !isdefined( self.pers["cur_death_streak"] ) ) + self.pers["cur_death_streak"] = 0; + + if ( !isdefined( self.pers["cur_kill_streak_for_nuke"] ) ) + self.pers["cur_kill_streak_for_nuke"] = 0; + + if ( maps\mp\_utility::rankingenabled() ) + self.kill_streak = maps\mp\gametypes\_persistence::statget( "killStreak" ); + + self.lastgrenadesuicidetime = -1; + self.teamkillsthisround = 0; + self.hasspawned = 0; + self.waitingtospawn = 0; + self.wantsafespawn = 0; + self.wasaliveatmatchstart = 0; + self.movespeedscaler = level.baseplayermovescale; + self.killstreakscaler = 1; + self.objectivescaler = 1; + self.issniper = 0; + setupsavedactionslots(); + level thread monitorplayersegments( self ); + thread maps\mp\_flashgrenades::monitorflash(); + resetuidvarsonconnect(); + maps\mp\_snd_common_mp::snd_mp_player_join(); + waittillframeend; + level.players[level.players.size] = self; + maps\mp\gametypes\_spawnlogic::addtoparticipantsarray(); + maps\mp\gametypes\_spawnlogic::addtocharactersarray(); + + if ( level.teambased ) + self updatescores(); + + if ( game["state"] == "postgame" ) + { + self.connectedpostgame = 1; + spawnintermission(); + } + else + { + if ( isai( self ) && isdefined( level.bot_funcs ) && isdefined( level.bot_funcs["think"] ) ) + self thread [[ level.bot_funcs["think"] ]](); + + level endon( "game_ended" ); + + if ( isdefined( level.hostmigrationtimer ) ) + { + if ( !isdefined( self.hostmigrationcontrolsfrozen ) || self.hostmigrationcontrolsfrozen == 0 ) + { + self.hostmigrationcontrolsfrozen = 0; + thread maps\mp\gametypes\_hostmigration::hostmigrationtimerthink(); + } + } + + if ( isdefined( level.onplayerconnectaudioinit ) ) + [[ level.onplayerconnectaudioinit ]](); + + if ( !isdefined( self.pers["team"] ) ) + { + if ( maps\mp\_utility::matchmakinggame() && self.sessionteam != "none" ) + { + thread spawnspectator(); + + if ( isdefined( level.waitingforplayers ) && level.waitingforplayers ) + maps\mp\_utility::freezecontrolswrapper( 1 ); + + thread maps\mp\gametypes\_menus::setteam( self.sessionteam ); + + if ( maps\mp\_utility::allowclasschoice() ) + thread setuioptionsmenu( 2 ); + + thread kickifdontspawn(); + return; + } + else if ( maps\mp\_utility::allowteamchoice() && !isbot( self ) ) + { + maps\mp\gametypes\_menus::menuspectator(); + thread setuioptionsmenu( 1 ); + } + else + { + thread spawnspectator(); + self [[ level.autoassign ]](); + + if ( maps\mp\_utility::allowclasschoice() ) + thread setuioptionsmenu( 2 ); + + if ( maps\mp\_utility::matchmakinggame() ) + thread kickifdontspawn(); + + return; + } + } + else + { + maps\mp\gametypes\_menus::addtoteam( self.pers["team"], 1 ); + + if ( maps\mp\_utility::isvalidclass( self.pers["class"] ) ) + { + thread spawnclient(); + return; + } + + thread spawnspectator(); + + if ( self.pers["team"] == "spectator" ) + { + if ( maps\mp\_utility::allowteamchoice() ) + { + maps\mp\gametypes\_menus::beginteamchoice(); + return; + } + + self [[ level.autoassign ]](); + return; + return; + } + + maps\mp\gametypes\_menus::beginclasschoice(); + } + } +} + +callback_playermigrated() +{ + if ( isdefined( self.connected ) && self.connected ) + { + maps\mp\_utility::updateobjectivetext(); + maps\mp\_utility::updatemainmenu(); + + if ( level.teambased ) + self updatescores(); + } + + if ( self ishost() ) + { + initclientdvarssplitscreenspecific(); + setmatchdata( "players", self.clientid, "wasAHost", 1 ); + } + + var_0 = 0; + + foreach ( var_2 in level.players ) + { + if ( !isbot( var_2 ) && !istestclient( var_2 ) ) + var_0++; + } + + if ( !isbot( self ) && !istestclient( self ) ) + { + level.hostmigrationreturnedplayercount++; + + if ( level.hostmigrationreturnedplayercount >= var_0 * 2 / 3 ) + level notify( "hostmigration_enoughplayers" ); + + self notify( "player_migrated" ); + } +} + +forcespawn() +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "spawned" ); + wait 60.0; + + if ( self.hasspawned ) + return; + + if ( self.pers["team"] == "spectator" ) + return; + + if ( !maps\mp\_utility::isvalidclass( self.pers["class"] ) ) + { + self.pers["class"] = "CLASS_CUSTOM1"; + self.class = self.pers["class"]; + maps\mp\gametypes\_class::clearcopycatloadout(); + } + + thread spawnclient(); +} + +kickifdontspawn() +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "spawned" ); + self endon( "attempted_spawn" ); + var_0 = getdvarfloat( "scr_kick_time", 90 ); + var_1 = getdvarfloat( "scr_kick_mintime", 45 ); + var_2 = gettime(); + + if ( self ishost() ) + kickwait( 120 ); + else + kickwait( var_0 ); + + var_3 = ( gettime() - var_2 ) / 1000; + + if ( var_3 < var_0 - 0.1 && var_3 < var_1 ) + return; + + if ( self.hasspawned ) + return; + + if ( self.pers["team"] == "spectator" ) + return; + + kick( self getentitynumber(), "EXE_PLAYERKICKED_INACTIVE" ); + level thread maps\mp\gametypes\_gamelogic::updategameevents(); +} + +kickwait( var_0 ) +{ + level endon( "game_ended" ); + maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_0 ); +} + +initplayerstats() +{ + maps\mp\gametypes\_persistence::initbufferedstats(); + self.pers["lives"] = maps\mp\_utility::getgametypenumlives(); + + if ( !isdefined( self.pers["deaths"] ) ) + { + maps\mp\_utility::initpersstat( "deaths" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "deaths", 0 ); + } + + self.deaths = maps\mp\_utility::getpersstat( "deaths" ); + + if ( !isdefined( self.pers["score"] ) ) + { + maps\mp\_utility::initpersstat( "score" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "score", 0 ); + maps\mp\gametypes\_persistence::statsetchildbuffered( "round", "timePlayed", 0 ); + } + + self.score = maps\mp\_utility::getpersstat( "score" ); + self.timeplayed["total"] = maps\mp\gametypes\_persistence::statgetchildbuffered( "round", "timePlayed" ); + + if ( !isdefined( self.pers["suicides"] ) ) + maps\mp\_utility::initpersstat( "suicides" ); + + self.suicides = maps\mp\_utility::getpersstat( "suicides" ); + + if ( !isdefined( self.pers["kills"] ) ) + { + maps\mp\_utility::initpersstat( "kills" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "kills", 0 ); + } + + self.kills = maps\mp\_utility::getpersstat( "kills" ); + + if ( !isdefined( self.pers["headshots"] ) ) + { + maps\mp\_utility::initpersstat( "headshots" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "headshots", 0 ); + } + + self.headshots = maps\mp\_utility::getpersstat( "headshots" ); + + if ( !isdefined( self.pers["assists"] ) ) + { + maps\mp\_utility::initpersstat( "assists" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "assists", 0 ); + } + + self.assists = maps\mp\_utility::getpersstat( "assists" ); + + if ( !isdefined( self.pers["captures"] ) ) + { + maps\mp\_utility::initpersstat( "captures" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "captures", 0 ); + } + + if ( !isdefined( self.pers["returns"] ) ) + { + maps\mp\_utility::initpersstat( "returns" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "returns", 0 ); + } + + self.returns = maps\mp\_utility::getpersstat( "returns" ); + + if ( !isdefined( self.pers["defends"] ) ) + { + maps\mp\_utility::initpersstat( "defends" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "defends", 0 ); + } + + if ( !isdefined( self.pers["plants"] ) ) + { + maps\mp\_utility::initpersstat( "plants" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "plants", 0 ); + } + + if ( !isdefined( self.pers["defuses"] ) ) + { + maps\mp\_utility::initpersstat( "defuses" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "defuses", 0 ); + } + + if ( !isdefined( self.pers["destructions"] ) ) + { + maps\mp\_utility::initpersstat( "destructions" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "destructions", 0 ); + } + + if ( !isdefined( self.pers["confirmed"] ) ) + { + maps\mp\_utility::initpersstat( "confirmed" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "confirmed", 0 ); + } + + if ( !isdefined( self.pers["denied"] ) ) + { + maps\mp\_utility::initpersstat( "denied" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "denied", 0 ); + } + + if ( !isdefined( self.pers["rescues"] ) ) + { + maps\mp\_utility::initpersstat( "rescues" ); + maps\mp\gametypes\_persistence::statsetchild( "round", "rescues", 0 ); + } + + if ( !isdefined( self.pers["teamkills"] ) ) + maps\mp\_utility::initpersstat( "teamkills" ); + + if ( !isdefined( self.pers["totalTeamKills"] ) ) + maps\mp\_utility::initpersstat( "totalTeamKills" ); + + if ( !isdefined( self.pers["extrascore0"] ) ) + maps\mp\_utility::initpersstat( "extrascore0" ); + + if ( !isdefined( self.pers["extrascore1"] ) ) + maps\mp\_utility::initpersstat( "extrascore1" ); + + if ( !isdefined( self.pers["teamKillPunish"] ) ) + self.pers["teamKillPunish"] = 0; + + if ( !isdefined( self.pers["suicideSpawnDelay"] ) ) + self.pers["suicideSpawnDelay"] = 0; + + maps\mp\_utility::initpersstat( "longestStreak" ); + self.pers["lives"] = maps\mp\_utility::getgametypenumlives(); + maps\mp\gametypes\_persistence::statsetchild( "round", "killStreak", 0 ); + maps\mp\gametypes\_persistence::statsetchild( "round", "loss", 0 ); + maps\mp\gametypes\_persistence::statsetchild( "round", "win", 0 ); + maps\mp\gametypes\_persistence::statsetchild( "round", "scoreboardType", "none" ); + + if ( maps\mp\_utility::rankingenabled() ) + { + if ( !isdefined( self.pers["previous_shots"] ) ) + self.pers["previous_shots"] = self getrankedplayerdata( "totalShots" ); + + if ( !isdefined( self.pers["previous_hits"] ) ) + self.pers["previous_hits"] = self getrankedplayerdata( "hits" ); + } + + if ( !isdefined( self.pers["mpWeaponStats"] ) ) + self.pers["mpWeaponStats"] = []; + + if ( !isdefined( self.pers["numberOfTimesCloakingUsed"] ) ) + self.pers["numberOfTimesCloakingUsed"] = 0; + + if ( !isdefined( self.pers["numberOfTimesHoveringUsed"] ) ) + self.pers["numberOfTimesHoveringUsed"] = 0; + + if ( !isdefined( self.pers["numberOfTimesShieldUsed"] ) ) + self.pers["numberOfTimesShieldUsed"] = 0; + + if ( !isdefined( self.pers["bulletsBlockedByShield"] ) ) + self.pers["bulletsBlockedByShield"] = 0; + + if ( !isdefined( self.pers["totalKillcamsSkipped"] ) ) + self.pers["totalKillcamsSkipped"] = 0; + + if ( !isdefined( self.pers["weaponPickupsCount"] ) ) + self.pers["weaponPickupsCount"] = 0; + + if ( !isdefined( self.pers["pingAccumulation"] ) ) + self.pers["pingAccumulation"] = 0; + + if ( !isdefined( self.pers["pingSampleCount"] ) ) + self.pers["pingSampleCount"] = 0; + + if ( !isdefined( self.pers["minPing"] ) ) + self.pers["minPing"] = 32767; + + if ( !isdefined( self.pers["maxPing"] ) ) + self.pers["maxPing"] = 0; + + if ( !isdefined( self.pers["validationInfractions"] ) ) + self.pers["validationInfractions"] = 0; +} + +addtoteamcount() +{ + level.teamcount[self.team]++; + + if ( !isdefined( level.teamlist ) ) + level.teamlist = []; + + if ( !isdefined( level.teamlist[self.team] ) ) + level.teamlist[self.team] = []; + + level.teamlist[self.team][level.teamlist[self.team].size] = self; + maps\mp\gametypes\_gamelogic::updategameevents(); +} + +removefromteamcount() +{ + level.teamcount[self.team]--; + + if ( isdefined( level.teamlist ) && isdefined( level.teamlist[self.team] ) ) + { + var_0 = []; + + foreach ( var_2 in level.teamlist[self.team] ) + { + if ( !isdefined( var_2 ) || var_2 == self ) + continue; + + var_0[var_0.size] = var_2; + } + + level.teamlist[self.team] = var_0; + } +} + +addtoalivecount() +{ + var_0 = self.team; + + if ( !( isdefined( self.alreadyaddedtoalivecount ) && self.alreadyaddedtoalivecount ) ) + { + level.hasspawned[var_0]++; + incrementalivecount( var_0 ); + } + + self.alreadyaddedtoalivecount = undefined; + + if ( level.alivecount["allies"] + level.alivecount["axis"] > level.maxplayercount ) + level.maxplayercount = level.alivecount["allies"] + level.alivecount["axis"]; +} + +incrementalivecount( var_0 ) +{ + level.alivecount[var_0]++; +} + +removefromalivecount( var_0 ) +{ + var_1 = self.team; + + if ( isdefined( self.switching_teams ) && self.switching_teams && isdefined( self.joining_team ) && self.joining_team == self.team ) + var_1 = self.leaving_team; + + if ( isdefined( self.switching_teams ) || isdefined( var_0 ) ) + { + removeallfromlivescount(); + + if ( isdefined( self.switching_teams ) ) + self.pers["lives"] = 0; + } + + decrementalivecount( var_1 ); + return maps\mp\gametypes\_gamelogic::updategameevents(); +} + +decrementalivecount( var_0 ) +{ + level.alivecount[var_0]--; +} + +addtolivescount() +{ + level.livescount[self.team] += self.pers["lives"]; +} + +removefromlivescount() +{ + level.livescount[self.team]--; + level.livescount[self.team] = int( max( 0, level.livescount[self.team] ) ); +} + +removeallfromlivescount() +{ + level.livescount[self.team] -= self.pers["lives"]; + level.livescount[self.team] = int( max( 0, level.livescount[self.team] ) ); +} + +resetuidvarsonspawn() +{ + self setclientomnvar( "ui_carrying_bomb", 0 ); + self setclientomnvar( "ui_capture_icon", 0 ); + self setclientomnvar( "ui_light_armor", 0 ); + self setclientomnvar( "ui_killcam_end_milliseconds", 0 ); + self setclientomnvar( "ui_uplink_can_pass", 0 ); + self setclientomnvar( "ui_light_armor_percent", 0 ); + self setclientomnvar( "ui_killcam_time_until_spawn", 0 ); +} + +resetuidvarsonconnect() +{ + self setclientomnvar( "ui_carrying_bomb", 0 ); + self setclientomnvar( "ui_capture_icon", 0 ); + self setclientomnvar( "ui_light_armor", 0 ); + self setclientomnvar( "ui_killcam_end_milliseconds", 0 ); +} + +resetuidvarsonspectate() +{ + self setclientomnvar( "ui_carrying_bomb", 0 ); + self setclientomnvar( "ui_capture_icon", 0 ); + self setclientomnvar( "ui_light_armor", 0 ); + self setclientomnvar( "ui_killcam_end_milliseconds", 0 ); +} + +resetuidvarsondeath() +{ + +} + +monitorplayersegments( var_0 ) +{ + var_0 endon( "disconnect" ); + level endon( "game_ended" ); + createplayersegmentstats( var_0 ); + + for (;;) + { + var_0 waittill( "spawned_player" ); + recordsegemtdata( var_0 ); + } +} + +createplayersegmentstats( var_0 ) +{ + if ( !isdefined( var_0.pers["segments"] ) ) + var_0.pers["segments"] = []; + + var_0.segments = var_0.pers["segments"]; + + if ( !var_0.segments.size ) + { + var_0.segments["distanceTotal"] = 0; + var_0.segments["movingTotal"] = 0; + var_0.segments["movementUpdateCount"] = 0; + var_0.segments["killDistanceTotal"] = 0; + var_0.segments["killDistanceCount"] = 0; + } +} + +recordsegemtdata( var_0 ) +{ + var_0 endon( "death" ); + + while ( !maps\mp\_utility::gameflag( "prematch_done" ) ) + wait 0.5; + + wait 4; + var_0.savedposition = var_0.origin; + var_0.positionptm = var_0.origin; + + for (;;) + { + wait 1; + + if ( var_0 maps\mp\_utility::isusingremote() ) + { + var_0 waittill( "stopped_using_remote" ); + var_0.savedposition = var_0.origin; + var_0.positionptm = var_0.origin; + continue; + } + + var_0.segments["movementUpdateCount"]++; + var_0.segments["distanceTotal"] += distance2d( var_0.savedposition, var_0.origin ); + var_0.savedposition = var_0.origin; + + if ( var_0.segments["movementUpdateCount"] % 5 == 0 ) + { + var_1 = distance2d( var_0.positionptm, var_0.origin ); + var_0.positionptm = var_0.origin; + + if ( var_1 > 16 ) + var_0.segments["movingTotal"]++; + } + } +} + +writesegmentdata( var_0 ) +{ + if ( level.players.size < 2 ) + return; + + var_0 endon( "disconnect" ); + + if ( var_0.segments["movementUpdateCount"] < 30 || var_0.segments["killDistanceCount"] < 1 ) + return; + + var_1 = var_0.segments["movingTotal"] / int( var_0.segments["movementUpdateCount"] / 5 ) * 100; + var_2 = var_0.segments["distanceTotal"] / var_0.segments["movementUpdateCount"]; + var_3 = var_0.segments["killDistanceTotal"] / var_0.segments["killDistanceCount"]; + var_1 = min( var_1, float( tablelookup( "mp/playerSegments.csv", 0, "MAX", 3 ) ) ); + var_2 = min( var_2, float( tablelookup( "mp/playerSegments.csv", 0, "MAX", 2 ) ) ); + var_3 = min( var_3, float( tablelookup( "mp/playerSegments.csv", 0, "MAX", 4 ) ) ); + var_4 = calculatematchplaystyle( var_1, var_2, var_3 ); + setmatchdata( "players", var_0.clientid, "averageSpeedDuringMatch", var_2 ); + setmatchdata( "players", var_0.clientid, "percentageOfTimeMoving", var_1 ); + setmatchdata( "players", var_0.clientid, "averageKillDistance", var_3 ); + setmatchdata( "players", var_0.clientid, "totalDistanceTravelled", var_0.segments["distanceTotal"] ); + setmatchdata( "players", var_0.clientid, "playstyle", maps\mp\_utility::clamptobyte( var_4 ) ); + + if ( isai( var_0 ) ) + return; + + reconevent( "script_PlayerSegments: percentTimeMoving %f, averageSpeed %f, averageKillDistance %f, playStyle %d, name %s", var_1, var_2, var_3, var_4, var_0.name ); + + if ( !var_0 maps\mp\_utility::rankingenabled() ) + return; + + var_5 = 50; + var_6 = var_0 getrankedplayerdata( "combatRecord", "numPlayStyleTrends" ); + var_6++; + + if ( var_6 > var_5 ) + { + var_6 = var_5; + + if ( var_5 > 1 ) + { + for ( var_7 = 0; var_7 < var_5 - 1; var_7++ ) + { + var_8 = var_0 getrankedplayerdata( "combatRecord", "playStyleTimeStamp", var_7 + 1 ); + var_9 = var_0 getrankedplayerdata( "combatRecord", "playStyle", var_7 + 1 ); + var_0 setrankedplayerdata( "combatRecord", "playStyleTimeStamp", var_7, var_8 ); + var_0 setrankedplayerdata( "combatRecord", "playStyle", var_7, var_9 ); + } + } + } + + var_8 = maps\mp\_utility::gettimeutc_for_stat_recording(); + var_0 setrankedplayerdata( "combatRecord", "playStyleTimeStamp", var_6 - 1, var_8 ); + var_0 setrankedplayerdata( "combatRecord", "playStyle", var_6 - 1, var_4 ); + var_0 setrankedplayerdata( "combatRecord", "numPlayStyleTrends", var_6 ); +} + +calculatematchplaystyle( var_0, var_1, var_2 ) +{ + var_0 = normalizeplayersegment( var_0, float( tablelookup( "mp/playerSegments.csv", 0, "Mean", 3 ) ), float( tablelookup( "mp/playerSegments.csv", 0, "SD", 3 ) ) ); + var_1 = normalizeplayersegment( var_1, float( tablelookup( "mp/playerSegments.csv", 0, "Mean", 2 ) ), float( tablelookup( "mp/playerSegments.csv", 0, "SD", 2 ) ) ); + var_2 = normalizeplayersegment( var_2, float( tablelookup( "mp/playerSegments.csv", 0, "Mean", 4 ) ), float( tablelookup( "mp/playerSegments.csv", 0, "SD", 4 ) ) ); + var_3 = ( var_0, var_1, var_2 ); + var_4 = [ "Camper", "Mobile", "Run", "Sniper", "TacCQ" ]; + var_5 = "Camper"; + var_6 = 1000; + + foreach ( var_8 in var_4 ) + { + var_9 = getcentroiddistance( var_3, var_8 ); + + if ( var_9 < var_6 ) + { + var_5 = var_8; + var_6 = var_9; + } + } + + return int( tablelookup( "mp/playerSegments.csv", 0, var_5, 1 ) ); +} + +normalizeplayersegment( var_0, var_1, var_2 ) +{ + return ( var_0 - var_1 ) / var_2; +} + +getcentroiddistance( var_0, var_1 ) +{ + var_2 = ( float( tablelookup( "mp/playerSegments.csv", 0, var_1, 3 ) ), float( tablelookup( "mp/playerSegments.csv", 0, var_1, 2 ) ), float( tablelookup( "mp/playerSegments.csv", 0, var_1, 4 ) ) ); + return distance( var_0, var_2 ); +} + +clearpracticeroundlockoutdata( var_0, var_1 ) +{ + var_0 setcommonplayerdata( "practiceRoundLockoutTime", 0 ); + + for ( var_2 = 0; var_2 < var_1; var_2++ ) + var_0 setcommonplayerdata( "practiceRoundLockoutMatchTimes", var_2, 0 ); +} + +checkpracticeroundlockout( var_0 ) +{ + if ( isbot( var_0 ) || isagent( var_0 ) ) + return; + + var_1 = 10; + var_2 = 3; + var_3 = 5.0; + var_4 = int( 86400 ); + var_5 = int( 86400 ); + var_6 = var_0 getcommonplayerdata( "practiceRoundLockoutTime" ); + + if ( var_6 > 0 ) + clearpracticeroundlockoutdata( var_0, var_1 ); + + var_7 = var_0 getcommonplayerdata( "round", "kills" ); + var_8 = var_0 getcommonplayerdata( "round", "deaths" ); + var_8 = max( var_8, 1 ); + var_9 = var_7 / var_8; + + if ( var_9 < var_3 ) + { + clearpracticeroundlockoutdata( var_0, var_1 ); + return; + } + else + { + var_10 = maps\mp\_utility::gettimeutc_for_stat_recording(); + var_11 = var_10 - var_4; + var_12 = -1; + var_13 = var_10; + var_14 = 1; + + for ( var_15 = 0; var_15 < var_1; var_15++ ) + { + var_16 = var_0 getcommonplayerdata( "practiceRoundLockoutMatchTimes", var_15 ); + + if ( var_16 < var_13 ) + { + var_13 = var_16; + var_12 = var_15; + } + + if ( var_16 >= var_11 ) + var_14++; + } + + var_0 setcommonplayerdata( "practiceRoundLockoutMatchTimes", var_12, var_10 ); + + if ( var_14 >= var_2 ) + { + var_17 = var_10 + var_5; + var_0 setcommonplayerdata( "practiceRoundLockoutTime", var_17 ); + } + } +} diff --git a/data/maps/mp/gametypes/gun.gsc b/data/maps/mp/gametypes/gun.gsc new file mode 100644 index 0000000..0c90a28 --- /dev/null +++ b/data/maps/mp/gametypes/gun.gsc @@ -0,0 +1,507 @@ +// S1 GSC SOURCE +// Dumped by https://github.com/xensik/gsc-tool + +main() +{ + maps\mp\gametypes\_globallogic::init(); + maps\mp\gametypes\_callbacksetup::setupcallbacks(); + maps\mp\gametypes\_globallogic::setupcallbacks(); + setguns(); + maps\mp\_utility::registertimelimitdvar( level.gametype, 10 ); + setdvar( "scr_gun_scorelimit", level.gun_guns.size ); + maps\mp\_utility::registerscorelimitdvar( level.gametype, level.gun_guns.size ); + level thread reinitializescorelimitonmigration(); + maps\mp\_utility::registerroundlimitdvar( level.gametype, 1 ); + maps\mp\_utility::registerwinlimitdvar( level.gametype, 0 ); + maps\mp\_utility::registernumlivesdvar( level.gametype, 0 ); + maps\mp\_utility::registerhalftimedvar( level.gametype, 0 ); + level.matchrules_randomize = 0; + level.matchrules_damagemultiplier = 0; + level.matchrules_vampirism = 0; + + setspecialloadout(); + level.teambased = 0; + level.doprematch = 1; + level.onstartgametype = ::onstartgametype; + level.onspawnplayer = ::onspawnplayer; + level.getspawnpoint = ::getspawnpoint; + level.onplayerkilled = ::onplayerkilled; + level.ontimelimit = ::ontimelimit; + level.onplayerscore = ::onplayerscore; + level.bypassclasschoicefunc = ::gungameclass; + level.assists_disabled = 1; + level.setbacklevel = maps\mp\_utility::getintproperty( "scr_setback_levels", 1 ); + level.lastguntimevo = 0; + + if ( level.matchrules_damagemultiplier ) + level.modifyplayerdamage = maps\mp\gametypes\_damage::gamemodemodifyplayerdamage; + + setteammode( "ffa" ); + game["dialog"]["gametype"] = "gg_intro"; + game["dialog"]["defense_obj"] = "gbl_start"; + game["dialog"]["offense_obj"] = "gbl_start"; + game["dialog"]["humiliation"] = "gg_humiliation"; + game["dialog"]["lastgun"] = "at_anr1_gg_lastgun"; + + if ( maps\mp\_utility::isgrapplinghookgamemode() ) + game["dialog"]["gametype"] = "grap_" + game["dialog"]["gametype"]; +} + +initializematchrules() +{ + maps\mp\_utility::setcommonrulesfrommatchrulesdata( 1 ); + level.matchrules_randomize = getmatchrulesdata( "gunData", "randomize" ); + setdvar( "scr_gun_scorelimit", level.gun_guns.size ); + maps\mp\_utility::registerscorelimitdvar( level.gametype, level.gun_guns.size ); + setdvar( "scr_gun_winlimit", 1 ); + maps\mp\_utility::registerwinlimitdvar( "gun", 1 ); + setdvar( "scr_gun_roundlimit", 1 ); + maps\mp\_utility::registerroundlimitdvar( "gun", 1 ); + setdvar( "scr_gun_halftime", 0 ); + maps\mp\_utility::registerhalftimedvar( "gun", 0 ); + setdvar( "scr_gun_playerrespawndelay", 0 ); + setdvar( "scr_gun_waverespawndelay", 0 ); + setdvar( "scr_player_forcerespawn", 1 ); + setdvar( "scr_setback_levels", getmatchrulesdata( "gunData", "setbackLevels" ) ); +} + +reinitializescorelimitonmigration() +{ + setdvar( "scr_gun_scorelimit", level.gun_guns.size ); + maps\mp\_utility::registerscorelimitdvar( level.gametype, level.gun_guns.size ); +} + +onstartgametype() +{ + setclientnamemode( "auto_change" ); + maps\mp\_utility::setobjectivetext( "allies", &"OBJECTIVES_DM" ); + maps\mp\_utility::setobjectivetext( "axis", &"OBJECTIVES_DM" ); + maps\mp\_utility::setobjectivescoretext( "allies", &"OBJECTIVES_DM_SCORE" ); + maps\mp\_utility::setobjectivescoretext( "axis", &"OBJECTIVES_DM_SCORE" ); + maps\mp\_utility::setobjectivehinttext( "allies", &"OBJECTIVES_DM_HINT" ); + maps\mp\_utility::setobjectivehinttext( "axis", &"OBJECTIVES_DM_HINT" ); + initspawns(); + var_0 = []; + maps\mp\gametypes\_gameobjects::main( var_0 ); + level.quickmessagetoall = 1; + level.blockweapondrops = 1; + level thread onplayerconnect(); +} + +initspawns() +{ + level.spawnmins = ( 0, 0, 0 ); + level.spawnmaxs = ( 0, 0, 0 ); + level.spawn_name = "mp_dm_spawn"; + maps\mp\gametypes\_spawnlogic::addspawnpoints( "allies", level.spawn_name ); + maps\mp\gametypes\_spawnlogic::addspawnpoints( "axis", level.spawn_name ); + level.mapcenter = maps\mp\gametypes\_spawnlogic::findboxcenter( level.spawnmins, level.spawnmaxs ); + setmapcenter( level.mapcenter ); +} + +onplayerconnect() +{ + for (;;) + { + level waittill( "connected", player ); + player.gungamegunindex = 0; + player.gungameprevgunindex = 0; + player.stabs = 0; + player.mysetbacks = 0; + player.lastleveluptime = 0; + player.showsetbacksplash = 0; + + if ( level.matchrules_randomize ) + player.gunlist = common_scripts\utility::array_randomize( level.gun_guns ); + + player thread refillammo(); + player thread refillsinglecountammo(); + player thread watchforhostmigration(); + } +} + +getspawnpoint() +{ + var_0 = maps\mp\gametypes\_spawnlogic::getteamspawnpoints( self.pers["team"] ); + + if ( level.ingraceperiod ) + var_1 = maps\mp\gametypes\_spawnlogic::getspawnpoint_random( var_0 ); + else + var_1 = maps\mp\gametypes\_spawnscoring::getspawnpoint_freeforall( var_0 ); + + maps\mp\gametypes\_spawnlogic::recon_set_spawnpoint( var_1 ); + return var_1; +} + +gungameclass() +{ + self.pers["class"] = "gamemode"; + self.pers["lastClass"] = ""; + self.pers["gamemodeLoadout"] = level.gun_loadout; + self.class = self.pers["class"]; + self.lastclass = self.pers["lastClass"]; + self loadweapons( level.gun_guns[0] ); +} + +onspawnplayer() +{ + thread waitloadoutdone(); +} + +waitloadoutdone() +{ + level endon( "game_ended" ); + self endon( "disconnect" ); + level waittill( "player_spawned" ); + givenextgun( 1 ); + + if ( self.showsetbacksplash ) + { + self.showsetbacksplash = 0; + thread maps\mp\_events::decreasegunlevelevent(); + } +} + +watchforhostmigration() +{ + level endon( "game_ended" ); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "player_migrated" ); + + if ( self.sessionstate == "spectator" ) + maps\mp\gametypes\_menus::handleclasschoicedisallowed(); + } +} + +onplayerscore( var_0, var_1, var_2 ) +{ + if ( var_0 == "gained_gun_score" ) + { + var_3 = maps\mp\gametypes\_rank::getscoreinfovalue( var_0 ); + var_1 maps\mp\_utility::setextrascore0( var_1.extrascore0 + var_3 ); + var_1 maps\mp\gametypes\_gamescore::updatescorestatsffa( var_1, var_3 ); + return 1; + } + + if ( var_0 == "dropped_gun_score" ) + { + var_4 = min( level.setbacklevel, self.score ); + return int( var_4 * -1 ); + } + + return 0; +} + +onplayerkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ) +{ + if ( !isdefined( var_1 ) ) + return; + + if ( var_3 == "MOD_TRIGGER_HURT" && !isplayer( var_1 ) ) + var_1 = self; + + if ( var_3 == "MOD_FALLING" || isplayer( var_1 ) ) + { + if ( var_3 == "MOD_FALLING" || var_1 == self || maps\mp\_utility::ismeleemod( var_3 ) && var_4 != "riotshield_mp" || var_4 == "boost_slam_mp" || var_4 == "iw5_dlcgun12loot8_mp" ) + { + self playlocalsound( "mp_war_objective_lost" ); + self.gungameprevgunindex = self.gungamegunindex; + self.gungamegunindex = int( max( 0, self.gungamegunindex - level.setbacklevel ) ); + self.lastkillweapon = undefined; + + if ( self.gungameprevgunindex > self.gungamegunindex ) + { + self.mysetbacks++; + maps\mp\_utility::setextrascore1( self.mysetbacks ); + self.showsetbacksplash = 1; + + if ( maps\mp\_utility::ismeleemod( var_3 ) || var_4 == "boost_slam_mp" || var_4 == "iw5_dlcgun12loot8_mp" ) + { + var_1.stabs++; + var_1.assists = var_1.stabs; + var_1 thread maps\mp\_events::setbackenemygunlevelevent(); + + if ( self.gungameprevgunindex == level.gun_guns.size - 1 ) + { + var_1 thread maps\mp\_events::setbackfirstplayergunlevelevent(); + var_1 maps\mp\_utility::leaderdialogonplayer( "humiliation", "status" ); + } + } + } + } + else if ( var_3 == "MOD_PISTOL_BULLET" || var_3 == "MOD_RIFLE_BULLET" || var_3 == "MOD_HEAD_SHOT" || var_3 == "MOD_PROJECTILE" || var_3 == "MOD_PROJECTILE_SPLASH" || var_3 == "MOD_EXPLOSIVE" || var_3 == "MOD_IMPACT" || var_3 == "MOD_GRENADE" || var_3 == "MOD_GRENADE_SPLASH" || maps\mp\_utility::ismeleemod( var_3 ) && var_4 == "riotshield_mp" ) + { + if ( isdefined( var_1.lastkillweapon ) && var_1.lastkillweapon == var_4 ) + return; + + var_10 = level.gun_guns; + + if ( level.matchrules_randomize ) + var_10 = var_1.gunlist; + + var_11 = var_10[var_1.gungamegunindex]; + + if ( !issubstr( var_4, maps\mp\_utility::getbaseweaponname( var_11 ) ) ) + return; + + var_1.lastkillweapon = var_4; + + if ( var_1.lastleveluptime + 3000 > gettime() ) + var_1 thread maps\mp\_events::quickgunlevelevent(); + + var_1.lastleveluptime = gettime(); + var_1.gungameprevgunindex = var_1.gungamegunindex; + var_1.gungamegunindex++; + var_1 thread maps\mp\_events::increasegunlevelevent(); + + if ( var_1.gungamegunindex == level.gun_guns.size - 1 ) + { + maps\mp\_utility::playsoundonplayers( "mp_enemy_obj_captured" ); + level thread maps\mp\_utility::teamplayercardsplash( "callout_top_gun_rank", var_1 ); + var_12 = gettime(); + + if ( level.lastguntimevo + 4500 < var_12 ) + { + level thread maps\mp\_utility::leaderdialogonplayers( "lastgun", level.players, "status" ); + level.lastguntimevo = var_12; + } + } + + if ( var_1.gungamegunindex < level.gun_guns.size ) + var_1 givenextgun( 0, var_4 ); + } + } +} + +givenextgun( var_0, var_1 ) +{ + self endon( "disconnect" ); + var_2 = getnextgun(); + self.gun_curgun = var_2; + var_2 = addattachments( var_2 ); + + while ( !self loadweapons( var_2 ) ) + waitframe(); + + if ( isdefined( var_1 ) ) + self takeweapon( var_1 ); + else + self takeallweapons(); + + maps\mp\_utility::_giveweapon( var_2 ); + self switchtoweaponimmediate( var_2 ); + + if ( isdefined( var_0 ) && var_0 == 1 ) + self setspawnweapon( var_2 ); + + var_3 = maps\mp\_utility::getbaseweaponname( var_2 ); + self.pers["primaryWeapon"] = var_3; + self.primaryweapon = var_2; + self givestartammo( var_2 ); + self switchtoweapon( var_2 ); + self.gungameprevgunindex = self.gungamegunindex; +} + +getnextgun() +{ + var_0 = level.gun_guns; + var_1 = []; + var_2 = undefined; + + if ( level.matchrules_randomize ) + var_0 = self.gunlist; + + var_2 = var_0[self.gungamegunindex]; + var_1[var_1.size] = var_2; + + if ( self.gungamegunindex + 1 < var_0.size ) + var_1[var_1.size] = var_0[self.gungamegunindex + 1]; + + if ( self.gungamegunindex > 0 ) + var_1[var_1.size] = var_0[self.gungamegunindex - 1]; + + self loadweapons( var_1 ); + return var_2; +} + +addattachments( var_0 ) +{ + if ( getdvarint( "scr_gun_loot_variants", 0 ) == 1 ) + { + var_1 = tablelookup( "mp/statstable.csv", 4, var_0, 40 ); + + if ( isdefined( var_1 ) && var_1 != "" ) + var_2 = maps\mp\gametypes\_class::buildweaponname( var_0, var_1, "none", "none", 0, 0 ); + else + var_2 = maps\mp\gametypes\_class::buildweaponname( var_0, "none", "none", "none", 0, 0 ); + } + else + var_2 = maps\mp\gametypes\_class::buildweaponname( var_0, "none", "none", "none", 0, 0 ); + + return var_2; +} + +ontimelimit() +{ + level.finalkillcam_winner = "none"; + var_0 = gethighestprogressedplayers(); + + if ( !isdefined( var_0 ) || !var_0.size ) + thread maps\mp\gametypes\_gamelogic::endgame( "tie", game["end_reason"]["time_limit_reached"] ); + else if ( var_0.size == 1 ) + thread maps\mp\gametypes\_gamelogic::endgame( var_0[0], game["end_reason"]["time_limit_reached"] ); + else if ( var_0[var_0.size - 1].gungamegunindex > var_0[var_0.size - 2].gungamegunindex ) + thread maps\mp\gametypes\_gamelogic::endgame( var_0[var_0.size - 1], game["end_reason"]["time_limit_reached"] ); + else + thread maps\mp\gametypes\_gamelogic::endgame( "tie", game["end_reason"]["time_limit_reached"] ); +} + +gethighestprogressedplayers() +{ + var_0 = -1; + var_1 = []; + + foreach ( var_3 in level.players ) + { + if ( isdefined( var_3.gungamegunindex ) && var_3.gungamegunindex >= var_0 ) + { + var_0 = var_3.gungamegunindex; + var_1[var_1.size] = var_3; + } + } + + return var_1; +} + +refillammo() +{ + level endon( "game_ended" ); + self endon( "disconnect" ); + + for (;;) + { + self waittill( "reload" ); + self givestartammo( self.primaryweapon ); + } +} + +refillsinglecountammo() +{ + level endon( "game_ended" ); + self endon( "disconnect" ); + + for (;;) + { + if ( maps\mp\_utility::isreallyalive( self ) && self.team != "spectator" && isdefined( self.primaryweapon ) && self getammocount( self.primaryweapon ) == 0 ) + { + wait 2; + self notify( "reload" ); + wait 1; + continue; + } + + wait 0.05; + } +} + +setguns() +{ + var_0 = getdvarint( "scr_gun_loot_variants", 0 ); + level.gun_guns = []; + level.gun_guns[0] = "iw5_asm1"; + level.gun_guns[1] = "iw5_asaw"; + level.gun_guns[2] = "iw5_himar"; + level.gun_guns[3] = "iw5_kf5"; + level.gun_guns[4] = "iw5_hbra3"; + level.gun_guns[5] = "iw5_mp11"; + level.gun_guns[6] = "iw5_ak12"; + level.gun_guns[7] = "iw5_sn6"; + level.gun_guns[8] = "iw5_arx160"; + level.gun_guns[9] = "iw5_hmr9"; + level.gun_guns[10] = "iw5_maul"; + level.gun_guns[11] = "iw5_dlcgun3"; + level.gun_guns[12] = "iw5_em1"; + level.gun_guns[13] = "iw5_uts19"; + level.gun_guns[14] = "iw5_lsat"; + level.gun_guns[15] = "iw5_rhino"; + level.gun_guns[16] = "iw5_exoxmg"; + level.gun_guns[17] = "iw5_epm3"; + level.gun_guns[18] = "iw5_mors"; + level.gun_guns[19] = "iw5_rw1"; + level.gun_guns[20] = "iw5_vbr"; + level.gun_guns[21] = "iw5_pbw"; + level.gun_guns[22] = "iw5_thor"; + level.gun_guns[23] = "iw5_mahem"; + level.gun_guns[24] = "iw5_exocrossbow"; + + if ( isdefined( var_0 ) && var_0 ) + { + for ( var_1 = 0; var_1 < level.gun_guns.size; var_1++ ) + { + var_2 = level.gun_guns[var_1]; + + if ( maps\mp\_utility::getweaponclass( var_2 ) == "weapon_projectile" || maps\mp\_utility::getweaponclass( var_2 ) == "weapon_sec_special" ) + var_2 = assign_random_loot_variant( var_2, 4 ); + else + var_2 = assign_random_loot_variant( var_2, 10 ); + + level.gun_guns[var_1] = var_2; + } + } +} + +assign_random_loot_variant( var_0, var_1 ) +{ + var_2 = randomint( var_1 ); + + switch ( var_2 ) + { + case 0: + var_0 += "loot0"; + break; + case 1: + var_0 += "loot1"; + break; + case 2: + var_0 += "loot2"; + break; + case 3: + var_0 += "loot3"; + break; + case 4: + var_0 += "loot4"; + break; + case 5: + var_0 += "loot5"; + break; + case 6: + var_0 += "loot6"; + break; + case 7: + var_0 += "loot7"; + break; + case 8: + var_0 += "loot8"; + break; + case 9: + var_0 += "loot9"; + break; + default: + break; + } + + return var_0; +} + +setspecialloadout() +{ + level.gun_loadout = maps\mp\gametypes\_class::getemptyloadout(); + + if ( maps\mp\gametypes\_class::isvalidprimary( level.gun_guns[0] ) ) + level.gun_loadout["loadoutPrimary"] = level.gun_guns[0]; + else if ( maps\mp\gametypes\_class::isvalidsecondary( level.gun_guns[0], 0 ) ) + level.gun_loadout["loadoutSecondary"] = level.gun_guns[0]; +} diff --git a/data/scripts/_team_balance.gsc b/data/scripts/_team_balance.gsc new file mode 100644 index 0000000..6866a9c --- /dev/null +++ b/data/scripts/_team_balance.gsc @@ -0,0 +1,23 @@ +init() +{ + // define onteamselection callback function used in balanceteams() + level.onteamselection = ::set_team; +} + +set_team(team) +{ + if (team != self.pers["team"]) + { + self.switching_teams = true; + self.joining_team = team; + self.leaving_team = self.pers["team"]; + } + + if (self.sessionstate == "playing") + { + self suicide(); + } + + maps\mp\gametypes\_menus::addtoteam(team); + maps\mp\gametypes\_menus::endrespawnnotify(); +} diff --git a/data/ui_scripts/endgame/__init__.lua b/data/ui_scripts/endgame/__init__.lua new file mode 100644 index 0000000..8ee69e5 --- /dev/null +++ b/data/ui_scripts/endgame/__init__.lua @@ -0,0 +1,238 @@ +if (game:issingleplayer() or Engine.InFrontend()) then + return +end + +f0_local0 = function(f1_arg0, f1_arg1) + LUI.FlowManager.RequestLeaveMenu(f1_arg0) +end + +f0_local1 = function(f2_arg0, f2_arg1) + f2_arg0:setText(f2_arg1.message_text) + f2_arg0:dispatchEventToRoot({ + name = "resize_popup" + }) +end + +f0_local2 = function(f3_arg0) + Engine.ExecFirstClient("xpartybackout") + Engine.ExecFirstClient("disconnect") +end + +local f0_local3 = function(f4_arg0) + if Engine.GetDvarBool("squad_match") then + Engine.ExecFirstClient("disconnect") + else + Engine.ExecFirstClient("xpartydisbandafterround") + Engine.ExecFirstClient("disconnect") + end +end + +local f0_local4 = function(f5_arg0) + return Engine.GetOnlineGame() +end + +local f0_local5 = function(f6_arg0) + if f0_local4(f6_arg0) then + Engine.ExecFirstClient("xstopprivateparty") + Engine.ExecFirstClient("disconnect") + Engine.ExecFirstClient("xblive_privatematch 0") + Engine.ExecFirstClient("onlinegame 1") + Engine.ExecFirstClient("xstartprivateparty") + else + Engine.ExecFirstClient("disconnect") + end +end + +local f0_local6 = function(f7_arg0) + local f7_local0 = Engine.GetDvarBool("squad_match") + Engine.ExecFirstClient("xstopprivateparty") + Engine.ExecFirstClient("xpartydisbandafterround") + if f7_local0 then + Engine.ExecFirstClient("disconnect") + Engine.ExecFirstClient("xblive_privatematch 0") + Engine.ExecFirstClient("onlinegame 1") + Engine.ExecFirstClient("xstartprivateparty") + else + Engine.NotifyServer("end_game", 1) + Engine.ExecFirstClient("xstartprivateparty") + end +end + +local f0_local7 = function(f8_arg0, f8_arg1) + local f8_local0 = Engine.GetDvarBool("sv_running") + Game.HandleLeavePauseMenu() + if f8_local0 then + Engine.NotifyServer("end_game", 1) + else + f0_local5(f8_arg0) + end + LUI.FlowManager.RequestCloseAllMenus(f8_arg0) +end + +local f0_local8 = function(f9_arg0, f9_arg1) + LUI.FlowManager.RequestLeaveMenu(f9_arg0) + Game.HandleLeavePauseMenu() + Engine.Exec("onPlayerQuit") + local f9_local0 = Engine.GetDvarBool("sv_running") + if Engine.GetDvarBool("squad_match") then + Squad.PostMatch(0, 0, 0, 0, true) + end + if f9_local0 then + f0_local3(f9_arg0) + else + f0_local2(f9_arg0) + end + LUI.FlowManager.RequestCloseAllMenus(f9_arg0) +end + +local f0_local9 = function(f10_arg0, f10_arg1) + LUI.FlowManager.RequestLeaveMenu(f10_arg0) + Game.HandleLeavePauseMenu() + Engine.Exec("onPlayerQuit") + local f10_local0 = Engine.GetDvarBool("sv_running") + if Engine.GetDvarBool("squad_match") then + Squad.PostMatch(0, 0, 0, 0, true) + end + if f10_local0 then + f0_local6(f10_arg0) + else + f0_local5(f10_arg0) + end + LUI.FlowManager.RequestCloseAllMenus(f10_arg0) +end + +local f0_local10 = function(f11_arg0) + local f11_local0 = Lobby.IsInPrivateParty() + if f11_local0 then + f11_local0 = Lobby.IsPrivatePartyHost() + if f11_local0 then + f11_local0 = not Lobby.IsAloneInPrivateParty() + end + end + return f11_local0 +end + +local f0_local11 = function(f12_arg0, f12_arg1) + if f0_local10(f12_arg0) then + LUI.FlowManager.RequestLeaveMenu(f12_arg0, true) + LUI.FlowManager.RequestAddMenu(f12_arg0, "popup_pull_party", false) + else + Game.HandleLeavePauseMenu() + Engine.Exec("onPlayerQuit") + local f12_local0 = Engine.GetDvarBool("sv_running") + if Engine.GetDvarBool("squad_match") then + Squad.PostMatch(0, 0, 0, 0, true) + end + if f12_local0 then + f0_local6(f12_arg0) + else + f0_local5(f12_arg0) + end + LUI.FlowManager.RequestCloseAllMenus(f12_arg0) + end +end + +local f0_local12 = function() + local self = LUI.UIElement.new() + self.id = "end_game_id" + self:registerAnimationState("default", { + topAnchor = true, + leftAnchor = true, + bottomAnchor = true, + rightAnchor = true, + top = 0, + left = 0, + bottom = 0, + right = 0, + alpha = 1 + }) + self:animateToState("default", 0) + LUI.MenuBuilder.BuildAddChild(self, { + type = "generic_yesno_popup", + id = "privateGame_options_list_id", + properties = { + message_text_alignment = LUI.Alignment.Left, + message_text = Engine.Localize("@LUA_MENU_END_GAME_DESC"), + popup_title = Engine.Localize("@LUA_MENU_LEAVE_GAME_TITLE"), + padding_top = 12, + yes_action = f0_local7 + } + }) + local f13_local1 = LUI.UIBindButton.new() + f13_local1.id = "endBackToGameStartButton" + f13_local1:registerEventHandler("button_start", f0_local0) + self:addElement(f13_local1) + return self +end + +local f0_local13 = function() + local self = LUI.UIElement.new() + self.id = "leave_game_id" + self:registerAnimationState("default", { + topAnchor = true, + leftAnchor = true, + bottomAnchor = true, + rightAnchor = true, + top = 0, + left = 0, + bottom = 0, + right = 0, + alpha = 1 + }) + self:animateToState("default", 0) + LUI.MenuBuilder.BuildAddChild(self, { + type = "generic_yesno_popup", + id = "publicGame_options_list_id", + properties = { + message_text_alignment = LUI.Alignment.Left, + message_text = Engine.Localize("@LUA_MENU_LEAVE_GAME_DESC"), + popup_title = Engine.Localize("@LUA_MENU_LEAVE_GAME_TITLE"), + padding_top = 12, + yes_action = f0_local11 + } + }) + local f14_local1 = LUI.UIBindButton.new() + f14_local1.id = "leaveBackToGameStartButton" + f14_local1:registerEventHandler("button_start", f0_local0) + self:addElement(f14_local1) + return self +end + +local f0_local14 = function() + local self = LUI.UIElement.new() + self.id = "pull_party_out_id" + self:registerAnimationState("default", { + topAnchor = true, + leftAnchor = true, + bottomAnchor = true, + rightAnchor = true, + top = 0, + left = 0, + bottom = 0, + right = 0, + alpha = 1 + }) + self:animateToState("default", 0) + LUI.MenuBuilder.BuildAddChild(self, { + type = "generic_yesno_popup", + id = "party_pullout_list_id", + properties = { + message_text_alignment = LUI.Alignment.Left, + message_text = Engine.Localize("@LUA_MENU_PULL_PARTY_DESC"), + popup_title = Engine.Localize("@LUA_MENU_LEAVE_GAME_TITLE"), + padding_top = 12, + yes_action = f0_local8, + no_action = f0_local9, + cancel_means_no = false + } + }) + local f15_local1 = LUI.UIBindButton.new() + f15_local1.id = "leavePullPartyButton" + f15_local1:registerEventHandler("button_start", f0_local0) + self:addElement(f15_local1) + return self +end + +LUI.MenuBuilder.m_types_build["popup_end_game"] = f0_local12 +LUI.MenuBuilder.m_types_build["popup_leave_game"] = f0_local13 +LUI.MenuBuilder.m_types_build["popup_pull_party"] = f0_local14 diff --git a/data/ui_scripts/hud_info/__init__.lua b/data/ui_scripts/hud_info/__init__.lua new file mode 100644 index 0000000..4b5a89a --- /dev/null +++ b/data/ui_scripts/hud_info/__init__.lua @@ -0,0 +1,6 @@ +if (game:issingleplayer()) then + return +end + +require("settings") +require("hud") diff --git a/data/ui_scripts/hud_info/hud.lua b/data/ui_scripts/hud_info/hud.lua new file mode 100644 index 0000000..d1edab2 --- /dev/null +++ b/data/ui_scripts/hud_info/hud.lua @@ -0,0 +1,163 @@ +local mphud = require("LUI.mp_hud.MPHud") +local barheight = 18 +local textheight = 13 +local textoffsety = barheight / 2 - textheight / 2 + +function createinfobar() + local infobar = LUI.UIElement.new({ + left = 180, + top = 5, + height = barheight, + width = 70, + leftAnchor = true, + topAnchor = true + }) + + infobar:registerAnimationState("hud_on", { + alpha = 1 + }) + + infobar:registerAnimationState("hud_off", { + alpha = 0 + }) + + return infobar +end + +function populateinfobar(infobar) + elementoffset = 0 + + if (Engine.GetDvarBool("cg_infobar_fps")) then + infobar:addElement(infoelement({ + label = "FPS: ", + getvalue = function() + return game:getfps() + end, + width = 70, + interval = 100 + })) + end + + if (Engine.GetDvarBool("cg_infobar_ping")) then + infobar:addElement(infoelement({ + label = "Latency: ", + getvalue = function() + return game:getping() .. " ms" + end, + width = 115, + interval = 100 + })) + end +end + +function infoelement(data) + local container = LUI.UIElement.new({ + bottomAnchor = true, + leftAnchor = true, + topAnchor = true, + width = data.width, + left = elementoffset + }) + + elementoffset = elementoffset + data.width + 10 + + local background = LUI.UIImage.new({ + bottomAnchor = true, + leftAnchor = true, + topAnchor = true, + rightAnchor = true, + color = { + r = 0.3, + g = 0.3, + b = 0.3, + }, + material = RegisterMaterial("distort_hud_bkgnd_ui_blur") + }) + + local labelfont = RegisterFont("fonts/bodyFontBold", textheight) + + local label = LUI.UIText.new({ + left = 5, + top = textoffsety + 1, + font = labelfont, + height = textheight, + leftAnchor = true, + topAnchor = true, + color = { + r = 0.8, + g = 0.8, + b = 0.8, + } + }) + + label:setText(data.label) + + local _, _, left = GetTextDimensions(data.label, labelfont, textheight) + local value = LUI.UIText.new({ + left = left + 5, + top = textoffsety, + font = RegisterFont("fonts/bodyFont", textheight), + height = textheight + 1, + leftAnchor = true, + topAnchor = true, + color = { + r = 0.6, + g = 0.6, + b = 0.6, + } + }) + + value:addElement(LUI.UITimer.new(data.interval, "update")) + value:setText(data.getvalue()) + value:addEventHandler("update", function() + value:setText(data.getvalue()) + end) + + container:addElement(background) + container:addElement(label) + container:addElement(value) + + return container +end + +local updatehudvisibility = mphud.updateHudVisibility +mphud.updateHudVisibility = function(a1, a2) + updatehudvisibility(a1, a2) + + local root = Engine.GetLuiRoot() + local menus = root:AnyActiveMenusInStack() + local infobar = root.infobar + + if (not infobar) then + return + end + + if (menus) then + infobar:animateToState("hud_off") + else + infobar:animateToState("hud_on") + end +end + +local mphud = LUI.MenuBuilder.m_types_build["mp_hud"] +LUI.MenuBuilder.m_types_build["mp_hud"] = function() + local hud = mphud() + + if (Engine.InFrontend()) then + return hud + end + + local infobar = createinfobar() + local root = Engine.GetLuiRoot() + root.infobar = infobar + populateinfobar(infobar) + + root:registerEventHandler("update_hud_infobar_settings", function() + infobar:removeAllChildren() + populateinfobar(infobar) + end) + + hud.static:addElement(infobar) + + return hud +end diff --git a/data/ui_scripts/hud_info/settings.lua b/data/ui_scripts/hud_info/settings.lua new file mode 100644 index 0000000..e439a14 --- /dev/null +++ b/data/ui_scripts/hud_info/settings.lua @@ -0,0 +1,156 @@ +local pcoptions = require("LUI.PCOptions") + +game:addlocalizedstring("LUA_MENU_FPS", "FPS Counter") +game:addlocalizedstring("LUA_MENU_FPS_DESC", "Show FPS Counter") + +game:addlocalizedstring("LUA_MENU_LATENCY", "Server Latency") +game:addlocalizedstring("LUA_MENU_LATENCY_DESC", "Show server latency") + +pcoptions.VideoOptionsFeeder = function() + local items = { + pcoptions.OptionFactory( + "ui_r_displayMode", + "@LUA_MENU_DISPLAY_MODE", + nil, + { + { + text = "@LUA_MENU_MODE_FULLSCREEN", + value = "fullscreen" + }, + { + text = "@LUA_MENU_MODE_WINDOWED_NO_BORDER", + value = "windowed_no_border" + }, + { + text = "@LUA_MENU_MODE_WINDOWED", + value = "windowed" + } + }, + nil, + true + ), + pcoptions.SliderOptionFactory( + "profileMenuOption_blacklevel", + "@MENU_BRIGHTNESS", + "@MENU_BRIGHTNESS_DESC1", + SliderBounds.PCBrightness.Min, + SliderBounds.PCBrightness.Max, + SliderBounds.PCBrightness.Step, + function(element) + element:processEvent({ + name = "brightness_over", + immediate = true + }) + end, + function(element) + element:processEvent({ + name = "brightness_up", + immediate = true + }) + end, + true, + nil, + "brightness_updated" + ), + pcoptions.OptionFactoryProfileData( + "renderColorBlind", + "profile_toggleRenderColorBlind", + "@LUA_MENU_COLORBLIND_FILTER", + "@LUA_MENU_COLOR_BLIND_DESC", + { + { + text = "@LUA_MENU_ENABLED", + value = true + }, + { + text = "@LUA_MENU_DISABLED", + value = false + } + }, + nil, + false + ) + } + + if Engine.IsMultiplayer() and not Engine.IsZombiesMode() then + table.insert(items, pcoptions.OptionFactory( + "cg_paintballFx", + "@LUA_MENU_PAINTBALL", + "@LUA_MENU_PAINTBALL_DESC", + { + { + text = "@LUA_MENU_ENABLED", + value = true + }, + { + text = "@LUA_MENU_DISABLED", + value = false + } + }, + nil, + false, + false + )) + end + + table.insert(items, pcoptions.OptionFactory( + "cg_infobar_ping", + "@LUA_MENU_LATENCY", + "@LUA_MENU_LATENCY_DESC", + { + { + text = "@LUA_MENU_ENABLED", + value = true + }, + { + text = "@LUA_MENU_DISABLED", + value = false + } + }, + function() + Engine.GetLuiRoot():processEvent({ + name = "update_hud_infobar_settings" + }) + end, + false, + false + )) + + table.insert(items, pcoptions.OptionFactory( + "cg_infobar_fps", + "@LUA_MENU_FPS", + "@LUA_MENU_FPS_DESC", + { + { + text = "@LUA_MENU_ENABLED", + value = true + }, + { + text = "@LUA_MENU_DISABLED", + value = false + } + }, + function() + Engine.GetLuiRoot():processEvent({ + name = "update_hud_infobar_settings" + }) + end, + false, + false + )) + + table.insert(items, { + type = "UIGenericButton", + id = "option_advanced_video", + properties = { + style = GenericButtonSettings.Styles.GlassButton, + button_text = Engine.Localize("@LUA_MENU_ADVANCED_VIDEO"), + desc_text = "", + button_action_func = pcoptions.ButtonMenuAction, + text_align_without_content = LUI.Alignment.Left, + menu = "advanced_video" + } + }) + + return items +end diff --git a/data/ui_scripts/lobby/__init__.lua b/data/ui_scripts/lobby/__init__.lua new file mode 100644 index 0000000..761aced --- /dev/null +++ b/data/ui_scripts/lobby/__init__.lua @@ -0,0 +1,6 @@ +if (game:issingleplayer() or not Engine.InFrontend()) then + return +end + +require("menu_xboxlive") +require("menu_xboxlive_lobby") diff --git a/data/ui_scripts/lobby/menu_xboxlive.lua b/data/ui_scripts/lobby/menu_xboxlive.lua new file mode 100644 index 0000000..f69d9ec --- /dev/null +++ b/data/ui_scripts/lobby/menu_xboxlive.lua @@ -0,0 +1,112 @@ +local Lobby = Lobby +local MPLobbyOnline = LUI.mp_menus.MPLobbyOnline +local MenuData = LUI.mp_menus.MenuData +local MPLobbyUtils = LUI.mp_menus.MPLobbyUtils + +game:addlocalizedstring("LUA_MENU_SERVERLIST", "Server List") +game:addlocalizedstring("LUA_MENU_SERVERLIST_DESC", "Browse available servers."); + +LeaveXboxLive = function(f5_arg0) + local f73_local0 = Engine.GetFirstActiveController() + if f73_local0 ~= nil then + Engine.ExecNow("xstopprivateparty", f73_local0) + Cac.NotifyVirtualLobby("leave_lobby", Engine.GetXUIDByController(f73_local0)) + Engine.SetSplitScreen(false) + Engine.ExecNow("forcesplitscreencontrol menu_xboxlive_CLOSE", f73_local0) + else + Engine.Exec("xstopprivateparty") + end +end + +function LeaveLobby(a1) + LUI.MarketingPanel.ClearViewedMessages({ LUI.MarketingLocation.CaC, LUI.MarketingLocation.PlayOnline, + LUI.MarketingLocation.CaO }) + LeaveXboxLive() + LUI.FlowManager.RequestLeaveMenuByName("menu_xboxlive_lobby", nil, true) +end + +function menu_xboxlive(a1, a2) + Engine.SetDvarBool("ui_opensummary", false) + local menu = LUI.MPLobbyBase.new(a1, { + menu_title = "@PLATFORM_UI_HEADER_PLAY_MP_CAPS", + memberListState = Lobby.MemberListStates.Prelobby, + has_new_item_usage_widget = true + }) + + menu:setClass(LUI.MPLobbyOnline) + + menu.handleGamepadButton = MPLobbyOnline.menu_xboxlive_handleGamepadButton + if Engine.IsCoreMode() then + menu:AddNewItemsWidget() + end + + -- server list button + local serverListButton = menu:AddButton("@LUA_MENU_SERVERLIST", function(a1, a2) + LUI.FlowManager.RequestAddMenu(a1, "menu_systemlink_join", true, nil) + end) + serverListButton:setDisabledRefreshRate(500) + + -- private match button + privateMatchButton = menu:AddButton("@MENU_PRIVATE_MATCH", MPLobbyOnline.OnPrivateMatch, + MPLobbyOnline.disablePrivateMatchButton) + privateMatchButton:rename("menu_xboxlive_private_match") + privateMatchButton:setDisabledRefreshRate(500) + + -- combat training button + if Engine.IsCoreMode() then + game:addlocalizedstring("LUA_MENU_COMBAT", "Combat Training"); + game:addlocalizedstring("LUA_MENU_COMBAT_DESC", "Rank up offline with bots."); + + local FindGameButton = menu:AddButton("@LUA_MENU_COMBAT", + MPLobbyOnline.OnPublicMatch, MPLobbyOnline.disablePublicMatchButton) + FindGameButton:rename("menu_xboxlive_find_game") + FindGameButton:setDisabledRefreshRate(500) + end + + if Engine.IsCoreMode() then + menu:AddCACButton() + menu:AddCAOButton() + menu:AddArmoryButton() + end + + if not Engine.IsCoreMode() then + local leaderboardButton = menu:AddButton("@LUA_MENU_LEADERBOARD", "OpLeaderboardMain") + leaderboardButton:rename("OperatorMenu_leaderboard") + end + + if Engine.IsZombiesMode() then + menu:AddButton("@ZOMBIES_MENU_MOVIES", "ZombiesMoviesMenu") + end + + menu:AddOptionsButton() + local natType = Lobby.GetNATType() + if natType then + menu:AddHelp({ + name = "add_button_helper_text", + button_ref = "nat", + helper_text = Engine.Localize("NETWORK_YOURNATTYPE", natType), + side = "left", + clickable = false + }) + end + if Engine.IsZombiesMode() then + menu:AddZombiesStats(true) + end + + menu.isSignInMenu = true + menu:registerEventHandler("gain_focus", LUI.MPLobbyOnline.OnGainFocus) + menu:registerEventHandler("player_joined", Cac.PlayerJoinedEvent) + menu:registerEventHandler("exit_live_lobby", LeaveLobby) + + if PersistentBackground.IsCurrent(PersistentBackground.Variants.AARBackground) then + PersistentBackground.Hide(PersistentBackground.Duration) + end + + if Engine.IsCoreMode() then + Engine.ExecNow("eliteclan_refresh", Engine.GetFirstActiveController()) + end + + return menu +end + +LUI.MenuBuilder.m_types_build["menu_xboxlive"] = menu_xboxlive diff --git a/data/ui_scripts/lobby/menu_xboxlive_lobby.lua b/data/ui_scripts/lobby/menu_xboxlive_lobby.lua new file mode 100644 index 0000000..f4e02bd --- /dev/null +++ b/data/ui_scripts/lobby/menu_xboxlive_lobby.lua @@ -0,0 +1,95 @@ +local MPLobbyPublic = LUI.mp_menus.MPLobbyPublic + +function StartButtonAction(f2_arg0, f2_arg1) + Engine.SetDvarInt("party_minplayers", 1) +end + +function StartButtonText(f5_arg0, f5_arg1) + f5_arg0:processEvent({ + name = "refresh_disabled" + }) + f5_arg0:setText(Engine.Localize("@LUA_MENU_START_GAME")) +end + +function OnLeaveLobby(f6_arg0) + LUI.MarketingPanel.ClearViewedMessages({ + LUI.MarketingLocation.Lobby + }) + LUI.FlowManager.RequestLeaveMenu(f6_arg0) +end + +function OnGameSetup(f10_arg0, f10_arg1) + LUI.FlowManager.RequestAddMenu(f10_arg0, "gamesetup_menu_main", true, f10_arg1.controller, false) +end + +function menu_xboxlive_lobby(f7_arg0, f7_arg1) + local f7_local0 = false + if not Engine.IsZombiesMode() and Engine.GetDvarBool("ui_opensummary") then + f7_local0 = true + end + if Engine.IsZombiesMode() then + ZombiesUpdateMapBkg() + end + local f7_local1 = LUI.MPLobbyBase.new(f7_arg0, { + menu_title = "@PLATFORM_UI_HEADER_PLAY_MP_CAPS", + has_match_summary = true, + has_new_item_usage_widget = true + }, true) + f7_local1:setClass(LUI.MPLobbyPublic) + if Engine.IsMultiplayer() then + f7_local1:AddReadyUpButton("pt_AliensReadyUpPublicInUse", StartButtonAction, false, StartButtonText) + -- f7_local1:AddButton( "@LUA_MENU_GAME_SETUP", OnGameSetup ) -- WIP + end + if Engine.IsCoreMode() then + f7_local1:AddNewItemsWidget() + f7_local1:AddCACButton() + f7_local1:AddCAOButton() + f7_local1:AddArmoryButton() + end + f7_local1:AddOptionsButton() + if not f7_local1:CheckAddMapAndMarketingPanels(f7_local0) then + f7_local1:registerEventHandler("CheckAddMapAndMarketingPanels", function(element, event) + LUI.MPLobbyPublic.CheckAddMapAndMarketingPanels(element, f7_local0) + end) + local self = LUI.UITimer.new(100, "CheckAddMapAndMarketingPanels") + self.id = "MPLobbyPublic_add_map_timer" + f7_local1.mapTimer = self + f7_local1:addElement(self) + end + f7_local1:registerEventHandler("exit_public_lobby", OnLeaveLobby) + f7_local1:registerEventHandler("player_joined", Cac.PlayerJoinedEvent) + f7_local1:registerEventHandler("loadout_request", Cac.PlayerJoinedEvent) + Lobby.EnteredLobby() + if f7_local0 then + LUI.InventoryUtils.ProcessLootExpiration() + end + return f7_local1 +end + +LUI.MenuBuilder.m_types_build["menu_xboxlive_lobby"] = menu_xboxlive_lobby + +LUI.FlowManager.RegisterMenuStack("menu_xboxlive_lobby", function() + if Engine.IsCoreMode() and Playlist.GetPreselectedCategoryClass() ~= 8 then + return { + "mp_main_menu", + "menu_xboxlive", + "FindGameMenu", + "FindGameSubMenu" + } + else + return { + "mp_main_menu", + "menu_xboxlive", + "FindGameMenu" + } + end +end) +VLobby.InitMenuMode("menu_xboxlive_lobby", VirtualLobbyModes.LUI_MODE_LOBBY, function() + if LUI.MPLobbyBase.UseReadyUp then + Lobby.ClearLocalReadyUpFlag() + end + local f10_local0 = PersistentBackground.StackFunc(nil) + f10_local0() +end, LUI.MPLobbyBase.CollectGarbage) + +LUI.FlowManager.RegisterStackResumeBehaviour("menu_xboxlive_lobby", PersistentBackground.StackFunc(nil)) diff --git a/data/ui_scripts/patches/__init__.lua b/data/ui_scripts/patches/__init__.lua new file mode 100644 index 0000000..76790b2 --- /dev/null +++ b/data/ui_scripts/patches/__init__.lua @@ -0,0 +1,19 @@ +if (game:issingleplayer()) then + return +end + +function GetGameModeName() + return Engine.Localize(Engine.TableLookup(GameTypesTable.File, GameTypesTable.Cols.Ref, GameX.GetGameMode(), GameTypesTable.Cols.Name)) +end + +-- Allow players to change teams in game. +function CanChangeTeam() + local f9_local0 = GameX.GetGameMode() + local f9_local1 + if f9_local0 ~= "aliens" and Engine.TableLookup(GameTypesTable.File, GameTypesTable.Cols.Ref, f9_local0, GameTypesTable.Cols.TeamChoice) == "1" then + f9_local1 = not MLG.IsMLGSpectator() + else + f9_local1 = false + end + return f9_local1 +end diff --git a/data/ui_scripts/scoreboard/__init__.lua b/data/ui_scripts/scoreboard/__init__.lua new file mode 100644 index 0000000..f13240e --- /dev/null +++ b/data/ui_scripts/scoreboard/__init__.lua @@ -0,0 +1,30 @@ +if (game:issingleplayer() or Engine.InFrontend()) then + return +end + +function GetPartyMaxPlayers() + return Engine.GetDvarInt("sv_maxclients") +end + +local scoreboard = LUI.mp_hud.Scoreboard + +scoreboard.maxPlayersOnTeam = GetTeamLimitForMaxPlayers(GetPartyMaxPlayers()) + +scoreboard.scoreColumns.ping = { + width = Engine.IsZombiesMode() and 90 or 60, + title = "LUA_MENU_PING", + getter = function(scoreinfo) + return scoreinfo.ping == 0 and "BOT" or tostring(scoreinfo.ping) + end +} + +local getcolumns = scoreboard.getColumnsForCurrentGameMode +scoreboard.getColumnsForCurrentGameMode = function(a1) + local columns = getcolumns(a1) + + if (Engine.IsZombiesMode()) then + table.insert(columns, scoreboard.scoreColumns.ping) + end + + return columns +end diff --git a/data/ui_scripts/server_list/__init__.lua b/data/ui_scripts/server_list/__init__.lua new file mode 100644 index 0000000..f66517b --- /dev/null +++ b/data/ui_scripts/server_list/__init__.lua @@ -0,0 +1,5 @@ +if (game:issingleplayer() or not Engine.InFrontend()) then + return +end + +require("serverlist") diff --git a/data/ui_scripts/server_list/serverlist.lua b/data/ui_scripts/server_list/serverlist.lua new file mode 100644 index 0000000..ca06774 --- /dev/null +++ b/data/ui_scripts/server_list/serverlist.lua @@ -0,0 +1,76 @@ +if (game:issingleplayer() or not Engine.InFrontend()) then + return +end + +local SystemLinkJoinMenu = LUI.mp_menus.SystemLinkJoinMenu + +game:addlocalizedstring("PLATFORM_SYSTEM_LINK_TITLE", "SERVER LIST") +game:addlocalizedstring("MENU_NUMPLAYERS", "Players") +game:addlocalizedstring("MENU_PING", "Ping") + +local offsets = {10, 400, 600, 900, 1075} + +local columns = {"@MENU_HOST_NAME", "@MENU_MAP", "@MENU_TYPE1", "@MENU_NUMPLAYERS", "@MENU_PING"} + +SystemLinkJoinMenu.AddServerButton = function(menu, controller, index) + local serverInformation = nil + local button = menu:AddButton("", SystemLinkJoinMenu.OnJoinGame) + + if index == nil then + button:makeNotFocusable() + serverInformation = function(i) + return Engine.Localize(columns[i]) + end + else + button:makeFocusable() + button.index = index + serverInformation = function(i) + return Lobby.GetServerData(controller, index, i - 1) + end + end + + for size = 1, #offsets do + SystemLinkJoinMenu.MakeText(button, offsets[size], serverInformation(size)) + end + + return button +end + +function menu_systemlink_join(f19_arg0, f19_arg1) + local menu = LUI.MenuTemplate.new(f19_arg0, { + menu_title = "@PLATFORM_SYSTEM_LINK_TITLE", + menu_width = CoD.DesignGridHelper(28) + }) + Lobby.BuildServerList(Engine.GetFirstActiveController()) + Lobby.RefreshServerList(Engine.GetFirstActiveController()) + + SystemLinkJoinMenu.UpdateGameList(menu) + menu:registerEventHandler("updateGameList", SystemLinkJoinMenu.UpdateGameList) + menu:addElement(LUI.UITimer.new(250, "updateGameList")) + + menu:AddHelp({ + name = "add_button_helper_text", + button_ref = "button_alt1", + helper_text = Engine.Localize("@MENU_SB_TOOLTIP_BTN_REFRESH"), + side = "right", + clickable = true, + priority = -1000 + }, function(f10_arg0, f10_arg1) + SystemLinkJoinMenu.RefreshServers(f10_arg0, f10_arg1, menu) + end) + + menu:AddHelp({ + name = "add_button_helper_text", + button_ref = "button_action", + helper_text = Engine.Localize("@MENU_JOIN_GAME1"), + side = "right", + clickable = false, + priority = -1000 + }) + + menu:AddBackButton() + + return menu +end + +LUI.MenuBuilder.m_types_build["menu_systemlink_join"] = menu_systemlink_join diff --git a/data/ui_scripts/stats/__init__.lua b/data/ui_scripts/stats/__init__.lua new file mode 100644 index 0000000..98b13d4 --- /dev/null +++ b/data/ui_scripts/stats/__init__.lua @@ -0,0 +1,204 @@ +local isclasslocked = Cac.IsCustomClassLocked +Cac.IsCustomClassLocked = function(...) + if (Engine.GetDvarBool("cg_unlockall_classes")) then + return false + end + + return isclasslocked(table.unpack({ ... })) +end + +local isdlcclasslocked = Cac.IsCustomClassDlcLocked +Cac.IsCustomClassDlcLocked = function(...) + if (Engine.GetDvarBool("cg_unlockall_classes")) then + return false + end + + return isdlcclasslocked(table.unpack({ ... })) +end + +if (game:issingleplayer() or not Engine.InFrontend()) then + return +end + +game:addlocalizedstring("LUA_MENU_STATS", "Stats") +game:addlocalizedstring("LUA_MENU_STATS_DESC", "Edit player stats settings.") + +game:addlocalizedstring("LUA_MENU_UNLOCKALL_ITEMS", "Unlock All Items") +game:addlocalizedstring("LUA_MENU_UNLOCKALL_ITEMS_DESC", "Unlock items that are level-locked by the player's stats.") + +game:addlocalizedstring("LUA_MENU_UNLOCKALL_LOOT", "Unlock All Loot") +game:addlocalizedstring("LUA_MENU_UNLOCKALL_LOOT_DESC", "Unlock supply drop loot.") + +game:addlocalizedstring("LUA_MENU_UNLOCKALL_CLASSES", "Unlock All Classes") +game:addlocalizedstring("LUA_MENU_UNLOCKALL_CLASSES_DESC", "Unlock extra class slots.") + +game:addlocalizedstring("LUA_MENU_PRESTIGE", "Prestige") +game:addlocalizedstring("LUA_MENU_PRESTIGE_DESC", "Edit prestige level.") +game:addlocalizedstring("LUA_MENU_RANK", "Rank") +game:addlocalizedstring("LUA_MENU_RANK_DESC", "Edit rank.") + +local armorybutton = LUI.MPLobbyBase.AddArmoryButton +LUI.MPLobbyBase.AddArmoryButton = function(menu) + menu:AddButton("@LUA_MENU_STATS", function(a1, a2) + LUI.FlowManager.RequestAddMenu(a1, "menu_stats", true, nil) + end) +end + +-- button stuff for configuring +function IsEnabled(dvar) + local enabled = Engine.GetDvarBool(dvar) + if enabled then + return Engine.Localize("@LUA_MENU_ENABLED") + end + + return Engine.Localize("@LUA_MENU_DISABLED") +end + +function ToggleEnable(dvar) + local enabled = Engine.GetDvarBool(dvar) + if enabled then + Engine.SetDvarBool(dvar, false) + else + Engine.SetDvarBool(dvar, true) + end +end + +function GoDirection(dvar, direction, callback) + local value = Engine.GetDvarString(dvar) + value = tonumber(value) + + -- get rank data + local max = nil + if (dvar == "ui_rank_level_") then + max = Rank.GetMaxRank(CoD.PlayMode.Core) + elseif (dvar == "ui_prestige_level") then + max = Lobby.GetMaxPrestigeLevel() + end + + local new_value = nil + if (direction == "down") then + new_value = value - 1 + elseif (direction == "up") then + new_value = value + 1 + end + + -- checking to make sure its < 0 or > max + if (new_value < 0) then + new_value = max + elseif (new_value > max) then + new_value = 0 + end + + callback(new_value) + + Engine.SetDvarFromString(dvar, new_value .. "") +end + +LUI.MenuBuilder.registerType("menu_stats", function(a1, a2) + local menu = LUI.MenuTemplate.new(a1, { + menu_title = Engine.ToUpperCase(Engine.Localize("@LUA_MENU_STATS")), + menu_width = GenericMenuDims.menu_right_wide - GenericMenuDims.menu_left, + menu_height = 548 + }) + + menu:setClass(LUI.Options) + menu.controller = a2.exclusiveController + + local itemsbutton = menu:AddButtonVariant(GenericButtonSettings.Variants.Select, + "@LUA_MENU_UNLOCKALL_ITEMS", "@LUA_MENU_UNLOCKALL_ITEMS_DESC", function() + return IsEnabled("cg_unlockall_items") + end, function() + ToggleEnable("cg_unlockall_items") + end, function() + ToggleEnable("cg_unlockall_items") + end) + + local lootbutton = menu:AddButtonVariant(GenericButtonSettings.Variants.Select, + "@LUA_MENU_UNLOCKALL_LOOT", "@LUA_MENU_UNLOCKALL_LOOT_DESC", function() + return IsEnabled("cg_unlockall_loot") + end, function() + ToggleEnable("cg_unlockall_loot") + end, function() + ToggleEnable("cg_unlockall_loot") + end) + + local classesbutton = menu:AddButtonVariant(GenericButtonSettings.Variants.Select, + "@LUA_MENU_UNLOCKALL_CLASSES", "@LUA_MENU_UNLOCKALL_CLASSES_DESC", function() + return IsEnabled("cg_unlockall_classes") + end, function() + ToggleEnable("cg_unlockall_classes") + end, function() + ToggleEnable("cg_unlockall_classes") + end) + + local prestige = Engine.GetPlayerDataEx(0, CoD.StatsGroup.Ranked, "prestige") or 0 + local experience = Engine.GetPlayerDataEx(0, CoD.StatsGroup.Ranked, "experience") or 0 + local rank = AAR.GetRankForXP(experience, prestige) + + local prestigevalue = prestige + local rankvalue = rank + + -- save changes made + local save_changes = function() + Engine.SetPlayerDataEx(0, CoD.StatsGroup.Ranked, "prestige", tonumber(prestigevalue)) + + local rank = tonumber(rankvalue) + local prestige = Engine.GetPlayerDataEx(0, CoD.StatsGroup.Ranked, "prestige") or 0 + local experience = rank == 0 and 0 or Rank.GetRankMaxXP(tonumber(rankvalue) - 1, prestige) + + Engine.SetPlayerDataEx(0, CoD.StatsGroup.Ranked, "experience", experience) + end + + -- back callback + local back = function() + save_changes() + LUI.common_menus.Options.HideOptionsBackground() + LUI.FlowManager.RequestLeaveMenu(menu) + end + + -- create buttons and create callbacks + CreateEditButton(menu, "ui_prestige_level", "@LUA_MENU_PRESTIGE", "@LUA_MENU_PRESTIGE_DESC", function(value) + prestigevalue = value + end) + CreateEditButton(menu, "ui_rank_level_", "@LUA_MENU_RANK", "@LUA_MENU_RANK_DESC", function(value) + rankvalue = value + end) + + menu:AddBottomDescription(menu:InitScrolling()) + menu:AddBackButton(back) + + LUI.common_menus.Options.ShowOptionsBackground() + + return menu +end) + +function CreateEditButton(menu, dvar, name, desc, callback) + local prestige = Engine.GetPlayerDataEx(0, CoD.StatsGroup.Ranked, "prestige") or 0 + local experience = Engine.GetPlayerDataEx(0, CoD.StatsGroup.Ranked, "experience") or 0 + + local dvarValue = nil + local max = nil + if (dvar == "ui_rank_level_") then + dvarValue = AAR.GetRankForXP(experience, prestige) + max = Rank.GetMaxRank(CoD.PlayMode.Core) + elseif (dvar == "ui_prestige_level") then + dvarValue = prestige + max = Lobby.GetMaxPrestigeLevel() + end + + Engine.SetDvarFromString(dvar, dvarValue .. "") + + menu:AddButtonVariant(GenericButtonSettings.Variants.Select, name, desc, function() + local dvarString = Engine.GetDvarString(dvar) + + if (dvar == "ui_rank_level_") then + dvarString = tonumber(dvarString) + 1 + end + + return tostring(dvarString) + end, function() + GoDirection(dvar, "down", callback) + end, function() + GoDirection(dvar, "up", callback) + end) +end