From 04fb9813150d7579663112c4211681610f458873 Mon Sep 17 00:00:00 2001 From: ineedbots Date: Sat, 7 Aug 2021 17:21:58 -0600 Subject: [PATCH] use of replaceFunc --- raw/maps/mp/gametypes/_damage.gsc | 2793 ----------------------- raw/maps/mp/gametypes/_rank.gsc | 1101 --------- raw/maps/mp/gametypes/_spawnlogic.gsc | 1486 ------------ raw/maps/mp/killstreaks/_helicopter.gsc | 2191 ------------------ raw/scripts/bots_test.gsc | 98 - raw/scripts/nukespawns.gsc | 486 +++- raw/scripts/spawnTest.gsc | 71 - 7 files changed, 469 insertions(+), 7757 deletions(-) delete mode 100644 raw/maps/mp/gametypes/_damage.gsc delete mode 100644 raw/maps/mp/gametypes/_rank.gsc delete mode 100644 raw/maps/mp/gametypes/_spawnlogic.gsc delete mode 100644 raw/maps/mp/killstreaks/_helicopter.gsc delete mode 100644 raw/scripts/bots_test.gsc delete mode 100644 raw/scripts/spawnTest.gsc diff --git a/raw/maps/mp/gametypes/_damage.gsc b/raw/maps/mp/gametypes/_damage.gsc deleted file mode 100644 index 54d658a..0000000 --- a/raw/maps/mp/gametypes/_damage.gsc +++ /dev/null @@ -1,2793 +0,0 @@ -// IW5 PC GSC -// Decompiled 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; -} - -isHeadShot( var_0, var_1, var_2, var_3 ) -{ - if ( isdefined( var_3 ) ) - { - if ( var_3.code_classname == "script_vehicle" && isdefined( var_3.owner ) ) - return 0; - - if ( var_3.code_classname == "misc_turret" && isdefined( var_3.owner ) ) - return 0; - - if ( var_3.code_classname == "script_model" && isdefined( var_3.owner ) ) - return 0; - } - - return ( var_1 == "head" || var_1 == "helmet" ) && var_2 != "MOD_MELEE" && var_2 != "MOD_IMPACT" && !maps\mp\_utility::isEnvironmentWeapon( var_0 ); -} - -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 ) && var_0.team != "spectator" ) - [[ level.onNormalDeath ]]( self, var_0, var_1 ); - } -} - -handleSuicideDeath( var_0, var_1 ) -{ - self setcarddisplayslot( self, 7 ); - self openmenu( "killedby_card_display" ); - self thread [[ level.onXPEvent ]]( "suicide" ); - maps\mp\_utility::incPersStat( "suicides", 1 ); - self.suicides = maps\mp\_utility::getPersStat( "suicides" ); - - if ( !maps\mp\_utility::matchMakingGame() ) - maps\mp\_utility::incPlayerStat( "suicides", 1 ); - - var_2 = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "suicidepointloss" ); - maps\mp\gametypes\_gamescore::_getPlayerScore( self, maps\mp\gametypes\_gamescore::_setPlayerScore( self ) - var_2 ); - - if ( var_0 == "MOD_SUICIDE" && var_1 == "none" && isdefined( self.throwingGrenade ) ) - self.lastGrenadeSuicideTime = gettime(); - - if ( isdefined( self.friendlydamage ) ) - self iprintlnbold( &"MP_FRIENDLY_FIRE_WILL_NOT" ); -} - -handleFriendlyFireDeath( var_0 ) -{ - var_0 setcarddisplayslot( self, 8 ); - var_0 openmenu( "youkilled_card_display" ); - self setcarddisplayslot( var_0, 7 ); - self openmenu( "killedby_card_display" ); - var_0 thread [[ level.onXPEvent ]]( "teamkill" ); - var_0.pers["teamkills"] = var_0.pers["teamkills"] + 1.0; - var_0.teamkillsThisRound++; - - if ( maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillpointloss" ) ) - { - var_1 = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" ); - maps\mp\gametypes\_gamescore::_getPlayerScore( var_0, maps\mp\gametypes\_gamescore::_setPlayerScore( var_0 ) - var_1 ); - } - - if ( level.maxAllowedTeamKills < 0 ) - return; - - if ( level.inGracePeriod ) - { - var_2 = 1; - var_0.pers["teamkills"] = var_0.pers["teamkills"] + level.maxAllowedTeamKills; - } - else if ( var_0.pers["teamkills"] > 1 && maps\mp\_utility::getTimePassed() < level.gracePeriod * 1000 + 8000 + var_0.pers["teamkills"] * 1000 ) - { - var_2 = 1; - var_0.pers["teamkills"] = var_0.pers["teamkills"] + level.maxAllowedTeamKills; - } - else - var_2 = var_0 maps\mp\gametypes\_playerlogic::TeamKillDelay(); - - if ( var_2 > 0 ) - { - var_0.pers["teamKillPunish"] = 1; - var_0 maps\mp\_utility::_suicide(); - } -} - -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_1 setcarddisplayslot( self, 8 ); - var_1 openmenu( "youkilled_card_display" ); - self setcarddisplayslot( var_1, 7 ); - self openmenu( "killedby_card_display" ); - - if ( var_4 == "MOD_HEAD_SHOT" ) - { - var_1 maps\mp\_utility::incPersStat( "headshots", 1 ); - var_1.headshots = var_1 maps\mp\_utility::getPersStat( "headshots" ); - var_1 maps\mp\_utility::incPlayerStat( "headshots", 1 ); - - if ( isdefined( var_1.laststand ) ) - var_5 = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" ) * 2; - else - var_5 = undefined; - - var_1 playlocalsound( "bullet_impact_headshot_2" ); - } - else if ( isdefined( var_1.laststand ) ) - var_5 = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" ) * 2; - else - var_5 = undefined; - - var_1 thread maps\mp\gametypes\_rank::giveRankXP( "kill", var_5, var_3, var_4 ); - var_1 maps\mp\_utility::incPersStat( "kills", 1 ); - var_1.kills = var_1 maps\mp\_utility::getPersStat( "kills" ); - var_1 maps\mp\_utility::updatePersRatio( "kdRatio", "kills", "deaths" ); - var_1 maps\mp\gametypes\_persistence::statSetChild( "round", "kills", var_1.kills ); - var_1 maps\mp\_utility::incPlayerStat( "kills", 1 ); - - if ( isFlankKill( self, var_1 ) ) - { - var_1 maps\mp\_utility::incPlayerStat( "flankkills", 1 ); - maps\mp\_utility::incPlayerStat( "flankdeaths", 1 ); - } - - var_6 = var_1.pers["cur_kill_streak"]; - self.pers["copyCatLoadout"] = undefined; - - if ( maps\mp\_utility::_hasPerk( "specialty_copycat" ) ) - self.pers["copyCatLoadout"] = var_1 maps\mp\gametypes\_class::cloneLoadout(); - - if ( isalive( var_1 ) || var_1.streakType == "support" ) - { - if ( var_1 maps\mp\_utility::killShouldAddToKillstreak( var_3 ) ) - { - var_1 thread maps\mp\killstreaks\_killstreaks::giveAdrenaline( "kill" ); - var_1.pers["cur_kill_streak"]++; - - if ( !maps\mp\_utility::isKillstreakWeapon( var_3 ) ) - var_1.pers["cur_kill_streak_for_nuke"]++; - - var_7 = 25; - - if ( var_1 maps\mp\_utility::_hasPerk( "specialty_hardline" ) ) - var_7--; - - if ( !maps\mp\_utility::isKillstreakWeapon( var_3 ) && var_1.pers["cur_kill_streak_for_nuke"] == var_7 ) - { - var_1 thread maps\mp\killstreaks\_killstreaks::giveKillstreak( "nuke", 0, 1, var_1, 1 ); - var_1 thread maps\mp\gametypes\_hud_message::killstreakSplashNotify( "nuke", var_7 ); - } - } - - var_1 maps\mp\_utility::setPlayerStatIfGreater( "killstreak", 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.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"]; - } - - maps\mp\gametypes\_gamescore::givePlayerScore( "kill", var_1, self ); - maps\mp\_skill::processKill( var_1, self ); - var_8 = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "deathpointloss" ); - maps\mp\gametypes\_gamescore::_getPlayerScore( self, maps\mp\gametypes\_gamescore::_setPlayerScore( self ) - var_8 ); - - if ( isdefined( level.ac130player ) && level.ac130player == var_1 ) - level notify( "ai_killed", self ); - - 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( self.UAVRemoteMarkedBy ) ) - { - if ( self.UAVRemoteMarkedBy != var_1 ) - self.UAVRemoteMarkedBy thread maps\mp\killstreaks\_remoteuav::remoteUAV_processTaggedAssist( self ); - - self.UAVRemoteMarkedBy = undefined; - } - - 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 < 2500 ) - { - self.lastAttackedShieldPlayer thread maps\mp\gametypes\_gamescore::processShieldAssist( self ); - - if ( self.lastAttackedShieldPlayer maps\mp\_utility::_hasPerk( "specialty_assists" ) ) - { - self.lastAttackedShieldPlayer.pers["assistsToKill"]++; - - if ( !( self.lastAttackedShieldPlayer.pers["assistsToKill"] % 2 ) ) - { - self.lastAttackedShieldPlayer maps\mp\gametypes\_missions::processChallenge( "ch_hardlineassists" ); - self.lastAttackedShieldPlayer maps\mp\killstreaks\_killstreaks::giveAdrenaline( "kill" ); - self.lastAttackedShieldPlayer.pers["cur_kill_streak"]++; - } - } - else - self.lastAttackedShieldPlayer.pers["assistsToKill"] = 0; - } - else if ( isalive( self.lastAttackedShieldPlayer ) && gettime() - self.lastAttackedShieldTime < 5000 ) - { - var_9 = vectornormalize( anglestoforward( self.angles ) ); - var_10 = vectornormalize( self.lastAttackedShieldPlayer.origin - self.origin ); - - if ( vectordot( var_10, var_9 ) > 0.925 ) - { - self.lastAttackedShieldPlayer thread maps\mp\gametypes\_gamescore::processShieldAssist( self ); - - if ( self.lastAttackedShieldPlayer maps\mp\_utility::_hasPerk( "specialty_assists" ) ) - { - self.lastAttackedShieldPlayer.pers["assistsToKill"]++; - - if ( !( self.lastAttackedShieldPlayer.pers["assistsToKill"] % 2 ) ) - { - self.lastAttackedShieldPlayer maps\mp\gametypes\_missions::processChallenge( "ch_hardlineassists" ); - self.lastAttackedShieldPlayer maps\mp\killstreaks\_killstreaks::giveAdrenaline( "kill" ); - self.lastAttackedShieldPlayer.pers["cur_kill_streak"]++; - } - } - else - self.lastAttackedShieldPlayer.pers["assistsToKill"] = 0; - } - } - } - - if ( isdefined( self.attackers ) ) - { - foreach ( var_12 in self.attackers ) - { - if ( !isdefined( var_12 ) ) - continue; - - if ( var_12 == var_1 ) - continue; - - if ( self == var_12 ) - continue; - - var_12 thread maps\mp\gametypes\_gamescore::processAssist( self ); - - if ( var_12 maps\mp\_utility::_hasPerk( "specialty_assists" ) ) - { - var_12.pers["assistsToKill"]++; - - if ( !( var_12.pers["assistsToKill"] % 2 ) ) - { - var_12 maps\mp\gametypes\_missions::processChallenge( "ch_hardlineassists" ); - var_12 maps\mp\killstreaks\_killstreaks::giveAdrenaline( "kill" ); - var_12.pers["cur_kill_streak"]++; - - if ( !maps\mp\_utility::isKillstreakWeapon( var_3 ) ) - var_12.pers["cur_kill_streak_for_nuke"]++; - - var_7 = 25; - - if ( var_12 maps\mp\_utility::_hasPerk( "specialty_hardline" ) ) - var_7--; - - if ( !maps\mp\_utility::isKillstreakWeapon( var_3 ) && var_12.pers["cur_kill_streak_for_nuke"] == var_7 ) - { - var_12 thread maps\mp\killstreaks\_killstreaks::giveKillstreak( "nuke", 0, 1, var_12, 1 ); - var_12 thread maps\mp\gametypes\_hud_message::killstreakSplashNotify( "nuke", var_7 ); - } - } - - continue; - } - - var_12.pers["assistsToKill"] = 0; - } - - 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 ); -} - -QueueShieldForRemoval( var_0 ) -{ - var_1 = 5; - - if ( !isdefined( level.shieldTrashArray ) ) - level.shieldTrashArray = []; - - if ( level.shieldTrashArray.size >= var_1 ) - { - var_2 = level.shieldTrashArray.size - 1; - level.shieldTrashArray[0] delete(); - - for ( var_3 = 0; var_3 < var_2; var_3++ ) - level.shieldTrashArray[var_3] = level.shieldTrashArray[var_3 + 1]; - - level.shieldTrashArray[var_2] = undefined; - } - - level.shieldTrashArray[level.shieldTrashArray.size] = var_0; -} - -LaunchShield( var_0, var_1 ) -{ - var_2 = "weapon_riot_shield_mp"; - - if ( !isdefined( self.hasriotshieldhidden ) || self.hasriotshieldhidden == 0 ) - self detachshieldmodel( var_2, "tag_weapon_left" ); - - self.hasRiotShield = 0; - self.hasRiotShieldEquipped = 0; -} - -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 ) ) - var_1.assistedSuicide = undefined; - - if ( !isdefined( var_2.iDFlags ) ) - { - if ( var_4 == "MOD_SUICIDE" ) - var_2.iDFlags = 0; - else if ( var_4 == "MOD_GRENADE" && issubstr( var_5, "frag_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.hasRiotShieldEquipped ) - var_2 LaunchShield( var_3, var_4 ); - - if ( !var_10 ) - { - if ( isdefined( var_2.endGame ) ) - { - if ( isdefined( level.nukeDetonated ) ) - self visionsetnakedforplayer( level.nukeVisionSet, 2 ); - else - self visionsetnakedforplayer( "", 2 ); - } - else - { - if ( isdefined( level.nukeDetonated ) ) - self visionsetnakedforplayer( level.nukeVisionSet, 0 ); - else - self visionsetnakedforplayer( "", 0 ); - - var_2 thermalvisionoff(); - } - } - else - { - var_2.fauxDead = 1; - self notify( "death" ); - } - - if ( game["state"] == "postgame" ) - return; - - var_11 = 0; - - if ( !isplayer( var_0 ) && isdefined( var_0.primaryWeapon ) ) - var_12 = var_0.primaryWeapon; - else if ( isdefined( var_1 ) && isplayer( var_1 ) && var_1 getcurrentprimaryweapon() != "none" ) - var_12 = var_1 getcurrentprimaryweapon(); - else if ( issubstr( var_5, "alt_" ) ) - var_12 = getsubstr( var_5, 4, var_5.size ); - else - var_12 = 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 = var_2.lastStandParams.attacker; - var_3 = var_2.lastStandParams.iDamage; - var_4 = var_2.lastStandParams.sMeansOfDeath; - var_5 = var_2.lastStandParams.sWeapon; - var_12 = var_2.lastStandParams.sPrimaryWeapon; - var_6 = var_2.lastStandParams.vDir; - var_7 = var_2.lastStandParams.sHitLoc; - var_11 = ( 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 == var_2 ) && isdefined( self.attackers ) ) - { - var_13 = undefined; - - foreach ( var_15 in self.attackers ) - { - if ( !isdefined( var_15 ) ) - continue; - - if ( !isdefined( var_2.attackerData[var_15.guid].damage ) ) - continue; - - if ( var_15 == var_2 || level.teamBased && var_15.team == var_2.team ) - continue; - - if ( var_2.attackerData[var_15.guid].lasttimedamaged + 2500 < gettime() && ( var_1 != var_2 && ( isdefined( var_2.laststand ) && var_2.laststand ) ) ) - continue; - - if ( var_2.attackerData[var_15.guid].damage > 1 && !isdefined( var_13 ) ) - { - var_13 = var_15; - continue; - } - - if ( isdefined( var_13 ) && var_2.attackerData[var_15.guid].damage > var_2.attackerData[var_13.guid].damage ) - var_13 = var_15; - } - - if ( isdefined( var_13 ) ) - { - var_1 = var_13; - var_1.assistedSuicide = 1; - var_5 = var_2.attackerData[var_13.guid].weapon; - var_6 = var_2.attackerData[var_13.guid].vDir; - var_7 = var_2.attackerData[var_13.guid].sHitLoc; - var_8 = var_2.attackerData[var_13.guid].psoffsettime; - var_4 = var_2.attackerData[var_13.guid].sMeansOfDeath; - var_3 = var_2.attackerData[var_13.guid].damage; - var_12 = var_2.attackerData[var_13.guid].sPrimaryWeapon; - var_0 = var_1; - } - } - else if ( isdefined( var_1 ) ) - var_1.assistedSuicide = undefined; - - if ( isHeadShot( var_5, var_7, var_4, var_1 ) ) - var_4 = "MOD_HEAD_SHOT"; - else if ( var_4 != "MOD_MELEE" && !isdefined( var_2.nuked ) ) - var_2 maps\mp\_utility::playDeathSound(); - - var_17 = 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 ( 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" ); - } - } - - var_2 maps\mp\gametypes\_weapons::dropScavengerForDeath( var_1 ); - var_2 maps\mp\gametypes\_weapons::dropWeaponForDeath( var_1 ); - - if ( !var_10 ) - { - var_2.sessionstate = "dead"; - var_2.statusicon = "hud_status_dead"; - } - - var_2 maps\mp\gametypes\_playerlogic::removeFromAliveCount(); - - if ( !isdefined( var_2.switching_teams ) ) - { - var_2 maps\mp\_utility::incPersStat( "deaths", 1 ); - var_2.deaths = var_2 maps\mp\_utility::getPersStat( "deaths" ); - var_2 maps\mp\_utility::updatePersRatio( "kdRatio", "kills", "deaths" ); - var_2 maps\mp\gametypes\_persistence::statSetChild( "round", "deaths", var_2.deaths ); - var_2 maps\mp\_utility::incPlayerStat( "deaths", 1 ); - } - - if ( isdefined( var_1 ) && isplayer( var_1 ) ) - var_1 checkKillSteal( var_2 ); - - obituary( var_2, var_1, var_5, var_4 ); - var_18 = 0; - var_19 = maps\mp\_utility::getNextLifeId(); - var_2 logPrintPlayerDeath( var_19, var_1, var_3, var_4, var_5, var_12, var_7 ); - var_2 maps\mp\_matchdata::logPlayerLife( var_19 ); - var_2 maps\mp\_matchdata::logPlayerDeath( var_19, var_1, var_3, var_4, var_5, var_12, var_7 ); - - if ( var_4 == "MOD_MELEE" ) - { - if ( issubstr( var_5, "riotshield" ) ) - { - var_1 maps\mp\_utility::incPlayerStat( "shieldkills", 1 ); - - if ( !maps\mp\_utility::matchMakingGame() ) - var_2 maps\mp\_utility::incPlayerStat( "shielddeaths", 1 ); - } - else - 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, var_19, var_4, var_7 ); - else if ( var_1 == var_2 ) - handleSuicideDeath( var_4, var_7 ); - else if ( var_17 ) - { - if ( !isdefined( var_2.nuked ) ) - handleFriendlyFireDeath( var_1 ); - } - else - { - if ( var_4 == "MOD_GRENADE" && var_0 == var_1 ) - addAttacker( var_2, var_1, var_0, var_5, var_3, ( 0, 0, 0 ), var_6, var_7, var_8, var_4 ); - - var_18 = 1; - handleNormalDeath( var_19, 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_12, var_7, var_1.modifiers ); - var_2.pers["cur_death_streak"]++; - - if ( !maps\mp\_utility::getGametypeNumLives() && !maps\mp\_utility::matchMakingGame() ) - var_2 maps\mp\_utility::setPlayerStatIfGreater( "deathstreak", 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_20 = 0; - var_21 = undefined; - - if ( isdefined( self.previousPrimary ) ) - { - var_20 = 1; - var_21 = self.previousPrimary; - self.previousPrimary = undefined; - } - - if ( isplayer( var_1 ) && var_1 != self && ( !level.teamBased || level.teamBased && self.team != var_1.team ) ) - { - if ( var_20 && isdefined( var_21 ) ) - var_22 = var_21; - else - var_22 = self.lastDroppableWeapon; - - thread maps\mp\gametypes\_gamelogic::trackLeaderBoardDeathStats( var_22, var_4 ); - var_1 thread maps\mp\gametypes\_gamelogic::trackAttackerLeaderBoardDeathStats( var_5, var_4 ); - } - - var_2.wasswitchingteamsforonplayerkilled = undefined; - - if ( isdefined( var_2.switching_teams ) ) - var_2.wasswitchingteamsforonplayerkilled = 1; - - var_2 resetPlayerVariables(); - var_2.lastattacker = var_1; - var_2.lastDeathPos = var_2.origin; - var_2.deathtime = gettime(); - var_2.wantSafeSpawn = 0; - var_2.revived = 0; - var_2.sameShotDamage = 0; - - if ( maps\mp\killstreaks\_killstreaks::streakTypeResetsOnDeath( var_2.streakType ) ) - var_2 maps\mp\killstreaks\_killstreaks::resetAdrenaline(); - - if ( var_10 ) - { - var_18 = 0; - var_9 = var_2 playerforcedeathanim( var_0, var_4, var_5, var_7, var_6 ); - } - - 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 ); - - thread delayStartRagdoll( var_2.body, var_7, var_6, var_5, var_0, var_4 ); - var_2 thread [[ level.onPlayerKilled ]]( var_0, var_1, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_19 ); - - if ( isplayer( var_1 ) ) - var_23 = var_1 getentitynumber(); - else - var_23 = -1; - - var_24 = var_2 getKillcamEntity( var_1, var_0, var_5 ); - var_25 = -1; - var_26 = 0; - - if ( isdefined( var_24 ) ) - { - var_25 = var_24 getentitynumber(); - var_26 = var_24.birthtime; - - if ( !isdefined( var_26 ) ) - var_26 = 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_23, var_25, var_26, var_5, var_11, var_8 ); - - var_2 setplayerdata( "killCamHowKilled", 0 ); - - switch ( var_4 ) - { - case "MOD_HEAD_SHOT": - var_2 setplayerdata( "killCamHowKilled", 1 ); - break; - default: - break; - } - - if ( !var_10 ) - { - if ( !level.showingFinalKillcam && !level.killcam && var_18 ) - { - if ( var_2 maps\mp\_utility::_hasPerk( "specialty_copycat" ) && isdefined( var_2.pers["copyCatLoadout"] ) ) - { - var_2 thread maps\mp\gametypes\_killcam::waitDeathCopyCatButton( var_1 ); - wait 1.0; - } - } - - wait 0.25; - var_2 thread maps\mp\gametypes\_killcam::cancelKillCamOnUse(); - wait 0.25; - self.respawnTimerStartTime = gettime() + 1000; - var_27 = maps\mp\gametypes\_playerlogic::TimeUntilSpawn( 1 ); - - if ( var_27 < 1 ) - var_27 = 1; - - var_2 thread maps\mp\gametypes\_playerlogic::predictAboutToSpawnPlayerOverTime( var_27 ); - wait 1.0; - var_2 notify( "death_delay_finished" ); - } - - var_28 = ( gettime() - var_2.deathtime ) / 1000; - self.respawnTimerStartTime = gettime(); - - if ( !( isdefined( var_2.cancelKillcam ) && var_2.cancelKillcam ) && var_18 && level.killcam && game["state"] == "playing" && !var_2 maps\mp\_utility::isUsingRemote() && !level.showingFinalKillcam ) - { - var_29 = !( maps\mp\_utility::getGametypeNumLives() && !var_2.pers["lives"] ); - var_27 = maps\mp\gametypes\_playerlogic::TimeUntilSpawn( 1 ); - var_30 = var_29 && var_27 <= 0; - - if ( !var_29 ) - { - var_27 = -1; - level notify( "player_eliminated", var_2 ); - } - - var_2 maps\mp\gametypes\_killcam::killcam( var_23, var_25, var_26, var_5, var_28 + var_11, var_8, var_27, maps\mp\gametypes\_gamelogic::timeUntilRoundEnd(), var_1, var_2 ); - } - - if ( game["state"] != "playing" ) - { - if ( !level.showingFinalKillcam ) - { - var_2.sessionstate = "dead"; - var_2 maps\mp\_utility::ClearKillcamState(); - } - - return; - } - - if ( maps\mp\_utility::isValidClass( var_2.class ) ) - var_2 thread maps\mp\gametypes\_playerlogic::spawnClient(); -} - -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; -} - -checkKillSteal( var_0 ) -{ - if ( maps\mp\_utility::matchMakingGame() ) - return; - - var_1 = 0; - var_2 = undefined; - - if ( isdefined( var_0.attackerData ) && var_0.attackerData.size > 1 ) - { - foreach ( var_4 in var_0.attackerData ) - { - if ( var_4.damage > var_1 ) - { - var_1 = var_4.damage; - var_2 = var_4.attackerEnt; - } - } - - if ( isdefined( var_2 ) && var_2 != self ) - maps\mp\_utility::incPlayerStat( "killsteals", 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_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_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_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_winner = undefined; -} - -recordFinalKillCam( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 ) -{ - 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_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(); -} - -eraseFinalKillCam() -{ - 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_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_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_winner = undefined; -} - -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_sWeapon[var_0]; - var_8 = level.finalKillCam_deathTimeOffset[var_0]; - var_9 = level.finalKillCam_psOffsetTime[var_0]; - var_10 = level.finalKillCam_timeRecorded[var_0]; - var_11 = level.finalKillCam_timeGameEnded[var_0]; - - if ( !isdefined( var_2 ) || !isdefined( var_3 ) ) - { - level.showingFinalKillcam = 0; - level notify( "final_killcam_done" ); - return; - } - - var_12 = 15; - var_13 = var_11 - var_10; - - if ( var_13 > var_12 ) - { - level.showingFinalKillcam = 0; - level notify( "final_killcam_done" ); - 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 "pavelow_minigun_mp": - var_3 maps\mp\gametypes\_missions::processChallenge( "ch_transformer" ); - break; - case "sentry_minigun_mp": - var_3 maps\mp\gametypes\_missions::processChallenge( "ch_absentee" ); - break; - case "ac130_105mm_mp": - case "ac130_40mm_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; - case "cobra_20mm_mp": - var_3 maps\mp\gametypes\_missions::processChallenge( "ch_og" ); - break; - default: - break; - } - } - } - - var_14 = ( gettime() - var_2.deathtime ) / 1000; - - foreach ( var_16 in level.players ) - { - var_16 closepopupmenu(); - var_16 closeingamemenu(); - - if ( isdefined( level.nukeDetonated ) ) - var_16 visionsetnakedforplayer( level.nukeVisionSet, 0 ); - else - var_16 visionsetnakedforplayer( "", 0 ); - - var_16.killcamentitylookat = var_2 getentitynumber(); - - if ( ( var_16 != var_2 || !maps\mp\_utility::isRoundBased() || maps\mp\_utility::isLastRound() ) && var_16 maps\mp\_utility::_hasPerk( "specialty_copycat" ) ) - var_16 maps\mp\_utility::_unsetPerk( "specialty_copycat" ); - - var_16 thread maps\mp\gametypes\_killcam::killcam( var_4, var_5, var_6, var_7, var_14 + var_8, var_9, 0, 12, var_3, var_2 ); - } - - wait 0.1; - - while ( anyPlayersInKillcam() ) - wait 0.05; - - level notify( "final_killcam_done" ); - level.showingFinalKillcam = 0; -} - -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; - maps\mp\gametypes\_gameobjects::detachUseModels(); -} - -getKillcamEntity( var_0, var_1, var_2 ) -{ - if ( !isdefined( var_1 ) || var_1 == var_0 ) - return undefined; - - switch ( var_2 ) - { - case "bouncingbetty_mp": - case "artillery_mp": - case "stealth_bomb_mp": - case "pavelow_minigun_mp": - case "apache_minigun_mp": - case "littlebird_guard_minigun_mp": - case "osprey_minigun_mp": - case "airdrop_trap_explosive_mp": - case "bomb_site_mp": - return var_1.killCamEnt; - case "sam_projectile_mp": - if ( isdefined( var_1.samTurret ) && isdefined( var_1.samTurret.killCamEnt ) ) - return var_1.samTurret.killCamEnt; - - break; - case "ims_projectile_mp": - if ( isdefined( var_0 ) && isdefined( var_0.imsKillCamEnt ) ) - return var_0.imsKillCamEnt; - - break; - case "none": - if ( isdefined( var_1.targetname ) && var_1.targetname == "care_package" ) - return var_1.killCamEnt; - - break; - case "ac130_105mm_mp": - case "ac130_40mm_mp": - case "ac130_25mm_mp": - case "remotemissile_projectile_mp": - case "remote_turret_mp": - case "osprey_player_minigun_mp": - case "ugv_turret_mp": - return undefined; - } - - if ( var_1.classname == "script_origin" || var_1.classname == "script_model" || var_1.classname == "script_brushmodel" ) - { - if ( isdefined( var_1.killCamEnt ) && !var_0 attackerInRemoteKillstreak() ) - return var_1.killCamEnt; - else - return undefined; - } - - return var_1; -} - -attackerInRemoteKillstreak() -{ - if ( !isdefined( self ) ) - return 0; - - if ( isdefined( level.ac130player ) && self == level.ac130player ) - return 1; - - if ( isdefined( level.chopper ) && isdefined( level.chopper.gunner ) && self == level.chopper.gunner ) - return 1; - - if ( isdefined( level.remote_mortar ) && isdefined( level.remote_mortar.owner ) && self == level.remote_mortar.owner ) - 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 ); - } -} - -giveRecentShieldXP() -{ - self endon( "death" ); - self endon( "disconnect" ); - self notify( "giveRecentShieldXP" ); - self endon( "giveRecentShieldXP" ); - self.recentShieldXP++; - wait 20.0; - self.recentShieldXP = 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 ( !maps\mp\_utility::isReallyAlive( var_2 ) ) - return; - - if ( isdefined( var_1 ) && var_1.classname == "script_origin" && isdefined( var_1.type ) && var_1.type == "soft_landing" ) - return; - - if ( var_6 == "killstreak_emp_mp" ) - return; - - if ( var_6 == "bouncingbetty_mp" && !maps\mp\gametypes\_weapons::mineDamageHeightPassed( var_0, var_2 ) ) - return; - - if ( var_6 == "bouncingbetty_mp" && ( var_2 getstance() == "crouch" || var_2 getstance() == "prone" ) ) - var_3 = int( var_3 / 2 ); - - if ( var_6 == "xm25_mp" && var_5 == "MOD_IMPACT" ) - var_3 = 95; - - if ( var_6 == "emp_grenade_mp" && var_5 != "MOD_IMPACT" ) - var_2 notify( "emp_grenaded", var_1 ); - - if ( isdefined( level.hostMigrationTimer ) ) - return; - - 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; - - var_11 = isdefined( var_1 ) && !isdefined( var_1.gunner ) && ( var_1.classname == "script_vehicle" || var_1.classname == "misc_turret" || var_1.classname == "script_model" ); - var_12 = level.teamBased && isdefined( var_1 ) && var_2 != var_1 && isdefined( var_1.team ) && ( var_2.pers["team"] == var_1.team || isdefined( var_1.teamchangedthisframe ) ); - var_13 = isdefined( var_1 ) && isdefined( var_0 ) && isdefined( var_2 ) && isplayer( var_1 ) && var_1 == var_0 && var_1 == var_2; - - if ( var_13 ) - return; - - 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; - - 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(); - } - - var_2 notify( "shield_blocked" ); - - if ( maps\mp\_utility::isEnvironmentWeapon( var_6 ) ) - var_15 = 25; - else - var_15 = 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_2.shieldDamage + var_15; - - if ( !maps\mp\_utility::isEnvironmentWeapon( var_6 ) || common_scripts\utility::cointoss() ) - var_2.shieldBulletHits++; - - if ( var_2.shieldBulletHits >= level.riotShieldXPBullets ) - { - if ( self.recentShieldXP > 4 ) - var_16 = int( 50 / self.recentShieldXP ); - else - var_16 = 50; - - var_2 thread maps\mp\gametypes\_rank::giveRankXP( "shield_damage", var_16 ); - var_2 thread giveRecentShieldXP(); - var_2 thread maps\mp\gametypes\_missions::genericChallenge( "shield_damage", var_2.shieldDamage ); - var_2 thread maps\mp\gametypes\_missions::genericChallenge( "shield_bullet_hits", var_2.shieldBulletHits ); - var_2.shieldDamage = 0; - var_2.shieldBulletHits = 0; - } - } - - if ( var_4 & level.iDFLAGS_SHIELD_EXPLOSIVE_IMPACT ) - { - if ( !var_12 ) - var_2 thread maps\mp\gametypes\_missions::genericChallenge( "shield_explosive_hits", 1 ); - - 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 = 151; - - var_2 thread maps\mp\gametypes\_missions::genericChallenge( "shield_explosive_hits", 1 ); - var_9 = "none"; - } - else - return; - } - else if ( var_5 == "MOD_MELEE" && issubstr( var_6, "riotshield" ) ) - { - if ( !( var_12 && level.friendlyfire == 0 ) ) - { - var_14 = 0.0; - var_2 stunplayer( 0.0 ); - } - } - - if ( isdefined( var_0 ) && isdefined( var_0.stuckEnemyEntity ) && var_0.stuckEnemyEntity == var_2 ) - var_3 = 151; - - 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 ); - - if ( isdefined( level.modifyPlayerDamage ) ) - var_3 = [[ level.modifyPlayerDamage ]]( var_2, var_1, var_3, var_5, var_6, var_7, var_8, var_9 ); - - if ( !var_3 ) - return 0; - - var_2.iDFlags = var_4; - var_2.iDFlagsTime = gettime(); - - if ( game["state"] == "postgame" ) - return; - - if ( var_2.sessionteam == "spectator" ) - return; - - if ( isdefined( var_2.canDoCombat ) && !var_2.canDoCombat ) - return; - - if ( isdefined( var_1 ) && isplayer( var_1 ) && isdefined( var_1.canDoCombat ) && !var_1.canDoCombat ) - return; - - if ( var_11 && var_12 ) - { - if ( var_5 == "MOD_CRUSH" ) - { - var_2 maps\mp\_utility::_suicide(); - return; - } - - if ( !level.friendlyfire ) - return; - } - - if ( !isdefined( var_8 ) ) - var_4 |= level.iDFLAGS_NO_KNOCKBACK; - - var_17 = 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 ( 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; - 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_18 = int( max( var_2.health / 4, 1 ) ); - - if ( var_3 >= var_18 && maps\mp\_utility::isKillstreakWeapon( var_6 ) ) - var_3 = var_18; - } - - if ( !( var_4 & level.iDFLAGS_NO_PROTECTION ) ) - { - if ( !level.teamBased && var_11 && isdefined( var_1.owner ) && var_1.owner == var_2 ) - { - if ( var_5 == "MOD_CRUSH" ) - var_2 maps\mp\_utility::_suicide(); - - return; - } - - 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; - - 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_19 = 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_19 ) - var_2.explosiveInfo["suicideGrenadeKill"] = 1; - } - - if ( var_19 ) - { - 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" ) || var_6 == "xm25_mp" ) ) - { - if ( isplayer( var_1 ) && var_1 != self ) - maps\mp\gametypes\_gamelogic::setInflictorStat( var_0, var_1, var_6 ); - } - - if ( isplayer( var_1 ) && isdefined( var_1.pers["participation"] ) ) - var_1.pers["participation"]++; - else if ( isplayer( var_1 ) ) - var_1.pers["participation"] = 1; - - var_20 = var_2.health / var_2.maxHealth; - - if ( var_12 ) - { - if ( !maps\mp\_utility::matchMakingGame() && isplayer( var_1 ) ) - var_1 maps\mp\_utility::incPlayerStat( "mostff", 1 ); - - 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; - } - 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_17 = 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 ( 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 ) ) - level.lastLegitimateAttacker = var_1; - - if ( isdefined( var_1 ) && isplayer( var_1 ) && isdefined( var_6 ) ) - var_1 thread maps\mp\gametypes\_weapons::checkHit( var_6, var_2 ); - - if ( isdefined( var_1 ) && isplayer( var_1 ) && isdefined( var_6 ) && var_1 != var_2 ) - { - var_1 thread maps\mp\_events::damagedPlayer( self, var_3, var_6 ); - var_2.attackerPosition = var_1.origin; - } - else - var_2.attackerPosition = undefined; - - if ( issubstr( var_5, "MOD_GRENADE" ) && isdefined( var_0.isCooked ) ) - var_2.wasCooked = gettime(); - else - var_2.wasCooked = undefined; - - var_2.lastDamageWasFromEnemy = isdefined( var_1 ) && var_1 != var_2; - - if ( var_2.lastDamageWasFromEnemy ) - var_1.damagedPlayers[var_2.guid] = gettime(); - - 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 ( isdefined( level.ac130player ) && isdefined( var_1 ) && level.ac130player == var_1 ) - level notify( "ai_pain", var_2 ); - - var_2 thread maps\mp\gametypes\_missions::playerDamaged( var_0, var_1, var_3, var_5, var_6, var_9 ); - } - - if ( var_11 && isdefined( var_1.gunner ) ) - var_21 = var_1.gunner; - else - var_21 = var_1; - - if ( isdefined( var_21 ) && var_21 != var_2 && var_3 > 0 && ( !isdefined( var_9 ) || var_9 != "shield" ) ) - { - if ( var_4 & level.iDFLAGS_STUN ) - var_22 = "stun"; - else if ( isexplosivedamagemod( var_5 ) && var_2 maps\mp\_utility::_hasPerk( "_specialty_blastshield" ) ) - var_22 = "hitBodyArmor"; - else if ( var_2 maps\mp\_utility::_hasPerk( "specialty_combathigh" ) ) - var_22 = "hitEndGame"; - else if ( isdefined( var_2.hasLightArmor ) ) - var_22 = "hitLightArmor"; - else if ( var_2 maps\mp\_utility::isJuggernaut() ) - var_22 = "hitJuggernaut"; - else if ( !shouldWeaponFeedback( var_6 ) ) - var_22 = "none"; - else - var_22 = "standard"; - - var_21 thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( var_22 ); - } - - maps\mp\gametypes\_gamelogic::sethasdonecombat( var_2, 1 ); - } - - if ( isdefined( var_1 ) && var_1 != var_2 && !var_17 ) - level.useStartSpawn = 0; - - if ( var_3 > 0 && isdefined( var_1 ) && !var_2 maps\mp\_utility::isUsingRemote() ) - var_2 thread maps\mp\gametypes\_shellshock::bloodEffect( var_1.origin ); - - if ( var_2.sessionstate != "dead" ) - { - var_23 = var_2 getentitynumber(); - var_24 = var_2.name; - var_25 = var_2.pers["team"]; - var_26 = var_2.guid; - var_27 = ""; - - if ( isplayer( var_1 ) ) - { - var_28 = var_1 getentitynumber(); - var_29 = var_1.guid; - var_30 = var_1.name; - var_27 = var_1.pers["team"]; - } - else - { - var_28 = -1; - var_29 = ""; - var_30 = ""; - var_27 = "world"; - } - - logprint( "D;" + var_26 + ";" + var_23 + ";" + var_25 + ";" + var_24 + ";" + var_29 + ";" + var_28 + ";" + var_27 + ";" + var_30 + ";" + var_6 + ";" + var_3 + ";" + var_5 + ";" + var_9 + "\n" ); - } - - HitlocDebug( var_1, var_2, var_3, var_9, var_4 ); - - if ( isdefined( var_1 ) && var_1 != var_2 ) - { - if ( isplayer( var_1 ) ) - var_1 maps\mp\_utility::incPlayerStat( "damagedone", var_3 ); - - var_2 maps\mp\_utility::incPlayerStat( "damagetaken", var_3 ); - } -} - -shouldWeaponFeedback( var_0 ) -{ - switch ( var_0 ) - { - case "artillery_mp": - case "stealth_bomb_mp": - return 0; - } - - return 1; -} - -checkVictimStutter( var_0, var_1, var_2, var_3, var_4 ) -{ - if ( var_4 == "MOD_PISTOL_BULLET" || var_4 == "MOD_RIFLE_BULLET" || var_4 == "MOD_HEAD_SHOT" ) - { - if ( distance( var_0.origin, var_1.origin ) > 256 ) - return; - - var_5 = var_0 getvelocity(); - - if ( lengthsquared( var_5 ) < 10 ) - return; - - var_6 = maps\mp\_utility::findIsFacing( var_0, var_1, 25 ); - - if ( var_6 ) - var_0 thread stutterStep(); - } -} - -stutterStep( var_0 ) -{ - self endon( "disconnect" ); - self endon( "death" ); - level endon( "game_ended" ); - self.inStutter = 1; - self.moveSpeedScaler = 0.05; - maps\mp\gametypes\_weapons::updateMoveSpeedScale(); - wait 0.5; - self.moveSpeedScaler = 1; - - if ( maps\mp\_utility::_hasPerk( "specialty_lightweight" ) ) - self.moveSpeedScaler = maps\mp\_utility::lightWeightScalar(); - - maps\mp\gametypes\_weapons::updateMoveSpeedScale(); - self.inStutter = 0; -} - -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_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; -} - -resetAttackerList() -{ - self endon( "disconnect" ); - self endon( "death" ); - level endon( "game_ended" ); - wait 1.75; - self.attackers = []; - self.attackerData = []; -} - -Callback_PlayerDamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ) -{ - Callback_PlayerDamage_internal( var_0, var_1, self, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ); -} - -doPrintDamage(dmg, hitloc, flags) -{ - huddamage = newclienthudelem(self); - huddamage.alignx = "center"; - huddamage.horzalign = "center"; - huddamage.x = 10; - huddamage.y = 235; - huddamage.fontscale = 1.6; - huddamage.font = "objective"; - huddamage setvalue(dmg); - - if ((flags & level.iDFLAGS_RADIUS) != 0) - huddamage.color = (0.25, 0.25, 0.25); - - if ((flags & level.iDFLAGS_PENETRATION) != 0) - huddamage.color = (1, 1, 0.25); - - if (hitloc == "head") - huddamage.color = (1, 0.25, 0.25); - - huddamage moveovertime(1); - huddamage fadeovertime(1); - huddamage.alpha = 0; - huddamage.x = randomIntRange(25, 70); - - val = 1; - if (randomInt(2)) - val = -1; - - huddamage.y = 235 + randomIntRange(25, 70) * val; - - wait 1; - - huddamage destroy(); -} - -finishPlayerDamageWrapper( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ) -{ - if( isDefined(level.allowPrintDamage) && level.allowPrintDamage ) - { - if ( isDefined( var_1 ) && isPlayer( var_1 ) && isDefined(var_1.printDamage) && var_1.printDamage ) - var_1 thread doPrintDamage(var_2, var_8, var_3); - else if( isDefined( var_1.owner ) && isPlayer( var_1.owner ) && isDefined(var_1.owner.printDamage) && var_1.owner.printDamage ) - var_1.owner thread doPrintDamage(var_2, var_8, var_3); - } - - if ( maps\mp\_utility::isUsingRemote() && var_2 >= self.health && !( var_3 & level.iDFLAGS_STUN ) ) - { - 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; - - self finishplayerdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ); - } - - 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 ); -} - -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 ( !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 = "specialty_finalstand"; - } - else if ( maps\mp\_utility::_hasPerk( "specialty_c4death" ) ) - { - var_11.titleText = game["strings"]["c4_death"]; - var_11.iconName = "specialty_c4death"; - } - else - { - var_11.titleText = game["strings"]["last_stand"]; - var_11.iconName = "specialty_pistoldeath"; - } - - 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 ( isdefined( level.ac130player ) && isdefined( var_1 ) && level.ac130player == var_1 ) - level notify( "ai_crawling", self ); - - 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 ( maps\mp\_utility::_hasPerk( "specialty_c4death" ) ) - { - self.previousPrimary = self.lastDroppableWeapon; - self.lastStandParams = var_9; - self takeallweapons(); - self giveweapon( "c4death_mp", 0, 0 ); - self switchtoweapon( "c4death_mp" ); - common_scripts\utility::_disableUsability(); - self.inC4Death = 1; - thread lastStandTimer( 20, 0 ); - thread detonateOnUse(); - thread detonateOnDeath(); - } - else - { - if ( level.dieHardMode ) - { - self.lastStandParams = var_9; - thread enableLastStandWeapons(); - 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 = "iw5_usp45_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 && !level.dieHardMode && ( !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 = self.health - 1; - self.maxHealth = var_0; - wait 0.05; - self.maxHealth = 50; - self.health = 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" ) - return 0; - - if ( var_1 == "MOD_IMPACT" && ( var_0 == "m79_mp" || issubstr( var_0, "gl_" ) ) ) - return 0; - - if ( 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 "head": - case "helmet": - case "neck": - return 60; - case "torso_upper": - case "right_arm_upper": - case "left_arm_upper": - case "right_arm_lower": - case "left_arm_lower": - case "right_hand": - case "left_hand": - case "gun": - return 48; - case "torso_lower": - return 40; - case "right_leg_upper": - case "left_leg_upper": - return 32; - case "right_leg_lower": - case "left_leg_lower": - return 10; - case "right_foot": - case "left_foot": - return 5; - } - - return 48; -} - -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( 1 ); -} - -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( "damage_heavy" ); -} - -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 = useHoldThink( var_1 ); - self.owner.beingRevived = 0; - - if ( !isalive( self.owner ) ) - { - self delete(); - return; - } - - self.owner maps\mp\_utility::freezeControlsWrapper( 0 ); - - if ( var_2 ) - { - var_1 thread maps\mp\gametypes\_hud_message::splashNotifyDelayed( "reviver", 200 ); - var_1 thread maps\mp\gametypes\_rank::giveRankXP( "reviver", 200 ); - self.owner.laststand = undefined; - self.owner maps\mp\_utility::clearLowerMessage( "last_stand" ); - self.owner.moveSpeedScaler = 1; - - if ( self.owner maps\mp\_utility::_hasPerk( "specialty_lightweight" ) ) - self.owner.moveSpeedScaler = maps\mp\_utility::lightWeightScalar(); - - 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 ); - } -} - -useHoldThink( var_0 ) -{ - var_1 = spawn( "script_origin", self.origin ); - var_1 hide(); - var_0 playerlinkto( var_1 ); - var_0 playerlinkedoffsetenable(); - var_0 common_scripts\utility::_disableWeapon(); - self.curProgress = 0; - self.inUse = 1; - self.useRate = 0; - self.useTime = 3000; - var_0 thread personalUseBar( self ); - var_2 = useHoldThinkLoop( var_0 ); - - if ( isdefined( var_0 ) && maps\mp\_utility::isReallyAlive( var_0 ) ) - { - var_0 unlink(); - var_0 common_scripts\utility::_enableWeapon(); - } - - if ( isdefined( var_2 ) && var_2 ) - { - self.owner thread maps\mp\gametypes\_hud_message::playerCardSplashNotify( "revived", var_0 ); - self.owner.inLastStand = 0; - return 1; - } - - self.inUse = 0; - var_1 delete(); - return 0; -} - -personalUseBar( 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(); -} - -useHoldThinkLoop( 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 ) - { - self.curProgress = 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(); - } -} - -drawLine( var_0, var_1, var_2 ) -{ - var_3 = int( var_2 * 20 ); - - for ( var_4 = 0; var_4 < var_3; var_4++ ) - wait 0.05; -} - -isFlankKill( var_0, var_1 ) -{ - var_2 = anglestoforward( var_0.angles ); - var_2 = ( var_2[0], var_2[1], 0 ); - var_2 = vectornormalize( var_2 ); - var_3 = var_0.origin - var_1.origin; - var_3 = ( var_3[0], var_3[1], 0 ); - var_3 = vectornormalize( var_3 ); - var_4 = vectordot( var_2, var_3 ); - - if ( var_4 > 0 ) - return 1; - else - return 0; -} - -_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 getxuid() + "(" + 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 ) -{ - if ( isdefined( var_1 ) && isplayer( var_1 ) && isalive( var_1 ) ) - { - if ( level.matchRules_damageMultiplier ) - var_2 *= level.matchRules_damageMultiplier; - - if ( level.matchRules_vampirism ) - var_1.health = int( min( float( var_1.maxHealth ), float( var_1.health + 20 ) ) ); - } - - return var_2; -} diff --git a/raw/maps/mp/gametypes/_rank.gsc b/raw/maps/mp/gametypes/_rank.gsc deleted file mode 100644 index 9521352..0000000 --- a/raw/maps/mp/gametypes/_rank.gsc +++ /dev/null @@ -1,1101 +0,0 @@ -// IW5 PC GSC -// Decompiled by https://github.com/xensik/gsc-tool - -init() -{ - level.scoreInfo = []; - level.xpScale = getdvarint( "scr_xpscale" ); - level.weaponxpscale = getdvarint( "scr_weaponxpscale" ); - level.rankTable = []; - level.weaponRankTable = []; - precacheshader( "white" ); - precachestring( &"RANK_PLAYER_WAS_PROMOTED_N" ); - precachestring( &"RANK_PLAYER_WAS_PROMOTED" ); - precachestring( &"RANK_WEAPON_WAS_PROMOTED" ); - precachestring( &"RANK_PROMOTED" ); - precachestring( &"RANK_PROMOTED_WEAPON" ); - precachestring( &"MP_PLUS" ); - precachestring( &"RANK_ROMANI" ); - precachestring( &"RANK_ROMANII" ); - precachestring( &"RANK_ROMANIII" ); - precachestring( &"SPLASHES_LONGSHOT" ); - precachestring( &"SPLASHES_PROXIMITYASSIST" ); - precachestring( &"SPLASHES_PROXIMITYKILL" ); - precachestring( &"SPLASHES_EXECUTION" ); - precachestring( &"SPLASHES_AVENGER" ); - precachestring( &"SPLASHES_ASSISTEDSUICIDE" ); - precachestring( &"SPLASHES_DEFENDER" ); - precachestring( &"SPLASHES_POSTHUMOUS" ); - precachestring( &"SPLASHES_REVENGE" ); - precachestring( &"SPLASHES_DOUBLEKILL" ); - precachestring( &"SPLASHES_TRIPLEKILL" ); - precachestring( &"SPLASHES_MULTIKILL" ); - precachestring( &"SPLASHES_BUZZKILL" ); - precachestring( &"SPLASHES_COMEBACK" ); - precachestring( &"SPLASHES_KNIFETHROW" ); - precachestring( &"SPLASHES_ONE_SHOT_KILL" ); - - if ( level.teamBased ) - { - registerScoreInfo( "kill", 100 ); - registerScoreInfo( "headshot", 100 ); - registerScoreInfo( "assist", 20 ); - registerScoreInfo( "proximityassist", 20 ); - registerScoreInfo( "proximitykill", 20 ); - registerScoreInfo( "suicide", 0 ); - registerScoreInfo( "teamkill", 0 ); - } - else - { - registerScoreInfo( "kill", 50 ); - registerScoreInfo( "headshot", 50 ); - registerScoreInfo( "assist", 0 ); - registerScoreInfo( "suicide", 0 ); - registerScoreInfo( "teamkill", 0 ); - } - - registerScoreInfo( "win", 1 ); - registerScoreInfo( "loss", 0.5 ); - registerScoreInfo( "tie", 0.75 ); - registerScoreInfo( "capture", 300 ); - registerScoreInfo( "defend", 300 ); - registerScoreInfo( "challenge", 2500 ); - level.maxRank = int( tablelookup( "mp/rankTable.csv", 0, "maxrank", 1 ) ); - level.maxPrestige = int( tablelookup( "mp/rankIconTable.csv", 0, "maxprestige", 1 ) ); - var_0 = 0; - var_1 = 0; - - for ( var_0 = 0; var_0 <= min( 10, level.maxPrestige ); var_0++ ) - { - for ( var_1 = 0; var_1 <= level.maxRank; var_1++ ) - precacheshader( tablelookup( "mp/rankIconTable.csv", 0, var_1, var_0 + 1 ) ); - } - - var_2 = 0; - - for ( var_3 = tablelookup( "mp/ranktable.csv", 0, var_2, 1 ); isdefined( var_3 ) && var_3 != ""; var_3 = tablelookup( "mp/ranktable.csv", 0, var_2, 1 ) ) - { - level.rankTable[var_2][1] = tablelookup( "mp/ranktable.csv", 0, var_2, 1 ); - level.rankTable[var_2][2] = tablelookup( "mp/ranktable.csv", 0, var_2, 2 ); - level.rankTable[var_2][3] = tablelookup( "mp/ranktable.csv", 0, var_2, 3 ); - level.rankTable[var_2][7] = tablelookup( "mp/ranktable.csv", 0, var_2, 7 ); - precachestring( tablelookupistring( "mp/ranktable.csv", 0, var_2, 16 ) ); - var_2++; - } - - var_4 = int( tablelookup( "mp/weaponRankTable.csv", 0, "maxrank", 1 ) ); - - for ( var_5 = 0; var_5 < var_4 + 1; var_5++ ) - { - level.weaponRankTable[var_5][1] = tablelookup( "mp/weaponRankTable.csv", 0, var_5, 1 ); - level.weaponRankTable[var_5][2] = tablelookup( "mp/weaponRankTable.csv", 0, var_5, 2 ); - level.weaponRankTable[var_5][3] = tablelookup( "mp/weaponRankTable.csv", 0, var_5, 3 ); - } - - maps\mp\gametypes\_missions::buildChallegeInfo(); - level thread patientZeroWaiter(); - level thread onPlayerConnect(); -} - -patientZeroWaiter() -{ - level endon( "game_ended" ); - - while ( !isdefined( level.players ) || !level.players.size ) - wait 0.05; - - if ( !maps\mp\_utility::matchMakingGame() ) - { - if ( getdvar( "mapname" ) == "mp_rust" && randomint( 1000 ) == 999 ) - level.patientZeroName = level.players[0].name; - } - else if ( getdvar( "scr_patientZero" ) != "" ) - level.patientZeroName = getdvar( "scr_patientZero" ); -} - -isRegisteredEvent( var_0 ) -{ - if ( isdefined( level.scoreInfo[var_0] ) ) - return 1; - else - return 0; -} - -registerScoreInfo( var_0, var_1 ) -{ - level.scoreInfo[var_0]["value"] = var_1; -} - -getScoreInfoValue( var_0 ) -{ - var_1 = "scr_" + level.gameType + "_score_" + var_0; - - if ( getdvar( var_1 ) != "" ) - return getdvarint( var_1 ); - else - return level.scoreInfo[var_0]["value"]; -} - -getScoreInfoLabel( var_0 ) -{ - return level.scoreInfo[var_0]["label"]; -} - -getRankInfoMinXP( var_0 ) -{ - return int( level.rankTable[var_0][2] ); -} - -getWeaponRankInfoMinXP( var_0 ) -{ - return int( level.weaponRankTable[var_0][1] ); -} - -getRankInfoXPAmt( var_0 ) -{ - return int( level.rankTable[var_0][3] ); -} - -getWeaponRankInfoXPAmt( var_0 ) -{ - return int( level.weaponRankTable[var_0][2] ); -} - -getRankInfoMaxXp( var_0 ) -{ - return int( level.rankTable[var_0][7] ); -} - -getWeaponRankInfoMaxXp( var_0 ) -{ - return int( level.weaponRankTable[var_0][3] ); -} - -getRankInfoFull( var_0 ) -{ - return tablelookupistring( "mp/ranktable.csv", 0, var_0, 16 ); -} - -getRankInfoIcon( var_0, var_1 ) -{ - return tablelookup( "mp/rankIconTable.csv", 0, var_0, var_1 + 1 ); -} - -getRankInfoLevel( var_0 ) -{ - return int( tablelookup( "mp/ranktable.csv", 0, var_0, 13 ) ); -} - -onPlayerConnect() -{ - for (;;) - { - level waittill( "connected", var_0 ); - var_0.pers["rankxp"] = var_0 maps\mp\gametypes\_persistence::statGet( "experience" ); - - if ( var_0.pers["rankxp"] < 0 ) - var_0.pers["rankxp"] = 0; - - var_1 = var_0 getRankForXp( var_0 getRankXP() ); - var_0.pers["rank"] = var_1; - var_0.pers["participation"] = 0; - var_0.xpUpdateTotal = 0; - var_0.bonusUpdateTotal = 0; - var_2 = var_0 getPrestigeLevel(); - var_0 setrank( var_1, var_2 ); - var_0.pers["prestige"] = var_2; - - if ( var_0.clientid < level.MaxLogClients ) - { - setmatchdata( "players", var_0.clientid, "rank", var_1 ); - setmatchdata( "players", var_0.clientid, "Prestige", var_2 ); - } - - var_0.postGamePromotion = 0; - - if ( !isdefined( var_0.pers["postGameChallenges"] ) ) - var_0 setclientdvars( "ui_challenge_1_ref", "", "ui_challenge_2_ref", "", "ui_challenge_3_ref", "", "ui_challenge_4_ref", "", "ui_challenge_5_ref", "", "ui_challenge_6_ref", "", "ui_challenge_7_ref", "" ); - - var_0 setclientdvar( "ui_promotion", 0 ); - - if ( !isdefined( var_0.pers["summary"] ) ) - { - var_0.pers["summary"] = []; - var_0.pers["summary"]["xp"] = 0; - var_0.pers["summary"]["score"] = 0; - var_0.pers["summary"]["challenge"] = 0; - var_0.pers["summary"]["match"] = 0; - var_0.pers["summary"]["misc"] = 0; - var_0 setclientdvar( "player_summary_xp", "0" ); - var_0 setclientdvar( "player_summary_score", "0" ); - var_0 setclientdvar( "player_summary_challenge", "0" ); - var_0 setclientdvar( "player_summary_match", "0" ); - var_0 setclientdvar( "player_summary_misc", "0" ); - } - - var_0 setclientdvar( "ui_opensummary", 0 ); - var_0 thread maps\mp\gametypes\_missions::updateChallenges(); - var_0.explosiveKills[0] = 0; - var_0.xpGains = []; - var_0.hud_xpPointsPopup = var_0 createXpPointsPopup(); - var_0.hud_xpEventPopup = var_0 createXpEventPopup(); - var_0 thread onPlayerSpawned(); - var_0 thread onJoinedTeam(); - var_0 thread onJoinedSpectators(); - var_0 thread setGamesPlayed(); - - if ( var_0 getplayerdata( "prestigeDoubleXp" ) ) - var_0.prestigeDoubleXp = 1; - else - var_0.prestigeDoubleXp = 0; - - if ( var_0 getplayerdata( "prestigeDoubleWeaponXp" ) ) - { - var_0.prestigeDoubleWeaponXp = 1; - continue; - } - - var_0.prestigeDoubleWeaponXp = 0; - } -} - -setGamesPlayed() -{ - self endon( "disconnect" ); - - for (;;) - { - wait 30; - - if ( !self.hasDoneCombat ) - continue; - - maps\mp\gametypes\_persistence::statAdd( "gamesPlayed", 1 ); - break; - } -} - -onJoinedTeam() -{ - self endon( "disconnect" ); - - for (;;) - { - self waittill( "joined_team" ); - thread removeRankHUD(); - } -} - -onJoinedSpectators() -{ - self endon( "disconnect" ); - - for (;;) - { - self waittill( "joined_spectators" ); - thread removeRankHUD(); - } -} - -onPlayerSpawned() -{ - self endon( "disconnect" ); - - for (;;) - self waittill( "spawned_player" ); -} - -roundUp( var_0 ) -{ - if ( int( var_0 ) != var_0 ) - return int( var_0 + 1 ); - else - return int( var_0 ); -} - -giveRankXP( var_0, var_1, var_2, var_3, var_4 ) -{ - self endon( "disconnect" ); - var_5 = "none"; - - if ( !maps\mp\_utility::rankingEnabled() ) - { - if ( var_0 == "assist" ) - { - if ( isdefined( self.taggedassist ) ) - self.taggedassist = undefined; - else - { - var_6 = &"MP_ASSIST"; - - if ( maps\mp\_utility::_hasPerk( "specialty_assists" ) ) - { - if ( !( self.pers["assistsToKill"] % 2 ) ) - var_6 = &"MP_ASSIST_TO_KILL"; - } - - thread xpEventPopup( var_6 ); - } - } - - return; - } - - if ( level.teamBased && ( !level.teamCount["allies"] || !level.teamCount["axis"] ) ) - return; - else if ( !level.teamBased && level.teamCount["allies"] + level.teamCount["axis"] < 2 ) - return; - - if ( !isdefined( var_1 ) ) - var_1 = getScoreInfoValue( var_0 ); - - if ( !isdefined( self.xpGains[var_0] ) ) - self.xpGains[var_0] = 0; - - var_7 = 0; - var_8 = 0; - - switch ( var_0 ) - { - case "kill": - case "headshot": - case "shield_damage": - var_1 *= self.xpScaler; - case "destroy": - case "suicide": - case "assist": - case "teamkill": - case "capture": - case "defend": - case "assault": - case "return": - case "pickup": - case "plant": - case "save": - case "defuse": - case "kill_confirmed": - case "kill_denied": - case "tags_retrieved": - case "team_assist": - case "kill_bonus": - case "kill_carrier": - case "draft_rogue": - case "survivor": - case "final_rogue": - case "gained_gun_rank": - case "dropped_enemy_gun_rank": - case "got_juggernaut": - case "kill_as_juggernaut": - case "kill_juggernaut": - case "jugg_on_jugg": - if ( maps\mp\_utility::getGametypeNumLives() > 0 && var_0 != "shield_damage" ) - { - var_9 = max( 1, int( 10 / maps\mp\_utility::getGametypeNumLives() ) ); - var_1 = int( var_1 * var_9 ); - } - - var_10 = 0; - var_11 = 0; - - if ( self.prestigeDoubleXp ) - { - var_12 = self getplayerdata( "prestigeDoubleXpTimePlayed" ); - - if ( var_12 >= self.bufferedStatsMax["prestigeDoubleXpMaxTimePlayed"] ) - { - self setplayerdata( "prestigeDoubleXp", 0 ); - self setplayerdata( "prestigeDoubleXpTimePlayed", 0 ); - self setplayerdata( "prestigeDoubleXpMaxTimePlayed", 0 ); - self.prestigeDoubleXp = 0; - } - else - var_11 = 2; - } - - if ( !self.prestigeDoubleXp ) - { - for ( var_13 = 0; var_13 < 3; var_13++ ) - { - if ( self getplayerdata( "xpMultiplierTimePlayed", var_13 ) < self.bufferedChildStatsMax["xpMaxMultiplierTimePlayed"][var_13] ) - var_10 += int( self getplayerdata( "xpMultiplier", var_13 ) ); - } - } - - if ( var_11 > 0 ) - var_1 = int( var_1 * level.xpScale * var_11 ); - else if ( var_10 > 0 ) - var_1 = int( var_1 * level.xpScale * var_10 ); - else - var_1 = int( var_1 * level.xpScale ); - - if ( isdefined( level.nukeDetonated ) && level.nukeDetonated ) - { - if ( level.teamBased && level.nukeInfo.team == self.team ) - var_1 *= level.nukeInfo._unk_field_ID54; - else if ( !level.teamBased && level.nukeInfo.player == self ) - var_1 *= level.nukeInfo._unk_field_ID54; - - var_1 = int( var_1 ); - } - - var_14 = getRestXPAward( var_1 ); - var_1 += var_14; - - if ( var_14 > 0 ) - { - if ( isLastRestXPAward( var_1 ) ) - thread maps\mp\gametypes\_hud_message::splashNotify( "rested_done" ); - - var_8 = 1; - } - - break; - case "challenge": - var_10 = 0; - - if ( self getplayerdata( "challengeXPMultiplierTimePlayed", 0 ) < self.bufferedChildStatsMax["challengeXPMaxMultiplierTimePlayed"][0] ) - { - var_10 += int( self getplayerdata( "challengeXPMultiplier", 0 ) ); - - if ( var_10 > 0 ) - var_1 = int( var_1 * var_10 ); - } - - break; - } - - if ( !var_8 ) - { - if ( self getplayerdata( "restXPGoal" ) > getRankXP() ) - self setplayerdata( "restXPGoal", self getplayerdata( "restXPGoal" ) + var_1 ); - } - - var_15 = getRankXP(); - self.xpGains[var_0] = self.xpGains[var_0] + var_1; - incRankXP( var_1 ); - - if ( maps\mp\_utility::rankingEnabled() && updateRank( var_15 ) ) - thread updateRankAnnounceHUD(); - - syncXPStat(); - var_16 = maps\mp\gametypes\_missions::isWeaponChallenge( var_4 ); - - if ( var_16 ) - var_2 = self getcurrentweapon(); - - if ( var_0 == "shield_damage" ) - { - var_2 = self getcurrentweapon(); - var_3 = "MOD_MELEE"; - } - - if ( weaponShouldGetXP( var_2, var_3 ) || var_16 ) - { - var_17 = strtok( var_2, "_" ); - - if ( var_17[0] == "iw5" ) - var_18 = var_17[0] + "_" + var_17[1]; - else if ( var_17[0] == "alt" ) - var_18 = var_17[1] + "_" + var_17[2]; - else - var_18 = var_17[0]; - - if ( var_17[0] == "gl" ) - var_18 = var_17[1]; - - if ( self isitemunlocked( var_18 ) ) - { - if ( self.primaryWeapon == var_2 || self.secondaryWeapon == var_2 || weaponaltweaponname( self.primaryWeapon ) == var_2 || isdefined( self.tookWeaponFrom ) && isdefined( self.tookWeaponFrom[var_2] ) ) - { - var_19 = getWeaponRankXP( var_18 ); - - switch ( var_0 ) - { - case "kill": - var_20 = 100; - break; - default: - var_20 = var_1; - break; - } - - var_20 = int( var_20 * level.weaponxpscale ); - - if ( self.prestigeDoubleWeaponXp ) - { - var_21 = self getplayerdata( "prestigeDoubleWeaponXpTimePlayed" ); - - if ( var_21 >= self.bufferedStatsMax["prestigeDoubleWeaponXpMaxTimePlayed"] ) - { - self setplayerdata( "prestigeDoubleWeaponXp", 0 ); - self setplayerdata( "prestigeDoubleWeaponXpTimePlayed", 0 ); - self setplayerdata( "prestigeDoubleWeaponXpMaxTimePlayed", 0 ); - self.prestigeDoubleWeaponXp = 0; - } - else - var_20 *= 2; - } - - if ( self getplayerdata( "weaponXPMultiplierTimePlayed", 0 ) < self.bufferedChildStatsMax["weaponXPMaxMultiplierTimePlayed"][0] ) - { - var_22 = int( self getplayerdata( "weaponXPMultiplier", 0 ) ); - - if ( var_22 > 0 ) - var_20 *= var_22; - } - - var_23 = var_19 + var_20; - - if ( !isWeaponMaxRank( var_18 ) ) - { - var_24 = getWeaponMaxRankXP( var_18 ); - - if ( var_23 > var_24 ) - { - var_23 = var_24; - var_20 = var_24 - var_19; - } - - if ( !isdefined( self.weaponsUsed ) ) - { - self.weaponsUsed = []; - self.weaponXpEarned = []; - } - - var_25 = 0; - var_26 = 999; - - for ( var_13 = 0; var_13 < self.weaponsUsed.size; var_13++ ) - { - if ( self.weaponsUsed[var_13] == var_18 ) - { - var_25 = 1; - var_26 = var_13; - } - } - - if ( var_25 ) - self.weaponXpEarned[var_26] = self.weaponXpEarned[var_26] + var_20; - else - { - self.weaponsUsed[self.weaponsUsed.size] = var_18; - self.weaponXpEarned[self.weaponXpEarned.size] = var_20; - } - - self setplayerdata( "weaponXP", var_18, var_23 ); - maps\mp\_matchdata::logWeaponStat( var_18, "XP", var_20 ); - maps\mp\_utility::incPlayerStat( "weaponxpearned", var_20 ); - - if ( maps\mp\_utility::rankingEnabled() && updateWeaponRank( var_23, var_18 ) ) - thread updateWeaponRankAnnounceHUD(); - } - } - } - } - - if ( !level.hardcoreMode ) - { - if ( var_0 == "teamkill" ) - thread xpPointsPopup( 0 - getScoreInfoValue( "kill" ), 0, ( 1, 0, 0 ), 0 ); - else - { - var_27 = ( 1, 1, 0.5 ); - - if ( var_8 ) - var_27 = ( 1, 0.65, 0 ); - - thread xpPointsPopup( var_1, var_7, var_27, 0 ); - - if ( var_0 == "assist" ) - { - if ( isdefined( self.taggedassist ) ) - self.taggedassist = undefined; - else - { - var_6 = &"MP_ASSIST"; - - if ( maps\mp\_utility::_hasPerk( "specialty_assists" ) ) - { - if ( !( self.pers["assistsToKill"] % 2 ) ) - var_6 = &"MP_ASSIST_TO_KILL"; - } - - thread xpEventPopup( var_6 ); - } - } - } - } - - switch ( var_0 ) - { - case "kill": - case "suicide": - case "headshot": - case "assist": - case "teamkill": - case "capture": - case "defend": - case "assault": - case "return": - case "pickup": - case "plant": - case "defuse": - case "kill_confirmed": - case "kill_denied": - case "tags_retrieved": - case "team_assist": - case "kill_bonus": - case "kill_carrier": - case "draft_rogue": - case "survivor": - case "final_rogue": - case "gained_gun_rank": - case "dropped_enemy_gun_rank": - case "got_juggernaut": - case "kill_as_juggernaut": - case "kill_juggernaut": - case "jugg_on_jugg": - self.pers["summary"]["score"] = self.pers["summary"]["score"] + var_1; - self.pers["summary"]["xp"] = self.pers["summary"]["xp"] + var_1; - break; - case "win": - case "loss": - case "tie": - self.pers["summary"]["match"] = self.pers["summary"]["match"] + var_1; - self.pers["summary"]["xp"] = self.pers["summary"]["xp"] + var_1; - break; - case "challenge": - self.pers["summary"]["challenge"] = self.pers["summary"]["challenge"] + var_1; - self.pers["summary"]["xp"] = self.pers["summary"]["xp"] + var_1; - break; - default: - self.pers["summary"]["misc"] = self.pers["summary"]["misc"] + var_1; - self.pers["summary"]["xp"] = self.pers["summary"]["xp"] + var_1; - break; - } -} - -weaponShouldGetXP( var_0, var_1 ) -{ - if ( self isitemunlocked( "cac" ) && !maps\mp\_utility::isJuggernaut() && isdefined( var_0 ) && isdefined( var_1 ) && !maps\mp\_utility::isKillstreakWeapon( var_0 ) ) - { - if ( maps\mp\_utility::isBulletDamage( var_1 ) ) - return 1; - - if ( isexplosivedamagemod( var_1 ) || var_1 == "MOD_IMPACT" ) - { - if ( maps\mp\_utility::getWeaponClass( var_0 ) == "weapon_projectile" || maps\mp\_utility::getWeaponClass( var_0 ) == "weapon_assault" ) - return 1; - } - - if ( var_1 == "MOD_MELEE" ) - { - if ( maps\mp\_utility::getWeaponClass( var_0 ) == "weapon_riot" ) - return 1; - } - } - - return 0; -} - -updateRank( var_0 ) -{ - var_1 = getRank(); - - if ( var_1 == self.pers["rank"] ) - return 0; - - var_2 = self.pers["rank"]; - self.pers["rank"] = var_1; - self setrank( var_1 ); - return 1; -} - -updateWeaponRank( var_0, var_1 ) -{ - var_2 = getWeaponRank( var_1 ); - - if ( var_2 == self getplayerdata( "weaponRank", var_1 ) ) - return 0; - - self.pers["weaponRank"] = var_2; - self setplayerdata( "weaponRank", var_1, var_2 ); - thread maps\mp\gametypes\_missions::masteryChallengeProcess( var_1 ); - return 1; -} - -updateRankAnnounceHUD() -{ - self endon( "disconnect" ); - self notify( "update_rank" ); - self endon( "update_rank" ); - var_0 = self.pers["team"]; - - if ( !isdefined( var_0 ) ) - return; - - if ( !maps\mp\_utility::levelFlag( "game_over" ) ) - level common_scripts\utility::waittill_notify_or_timeout( "game_over", 0.25 ); - - var_1 = getRankInfoFull( self.pers["rank"] ); - var_2 = level.rankTable[self.pers["rank"]][1]; - var_3 = int( var_2[var_2.size - 1] ); - thread maps\mp\gametypes\_hud_message::promotionSplashNotify(); - - if ( var_3 > 1 ) - return; - - for ( var_4 = 0; var_4 < level.players.size; var_4++ ) - { - var_5 = level.players[var_4]; - var_6 = var_5.pers["team"]; - - if ( isdefined( var_6 ) && var_5 != self ) - { - if ( var_6 == var_0 ) - var_5 iprintln( &"RANK_PLAYER_WAS_PROMOTED", self, var_1 ); - } - } -} - -updateWeaponRankAnnounceHUD() -{ - self endon( "disconnect" ); - self notify( "update_weapon_rank" ); - self endon( "update_weapon_rank" ); - var_0 = self.pers["team"]; - - if ( !isdefined( var_0 ) ) - return; - - if ( !maps\mp\_utility::levelFlag( "game_over" ) ) - level common_scripts\utility::waittill_notify_or_timeout( "game_over", 0.25 ); - - thread maps\mp\gametypes\_hud_message::weaponPromotionSplashNotify(); -} - -endGameUpdate() -{ - var_0 = self; -} - -createXpPointsPopup() -{ - var_0 = newclienthudelem( self ); - var_0.horzalign = "center"; - var_0.vertalign = "middle"; - var_0.alignx = "center"; - var_0.aligny = "middle"; - var_0.x = 30; - - if ( level.splitscreen ) - var_0.y = -30; - else - var_0.y = -50; - - var_0.font = "hudbig"; - var_0.fontScale = 0.65; - var_0.archived = 0; - var_0.color = ( 0.5, 0.5, 0.5 ); - var_0.sort = 10000; - var_0 maps\mp\gametypes\_hud::fontPulseInit( 3.0 ); - return var_0; -} - -xpPointsPopup( var_0, var_1, var_2, var_3 ) -{ - self endon( "disconnect" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - - if ( var_0 == 0 ) - return; - - self notify( "xpPointsPopup" ); - self endon( "xpPointsPopup" ); - self.xpUpdateTotal = self.xpUpdateTotal + var_0; - self.bonusUpdateTotal = self.bonusUpdateTotal + var_1; - wait 0.05; - - if ( self.xpUpdateTotal < 0 ) - self.hud_xpPointsPopup.label = &""; - else - self.hud_xpPointsPopup.label = &"MP_PLUS"; - - self.hud_xpPointsPopup.color = var_2; - self.hud_xpPointsPopup.glowcolor = var_2; - self.hud_xpPointsPopup.glowalpha = var_3; - self.hud_xpPointsPopup setvalue( self.xpUpdateTotal ); - self.hud_xpPointsPopup.alpha = 0.85; - self.hud_xpPointsPopup thread maps\mp\gametypes\_hud::fontPulse( self ); - var_4 = max( int( self.bonusUpdateTotal / 20 ), 1 ); - - if ( self.bonusUpdateTotal ) - { - while ( self.bonusUpdateTotal > 0 ) - { - self.xpUpdateTotal = self.xpUpdateTotal + min( self.bonusUpdateTotal, var_4 ); - self.bonusUpdateTotal = self.bonusUpdateTotal - min( self.bonusUpdateTotal, var_4 ); - self.hud_xpPointsPopup setvalue( self.xpUpdateTotal ); - wait 0.05; - } - } - else - wait 1.0; - - self.hud_xpPointsPopup fadeovertime( 0.75 ); - self.hud_xpPointsPopup.alpha = 0; - self.xpUpdateTotal = 0; -} - -createXpEventPopup() -{ - var_0 = newclienthudelem( self ); - var_0.children = []; - var_0.horzalign = "center"; - var_0.vertalign = "middle"; - var_0.alignx = "center"; - var_0.aligny = "middle"; - var_0.x = 55; - - if ( level.splitscreen ) - var_0.y = -20; - else - var_0.y = -35; - - var_0.font = "hudbig"; - var_0.fontScale = 0.65; - var_0.archived = 0; - var_0.color = ( 0.5, 0.5, 0.5 ); - var_0.sort = 10000; - var_0.elemType = "msgText"; - var_0 maps\mp\gametypes\_hud::fontPulseInit( 3.0 ); - return var_0; -} - -xpeventpopupfinalize( var_0, var_1, var_2 ) -{ - self endon( "disconnect" ); - self endon( "joined_team" ); - self endon( "joined_spectators" ); - self notify( "xpEventPopup" ); - self endon( "xpEventPopup" ); - - if ( level.hardcoreMode ) - return; - - wait 0.05; - - if ( !isdefined( var_1 ) ) - var_1 = ( 1, 1, 0.5 ); - - if ( !isdefined( var_2 ) ) - var_2 = 0; - - if ( !isdefined( self ) ) - return; - - self.hud_xpEventPopup.color = var_1; - self.hud_xpEventPopup.glowcolor = var_1; - self.hud_xpEventPopup.glowalpha = var_2; - self.hud_xpEventPopup settext( var_0 ); - self.hud_xpEventPopup.alpha = 0.85; - wait 1.0; - - if ( !isdefined( self ) ) - return; - - self.hud_xpEventPopup fadeovertime( 0.75 ); - self.hud_xpEventPopup.alpha = 0; - self notify( "PopComplete" ); -} - -xpeventpopupterminate() -{ - self endon( "PopComplete" ); - common_scripts\utility::waittill_any( "joined_team", "joined_spectators" ); - self.hud_xpEventPopup fadeovertime( 0.05 ); - self.hud_xpEventPopup.alpha = 0; -} - -xpEventPopup( var_0, var_1, var_2 ) -{ - thread xpeventpopupfinalize( var_0, var_1, var_2 ); - thread xpeventpopupterminate(); -} - -removeRankHUD() -{ - self.hud_xpPointsPopup.alpha = 0; -} - -getRank() -{ - var_0 = self.pers["rankxp"]; - var_1 = self.pers["rank"]; - - if ( var_0 < getRankInfoMinXP( var_1 ) + getRankInfoXPAmt( var_1 ) ) - return var_1; - else - return getRankForXp( var_0 ); -} - -getWeaponRank( var_0 ) -{ - var_1 = self getplayerdata( "weaponXP", var_0 ); - return getWeaponRankForXp( var_1, var_0 ); -} - -levelForExperience( var_0 ) -{ - return getRankForXp( var_0 ); -} - -weaponLevelForExperience( var_0 ) -{ - return getWeaponRankForXp( var_0 ); -} - -getCurrentWeaponXP() -{ - var_0 = self getcurrentweapon(); - - if ( isdefined( var_0 ) ) - return self getplayerdata( "weaponXP", var_0 ); - - return 0; -} - -getRankForXp( var_0 ) -{ - var_1 = 0; - var_2 = level.rankTable[var_1][1]; - - while ( isdefined( var_2 ) && var_2 != "" ) - { - if ( var_0 < getRankInfoMinXP( var_1 ) + getRankInfoXPAmt( var_1 ) ) - return var_1; - - var_1++; - - if ( isdefined( level.rankTable[var_1] ) ) - { - var_2 = level.rankTable[var_1][1]; - continue; - } - - var_2 = undefined; - } - - var_1--; - return var_1; -} - -getWeaponRankForXp( var_0, var_1 ) -{ - if ( !isdefined( var_0 ) ) - var_0 = 0; - - var_2 = tablelookup( "mp/statstable.csv", 4, var_1, 2 ); - var_3 = int( tablelookup( "mp/weaponRankTable.csv", 0, var_2, 1 ) ); - - for ( var_4 = 0; var_4 < var_3 + 1; var_4++ ) - { - if ( var_0 < getWeaponRankInfoMinXP( var_4 ) + getWeaponRankInfoXPAmt( var_4 ) ) - return var_4; - } - - return var_4 - 1; -} - -getSPM() -{ - var_0 = getRank() + 1; - return ( 3 + var_0 * 0.5 ) * 10; -} - -getPrestigeLevel() -{ - return maps\mp\gametypes\_persistence::statGet( "prestige" ); -} - -getRankXP() -{ - return self.pers["rankxp"]; -} - -getWeaponRankXP( var_0 ) -{ - return self getplayerdata( "weaponXP", var_0 ); -} - -getWeaponMaxRankXP( var_0 ) -{ - var_1 = tablelookup( "mp/statstable.csv", 4, var_0, 2 ); - var_2 = int( tablelookup( "mp/weaponRankTable.csv", 0, var_1, 1 ) ); - var_3 = getWeaponRankInfoMaxXp( var_2 ); - return var_3; -} - -isWeaponMaxRank( var_0 ) -{ - var_1 = self getplayerdata( "weaponXP", var_0 ); - var_2 = getWeaponMaxRankXP( var_0 ); - return var_1 >= var_2; -} - -incRankXP( var_0 ) -{ - if ( !maps\mp\_utility::rankingEnabled() ) - return; - - if ( isdefined( self.isCheater ) ) - return; - - var_1 = getRankXP(); - var_2 = int( min( var_1, getRankInfoMaxXp( level.maxRank ) ) ) + var_0; - - if ( self.pers["rank"] == level.maxRank && var_2 >= getRankInfoMaxXp( level.maxRank ) ) - var_2 = getRankInfoMaxXp( level.maxRank ); - - self.pers["rankxp"] = var_2; -} - -getRestXPAward( var_0 ) -{ - if ( !getdvarint( "scr_restxp_enable" ) ) - return 0; - - var_1 = getdvarfloat( "scr_restxp_restedAwardScale" ); - var_2 = int( var_0 * var_1 ); - var_3 = self getplayerdata( "restXPGoal" ) - getRankXP(); - - if ( var_3 <= 0 ) - return 0; - - return var_2; -} - -isLastRestXPAward( var_0 ) -{ - if ( !getdvarint( "scr_restxp_enable" ) ) - return 0; - - var_1 = getdvarfloat( "scr_restxp_restedAwardScale" ); - var_2 = int( var_0 * var_1 ); - var_3 = self getplayerdata( "restXPGoal" ) - getRankXP(); - - if ( var_3 <= 0 ) - return 0; - - if ( var_2 >= var_3 ) - return 1; - - return 0; -} - -syncXPStat() -{ - var_0 = getRankXP(); - maps\mp\gametypes\_persistence::statSet( "experience", var_0 ); -} diff --git a/raw/maps/mp/gametypes/_spawnlogic.gsc b/raw/maps/mp/gametypes/_spawnlogic.gsc deleted file mode 100644 index 83f2333..0000000 --- a/raw/maps/mp/gametypes/_spawnlogic.gsc +++ /dev/null @@ -1,1486 +0,0 @@ -// IW5 PC GSC -// Decompiled by https://github.com/xensik/gsc-tool - -findBoxCenter( var_0, var_1 ) -{ - var_2 = ( 0, 0, 0 ); - var_2 = var_1 - var_0; - var_2 = ( var_2[0] / 2, var_2[1] / 2, var_2[2] / 2 ) + var_0; - return var_2; -} - -expandMins( var_0, var_1 ) -{ - if ( var_0[0] > var_1[0] ) - var_0 = ( var_1[0], var_0[1], var_0[2] ); - - if ( var_0[1] > var_1[1] ) - var_0 = ( var_0[0], var_1[1], var_0[2] ); - - if ( var_0[2] > var_1[2] ) - var_0 = ( var_0[0], var_0[1], var_1[2] ); - - return var_0; -} - -expandMaxs( var_0, var_1 ) -{ - if ( var_0[0] < var_1[0] ) - var_0 = ( var_1[0], var_0[1], var_0[2] ); - - if ( var_0[1] < var_1[1] ) - var_0 = ( var_0[0], var_1[1], var_0[2] ); - - if ( var_0[2] < var_1[2] ) - var_0 = ( var_0[0], var_0[1], var_1[2] ); - - return var_0; -} - -addSpawnPoints( var_0, var_1, var_2 ) -{ - if ( !isdefined( var_2 ) ) - var_2 = 0; - - var_3 = []; - - if ( level.teamSpawnPoints[var_0].size ) - var_3 = level.teamSpawnPoints[var_0]; - - level.teamSpawnPoints[var_0] = getSpawnpointArray( var_1 ); - - if ( !level.teamSpawnPoints[var_0].size && !var_2 ) - { - maps\mp\gametypes\_callbacksetup::AbortLevel(); - wait 1; - return; - } - - if ( !isdefined( level.spawnpoints ) ) - level.spawnpoints = []; - - for ( var_4 = 0; var_4 < level.teamSpawnPoints[var_0].size; var_4++ ) - { - var_5 = level.teamSpawnPoints[var_0][var_4]; - - if ( !isdefined( var_5.inited ) ) - { - var_5 spawnPointInit(); - level.spawnpoints[level.spawnpoints.size] = var_5; - } - } - - for ( var_4 = 0; var_4 < var_3.size; var_4++ ) - { - var_6 = var_3[var_4].origin; - level.spawnMins = expandMins( level.spawnMins, var_6 ); - level.spawnMaxs = expandMaxs( level.spawnMaxs, var_6 ); - level.teamSpawnPoints[var_0][level.teamSpawnPoints[var_0].size] = var_3[var_4]; - } -} - -placeSpawnPoints( var_0 ) -{ - var_1 = getSpawnpointArray( var_0 ); - - if ( !var_1.size ) - { - maps\mp\gametypes\_callbacksetup::AbortLevel(); - wait 1; - return; - } - - if ( !isdefined( level.startSpawnPoints ) ) - level.startSpawnPoints = []; - - for ( var_2 = 0; var_2 < var_1.size; var_2++ ) - { - var_1[var_2] spawnPointInit(); - level.startSpawnPoints[level.startSpawnPoints.size] = var_1[var_2]; - } -} - -getSpawnpointArray( var_0 ) -{ - var_1 = getentarray( var_0, "classname" ); - - if ( !isdefined( level.extraspawnpoints ) || !isdefined( level.extraspawnpoints[var_0] ) ) - return var_1; - - for ( var_2 = 0; var_2 < level.extraspawnpoints[var_0].size; var_2++ ) - var_1[var_1.size] = level.extraspawnpoints[var_0][var_2]; - - return var_1; -} - -expandSpawnpointBounds( var_0 ) -{ - var_1 = getSpawnpointArray( var_0 ); - - for ( var_2 = 0; var_2 < var_1.size; var_2++ ) - { - level.spawnMins = expandMins( level.spawnMins, var_1[var_2].origin ); - level.spawnMaxs = expandMaxs( level.spawnMaxs, var_1[var_2].origin ); - } -} - -setMapCenterForReflections() -{ - level.spawnMins = ( 0, 0, 0 ); - level.spawnMaxs = ( 0, 0, 0 ); - expandSpawnpointBounds( "mp_tdm_spawn_allies_start" ); - expandSpawnpointBounds( "mp_tdm_spawn_axis_start" ); - level.mapCenter = findBoxCenter( level.spawnMins, level.spawnMaxs ); - setmapcenter( level.mapCenter ); -} - -spawnPointInit() -{ - var_0 = self; - var_1 = var_0.origin; - level.spawnMins = expandMins( level.spawnMins, var_1 ); - level.spawnMaxs = expandMaxs( level.spawnMaxs, var_1 ); - var_0 placespawnpoint(); - var_0.forward = anglestoforward( var_0.angles ); - var_0.sightTracePoint = var_0.origin + ( 0, 0, 50 ); - var_0.lastspawnedplayer = var_0; - var_0.lastspawntime = gettime(); - var_2 = 1024; - var_0.outside = 1; - - if ( !bullettracepassed( var_0.sightTracePoint, var_0.sightTracePoint + ( 0, 0, var_2 ), 0, undefined ) ) - { - var_3 = var_0.sightTracePoint + var_0.forward * 100; - - if ( !bullettracepassed( var_3, var_3 + ( 0, 0, var_2 ), 0, undefined ) ) - var_0.outside = 0; - } - - var_4 = anglestoright( var_0.angles ); - var_0.alternates = []; - AddAlternateSpawnpoint( var_0, var_0.origin + var_4 * 45 ); - AddAlternateSpawnpoint( var_0, var_0.origin - var_4 * 45 ); - spawnPointUpdate( var_0 ); - var_0.inited = 1; -} - -AddAlternateSpawnpoint( var_0, var_1 ) -{ - var_2 = playerphysicstrace( var_0.origin, var_0.origin + ( 0, 0, 18 ), 0, undefined ); - var_3 = var_2[2] - var_0.origin[2]; - var_4 = ( var_1[0], var_1[1], var_1[2] + var_3 ); - var_5 = playerphysicstrace( var_2, var_4, 0, undefined ); - - if ( var_5 != var_4 ) - return; - - var_6 = playerphysicstrace( var_4, var_1 ); - var_0.alternates[var_0.alternates.size] = var_6; -} - -getTeamSpawnPoints( var_0 ) -{ - return level.teamSpawnPoints[var_0]; -} - -getSpawnpoint_Final( var_0, var_1 ) -{ - var_2 = undefined; - - if ( !isdefined( var_0 ) || var_0.size == 0 ) - return undefined; - - if ( !isdefined( var_1 ) ) - var_1 = 1; - - if ( var_1 ) - var_2 = getBestWeightedSpawnpoint( var_0 ); - else - { - var_3 = getentarray( "care_package", "targetname" ); - - for ( var_4 = 0; var_4 < var_0.size; var_4++ ) - { - if ( isdefined( self.lastspawnpoint ) && self.lastspawnpoint == var_0[var_4] ) - continue; - - if ( positionwouldtelefrag( var_0[var_4].origin ) ) - continue; - - if ( var_3.size && !canspawn( var_0[var_4].origin ) ) - continue; - - var_2 = var_0[var_4]; - break; - } - - if ( !isdefined( var_2 ) ) - { - if ( isdefined( self.lastspawnpoint ) && !positionwouldtelefrag( self.lastspawnpoint.origin ) ) - { - for ( var_4 = 0; var_4 < var_0.size; var_4++ ) - { - if ( var_0[var_4] == self.lastspawnpoint ) - { - var_2 = var_0[var_4]; - break; - } - } - } - } - } - - if ( !isdefined( var_2 ) ) - { - if ( var_1 ) - var_2 = var_0[randomint( var_0.size )]; - else - var_2 = var_0[0]; - } - - return var_2; -} - -finalizeSpawnpointChoice( var_0 ) -{ - var_1 = gettime(); - self.lastspawnpoint = var_0; - self.lastspawntime = var_1; - var_0.lastspawnedplayer = self; - var_0.lastspawntime = var_1; -} - -getBestWeightedSpawnpoint( var_0 ) -{ - var_1 = maps\mp\_utility::getOtherTeam( self.team ); - var_2 = 0; - - for (;;) - { - var_3 = []; - var_3[0] = var_0[0]; - var_4 = var_0[0].weight; - - for ( var_5 = 1; var_5 < var_0.size; var_5++ ) - { - var_6 = var_0[var_5]; - - if ( var_6.weight > var_4 ) - { - var_3 = []; - var_3[0] = var_6; - var_4 = var_6.weight; - continue; - } - - if ( var_6.weight == var_4 ) - var_3[var_3.size] = var_6; - } - - var_7 = var_3[randomint( var_3.size )]; - - if ( var_2 >= 3 ) - return var_7; - - var_8 = 0; - - if ( level.teamBased ) - var_8 = var_7.sights[var_1]; - else - var_8 = var_7.sights; - - if ( var_8 > 0 ) - return var_7; - - if ( isdefined( var_7.lastSightTraceTime ) && var_7.lastSightTraceTime == gettime() ) - return var_7; - - var_9 = lastMinuteSightTraces( var_7 ); - - if ( var_9 == 0 ) - return var_7; - - var_9 = adjustSightValue( var_9 ); - - if ( level.teamBased ) - var_7.sights[var_1] = var_7.sights[var_1] + var_9; - else - var_7.sights = var_7.sights + var_9; - - var_10 = getLosPenalty() * var_9; - var_7.weight = var_7.weight - var_10; - var_7.lastSightTraceTime = gettime(); - var_2++; - } -} - -getSpawnpoint_Random( var_0 ) -{ - if ( !isdefined( var_0 ) ) - return undefined; - - for ( var_1 = 0; var_1 < var_0.size; var_1++ ) - { - var_2 = randomint( var_0.size ); - var_3 = var_0[var_1]; - var_0[var_1] = var_0[var_2]; - var_0[var_2] = var_3; - } - - if ( isdefined( self.predictedSpawnPoint ) ) - { - for ( var_1 = 1; var_1 < var_0.size; var_1++ ) - { - if ( var_0[var_1] == self.predictedSpawnPoint ) - { - var_4 = var_0[0]; - var_0[0] = var_0[var_1]; - var_0[var_1] = var_4; - break; - } - } - } - - return getSpawnpoint_Final( var_0, 0 ); -} - -getAllOtherPlayers() -{ - var_0 = []; - - for ( var_1 = 0; var_1 < level.players.size; var_1++ ) - { - if ( !isdefined( level.players[var_1] ) ) - continue; - - var_2 = level.players[var_1]; - - if ( var_2.sessionstate == "spectating" || var_2 == self ) - continue; - - var_0[var_0.size] = var_2; - } - - return var_0; -} - -initWeights( var_0 ) -{ - for ( var_1 = 0; var_1 < var_0.size; var_1++ ) - var_0[var_1].weight = 0; -} - -getSpawnpoint_NearTeam( var_0, var_1 ) -{ - if ( !isdefined( var_0 ) ) - return undefined; - - Spawnlogic_Begin(); - initWeights( var_0 ); - var_2 = 2; - var_3 = self.team; - var_4 = maps\mp\_utility::getOtherTeam( var_3 ); - var_5 = getentarray( "care_package", "targetname" ); - - foreach ( var_7 in var_0 ) - { - if ( var_7.numPlayersAtLastUpdate > 0 ) - { - var_8 = var_7.weightedDistSum[var_3]; - var_9 = var_7.distSum[var_4]; - var_7.weight = ( var_9 - var_2 * var_8 ) / var_7.numPlayersAtLastUpdate; - - if ( isdefined( level.favorCloseSpawnEnt ) ) - { - if ( !isdefined( level.favorCloseSpawnScalar ) ) - level.favorCloseSpawnScalar = 1; - - var_10 = distance( var_7.origin, level.favorCloseSpawnEnt.origin ); - var_7.weight = var_7.weight - var_10 * level.favorCloseSpawnScalar; - } - - if ( isdefined( level.favorclosespawnentattacker ) ) - { - if ( !isdefined( level.favorclosespawnscalarattacker ) ) - level.favorclosespawnscalarattacker = 1; - - var_10 = distance( var_7.origin, level.favorclosespawnentattacker.origin ); - var_7.weight = var_7.weight - var_10 * level.favorclosespawnscalarattacker; - } - - if ( isdefined( level.favorclosespawnentdefender ) ) - { - if ( !isdefined( level.favorclosespawnscalardefender ) ) - level.favorclosespawnscalardefender = 1; - - var_10 = distance( var_7.origin, level.favorclosespawnentdefender.origin ); - var_7.weight = var_7.weight - var_10 * level.favorclosespawnscalardefender; - } - } - else - var_7.weight = 0; - - if ( var_5.size && !canspawn( var_7.origin ) ) - var_7.weight = var_7.weight - 500000; - } - - favor_weight = getDVarInt("scr_spawnpointfavorweight"); - if (favor_weight == 0) - favor_weight = 50000; - - if ( isdefined( var_1 ) ) - { - for ( var_12 = 0; var_12 < var_1.size; var_12++ ) - var_1[var_12].weight = var_1[var_12].weight + favor_weight; - } - - if ( isdefined( self.predictedSpawnPoint ) && isdefined( self.predictedSpawnPoint.weight ) ) - self.predictedSpawnPoint.weight = self.predictedSpawnPoint.weight + 100; - - avoidSameSpawn(); - avoidWeaponDamage( var_0 ); - avoidVisibleEnemies( var_0, 1 ); - - if ( isdefined( self.lastDeathPos ) && level.gameType != "dom" ) - avoidRevengeSpawn( var_0, self.lastDeathPos ); - - var_13 = getSpawnpoint_Final( var_0 ); - return var_13; -} - -getSpawnpoint_SafeSpawn( var_0 ) -{ - if ( !isdefined( var_0 ) ) - return undefined; - - Spawnlogic_Begin(); - var_1 = undefined; - var_2 = undefined; - var_3 = maps\mp\_utility::getOtherTeam( self.team ); - - if ( !level.teamBased ) - var_3 = "all"; - - var_4 = 250000; - - foreach ( var_6 in var_0 ) - { - var_7 = var_6.minDist[var_3]; - - foreach ( var_9 in level.grenades ) - { - if ( !isdefined( var_9 ) ) - continue; - - if ( distancesquared( var_6.origin, var_9.origin ) < var_4 ) - { - var_10 = distance( var_6.origin, var_9.origin ) - 220; - - if ( var_10 < var_7 ) - { - if ( var_10 < 0 ) - var_10 = 0; - - var_7 = var_10; - } - } - } - - if ( positionwouldtelefrag( var_6.origin ) ) - var_7 -= 200; - - if ( isdefined( level.artilleryDangerCenters ) ) - { - var_12 = maps\mp\killstreaks\_airstrike::getAirstrikeDanger( var_6.origin ); - - if ( var_12 > 0 ) - var_7 = 0; - } - - if ( level.teamBased ) - { - if ( var_6.sights[var_3] > 0 ) - var_7 = 0; - } - else if ( var_6.sights > 0 ) - var_7 = 0; - - if ( !isdefined( var_1 ) || var_7 > var_2 ) - { - var_1 = var_6; - var_2 = var_7; - } - } - - if ( !isdefined( var_1 ) ) - { - var_1 = var_0[randomint( var_0.size )]; - var_1.safeSpawnDangerDist = 500; - } - else - var_1.safeSpawnDangerDist = var_2; - - return var_1; -} - -getSpawnpoint_DM( var_0 ) -{ - self.bestspawnpoint = undefined; - - if ( !isdefined( var_0 ) ) - return undefined; - - Spawnlogic_Begin(); - initWeights( var_0 ); - var_1 = getAllOtherPlayers(); - var_2 = 1600; - var_3 = 1200; - - if ( var_1.size > 0 ) - { - for ( var_4 = 0; var_4 < var_0.size; var_4++ ) - { - var_5 = 0; - var_6 = 0; - - for ( var_7 = 0; var_7 < var_1.size; var_7++ ) - { - if ( var_1[var_7].sessionstate == "dead" && isdefined( var_1[var_7].bestspawnpoint ) ) - var_8 = distance( var_0[var_4].origin, var_1[var_7].bestspawnpoint.origin ); - else - var_8 = distance( var_0[var_4].origin, var_1[var_7].origin ); - - if ( var_8 < var_3 ) - var_6 += ( var_3 - var_8 ) / var_3; - - var_9 = abs( var_8 - var_2 ); - var_5 += var_9; - } - - var_10 = var_5 / var_1.size; - var_11 = ( var_2 - var_10 ) / var_2; - var_0[var_4].weight = var_11 - var_6 * 2 + randomfloat( 0.2 ); - } - } - - var_12 = getentarray( "care_package", "targetname" ); - - for ( var_4 = 0; var_4 < var_0.size; var_4++ ) - { - if ( var_12.size && !canspawn( var_0[var_4].origin ) ) - var_0[var_4].weight = var_0[var_4].weight - 500000; - } - - if ( isdefined( self.predictedSpawnPoint ) && isdefined( self.predictedSpawnPoint.weight ) ) - self.predictedSpawnPoint.weight = self.predictedSpawnPoint.weight + 100; - - avoidSameSpawn(); - avoidWeaponDamage( var_0 ); - avoidVisibleEnemies( var_0, 0 ); - return getspawnpoint_final_dm( var_0 ); -} - -getspawnpoint_final_dm( var_0 ) -{ - var_1 = undefined; - - if ( !isdefined( var_0 ) || var_0.size == 0 ) - return undefined; - - var_1 = getBestWeightedSpawnpoint( var_0 ); - - if ( !isdefined( var_1 ) ) - var_1 = var_0[randomint( var_0.size )]; - - self.bestspawnpoint = var_1; - return var_1; -} - -Spawnlogic_Begin() -{ - -} - -init() -{ - SetupKillstreakSpawnShield(); - level.spawnlogic_deaths = []; - level.spawnlogic_spawnkills = []; - level.players = []; - level.grenades = []; - level.pipebombs = []; - level.turrets = []; - level.helis = []; - level.tanks = []; - level.scramblers = []; - level.ims = []; - level.ugvs = []; - level.teamSpawnPoints["axis"] = []; - level.teamSpawnPoints["allies"] = []; - level thread trackGrenades(); - level thread trackMissiles(); - level.spawnMins = ( 0, 0, 0 ); - level.spawnMaxs = ( 0, 0, 0 ); - - if ( isdefined( level.safespawns ) ) - { - for ( var_0 = 0; var_0 < level.safespawns.size; var_0++ ) - level.safespawns[var_0] spawnPointInit(); - } -} - -sightCheckCost() -{ - var_0 = 30; - - for (;;) - { - var_1 = getdvar( "scr_debugcost" ); - - if ( var_1 == "bullet" && isdefined( level.players[0] ) ) - { - for ( var_2 = 0; var_2 < var_0; var_2++ ) - bullettracepassed( level.players[0].origin + ( 0, 0, 50 ), ( 0, 0, 0 ), 0, undefined ); - } - else if ( var_1 == "damagecone" && isdefined( level.players[0] ) ) - { - for ( var_2 = 0; var_2 < var_0; var_2++ ) - level.players[0] damageconetrace( ( 0, 0, 0 ) ); - } - else if ( var_1 == "sightcone" && isdefined( level.players[0] ) ) - { - for ( var_2 = 0; var_2 < var_0; var_2++ ) - level.players[0] sightconetrace( ( 0, 0, 0 ) ); - } - else - wait 1.0; - - wait 0.05; - } -} - -watchSpawnProfile() -{ - for (;;) - { - while ( getdvar( "scr_spawnprofile" ) == "" || getdvar( "scr_spawnprofile" ) == "0" ) - wait 0.05; - - thread spawnProfile(); - - while ( getdvar( "scr_spawnprofile" ) != "" && getdvar( "scr_spawnprofile" ) != "0" ) - wait 0.05; - - level notify( "stop_spawn_profile" ); - } -} - -spawnProfile() -{ - level endon( "stop_spawn_profile" ); - var_0 = spawnstruct(); - - for (;;) - { - var_1 = getdvar( "scr_spawnprofile" ); - - if ( var_1 != "allies" && var_1 != "axis" ) - { - if ( common_scripts\utility::cointoss() ) - var_1 = "allies"; - else - var_1 = "axis"; - } - - var_0.team = var_1; - var_0.pers["team"] = var_1; - var_0 getSpawnpoint_NearTeam( level.spawnpoints ); - wait 0.05; - } -} - -spawnGraphCheck() -{ - for (;;) - { - if ( getdvarint( "scr_spawngraph" ) < 1 ) - { - wait 3; - continue; - } - - thread spawnGraph(); - - while ( getdvarint( "scr_spawngraph" ) >= 1 ) - { - wait 0.2; - continue; - } - - level notify( "end_spawn_graph" ); - level notify( "spawn_graph_stop_draw" ); - } -} - -spawnGraph() -{ - level endon( "end_spawn_graph" ); - var_0 = 20; - var_1 = 20; - var_2 = 0.1; - var_3 = []; - var_4 = getentarray( "minimap_corner", "targetname" ); - - if ( var_4.size != 2 ) - return; - - var_5 = var_4[0].origin; - var_6 = var_4[0].origin; - - if ( var_4[1].origin[0] > var_6[0] ) - var_6 = ( var_4[1].origin[0], var_6[1], var_6[2] ); - else - var_5 = ( var_4[1].origin[0], var_5[1], var_5[2] ); - - if ( var_4[1].origin[1] > var_6[1] ) - var_6 = ( var_6[0], var_4[1].origin[1], var_6[2] ); - else - var_5 = ( var_5[0], var_4[1].origin[1], var_5[2] ); - - var_7 = 0; - - for ( var_8 = 0; var_8 < var_1; var_8++ ) - { - var_9 = var_8 / ( var_1 - 1 ); - - for ( var_10 = 0; var_10 < var_0; var_10++ ) - { - var_11 = var_10 / ( var_0 - 1 ); - var_3[var_7] = spawnstruct(); - var_3[var_7].origin = ( var_5[0] * var_11 + var_6[0] * ( 1 - var_11 ), var_5[1] * var_9 + var_6[1] * ( 1 - var_9 ), var_5[2] ); - var_3[var_7].angles = ( 0, 0, 0 ); - var_3[var_7].forward = anglestoforward( var_3[var_7].angles ); - var_3[var_7].sightTracePoint = var_3[var_7].origin; - var_3[var_7].outside = 1; - var_3[var_7].secondfloor = 0; - var_3[var_7].fake = 1; - var_7++; - } - } - - var_12 = 0; - - for (;;) - { - var_13 = 0; - var_14 = 10; - - for ( var_7 = 0; var_7 < var_14; var_7++ ) - { - if ( !level.players.size || !isdefined( level.players[0].team ) || level.players[0].team == "spectator" || !isdefined( level.players[0].class ) ) - break; - - var_15 = var_13 + var_3.size / var_14; - - if ( var_7 == var_14 - 1 ) - var_15 = var_3.size; - - while ( var_13 < var_15 ) - { - spawnPointUpdate( var_3[var_13] ); - var_13++; - } - - wait 0.05; - } - - if ( !level.players.size || !isdefined( level.players[0].team ) || level.players[0].team == "spectator" || !isdefined( level.players[0].class ) ) - { - wait 1; - continue; - } - - level.players[0] getSpawnpoint_NearTeam( var_3 ); - - for ( var_7 = 0; var_7 < var_3.size; var_7++ ) - setupSpawnGraphPoint( var_3[var_7], var_2 ); - - var_12 = 1; - level.players[0] drawSpawnGraph( var_3, var_0, var_1, var_2 ); - wait 0.05; - } -} - -drawSpawnGraph( var_0, var_1, var_2, var_3 ) -{ - level notify( "spawn_graph_stop_draw" ); - var_4 = 0; - - for ( var_5 = 0; var_5 < var_2; var_5++ ) - { - var_6 = var_5 / ( var_2 - 1 ); - - for ( var_7 = 0; var_7 < var_1; var_7++ ) - { - var_8 = var_7 / ( var_1 - 1 ); - - if ( var_5 > 0 ) - thread spawnGraphLine( var_0[var_4], var_0[var_4 - var_1], var_3 ); - - if ( var_7 > 0 ) - thread spawnGraphLine( var_0[var_4], var_0[var_4 - 1], var_3 ); - - var_4++; - } - } -} - -setupSpawnGraphPoint( var_0, var_1 ) -{ - var_0.visible = 1; - - if ( var_0.weight < -1000 / var_1 ) - var_0.visible = 0; -} - -spawnGraphLine( var_0, var_1, var_2 ) -{ - if ( !var_0.visible || !var_1.visible ) - return; - - var_3 = var_0.origin + ( 0, 0, var_0.weight * var_2 + 100 ); - var_4 = var_1.origin + ( 0, 0, var_1.weight * var_2 + 100 ); - level endon( "spawn_graph_stop_draw" ); - - for (;;) - { - wait 0.05; - waittillframeend; - } -} - -loopbotspawns() -{ - for (;;) - { - if ( getdvarint( "scr_killbots" ) < 1 ) - { - wait 3; - continue; - } - - if ( !isdefined( level.players ) ) - { - wait 0.05; - continue; - } - - var_0 = []; - - for ( var_1 = 0; var_1 < level.players.size; var_1++ ) - { - if ( !isdefined( level.players[var_1] ) ) - continue; - - if ( level.players[var_1].sessionstate == "playing" && issubstr( level.players[var_1].name, "bot" ) ) - var_0[var_0.size] = level.players[var_1]; - } - - if ( var_0.size > 0 ) - { - if ( getdvarint( "scr_killbots" ) == 1 ) - { - var_2 = var_0[randomint( var_0.size )]; - var_3 = var_0[randomint( var_0.size )]; - var_3 thread [[ level.callbackPlayerDamage ]]( var_2, var_2, 1000, 0, "MOD_RIFLE_BULLET", "none", ( 0, 0, 0 ), ( 0, 0, 0 ), "none", 0 ); - } - else - { - var_4 = getdvarint( "scr_killbots" ); - var_5 = undefined; - - for ( var_6 = 0; var_6 < var_4; var_6++ ) - { - var_2 = var_0[randomint( var_0.size )]; - - for ( var_3 = var_0[randomint( var_0.size )]; isdefined( var_5 ) && var_3 == var_5; var_3 = var_0[randomint( var_0.size )] ) - { - - } - - var_3 thread [[ level.callbackPlayerDamage ]]( var_2, var_2, 1000, 0, "MOD_RIFLE_BULLET", "none", ( 0, 0, 0 ), ( 0, 0, 0 ), "none", 0 ); - var_5 = var_3; - } - } - } - - if ( getdvarfloat( "scr_killbottimer" ) > 0.05 ) - { - wait(getdvarfloat( "scr_killbottimer" )); - continue; - } - - wait 0.05; - } -} - -trackGrenades() -{ - for (;;) - { - level.grenades = getentarray( "grenade", "classname" ); - wait 0.05; - } -} - -trackMissiles() -{ - for (;;) - { - level.missiles = getentarray( "rocket", "classname" ); - wait 0.05; - } -} - -isPointVulnerable( var_0 ) -{ - var_1 = self.origin + level.claymoremodelcenteroffset; - var_2 = var_0 + ( 0, 0, 32 ); - var_3 = distancesquared( var_1, var_2 ); - var_4 = anglestoforward( self.angles ); - - if ( var_3 < level.claymoreDetectionRadius * level.claymoreDetectionRadius ) - { - var_5 = vectornormalize( var_2 - var_1 ); - var_6 = acos( vectordot( var_5, var_4 ) ); - - if ( var_6 < level.claymoreDetectionConeAngle ) - return 1; - } - - return 0; -} - -avoidWeaponDamage( var_0 ) -{ - var_1 = 100000; - - if ( getdvar( "scr_spawnpointweaponpenalty" ) != "" && getdvar( "scr_spawnpointweaponpenalty" ) != "0" ) - var_1 = getdvarfloat( "scr_spawnpointweaponpenalty" ); - - var_2 = 62500; - - for ( var_3 = 0; var_3 < var_0.size; var_3++ ) - { - for ( var_4 = 0; var_4 < level.grenades.size; var_4++ ) - { - if ( !isdefined( level.grenades[var_4] ) ) - continue; - - if ( distancesquared( var_0[var_3].origin, level.grenades[var_4].origin ) < var_2 ) - var_0[var_3].weight = var_0[var_3].weight - var_1; - } - - foreach ( var_6 in level.mines ) - { - if ( !isdefined( var_6 ) ) - continue; - - if ( distancesquared( var_0[var_3].origin, var_6.origin ) < var_2 ) - var_0[var_3].weight = var_0[var_3].weight - var_1; - } - - if ( !isdefined( level.artilleryDangerCenters ) ) - continue; - - var_8 = maps\mp\killstreaks\_airstrike::getAirstrikeDanger( var_0[var_3].origin ); - - if ( var_8 > 0 ) - { - var_9 = var_8 * var_1; - var_0[var_3].weight = var_0[var_3].weight - var_9; - } - } -} - -spawnPerFrameUpdate() -{ - var_0 = 0; - - for (;;) - { - wait 0.05; - - if ( !isdefined( level.spawnpoints ) ) - return; - - var_0 = ( var_0 + 1 ) % level.spawnpoints.size; - - if ( getdvar( "scr_spawnpoint_forceindex" ) != "" ) - var_0 = getdvarint( "scr_spawnpoint_forceindex" ); - - var_1 = level.spawnpoints[var_0]; - spawnPointUpdate( var_1 ); - } -} - -adjustSightValue( var_0 ) -{ - if ( var_0 <= 0 ) - return 0; - - if ( var_0 >= 1 ) - return 1; - - return var_0 * 0.5 + 0.25; -} - -spawnPointUpdate( var_0 ) -{ - if ( level.teamBased ) - { - var_0.sights["axis"] = 0; - var_0.sights["allies"] = 0; - } - else - var_0.sights = 0; - - var_1 = var_0.forward; - var_2 = 0; - var_0.distSum["all"] = 0; - var_0.distSum["allies"] = 0; - var_0.distSum["axis"] = 0; - var_0.weightedDistSum["all"] = 0; - var_0.weightedDistSum["allies"] = 0; - var_0.weightedDistSum["axis"] = 0; - var_0.minDist["all"] = 9999999; - var_0.minDist["allies"] = 9999999; - var_0.minDist["axis"] = 9999999; - var_0.numPlayersAtLastUpdate = 0; - var_3["all"] = 0; - var_3["allies"] = 0; - var_3["axis"] = 0; - var_4["all"] = 0; - var_4["allies"] = 0; - var_4["axis"] = 0; - var_5 = undefined; - var_6 = gettime(); - var_7 = "all"; - var_8 = level.teamBased; - - foreach ( var_10 in level.players ) - { - if ( var_10.sessionstate != "playing" ) - continue; - - var_11 = var_10.origin - var_0.origin; - var_11 = ( var_11[0], var_11[1], 0 ); - var_12 = 1.0; - var_13 = length( var_11 ); - - if ( var_8 ) - var_7 = var_10.team; - - if ( var_13 < var_0.minDist[var_7] ) - var_0.minDist[var_7] = var_13; - - if ( var_10.wasTI && var_6 - var_10.spawnTime < 15000 ) - var_12 *= 0.1; - - if ( var_10.isSniper ) - var_12 *= 0.5; - - var_4[var_7] += var_12; - var_0.weightedDistSum[var_7] = var_0.weightedDistSum[var_7] + var_13 * var_12; - var_0.distSum[var_7] = var_0.distSum[var_7] + var_13; - var_0.numPlayersAtLastUpdate++; - var_3[var_7]++; - var_14 = anglestoforward( var_10.angles ); - - if ( vectordot( var_1, var_11 ) < 0 && vectordot( var_14, var_11 ) > 0 ) - continue; - - if ( var_10 getstance() == "stand" ) - var_15 = 72; - else if ( var_10 getstance() == "crouch" ) - var_15 = 54; - else - var_15 = 32; - - var_16 = spawnsighttrace( var_0, var_0.origin + ( 0, 0, var_15 ), var_10.origin + ( 0, 0, var_15 ) ); - var_0.lastSightTraceTime = gettime(); - - if ( var_16 > 0 ) - { - var_16 = adjustSightValue( var_16 ); - - if ( var_8 ) - { - var_0.sights[var_7] = var_0.sights[var_7] + var_16; - continue; - } - - var_0.sights = var_0.sights + var_16; - } - } - - var_18 = maps\mp\_utility::getFloatProperty( "scr_spawn_enemyavoiddist", 2000 ); - var_19 = 2000; - var_20 = maps\mp\_utility::getFloatProperty( "scr_spawn_enemyavoiddist_strict", 750 ); - var_21 = maps\mp\_utility::getIntProperty( "scr_spawn_enemyavoidpenalty_strict", 50000 ); - - foreach ( var_7, var_23 in var_4 ) - { - if ( var_4[var_7] ) - var_0.weightedDistSum[var_7] = var_0.weightedDistSum[var_7] / var_4[var_7] * var_3[var_7]; - - var_24 = 0; - var_25 = var_0.minDist[var_7]; - - if ( var_25 < var_18 ) - var_24 = var_19 * ( 1 - var_25 / var_18 ); - - if ( var_25 < var_20 ) - var_24 += var_21; - - var_0.nearbyPenalty[var_7] = var_24; - } - - foreach ( var_27 in level.tanks ) - { - var_16 = spawnsighttrace( var_0, var_0.sightTracePoint, var_27.origin + ( 0, 0, 50 ) ); - var_0.lastSightTraceTime = gettime(); - - if ( var_16 <= 0 ) - continue; - - var_16 = adjustSightValue( var_16 ); - - if ( var_8 ) - { - var_0.sights[var_27.team] = var_0.sights[var_27.team] + var_16; - continue; - } - - var_0.sights = var_0.sights + var_16; - } - - foreach ( var_30 in level.turrets ) - { - if ( !isdefined( var_30 ) ) - continue; - - var_16 = spawnsighttrace( var_0, var_0.sightTracePoint, var_30.origin + ( 0, 0, 50 ) ); - var_0.lastSightTraceTime = gettime(); - - if ( var_16 <= 0 ) - continue; - - var_16 = adjustSightValue( var_16 ); - - if ( var_8 ) - { - var_0.sights[var_30.team] = var_0.sights[var_30.team] + var_16; - continue; - } - - var_0.sights = var_0.sights + var_16; - } - - foreach ( var_33 in level.ims ) - { - if ( !isdefined( var_33 ) ) - continue; - - if ( !isdefined( var_33.attackHeightPos ) ) - continue; - - var_16 = spawnsighttrace( var_0, var_0.sightTracePoint, var_33.attackHeightPos ); - var_0.lastSightTraceTime = gettime(); - - if ( var_16 <= 0 ) - continue; - - var_16 = adjustSightValue( var_16 ); - - if ( var_8 ) - { - var_0.sights[var_33.team] = var_0.sights[var_33.team] + var_16; - continue; - } - - var_0.sights = var_0.sights + var_16; - } - - foreach ( var_36 in level.ugvs ) - { - if ( !isdefined( var_36 ) ) - continue; - - var_16 = spawnsighttrace( var_0, var_0.sightTracePoint, var_36.origin + ( 0, 0, 50 ) ); - var_0.lastSightTraceTime = gettime(); - - if ( var_16 <= 0 ) - continue; - - var_16 = adjustSightValue( var_16 ); - - if ( var_8 ) - { - var_0.sights[var_36.team] = var_0.sights[var_36.team] + var_16; - continue; - } - - var_0.sights = var_0.sights + var_16; - } -} - -getLosPenalty() -{ - if ( getdvar( "scr_spawnpointlospenalty" ) != "" && getdvar( "scr_spawnpointlospenalty" ) != "0" ) - return getdvarfloat( "scr_spawnpointlospenalty" ); - - return 100000; -} - -lastMinuteSightTraces( var_0 ) -{ - var_1 = undefined; - var_2 = 100000000.0; - var_3 = undefined; - var_4 = 100000000.0; - - foreach ( var_6 in level.players ) - { - if ( var_6.team == self.team && level.teamBased ) - continue; - - if ( var_6.sessionstate != "playing" ) - continue; - - if ( var_6 == self ) - continue; - - var_7 = distancesquared( var_0.origin, var_6.origin ); - - if ( var_7 < var_2 ) - { - var_3 = var_1; - var_4 = var_2; - var_1 = var_6; - var_2 = var_7; - continue; - } - - if ( var_7 < var_4 ) - { - var_3 = var_6; - var_4 = var_7; - } - } - - if ( isdefined( var_1 ) ) - { - if ( var_1 getstance() == "stand" ) - var_9 = 72; - else if ( var_1 getstance() == "crouch" ) - var_9 = 54; - else - var_9 = 32; - - var_10 = spawnsighttrace( var_0, var_0.origin + ( 0, 0, var_9 ), var_1.origin + ( 0, 0, var_9 ) ); - - if ( var_10 > 0 ) - { - var_10 = adjustSightValue( var_10 ); - return var_10; - } - } - - if ( isdefined( var_3 ) ) - { - if ( var_3 getstance() == "stand" ) - var_9 = 72; - else if ( var_3 getstance() == "crouch" ) - var_9 = 54; - else - var_9 = 32; - - var_10 = spawnsighttrace( var_0, var_0.origin + ( 0, 0, var_9 ), var_3.origin + ( 0, 0, var_9 ) ); - - if ( var_10 > 0 ) - { - var_10 = adjustSightValue( var_10 ); - return var_10; - } - } - - return 0; -} - -getRevengeSpawnPenalty() -{ - var_0 = getdvarfloat( "scr_revengespawnpenalty", 25000 ); - return var_0; -} - -getRevengeSpawnDistanceSq() -{ - var_0 = getdvarfloat( "scr_revengespawndist", 1200 ); - return var_0 * var_0; -} - -avoidRevengeSpawn( var_0, var_1 ) -{ - var_2 = getRevengeSpawnDistanceSq(); - var_3 = getRevengeSpawnPenalty(); - - foreach ( var_5 in var_0 ) - { - var_6 = distancesquared( var_5.origin, var_1 ); - - if ( var_6 < var_2 ) - var_5.weight = var_5.weight - var_3; - } - - if ( isdefined( self.lastattacker ) && isdefined( self.lastattacker.origin ) ) - avoidRevengeSpawnStage2( var_0, self.lastattacker.origin ); -} - -avoidRevengeSpawnStage2( var_0, var_1 ) -{ - var_2 = getRevengeSpawnDistanceSq(); - var_3 = getRevengeSpawnPenalty(); - - foreach ( var_5 in var_0 ) - { - var_6 = distancesquared( var_5.origin, var_1 ); - - if ( var_6 < var_2 ) - var_5.weight = var_5.weight - var_3; - } -} - -avoidVisibleEnemies( var_0, var_1 ) -{ - var_2 = getLosPenalty(); - var_3 = "axis"; - - if ( self.team == "axis" ) - var_3 = "allies"; - - if ( var_1 ) - { - foreach ( var_5 in var_0 ) - { - var_6 = var_2 * var_5.sights[var_3]; - var_5.weight = var_5.weight - var_6; - } - } - else - { - foreach ( var_5 in var_0 ) - { - var_6 = var_2 * var_5.sights; - var_5.weight = var_5.weight - var_6; - } - - var_3 = "all"; - } - - foreach ( var_5 in var_0 ) - { - var_5.weight = var_5.weight - var_5.nearbyPenalty[var_3]; - - if ( positionwouldtelefrag( var_5.origin ) ) - { - var_11 = 1; - - foreach ( var_13 in var_5.alternates ) - { - if ( positionwouldtelefrag( var_13 ) ) - { - var_11++; - continue; - } - - break; - } - - var_6 = 100000; - - if ( var_11 < var_5.alternates.size + 1 ) - { - var_6 = 1500 * var_11; - - if ( isdefined( self.forceSpawnNearTeammates ) ) - var_6 = 0; - } - - var_5.weight = var_5.weight - var_6; - } - } -} - -avoidSpawnReuse( var_0, var_1 ) -{ - var_2 = gettime(); - var_3 = 10000; - var_4 = 1048576; - - foreach ( var_6 in var_0 ) - { - var_7 = var_6.lastspawnedplayer; - - if ( !isalive( var_7 ) ) - continue; - - if ( var_1 && var_6.lastspawnedplayer.team == self.team ) - continue; - - if ( var_6.lastspawnedplayer == self ) - continue; - - var_8 = var_2 - var_6.lastspawntime; - - if ( var_8 < var_3 ) - { - var_9 = distancesquared( var_6.lastspawnedplayer.origin, var_6.origin ); - - if ( var_9 < var_4 ) - { - var_10 = 5000 * ( 1 - var_9 / var_4 ) * ( 1 - var_8 / var_3 ); - var_6.weight = var_6.weight - var_10; - } - else - var_6.lastspawnedplayer = undefined; - - continue; - } - - var_6.lastspawnedplayer = undefined; - } -} - -avoidSameSpawn() -{ - var_0 = self.lastspawnpoint; - - if ( !isdefined( var_0 ) || !isdefined( var_0.weight ) ) - return; - - var_0.weight = var_0.weight - 1000; -} - -SetupKillstreakSpawnShield() -{ - level.killstreakSpawnShield = 5000; - - if ( getdvar( "killstreakSpawnShield" ) != "" ) - { - var_0 = getdvarint( "killstreakSpawnShield" ); - - if ( var_0 >= 0 && var_0 <= 10000 ) - level.killstreakSpawnShield = var_0; - } -} diff --git a/raw/maps/mp/killstreaks/_helicopter.gsc b/raw/maps/mp/killstreaks/_helicopter.gsc deleted file mode 100644 index 3b05737..0000000 --- a/raw/maps/mp/killstreaks/_helicopter.gsc +++ /dev/null @@ -1,2191 +0,0 @@ -// IW5 PC GSC -// Decompiled by https://github.com/xensik/gsc-tool - -init() -{ - var_0 = getentarray( "heli_start", "targetname" ); - var_1 = getentarray( "heli_loop_start", "targetname" ); - - if ( !var_0.size && !var_1.size ) - return; - - level.heli_types = []; - precacheitem( "heli_remote_mp" ); - precacheHelicopter( "vehicle_cobra_helicopter_fly_low", "cobra" ); - precacheHelicopter( "vehicle_mi24p_hind_mp", "hind" ); - precachevehicle( "cobra_mp" ); - precacheitem( "cobra_20mm_mp" ); - precacheHelicopter( "vehicle_pavelow", "pavelow" ); - precacheHelicopter( "vehicle_pavelow_opfor", "pavelow" ); - precachevehicle( "pavelow_mp" ); - precacheturret( "pavelow_minigun_mp" ); - precachestring( &"SPLASHES_DESTROYED_PAVELOW" ); - precachestring( &"SPLASHES_DESTROYED_MINIGUNNER" ); - precachestring( &"SPLASHES_DESTROYED_HELICOPTER" ); - level.chopper = undefined; - level.heli_start_nodes = getentarray( "heli_start", "targetname" ); - level.heli_loop_nodes = getentarray( "heli_loop_start", "targetname" ); - level.heli_leave_nodes = getentarray( "heli_leave", "targetname" ); - level.heli_crash_nodes = getentarray( "heli_crash_start", "targetname" ); - level.heli_missile_rof = 5; - level.heli_maxhealth = 2000; - level.heli_debug = 0; - level.heli_targeting_delay = 0.5; - level.heli_turretReloadTime = 1.5; - level.heli_turretClipSize = 40; - level.heli_visual_range = 3700; - level.heli_target_spawnprotection = 5; - level.heli_target_recognition = 0.5; - level.heli_missile_friendlycare = 256; - level.heli_missile_target_cone = 0.3; - level.heli_armor_bulletdamage = 0.3; - level.heli_attract_strength = 1000; - level.heli_attract_range = 4096; - level.heli_angle_offset = 90; - level.heli_forced_wait = 0; - level.chopper_fx["explode"]["death"] = []; - level.chopper_fx["explode"]["large"] = loadfx( "explosions/helicopter_explosion_secondary_small" ); - level.chopper_fx["explode"]["medium"] = loadfx( "explosions/aerial_explosion" ); - level.chopper_fx["smoke"]["trail"] = loadfx( "smoke/smoke_trail_white_heli" ); - level.chopper_fx["fire"]["trail"]["medium"] = loadfx( "fire/fire_smoke_trail_L_emitter" ); - level.chopper_fx["fire"]["trail"]["large"] = loadfx( "fire/fire_smoke_trail_L" ); - level.chopper_fx["damage"]["light_smoke"] = loadfx( "smoke/smoke_trail_white_heli_emitter" ); - level.chopper_fx["damage"]["heavy_smoke"] = loadfx( "smoke/smoke_trail_black_heli_emitter" ); - level.chopper_fx["damage"]["on_fire"] = loadfx( "fire/fire_smoke_trail_L_emitter" ); - level.chopper_fx["light"]["left"] = loadfx( "misc/aircraft_light_wingtip_green" ); - level.chopper_fx["light"]["right"] = loadfx( "misc/aircraft_light_wingtip_red" ); - level.chopper_fx["light"]["belly"] = loadfx( "misc/aircraft_light_red_blink" ); - level.chopper_fx["light"]["tail"] = loadfx( "misc/aircraft_light_white_blink" ); - level.fx_heli_dust = loadfx( "treadfx/heli_dust_default" ); - level.fx_heli_water = loadfx( "treadfx/heli_water" ); - makeHeliType( "cobra", "explosions/helicopter_explosion_cobra_low", ::defaultLightFX ); - addAirExplosion( "cobra", "explosions/aerial_explosion_cobra_low_mp" ); - makeHeliType( "pavelow", "explosions/helicopter_explosion_pavelow", ::pavelowLightFx ); - addAirExplosion( "pavelow", "explosions/aerial_explosion_pavelow_mp" ); - makeHeliType( "mi28", "explosions/helicopter_explosion_mi28_flying", ::defaultLightFX ); - addAirExplosion( "mi28", "explosions/aerial_explosion_mi28_flying_mp" ); - makeHeliType( "hind", "explosions/helicopter_explosion_hind_chernobyl", ::defaultLightFX ); - addAirExplosion( "hind", "explosions/aerial_explosion_hind_chernobyl_mp" ); - makeHeliType( "apache", "explosions/helicopter_explosion_apache", ::defaultLightFX ); - addAirExplosion( "apache", "explosions/aerial_explosion_apache_mp" ); - makeHeliType( "littlebird", "explosions/aerial_explosion_littlebird_mp", ::defaultLightFX ); - addAirExplosion( "littlebird", "explosions/aerial_explosion_littlebird_mp" ); - level.killstreakFuncs["helicopter"] = ::useHelicopter; - level.killstreakFuncs["helicopter_blackbox"] = ::useHelicopterBlackbox; - level.killstreakFuncs["helicopter_flares"] = ::useHelicopterFlares; - level.killstreakFuncs["helicopter_minigun"] = ::useHelicopterMinigun; - level.killstreakFuncs["helicopter_mk19"] = ::useHelicopterMK19; - level.heliDialog["tracking"][0] = "ac130_fco_moreenemy"; - level.heliDialog["tracking"][1] = "ac130_fco_getthatguy"; - level.heliDialog["tracking"][2] = "ac130_fco_guyrunnin"; - level.heliDialog["tracking"][3] = "ac130_fco_gotarunner"; - level.heliDialog["tracking"][4] = "ac130_fco_personnelthere"; - level.heliDialog["tracking"][5] = "ac130_fco_rightthere"; - level.heliDialog["tracking"][6] = "ac130_fco_tracking"; - level.heliDialog["locked"][0] = "ac130_fco_lightemup"; - level.heliDialog["locked"][1] = "ac130_fco_takehimout"; - level.heliDialog["locked"][2] = "ac130_fco_nailthoseguys"; - level.lastHeliDialogTime = 0; - maps\mp\_utility::queueCreate( "helicopter" ); -} - -makeHeliType( var_0, var_1, var_2 ) -{ - level.chopper_fx["explode"]["death"][var_0] = loadfx( var_1 ); - level.lightFxFunc[var_0] = var_2; -} - -addAirExplosion( var_0, var_1 ) -{ - level.chopper_fx["explode"]["air_death"][var_0] = loadfx( var_1 ); -} - -pavelowLightFx() -{ - playfxontag( level.chopper_fx["light"]["left"], self, "tag_light_L_wing1" ); - wait 0.05; - playfxontag( level.chopper_fx["light"]["right"], self, "tag_light_R_wing1" ); - wait 0.05; - playfxontag( level.chopper_fx["light"]["belly"], self, "tag_light_belly" ); - wait 0.05; - playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail" ); - wait 0.05; - playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail2" ); - wait 0.05; - playfxontag( level.chopper_fx["light"]["belly"], self, "tag_light_cockpit01" ); -} - -defaultLightFX() -{ - playfxontag( level.chopper_fx["light"]["left"], self, "tag_light_L_wing" ); - wait 0.05; - playfxontag( level.chopper_fx["light"]["right"], self, "tag_light_R_wing" ); - wait 0.05; - playfxontag( level.chopper_fx["light"]["belly"], self, "tag_light_belly" ); - wait 0.05; - playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail" ); -} - -useHelicopter( var_0 ) -{ - return tryUseHelicopter( var_0, "helicopter" ); -} - -useHelicopterBlackbox( var_0 ) -{ - return tryUseHelicopter( var_0, "blackbox" ); -} - -useHelicopterFlares( var_0 ) -{ - return tryUseHelicopter( var_0, "flares" ); -} - -useHelicopterMinigun( var_0 ) -{ - if ( isdefined( self.laststand ) && !maps\mp\_utility::_hasPerk( "specialty_finalstand" ) ) - { - self iprintlnbold( &"MP_UNAVILABLE_IN_LASTSTAND" ); - return 0; - } - - return tryUseHelicopter( var_0, "minigun" ); -} - -useHelicopterMK19( var_0 ) -{ - if ( isdefined( self.laststand ) && !maps\mp\_utility::_hasPerk( "specialty_finalstand" ) ) - { - self iprintlnbold( &"MP_UNAVILABLE_IN_LASTSTAND" ); - return 0; - } - - return tryUseHelicopter( var_0, "mk19" ); -} - -tryUseHelicopter( var_0, var_1 ) -{ - if ( isdefined( level.civilianJetFlyBy ) ) - { - self iprintlnbold( &"MP_CIVILIAN_AIR_TRAFFIC" ); - return 0; - } - - if ( maps\mp\_utility::isAirDenied() ) - return 0; - - if ( maps\mp\_utility::isEMPed() ) - return 0; - - var_2 = 1; - - if ( ( !isdefined( var_1 ) || var_1 == "flares" ) && isdefined( level.chopper ) ) - { - self iprintlnbold( &"MP_HELI_IN_QUEUE" ); - - if ( isdefined( var_1 ) ) - var_3 = "helicopter_" + var_1; - else - var_3 = "helicopter"; - - thread maps\mp\killstreaks\_killstreaks::updateKillstreaks(); - var_4 = spawn( "script_origin", ( 0, 0, 0 ) ); - var_4 hide(); - var_4 thread deleteOnEntNotify( self, "disconnect" ); - var_4.player = self; - var_4.lifeId = var_0; - var_4.heliType = var_1; - var_4.streakName = var_3; - maps\mp\_utility::queueAdd( "helicopter", var_4 ); - var_5 = undefined; - - if ( !self hasweapon( common_scripts\utility::getLastWeapon() ) ) - var_5 = maps\mp\killstreaks\_killstreaks::getFirstPrimaryWeapon(); - else - var_5 = common_scripts\utility::getLastWeapon(); - - var_6 = maps\mp\killstreaks\_killstreaks::getKillstreakWeapon( "helicopter_flares" ); - thread maps\mp\killstreaks\_killstreaks::waitTakeKillstreakWeapon( var_6, var_5 ); - return 0; - } - else if ( isdefined( level.chopper ) ) - { - self iprintlnbold( &"MP_AIR_SPACE_TOO_CROWDED" ); - return 0; - } - else if ( maps\mp\_utility::currentActiveVehicleCount() >= maps\mp\_utility::maxVehiclesAllowed() || level.fauxVehicleCount + var_2 >= maps\mp\_utility::maxVehiclesAllowed() ) - { - self iprintlnbold( &"MP_TOO_MANY_VEHICLES" ); - return 0; - } - - var_2 = 1; - - if ( isdefined( var_1 ) && var_1 == "minigun" ) - { - maps\mp\_utility::setUsingRemote( "helicopter_" + var_1 ); - var_7 = maps\mp\killstreaks\_killstreaks::initRideKillstreak(); - - if ( var_7 != "success" ) - { - if ( var_7 != "disconnect" ) - maps\mp\_utility::clearUsingRemote(); - - return 0; - } - - if ( isdefined( level.chopper ) ) - { - maps\mp\_utility::clearUsingRemote(); - self iprintlnbold( &"MP_AIR_SPACE_TOO_CROWDED" ); - return 0; - } - else if ( maps\mp\_utility::currentActiveVehicleCount() >= maps\mp\_utility::maxVehiclesAllowed() || level.fauxVehicleCount + var_2 >= maps\mp\_utility::maxVehiclesAllowed() ) - { - maps\mp\_utility::clearUsingRemote(); - self iprintlnbold( &"MP_TOO_MANY_VEHICLES" ); - return 0; - } - } - - startHelicopter( var_0, var_1 ); - return 1; -} - -deleteOnEntNotify( var_0, var_1 ) -{ - self endon( "death" ); - var_0 waittill( var_1 ); - self delete(); -} - -startHelicopter( var_0, var_1 ) -{ - maps\mp\_utility::incrementFauxVehicleCount(); - - if ( !isdefined( var_1 ) ) - var_1 = ""; - - switch ( var_1 ) - { - case "flares": - thread pavelowMadeSelectionVO(); - var_2 = "helicopter_flares"; - break; - case "minigun": - var_2 = "helicopter_minigun"; - break; - default: - var_2 = "helicopter"; - break; - } - - var_3 = self.pers["team"]; - var_4 = level.heli_start_nodes[randomint( level.heli_start_nodes.size )]; - maps\mp\_matchdata::logKillstreakEvent( var_2, self.origin ); - thread heli_think( var_0, self, var_4, self.pers["team"], var_1 ); -} - -precacheHelicopter( var_0, var_1 ) -{ - var_2 = loadfx( "explosions/tanker_explosion" ); - precachemodel( var_0 ); - level.heli_types[var_0] = var_1; - level.cobra_missile_models = []; - level.cobra_missile_models["cobra_Hellfire"] = "projectile_hellfire_missile"; - precachemodel( level.cobra_missile_models["cobra_Hellfire"] ); - level.heli_sound["allies"]["hit"] = "cobra_helicopter_hit"; - level.heli_sound["allies"]["hitsecondary"] = "cobra_helicopter_secondary_exp"; - level.heli_sound["allies"]["damaged"] = "cobra_helicopter_damaged"; - level.heli_sound["allies"]["spinloop"] = "cobra_helicopter_dying_loop"; - level.heli_sound["allies"]["spinstart"] = "cobra_helicopter_dying_layer"; - level.heli_sound["allies"]["crash"] = "cobra_helicopter_crash"; - level.heli_sound["allies"]["missilefire"] = "weap_cobra_missile_fire"; - level.heli_sound["axis"]["hit"] = "cobra_helicopter_hit"; - level.heli_sound["axis"]["hitsecondary"] = "cobra_helicopter_secondary_exp"; - level.heli_sound["axis"]["damaged"] = "cobra_helicopter_damaged"; - level.heli_sound["axis"]["spinloop"] = "cobra_helicopter_dying_loop"; - level.heli_sound["axis"]["spinstart"] = "cobra_helicopter_dying_layer"; - level.heli_sound["axis"]["crash"] = "cobra_helicopter_crash"; - level.heli_sound["axis"]["missilefire"] = "weap_cobra_missile_fire"; -} - -spawn_helicopter( var_0, var_1, var_2, var_3, var_4 ) -{ - var_5 = spawnhelicopter( var_0, var_1, var_2, var_3, var_4 ); - - if ( !isdefined( var_5 ) ) - return undefined; - - var_5.heli_type = level.heli_types[var_4]; - var_5 thread [[ level.lightFxFunc[var_5.heli_type] ]](); - var_5 addToHeliList(); - var_5.zOffset = ( 0, 0, var_5 gettagorigin( "tag_origin" )[2] - var_5 gettagorigin( "tag_ground" )[2] ); - var_5.attractor = missile_createattractorent( var_5, level.heli_attract_strength , level.heli_attract_range ); - return var_5; -} - -heliRide( var_0, var_1 ) -{ - self endon( "disconnect" ); - var_1 endon( "helicopter_done" ); - thread maps\mp\_utility::teamPlayerCardSplash( "used_helicopter_minigun", self ); - self visionsetthermalforplayer( "black_bw", 0 ); - maps\mp\_utility::_giveWeapon( "heli_remote_mp" ); - self switchtoweapon( "heli_remote_mp" ); - self visionsetthermalforplayer( game["thermal_vision"], 6 ); - self thermalvisionon(); - self thermalvisionfofoverlayon(); - thread thermalVision( var_1 ); - - if ( getdvarint( "camera_thirdPerson" ) ) - maps\mp\_utility::setThirdPersonDOF( 0 ); - - var_1 vehicleturretcontrolon( self ); - self playerlinkweaponviewtodelta( var_1, "tag_player", 1.0, 180, 180, 0, 180, 1 ); - var_1.gunner = self; - self.heliRideLifeId = var_0; - thread endRideOnHelicopterDone( var_1 ); - thread weaponLockThink( var_1 ); - - for (;;) - { - var_1 waittill( "turret_fire" ); - var_1 fireweapon(); - earthquake( 0.2, 1, var_1.origin, 1000 ); - } -} - -thermalVision( var_0 ) -{ - var_0 endon( "helicopter_done" ); - - if ( maps\mp\_utility::getIntProperty( "ac130_thermal_enabled", 1 ) == 0 ) - return; - - var_1 = 0; - self visionsetthermalforplayer( level.ac130.enhanced_vision, 1 ); - self.lastvisionsetthermal = level.ac130.enhanced_vision; - self thermalvisionoff(); - self notifyonplayercommand( "switch thermal", "+usereload" ); - self notifyonplayercommand( "switch thermal", "+activate" ); - - for (;;) - { - self waittill( "switch thermal" ); - - if ( !var_1 ) - { - self visionsetthermalforplayer( level.ac130.thermal_vision, 0.62 ); - self.lastvisionsetthermal = level.ac130.thermal_vision; - self thermalvisionon(); - } - else - { - self visionsetthermalforplayer( level.ac130.enhanced_vision, 0.51 ); - self.lastvisionsetthermal = level.ac130.enhanced_vision; - self thermalvisionoff(); - } - - var_1 = !var_1; - } -} - -weaponLockThink( var_0 ) -{ - self endon( "disconnect" ); - var_0 endon( "helicopter_done" ); - - if ( !isdefined( level.heliTargetOrigin ) ) - { - level.heliTargetOrigin = spawn( "script_origin", ( 0, 0, 0 ) ); - level.heliTargetOrigin hide(); - } - - for (;;) - { - var_1 = bullettrace( self geteye(), self geteye() + anglestoforward( self getplayerangles() ) * 100000, 1, self ); - level.heliTargetOrigin.origin = var_1["position"]; - var_2 = []; - var_3 = []; - - foreach ( var_5 in level.players ) - { - if ( !isalive( var_5 ) ) - continue; - - if ( level.teamBased && var_5.team == self.team ) - continue; - - if ( var_5 == self ) - continue; - - if ( var_5 maps\mp\_utility::_hasPerk( "specialty_blindeye" ) ) - continue; - - if ( isdefined( var_5.spawnTime ) && ( gettime() - var_5.spawnTime ) / 1000 <= 5 ) - continue; - - var_5.remoteHeliLOS = 1; - - if ( !bullettracepassed( self geteye(), var_5.origin + ( 0, 0, 32 ), 0, var_0 ) ) - { - var_3[var_3.size] = var_5; - continue; - } - - var_2[var_2.size] = var_5; - } - - var_7 = []; - var_7 = var_2; - - foreach ( var_9 in var_3 ) - var_2[var_2.size] = var_9; - - if ( var_7.size != 0 ) - { - var_11 = sortbydistance( var_7, var_1["position"] ); - - if ( distance( var_11[0].origin, var_1["position"] ) < 384 && var_11[0] damageconetrace( var_1["position"] ) ) - { - self weaponlockfinalize( var_11[0] ); - heliDialog( "locked" ); - } - else - { - self weaponlockstart( var_11[0] ); - heliDialog( "tracking" ); - } - } - else - self weaponlockfree(); - - wait 0.05; - } -} - -heliDialog( var_0 ) -{ - if ( gettime() - level.lastHeliDialogTime < 6000 ) - return; - - level.lastHeliDialogTime = gettime(); - var_1 = randomint( level.heliDialog[var_0].size ); - var_2 = level.heliDialog[var_0][var_1]; - var_3 = maps\mp\gametypes\_teams::getTeamVoicePrefix( self.team ) + var_2; - self playlocalsound( var_3 ); -} - -endRide( var_0 ) -{ - self remotecamerasoundscapeoff(); - self thermalvisionoff(); - self thermalvisionfofoverlayoff(); - self unlink(); - self switchtoweapon( common_scripts\utility::getLastWeapon() ); - maps\mp\_utility::clearUsingRemote(); - - if ( getdvarint( "camera_thirdPerson" ) ) - maps\mp\_utility::setThirdPersonDOF( 1 ); - - self visionsetthermalforplayer( game["thermal_vision"], 0 ); - - if ( isdefined( var_0 ) ) - { - var_1 = maps\mp\killstreaks\_killstreaks::getKillstreakWeapon( "helicopter_minigun" ); - self takeweapon( var_1 ); - var_0 vehicleturretcontroloff( self ); - } - - self notify( "heliPlayer_removed" ); -} - -endRideOnHelicopterDone( var_0 ) -{ - self endon( "disconnect" ); - var_0 waittill( "helicopter_done" ); - endRide( var_0 ); -} - -getPosNearEnemies() -{ - var_0 = []; - - foreach ( var_2 in level.players ) - { - if ( var_2.team == "spectator" ) - continue; - - if ( var_2.team == self.team ) - continue; - - if ( !isalive( var_2 ) ) - continue; - - if ( !bullettracepassed( var_2.origin, var_2.origin + ( 0, 0, 2048 ), 0, var_2 ) ) - continue; - - var_2.remoteHeliDist = 0; - var_0[var_0.size] = var_2; - } - - if ( !var_0.size ) - return undefined; - - for ( var_4 = 0; var_4 < var_0.size; var_4++ ) - { - for ( var_5 = var_4 + 1; var_5 < var_0.size; var_5++ ) - { - var_6 = distancesquared( var_0[var_4].origin, var_0[var_5].origin ); - var_0[var_4].remoteHeliDist = var_0[var_4].remoteHeliDist + var_6; - var_0[var_5].remoteHeliDist = var_0[var_5].remoteHeliDist + var_6; - } - } - - var_7 = var_0[0]; - - foreach ( var_2 in var_0 ) - { - if ( var_2.remoteHeliDist < var_7.remoteHeliDist ) - var_7 = var_2; - } - - return var_7.origin; -} - -updateAreaNodes( var_0 ) -{ - var_1 = []; - - foreach ( var_3 in var_0 ) - { - var_3.validPlayers = []; - var_3.nodeScore = 0; - } - - foreach ( var_6 in level.players ) - { - if ( !isalive( var_6 ) ) - continue; - - if ( var_6.team == self.team ) - continue; - - foreach ( var_3 in var_0 ) - { - if ( distancesquared( var_6.origin, var_3.origin ) > 1048576 ) - continue; - - var_3.validPlayers[var_3.validPlayers.size] = var_6; - } - } - - var_10 = var_0[0]; - - foreach ( var_3 in var_0 ) - { - var_12 = getent( var_3.target, "targetname" ); - - foreach ( var_6 in var_3.validPlayers ) - { - var_3.nodeScore = var_3.nodeScore + 1; - - if ( bullettracepassed( var_6.origin + ( 0, 0, 32 ), var_12.origin, 0, var_6 ) ) - var_3.nodeScore = var_3.nodeScore + 3; - } - - if ( var_3.nodeScore > var_10.nodeScore ) - var_10 = var_3; - } - - return getent( var_10.target, "targetname" ); -} - -heli_think( var_0, var_1, var_2, var_3, var_4 ) -{ - var_5 = var_2.origin; - var_6 = var_2.angles; - - switch ( var_4 ) - { - case "minigun": - var_7 = "cobra_minigun_mp"; - - if ( var_1.team == "allies" ) - var_8 = "vehicle_apache_mp"; - else - var_8 = "vehicle_mi-28_mp"; - - break; - case "flares": - var_7 = "pavelow_mp"; - - if ( var_1.team == "allies" ) - var_8 = "vehicle_pavelow"; - else - var_8 = "vehicle_pavelow_opfor"; - - break; - default: - var_7 = "cobra_mp"; - - if ( var_1.team == "allies" ) - var_8 = "vehicle_cobra_helicopter_fly_low"; - else - var_8 = "vehicle_mi24p_hind_mp"; - - break; - } - - var_9 = spawn_helicopter( var_1, var_5, var_6, var_7, var_8 ); - - if ( !isdefined( var_9 ) ) - return; - - level.chopper = var_9; - var_9.heliType = var_4; - var_9.lifeId = var_0; - var_9.team = var_3; - var_9.pers["team"] = var_3; - var_9.owner = var_1; - - if ( var_4 == "flares" ) - var_9.maxHealth = level.heli_maxhealth * 2; - else - var_9.maxHealth = level.heli_maxhealth; - - var_9.targeting_delay = level.heli_targeting_delay; - var_9.primaryTarget = undefined; - var_9.secondaryTarget = undefined; - var_9.attacker = undefined; - var_9.currentstate = "ok"; - var_9.empGrenaded = 0; - - if ( var_4 == "flares" || var_4 == "minigun" ) - var_9 thread heli_flares_monitor(); - - var_9 thread heli_leave_on_disconnect( var_1 ); - var_9 thread heli_leave_on_changeTeams( var_1 ); - var_9 thread heli_leave_on_gameended( var_1 ); - var_9 thread heli_damage_monitor(); - var_9 thread heli_health(); - var_9 thread heli_existance(); - var_9 endon( "helicopter_done" ); - var_9 endon( "crashing" ); - var_9 endon( "leaving" ); - var_9 endon( "death" ); - - if ( var_4 == "minigun" ) - { - var_1 thread heliRide( var_0, var_9 ); - var_9 thread heli_leave_on_spawned( var_1 ); - } - - var_10 = getentarray( "heli_attack_area", "targetname" ); - var_11 = level.heli_loop_nodes[randomint( level.heli_loop_nodes.size )]; - - switch ( var_4 ) - { - case "minigun": - var_9 thread heli_targeting(); - var_9 heli_fly_simple_path( var_2 ); - var_9 thread heli_leave_on_timeout( 40.0 ); - - if ( var_10.size ) - var_9 thread heli_fly_well( var_10 ); - else - var_9 thread heli_fly_loop_path( var_11 ); - - break; - case "flares": - var_9 thread makeGunShip(); - thread maps\mp\_utility::teamPlayerCardSplash( "used_helicopter_flares", var_1 ); - var_9 heli_fly_simple_path( var_2 ); - var_9 thread heli_leave_on_timeout( 60.0 ); - var_9 thread heli_fly_loop_path( var_11 ); - break; - default: - var_9 thread attack_targets(); - var_9 thread heli_targeting(); - var_9 heli_fly_simple_path( var_2 ); - var_9 thread heli_leave_on_timeout( 60.0 ); - var_9 thread heli_fly_loop_path( var_11 ); - break; - } -} - -makeGunShip() -{ - self endon( "death" ); - self endon( "helicopter_done" ); - wait 0.5; - var_0 = spawnturret( "misc_turret", self.origin, "pavelow_minigun_mp" ); - var_0.lifeId = self.lifeId; - var_0 linkto( self, "tag_gunner_left", ( 0, 0, 0 ), ( 0, 0, 0 ) ); - var_0 setmodel( "weapon_minigun" ); - var_0.owner = self.owner; - var_0.team = self.team; - var_0 maketurretinoperable(); - var_0.pers["team"] = self.team; - var_0.killCamEnt = self; - self.mgTurretLeft = var_0; - self.mgTurretLeft setdefaultdroppitch( 0 ); - var_0 = spawnturret( "misc_turret", self.origin, "pavelow_minigun_mp" ); - var_0.lifeId = self.lifeId; - var_0 linkto( self, "tag_gunner_right", ( 0, 0, 0 ), ( 0, 0, 0 ) ); - var_0 setmodel( "weapon_minigun" ); - var_0.owner = self.owner; - var_0.team = self.team; - var_0 maketurretinoperable(); - var_0.pers["team"] = self.team; - var_0.killCamEnt = self; - self.mgTurretRight = var_0; - self.mgTurretRight setdefaultdroppitch( 0 ); - - if ( level.teamBased ) - { - self.mgTurretLeft setturretteam( self.team ); - self.mgTurretRight setturretteam( self.team ); - } - - self.mgTurretLeft setmode( "auto_nonai" ); - self.mgTurretRight setmode( "auto_nonai" ); - self.mgTurretLeft setsentryowner( self.owner ); - self.mgTurretRight setsentryowner( self.owner ); - self.mgTurretLeft setturretminimapvisible( 0 ); - self.mgTurretRight setturretminimapvisible( 0 ); - self.mgTurretLeft.chopper = self; - self.mgTurretRight.chopper = self; - self.mgTurretLeft thread sentry_attackTargets(); - self.mgTurretRight thread sentry_attackTargets(); - thread deleteTurretsWhenDone(); -} - -deleteTurretsWhenDone() -{ - self waittill( "helicopter_done" ); - self.mgTurretRight delete(); - self.mgTurretLeft delete(); -} - -sentry_attackTargets() -{ - self endon( "death" ); - self endon( "helicopter_done" ); - level endon( "game_ended" ); - - for (;;) - { - self waittill( "turretstatechange" ); - - if ( self isfiringturret() && !self.chopper.empGrenaded ) - { - thread sentry_burstFireStart(); - continue; - } - - thread sentry_burstFireStop(); - } -} - -sentry_burstFireStart() -{ - self endon( "death" ); - self endon( "stop_shooting" ); - self endon( "leaving" ); - level endon( "game_ended" ); - var_0 = 0.1; - var_1 = 40; - var_2 = 80; - var_3 = 1.0; - var_4 = 2.0; - - for (;;) - { - var_5 = randomintrange( var_1, var_2 + 1 ); - - for ( var_6 = 0; var_6 < var_5; var_6++ ) - { - var_7 = self getturrettarget( 0 ); - - if ( isdefined( var_7 ) && ( !isdefined( var_7.spawnTime ) || ( gettime() - var_7.spawnTime ) / 1000 > 5 ) ) - self shootturret(); - - wait(var_0); - } - - wait(randomfloatrange( var_3, var_4 )); - } -} - -sentry_burstFireStop() -{ - self notify( "stop_shooting" ); -} - -heli_existance() -{ - var_0 = self getentitynumber(); - common_scripts\utility::waittill_any( "death", "crashing", "leaving" ); - removeFromHeliList( var_0 ); - self notify( "helicopter_done" ); - self notify( "helicopter_removed" ); - var_1 = undefined; - var_2 = maps\mp\_utility::queueRemoveFirst( "helicopter" ); - - if ( !isdefined( var_2 ) ) - level.chopper = undefined; - else - { - var_1 = var_2.player; - var_3 = var_2.lifeId; - var_4 = var_2.streakName; - var_5 = var_2.heliType; - var_2 delete(); - - if ( isdefined( var_1 ) && ( var_1.sessionstate == "playing" || var_1.sessionstate == "dead" ) ) - { - var_1 maps\mp\killstreaks\_killstreaks::usedKillstreak( var_4, 1 ); - var_1 startHelicopter( var_3, var_5 ); - return; - } - - level.chopper = undefined; - } -} - -heli_targeting() -{ - self endon( "death" ); - self endon( "helicopter_done" ); - - for (;;) - { - var_0 = []; - self.primaryTarget = undefined; - self.secondaryTarget = undefined; - var_1 = level.players; - - foreach ( var_3 in level.players ) - { - if ( !canTarget_turret( var_3 ) ) - continue; - - var_0[var_0.size] = var_3; - } - - if ( var_0.size ) - { - for ( var_5 = getBestPrimaryTarget( var_0 ); !isdefined( var_5 ); var_5 = getBestPrimaryTarget( var_0 ) ) - wait 0.05; - - self.primaryTarget = var_5; - self notify( "primary acquired" ); - } - - if ( isdefined( level.harriers ) ) - { - foreach ( var_7 in level.harriers ) - { - if ( !isdefined( var_7 ) ) - continue; - - if ( level.teamBased && var_7.team != self.team || !level.teamBased && var_7.owner != self.owner ) - { - self notify( "secondary acquired" ); - self.secondaryTarget = var_7; - } - } - } - - wait 0.5; - } -} - -canTarget_turret( var_0 ) -{ - var_1 = 1; - - if ( !isalive( var_0 ) || var_0.sessionstate != "playing" ) - return 0; - - if ( self.heliType == "remote_mortar" ) - { - if ( var_0 sightconetrace( self.origin, self ) < 1 ) - return 0; - } - else if ( self.heliType != "flares" ) - { - if ( !self vehicle_canturrettargetpoint( var_0.origin + ( 0, 0, 40 ), 1, self ) ) - return 0; - } - - if ( distance( var_0.origin, self.origin ) > level.heli_visual_range ) - return 0; - - if ( level.teamBased && var_0.pers["team"] == self.team ) - return 0; - - if ( var_0 == self.owner ) - return 0; - - if ( isdefined( var_0.spawnTime ) && ( gettime() - var_0.spawnTime ) / 1000 <= 5 ) - return 0; - - if ( var_0 maps\mp\_utility::_hasPerk( "specialty_blindeye" ) ) - return 0; - - var_2 = self.origin + ( 0, 0, -160 ); - var_3 = anglestoforward( self.angles ); - var_4 = var_2 + 144 * var_3; - - if ( var_0 sightconetrace( var_4, self ) < level.heli_target_recognition ) - return 0; - - return var_1; -} - -getBestPrimaryTarget( var_0 ) -{ - foreach ( var_2 in var_0 ) - update_player_threat( var_2 ); - - var_4 = 0; - var_5 = undefined; - var_6 = getentarray( "minimap_corner", "targetname" ); - - foreach ( var_2 in var_0 ) - { - if ( var_6.size == 2 ) - { - var_8 = var_6[0].origin; - var_9 = var_6[0].origin; - - if ( var_6[1].origin[0] > var_9[0] ) - var_9 = ( var_6[1].origin[0], var_9[1], var_9[2] ); - else - var_8 = ( var_6[1].origin[0], var_8[1], var_8[2] ); - - if ( var_6[1].origin[1] > var_9[1] ) - var_9 = ( var_9[0], var_6[1].origin[1], var_9[2] ); - else - var_8 = ( var_8[0], var_6[1].origin[1], var_8[2] ); - - if ( var_2.origin[0] < var_8[0] || var_2.origin[0] > var_9[0] || var_2.origin[1] < var_8[1] || var_2.origin[1] > var_9[1] ) - continue; - } - - if ( var_2.threatlevel < var_4 ) - continue; - - var_4 = var_2.threatlevel; - var_5 = var_2; - } - - return var_5; -} - -update_player_threat( var_0 ) -{ - var_0.threatlevel = 0; - var_1 = distance( var_0.origin, self.origin ); - var_0.threatlevel = var_0.threatlevel + ( level.heli_visual_range - var_1 ) / level.heli_visual_range * 100; - - if ( isdefined( self.attacker ) && var_0 == self.attacker ) - var_0.threatlevel = var_0.threatlevel + 100; - - var_0.threatlevel = var_0.threatlevel + var_0.score * 4; - - if ( isdefined( var_0.antithreat ) ) - var_0.threatlevel = var_0.threatlevel - var_0.antithreat; - - if ( var_0.threatlevel <= 0 ) - var_0.threatlevel = 1; -} - -heli_reset() -{ - self cleartargetyaw(); - self cleargoalyaw(); - self vehicle_setspeed( 60, 25 ); - self setyawspeed( 75, 45, 45 ); - self setmaxpitchroll( 30, 30 ); - self setneargoalnotifydist( 256 ); - self setturningability( 0.9 ); -} - -addRecentDamage( var_0 ) -{ - self endon( "death" ); - self.recentDamageAmount = self.recentDamageAmount + var_0; - wait 4.0; - self.recentDamageAmount = self.recentDamageAmount - var_0; -} - -heli_damage_monitor() -{ - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - self.health = 999999; - self.damagetaken = 0; - self.recentDamageAmount = 0; - - for (;;) - { - self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ); - - if ( isdefined( var_1.class ) && var_1.class == "worldspawn" ) - continue; - else if ( var_1 == self ) - continue; - - if ( !maps\mp\gametypes\_weapons::friendlyFireCheck( self.owner, var_1 ) ) - continue; - - self.attacker = var_1; - var_10 = var_0; - - if ( isplayer( var_1 ) ) - { - var_1 maps\mp\gametypes\_damagefeedback::updateDamageFeedback( "" ); - - if ( var_4 == "MOD_RIFLE_BULLET" || var_4 == "MOD_PISTOL_BULLET" ) - { - if ( self.heliType == "flares" ) - var_10 *= level.heli_armor_bulletdamage; - - if ( var_1 maps\mp\_utility::_hasPerk( "specialty_armorpiercing" ) ) - var_10 += var_0 * level.armorPiercingMod; - } - } - - if ( isdefined( var_1.owner ) && isplayer( var_1.owner ) ) - var_1.owner maps\mp\gametypes\_damagefeedback::updateDamageFeedback( "helicopter" ); - - if ( isdefined( var_9 ) ) - { - switch ( var_9 ) - { - case "ac130_105mm_mp": - case "ac130_40mm_mp": - case "remotemissile_projectile_mp": - case "stinger_mp": - case "javelin_mp": - case "remote_mortar_missile_mp": - self.largeProjectileDamage = 1; - var_10 = self.maxHealth + 1; - break; - case "sam_projectile_mp": - self.largeProjectileDamage = 1; - - switch ( self.heliType ) - { - case "osprey_gunner": - case "flares": - case "osprey": - var_10 = self.maxHealth * 0.07; - break; - case "helicopter": - case "littlebird": - var_10 = self.maxHealth * 0.09; - break; - } - - break; - case "emp_grenade_mp": - var_10 = 0; - thread heli_empgrenaded(); - break; - case "osprey_player_minigun_mp": - self.largeProjectileDamage = 0; - var_10 *= 2; - break; - } - - maps\mp\killstreaks\_killstreaks::killstreakhit( var_1, var_9, self ); - } - - self.damagetaken = self.damagetaken + var_10; - thread addRecentDamage( var_10 ); - - if ( self.damagetaken >= self.maxHealth ) - { - if ( level.teamBased && self.team != var_1.team || !level.teamBased ) - { - var_11 = undefined; - - if ( isdefined( var_1.owner ) && ( !isdefined( self.owner ) || var_1.owner != self.owner ) ) - var_11 = var_1.owner; - else if ( !isdefined( var_1.owner ) && var_1.classname == "script_vehicle" ) - return; - else if ( !isdefined( self.owner ) || var_1 != self.owner ) - var_11 = var_1; - - if ( isdefined( var_11 ) ) - { - var_11 notify( "destroyed_helicopter" ); - - switch ( self.heliType ) - { - case "flares": - var_11 thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DESTROYED_PAVELOW" ); - thread maps\mp\_utility::teamPlayerCardSplash( "callout_destroyed_helicopter_flares", var_11 ); - var_12 = 400; - break; - case "minigun": - var_11 thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DESTROYED_MINIGUNNER" ); - thread maps\mp\_utility::teamPlayerCardSplash( "callout_destroyed_helicopter_minigun", var_11 ); - var_12 = 300; - break; - case "osprey_gunner": - case "osprey": - var_11 thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DESTROYED_OSPREY" ); - thread maps\mp\_utility::teamPlayerCardSplash( "callout_destroyed_osprey", var_11 ); - var_12 = 300; - break; - case "littlebird": - var_11 thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DESTROYED_LITTLE_BIRD" ); - thread maps\mp\_utility::teamPlayerCardSplash( "callout_destroyed_little_bird", var_11 ); - var_12 = 200; - default: - var_11 thread maps\mp\gametypes\_rank::xpEventPopup( &"SPLASHES_DESTROYED_HELICOPTER" ); - thread maps\mp\_utility::teamPlayerCardSplash( "callout_destroyed_helicopter", var_11 ); - var_12 = 200; - break; - } - - var_11 thread maps\mp\gametypes\_rank::giveRankXP( "kill", var_12, var_9, var_4 ); - thread maps\mp\gametypes\_missions::vehicleKilled( self.owner, self, undefined, var_11, var_0, var_4, var_9 ); - } - } - } - } -} - -heli_empgrenaded() -{ - self notify( "heli_EMPGrenaded" ); - self endon( "heli_EMPGrenaded" ); - self endon( "death" ); - self endon( "leaving" ); - self endon( "crashing" ); - self.owner endon( "disconnect" ); - level endon( "game_ended" ); - self.empGrenaded = 1; - - if ( isdefined( self.mgTurretLeft ) ) - self.mgTurretLeft notify( "stop_shooting" ); - - if ( isdefined( self.mgTurretRight ) ) - self.mgTurretRight notify( "stop_shooting" ); - - wait 3.5; - self.empGrenaded = 0; - - if ( isdefined( self.mgTurretLeft ) ) - self.mgTurretLeft notify( "turretstatechange" ); - - if ( isdefined( self.mgTurretRight ) ) - self.mgTurretRight notify( "turretstatechange" ); -} - -heli_health() -{ - self endon( "death" ); - self endon( "leaving" ); - self endon( "crashing" ); - self.currentstate = "ok"; - self.laststate = "ok"; - self setdamagestate( 3 ); - var_0 = 3; - self setdamagestate( var_0 ); - - for (;;) - { - if ( self.damagetaken >= self.maxHealth * 0.33 && var_0 == 3 ) - { - var_0 = 2; - self setdamagestate( var_0 ); - self.currentstate = "light smoke"; - playfxontag( level.chopper_fx["damage"]["light_smoke"], self, "tag_engine_left" ); - } - else if ( self.damagetaken >= self.maxHealth * 0.66 && var_0 == 2 ) - { - var_0 = 1; - self setdamagestate( var_0 ); - self.currentstate = "heavy smoke"; - stopfxontag( level.chopper_fx["damage"]["light_smoke"], self, "tag_engine_left" ); - playfxontag( level.chopper_fx["damage"]["heavy_smoke"], self, "tag_engine_left" ); - } - else if ( self.damagetaken > self.maxHealth ) - { - var_0 = 0; - self setdamagestate( var_0 ); - stopfxontag( level.chopper_fx["damage"]["heavy_smoke"], self, "tag_engine_left" ); - - if ( isdefined( self.largeProjectileDamage ) && self.largeProjectileDamage ) - thread heli_explode( 1 ); - else - { - playfxontag( level.chopper_fx["damage"]["on_fire"], self, "tag_engine_left" ); - thread heli_crash(); - } - } - - wait 0.05; - } -} - -heli_crash() -{ - self notify( "crashing" ); - var_0 = level.heli_crash_nodes[randomint( level.heli_crash_nodes.size )]; - thread heli_spin( 180 ); - thread heli_secondary_explosions(); - heli_fly_simple_path( var_0 ); - thread heli_explode(); -} - -heli_secondary_explosions() -{ - playfxontag( level.chopper_fx["explode"]["large"], self, "tag_engine_left" ); - self playsound( level.heli_sound[self.team]["hitsecondary"] ); - wait 3.0; - - if ( !isdefined( self ) ) - return; - - playfxontag( level.chopper_fx["explode"]["large"], self, "tag_engine_left" ); - self playsound( level.heli_sound[self.team]["hitsecondary"] ); -} - -heli_spin( var_0 ) -{ - self endon( "death" ); - self playsound( level.heli_sound[self.team]["hit"] ); - thread spinSoundShortly(); - self setyawspeed( var_0, var_0, var_0 ); - - while ( isdefined( self ) ) - { - self settargetyaw( self.angles[1] + var_0 * 0.9 ); - wait 1; - } -} - -spinSoundShortly() -{ - self endon( "death" ); - wait 0.25; - self stoploopsound(); - wait 0.05; - self playloopsound( level.heli_sound[self.team]["spinloop"] ); - wait 0.05; - self playloopsound( level.heli_sound[self.team]["spinstart"] ); -} - -heli_explode( var_0 ) -{ - self notify( "death" ); - - if ( isdefined( var_0 ) && isdefined( level.chopper_fx["explode"]["air_death"][self.heli_type] ) ) - { - var_1 = self gettagangles( "tag_deathfx" ); - playfx( level.chopper_fx["explode"]["air_death"][self.heli_type], self gettagorigin( "tag_deathfx" ), anglestoforward( var_1 ), anglestoup( var_1 ) ); - } - else - { - var_2 = self.origin; - var_3 = self.origin + ( 0, 0, 1 ) - self.origin; - playfx( level.chopper_fx["explode"]["death"][self.heli_type], var_2, var_3 ); - } - - self playsound( level.heli_sound[self.team]["crash"] ); - wait 0.05; - - if ( isdefined( self.killCamEnt ) ) - self.killCamEnt delete(); - - if (self.heliType == "osprey_gunner") - { - if (isDefined(self)) - self hide(); - - wait 30; - - maps\mp\_utility::decrementFauxVehicleCount(); - if (isDefined(self)) - self delete(); - } - else - { - maps\mp\_utility::decrementFauxVehicleCount(); - self delete(); - } -} - -fire_missile( var_0, var_1, var_2 ) -{ - if ( !isdefined( var_1 ) ) - var_1 = 1; - - var_3 = undefined; - var_4 = undefined; - var_5 = "cobra_20mm_mp"; - var_6 = []; - - switch ( var_0 ) - { - case "ffar": - var_3 = "harrier_FFAR_mp"; - var_6[0] = "tag_store_r_2"; - break; - default: - break; - } - - var_4 = weaponfiretime( var_3 ); - self setvehweapon( var_3 ); - var_7 = -1; - - for ( var_8 = 0; var_8 < var_1; var_8++ ) - { - var_7++; - - if ( var_7 >= var_6.size ) - var_7 = 0; - - self setvehweapon( "harrier_FFAR_mp" ); - - if ( isdefined( var_2 ) ) - { - var_9 = self fireweapon( var_6[var_7], var_2 ); - var_9 missile_setflightmodedirect(); - var_9 missile_settargetent( var_2 ); - } - else - { - var_9 = self fireweapon( var_6[var_7] ); - var_9 missile_setflightmodedirect(); - var_9 missile_settargetent( var_2 ); - } - - if ( var_8 < var_1 - 1 ) - wait(var_4); - } -} - -check_owner() -{ - if ( !isdefined( self.owner ) || !isdefined( self.owner.pers["team"] ) || self.owner.pers["team"] != self.team ) - { - thread heli_leave(); - return 0; - } - - return 1; -} - -heli_leave_on_disconnect( var_0 ) -{ - self endon( "death" ); - self endon( "helicopter_done" ); - var_0 waittill( "disconnect" ); - thread heli_leave(); -} - -heli_leave_on_changeTeams( var_0 ) -{ - self endon( "death" ); - self endon( "helicopter_done" ); - var_0 common_scripts\utility::waittill_any( "joined_team", "joined_spectators" ); - thread heli_leave(); -} - -heli_leave_on_spawned( var_0 ) -{ - self endon( "death" ); - self endon( "helicopter_done" ); - var_0 waittill( "spawned" ); - thread heli_leave(); -} - -heli_leave_on_gameended( var_0 ) -{ - self endon( "death" ); - self endon( "helicopter_done" ); - level waittill( "game_ended" ); - thread heli_leave(); -} - -heli_leave_on_timeout( var_0 ) -{ - self endon( "death" ); - self endon( "helicopter_done" ); - maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( var_0 ); - thread heli_leave(); -} - -attack_targets() -{ - thread attack_primary(); - thread attack_secondary(); -} - -attack_secondary() -{ - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - - for (;;) - { - if ( isdefined( self.secondaryTarget ) ) - { - self.secondaryTarget.antithreat = undefined; - self.missileTarget = self.secondaryTarget; - var_0 = 0; - - while ( isdefined( self.missileTarget ) && isalive( self.missileTarget ) ) - { - if ( missile_target_sight_check( self.missileTarget ) ) - thread missile_support( self.missileTarget, level.heli_missile_rof ); - else - break; - - self waittill( "missile ready" ); - - if ( !isdefined( self.secondaryTarget ) || isdefined( self.secondaryTarget ) && self.missileTarget != self.secondaryTarget ) - break; - } - - if ( isdefined( self.missileTarget ) ) - self.missileTarget.antithreat = undefined; - } - - self waittill( "secondary acquired" ); - check_owner(); - } -} - -missile_target_sight_check( var_0 ) -{ - var_1 = vectornormalize( var_0.origin - self.origin ); - var_2 = anglestoforward( self.angles ); - var_3 = vectornormalize( var_2 ); - var_4 = vectordot( var_1, var_3 ); - - if ( var_4 >= level.heli_missile_target_cone ) - { - debug_print3d_simple( "Missile sight: " + var_4, self, ( 0, 0, -40 ), 40 ); - return 1; - } - - return 0; -} - -missile_support( var_0, var_1 ) -{ - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - - if ( isdefined( var_0 ) ) - { - if ( level.teamBased ) - { - if ( isdefined( var_0.owner ) && var_0.team != self.team ) - { - fire_missile( "ffar", 1, var_0 ); - self notify( "missile fired" ); - } - } - else if ( isdefined( var_0.owner ) && var_0.owner != self.owner ) - { - fire_missile( "ffar", 1, var_0 ); - self notify( "missile fired" ); - } - } - - wait(var_1); - self notify( "missile ready" ); - return; -} - -attack_primary() -{ - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - - for (;;) - { - wait 0.05; - - if ( !isalive( self.primaryTarget ) ) - continue; - - var_0 = self.primaryTarget; - var_0.antithreat = 0; - - if ( randomint( 5 ) < 3 ) - var_1 = var_0.angles[1] + randomfloatrange( -30, 30 ); - else - var_1 = randomint( 360 ); - - var_2 = 96; - var_3 = cos( var_1 ) * var_2; - var_4 = sin( var_1 ) * var_2; - self setturrettargetent( var_0, ( var_3, var_4, 40 ) ); - waitOnTargetOrDeath( var_0, 3.0 ); - - if ( !isalive( var_0 ) || !self vehicle_canturrettargetpoint( var_0.origin + ( 0, 0, 40 ) ) ) - continue; - - var_5 = weaponfiretime( "cobra_20mm_mp" ); - var_6 = 1; - var_7 = 0; - self playloopsound( "weap_cobra_20mm_fire_npc" ); - - for ( var_8 = 0; var_8 < level.heli_turretClipSize; var_8++ ) - { - if ( self.empGrenaded ) - break; - - self setvehweapon( "cobra_20mm_mp" ); - self fireweapon( "tag_flash" ); - - if ( var_8 < level.heli_turretClipSize - 1 ) - wait(var_5); - - if ( !isdefined( var_0 ) ) - break; - - if ( self vehicle_canturrettargetpoint( var_0.origin + ( 0, 0, 40 ), 1, self ) ) - { - var_6 = max( var_6 - 0.05, 0 ); - var_7 = 0; - } - else - var_7++; - - if ( var_7 > 10 ) - break; - - var_9 = ( var_3 * var_6 + randomfloatrange( -6, 6 ), var_4 * var_6 + randomfloatrange( -6, 6 ), 40 + randomfloatrange( -6, 6 ) ); - self setturrettargetent( var_0, var_9 ); - } - - self stoploopsound(); - - if ( isalive( var_0 ) ) - var_0.antithreat = var_0.antithreat + 100; - - wait(randomfloatrange( 0.5, 2.0 )); - } -} - -waitOnTargetOrDeath( var_0, var_1 ) -{ - self endon( "death" ); - self endon( "helicopter_done" ); - var_0 endon( "death" ); - var_0 endon( "disconnect" ); - common_scripts\utility::waittill_notify_or_timeout( "turret_on_target", var_1 ); -} - -fireMissile( var_0 ) -{ - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - - if ( !isdefined( var_0 ) ) - return; - - if ( distance2d( self.origin, var_0.origin ) < 512 ) - return; - - self setvehweapon( "harrier_FFAR_mp" ); - var_1 = self fireweapon( "tag_flash", var_0 ); - var_1 missile_setflightmodedirect(); - var_1 missile_settargetent( var_0 ); -} - -getOriginOffsets( var_0 ) -{ - var_1 = self.origin; - var_2 = var_0.origin; - var_3 = 0; - var_4 = 40; - var_5 = ( 0, 0, -196 ); - - for ( var_6 = bullettrace( var_1 + var_5, var_2 + var_5, 0, self ); distancesquared( var_6["position"], var_2 + var_5 ) > 10 && var_3 < var_4; var_6 = bullettrace( var_1 + var_5, var_2 + var_5, 0, self ) ) - { - if ( var_1[2] < var_2[2] ) - var_1 += ( 0, 0, 128 ); - else if ( var_1[2] > var_2[2] ) - var_2 += ( 0, 0, 128 ); - else - { - var_1 += ( 0, 0, 128 ); - var_2 += ( 0, 0, 128 ); - } - - var_3++; - } - - var_7 = []; - var_7["start"] = var_1; - var_7["end"] = var_2; - return var_7; -} - -travelToNode( var_0 ) -{ - var_1 = getOriginOffsets( var_0 ); - - if ( var_1["start"] != self.origin ) - { - if ( isdefined( var_0.script_airspeed ) && isdefined( var_0.script_accel ) ) - { - var_2 = var_0.script_airspeed; - var_3 = var_0.script_accel; - } - else - { - var_2 = 30 + randomint( 20 ); - var_3 = 15 + randomint( 15 ); - } - - self vehicle_setspeed( var_2, var_3 ); - self setvehgoalpos( var_1["start"] + ( 0, 0, 30 ), 0 ); - self setgoalyaw( var_0.angles[1] + level.heli_angle_offset ); - self waittill( "goal" ); - } - - if ( var_1["end"] != var_0.origin ) - { - if ( isdefined( var_0.script_airspeed ) && isdefined( var_0.script_accel ) ) - { - var_2 = var_0.script_airspeed; - var_3 = var_0.script_accel; - } - else - { - var_2 = 30 + randomint( 20 ); - var_3 = 15 + randomint( 15 ); - } - - self vehicle_setspeed( var_2, var_3 ); - self setvehgoalpos( var_1["end"] + ( 0, 0, 30 ), 0 ); - self setgoalyaw( var_0.angles[1] + level.heli_angle_offset ); - self waittill( "goal" ); - } -} - -heli_fly_simple_path( var_0 ) -{ - self endon( "death" ); - self endon( "leaving" ); - self notify( "flying" ); - self endon( "flying" ); - heli_reset(); - - for ( var_1 = var_0; isdefined( var_1.target ); var_1 = var_2 ) - { - var_2 = getent( var_1.target, "targetname" ); - - if ( isdefined( var_1.script_airspeed ) && isdefined( var_1.script_accel ) ) - { - var_3 = var_1.script_airspeed; - var_4 = var_1.script_accel; - } - else - { - var_3 = 30 + randomint( 20 ); - var_4 = 15 + randomint( 15 ); - } - - self vehicle_setspeed( var_3, var_4 ); - - if ( !isdefined( var_2.target ) ) - { - self setvehgoalpos( var_2.origin + self.zOffset, 1 ); - self waittill( "near_goal" ); - continue; - } - - self setvehgoalpos( var_2.origin + self.zOffset, 0 ); - self waittill( "near_goal" ); - self setgoalyaw( var_2.angles[1] ); - self waittillmatch( "goal" ); - } -} - -heli_fly_loop_path( var_0 ) -{ - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - self notify( "flying" ); - self endon( "flying" ); - heli_reset(); - thread heli_loop_speed_control( var_0 ); - - for ( var_1 = var_0; isdefined( var_1.target ); var_1 = var_2 ) - { - var_2 = getent( var_1.target, "targetname" ); - - if ( isdefined( var_1.script_airspeed ) && isdefined( var_1.script_accel ) ) - { - self.desired_speed = var_1.script_airspeed; - self.desired_accel = var_1.script_accel; - } - else - { - self.desired_speed = 30 + randomint( 20 ); - self.desired_accel = 15 + randomint( 15 ); - } - - if ( self.heliType == "flares" ) - { - self.desired_speed = self.desired_speed * 0.5; - self.desired_accel = self.desired_accel * 0.5; - } - - if ( isdefined( var_2.script_delay ) && isdefined( self.primaryTarget ) && !heli_is_threatened() ) - { - self setvehgoalpos( var_2.origin + self.zOffset, 1 ); - self waittill( "near_goal" ); - wait(var_2.script_delay); - continue; - } - - self setvehgoalpos( var_2.origin + self.zOffset, 0 ); - self waittill( "near_goal" ); - self setgoalyaw( var_2.angles[1] ); - self waittillmatch( "goal" ); - } -} - -heli_loop_speed_control( var_0 ) -{ - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - - if ( isdefined( var_0.script_airspeed ) && isdefined( var_0.script_accel ) ) - { - self.desired_speed = var_0.script_airspeed; - self.desired_accel = var_0.script_accel; - } - else - { - self.desired_speed = 30 + randomint( 20 ); - self.desired_accel = 15 + randomint( 15 ); - } - - var_1 = 0; - var_2 = 0; - - for (;;) - { - var_3 = self.desired_speed; - var_4 = self.desired_accel; - - if ( self.heliType != "flares" && isdefined( self.primaryTarget ) && !heli_is_threatened() ) - var_3 *= 0.25; - - if ( var_1 != var_3 || var_2 != var_4 ) - { - self vehicle_setspeed( var_3, var_4 ); - var_1 = var_3; - var_2 = var_4; - } - - wait 0.05; - } -} - -heli_is_threatened() -{ - if ( self.recentDamageAmount > 50 ) - return 1; - - if ( self.currentstate == "heavy smoke" ) - return 1; - - return 0; -} - -heli_fly_well( var_0 ) -{ - self notify( "flying" ); - self endon( "flying" ); - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - - for (;;) - { - var_1 = get_best_area_attack_node( var_0 ); - travelToNode( var_1 ); - - if ( isdefined( var_1.script_airspeed ) && isdefined( var_1.script_accel ) ) - { - var_2 = var_1.script_airspeed; - var_3 = var_1.script_accel; - } - else - { - var_2 = 30 + randomint( 20 ); - var_3 = 15 + randomint( 15 ); - } - - self vehicle_setspeed( var_2, var_3 ); - self setvehgoalpos( var_1.origin + self.zOffset, 1 ); - self setgoalyaw( var_1.angles[1] + level.heli_angle_offset ); - - if ( level.heli_forced_wait != 0 ) - { - self waittill( "near_goal" ); - wait(level.heli_forced_wait); - continue; - } - - if ( !isdefined( var_1.script_delay ) ) - { - self waittill( "near_goal" ); - wait(5 + randomint( 5 )); - continue; - } - - self waittillmatch( "goal" ); - wait(var_1.script_delay); - } -} - -get_best_area_attack_node( var_0 ) -{ - return updateAreaNodes( var_0 ); -} - -heli_leave( var_0 ) -{ - self notify( "leaving" ); - - if ( isdefined( self.heliType ) && self.heliType == "osprey" && isdefined( self.pathGoal ) ) - { - self setvehgoalpos( self.pathGoal, 1 ); - common_scripts\utility::waittill_any_timeout( 5, "goal" ); - } - - if ( !isdefined( var_0 ) ) - { - var_1 = level.heli_leave_nodes[randomint( level.heli_leave_nodes.size )]; - var_0 = var_1.origin; - } - - var_2 = spawn( "script_origin", var_0 ); - - if ( isdefined( var_2 ) ) - { - self setlookatent( var_2 ); - var_2 thread wait_and_delete( 3.0 ); - } - - heli_reset(); - self vehicle_setspeed( 100, 45 ); - self setvehgoalpos( var_0, 1 ); - self waittillmatch( "goal" ); - self notify( "death" ); - wait 0.05; - - if ( isdefined( self.killCamEnt ) ) - self.killCamEnt delete(); - - if (self.heliType == "osprey_gunner") - { - if (isDefined(self)) - self hide(); - - wait 30; - - maps\mp\_utility::decrementFauxVehicleCount(); - if (isDefined(self)) - self delete(); - } - else - { - maps\mp\_utility::decrementFauxVehicleCount(); - self delete(); - } -} - -wait_and_delete( var_0 ) -{ - self endon( "death" ); - level endon( "game_ended" ); - wait(var_0); - self delete(); -} - -debug_print3d( var_0, var_1, var_2, var_3, var_4 ) -{ - if ( isdefined( level.heli_debug ) && level.heli_debug == 1.0 ) - thread draw_text( var_0, var_1, var_2, var_3, var_4 ); -} - -debug_print3d_simple( var_0, var_1, var_2, var_3 ) -{ - if ( isdefined( level.heli_debug ) && level.heli_debug == 1.0 ) - { - if ( isdefined( var_3 ) ) - thread draw_text( var_0, ( 0.8, 0.8, 0.8 ), var_1, var_2, var_3 ); - else - thread draw_text( var_0, ( 0.8, 0.8, 0.8 ), var_1, var_2, 0 ); - } -} - -debug_line( var_0, var_1, var_2, var_3 ) -{ - if ( isdefined( level.heli_debug ) && level.heli_debug == 1.0 && !isdefined( var_3 ) ) - thread draw_line( var_0, var_1, var_2 ); - else if ( isdefined( level.heli_debug ) && level.heli_debug == 1.0 ) - thread draw_line( var_0, var_1, var_2, var_3 ); -} - -draw_text( var_0, var_1, var_2, var_3, var_4 ) -{ - if ( var_4 == 0 ) - { - while ( isdefined( var_2 ) ) - wait 0.05; - } - else - { - for ( var_5 = 0; var_5 < var_4; var_5++ ) - { - if ( !isdefined( var_2 ) ) - break; - - wait 0.05; - } - } -} - -draw_line( var_0, var_1, var_2, var_3 ) -{ - if ( isdefined( var_3 ) ) - { - for ( var_4 = 0; var_4 < var_3; var_4++ ) - wait 0.05; - } - else - { - for (;;) - wait 0.05; - } -} - -addToHeliList() -{ - level.helis[self getentitynumber()] = self; -} - -removeFromHeliList( var_0 ) -{ - level.helis[var_0] = undefined; -} - -addToLittleBirdList() -{ - level.littleBirds[self getentitynumber()] = self; -} - -removeFromLittleBirdListOnDeath() -{ - var_0 = self getentitynumber(); - self waittill( "death" ); - level.littleBirds[var_0] = undefined; -} - -exceededMaxLittlebirds( var_0 ) -{ - if ( level.littleBirds.size >= 4 || level.littleBirds.size >= 2 && var_0 == "littlebird_flock" ) - return 1; - else - return 0; -} - -playFlareFx() -{ - for ( var_0 = 0; var_0 < 10; var_0++ ) - { - if ( !isdefined( self ) ) - return; - - playfxontag( level._effect["ac130_flare"], self, "TAG_FLARE" ); - wait 0.15; - } -} - -deployFlares() -{ - var_0 = spawn( "script_origin", self.origin + ( 0, 0, -256 ) ); - var_0.angles = self.angles; - var_0 movegravity( ( 0, 0, -1 ), 5.0 ); - var_0 thread deleteAfterTime( 5.0 ); - return var_0; -} - -heli_flares_monitor() -{ - switch ( self.heliType ) - { - case "osprey_gunner": - case "osprey": - self.numFlares = 2; - break; - default: - self.numFlares = 1; - break; - } - - thread handleIncomingSAM(); - thread handleIncomingStinger(); -} - -handleIncomingStinger( var_0 ) -{ - level endon( "game_ended" ); - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - self endon( "helicopter_done" ); - - for (;;) - { - level waittill( "stinger_fired", var_1, var_2, var_3 ); - - if ( !isdefined( var_3 ) || var_3 != self ) - continue; - - if ( isdefined( var_0 ) ) - { - var_2 thread [[ var_0 ]]( var_1, var_1.team, var_3 ); - continue; - } - - var_2 thread watchStingerProximity( var_1, var_1.team, var_3 ); - } -} - -watchStingerProximity( var_0, var_1, var_2 ) -{ - self endon( "death" ); - - for (;;) - { - if ( !isdefined( var_2 ) ) - break; - - var_3 = var_2 getpointinbounds( 0, 0, 0 ); - var_4 = distance( self.origin, var_3 ); - - if ( var_4 < 4000 && var_2.numFlares > 0 ) - { - var_2.numFlares--; - var_2 thread playFlareFx(); - var_5 = var_2 deployFlares(); - self missile_settargetent( var_5 ); - return; - } - - wait 0.05; - } -} - -handleIncomingSAM( var_0 ) -{ - level endon( "game_ended" ); - self endon( "death" ); - self endon( "crashing" ); - self endon( "leaving" ); - self endon( "helicopter_done" ); - - for (;;) - { - level waittill( "sam_fired", var_1, var_2, var_3 ); - - if ( !isdefined( var_3 ) || var_3 != self ) - continue; - - if ( isdefined( var_0 ) ) - { - level thread [[ var_0 ]]( var_1, var_1.team, var_3, var_2 ); - continue; - } - - level thread watchSAMProximity( var_1, var_1.team, var_3, var_2 ); - } -} - -watchSAMProximity( var_0, var_1, var_2, var_3 ) -{ - level endon( "game_ended" ); - var_2 endon( "death" ); - - for (;;) - { - var_4 = var_2 getpointinbounds( 0, 0, 0 ); - var_5 = []; - - for ( var_6 = 0; var_6 < var_3.size; var_6++ ) - { - if ( isdefined( var_3[var_6] ) ) - var_5[var_6] = distance( var_3[var_6].origin, var_4 ); - } - - for ( var_6 = 0; var_6 < var_5.size; var_6++ ) - { - if ( isdefined( var_5[var_6] ) ) - { - if ( var_5[var_6] < 4000 && var_2.numFlares > 0 ) - { - var_2.numFlares--; - var_2 thread playFlareFx(); - var_7 = var_2 deployFlares(); - - for ( var_8 = 0; var_8 < var_3.size; var_8++ ) - { - if ( isdefined( var_3[var_8] ) ) - var_3[var_8] missile_settargetent( var_7 ); - } - - return; - } - } - } - - wait 0.05; - } -} - -deleteAfterTime( var_0 ) -{ - wait(var_0); - self delete(); -} - -pavelowMadeSelectionVO() -{ - self endon( "death" ); - self endon( "disconnect" ); - self playlocalsound( game["voice"][self.team] + "KS_hqr_pavelow" ); - wait 3.5; - self playlocalsound( game["voice"][self.team] + "KS_pvl_inbound" ); -} diff --git a/raw/scripts/bots_test.gsc b/raw/scripts/bots_test.gsc deleted file mode 100644 index b5dbacc..0000000 --- a/raw/scripts/bots_test.gsc +++ /dev/null @@ -1,98 +0,0 @@ -#include maps\mp\_utility; -#include maps\mp\gametypes\_hud_util; -#include common_scripts\utility; -#include maps\mp\bots\_bot_utility; - -init() -{ - setDvarIfUninitialized( "bots_test", true ); - - if (!getDvarInt("bots_test")) - return; - - level thread onConnected(); - level thread onframe(); -} - -onframe() -{ - for(;;) - { - wait 0.05; - - if(getDvarInt("developer")) print("time:" + getTime() + " child0:" + getVarUsage(0) + " child1:" + getVarUsage(1) + " notifycount:" + getVarUsage(2) + " sound:" + getVarUsage(3, 2140) + " fx:" + getVarUsage(3, 2780) + " vol:" + getVarUsage(3, 3036) + " anim:" + getVarUsage(3, 3681) + " veh:" + getVarUsage(3, 2108) + " localstr:" + getVarUsage(3, 469) + " mat:" + getVarUsage(3, 3084) + " 3340:" + getVarUsage(3, 3340) + " 2524:" + getVarUsage(3, 2524)); - } -} - -onConnected() -{ - for (;;) - { - level waittill("connected", player); - - player thread test(); - player thread onSpawn(); - } -} - -onSpawn() -{ - self endon("disconnect"); - - for (;;) - { - self waittill("spawned_player"); - - self thread spawned(); - } -} - -giveAllKillstreaks() -{ - killstreaks = maps\mp\bots\_bot_script::getKillstreaks(); - - for ( i = 0; i < killstreaks.size; i++ ) - { - j = randomInt(killstreaks.size); - ks = killstreaks[i]; - killstreaks[i] = killstreaks[j]; - killstreaks[j] = ks; - } - - for (i = 0; i < killstreaks.size; i++) - { - ks = killstreaks[i]; - - if (isSubstr(ks, "specialty_")) - continue; - - self maps\mp\killstreaks\_killstreaks::giveKillstreak(ks); - } -} - -spawned() -{ - self endon("disconnect"); - self endon("death"); - - wait 0.5; - - //self giveAllKillstreaks(); -} - -test() -{ - self endon("disconnect"); - - for (;;) - { - wait 0.05; - - if (self is_bot()) - { - } - else - { - } - } -} diff --git a/raw/scripts/nukespawns.gsc b/raw/scripts/nukespawns.gsc index 3e7b501..d95b14e 100644 --- a/raw/scripts/nukespawns.gsc +++ b/raw/scripts/nukespawns.gsc @@ -1,6 +1,10 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; + init() { - level thread watchNuke(); + level thread watchNuke(); level thread onPlayerConnect(); @@ -8,11 +12,459 @@ init() level.allowPrintDamage = true; } +main() +{ + // fix G-GetPlayereye bug + replaceFunc( maps\mp\killstreaks\_helicopter::heli_leave, ::heli_leave ); + replaceFunc( maps\mp\killstreaks\_helicopter::heli_explode, ::heli_explode ); + + // allow scr_xpscale to be anything + replaceFunc( maps\mp\gametypes\_rank::init, ::rank_init ); + replaceFunc( maps\mp\gametypes\_rank::syncXPStat, ::syncXPStat ); + + // add scr_spawnpointfavorweight dvar + replaceFunc( maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam, ::getSpawnpoint_NearTeam ); + + // add damage numbers + replaceFunc( maps\mp\gametypes\_damage::finishPlayerDamageWrapper, ::finishPlayerDamageWrapper ); + + // more perks for specialist bonus + replaceFunc( maps\mp\killstreaks\_killstreaks::giveAllPerks, ::giveAllPerks ); + + // scavenge all types of ammo + replaceFunc( maps\mp\gametypes\_weapons::handleScavengerBagPickup, ::handleScavengerBagPickup ); +} + +heli_explode( var_0 ) +{ + self notify( "death" ); + + if ( isdefined( var_0 ) && isdefined( level.chopper_fx["explode"]["air_death"][self.heli_type] ) ) + { + var_1 = self gettagangles( "tag_deathfx" ); + playfx( level.chopper_fx["explode"]["air_death"][self.heli_type], self gettagorigin( "tag_deathfx" ), anglestoforward( var_1 ), anglestoup( var_1 ) ); + } + else + { + var_2 = self.origin; + var_3 = self.origin + ( 0, 0, 1 ) - self.origin; + playfx( level.chopper_fx["explode"]["death"][self.heli_type], var_2, var_3 ); + } + + self playsound( level.heli_sound[self.team]["crash"] ); + wait 0.05; + + if ( isdefined( self.killCamEnt ) ) + self.killCamEnt delete (); + + if ( self.heliType == "osprey_gunner" ) + { + if ( isDefined( self ) ) + self hide(); + + wait 30; + + maps\mp\_utility::decrementFauxVehicleCount(); + + if ( isDefined( self ) ) + self delete (); + } + else + { + maps\mp\_utility::decrementFauxVehicleCount(); + self delete (); + } +} + +heli_leave( var_0 ) +{ + self notify( "leaving" ); + + if ( isdefined( self.heliType ) && self.heliType == "osprey" && isdefined( self.pathGoal ) ) + { + self setvehgoalpos( self.pathGoal, 1 ); + common_scripts\utility::waittill_any_timeout( 5, "goal" ); + } + + if ( !isdefined( var_0 ) ) + { + var_1 = level.heli_leave_nodes[randomint( level.heli_leave_nodes.size )]; + var_0 = var_1.origin; + } + + var_2 = spawn( "script_origin", var_0 ); + + if ( isdefined( var_2 ) ) + { + self setlookatent( var_2 ); + var_2 thread maps\mp\killstreaks\_helicopter::wait_and_delete( 3.0 ); + } + + maps\mp\killstreaks\_helicopter::heli_reset(); + self vehicle_setspeed( 100, 45 ); + self setvehgoalpos( var_0, 1 ); + self waittillmatch( "goal" ); + self notify( "death" ); + wait 0.05; + + if ( isdefined( self.killCamEnt ) ) + self.killCamEnt delete (); + + if ( self.heliType == "osprey_gunner" ) + { + if ( isDefined( self ) ) + self hide(); + + wait 30; + + maps\mp\_utility::decrementFauxVehicleCount(); + + if ( isDefined( self ) ) + self delete (); + } + else + { + maps\mp\_utility::decrementFauxVehicleCount(); + self delete (); + } +} + +syncXPStat() +{ + var_0 = maps\mp\gametypes\_rank::getRankXP(); + maps\mp\gametypes\_persistence::statSet( "experience", var_0 ); +} + +rank_init() +{ + level.scoreInfo = []; + level.xpScale = getdvarint( "scr_xpscale" ); + level.weaponxpscale = getdvarint( "scr_weaponxpscale" ); + level.rankTable = []; + level.weaponRankTable = []; + precacheshader( "white" ); + precachestring( &"RANK_PLAYER_WAS_PROMOTED_N" ); + precachestring( &"RANK_PLAYER_WAS_PROMOTED" ); + precachestring( &"RANK_WEAPON_WAS_PROMOTED" ); + precachestring( &"RANK_PROMOTED" ); + precachestring( &"RANK_PROMOTED_WEAPON" ); + precachestring( &"MP_PLUS" ); + precachestring( &"RANK_ROMANI" ); + precachestring( &"RANK_ROMANII" ); + precachestring( &"RANK_ROMANIII" ); + precachestring( &"SPLASHES_LONGSHOT" ); + precachestring( &"SPLASHES_PROXIMITYASSIST" ); + precachestring( &"SPLASHES_PROXIMITYKILL" ); + precachestring( &"SPLASHES_EXECUTION" ); + precachestring( &"SPLASHES_AVENGER" ); + precachestring( &"SPLASHES_ASSISTEDSUICIDE" ); + precachestring( &"SPLASHES_DEFENDER" ); + precachestring( &"SPLASHES_POSTHUMOUS" ); + precachestring( &"SPLASHES_REVENGE" ); + precachestring( &"SPLASHES_DOUBLEKILL" ); + precachestring( &"SPLASHES_TRIPLEKILL" ); + precachestring( &"SPLASHES_MULTIKILL" ); + precachestring( &"SPLASHES_BUZZKILL" ); + precachestring( &"SPLASHES_COMEBACK" ); + precachestring( &"SPLASHES_KNIFETHROW" ); + precachestring( &"SPLASHES_ONE_SHOT_KILL" ); + + if ( level.teamBased ) + { + maps\mp\gametypes\_rank::registerScoreInfo( "kill", 100 ); + maps\mp\gametypes\_rank::registerScoreInfo( "headshot", 100 ); + maps\mp\gametypes\_rank::registerScoreInfo( "assist", 20 ); + maps\mp\gametypes\_rank::registerScoreInfo( "proximityassist", 20 ); + maps\mp\gametypes\_rank::registerScoreInfo( "proximitykill", 20 ); + maps\mp\gametypes\_rank::registerScoreInfo( "suicide", 0 ); + maps\mp\gametypes\_rank::registerScoreInfo( "teamkill", 0 ); + } + else + { + maps\mp\gametypes\_rank::registerScoreInfo( "kill", 50 ); + maps\mp\gametypes\_rank::registerScoreInfo( "headshot", 50 ); + maps\mp\gametypes\_rank::registerScoreInfo( "assist", 0 ); + maps\mp\gametypes\_rank::registerScoreInfo( "suicide", 0 ); + maps\mp\gametypes\_rank::registerScoreInfo( "teamkill", 0 ); + } + + maps\mp\gametypes\_rank::registerScoreInfo( "win", 1 ); + maps\mp\gametypes\_rank::registerScoreInfo( "loss", 0.5 ); + maps\mp\gametypes\_rank::registerScoreInfo( "tie", 0.75 ); + maps\mp\gametypes\_rank::registerScoreInfo( "capture", 300 ); + maps\mp\gametypes\_rank::registerScoreInfo( "defend", 300 ); + maps\mp\gametypes\_rank::registerScoreInfo( "challenge", 2500 ); + level.maxRank = int( tablelookup( "mp/rankTable.csv", 0, "maxrank", 1 ) ); + level.maxPrestige = int( tablelookup( "mp/rankIconTable.csv", 0, "maxprestige", 1 ) ); + var_0 = 0; + var_1 = 0; + + for ( var_0 = 0; var_0 <= min( 10, level.maxPrestige ); var_0++ ) + { + for ( var_1 = 0; var_1 <= level.maxRank; var_1++ ) + precacheshader( tablelookup( "mp/rankIconTable.csv", 0, var_1, var_0 + 1 ) ); + } + + var_2 = 0; + + for ( var_3 = tablelookup( "mp/ranktable.csv", 0, var_2, 1 ); isdefined( var_3 ) && var_3 != ""; var_3 = tablelookup( "mp/ranktable.csv", 0, var_2, 1 ) ) + { + level.rankTable[var_2][1] = tablelookup( "mp/ranktable.csv", 0, var_2, 1 ); + level.rankTable[var_2][2] = tablelookup( "mp/ranktable.csv", 0, var_2, 2 ); + level.rankTable[var_2][3] = tablelookup( "mp/ranktable.csv", 0, var_2, 3 ); + level.rankTable[var_2][7] = tablelookup( "mp/ranktable.csv", 0, var_2, 7 ); + precachestring( tablelookupistring( "mp/ranktable.csv", 0, var_2, 16 ) ); + var_2++; + } + + var_4 = int( tablelookup( "mp/weaponRankTable.csv", 0, "maxrank", 1 ) ); + + for ( var_5 = 0; var_5 < var_4 + 1; var_5++ ) + { + level.weaponRankTable[var_5][1] = tablelookup( "mp/weaponRankTable.csv", 0, var_5, 1 ); + level.weaponRankTable[var_5][2] = tablelookup( "mp/weaponRankTable.csv", 0, var_5, 2 ); + level.weaponRankTable[var_5][3] = tablelookup( "mp/weaponRankTable.csv", 0, var_5, 3 ); + } + + maps\mp\gametypes\_missions::buildChallegeInfo(); + level thread maps\mp\gametypes\_rank::patientZeroWaiter(); + level thread maps\mp\gametypes\_rank::onPlayerConnect(); +} + +getSpawnpoint_NearTeam( var_0, var_1 ) +{ + if ( !isdefined( var_0 ) ) + return undefined; + + maps\mp\gametypes\_spawnlogic::Spawnlogic_Begin(); + maps\mp\gametypes\_spawnlogic::initWeights( var_0 ); + var_2 = 2; + var_3 = self.team; + var_4 = maps\mp\_utility::getOtherTeam( var_3 ); + var_5 = getentarray( "care_package", "targetname" ); + + foreach ( var_7 in var_0 ) + { + if ( var_7.numPlayersAtLastUpdate > 0 ) + { + var_8 = var_7.weightedDistSum[var_3]; + var_9 = var_7.distSum[var_4]; + var_7.weight = ( var_9 - var_2 * var_8 ) / var_7.numPlayersAtLastUpdate; + + if ( isdefined( level.favorCloseSpawnEnt ) ) + { + if ( !isdefined( level.favorCloseSpawnScalar ) ) + level.favorCloseSpawnScalar = 1; + + var_10 = distance( var_7.origin, level.favorCloseSpawnEnt.origin ); + var_7.weight = var_7.weight - var_10 * level.favorCloseSpawnScalar; + } + + if ( isdefined( level.favorclosespawnentattacker ) ) + { + if ( !isdefined( level.favorclosespawnscalarattacker ) ) + level.favorclosespawnscalarattacker = 1; + + var_10 = distance( var_7.origin, level.favorclosespawnentattacker.origin ); + var_7.weight = var_7.weight - var_10 * level.favorclosespawnscalarattacker; + } + + if ( isdefined( level.favorclosespawnentdefender ) ) + { + if ( !isdefined( level.favorclosespawnscalardefender ) ) + level.favorclosespawnscalardefender = 1; + + var_10 = distance( var_7.origin, level.favorclosespawnentdefender.origin ); + var_7.weight = var_7.weight - var_10 * level.favorclosespawnscalardefender; + } + } + else + var_7.weight = 0; + + if ( var_5.size && !canspawn( var_7.origin ) ) + var_7.weight = var_7.weight - 500000; + } + + favor_weight = getDVarInt( "scr_spawnpointfavorweight" ); + + if ( favor_weight == 0 ) + favor_weight = 50000; + + if ( isdefined( var_1 ) ) + { + for ( var_12 = 0; var_12 < var_1.size; var_12++ ) + var_1[var_12].weight = var_1[var_12].weight + favor_weight; + } + + if ( isdefined( self.predictedSpawnPoint ) && isdefined( self.predictedSpawnPoint.weight ) ) + self.predictedSpawnPoint.weight = self.predictedSpawnPoint.weight + 100; + + maps\mp\gametypes\_spawnlogic::avoidSameSpawn(); + maps\mp\gametypes\_spawnlogic::avoidWeaponDamage( var_0 ); + maps\mp\gametypes\_spawnlogic::avoidVisibleEnemies( var_0, 1 ); + + if ( isdefined( self.lastDeathPos ) && level.gameType != "dom" ) + maps\mp\gametypes\_spawnlogic::avoidRevengeSpawn( var_0, self.lastDeathPos ); + + var_13 = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Final( var_0 ); + return var_13; +} + +doPrintDamage( dmg, hitloc, flags ) +{ + huddamage = newclienthudelem( self ); + huddamage.alignx = "center"; + huddamage.horzalign = "center"; + huddamage.x = 10; + huddamage.y = 235; + huddamage.fontscale = 1.6; + huddamage.font = "objective"; + huddamage setvalue( dmg ); + + if ( ( flags & level.iDFLAGS_RADIUS ) != 0 ) + huddamage.color = ( 0.25, 0.25, 0.25 ); + + if ( ( flags & level.iDFLAGS_PENETRATION ) != 0 ) + huddamage.color = ( 1, 1, 0.25 ); + + if ( hitloc == "head" ) + huddamage.color = ( 1, 0.25, 0.25 ); + + huddamage moveovertime( 1 ); + huddamage fadeovertime( 1 ); + huddamage.alpha = 0; + huddamage.x = randomIntRange( 25, 70 ); + + val = 1; + + if ( randomInt( 2 ) ) + val = -1; + + huddamage.y = 235 + randomIntRange( 25, 70 ) * val; + + wait 1; + + huddamage destroy(); +} + +finishPlayerDamageWrapper( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ) +{ + if ( isDefined( level.allowPrintDamage ) && level.allowPrintDamage ) + { + if ( isDefined( var_1 ) && isPlayer( var_1 ) && isDefined( var_1.printDamage ) && var_1.printDamage ) + var_1 thread doPrintDamage( var_2, var_8, var_3 ); + else if ( isDefined( var_1.owner ) && isPlayer( var_1.owner ) && isDefined( var_1.owner.printDamage ) && var_1.owner.printDamage ) + var_1.owner thread doPrintDamage( var_2, var_8, var_3 ); + } + + if ( maps\mp\_utility::isUsingRemote() && var_2 >= self.health && !( var_3 & level.iDFLAGS_STUN ) ) + { + if ( !isdefined( var_7 ) ) + var_7 = ( 0, 0, 0 ); + + if ( !isdefined( var_1 ) && !isdefined( var_0 ) ) + { + var_1 = self; + var_0 = var_1; + } + + maps\mp\gametypes\_damage::PlayerKilled_internal( var_0, var_1, self, var_2, var_4, var_5, var_7, var_8, var_9, 0, 1 ); + } + else + { + if ( !maps\mp\gametypes\_damage::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; + + self finishplayerdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 ); + } + + if ( var_4 == "MOD_EXPLOSIVE_BULLET" ) + self shellshock( "damage_mp", getdvarfloat( "scr_csmode" ) ); + + maps\mp\gametypes\_damage::damageShellshockAndRumble( var_0, var_5, var_4, var_2, var_3, var_1 ); +} + +giveAllPerks() +{ + var_0 = []; + var_0[var_0.size] = "specialty_longersprint"; + var_0[var_0.size] = "specialty_fastreload"; + var_0[var_0.size] = "specialty_scavenger"; + var_0[var_0.size] = "specialty_blindeye"; + var_0[var_0.size] = "specialty_paint"; + var_0[var_0.size] = "specialty_hardline"; + var_0[var_0.size] = "specialty_coldblooded"; + var_0[var_0.size] = "specialty_quickdraw"; + var_0[var_0.size] = "_specialty_blastshield"; + var_0[var_0.size] = "specialty_detectexplosive"; + var_0[var_0.size] = "specialty_autospot"; + var_0[var_0.size] = "specialty_bulletaccuracy"; + var_0[var_0.size] = "specialty_quieter"; + var_0[var_0.size] = "specialty_stalker"; + var_0[var_0.size] = "specialty_marksman"; + var_0[var_0.size] = "specialty_sharp_focus"; + var_0[var_0.size] = "specialty_longerrange"; + var_0[var_0.size] = "specialty_fastermelee"; + var_0[var_0.size] = "specialty_reducedsway"; + var_0[var_0.size] = "specialty_lightweight"; + + // patch_mp removed these? why + var_0[ var_0.size ] = "specialty_bulletpenetration"; + var_0[ var_0.size ] = "specialty_holdbreathwhileads"; + + // too op? + var_0[ var_0.size ] = "specialty_moredamage"; + + foreach ( var_2 in var_0 ) + { + if ( !maps\mp\_utility::_hasPerk( var_2 ) ) + { + maps\mp\_utility::givePerk( var_2, 0 ); + + if ( maps\mp\gametypes\_class::isPerkUpgraded( var_2 ) ) + { + var_3 = tablelookup( "mp/perktable.csv", 1, var_2, 8 ); + maps\mp\_utility::givePerk( var_3, 0 ); + } + } + } +} + +handleScavengerBagPickup( var_0 ) +{ + self endon( "death" ); + level endon( "game_ended" ); + self waittill( "scavenger", var_1 ); + var_1 notify( "scavenger_pickup" ); + var_1 playlocalsound( "scavenger_pack_pickup" ); + var_2 = var_1 getweaponslistoffhands(); + + foreach ( var_4 in var_2 ) + { + var_5 = var_1 getweaponammoclip( var_4 ); + var_1 setweaponammoclip( var_4, var_5 + 1 ); + } + + var_7 = var_1 getweaponslistprimaries(); + + foreach ( var_9 in var_7 ) + { + var_10 = var_1 getweaponammostock( var_9 ); + var_11 = weaponclipsize( var_9 ); + var_1 setweaponammostock( var_9, var_10 + var_11 ); + } + + var_1 maps\mp\gametypes\_damagefeedback::updateDamageFeedback( "scavenger" ); +} + onPlayerConnect() { - for (;;) + for ( ;; ) { - level waittill("connected", player); + level waittill( "connected", player ); player thread onChangeKit(); } @@ -20,20 +472,20 @@ onPlayerConnect() watchNuke() { - setDvar("scr_spawnpointfavorweight", ""); + setDvar( "scr_spawnpointfavorweight", "" ); level waittill( "nuke_death" ); - setDvar("scr_spawnpointfavorweight", "499999"); + setDvar( "scr_spawnpointfavorweight", "499999" ); } onChangeKit() { - self endon("disconnect"); + self endon( "disconnect" ); self.printDamage = true; - for (;;) + for ( ;; ) { - self waittill("changed_kit"); + self waittill( "changed_kit" ); self thread watchNotifyKSMessage(); } @@ -41,22 +493,22 @@ onChangeKit() watchNotifyKSMessage() { - self endon("disconnect"); - self endon("changed_kit"); + self endon( "disconnect" ); + self endon( "changed_kit" ); - for (lastKs = self.pers["cur_kill_streak_for_nuke"];;) + for ( lastKs = self.pers["cur_kill_streak_for_nuke"];; ) { wait 0.05; - for (curStreak = lastKs + 1; curStreak <= self.pers["cur_kill_streak_for_nuke"]; curStreak++) + for ( curStreak = lastKs + 1; curStreak <= self.pers["cur_kill_streak_for_nuke"]; curStreak++ ) { //if (curStreak == 5) // continue; - if (curStreak % 5 != 0) + if ( curStreak % 5 != 0 ) continue; - self thread streakNotify(curStreak); + self thread streakNotify( curStreak ); } lastKs = self.pers["cur_kill_streak_for_nuke"]; @@ -69,7 +521,7 @@ streakNotify( streakVal ) notifyData = spawnStruct(); - if (level.killstreakPrint > 1) + if ( level.killstreakPrint > 1 ) { xpReward = streakVal * 100; @@ -82,8 +534,8 @@ streakNotify( streakVal ) notifyData.titleLabel = &"MP_KILLSTREAK_N"; notifyData.titleText = streakVal; - + self maps\mp\gametypes\_hud_message::notifyMessage( notifyData ); - + iprintln( &"RANK_KILL_STREAK_N", self, streakVal ); } diff --git a/raw/scripts/spawnTest.gsc b/raw/scripts/spawnTest.gsc deleted file mode 100644 index d7bacf0..0000000 --- a/raw/scripts/spawnTest.gsc +++ /dev/null @@ -1,71 +0,0 @@ -init() -{ - if ( getDvarInt( "spawnpoints_test" ) ) - level thread doSpawnPointTest(); -} - -drawNoSight(sp) -{ - newdeathicon = newHudElem(); - newdeathicon.x = sp.origin[0]; - newdeathicon.y = sp.origin[1]; - newdeathicon.z = sp.origin[2] + 32; - newdeathicon.alpha = .61; - newdeathicon.archived = true; - newdeathicon setShader( "headicon_dead", 5, 5 ); - newdeathicon setwaypoint( true, false ); - - if (isDefined(sp.wp)) - sp.wp destroy(); - - sp.wp = newdeathicon; -} - -drawSight(sp) -{ - newdeathicon = newHudElem(); - newdeathicon.x = sp.origin[0]; - newdeathicon.y = sp.origin[1]; - newdeathicon.z = sp.origin[2] + 32; - newdeathicon.alpha = .61; - newdeathicon.archived = true; - newdeathicon setShader( "rank_prestige1", 5, 5 ); - newdeathicon setwaypoint( true, false ); - - if (isDefined(sp.wp)) - sp.wp destroy(); - - sp.wp = newdeathicon; -} - -doSpawnPointTest() -{ - for ( ;; ) - { - wait 0.05; - - if ( !isdefined( level.spawnpoints ) ) - return; - - for (i = 0; i < level.spawnpoints.size; i++) - { - spawnpoint = level.spawnpoints[i]; - - sight = false; - - if (level.teamBased) - { - sight = (spawnpoint.sights["axis"] > 0); - if (!sight) - sight = (spawnpoint.sights["allies"] > 0); - } - else - sight = (spawnpoint.sights > 0); - - if (!sight) - drawNoSight(spawnpoint); - else - drawSight(spawnpoint); - } - } -}