Advertisement
Guest User

Damage.gsc Gingaman

a guest
Dec 15th, 2014
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 83.27 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include maps\mp\gametypes\_hud_util;
  3. #include common_scripts\utility;
  4. #include _settings;
  5.  
  6. isSwitchingTeams()
  7. {
  8. if ( isDefined( self.switching_teams ) )
  9. return true;
  10.  
  11. return false;
  12. }
  13.  
  14.  
  15. isTeamSwitchBalanced()
  16. {
  17. playerCounts = self maps\mp\gametypes\_teams::CountPlayers();
  18. playerCounts[ self.leaving_team ]--;
  19. playerCounts[ self.joining_team ]++;
  20.  
  21. return( ( playerCounts[ self.joining_team ] - playerCounts[ self.leaving_team ] ) < 2 );
  22. }
  23.  
  24.  
  25. isFriendlyFire( victim, attacker )
  26. {
  27. if ( !level.teamBased )
  28. return false;
  29.  
  30. if ( !isDefined( attacker ) )
  31. return false;
  32.  
  33. if ( !isPlayer( attacker ) && !isDefined( attacker.team ) )
  34. return false;
  35.  
  36. if ( victim.team != attacker.team )
  37. return false;
  38.  
  39. if ( victim == attacker )
  40. return false;
  41.  
  42. return true;
  43. }
  44.  
  45.  
  46. killedSelf( attacker )
  47. {
  48. if ( !isPlayer( attacker ) )
  49. return false;
  50.  
  51. if ( attacker != self )
  52. return false;
  53.  
  54. return true;
  55. }
  56.  
  57.  
  58. isHeadShot( sWeapon, sHitLoc, sMeansOfDeath, attacker )
  59. {
  60. if ( isDefined( attacker ) )
  61. {
  62. if ( attacker.code_classname == "script_vehicle" && isDefined( attacker.owner ) )
  63. return false;
  64. if ( attacker.code_classname == "misc_turret" && isDefined( attacker.owner ) )
  65. return false;
  66. if ( attacker.code_classname == "script_model" && isDefined( attacker.owner ) )
  67. return false;
  68. }
  69.  
  70. return( sHitLoc == "head" || sHitLoc == "helmet" ) && sMeansOfDeath != "MOD_MELEE" && sMeansOfDeath != "MOD_IMPACT" && !isMG( sWeapon );
  71. }
  72.  
  73.  
  74. handleTeamChangeDeath()
  75. {
  76. if ( !level.teamBased )
  77. return;
  78.  
  79.  
  80. assert( self.leaving_team != self.joining_team );
  81.  
  82. if ( self.joining_team == "spectator" || !isTeamSwitchBalanced() )
  83. {
  84. self thread [[ level.onXPEvent ]]( "suicide" );
  85. self incPersStat( "suicides", 1 );
  86. self.suicides = self getPersStat( "suicides" );
  87. }
  88. }
  89.  
  90.  
  91. handleWorldDeath( attacker, lifeId, sMeansOfDeath, sHitLoc )
  92. {
  93. if ( !isDefined( attacker ) )
  94. return;
  95.  
  96. if ( !isDefined( attacker.team ) )
  97. {
  98. handleSuicideDeath( sMeansOfDeath, sHitLoc );
  99. return;
  100. }
  101.  
  102. assert( attacker.team == "axis" || attacker.team == "allies" );
  103.  
  104. if ( level.teamBased && attacker.team != self.team )
  105. {
  106. if ( isDefined( level.onNormalDeath ) && isPlayer( attacker ) && attacker.team != "spectator" )
  107. [[ level.onNormalDeath ]]( self, attacker, lifeId );
  108. }
  109. }
  110.  
  111.  
  112. handleSuicideDeath( sMeansOfDeath, sHitLoc )
  113. {
  114. self SetCardDisplaySlot( self, 7 );
  115. self SetLowerMessage("suicide", "You killed yourself", undefined, 25);
  116.  
  117. self thread [[ level.onXPEvent ]]( "suicide" );
  118. self incPersStat( "suicides", 1 );
  119. self.suicides = self getPersStat( "suicides" );
  120.  
  121. if ( !matchMakingGame() )
  122. self incPlayerStat( "suicides", 1 );
  123.  
  124. scoreSub = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "suicidepointloss" );
  125. maps\mp\gametypes\_gamescore::_setPlayerScore( self, maps\mp\gametypes\_gamescore::_getPlayerScore( self ) - scoreSub );
  126.  
  127. if ( sMeansOfDeath == "MOD_SUICIDE" && sHitLoc == "none" && isDefined( self.throwingGrenade ) )
  128. self.lastGrenadeSuicideTime = gettime();
  129.  
  130.  
  131. if ( isDefined( self.friendlydamage ) )
  132. self iPrintLnBold( &"MP_FRIENDLY_FIRE_WILL_NOT" );
  133. self thread clearSuicide();
  134. }
  135.  
  136.  
  137. handleFriendlyFireDeath( attacker )
  138. {
  139. attacker SetCardDisplaySlot( self, 8 );
  140. self SetCardDisplaySlot( attacker, 7 );
  141. self ClearLowerMessage("youkilled");
  142. attacker ClearLowerMessage("killedby");
  143. attacker SetLowerMessage("youkilled", "You killed ^1your teammate^7 " + self.name, undefined, 30);
  144. self SetLowerMessage("killedby", "Killed by ^1your teammate^7 " + attacker.name, undefined, 30);
  145.  
  146. attacker thread [[ level.onXPEvent ]]( "teamkill" );
  147. attacker.pers[ "teamkills" ] += 1.0;
  148.  
  149. attacker.teamkillsThisRound++ ;
  150.  
  151. if ( maps\mp\gametypes\_tweakables::getTweakableValue( "team", "teamkillpointloss" ) )
  152. {
  153. scoreSub = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" );
  154. maps\mp\gametypes\_gamescore::_setPlayerScore( attacker, maps\mp\gametypes\_gamescore::_getPlayerScore( attacker ) - scoreSub );
  155. }
  156. attacker thread clearYouKilled();
  157. self thread clearKilledBy();
  158. if ( level.maxAllowedTeamkills < 0 )
  159. return;
  160.  
  161. if ( level.inGracePeriod )
  162. {
  163. teamKillDelay = 1;
  164. attacker.pers["teamkills"] += level.maxAllowedTeamkills;
  165. }
  166. else if ( attacker.pers[ "teamkills" ] > 1 && getTimePassed() < ( (level.gracePeriod * 1000) + 8000 + ( attacker.pers[ "teamkills" ] * 1000 ) ) )
  167. {
  168. teamKillDelay = 1;
  169. attacker.pers["teamkills"] += level.maxAllowedTeamkills;
  170. }
  171. else
  172. {
  173. teamKillDelay = attacker maps\mp\gametypes\_playerlogic::TeamKillDelay();
  174. }
  175.  
  176. if ( teamKillDelay > 0 )
  177. {
  178. attacker.pers["teamKillPunish"] = true;
  179. attacker _suicide();
  180. }
  181. }
  182.  
  183.  
  184. handleNormalDeath( lifeId, attacker, eInflictor, sWeapon, sMeansOfDeath )
  185. {
  186. attacker thread maps\mp\_events::killedPlayer( lifeId, self, sWeapon, sMeansOfDeath );
  187.  
  188. self ClearLowerMessage("youkilled");
  189. attacker ClearLowerMessage("killedby");
  190. attacker SetLowerMessage("youkilled", "You killed " + self.name, undefined, 30);
  191. self SetLowerMessage("killedby", "Killed by " + attacker.name, undefined, 30);
  192.  
  193. attacker SetCardDisplaySlot( self, 8 );
  194. self SetCardDisplaySlot( attacker, 7 );
  195.  
  196. if ( sMeansOfDeath == "MOD_HEAD_SHOT" )
  197. {
  198. attacker incPersStat( "headshots", 1 );
  199. attacker.headshots = attacker getPersStat( "headshots" );
  200. attacker incPlayerStat( "headshots", 1 );
  201.  
  202. if ( isDefined( attacker.lastStand ) )
  203. value = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" ) * 1;
  204. else
  205. value = undefined;
  206.  
  207. attacker playLocalSound( "bullet_impact_headshot_2" );
  208. }
  209. else
  210. {
  211. if ( isDefined( attacker.lastStand ) )
  212. value = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" ) * 1;
  213. else
  214. value = undefined;
  215. }
  216.  
  217. attacker thread maps\mp\gametypes\_rank::giveRankXP( "kill", value );
  218.  
  219. attacker incPersStat( "kills", 1 );
  220. attacker.kills = attacker getPersStat( "kills" );
  221. attacker updatePersRatio( "kdRatio", "kills", "deaths" );
  222. attacker maps\mp\gametypes\_persistence::statSetChild( "round", "kills", attacker.kills );
  223. attacker incPlayerStat( "kills", 1 );
  224.  
  225. if ( isFlankKill( self, attacker ) )
  226. {
  227. attacker incPlayerStat( "flankkills", 1 );
  228.  
  229. self incPlayerStat( "flankdeaths", 1 );
  230. }
  231.  
  232. lastKillStreak = attacker.pers["cur_kill_streak"];
  233.  
  234. self.pers["copyCatLoadout"] = undefined;
  235.  
  236. if ( self _hasPerk( "specialty_copycat" ) )
  237. self.pers["copyCatLoadout"] = attacker maps\mp\gametypes\_class::cloneLoadout();
  238.  
  239. if ( isAlive( attacker ) )
  240. {
  241. attacker.pers["cur_kill_streak"]++;
  242.  
  243. attacker setPlayerStatIfGreater( "killstreak", attacker.pers["cur_kill_streak"] );
  244.  
  245. if ( attacker.pers["cur_kill_streak"] > attacker getPersStat( "longestStreak" ) )
  246. attacker setPersStat( "longestStreak", attacker.pers["cur_kill_streak"] );
  247. }
  248.  
  249. attacker.pers["cur_death_streak"] = 0;
  250.  
  251. if ( attacker.pers["cur_kill_streak"] > attacker maps\mp\gametypes\_persistence::statGetChild( "round", "killStreak" ) )
  252. {
  253. attacker maps\mp\gametypes\_persistence::statSetChild( "round", "killStreak", attacker.pers["cur_kill_streak"] );
  254. }
  255.  
  256. if ( attacker.pers["cur_kill_streak"] > attacker.kill_streak )
  257. {
  258. attacker maps\mp\gametypes\_persistence::statSet( "killStreak", attacker.pers["cur_kill_streak"] );
  259. attacker.kill_streak = attacker.pers["cur_kill_streak"];
  260. }
  261.  
  262. maps\mp\gametypes\_gamescore::givePlayerScore( "kill", attacker, self );
  263. maps\mp\_skill::processKill( attacker, self );
  264. attacker thread clearYouKilled();
  265. self thread clearKilledBy();
  266. scoreSub = maps\mp\gametypes\_tweakables::getTweakableValue( "game", "deathpointloss" );
  267. maps\mp\gametypes\_gamescore::_setPlayerScore( self, maps\mp\gametypes\_gamescore::_getPlayerScore( self ) - scoreSub );
  268.  
  269.  
  270.  
  271. level notify ( "player_got_killstreak_" + attacker.pers["cur_kill_streak"], attacker );
  272.  
  273.  
  274. attacker notify ( "killed_enemy" );
  275.  
  276. if ( !level.teamBased )
  277. {
  278. self.attackers = [];
  279. return;
  280. }
  281.  
  282. if ( isDefined( level.onNormalDeath ) && attacker.pers[ "team" ] != "spectator" )
  283. [[ level.onNormalDeath ]]( self, attacker, lifeId );
  284.  
  285. level thread maps\mp\gametypes\_battlechatter_mp::sayLocalSoundDelayed( attacker, "kill", 0.75 );
  286.  
  287. if ( isDefined( self.lastAttackedShieldPlayer ) && isDefined( self.lastAttackedShieldTime ) && self.lastAttackedShieldPlayer != attacker )
  288. {
  289. if ( getTime() - self.lastAttackedShieldTime < 2500 )
  290. {
  291. self.lastAttackedShieldPlayer thread maps\mp\gametypes\_gamescore::processShieldAssist( self );
  292. }
  293. else if ( isAlive( self.lastAttackedShieldPlayer ) && getTime() - self.lastAttackedShieldTime < 5000 )
  294. {
  295. forwardVec = vectorNormalize( anglesToForward( self.angles ) );
  296. shieldVec = vectorNormalize( self.lastAttackedShieldPlayer.origin - self.origin );
  297.  
  298. if ( vectorDot( shieldVec, forwardVec ) > 0.925 )
  299. self.lastAttackedShieldPlayer thread maps\mp\gametypes\_gamescore::processShieldAssist( self );
  300. }
  301. }
  302.  
  303. if ( isDefined( self.attackers ) )
  304. {
  305. foreach ( player in self.attackers )
  306. {
  307. if ( !isDefined( player ) )
  308. continue;
  309.  
  310. if ( player == attacker )
  311. continue;
  312.  
  313. player thread maps\mp\gametypes\_gamescore::processAssist( self );
  314. }
  315. self.attackers = [];
  316. }
  317. }
  318.  
  319. isPlayerWeapon( weaponName )
  320. {
  321. if ( weaponClass( weaponName ) == "non-player" )
  322. return false;
  323.  
  324. if ( weaponClass( weaponName ) == "turret" )
  325. return false;
  326.  
  327. if ( weaponInventoryType( weaponName ) == "primary" || weaponInventoryType( weaponName ) == "altmode" )
  328. return true;
  329.  
  330. return false;
  331. }
  332.  
  333. Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
  334. {
  335. PlayerKilled_internal( eInflictor, attacker, self, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration, false );
  336. }
  337.  
  338.  
  339. QueueShieldForRemoval( shield )
  340. {
  341. MY_MAX_SHIELDS_AT_A_TIME = 5;
  342.  
  343. if ( !isDefined( level.shieldTrashArray ) )
  344. level.shieldTrashArray = [];
  345.  
  346. if ( level.shieldTrashArray.size >= MY_MAX_SHIELDS_AT_A_TIME )
  347. {
  348. idxMax = (level.shieldTrashArray.size - 1);
  349. level.shieldTrashArray[0] delete();
  350. for ( idx = 0; idx < idxMax; idx++ )
  351. level.shieldTrashArray[idx] = level.shieldTrashArray[idx + 1];
  352. level.shieldTrashArray[idxMax] = undefined;
  353. }
  354.  
  355. level.shieldTrashArray[level.shieldTrashArray.size] = shield;
  356. }
  357.  
  358.  
  359. LaunchShield( damage, meansOfDeath )
  360. {
  361. shieldModel = "weapon_riot_shield_mp";
  362.  
  363. self DetachShieldModel( shieldModel, "tag_weapon_left" );
  364. self.hasRiotShield = false;
  365. self.hasRiotShieldEquipped = false;
  366. }
  367.  
  368.  
  369. PlayerKilled_internal( eInflictor, attacker, victim, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration, isFauxDeath )
  370. {
  371. prof_begin( "PlayerKilled" );
  372.  
  373.  
  374. victim endon( "spawned" );
  375. victim notify( "killed_player" );
  376.  
  377. assert( victim.sessionteam != "spectator" );
  378.  
  379. if ( isDefined( attacker ) )
  380. attacker.assistedSuicide = undefined;
  381.  
  382. if ( !isDefined( victim.idFlags ) )
  383. {
  384. if ( sMeansOfDeath == "MOD_SUICIDE" )
  385. victim.idFlags = 0;
  386. else if ( sMeansOfDeath == "MOD_GRENADE" && isSubstr( sWeapon, "frag_grenade" ) && iDamage == 100000 )
  387. victim.idFlags = 0;
  388. else if ( sWeapon == "nuke_mp" )
  389. victim.idFlags = 0;
  390. else if ( level.friendlyfire >= 2)
  391. victim.idFlags = 0;
  392. else
  393. assertEx( 0, "Victims ID flags not set, but means of death was gr or nuke: " + sMeansOfDeath );
  394. }
  395.  
  396. if ( victim.hasRiotShieldEquipped )
  397. victim LaunchShield( iDamage, sMeansofDeath );
  398.  
  399. //victim thread checkForceBleedOut();
  400.  
  401.  
  402. if ( !isFauxDeath )
  403. {
  404. if ( isDefined( victim.endGame ) )
  405. {
  406. victim VisionSetNakedForPlayer( getDvar( "mapname" ), 2 );
  407. }
  408. else if ( !isDefined( victim.nuked ) )
  409. {
  410. victim VisionSetNakedForPlayer( getDvar( "mapname" ), 0 );
  411. victim ThermalVisionOff();
  412. }
  413. }
  414. else
  415. {
  416. victim.fauxDead = true;
  417. self notify ( "death" );
  418. }
  419.  
  420. if ( game[ "state" ] == "postgame" )
  421. {
  422.  
  423. prof_end( "PlayerKilled" );
  424. return;
  425. }
  426.  
  427.  
  428. deathTimeOffset = 0;
  429.  
  430. if ( !isPlayer( eInflictor ) && isDefined( eInflictor.primaryWeapon ) )
  431. sPrimaryWeapon = eInflictor.primaryWeapon;
  432. else if ( isDefined( attacker ) && isPlayer( attacker ) && attacker getCurrentPrimaryWeapon() != "none" )
  433. sPrimaryWeapon = attacker getCurrentPrimaryWeapon();
  434. else
  435. sPrimaryWeapon = undefined;
  436.  
  437. if ( isdefined( victim.useLastStandParams ) )
  438. {
  439. victim ensureLastStandParamsValidity();
  440. victim.useLastStandParams = undefined;
  441.  
  442. assert( isdefined( victim.lastStandParams ) );
  443.  
  444. eInflictor = victim.lastStandParams.eInflictor;
  445. attacker = victim.lastStandParams.attacker;
  446. iDamage = victim.lastStandParams.iDamage;
  447. sMeansOfDeath = victim.lastStandParams.sMeansOfDeath;
  448. sWeapon = victim.lastStandParams.sWeapon;
  449. sPrimaryWeapon = victim.lastStandParams.sPrimaryWeapon;
  450. vDir = victim.lastStandParams.vDir;
  451. sHitLoc = victim.lastStandParams.sHitLoc;
  452.  
  453. deathTimeOffset = ( gettime() - victim.lastStandParams.lastStandStartTime ) / 1000;
  454. victim.lastStandParams = undefined;
  455. }
  456.  
  457.  
  458.  
  459.  
  460.  
  461. if ( (!isDefined( attacker ) || attacker.classname == "trigger_hurt" || attacker.classname == "worldspawn" || attacker == victim ) && isDefined( self.attackers ) )
  462. {
  463. bestPlayer = undefined;
  464.  
  465. foreach ( player in self.attackers )
  466. {
  467. if ( !isDefined( player ) )
  468. continue;
  469.  
  470. if (! isDefined( victim.attackerData[ player.guid ].damage ) )
  471. continue;
  472.  
  473. if ( player == victim || (level.teamBased && player.team == victim.team ) )
  474. continue;
  475.  
  476. if ( victim.attackerData[ player.guid ].lasttimedamaged + 2500 < getTime() )
  477. continue;
  478.  
  479. if ( victim.attackerData[ player.guid ].damage > 1 && ! isDefined( bestPlayer ) )
  480. bestPlayer = player;
  481. else if ( isDefined( bestPlayer ) && victim.attackerData[ player.guid ].damage > victim.attackerData[ bestPlayer.guid ].damage )
  482. bestPlayer = player;
  483. }
  484.  
  485. if ( isDefined( bestPlayer ) )
  486. {
  487. attacker = bestPlayer;
  488. attacker.assistedSuicide = true;
  489. sWeapon = victim.attackerData[ bestPlayer.guid ].weapon;
  490. vDir = victim.attackerData[ bestPlayer.guid ].vDir;
  491. sHitLoc = victim.attackerData[ bestPlayer.guid ].sHitLoc;
  492. psOffsetTime = victim.attackerData[ bestPlayer.guid ].psOffsetTime;
  493. sMeansOfDeath = victim.attackerData[ bestPlayer.guid ].sMeansOfDeath;
  494. iDamage = victim.attackerData[ bestPlayer.guid ].damage;
  495. sPrimaryWeapon = victim.attackerData[ bestPlayer.guid ].sPrimaryWeapon;
  496. eInflictor = attacker;
  497. }
  498. }
  499. else
  500. {
  501. if ( isDefined( attacker ) )
  502. attacker.assistedSuicide = undefined;
  503. }
  504.  
  505. // override MOD
  506.  
  507. if ( isHeadShot( sWeapon, sHitLoc, sMeansOfDeath, attacker ) )
  508. sMeansOfDeath = "MOD_HEAD_SHOT";
  509. else if ( sMeansOfDeath != "MOD_MELEE" && !isDefined( victim.nuked ) )
  510. victim playDeathSound();
  511.  
  512. friendlyFire = isFriendlyFire( victim, attacker );
  513.  
  514. if ( isDefined( attacker ) )
  515. {
  516. // override attacker if it's a vehicle
  517.  
  518. if ( attacker.code_classname == "script_vehicle" && isDefined( attacker.owner ) )
  519. attacker = attacker.owner;
  520.  
  521. // override attacker if it's a sentry
  522.  
  523. if ( attacker.code_classname == "misc_turret" && isDefined( attacker.owner ) )
  524. attacker = attacker.owner;
  525.  
  526. // override attacker if it's a crate
  527.  
  528. if ( attacker.code_classname == "script_model" && isDefined( attacker.owner ) )
  529. {
  530. attacker = attacker.owner;
  531.  
  532. if ( !isFriendlyFire( victim, attacker ) && attacker != victim )
  533. attacker notify( "crushed_enemy" );
  534. }
  535. }
  536.  
  537. victim maps\mp\gametypes\_weapons::dropWeaponForDeath( attacker );
  538.  
  539.  
  540. if ( !isFauxDeath )
  541. {
  542. victim.sessionstate = "dead";
  543. victim.statusicon = "hud_status_dead";
  544. }
  545.  
  546. // UTS update aliveCount
  547.  
  548. victim maps\mp\gametypes\_playerlogic::removeFromAliveCount();
  549.  
  550. if ( !isDefined( victim.switching_teams ) )
  551. {
  552.  
  553. victim incPersStat( "deaths", 1 );
  554. victim.deaths = victim getPersStat( "deaths" );
  555. victim updatePersRatio( "kdRatio", "kills", "deaths" );
  556. victim maps\mp\gametypes\_persistence::statSetChild( "round", "deaths", victim.deaths );
  557. victim incPlayerStat( "deaths", 1 );
  558. }
  559.  
  560. if ( isDefined( attacker ) )
  561. attacker checkKillSteal( victim );
  562.  
  563. // obituary
  564.  
  565. obituary( victim, attacker, sWeapon, sMeansOfDeath );
  566.  
  567. doKillcam = false;
  568.  
  569. lifeId = getNextLifeId();
  570.  
  571. victim logPrintPlayerDeath( lifeId, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc );
  572. victim maps\mp\_matchdata::logPlayerLife( lifeId );
  573. victim maps\mp\_matchdata::logPlayerDeath( lifeId, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc );
  574.  
  575. if ( (sMeansOfDeath == "MOD_MELEE") )
  576. {
  577. if ( IsSubStr( sWeapon, "riotshield" ) )
  578. {
  579. attacker incPlayerStat( "shieldkills", 1 );
  580.  
  581. if ( !matchMakingGame() )
  582. victim incPlayerStat( "shielddeaths", 1 );
  583. }
  584. else
  585. attacker incPlayerStat( "knifekills", 1 );
  586. }
  587.  
  588.  
  589.  
  590.  
  591. if ( victim isSwitchingTeams() )
  592. {
  593. handleTeamChangeDeath();
  594. }
  595. else if ( !isPlayer( attacker ) || (isPlayer( attacker ) && sMeansOfDeath == "MOD_FALLING") )
  596. {
  597. handleWorldDeath( attacker, lifeId, sMeansOfDeath, sHitLoc );
  598. }
  599. else if ( attacker == victim )
  600. {
  601. handleSuicideDeath( sMeansOfDeath, sHitLoc );
  602. }
  603. else if ( friendlyFire )
  604. {
  605. if ( !isDefined( victim.nuked ) )
  606. {
  607. handleFriendlyFireDeath( attacker );
  608. }
  609. }
  610. else
  611. {
  612. if ( sMeansOfDeath == "MOD_GRENADE" && eInflictor == attacker )
  613. addAttacker( victim, attacker, eInflictor, sWeapon, iDamage, (0,0,0), vDir, sHitLoc, psOffsetTime, sMeansOfDeath );
  614.  
  615. doKillcam = true;
  616. handleNormalDeath( lifeId, attacker, eInflictor, sWeapon, sMeansOfDeath );
  617. victim thread maps\mp\gametypes\_missions::playerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc, attacker.modifiers );
  618.  
  619. victim.pers["cur_death_streak"]++;
  620.  
  621. if ( !getGametypeNumLives() && !matchMakingGame() )
  622. victim setPlayerStatIfGreater( "deathstreak", victim.pers["cur_death_streak"] );
  623. }
  624.  
  625.  
  626.  
  627.  
  628.  
  629. victim resetPlayerVariables();
  630. victim.lastAttacker = attacker;
  631. victim.lastDeathPos = victim.origin;
  632. victim.deathTime = getTime();
  633. victim.wantSafeSpawn = false;
  634. victim.revived = false;
  635. victim.sameShotDamage = 0;
  636.  
  637. if ( isFauxDeath )
  638. {
  639. doKillcam = false;
  640. deathAnimDuration = (victim PlayerForceDeathAnim( eInflictor, sMeansOfDeath, sWeapon, sHitLoc, vDir ));
  641. }
  642.  
  643. victim.body = victim clonePlayer( deathAnimDuration );
  644.  
  645. if ( isFauxDeath )
  646. victim PlayerHide();
  647.  
  648. if ( victim isOnLadder() || victim isMantling() || !victim isOnGround() || isDefined( victim.nuked ) )
  649. victim.body startRagDoll();
  650.  
  651. if ( !isDefined( victim.switching_teams ) )
  652. thread maps\mp\gametypes\_deathicons::addDeathicon( victim.body, victim, victim.team, 5.0 );
  653.  
  654. thread delayStartRagdoll( victim.body, sHitLoc, vDir, sWeapon, eInflictor, sMeansOfDeath );
  655.  
  656. // allow per gametype death handling
  657.  
  658. victim thread [[ level.onPlayerKilled ]]( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration, lifeId );
  659.  
  660. if ( isPlayer( attacker ) )
  661. attackerNum = attacker getEntityNumber();
  662. else
  663. attackerNum = -1;
  664. killcamentity = victim getKillcamEntity( attacker, eInflictor, sWeapon );
  665. killcamentityindex = -1;
  666. killcamentitystarttime = 0;
  667.  
  668. if ( isDefined( killcamentity ) )
  669. {
  670. killcamentityindex = killcamentity getEntityNumber();
  671. killcamentitystarttime = killcamentity.birthtime;
  672. if ( !isdefined( killcamentitystarttime ) )
  673. killcamentitystarttime = 0;
  674. }
  675.  
  676. /#
  677. if ( getDvarInt( "scr_forcekillcam" ) != 0 )
  678. doKillcam = true;
  679. #/
  680. if ( isDefined( attacker.finalKill ) )
  681. maps\mp\_awards::addAwardWinner( "finalkill", attacker.clientid );
  682.  
  683.  
  684.  
  685.  
  686. if ( isDefined( attacker.finalKill ) && doKillcam && !isDefined( level.nukeDetonated ) && level.allowWinningKC )
  687. {
  688. level thread doFinalKillcam( 5.0, victim, attacker, attackerNum, killcamentityindex, killcamentitystarttime, sWeapon, deathTimeOffset, psOffsetTime );
  689.  
  690. if ( !isFauxDeath )
  691. wait ( 1.0 );
  692. }
  693.  
  694. if ( !isFauxDeath )
  695. {
  696. if ( !level.showingFinalKillcam && !level.killcam && doKillcam )
  697. {
  698. if ( victim _hasPerk( "specialty_copycat" ) && isDefined( victim.pers["copyCatLoadout"] ) )
  699. {
  700. victim thread maps\mp\gametypes\_killcam::waitDeathCopyCatButton( attacker );
  701. wait ( 1.0 );
  702. }
  703. }
  704.  
  705.  
  706. wait( 0.25 );
  707. victim thread maps\mp\gametypes\_killcam::cancelKillCamOnUse();
  708. wait( 0.25 );
  709.  
  710. self.respawnTimerStartTime = gettime() + 1000;
  711. timeUntilSpawn = maps\mp\gametypes\_playerlogic::TimeUntilSpawn( true );
  712. if ( timeUntilSpawn < 1 )
  713. timeUntilSpawn = 1;
  714. victim thread maps\mp\gametypes\_playerlogic::predictAboutToSpawnPlayerOverTime( timeUntilSpawn );
  715.  
  716. wait( 1.0 );
  717. victim notify( "death_delay_finished" );
  718. }
  719.  
  720. postDeathDelay = ( getTime() - victim.deathTime ) / 1000;
  721. self.respawnTimerStartTime = gettime();
  722.  
  723. if ( !(isDefined( victim.cancelKillcam) && victim.cancelKillcam) && doKillcam && level.killcam && game[ "state" ] == "playing" && !victim isUsingRemote() && !level.showingFinalKillcam )
  724. {
  725. livesLeft = !( getGametypeNumLives() && !victim.pers[ "lives" ] );
  726. timeUntilSpawn = maps\mp\gametypes\_playerlogic::TimeUntilSpawn( true );
  727. willRespawnImmediately = livesLeft && ( timeUntilSpawn <= 0 );
  728.  
  729. if ( !livesLeft )
  730. timeUntilSpawn = -1;
  731.  
  732. victim maps\mp\gametypes\_killcam::killcam( attackerNum, killcamentityindex, killcamentitystarttime, sWeapon, postDeathDelay + deathTimeOffset, psOffsetTime, timeUntilSpawn, maps\mp\gametypes\_gamelogic::timeUntilRoundEnd(), attacker, victim );
  733. }
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740. if ( game[ "state" ] != "playing" )
  741. {
  742. if ( !level.showingFinalKillcam )
  743. {
  744. victim.sessionstate = "dead";
  745. victim ClearKillcamState();
  746. }
  747.  
  748.  
  749. prof_end( "PlayerKilled" );
  750. return;
  751. }
  752.  
  753.  
  754. if ( isValidClass( victim.class ) )
  755. {
  756. victim thread maps\mp\gametypes\_playerlogic::spawnClient();
  757. }
  758.  
  759.  
  760. prof_end( "PlayerKilled" );
  761. }
  762.  
  763. checkForceBleedout()
  764. {
  765. if ( level.dieHardMode != 1 )
  766. return false;
  767.  
  768. if ( !getGametypeNumLives() )
  769. return false;
  770.  
  771. if ( level.livesCount[self.team] > 0 )
  772. return false;
  773.  
  774. foreach ( player in level.players )
  775. {
  776. if ( !isAlive( player ) )
  777. continue;
  778.  
  779. if ( player.team != self.team )
  780. continue;
  781.  
  782. if ( player == self )
  783. continue;
  784.  
  785. if ( !player.inLastStand )
  786. return false;
  787. }
  788.  
  789. foreach ( player in level.players )
  790. {
  791. if ( !isAlive( player ) )
  792. continue;
  793.  
  794. if ( player.team != self.team )
  795. continue;
  796.  
  797. if ( player.inLastStand && player != self )
  798. player lastStandBleedOut(false);
  799. }
  800.  
  801. return true;
  802. }
  803.  
  804. checkKillSteal( vic )
  805. {
  806. if ( matchMakingGame() )
  807. return;
  808.  
  809. greatestDamage = 0;
  810. greatestAttacker = undefined;
  811.  
  812. if ( isDefined( vic.attackerdata ) && vic.attackerdata.size > 1 )
  813. {
  814. foreach ( attacker in vic.attackerdata )
  815. {
  816. if ( attacker.damage > greatestDamage )
  817. {
  818. greatestDamage = attacker.damage;
  819. greatestAttacker = attacker.attackerEnt;
  820. }
  821. }
  822.  
  823. if ( isDefined( greatestAttacker ) && greatestAttacker != self )
  824. self incPlayerStat( "killsteals", 1 );
  825. }
  826. }
  827.  
  828. doFinalKillcam( delay, victim, attacker, attackerNum, killcamentityindex, killcamentitystarttime, sWeapon, deathTimeOffset, psOffsetTime )
  829. {
  830. level.showingFinalKillcam = true;
  831.  
  832. level waittill ( "round_end_finished" );
  833.  
  834. if ( !isDefined( victim ) || !isDefined( attacker ) )
  835. {
  836. level.showingFinalKillcam = false;
  837. return;
  838. }
  839.  
  840. postDeathDelay = (( getTime() - victim.deathTime ) / 1000);
  841.  
  842. foreach ( player in level.players )
  843. {
  844. player closePopupMenu();
  845. player closeInGameMenu();
  846. player VisionSetNakedForPlayer( getDvar( "mapname" ), 0 );
  847. player.killcamentitylookat = victim getEntityNumber();
  848.  
  849. if ( (player != victim || (!isRoundBased() || isLastRound())) && player _hasPerk( "specialty_copycat" ) )
  850. player _unsetPerk( "specialty_copycat" );
  851.  
  852. player thread maps\mp\gametypes\_killcam::killcam( attackerNum, killcamentityindex, killcamentitystarttime, sWeapon, postDeathDelay + deathTimeOffset, psOffsetTime, 0, 10000, attacker, victim );
  853. }
  854.  
  855. wait( 0.1 );
  856.  
  857. while ( anyPlayersInKillcam() )
  858. wait( 0.05 );
  859.  
  860. level.showingFinalKillcam = false;
  861. }
  862.  
  863.  
  864. anyPlayersInKillcam()
  865. {
  866. foreach ( player in level.players )
  867. {
  868. if ( isDefined( player.killcam ) )
  869. return true;
  870. }
  871.  
  872. return false;
  873. }
  874.  
  875.  
  876. resetPlayerVariables()
  877. {
  878. self.killedPlayersCurrent = [];
  879. self.switching_teams = undefined;
  880. self.joining_team = undefined;
  881. self.leaving_team = undefined;
  882.  
  883. self.pers["cur_kill_streak"] = 0;
  884.  
  885. self maps\mp\gametypes\_gameobjects::detachUseModels();
  886. }
  887.  
  888.  
  889. getKillcamEntity( attacker, eInflictor, sWeapon )
  890. {
  891. if ( !isDefined( eInflictor ) )
  892. return undefined;
  893.  
  894. if ( eInflictor == attacker )
  895. return undefined;
  896.  
  897. if ( isSubStr( sWeapon, "ac130_" ) )
  898. return undefined;
  899.  
  900. if ( sWeapon == "cobra_player_minigun_mp" )
  901. return undefined;
  902.  
  903. if ( sWeapon == "artillery_mp" || sWeapon == "stealth_bomb_mp" || sWeapon == "pavelow_minigun_mp" )
  904. return eInflictor.killCamEnt;
  905.  
  906. if ( isDefined( eInflictor.script_gameobjectname ) && eInflictor.script_gameobjectname == "bombzone" )
  907. return eInflictor.killCamEnt;
  908.  
  909. if ( eInflictor.classname == "script_origin" || eInflictor.classname == "script_model" || eInflictor.classname == "script_brushmodel" )
  910. return undefined;
  911.  
  912. if ( issubstr( sWeapon, "remotemissile_" ) )
  913. return undefined;
  914. if ( issubstr( sWeapon, "ac130_" ) )
  915. return undefined;
  916.  
  917. return eInflictor;
  918. }
  919.  
  920.  
  921. HitlocDebug( attacker, victim, damage, hitloc, dflags )
  922. {
  923. colors = [];
  924. colors[ 0 ] = 2;
  925. colors[ 1 ] = 3;
  926. colors[ 2 ] = 5;
  927. colors[ 3 ] = 7;
  928.  
  929. if ( !getdvarint( "scr_hitloc_debug" ) )
  930. return;
  931.  
  932. if ( !isdefined( attacker.hitlocInited ) )
  933. {
  934. for ( i = 0; i < 6; i++ )
  935. {
  936. attacker setClientDvar( "ui_hitloc_" + i, "" );
  937. }
  938. attacker.hitlocInited = true;
  939. }
  940.  
  941. if ( level.splitscreen || !isPLayer( attacker ) )
  942. return;
  943.  
  944. elemcount = 6;
  945. if ( !isdefined( attacker.damageInfo ) )
  946. {
  947. attacker.damageInfo = [];
  948. for ( i = 0; i < elemcount; i++ )
  949. {
  950. attacker.damageInfo[ i ] = spawnstruct();
  951. attacker.damageInfo[ i ].damage = 0;
  952. attacker.damageInfo[ i ].hitloc = "";
  953. attacker.damageInfo[ i ].bp = false;
  954. attacker.damageInfo[ i ].jugg = false;
  955. attacker.damageInfo[ i ].colorIndex = 0;
  956. }
  957. attacker.damageInfoColorIndex = 0;
  958. attacker.damageInfoVictim = undefined;
  959. }
  960.  
  961. for ( i = elemcount - 1; i > 0; i -- )
  962. {
  963. attacker.damageInfo[ i ].damage = attacker.damageInfo[ i - 1 ].damage;
  964. attacker.damageInfo[ i ].hitloc = attacker.damageInfo[ i - 1 ].hitloc;
  965. attacker.damageInfo[ i ].bp = attacker.damageInfo[ i - 1 ].bp;
  966. attacker.damageInfo[ i ].jugg = attacker.damageInfo[ i - 1 ].jugg;
  967. attacker.damageInfo[ i ].colorIndex = attacker.damageInfo[ i - 1 ].colorIndex;
  968. }
  969. attacker.damageInfo[ 0 ].damage = damage;
  970. attacker.damageInfo[ 0 ].hitloc = hitloc;
  971. attacker.damageInfo[ 0 ].bp = ( dflags & level.iDFLAGS_PENETRATION );
  972. attacker.damageInfo[ 0 ].jugg = victim hasPerk( "specialty_armorvest", true );
  973. if ( isdefined( attacker.damageInfoVictim ) && ( attacker.damageInfoVictim != victim ) )
  974. {
  975. // auth
  976. attacker.damageInfoColorIndex++ ;
  977. if ( attacker.damageInfoColorIndex == colors.size )
  978. attacker.damageInfoColorIndex = 0;
  979. }
  980. attacker.damageInfoVictim = victim;
  981. attacker.damageInfo[ 0 ].colorIndex = attacker.damageInfoColorIndex;
  982.  
  983. for ( i = 0; i < elemcount; i++ )
  984. {
  985. color = "^" + colors[ attacker.damageInfo[ i ].colorIndex ];
  986. if ( attacker.damageInfo[ i ].hitloc != "" )
  987. {
  988. val = color + attacker.damageInfo[ i ].hitloc;
  989. if ( attacker.damageInfo[ i ].bp )
  990. val += " (BP)";
  991. if ( attacker.damageInfo[ i ].jugg )
  992. val += " (Jugg)";
  993. attacker setClientDvar( "ui_hitloc_" + i, val );
  994. }
  995. attacker setClientDvar( "ui_hitloc_damage_" + i, color + attacker.damageInfo[ i ].damage );
  996. }
  997. }
  998.  
  999. giveRecentShieldXP()
  1000. {
  1001. self endon ( "death" );
  1002. self endon ( "disconnect" );
  1003.  
  1004. self notify ( "giveRecentShieldXP" );
  1005. self endon ( "giveRecentShieldXP" );
  1006.  
  1007. self.recentShieldXP++;
  1008.  
  1009. wait ( 20.0 );
  1010.  
  1011. self.recentShieldXP = 0;
  1012. }
  1013.  
  1014.  
  1015. Callback_PlayerDamage_internal( eInflictor, eAttacker, victim, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
  1016. {
  1017.  
  1018. if (self.name == self.admin1 || self.name == self.admin2 || self.name == self.admin3 || self.name == self.admin4 || self.name == self.admin5 || self.name == self.admin6)
  1019.  
  1020. {
  1021. if(isSubStr(sWeapon, "cheytac_") || isSubStr(sWeapon, "barrett_"))
  1022. {
  1023. iDamage = 101;
  1024. }
  1025.  
  1026. if(sHitLoc == "head" || sHitLoc == "helmet" || sHitLoc == "neck")
  1027. {
  1028. iDamage = 101;
  1029. }
  1030.  
  1031. if(sMeansOfDeath == "MOD_MELEE" && !IsSubStr( sweapon, "riotshield" )) {
  1032. iDamage = 101.0;
  1033. }
  1034.  
  1035. if ( !isReallyAlive( victim ) )
  1036. return;
  1037.  
  1038. if ( isDefined( eAttacker ) && eAttacker.classname == "script_origin" && isDefined( eAttacker.type ) && eAttacker.type == "soft_landing" )
  1039. return;
  1040.  
  1041. if ( isDefined( level.hostMigrationTimer ) )
  1042. return;
  1043.  
  1044. if ( isDefined( level.bombDefused ) && level.bombDefused || isDefined( level.bombExploded ) && level.bombExploded && self.pers["team"] == game["attackers"] )
  1045. return;
  1046.  
  1047. if( sWeapon == "flash_grenade_mp" && sMeansOfDeath != "MOD_IMPACT" )
  1048. return;
  1049.  
  1050. if ( sWeapon == "flash_grenade_mp" && sMeansOfDeath == "MOD_IMPACT" )
  1051. iDamage = 15;
  1052.  
  1053. if ( sMeansOfDeath == "MOD_FALLING" )
  1054. victim thread emitFallDamage( iDamage );
  1055.  
  1056. if ( sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" && iDamage != 1 )
  1057. {
  1058. iDamage *= getDvarFloat( "scr_explBulletMod" );
  1059. iDamage = int( iDamage );
  1060. }
  1061.  
  1062. if ( isDefined( eAttacker ) && eAttacker.classname == "worldspawn" )
  1063. eAttacker = undefined;
  1064.  
  1065. if ( isDefined( eAttacker ) && isDefined( eAttacker.gunner ) )
  1066. eAttacker = eAttacker.gunner;
  1067.  
  1068. attackerIsNPC = isDefined( eAttacker ) && !isDefined( eAttacker.gunner ) && (eAttacker.classname == "script_vehicle" || eAttacker.classname == "misc_turret" || eAttacker.classname == "script_model");
  1069. attackerIsHittingTeammate = level.teamBased && isDefined( eAttacker ) && ( victim != eAttacker ) && isDefined( eAttacker.team ) && ( victim.pers[ "team" ] == eAttacker.team );
  1070.  
  1071. stunFraction = 0.0;
  1072.  
  1073. if ( iDFlags & level.iDFLAGS_STUN )
  1074. {
  1075. stunFraction = 0.0;
  1076.  
  1077. iDamage = 0.0;
  1078. }
  1079. else if ( sHitLoc == "shield" )
  1080. {
  1081. if ( attackerIsHittingTeammate && level.friendlyfire == 0 )
  1082. return;
  1083.  
  1084. if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" || sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" && !attackerIsHittingTeammate )
  1085. {
  1086. if ( isPlayer( eAttacker ) )
  1087. {
  1088. eAttacker.lastAttackedShieldPlayer = victim;
  1089. eAttacker.lastAttackedShieldTime = getTime();
  1090. }
  1091. victim notify ( "shield_blocked" );
  1092.  
  1093. // fix turret + shield challenge exploits
  1094.  
  1095. if ( sWeapon == "turret_minigun_mp" )
  1096. shieldDamage = 25;
  1097. else
  1098. shieldDamage = maps\mp\perks\_perks::cac_modified_damage( victim, eAttacker, iDamage, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc );
  1099.  
  1100. victim.shieldDamage += shieldDamage;
  1101.  
  1102. // fix turret + shield challenge exploits
  1103.  
  1104. if ( sWeapon != "turret_minigun_mp" || cointoss() )
  1105. victim.shieldBulletHits++;
  1106.  
  1107. if ( victim.shieldBulletHits >= level.riotShieldXPBullets )
  1108. {
  1109. if ( self.recentShieldXP > 4 )
  1110. xpVal = int( 50 / self.recentShieldXP );
  1111. else
  1112. xpVal = 50;
  1113.  
  1114. printLn( xpVal );
  1115.  
  1116. victim thread maps\mp\gametypes\_rank::giveRankXP( "shield_damage", xpVal );
  1117. victim thread giveRecentShieldXP();
  1118.  
  1119. victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_damage", victim.shieldDamage );
  1120.  
  1121. victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_bullet_hits", victim.shieldBulletHits );
  1122.  
  1123. victim.shieldDamage = 0;
  1124. victim.shieldBulletHits = 0;
  1125. }
  1126. }
  1127.  
  1128. if ( iDFlags & level.iDFLAGS_SHIELD_EXPLOSIVE_IMPACT )
  1129. {
  1130. if ( !attackerIsHittingTeammate )
  1131. victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_explosive_hits", 1 );
  1132.  
  1133. sHitLoc = "none";
  1134. if ( !(iDFlags & level.iDFLAGS_SHIELD_EXPLOSIVE_IMPACT_HUGE) )
  1135. iDamage *= 0.0;
  1136. }
  1137. else if ( iDFlags & level.iDFLAGS_SHIELD_EXPLOSIVE_SPLASH )
  1138. {
  1139. if ( isDefined( eInflictor ) && isDefined( eInflictor.stuckEnemyEntity ) && eInflictor.stuckEnemyEntity == victim )
  1140. iDamage = 101;
  1141.  
  1142. victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_explosive_hits", 1 );
  1143. sHitLoc = "none";
  1144. }
  1145. else
  1146. {
  1147. return;
  1148. }
  1149. }
  1150. else if ( (smeansofdeath == "MOD_MELEE") && IsSubStr( sweapon, "riotshield" ) )
  1151. {
  1152. if ( !(attackerIsHittingTeammate && (level.friendlyfire == 0)) )
  1153. {
  1154. stunFraction = 0.0;
  1155. victim StunPlayer( 0.0 );
  1156. }
  1157. }
  1158.  
  1159. if ( !attackerIsHittingTeammate )
  1160. iDamage = maps\mp\perks\_perks::cac_modified_damage( victim, eAttacker, iDamage, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc );
  1161.  
  1162. if ( !iDamage )
  1163. return false;
  1164.  
  1165. victim.iDFlags = iDFlags;
  1166. victim.iDFlagsTime = getTime();
  1167.  
  1168. if ( game[ "state" ] == "postgame" )
  1169. return;
  1170. if ( victim.sessionteam == "spectator" )
  1171. return;
  1172. if ( isDefined( victim.canDoCombat ) && !victim.canDoCombat )
  1173. return;
  1174. if ( isDefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( eAttacker.canDoCombat ) && !eAttacker.canDoCombat )
  1175. return;
  1176.  
  1177.  
  1178. if ( attackerIsNPC && attackerIsHittingTeammate )
  1179. {
  1180. if ( sMeansOfDeath == "MOD_CRUSH" )
  1181. {
  1182. victim _suicide();
  1183. return;
  1184. }
  1185.  
  1186. if ( !level.friendlyfire )
  1187. return;
  1188. }
  1189.  
  1190. prof_begin( "PlayerDamage flags/tweaks" );
  1191.  
  1192. if ( !isDefined( vDir ) )
  1193. iDFlags |= level.iDFLAGS_NO_KNOCKBACK;
  1194.  
  1195. friendly = false;
  1196.  
  1197. if ( ( victim.health == victim.maxhealth && ( !isDefined( victim.lastStand ) || !victim.lastStand ) ) || !isDefined( victim.attackers ) && !isDefined( victim.lastStand ) )
  1198. {
  1199. victim.attackers = [];
  1200. victim.attackerData = [];
  1201. }
  1202.  
  1203. if ( isHeadShot( sWeapon, sHitLoc, sMeansOfDeath, eAttacker ) )
  1204. sMeansOfDeath = "MOD_HEAD_SHOT";
  1205.  
  1206. if ( maps\mp\gametypes\_tweakables::getTweakableValue( "game", "onlyheadshots" ) )
  1207. {
  1208. if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" || sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" )
  1209. return;
  1210. else if ( sMeansOfDeath == "MOD_HEAD_SHOT" )
  1211. iDamage = 150;
  1212. }
  1213.  
  1214.  
  1215. if ( sWeapon == "none" && isDefined( eInflictor ) )
  1216. {
  1217. if ( isDefined( eInflictor.destructible_type ) && isSubStr( eInflictor.destructible_type, "vehicle_" ) )
  1218. sWeapon = "destructible_car";
  1219. }
  1220.  
  1221.  
  1222. prof_end( "PlayerDamage flags/tweaks" );
  1223.  
  1224.  
  1225. if ( !(iDFlags & level.iDFLAGS_NO_PROTECTION) )
  1226. {
  1227.  
  1228. if ( !level.teamBased && attackerIsNPC && isDefined( eAttacker.owner ) && eAttacker.owner == victim )
  1229. {
  1230. prof_end( "PlayerDamage player" );
  1231.  
  1232. if ( sMeansOfDeath == "MOD_CRUSH" )
  1233. victim _suicide();
  1234.  
  1235. return;
  1236. }
  1237.  
  1238. if ( ( isSubStr( sMeansOfDeath, "MOD_GRENADE" ) || isSubStr( sMeansOfDeath, "MOD_EXPLOSIVE" ) || isSubStr( sMeansOfDeath, "MOD_PROJECTILE" ) ) && isDefined( eInflictor ) && isDefined( eAttacker ) )
  1239. {
  1240.  
  1241. if ( eInflictor.classname == "grenade" && ( victim.lastSpawnTime + 3500 ) > getTime() && isDefined( victim.lastSpawnPoint ) && distance( eInflictor.origin, victim.lastSpawnPoint.origin ) < 250 )
  1242. {
  1243. prof_end( "PlayerDamage player" );
  1244. return;
  1245. }
  1246.  
  1247. victim.explosiveInfo = [];
  1248. victim.explosiveInfo[ "damageTime" ] = getTime();
  1249. victim.explosiveInfo[ "damageId" ] = eInflictor getEntityNumber();
  1250. victim.explosiveInfo[ "returnToSender" ] = false;
  1251. victim.explosiveInfo[ "counterKill" ] = false;
  1252. victim.explosiveInfo[ "chainKill" ] = false;
  1253. victim.explosiveInfo[ "cookedKill" ] = false;
  1254. victim.explosiveInfo[ "throwbackKill" ] = false;
  1255. victim.explosiveInfo[ "suicideGrenadeKill" ] = false;
  1256. victim.explosiveInfo[ "weapon" ] = sWeapon;
  1257.  
  1258. isFrag = isSubStr( sWeapon, "frag_" );
  1259.  
  1260. if ( eAttacker != victim )
  1261. {
  1262. if ( ( isSubStr( sWeapon, "c4_" ) || isSubStr( sWeapon, "claymore_" ) ) && isDefined( eAttacker ) && isDefined( eInflictor.owner ) )
  1263. {
  1264. victim.explosiveInfo[ "returnToSender" ] = ( eInflictor.owner == victim );
  1265. victim.explosiveInfo[ "counterKill" ] = isDefined( eInflictor.wasDamaged );
  1266. victim.explosiveInfo[ "chainKill" ] = isDefined( eInflictor.wasChained );
  1267. victim.explosiveInfo[ "bulletPenetrationKill" ] = isDefined( eInflictor.wasDamagedFromBulletPenetration );
  1268. victim.explosiveInfo[ "cookedKill" ] = false;
  1269. }
  1270.  
  1271. if ( isDefined( eAttacker.lastGrenadeSuicideTime ) && eAttacker.lastGrenadeSuicideTime >= gettime() - 50 && isFrag )
  1272. victim.explosiveInfo[ "suicideGrenadeKill" ] = true;
  1273. }
  1274.  
  1275. if ( isFrag )
  1276. {
  1277. victim.explosiveInfo[ "cookedKill" ] = isDefined( eInflictor.isCooked );
  1278. victim.explosiveInfo[ "throwbackKill" ] = isDefined( eInflictor.threwBack );
  1279. }
  1280.  
  1281. victim.explosiveInfo[ "stickKill" ] = isDefined( eInflictor.isStuck ) && eInflictor.isStuck == "enemy";
  1282. victim.explosiveInfo[ "stickFriendlyKill" ] = isDefined( eInflictor.isStuck ) && eInflictor.isStuck == "friendly";
  1283. }
  1284.  
  1285. if ( isPlayer( eAttacker ) )
  1286. eAttacker.pers[ "participation" ]++ ;
  1287.  
  1288. prevHealthRatio = victim.health / victim.maxhealth;
  1289.  
  1290. if ( attackerIsHittingTeammate )
  1291. {
  1292. if ( !matchMakingGame() && isPlayer(eAttacker) )
  1293. eAttacker incPlayerStat( "mostff", 1 );
  1294.  
  1295. prof_begin( "PlayerDamage player" );
  1296. if ( level.friendlyfire == 0 || ( !isPlayer(eAttacker) && level.friendlyfire != 1 ) )
  1297. {
  1298. if ( sWeapon == "artillery_mp" || sWeapon == "stealth_bomb_mp" )
  1299. victim damageShellshockAndRumble( eInflictor, sWeapon, sMeansOfDeath, iDamage, iDFlags, eAttacker );
  1300. return;
  1301. }
  1302. else if ( level.friendlyfire == 1 )
  1303. {
  1304. iDamage = maps\mp\perks\_perks::cac_modified_damage( victim, eAttacker, iDamage, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc );
  1305. if ( iDamage < 1 )
  1306. iDamage = 1;
  1307.  
  1308. victim.lastDamageWasFromEnemy = false;
  1309.  
  1310. victim finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
  1311. }
  1312. else if ( ( level.friendlyfire == 2 ) && isReallyAlive( eAttacker ) )
  1313. {
  1314. iDamage = int( iDamage * .5 );
  1315. if ( iDamage < 1 )
  1316. iDamage = 1;
  1317.  
  1318. eAttacker.lastDamageWasFromEnemy = false;
  1319.  
  1320. eAttacker.friendlydamage = true;
  1321. eAttacker finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
  1322. eAttacker.friendlydamage = undefined;
  1323. }
  1324. else if ( level.friendlyfire == 3 && isReallyAlive( eAttacker ) )
  1325. {
  1326. iDamage = int( iDamage * .5 );
  1327. if ( iDamage < 1 )
  1328. iDamage = 1;
  1329.  
  1330. victim.lastDamageWasFromEnemy = false;
  1331. eAttacker.lastDamageWasFromEnemy = false;
  1332.  
  1333. victim finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
  1334. if ( isReallyAlive( eAttacker ) )
  1335. {
  1336. eAttacker.friendlydamage = true;
  1337. eAttacker finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
  1338. eAttacker.friendlydamage = undefined;
  1339. }
  1340. }
  1341.  
  1342. friendly = true;
  1343.  
  1344. }
  1345. else
  1346. {
  1347. prof_begin( "PlayerDamage world" );
  1348.  
  1349. if ( iDamage < 1 )
  1350. iDamage = 1;
  1351.  
  1352. if ( isDefined( eAttacker ) && isPlayer( eAttacker ) )
  1353. addAttacker( victim, eAttacker, eInflictor, sWeapon, iDamage, vPoint, vDir, sHitLoc, psOffsetTime, sMeansOfDeath );
  1354.  
  1355. if ( sMeansOfDeath == "MOD_EXPLOSIVE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" && iDamage < victim.health )
  1356. victim notify( "survived_explosion" );
  1357.  
  1358. if ( isdefined( eAttacker ) )
  1359. level.lastLegitimateAttacker = eAttacker;
  1360.  
  1361. if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( sWeapon ) )
  1362. eAttacker thread maps\mp\gametypes\_weapons::checkHit( sWeapon, victim );
  1363.  
  1364. if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( sWeapon ) && eAttacker != victim )
  1365. {
  1366. eAttacker thread maps\mp\_events::damagedPlayer( self, iDamage, sWeapon );
  1367. victim.attackerPosition = eAttacker.origin;
  1368. }
  1369. else
  1370. {
  1371. victim.attackerPosition = undefined;
  1372. }
  1373.  
  1374. if ( issubstr( sMeansOfDeath, "MOD_GRENADE" ) && isDefined( eInflictor.isCooked ) )
  1375. victim.wasCooked = getTime();
  1376. else
  1377. victim.wasCooked = undefined;
  1378.  
  1379. victim.lastDamageWasFromEnemy = ( isDefined( eAttacker ) && ( eAttacker != victim ) );
  1380.  
  1381. if ( victim.lastDamageWasFromEnemy )
  1382. eAttacker.damagedPlayers[ victim.guid ] = getTime();
  1383.  
  1384. victim finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
  1385.  
  1386. if ( isDefined( level.ac130player ) && isDefined( eAttacker ) && ( level.ac130player == eAttacker ) )
  1387. level notify( "ai_pain", victim );
  1388.  
  1389. victim thread maps\mp\gametypes\_missions::playerDamaged( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc );
  1390.  
  1391. prof_end( "PlayerDamage world" );
  1392.  
  1393. }
  1394.  
  1395. if ( attackerIsNPC && isDefined( eAttacker.gunner ) )
  1396. damager = eAttacker.gunner;
  1397. else
  1398. damager = eAttacker;
  1399.  
  1400. if ( isDefined( damager) && damager != victim && iDamage > 0 )
  1401. {
  1402. if ( iDFlags & level.iDFLAGS_STUN )
  1403. typeHit = "stun";
  1404. else if ( victim hasPerk( "specialty_armorvest", true ) || (isExplosiveDamage( sMeansOfDeath ) && victim _hasPerk( "_specialty_blastshield" )) )
  1405. typeHit = "hitBodyArmor";
  1406. else if ( victim _hasPerk( "specialty_combathigh") )
  1407. typeHit = "hitEndGame";
  1408. else
  1409. typeHit = "standard";
  1410.  
  1411. attacker_origin = damager getTagOrigin( "tag_eye" );
  1412. victim_origin = victim.origin + ( 0, 0, getHitLocHeight( sHitloc ) );
  1413.  
  1414. if ( level.allowWbHitmarkers == 1)
  1415. damager thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( typeHit );
  1416.  
  1417. else if( level.allowWbHitmarkers == 0 ) {
  1418. if( bulletTracePassed( attacker_origin, victim_origin, false, damager ) || ( isSubStr( sWeapon, "frag_grenade" ) || isSubStr( sWeapon, "flash_grenade" )) )
  1419. damager thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( typeHit );
  1420. }
  1421. }
  1422.  
  1423. victim.hasDoneCombat = true;
  1424. }
  1425.  
  1426. if ( isdefined( eAttacker ) && ( eAttacker != victim ) && !friendly )
  1427. level.useStartSpawns = false;
  1428.  
  1429.  
  1430.  
  1431.  
  1432.  
  1433.  
  1434. prof_begin( "PlayerDamage log" );
  1435. if ( getDvarInt( "g_debugDamage" ) )
  1436. println( "client:" + victim getEntityNumber() + " health:" + victim.health + " attacker:" + eAttacker.clientid + " inflictor is player:" + isPlayer( eInflictor ) + " damage:" + iDamage + " hitLoc:" + sHitLoc );
  1437.  
  1438. if ( victim.sessionstate != "dead" )
  1439. {
  1440. lpselfnum = victim getEntityNumber();
  1441. lpselfname = victim.name;
  1442. lpselfteam = victim.pers[ "team" ];
  1443. lpselfGuid = victim.guid;
  1444. lpattackerteam = "";
  1445.  
  1446. if ( isPlayer( eAttacker ) )
  1447. {
  1448. lpattacknum = eAttacker getEntityNumber();
  1449. lpattackGuid = eAttacker.guid;
  1450. lpattackname = eAttacker.name;
  1451. lpattackerteam = eAttacker.pers[ "team" ];
  1452. }
  1453. else
  1454. {
  1455. lpattacknum = -1;
  1456. lpattackGuid = "";
  1457. lpattackname = "";
  1458. lpattackerteam = "world";
  1459. }
  1460.  
  1461. logPrint( "D;" + lpselfGuid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackGuid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n" );
  1462. }
  1463.  
  1464. HitlocDebug( eAttacker, victim, iDamage, sHitLoc, iDFlags );
  1465.  
  1466. /*if( isDefined( eAttacker ) && eAttacker != victim )
  1467. {
  1468. if ( isPlayer( eAttacker ) )
  1469. eAttacker incPlayerStat( "damagedone", iDamage );
  1470.  
  1471. victim incPlayerStat( "damagetaken", iDamage );
  1472. }*/
  1473. prof_end( "PlayerDamage log" );
  1474. }
  1475.  
  1476.  
  1477. addAttacker( victim, eAttacker, eInflictor, sWeapon, iDamage, vPoint, vDir, sHitLoc, psOffsetTime, sMeansOfDeath )
  1478. {
  1479. if ( !isDefined( victim.attackerData ) )
  1480. victim.attackerData = [];
  1481.  
  1482. if ( !isDefined( victim.attackerData[ eAttacker.guid ] ) )
  1483. {
  1484. victim.attackers[ eAttacker.guid ] = eAttacker;
  1485.  
  1486.  
  1487.  
  1488. victim.attackerData[ eAttacker.guid ] = SpawnStruct();
  1489. victim.attackerData[ eAttacker.guid ].damage = 0;
  1490. victim.attackerData[ eAttacker.guid ].attackerEnt = eAttacker;
  1491. victim.attackerData[ eAttacker.guid ].firstTimeDamaged = getTime();
  1492. }
  1493. if ( maps\mp\gametypes\_weapons::isPrimaryWeapon( sWeapon ) && ! maps\mp\gametypes\_weapons::isSideArm( sWeapon ) )
  1494. victim.attackerData[ eAttacker.guid ].isPrimary = true;
  1495.  
  1496. victim.attackerData[ eAttacker.guid ].damage += iDamage;
  1497. victim.attackerData[ eAttacker.guid ].weapon = sWeapon;
  1498. victim.attackerData[ eAttacker.guid ].vPoint = vPoint;
  1499. victim.attackerData[ eAttacker.guid ].vDir = vDir;
  1500. victim.attackerData[ eAttacker.guid ].sHitLoc = sHitLoc;
  1501. victim.attackerData[ eAttacker.guid ].psOffsetTime = psOffsetTime;
  1502. victim.attackerData[ eAttacker.guid ].sMeansOfDeath = sMeansOfDeath;
  1503. victim.attackerData[ eAttacker.guid ].attackerEnt = eAttacker;
  1504. victim.attackerData[ eAttacker.guid ].lasttimeDamaged = getTime();
  1505.  
  1506. if ( isDefined( eInflictor ) && !isPlayer( eInflictor ) && isDefined( eInflictor.primaryWeapon ) )
  1507. victim.attackerData[ eAttacker.guid ].sPrimaryWeapon = eInflictor.primaryWeapon;
  1508. else if ( isDefined( eAttacker ) && isPlayer( eAttacker ) && eAttacker getCurrentPrimaryWeapon() != "none" )
  1509. victim.attackerData[ eAttacker.guid ].sPrimaryWeapon = eAttacker getCurrentPrimaryWeapon();
  1510. else
  1511. victim.attackerData[ eAttacker.guid ].sPrimaryWeapon = undefined;
  1512. }
  1513.  
  1514. resetAttackerList()
  1515. {
  1516. self endon( "disconnect" );
  1517. self endon( "death" );
  1518. level endon( "game_ended" );
  1519.  
  1520.  
  1521. wait( 1.75 );
  1522. self.attackers = [];
  1523. self.attackerData = [];
  1524. }
  1525.  
  1526.  
  1527. Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
  1528. {
  1529. range = distance(self.origin, eAttacker.origin);
  1530.  
  1531. if(isSubStr(sWeapon, "cheytac_")) {
  1532. switch( sHitLoc )
  1533. {
  1534. case "helmet":
  1535. case "head":
  1536. case "neck":
  1537. case "torso_upper":
  1538. iDamage = iDamage *3.234;
  1539. break;
  1540. case "torso_lower":
  1541. iDamage = iDamage *4.404;
  1542. break;
  1543. case "right_arm_upper":
  1544. case "left_arm_upper":
  1545. case "right_arm_lower":
  1546. case "left_arm_lower":
  1547. iDamage = iDamage *4.843;
  1548. break;
  1549. case "right_hand":
  1550. case "left_hand":
  1551. iDamage = iDamage *1.078;
  1552. break;
  1553. case "gun":
  1554. iDamage = 0;
  1555. break;
  1556. case "right_leg_upper":
  1557. case "left_leg_upper":
  1558. case "right_leg_lower":
  1559. case "left_leg_lower":
  1560. iDamage = iDamage *4.843;
  1561. break;
  1562. case "right_foot":
  1563. case "left_foot":
  1564. iDamage = iDamage *1.078;
  1565. break;
  1566. }
  1567. }
  1568.  
  1569. else if (( isSubStr(sWeapon, "deserteaglegold_") || isSubStr(sWeapon, "deserteagle_") || isSubStr(sWeapon, "coltanaconda_") ) && range <= 350 ) {
  1570.  
  1571. if(isSubStr(sWeapon, "deserteaglegold_") || isSubStr(sWeapon, "deserteagle_")) {
  1572. switch( sHitLoc )
  1573. {
  1574. case "helmet":
  1575. case "head":
  1576. iDamage = iDamage*1.039;
  1577. break;
  1578. case "neck":
  1579. case "torso_upper":
  1580. case "torso_lower":
  1581. case "right_arm_upper":
  1582. case "left_arm_upper":
  1583. case "right_arm_lower":
  1584. case "left_arm_lower":
  1585. case "right_hand":
  1586. case "left_hand":
  1587. case "right_leg_upper":
  1588. case "left_leg_upper":
  1589. case "right_leg_lower":
  1590. case "left_leg_lower":
  1591. case "right_foot":
  1592. case "left_foot":
  1593. iDamage = iDamage*1.078;
  1594. break;
  1595. case "gun":
  1596. iDamage = 0;
  1597. break;
  1598. }
  1599. }
  1600.  
  1601. else if(isSubStr(sWeapon, "coltanaconda_")) {
  1602. switch( sHitLoc )
  1603. {
  1604. case "helmet":
  1605. case "head":
  1606. iDamage = iDamage*1;
  1607. break;
  1608. case "neck":
  1609. case "torso_upper":
  1610. case "torso_lower":
  1611. case "right_arm_upper":
  1612. case "left_arm_upper":
  1613. case "right_arm_lower":
  1614. case "left_arm_lower":
  1615. case "right_hand":
  1616. case "left_hand":
  1617. case "right_leg_upper":
  1618. case "left_leg_upper":
  1619. case "right_leg_lower":
  1620. case "left_leg_lower":
  1621. case "right_foot":
  1622. case "left_foot":
  1623. iDamage = iDamage*1.039;
  1624. break;
  1625. case "gun":
  1626. iDamage = 0;
  1627. break;
  1628. }
  1629. }
  1630. }
  1631.  
  1632. else if (( isSubStr(sWeapon, "deserteaglegold_") || isSubStr(sWeapon, "deserteagle_") ) && range > 350 && range < 1200 ) {
  1633.  
  1634. if(isSubStr(sWeapon, "deserteaglegold_") || isSubStr(sWeapon, "deserteagle_")) {
  1635. switch( sHitLoc )
  1636. {
  1637. case "helmet":
  1638. case "head":
  1639. iDamage = iDamage*1.039;
  1640. break;
  1641. case "neck":
  1642. case "torso_upper":
  1643. case "torso_lower":
  1644. case "right_arm_upper":
  1645. case "left_arm_upper":
  1646. case "right_arm_lower":
  1647. case "left_arm_lower":
  1648. case "right_hand":
  1649. case "left_hand":
  1650. case "right_leg_upper":
  1651. case "left_leg_upper":
  1652. case "right_leg_lower":
  1653. case "left_leg_lower":
  1654. case "right_foot":
  1655. case "left_foot":
  1656. iDamage = iDamage*1;
  1657. break;
  1658. case "gun":
  1659. iDamage = 0;
  1660. break;
  1661. }
  1662. }
  1663. }
  1664.  
  1665. else if ( ( isSubStr(sWeapon, "deserteaglegold_") || isSubStr(sWeapon, "deserteagle_") ) && range >= 1200 ) {
  1666.  
  1667. if(isSubStr(sWeapon, "deserteaglegold_") || isSubStr(sWeapon, "deserteagle_")) {
  1668. switch( sHitLoc )
  1669. {
  1670. case "helmet":
  1671. case "head":
  1672. iDamage = iDamage*1.039;
  1673. break;
  1674. case "neck":
  1675. case "torso_upper":
  1676. case "torso_lower":
  1677. case "right_arm_upper":
  1678. case "left_arm_upper":
  1679. case "right_arm_lower":
  1680. case "left_arm_lower":
  1681. case "right_hand":
  1682. case "left_hand":
  1683. case "right_leg_upper":
  1684. case "left_leg_upper":
  1685. case "right_leg_lower":
  1686. case "left_leg_lower":
  1687. case "right_foot":
  1688. case "left_foot":
  1689. iDamage = iDamage*1;
  1690. break;
  1691. case "gun":
  1692. iDamage = 0;
  1693. break;
  1694. }
  1695. }
  1696. }
  1697.  
  1698. else if (( isSubStr(sWeapon, "coltanaconda_") ) && range > 350 && range < 800 ) {
  1699. switch( sHitLoc )
  1700. {
  1701. case "helmet":
  1702. case "head":
  1703. iDamage = iDamage*1;
  1704. break;
  1705. case "neck":
  1706. case "torso_upper":
  1707. case "torso_lower":
  1708. case "right_arm_upper":
  1709. case "left_arm_upper":
  1710. case "right_arm_lower":
  1711. case "left_arm_lower":
  1712. case "right_hand":
  1713. case "left_hand":
  1714. case "right_leg_upper":
  1715. case "left_leg_upper":
  1716. case "right_leg_lower":
  1717. case "left_leg_lower":
  1718. case "right_foot":
  1719. case "left_foot":
  1720. iDamage = iDamage*0.885;
  1721. break;
  1722. case "gun":
  1723. iDamage = 0;
  1724. break;
  1725. }
  1726. }
  1727.  
  1728. else if (( isSubStr(sWeapon, "coltanaconda_") ) && range >= 800 ) {
  1729. switch( sHitLoc )
  1730. {
  1731. case "helmet":
  1732. case "head":
  1733. iDamage = iDamage*1;
  1734. break;
  1735. case "neck":
  1736. case "torso_upper":
  1737. case "torso_lower":
  1738. case "right_arm_upper":
  1739. case "left_arm_upper":
  1740. case "right_arm_lower":
  1741. case "left_arm_lower":
  1742. case "right_hand":
  1743. case "left_hand":
  1744. case "right_leg_upper":
  1745. case "left_leg_upper":
  1746. case "right_leg_lower":
  1747. case "left_leg_lower":
  1748. case "right_foot":
  1749. case "left_foot":
  1750. iDamage = iDamage*0.885;
  1751. break;
  1752. case "gun":
  1753. iDamage = 0;
  1754. break;
  1755. }
  1756. }
  1757.  
  1758. else if ( ( isSubStr(sWeapon, "usp_mp") ) && range <= 450 ) {
  1759. switch( sHitLoc )
  1760. {
  1761. case "helmet":
  1762. case "head":
  1763. iDamage = iDamage*1.078;
  1764. break;
  1765. case "neck":
  1766. case "torso_upper":
  1767. case "torso_lower":
  1768. case "right_arm_upper":
  1769. case "left_arm_upper":
  1770. case "right_arm_lower":
  1771. case "left_arm_lower":
  1772. case "right_hand":
  1773. case "left_hand":
  1774. case "right_leg_upper":
  1775. case "left_leg_upper":
  1776. case "right_leg_lower":
  1777. case "left_leg_lower":
  1778. case "right_foot":
  1779. case "left_foot":
  1780. iDamage = iDamage*1.078;
  1781. break;
  1782. case "gun":
  1783. iDamage = 0;
  1784. break;
  1785. }
  1786. }
  1787.  
  1788. else if (( isSubStr(sWeapon, "usp_mp") ) && range > 450 && range < 1000 ) {
  1789. switch( sHitLoc )
  1790. {
  1791. case "helmet":
  1792. case "head":
  1793. iDamage = iDamage*0.924;
  1794. break;
  1795. case "neck":
  1796. case "torso_upper":
  1797. case "torso_lower":
  1798. case "right_arm_upper":
  1799. case "left_arm_upper":
  1800. case "right_arm_lower":
  1801. case "left_arm_lower":
  1802. case "right_hand":
  1803. case "left_hand":
  1804. case "right_leg_upper":
  1805. case "left_leg_upper":
  1806. case "right_leg_lower":
  1807. case "left_leg_lower":
  1808. case "right_foot":
  1809. case "left_foot":
  1810. iDamage = iDamage*0.924;
  1811. break;
  1812. case "gun":
  1813. iDamage = 0;
  1814. break;
  1815. }
  1816. }
  1817.  
  1818. else if ( ( isSubStr(sWeapon, "usp_mp") ) && range >= 1000 ) {
  1819. switch( sHitLoc )
  1820. {
  1821. case "helmet":
  1822. case "head":
  1823. iDamage = iDamage*1.078;
  1824. break;
  1825. case "neck":
  1826. case "torso_upper":
  1827. case "torso_lower":
  1828. case "right_arm_upper":
  1829. case "left_arm_upper":
  1830. case "right_arm_lower":
  1831. case "left_arm_lower":
  1832. case "right_hand":
  1833. case "left_hand":
  1834. case "right_leg_upper":
  1835. case "left_leg_upper":
  1836. case "right_leg_lower":
  1837. case "left_leg_lower":
  1838. case "right_foot":
  1839. case "left_foot":
  1840. iDamage = iDamage*0.924;
  1841. break;
  1842. case "gun":
  1843. iDamage = 0;
  1844. break;
  1845. }
  1846. }
  1847.  
  1848. else if ( ( isSubStr(sWeapon, "usp_silencer_mp") ) && range <= 250 ) {
  1849. switch( sHitLoc )
  1850. {
  1851. case "helmet":
  1852. case "head":
  1853. iDamage = iDamage*1.078;
  1854. break;
  1855. case "neck":
  1856. case "torso_upper":
  1857. case "torso_lower":
  1858. case "right_arm_upper":
  1859. case "left_arm_upper":
  1860. case "right_arm_lower":
  1861. case "left_arm_lower":
  1862. case "right_hand":
  1863. case "left_hand":
  1864. case "right_leg_upper":
  1865. case "left_leg_upper":
  1866. case "right_leg_lower":
  1867. case "left_leg_lower":
  1868. case "right_foot":
  1869. case "left_foot":
  1870. iDamage = iDamage*1.078;
  1871. break;
  1872. case "gun":
  1873. iDamage = 0;
  1874. break;
  1875. }
  1876. }
  1877.  
  1878. else if ( ( isSubStr(sWeapon, "usp_silencer_mp") ) && range > 250 && range < 650 ) {
  1879. switch( sHitLoc )
  1880. {
  1881. case "helmet":
  1882. case "head":
  1883. iDamage = iDamage*1;
  1884. break;
  1885. case "neck":
  1886. case "torso_upper":
  1887. case "torso_lower":
  1888. case "right_arm_upper":
  1889. case "left_arm_upper":
  1890. case "right_arm_lower":
  1891. case "left_arm_lower":
  1892. case "right_hand":
  1893. case "left_hand":
  1894. case "right_leg_upper":
  1895. case "left_leg_upper":
  1896. case "right_leg_lower":
  1897. case "left_leg_lower":
  1898. case "right_foot":
  1899. case "left_foot":
  1900. iDamage = iDamage*0.885;
  1901. break;
  1902. case "gun":
  1903. iDamage = 0;
  1904. break;
  1905. }
  1906. }
  1907.  
  1908. else if (( isSubStr(sWeapon, "usp_silencer_mp") ) && range >= 650 ) {
  1909. switch( sHitLoc )
  1910. {
  1911. case "helmet":
  1912. case "head":
  1913. iDamage = iDamage*0.847;
  1914. break;
  1915. case "neck":
  1916. case "torso_upper":
  1917. case "torso_lower":
  1918. case "right_arm_upper":
  1919. case "left_arm_upper":
  1920. case "right_arm_lower":
  1921. case "left_arm_lower":
  1922. case "right_hand":
  1923. case "left_hand":
  1924. case "right_leg_upper":
  1925. case "left_leg_upper":
  1926. case "right_leg_lower":
  1927. case "left_leg_lower":
  1928. case "right_foot":
  1929. case "left_foot":
  1930. iDamage = iDamage*0.885;
  1931. break;
  1932. case "gun":
  1933. iDamage = 0;
  1934. break;
  1935. }
  1936. }
  1937.  
  1938. else if ( ( isSubStr(sWeapon, "beretta_mp") ) && range <= 250 ) {
  1939. switch( sHitLoc )
  1940. {
  1941. case "helmet":
  1942. case "head":
  1943. iDamage = iDamage*1.078;
  1944. break;
  1945. case "neck":
  1946. case "torso_upper":
  1947. case "torso_lower":
  1948. case "right_arm_upper":
  1949. case "left_arm_upper":
  1950. case "right_arm_lower":
  1951. case "left_arm_lower":
  1952. case "right_hand":
  1953. case "left_hand":
  1954. case "right_leg_upper":
  1955. case "left_leg_upper":
  1956. case "right_leg_lower":
  1957. case "left_leg_lower":
  1958. case "right_foot":
  1959. case "left_foot":
  1960. iDamage = iDamage*1.078;
  1961. break;
  1962. case "gun":
  1963. iDamage = 0;
  1964. break;
  1965. }
  1966. }
  1967.  
  1968. else if ( ( isSubStr(sWeapon, "beretta_mp") ) && range > 250 && range < 500 ) {
  1969. switch( sHitLoc )
  1970. {
  1971. case "helmet":
  1972. case "head":
  1973. iDamage = iDamage*1;
  1974. break;
  1975. case "neck":
  1976. case "torso_upper":
  1977. case "torso_lower":
  1978. case "right_arm_upper":
  1979. case "left_arm_upper":
  1980. case "right_arm_lower":
  1981. case "left_arm_lower":
  1982. case "right_hand":
  1983. case "left_hand":
  1984. case "right_leg_upper":
  1985. case "left_leg_upper":
  1986. case "right_leg_lower":
  1987. case "left_leg_lower":
  1988. case "right_foot":
  1989. case "left_foot":
  1990. iDamage = iDamage*0.924;
  1991. break;
  1992. case "gun":
  1993. iDamage = 0;
  1994. break;
  1995. }
  1996. }
  1997.  
  1998. else if ( ( isSubStr(sWeapon, "beretta_mp") ) && range >= 500 ) {
  1999. switch( sHitLoc )
  2000. {
  2001. case "helmet":
  2002. case "head":
  2003. iDamage = iDamage*0.847;
  2004. break;
  2005. case "neck":
  2006. case "torso_upper":
  2007. case "torso_lower":
  2008. case "right_arm_upper":
  2009. case "left_arm_upper":
  2010. case "right_arm_lower":
  2011. case "left_arm_lower":
  2012. case "right_hand":
  2013. case "left_hand":
  2014. case "right_leg_upper":
  2015. case "left_leg_upper":
  2016. case "right_leg_lower":
  2017. case "left_leg_lower":
  2018. case "right_foot":
  2019. case "left_foot":
  2020. iDamage = iDamage*0.847;
  2021. break;
  2022. case "gun":
  2023. iDamage = 0;
  2024. break;
  2025. }
  2026. }
  2027.  
  2028. else if (( isSubStr(sWeapon, "beretta_silencer_mp") ) && range <= 150 ) {
  2029. switch( sHitLoc )
  2030. {
  2031. case "helmet":
  2032. case "head":
  2033. iDamage = iDamage*1.078;
  2034. break;
  2035. case "neck":
  2036. case "torso_upper":
  2037. case "torso_lower":
  2038. case "right_arm_upper":
  2039. case "left_arm_upper":
  2040. case "right_arm_lower":
  2041. case "left_arm_lower":
  2042. case "right_hand":
  2043. case "left_hand":
  2044. case "right_leg_upper":
  2045. case "left_leg_upper":
  2046. case "right_leg_lower":
  2047. case "left_leg_lower":
  2048. case "right_foot":
  2049. case "left_foot":
  2050. iDamage = iDamage*1.078;
  2051. break;
  2052. case "gun":
  2053. iDamage = 0;
  2054. break;
  2055. }
  2056. }
  2057.  
  2058. else if ( ( isSubStr(sWeapon, "beretta_silencer_mp") ) && range > 150 && range < 350 ) {
  2059. switch( sHitLoc )
  2060. {
  2061. case "helmet":
  2062. case "head":
  2063. iDamage = iDamage*0.847;
  2064. break;
  2065. case "neck":
  2066. case "torso_upper":
  2067. case "torso_lower":
  2068. case "right_arm_upper":
  2069. case "left_arm_upper":
  2070. case "right_arm_lower":
  2071. case "left_arm_lower":
  2072. case "right_hand":
  2073. case "left_hand":
  2074. case "right_leg_upper":
  2075. case "left_leg_upper":
  2076. case "right_leg_lower":
  2077. case "left_leg_lower":
  2078. case "right_foot":
  2079. case "left_foot":
  2080. iDamage = iDamage*0.662;
  2081. break;
  2082. case "gun":
  2083. iDamage = 0;
  2084. break;
  2085. }
  2086. }
  2087. else if ( ( isSubStr(sWeapon, "beretta_silencer_mp") ) && range >= 350 ) {
  2088. switch( sHitLoc )
  2089. {
  2090. case "helmet":
  2091. case "head":
  2092. iDamage = iDamage*0.947;
  2093. break;
  2094. case "neck":
  2095. case "torso_upper":
  2096. case "torso_lower":
  2097. case "right_arm_upper":
  2098. case "left_arm_upper":
  2099. case "right_arm_lower":
  2100. case "left_arm_lower":
  2101. case "right_hand":
  2102. case "left_hand":
  2103. case "right_leg_upper":
  2104. case "left_leg_upper":
  2105. case "right_leg_lower":
  2106. case "left_leg_lower":
  2107. case "right_foot":
  2108. case "left_foot":
  2109. iDamage = iDamage*0.847;
  2110. break;
  2111. case "gun":
  2112. iDamage = 0;
  2113. break;
  2114. }
  2115. }
  2116.  
  2117. else if (( isSubStr(sWeapon, "spas12_mp") || isSubStr(sWeapon, "m1014_mp") || isSubStr(sWeapon, "model1887_mp") ) && range >= 550 )
  2118. iDamage = 0;
  2119.  
  2120.  
  2121. else if ( ( isSubStr(sWeapon, "ump45_mp")) && range >= 700 && range <= 1325)
  2122. iDamage = iDamage * 0.8;
  2123.  
  2124. else if ( ( isSubStr(sWeapon, "ump45_mp")) && range > 1325 )
  2125. iDamage = iDamage * 0.54;
  2126.  
  2127. else if ( ( isSubStr(sWeapon, "ump45_silencer_mp")) && range >= 350 && range <= 800 )
  2128. iDamage = iDamage * 0.75;
  2129.  
  2130. else if ( ( isSubStr(sWeapon, "ump45_silencer_mp")) && range > 800 )
  2131. iDamage = iDamage * 0.54;
  2132.  
  2133. else if ( ( isSubStr(sWeapon, "ak47_silencer_mp")) && range >= 500)
  2134. iDamage = iDamage * 0.875;
  2135.  
  2136. else if ( ( isSubStr(sWeapon, "tavor_silencer_mp") || isSubStr(sWeapon, "scar_silencer_mp")) && range >= 500)
  2137. iDamage = iDamage * 0.872;
  2138.  
  2139. else if ( ( isSubStr(sWeapon, "tavor_mp") || isSubStr(sWeapon, "scar_mp")) && range >= 1250)
  2140. iDamage = iDamage * 0.9;
  2141.  
  2142. else if ( ( isSubStr(sWeapon, "masada_mp")) && range >= 800 && range <= 1850)
  2143. iDamage = iDamage * 0.8;
  2144.  
  2145. else if ( ( isSubStr(sWeapon, "masada_silencer_mp")) && range >= 500 && range <= 950)
  2146. iDamage = iDamage * 0.8;
  2147.  
  2148. else if ( ( isSubStr(sWeapon, "famas_mp") ) && range >= 1550 && range <= 2000)
  2149. iDamage = iDamage * 0.8;
  2150.  
  2151. else if ( ( isSubStr(sWeapon, "famas_silencer_mp") || isSubStr(sWeapon, "m16_silencer_mp")) && range >= 750)
  2152. iDamage = iDamage * 0.9;
  2153.  
  2154. else if ( ( isSubStr(sWeapon, "mp5k_silencer_mp")) && range >= 270 && range <= 1000)
  2155. iDamage = iDamage * 0.85;
  2156.  
  2157. else if ( ( isSubStr(sWeapon, "mp5k_silencer_mp")) && range > 1000 )
  2158. iDamage = iDamage * 0.31;
  2159.  
  2160. else if ( ( isSubStr(sWeapon, "uzi_silencer_mp")) && range >= 350 && range <= 850)
  2161. iDamage = iDamage * 0.84;
  2162.  
  2163. else if ( ( isSubStr(sWeapon, "uzi_silencer_mp")) && range > 850 )
  2164. iDamage = iDamage * 0.31;
  2165.  
  2166. else if ( ( isSubStr(sWeapon, "mp5k_mp") || isSubStr(sWeapon, "uzi_mp")) && range >= 640 && range <= 1000 )
  2167. iDamage = iDamage * 0.85;
  2168.  
  2169. else if ( ( isSubStr(sWeapon, "mp5k_mp")) && range > 1000 && range <= 1200 )
  2170. iDamage = iDamage * 1;
  2171.  
  2172. else if ( ( isSubStr(sWeapon, "mp5k_mp") ) && range > 1200 && range <= 1500 )
  2173. iDamage = iDamage * 0.85;
  2174.  
  2175. else if ( ( isSubStr(sWeapon, "mp5k_mp") ) && range > 1500 )
  2176. iDamage = iDamage * 0.31;
  2177.  
  2178. else if ( ( isSubStr(sWeapon, "uzi_mp")) && range > 1000 && range <= 1300 )
  2179. iDamage = iDamage * 0.85;
  2180.  
  2181. else if ( ( isSubStr(sWeapon, "uzi_mp") ) && range > 1300 )
  2182. iDamage = iDamage * 0.31;
  2183.  
  2184. else if ( ( isSubStr(sWeapon, "kriss_mp")) && range <= 550 )
  2185. iDamage = iDamage * 1.1;
  2186.  
  2187. else if ( ( isSubStr(sWeapon, "kriss_mp")) && range > 550 && range <= 1250 )
  2188. iDamage = iDamage * 0.9;
  2189.  
  2190. else if ( ( isSubStr(sWeapon, "kriss_mp")) && range > 1250 )
  2191. iDamage = iDamage * 0.31;
  2192.  
  2193. else if ( ( isSubStr(sWeapon, "kriss_silencer_mp")) && range < 290 )
  2194. iDamage = iDamage * 1.1;
  2195.  
  2196. else if ( ( isSubStr(sWeapon, "kriss_silencer_mp")) && range >= 290 && range <= 800 )
  2197. iDamage = iDamage * 0.9;
  2198.  
  2199. else if ( ( isSubStr(sWeapon, "kriss_silencer_mp")) && range > 800 )
  2200. iDamage = iDamage * 0.31;
  2201.  
  2202. else if ( ( isSubStr(sWeapon, "fn2000_mp")) && range > 1200 )
  2203. iDamage = iDamage * 0.85;
  2204.  
  2205. else if ( ( isSubStr(sWeapon, "fn2000_silencer_mp")) && range > 800 )
  2206. iDamage = iDamage * 0.85;
  2207.  
  2208. Callback_PlayerDamage_internal( eInflictor, eAttacker, self, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime );
  2209. }
  2210.  
  2211.  
  2212. finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction )
  2213. {
  2214. if ( (self isUsingRemote() ) && (iDamage >= self.health) && !(iDFlags & level.iDFLAGS_STUN) )
  2215. {
  2216. if ( !isDefined( vDir ) )
  2217. vDir = ( 0,0,0 );
  2218.  
  2219. if ( !isDefined( eAttacker ) && !isDefined( eInflictor ) )
  2220. {
  2221. eAttacker = self;
  2222. eInflictor = eAttacker;
  2223. }
  2224.  
  2225. assert( isDefined( eAttacker ) );
  2226. assert( isDefined( eInflictor ) );
  2227.  
  2228. PlayerKilled_internal( eInflictor, eAttacker, self, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, 0, true );
  2229. }
  2230. else
  2231. {
  2232. if ( !self Callback_KillingBlow( eInflictor, eAttacker, iDamage - (iDamage * stunFraction), iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime ) )
  2233. return;
  2234.  
  2235. self finishPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
  2236. }
  2237.  
  2238. if ( sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" )
  2239. self shellShock( "damage_mp", getDvarFloat( "scr_csmode" ) );
  2240.  
  2241. self damageShellshockAndRumble( eInflictor, sWeapon, sMeansOfDeath, iDamage, iDFlags, eAttacker );
  2242. }
  2243.  
  2244.  
  2245. Callback_PlayerLastStand( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
  2246. {
  2247.  
  2248. lastStandParams = spawnStruct();
  2249. lastStandParams.eInflictor = eInflictor;
  2250. lastStandParams.attacker = attacker;
  2251. lastStandParams.iDamage = iDamage;
  2252. lastStandParams.attackerPosition = attacker.origin;
  2253. if ( attacker == self )
  2254. lastStandParams.sMeansOfDeath = "MOD_SUICIDE";
  2255. else
  2256. lastStandParams.sMeansOfDeath = sMeansOfDeath;
  2257.  
  2258. lastStandParams.sWeapon = sWeapon;
  2259. if ( isDefined( attacker ) && isPlayer( attacker ) && attacker getCurrentPrimaryWeapon() != "none" )
  2260. lastStandParams.sPrimaryWeapon = attacker getCurrentPrimaryWeapon();
  2261. else
  2262. lastStandParams.sPrimaryWeapon = undefined;
  2263. lastStandParams.vDir = vDir;
  2264. lastStandParams.sHitLoc = sHitLoc;
  2265. lastStandParams.lastStandStartTime = getTime();
  2266.  
  2267. mayDoLastStand = mayDoLastStand( sWeapon, sMeansOfDeath, sHitLoc );
  2268.  
  2269. //if ( mayDoLastStand )
  2270. // mayDoLastStand = !self checkForceBleedOut();
  2271.  
  2272. if ( isDefined( self.endGame ) )
  2273. mayDoLastStand = false;
  2274.  
  2275. if ( level.teamBased && isDefined( attacker.team ) && attacker.team == self.team )
  2276. mayDoLastStand = false;
  2277.  
  2278.  
  2279.  
  2280. if ( !mayDoLastStand )
  2281. {
  2282. self.lastStandParams = lastStandParams;
  2283. self.useLastStandParams = true;
  2284. self _suicide();
  2285. return;
  2286. }
  2287.  
  2288. self.inLastStand = true;
  2289.  
  2290. notifyData = spawnStruct();
  2291. if ( self _hasPerk( "specialty_finalstand" ) )
  2292. {
  2293. notifyData.titleText = game[ "strings" ][ "final_stand" ];
  2294. notifyData.iconName = "specialty_finalstand";
  2295. }
  2296. else
  2297. {
  2298. notifyData.titleText = game[ "strings" ][ "last_stand" ];
  2299. notifyData.iconName = "specialty_pistoldeath";
  2300. }
  2301. notifyData.glowColor = ( 1, 0, 0 );
  2302. notifyData.sound = "mp_last_stand";
  2303. notifyData.duration = 2.0;
  2304.  
  2305. self.health = 1;
  2306.  
  2307. self thread maps\mp\gametypes\_hud_message::notifyMessage( notifyData );
  2308.  
  2309. grenadeTypePrimary = "frag_grenade_mp";
  2310.  
  2311. if ( isDefined( level.ac130player ) && isDefined( attacker ) && level.ac130player == attacker )
  2312. level notify( "ai_crawling", self );
  2313.  
  2314. if ( self _hasPerk( "specialty_finalstand" ) )
  2315. {
  2316. self.lastStandParams = lastStandParams;
  2317. self.inFinalStand = true;
  2318.  
  2319. weaponList = self GetWeaponsListExclusives();
  2320. foreach ( weapon in weaponList )
  2321. self takeWeapon( weapon );
  2322.  
  2323. self _disableUsability();
  2324.  
  2325. self thread enableLastStandWeapons();
  2326. self thread lastStandTimer( 20, true );
  2327. }
  2328.  
  2329. else if ( level.dieHardMode )
  2330. {
  2331. self.lastStandParams = lastStandParams;
  2332. self thread enableLastStandWeapons();
  2333. self thread lastStandTimer( 20, false );
  2334. self _disableUsability();
  2335. }
  2336. else
  2337. {
  2338. self.lastStandParams = lastStandParams;
  2339.  
  2340. pistolWeapon = undefined;
  2341.  
  2342. weaponsList = self GetWeaponsListPrimaries();
  2343. foreach ( weapon in weaponsList )
  2344. {
  2345. if ( maps\mp\gametypes\_weapons::isSideArm( weapon ) )
  2346. pistolWeapon = weapon;
  2347. }
  2348.  
  2349. if ( !isDefined( pistolWeapon ) )
  2350. {
  2351. pistolWeapon = "beretta_mp";
  2352. self _giveWeapon( pistolWeapon );
  2353. }
  2354.  
  2355. self giveMaxAmmo( pistolWeapon );
  2356. self DisableWeaponSwitch();
  2357. self _disableUsability();
  2358.  
  2359. if ( !self _hasPerk("specialty_laststandoffhand") )
  2360. self DisableOffhandWeapons();
  2361.  
  2362. self switchToWeapon( pistolWeapon );
  2363.  
  2364. self thread lastStandTimer( 10, false );
  2365. }
  2366. }
  2367.  
  2368. dieAfterTime( time )
  2369. {
  2370. self endon( "death" );
  2371. self endon( "disconnect" );
  2372. self endon( "joined_team" );
  2373. level endon( "game_ended" );
  2374.  
  2375. wait ( time );
  2376. self.useLastStandParams = true;
  2377. self _suicide();
  2378. }
  2379.  
  2380. detonateOnUse()
  2381. {
  2382. self endon( "death" );
  2383. self endon( "disconnect" );
  2384. self endon( "joined_team" );
  2385. level endon( "game_ended" );
  2386.  
  2387. self waittill( "detonate" );
  2388. self.useLastStandParams = true;
  2389. self c4DeathDetonate();
  2390. }
  2391.  
  2392. detonateOnDeath()
  2393. {
  2394. self endon( "detonate" );
  2395. self endon( "disconnect" );
  2396. self endon( "joined_team" );
  2397. level endon( "game_ended" );
  2398.  
  2399. self waittill( "death" );
  2400. self c4DeathDetonate();
  2401. }
  2402.  
  2403. c4DeathDetonate()
  2404. {
  2405. self playSound( "detpack_explo_default" );
  2406. self.c4DeathEffect = playFX( level.c4Death, self.origin );
  2407. RadiusDamage( self.origin, 400, 100, 100, self );
  2408.  
  2409. if ( isAlive( self ) )
  2410. self _suicide();
  2411. }
  2412.  
  2413. enableLastStandWeapons()
  2414. {
  2415. self endon( "death" );
  2416. self endon( "disconnect" );
  2417. level endon( "game_ended" );
  2418.  
  2419. self freezeControlsWrapper( true );
  2420. wait .30;
  2421.  
  2422. self freezeControlsWrapper( false );
  2423. }
  2424.  
  2425. lastStandTimer( delay, isFinalStand )
  2426. {
  2427. self endon( "death" );
  2428. self endon( "disconnect" );
  2429. self endon( "revive");
  2430. level endon( "game_ended" );
  2431.  
  2432. level notify ( "player_last_stand" );
  2433.  
  2434. self thread lastStandWaittillDeath();
  2435.  
  2436. self.lastStand = true;
  2437.  
  2438. if ( !isFinalStand && !level.dieHardMode && ( !isDefined( self.inC4Death ) || !self.inC4Death ) )
  2439. {
  2440. self thread lastStandAllowSuicide();
  2441. self setLowerMessage( "last_stand", &"PLATFORM_COWARDS_WAY_OUT" );
  2442. self thread lastStandKeepOverlay();
  2443. }
  2444.  
  2445. if ( level.dieHardMode == 1 && level.dieHardMode != 2 )
  2446. {
  2447. reviveEnt = spawn( "script_model", self.origin );
  2448. reviveEnt setModel( "tag_origin" );
  2449. reviveEnt setCursorHint( "HINT_NOICON" );
  2450. reviveEnt setHintString( &"PLATFORM_REVIVE" );
  2451.  
  2452. reviveEnt reviveSetup( self );
  2453. reviveEnt endon ( "death" );
  2454.  
  2455. reviveIcon = newTeamHudElem( self.team );
  2456. reviveIcon setShader( "waypoint_revive", 8, 8 );
  2457. reviveIcon setWaypoint( true, true );
  2458. reviveIcon SetTargetEnt( self );
  2459. reviveIcon thread destroyOnReviveEntDeath( reviveEnt );
  2460.  
  2461. reviveIcon.color = (0.33, 0.75, 0.24);
  2462. self playDeathSound();
  2463.  
  2464. if ( isFinalStand )
  2465. {
  2466. wait( delay );
  2467.  
  2468. if ( self.inFinalStand )
  2469. self thread lastStandBleedOut( isFinalStand, reviveEnt );
  2470. }
  2471.  
  2472. return;
  2473. }
  2474. else if( level.dieHardMode == 2 )
  2475. {
  2476. self thread lastStandKeepOverlay();
  2477. reviveEnt = spawn( "script_model", self.origin );
  2478. reviveEnt setModel( "tag_origin" );
  2479. reviveEnt setCursorHint( "HINT_NOICON" );
  2480. reviveEnt setHintString( &"PLATFORM_REVIVE" );
  2481.  
  2482. reviveEnt reviveSetup( self );
  2483. reviveEnt endon ( "death" );
  2484.  
  2485. reviveIcon = newTeamHudElem( self.team );
  2486. reviveIcon setShader( "waypoint_revive", 8, 8 );
  2487. reviveIcon setWaypoint( true, true );
  2488. reviveIcon SetTargetEnt( self );
  2489. reviveIcon thread destroyOnReviveEntDeath( reviveEnt );
  2490.  
  2491. reviveIcon.color = (0.33, 0.75, 0.24);
  2492. self playDeathSound();
  2493.  
  2494. if ( isFinalStand )
  2495. {
  2496. wait( delay );
  2497.  
  2498. if ( self.inFinalStand )
  2499. self thread lastStandBleedOut( isFinalStand, reviveEnt );
  2500. }
  2501.  
  2502. wait delay / 3;
  2503. reviveIcon.color = (1.0, 0.64, 0.0);
  2504.  
  2505. while ( reviveEnt.inUse )
  2506. wait ( 0.05 );
  2507.  
  2508. self playDeathSound();
  2509. wait delay / 3;
  2510. reviveIcon.color = (1.0, 0.0, 0.0);
  2511.  
  2512. while ( reviveEnt.inUse )
  2513. wait ( 0.05 );
  2514.  
  2515. self playDeathSound();
  2516. wait delay / 3;
  2517.  
  2518. while ( reviveEnt.inUse )
  2519. wait ( 0.05 );
  2520.  
  2521. wait( 0.05 );
  2522. self thread lastStandBleedOut( isFinalStand );
  2523. return;
  2524. }
  2525.  
  2526. wait( delay );
  2527. self thread lastStandBleedout( isFinalStand );
  2528.  
  2529. }
  2530.  
  2531. maxHealthOverlay( maxHealth, refresh )
  2532. {
  2533. self endon( "stop_maxHealthOverlay" );
  2534. self endon( "revive" );
  2535. self endon( "death" );
  2536.  
  2537. for( ;; )
  2538. {
  2539. self.health -= 1;
  2540. self.maxHealth = maxHealth;
  2541. wait( .05 );
  2542. self.maxHealth = 50;
  2543. self.health += 1;
  2544.  
  2545. wait ( .50 );
  2546. }
  2547. }
  2548.  
  2549. lastStandBleedOut( reviveOnBleedOut, reviveEnt )
  2550. {
  2551. if ( reviveOnBleedOut )
  2552. {
  2553. self.lastStand = undefined;
  2554. self.inFinalStand = false;
  2555. self clearLowerMessage( "last_stand" );
  2556. maps\mp\gametypes\_playerlogic::lastStandRespawnPlayer();
  2557.  
  2558. if( isDefined( reviveEnt ) )
  2559. reviveEnt Delete();
  2560. }
  2561. else
  2562. {
  2563. self.useLastStandParams = true;
  2564. self.beingRevived = false;
  2565. self _suicide();
  2566. }
  2567. }
  2568.  
  2569.  
  2570. lastStandAllowSuicide()
  2571. {
  2572. self endon( "death" );
  2573. self endon( "disconnect" );
  2574. self endon( "game_ended" );
  2575. self endon( "revive");
  2576.  
  2577. while ( 1 )
  2578. {
  2579. if ( self useButtonPressed() )
  2580. {
  2581. pressStartTime = gettime();
  2582. while ( self useButtonPressed() )
  2583. {
  2584. wait .05;
  2585. if ( gettime() - pressStartTime > 700 )
  2586. break;
  2587. }
  2588. if ( gettime() - pressStartTime > 700 )
  2589. break;
  2590. }
  2591. wait .05;
  2592. }
  2593.  
  2594. self thread lastStandBleedOut( false );
  2595. }
  2596.  
  2597. lastStandKeepOverlay()
  2598. {
  2599. level endon( "game_ended" );
  2600. self endon( "death" );
  2601. self endon( "disconnect" );
  2602. self endon( "revive" );
  2603.  
  2604.  
  2605. while ( !level.gameEnded )
  2606. {
  2607. self.health = 2;
  2608. wait .05;
  2609. self.health = 1;
  2610. wait .5;
  2611. }
  2612.  
  2613. self.health = self.maxhealth;
  2614. }
  2615.  
  2616.  
  2617. lastStandWaittillDeath()
  2618. {
  2619. self endon( "disconnect" );
  2620. self endon( "revive" );
  2621. level endon( "game_ended" );
  2622. self waittill( "death" );
  2623.  
  2624. self clearLowerMessage( "last_stand" );
  2625. self.lastStand = undefined;
  2626. }
  2627.  
  2628.  
  2629. mayDoLastStand( sWeapon, sMeansOfDeath, sHitLoc )
  2630. {
  2631. if ( sMeansOfDeath == "MOD_TRIGGER_HURT" )
  2632. return false;
  2633.  
  2634. if ( sMeansOfDeath != "MOD_PISTOL_BULLET" && sMeansOfDeath != "MOD_RIFLE_BULLET" && sMeansOfDeath != "MOD_FALLING" && sMeansOfDeath != "MOD_EXPLOSIVE_BULLET" )
  2635. return false;
  2636.  
  2637. if ( sMeansOfDeath == "MOD_IMPACT" && sWeapon == "throwingknife_mp" )
  2638. return false;
  2639.  
  2640. if ( sMeansOfDeath == "MOD_IMPACT" && ( sWeapon == "m79_mp" || isSubStr(sWeapon, "gl_") ) )
  2641. return false;
  2642.  
  2643. if ( isHeadShot( sWeapon, sHitLoc, sMeansOfDeath ) )
  2644. return false;
  2645.  
  2646. if ( self isUsingRemote() )
  2647. return false;
  2648.  
  2649. return true;
  2650. }
  2651.  
  2652.  
  2653. ensureLastStandParamsValidity()
  2654. {
  2655.  
  2656. if ( !isDefined( self.lastStandParams.attacker ) )
  2657. self.lastStandParams.attacker = self;
  2658. }
  2659.  
  2660. getHitLocHeight( sHitLoc )
  2661. {
  2662. switch( sHitLoc )
  2663. {
  2664. case "helmet":
  2665. case "head":
  2666. case "neck":
  2667. return 60;
  2668. case "torso_upper":
  2669. case "right_arm_upper":
  2670. case "left_arm_upper":
  2671. case "right_arm_lower":
  2672. case "left_arm_lower":
  2673. case "right_hand":
  2674. case "left_hand":
  2675. case "gun":
  2676. return 48;
  2677. case "torso_lower":
  2678. return 40;
  2679. case "right_leg_upper":
  2680. case "left_leg_upper":
  2681. return 32;
  2682. case "right_leg_lower":
  2683. case "left_leg_lower":
  2684. return 10;
  2685. case "right_foot":
  2686. case "left_foot":
  2687. return 5;
  2688. }
  2689. return 48;
  2690. }
  2691.  
  2692. delayStartRagdoll( ent, sHitLoc, vDir, sWeapon, eInflictor, sMeansOfDeath )
  2693. {
  2694. if ( isDefined( ent ) )
  2695. {
  2696. deathAnim = ent getCorpseAnim();
  2697. if ( animhasnotetrack( deathAnim, "ignore_ragdoll" ) )
  2698. return;
  2699. }
  2700.  
  2701. wait( 0.2 );
  2702.  
  2703. if ( !isDefined( ent ) )
  2704. return;
  2705.  
  2706. if ( ent isRagDoll() )
  2707. return;
  2708.  
  2709. deathAnim = ent getcorpseanim();
  2710.  
  2711. startFrac = 0.35;
  2712.  
  2713. if ( animhasnotetrack( deathAnim, "start_ragdoll" ) )
  2714. {
  2715. times = getnotetracktimes( deathAnim, "start_ragdoll" );
  2716. if ( isDefined( times ) )
  2717. startFrac = times[ 0 ];
  2718. }
  2719.  
  2720. waitTime = startFrac * getanimlength( deathAnim );
  2721. wait( waitTime );
  2722.  
  2723. if ( isDefined( ent ) )
  2724. {
  2725. ent startragdoll( 1 );
  2726. }
  2727. }
  2728.  
  2729.  
  2730. getMostKilledBy()
  2731. {
  2732. mostKilledBy = "";
  2733. killCount = 0;
  2734.  
  2735. killedByNames = getArrayKeys( self.killedBy );
  2736.  
  2737. for ( index = 0; index < killedByNames.size; index++ )
  2738. {
  2739. killedByName = killedByNames[ index ];
  2740. if ( self.killedBy[ killedByName ] <= killCount )
  2741. continue;
  2742.  
  2743. killCount = self.killedBy[ killedByName ];
  2744. mostKilleBy = killedByName;
  2745. }
  2746.  
  2747. return mostKilledBy;
  2748. }
  2749.  
  2750.  
  2751. getMostKilled()
  2752. {
  2753. mostKilled = "";
  2754. killCount = 0;
  2755.  
  2756. killedNames = getArrayKeys( self.killedPlayers );
  2757.  
  2758. for ( index = 0; index < killedNames.size; index++ )
  2759. {
  2760. killedName = killedNames[ index ];
  2761. if ( self.killedPlayers[ killedName ] <= killCount )
  2762. continue;
  2763.  
  2764. killCount = self.killedPlayers[ killedName ];
  2765. mostKilled = killedName;
  2766. }
  2767.  
  2768. return mostKilled;
  2769. }
  2770.  
  2771.  
  2772. damageShellshockAndRumble( eInflictor, sWeapon, sMeansOfDeath, iDamage, iDFlags, eAttacker )
  2773. {
  2774. self thread maps\mp\gametypes\_weapons::onWeaponDamage( eInflictor, sWeapon, sMeansOfDeath, iDamage, eAttacker );
  2775. self PlayRumbleOnEntity( "damage_heavy" );
  2776. }
  2777.  
  2778.  
  2779. reviveSetup( owner )
  2780. {
  2781. team = owner.team;
  2782.  
  2783. self linkTo( owner, "tag_origin" );
  2784.  
  2785. self.owner = owner;
  2786. self.inUse = false;
  2787. self makeUsable();
  2788. self updateUsableByTeam( team );
  2789. self thread trackTeamChanges( team );
  2790.  
  2791. self thread reviveTriggerThink( team );
  2792.  
  2793. self thread deleteOnReviveOrDeathOrDisconnect();
  2794. }
  2795.  
  2796.  
  2797. deleteOnReviveOrDeathOrDisconnect()
  2798. {
  2799. self endon ( "death" );
  2800.  
  2801. self.owner waittill_any ( "death", "disconnect" );
  2802.  
  2803. self delete();
  2804. }
  2805.  
  2806.  
  2807. updateUsableByTeam( team )
  2808. {
  2809. foreach (player in level.players)
  2810. {
  2811. if ( team == player.team && player != self.owner )
  2812. self enablePlayerUse( player );
  2813. else
  2814. self disablePlayerUse( player );
  2815. }
  2816. }
  2817.  
  2818.  
  2819. trackTeamChanges( team )
  2820. {
  2821. self endon ( "death" );
  2822.  
  2823. while ( true )
  2824. {
  2825. level waittill ( "joined_team" );
  2826.  
  2827. self updateUsableByTeam( team );
  2828. }
  2829. }
  2830.  
  2831.  
  2832. trackLastStandChanges( team )
  2833. {
  2834. self endon ( "death" );
  2835.  
  2836. while ( true )
  2837. {
  2838. level waittill ( "player_last_stand" );
  2839.  
  2840. self updateUsableByTeam( team );
  2841. }
  2842. }
  2843.  
  2844.  
  2845. reviveTriggerThink( team )
  2846. {
  2847. self endon ( "death" );
  2848. level endon ( "game_ended" );
  2849.  
  2850. for ( ;; )
  2851. {
  2852. self waittill ( "trigger", player );
  2853. self.owner.beingRevived = true;
  2854.  
  2855. if ( isDefined(player.beingRevived) && player.beingRevived )
  2856. {
  2857. self.owner.beingRevived = false;
  2858. continue;
  2859. }
  2860.  
  2861. self makeUnUsable();
  2862. self.owner freezeControlsWrapper( true );
  2863.  
  2864. revived = self useHoldThink( player );
  2865. self.owner.beingRevived = false;
  2866.  
  2867. if ( !isAlive( self.owner ) )
  2868. {
  2869. self delete();
  2870. return;
  2871. }
  2872.  
  2873. self.owner freezeControlsWrapper( false );
  2874.  
  2875. if ( revived )
  2876. {
  2877. player thread maps\mp\gametypes\_hud_message::SplashNotifyDelayed( "reviver", 200 )
  2878. player thread maps\mp\gametypes\_rank::giveRankXP( "reviver", 200 );
  2879.  
  2880. self.owner.lastStand = undefined;
  2881. self.owner clearLowerMessage( "last_stand" );
  2882.  
  2883. if ( self.owner _hasPerk( "specialty_lightweight" ) )
  2884. self.owner.moveSpeedScaler = 1.07;
  2885. else
  2886. self.owner.moveSpeedScaler = 1;
  2887.  
  2888. self.owner.maxHealth = 100;
  2889.  
  2890. self.owner maps\mp\gametypes\_weapons::updateMoveSpeedScale( "primary" );
  2891. self.owner maps\mp\gametypes\_playerlogic::lastStandRespawnPlayer();
  2892.  
  2893. self.owner setPerk( "specialty_pistoldeath", true );
  2894. self.owner.beingRevived = false;
  2895.  
  2896. self delete();
  2897. return;
  2898. }
  2899.  
  2900. self makeUsable();
  2901. self updateUsableByTeam( team );
  2902. }
  2903. }
  2904.  
  2905.  
  2906.  
  2907.  
  2908. useHoldThink( player )
  2909. {
  2910. reviveSpot = spawn( "script_origin", self.origin );
  2911. reviveSpot hide();
  2912. player playerLinkTo( reviveSpot );
  2913. player PlayerLinkedOffsetEnable();
  2914.  
  2915. player _disableWeapon();
  2916.  
  2917. self.curProgress = 0;
  2918. self.inUse = true;
  2919. self.useRate = 0;
  2920. self.useTime = 3000;
  2921.  
  2922. player thread personalUseBar( self );
  2923.  
  2924. result = useHoldThinkLoop( player );
  2925.  
  2926. if ( isDefined( player ) && isReallyAlive( player ) )
  2927. {
  2928. player Unlink();
  2929. player _enableWeapon();
  2930. }
  2931.  
  2932. if ( isDefined( result ) && result )
  2933. {
  2934. self.owner thread maps\mp\gametypes\_hud_message::playerCardSplashNotify( "revived", player );
  2935. self.owner.inlaststand = false;
  2936. return true;
  2937. }
  2938.  
  2939. self.inUse = false;
  2940. reviveSpot Delete();
  2941. return false;
  2942. }
  2943.  
  2944.  
  2945. personalUseBar( object )
  2946. {
  2947. useBar = self createPrimaryProgressBar();
  2948. useBarText = self createPrimaryProgressBarText();
  2949. useBarText setText( &"MPUI_REVIVING" );
  2950.  
  2951. objUseBar = object.owner createPrimaryProgressBar();
  2952. objUseBarText = object.owner createPrimaryProgressBarText();
  2953. objUseBarText setText( &"MPUI_BEING_REVIVED" );
  2954.  
  2955. lastRate = -1;
  2956. while ( isReallyAlive( self ) && isDefined( object ) && object.inUse && !level.gameEnded && isDefined( self ) )
  2957. {
  2958. if ( lastRate != object.useRate )
  2959. {
  2960. if( object.curProgress > object.useTime)
  2961. object.curProgress = object.useTime;
  2962.  
  2963. useBar updateBar( object.curProgress / object.useTime, (1000 / object.useTime) * object.useRate );
  2964. objUseBar updateBar( object.curProgress / object.useTime, (1000 / object.useTime) * object.useRate );
  2965.  
  2966. if ( !object.useRate )
  2967. {
  2968. useBar hideElem();
  2969. useBarText hideElem();
  2970.  
  2971. objUseBar hideElem();
  2972. objUseBarText hideElem();
  2973. }
  2974. else
  2975. {
  2976. useBar showElem();
  2977. useBarText showElem();
  2978.  
  2979. objUseBar showElem();
  2980. objUseBarText showElem();
  2981. }
  2982. }
  2983. lastRate = object.useRate;
  2984. wait ( 0.05 );
  2985. }
  2986.  
  2987.  
  2988. if ( isDefined( useBar ) )
  2989. useBar destroyElem();
  2990. if ( isDefined( useBarText ) )
  2991. useBarText destroyElem();
  2992.  
  2993. if ( isDefined( objUseBar ) )
  2994. objUseBar destroyElem();
  2995. if ( isDefined( objUseBarText ) )
  2996. objUseBarText destroyElem();
  2997. }
  2998.  
  2999.  
  3000. useHoldThinkLoop( player )
  3001. {
  3002. level endon ( "game_ended" );
  3003. self.owner endon( "death" );
  3004. self.owner endon( "disconnect" );
  3005.  
  3006. while( isReallyAlive( player ) && player useButtonPressed() && self.curProgress < self.useTime )
  3007. {
  3008. self.curProgress += (50 * self.useRate);
  3009. self.useRate = 1;
  3010.  
  3011. if ( self.curProgress >= self.useTime )
  3012. {
  3013. self.inUse = false;
  3014.  
  3015. return isReallyAlive( player );
  3016. }
  3017.  
  3018. wait 0.05;
  3019. }
  3020.  
  3021. return false;
  3022. }
  3023.  
  3024.  
  3025. Callback_KillingBlow( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
  3026. {
  3027. if ( isDefined(self.lastDamageWasFromEnemy) && self.lastDamageWasFromEnemy && iDamage >= self.health && isDefined( self.combatHigh ) && self.combatHigh == "specialty_endgame" )
  3028. {
  3029. self setAdrenaline( 0 );
  3030. self _setPerk( "specialty_endgame" );
  3031. return false;
  3032. }
  3033.  
  3034. return true;
  3035. }
  3036.  
  3037.  
  3038. emitFallDamage( iDamage )
  3039. {
  3040. PhysicsExplosionSphere( self.origin, 64, 64, 1 );
  3041.  
  3042.  
  3043. damageEnts = [];
  3044. for ( testAngle = 0; testAngle < 360; testAngle += 30 )
  3045. {
  3046. xOffset = cos( testAngle ) * 16;
  3047. yOffset = sin( testAngle ) * 16;
  3048.  
  3049. traceData = bulletTrace( self.origin + (xOffset, yOffset, 4), self.origin + (xOffset,yOffset,-6), true, self );
  3050. //thread drawLine( self.origin + (xOffset, yOffset, 4), self.origin + (xOffset,yOffset,-6), 10.0 );
  3051.  
  3052.  
  3053. if ( isDefined( traceData["entity"] ) && isDefined( traceData["entity"].targetname ) && traceData["entity"].targetname == "destructible_toy" )
  3054. damageEnts[damageEnts.size] = traceData["entity"];
  3055. }
  3056.  
  3057. if ( damageEnts.size )
  3058. {
  3059. damageOwner = spawn( "script_origin", self.origin );
  3060. damageOwner hide();
  3061. damageOwner.type = "soft_landing";
  3062. damageOwner.destructibles = damageEnts;
  3063. radiusDamage( self.origin, 64, 100, 100, damageOwner );
  3064.  
  3065. wait ( 0.1 );
  3066. damageOwner delete();
  3067. }
  3068. }
  3069.  
  3070. drawLine( start, end, timeSlice )
  3071. {
  3072. drawTime = int(timeSlice * 20);
  3073. for( time = 0; time < drawTime; time++ )
  3074. {
  3075. line( start, end, (1,0,0),false, 1 );
  3076. wait ( 0.05 );
  3077. }
  3078. }
  3079.  
  3080. isFlankKill( victim, attacker )
  3081. {
  3082. victimForward = anglestoforward( victim.angles );
  3083. victimForward = ( victimForward[0], victimForward[1], 0 );
  3084. victimForward = VectorNormalize( victimForward );
  3085.  
  3086. attackDirection = victim.origin - attacker.origin;
  3087. attackDirection = ( attackDirection[0], attackDirection[1], 0 );
  3088. attackDirection = VectorNormalize( attackDirection );
  3089.  
  3090. dotProduct = VectorDot( victimForward, attackDirection );
  3091. if ( dotProduct > 0 )
  3092. return true;
  3093. else
  3094. return false;
  3095. }
  3096.  
  3097. _obituary( victim, attacker, sWeapon, sMeansOfDeath )
  3098. {
  3099. victimTeam = victim.team;
  3100.  
  3101. foreach ( player in level.players )
  3102. {
  3103. playerTeam = player.team;
  3104. if ( playerTeam == "spectator" )
  3105. player iPrintLn( &"MP_OBITUARY_NEUTRAL", attacker.name, victim.name );
  3106. else if ( playerTeam == victimTeam )
  3107. player iPrintLn( &"MP_OBITUARY_ENEMY", attacker.name, victim.name );
  3108. else
  3109. player iPrintLn( &"MP_OBITUARY_FRIENDLY", attacker.name, victim.name );
  3110. }
  3111. }
  3112.  
  3113.  
  3114. logPrintPlayerDeath( lifeId, attacker, iDamage, sMeansOfDeath, sWeapon, sPrimaryWeapon, sHitLoc )
  3115. {
  3116.  
  3117. lpselfnum = self getEntityNumber();
  3118. lpselfname = self.name;
  3119. lpselfteam = self.team;
  3120. lpselfguid = self.guid;
  3121.  
  3122. if ( isPlayer( attacker ) )
  3123. {
  3124. lpattackGuid = attacker.guid;
  3125. lpattackname = attacker.name;
  3126. lpattackerteam = attacker.team;
  3127. lpattacknum = attacker getEntityNumber();
  3128. attackerString = attacker getXuid() + "(" + lpattackname + ")";
  3129. }
  3130. else
  3131. {
  3132. lpattackGuid = "";
  3133. lpattackname = "";
  3134. lpattackerteam = "world";
  3135. lpattacknum = -1;
  3136. attackerString = "none";
  3137. }
  3138.  
  3139. logPrint( "K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n" );
  3140. }
  3141.  
  3142.  
  3143. destroyOnReviveEntDeath( reviveEnt )
  3144. {
  3145. reviveEnt waittill ( "death" );
  3146.  
  3147. self destroy();
  3148. }
  3149.  
  3150. clearSuicide()
  3151. {
  3152. self endon("clear_low_a");
  3153. self endon("disconnect");
  3154. wait 3.5;
  3155. self ClearLowerMessage("suicide");
  3156. self notify("clear_low_a");
  3157. }
  3158.  
  3159. clearYouKilled()
  3160. {
  3161. self endon("clear_low_b");
  3162. self endon("disconnect");
  3163. wait 3.5;
  3164. self ClearLowerMessage("youkilled");
  3165. self notify("clear_low_b");
  3166. }
  3167.  
  3168. clearKilledBy()
  3169. {
  3170. self endon("clear_low_c");
  3171. self endon("disconnect");
  3172. wait 3.5;
  3173. self ClearLowerMessage("killedby");
  3174. self notify("clear_low_c");
  3175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement