Files
2023-12-25 20:34:53 +01:00

2227 lines
65 KiB
Plaintext

// 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 );
}
}
}