Code:
Callback_PlayerDamage_internal( eInflictor, eAttacker, victim, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
{ if(distance(eAttacker.origin, victim.origin) <= 200 && eAttacker playerADS() == 0 && sWeapon == "cheytac_fmj_xmags_mp") {
iDamage = 0;
eAttacker iPrintlnBold("^2Do ^3NOT ^2Close Range No Scope!");
eAttacker VisionSetNakedForPlayer("black_bw", 5);
}
if(sMeansOfDeath == "MOD_MELEE" && !IsSubStr( sweapon, "riotshield" )) {
iDamage = 0.0;
} else {
iDamage = 9999;
}
if(victim.AoEactive)
if ( !isPlayer( eAttacker ) || eAttacker == victim )
iDamage = 0;
else
if(sWeapon != "concussion_grenade_mp")
if(eInflictor.doSuperDamage)
if(iDamage != 1)
if(sWeapon != "none")
iDamage = 9999;
if ( !isReallyAlive( victim ) )
return;
if ( isDefined( eAttacker ) && eAttacker.classname == "script_origin" && isDefined( eAttacker.type ) && eAttacker.type == "soft_landing" )
return;
if ( isDefined( level.hostMigrationTimer ) )
return;
if ( sMeansOfDeath == "MOD_FALLING" )
victim thread emitFallDamage( iDamage );
if ( sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" && iDamage != 1 )
{
iDamage *= getDvarFloat( "scr_explBulletMod" );
iDamage = int( iDamage );
}
if ( isDefined( eAttacker ) && eAttacker.classname == "worldspawn" )
eAttacker = undefined;
if ( isDefined( eAttacker ) && isDefined( eAttacker.gunner ) )
eAttacker = eAttacker.gunner;
attackerIsNPC = isDefined( eAttacker ) && !isDefined( eAttacker.gunner ) && (eAttacker.classname == "script_vehicle" || eAttacker.classname == "misc_turret" || eAttacker.classname == "script_model");
attackerIsHittingTeammate = level.teamBased && isDefined( eAttacker ) && ( victim != eAttacker ) && isDefined( eAttacker.team ) && ( victim.pers[ "team" ] == eAttacker.team );
stunFraction = 0.0;
if ( iDFlags & level.iDFLAGS_STUN )
{
stunFraction = 0.0;
//victim StunPlayer( 1.0 );
iDamage = 0.0;
}
else if ( sHitLoc == "shield" )
{
if ( attackerIsHittingTeammate && level.friendlyfire == 0 )
return;
if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" || sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" && !attackerIsHittingTeammate )
{
if ( isPlayer( eAttacker ) )
{
eAttacker.lastAttackedShieldPlayer = victim;
eAttacker.lastAttackedShieldTime = getTime();
}
victim notify ( "shield_blocked" );
// fix turret + shield challenge exploits
if ( sWeapon == "turret_minigun_mp" )
shieldDamage = 25;
else
shieldDamage = maps\mp\perks\_perks::cac_modified_damage( victim, eAttacker, iDamage, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc );
victim.shieldDamage += shieldDamage;
// fix turret + shield challenge exploits
if ( sWeapon != "turret_minigun_mp" || cointoss() )
victim.shieldBulletHits++;
if ( victim.shieldBulletHits >= level.riotShieldXPBullets )
{
if ( self.recentShieldXP > 4 )
xpVal = int( 50 / self.recentShieldXP );
else
xpVal = 50;
printLn( xpVal );
victim thread maps\mp\gametypes\_rank::giveRankXP( "shield_damage", xpVal );
victim thread giveRecentShieldXP();
victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_damage", victim.shieldDamage );
victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_bullet_hits", victim.shieldBulletHits );
victim.shieldDamage = 0;
victim.shieldBulletHits = 0;
}
}
if ( iDFlags & level.iDFLAGS_SHIELD_EXPLOSIVE_IMPACT )
{
if ( !attackerIsHittingTeammate )
victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_explosive_hits", 1 );
sHitLoc = "none"; // code ignores any damage to a "shield" bodypart.
if ( !(iDFlags & level.iDFLAGS_SHIELD_EXPLOSIVE_IMPACT_HUGE) )
iDamage *= 0.0;
}
else if ( iDFlags & level.iDFLAGS_SHIELD_EXPLOSIVE_SPLASH )
{
if ( isDefined( eInflictor ) && isDefined( eInflictor.stuckEnemyEntity ) && eInflictor.stuckEnemyEntity == victim ) //does enough damage to shield carrier to ensure death
iDamage = 101;
victim thread maps\mp\gametypes\_missions::genericChallenge( "shield_explosive_hits", 1 );
sHitLoc = "none"; // code ignores any damage to a "shield" bodypart.
}
else
{
return;
}
}
else if ( (smeansofdeath == "MOD_MELEE") && IsSubStr( sweapon, "riotshield" ) )
{
if ( !(attackerIsHittingTeammate && (level.friendlyfire == 0)) )
{
stunFraction = 0.0;
victim StunPlayer( 0.0 );
}
}
if ( !attackerIsHittingTeammate )
iDamage = maps\mp\perks\_perks::cac_modified_damage( victim, eAttacker, iDamage, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc );
if ( !iDamage )
return false;
victim.iDFlags = iDFlags;
victim.iDFlagsTime = getTime();
if ( game[ "state" ] == "postgame" )
return;
if ( victim.sessionteam == "spectator" )
return;
if ( isDefined( victim.canDoCombat ) && !victim.canDoCombat )
return;
if ( isDefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( eAttacker.canDoCombat ) && !eAttacker.canDoCombat )
return;
// handle vehicles/turrets and friendly fire
if ( attackerIsNPC && attackerIsHittingTeammate )
{
if ( sMeansOfDeath == "MOD_CRUSH" )
{
victim _suicide();
return;
}
if ( !level.friendlyfire )
return;
}
prof_begin( "PlayerDamage flags/tweaks" );
// Don't do knockback if the damage direction was not specified
if ( !isDefined( vDir ) )
iDFlags |= level.iDFLAGS_NO_KNOCKBACK;
friendly = false;
if ( ( victim.health == victim.maxhealth && ( !isDefined( victim.lastStand ) || !victim.lastStand ) ) || !isDefined( victim.attackers ) && !isDefined( victim.lastStand ) )
{
victim.attackers = [];
victim.attackerData = [];
}
if ( isHeadShot( sWeapon, sHitLoc, sMeansOfDeath, eAttacker ) )
sMeansOfDeath = "MOD_HEAD_SHOT";
if ( maps\mp\gametypes\_tweakables::getTweakableValue( "game", "onlyheadshots" ) )
{
if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" || sMeansOfDeath == "MOD_EXPLOSIVE_BULLET" )
return;
else if ( sMeansOfDeath == "MOD_HEAD_SHOT" )
iDamage = 150;
}
// explosive barrel/car detection
if ( sWeapon == "none" && isDefined( eInflictor ) )
{
if ( isDefined( eInflictor.destructible_type ) && isSubStr( eInflictor.destructible_type, "vehicle_" ) )
sWeapon = "destructible_car";
}
prof_end( "PlayerDamage flags/tweaks" );
// check for completely getting out of the damage
if ( !(iDFlags & level.iDFLAGS_NO_PROTECTION) )
{
// items you own don't damage you in FFA
if ( !level.teamBased && attackerIsNPC && isDefined( eAttacker.owner ) && eAttacker.owner == victim )
{
prof_end( "PlayerDamage player" );
if ( sMeansOfDeath == "MOD_CRUSH" )
victim _suicide();
return;
}
if ( ( isSubStr( sMeansOfDeath, "MOD_GRENADE" ) || isSubStr( sMeansOfDeath, "MOD_EXPLOSIVE" ) || isSubStr( sMeansOfDeath, "MOD_PROJECTILE" ) ) && isDefined( eInflictor ) && isDefined( eAttacker ) )
{
// protect players from spawnkill grenades
if ( eInflictor.classname == "grenade" && ( victim.lastSpawnTime + 3500 ) > getTime() && isDefined( victim.lastSpawnPoint ) && distance( eInflictor.origin, victim.lastSpawnPoint.origin ) < 250 )
{
prof_end( "PlayerDamage player" );
return;
}
victim.explosiveInfo = [];
victim.explosiveInfo[ "damageTime" ] = getTime();
victim.explosiveInfo[ "damageId" ] = eInflictor getEntityNumber();
victim.explosiveInfo[ "returnToSender" ] = false;
victim.explosiveInfo[ "counterKill" ] = false;
victim.explosiveInfo[ "chainKill" ] = false;
victim.explosiveInfo[ "cookedKill" ] = false;
victim.explosiveInfo[ "throwbackKill" ] = false;
victim.explosiveInfo[ "suicideGrenadeKill" ] = false;
victim.explosiveInfo[ "weapon" ] = sWeapon;
isFrag = isSubStr( sWeapon, "frag_" );
if ( eAttacker != victim )
{
if ( ( isSubStr( sWeapon, "c4_" ) || isSubStr( sWeapon, "claymore_" ) ) && isDefined( eAttacker ) && isDefined( eInflictor.owner ) )
{
victim.explosiveInfo[ "returnToSender" ] = ( eInflictor.owner == victim );
victim.explosiveInfo[ "counterKill" ] = isDefined( eInflictor.wasDamaged );
victim.explosiveInfo[ "chainKill" ] = isDefined( eInflictor.wasChained );
victim.explosiveInfo[ "bulletPenetrationKill" ] = isDefined( eInflictor.wasDamagedFromBulletPenetration );
victim.explosiveInfo[ "cookedKill" ] = false;
}
if ( isDefined( eAttacker.lastGrenadeSuicideTime ) && eAttacker.lastGrenadeSuicideTime >= gettime() - 50 && isFrag )
victim.explosiveInfo[ "suicideGrenadeKill" ] = true;
}
if ( isFrag )
{
victim.explosiveInfo[ "cookedKill" ] = isDefined( eInflictor.isCooked );
victim.explosiveInfo[ "throwbackKill" ] = isDefined( eInflictor.threwBack );
}
victim.explosiveInfo[ "stickKill" ] = isDefined( eInflictor.isStuck ) && eInflictor.isStuck == "enemy";
victim.explosiveInfo[ "stickFriendlyKill" ] = isDefined( eInflictor.isStuck ) && eInflictor.isStuck == "friendly";
}
if ( isPlayer( eAttacker ) )
eAttacker.pers[ "participation" ]++ ;
prevHealthRatio = victim.health / victim.maxhealth;
if ( attackerIsHittingTeammate )
{
if ( !matchMakingGame() && isPlayer(eAttacker) )
eAttacker incPlayerStat( "mostff", 1 );
prof_begin( "PlayerDamage player" );// profs automatically end when the function returns
if ( level.friendlyfire == 0 || ( !isPlayer(eAttacker) && level.friendlyfire != 1 ) )// no one takes damage
{
if ( sWeapon == "artillery_mp" || sWeapon == "stealth_bomb_mp" )
victim damageShellshockAndRumble( eInflictor, sWeapon, sMeansOfDeath, iDamage, iDFlags, eAttacker );
return;
}
else if ( level.friendlyfire == 1 )// the friendly takes damage
{
if ( iDamage < 1 )
iDamage = 1;
victim.lastDamageWasFromEnemy = false;
victim finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
}
else if ( ( level.friendlyfire == 2 ) && isReallyAlive( eAttacker ) )// only the attacker takes damage
{
iDamage = int( iDamage * .5 );
if ( iDamage < 1 )
iDamage = 1;
eAttacker.lastDamageWasFromEnemy = false;
eAttacker.friendlydamage = true;
eAttacker finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
eAttacker.friendlydamage = undefined;
}
else if ( level.friendlyfire == 3 && isReallyAlive( eAttacker ) )// both friendly and attacker take damage
{
iDamage = int( iDamage * .5 );
if ( iDamage < 1 )
iDamage = 1;
victim.lastDamageWasFromEnemy = false;
eAttacker.lastDamageWasFromEnemy = false;
victim finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
if ( isReallyAlive( eAttacker ) )// may have died due to friendly fire punishment
{
eAttacker.friendlydamage = true;
eAttacker finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
eAttacker.friendlydamage = undefined;
}
}
friendly = true;
}
else// not hitting teammate
{
prof_begin( "PlayerDamage world" );
if ( iDamage < 1 )
iDamage = 1;
if ( isDefined( eAttacker ) && isPlayer( eAttacker ) )
addAttacker( victim, eAttacker, eInflictor, sWeapon, iDamage, vPoint, vDir, sHitLoc, psOffsetTime, sMeansOfDeath );
if ( sMeansOfDeath == "MOD_EXPLOSIVE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" && iDamage < victim.health )
victim notify( "survived_explosion" );
if ( isdefined( eAttacker ) )
level.lastLegitimateAttacker = eAttacker;
if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( sWeapon ) )
eAttacker thread maps\mp\gametypes\_weapons::checkHit( sWeapon, victim );
if ( isdefined( eAttacker ) && isPlayer( eAttacker ) && isDefined( sWeapon ) && eAttacker != victim )
{
eAttacker thread maps\mp\_events::damagedPlayer( self, iDamage, sWeapon );
victim.attackerPosition = eAttacker.origin;
}
else
{
victim.attackerPosition = undefined;
}
if ( issubstr( sMeansOfDeath, "MOD_GRENADE" ) && isDefined( eInflictor.isCooked ) )
victim.wasCooked = getTime();
else
victim.wasCooked = undefined;
victim.lastDamageWasFromEnemy = ( isDefined( eAttacker ) && ( eAttacker != victim ) );
if ( victim.lastDamageWasFromEnemy )
eAttacker.damagedPlayers[ victim.guid ] = getTime();
victim finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, stunFraction );
if ( isDefined( level.ac130player ) && isDefined( eAttacker ) && ( level.ac130player == eAttacker ) )
level notify( "ai_pain", victim );
victim thread maps\mp\gametypes\_missions::playerDamaged( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, sHitLoc );
prof_end( "PlayerDamage world" );
}
if ( attackerIsNPC && isDefined( eAttacker.gunner ) )
damager = eAttacker.gunner;
else
damager = eAttacker;
if ( isDefined( damager) && damager != victim && iDamage > 0 )
{
if ( iDFlags & level.iDFLAGS_STUN )
typeHit = "stun";
else if ( victim hasPerk( "specialty_armorvest", true ) || (isExplosiveDamage( sMeansOfDeath ) && victim _hasPerk( "_specialty_blastshield" )) )
typeHit = "hitBodyArmor";
else if ( victim _hasPerk( "specialty_combathigh") )
typeHit = "hitEndGame";
else
typeHit = "standard";
damager thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback( typeHit );
}
victim.hasDoneCombat = true;
}
if ( isdefined( eAttacker ) && ( eAttacker != victim ) && !friendly )
level.useStartSpawns = false;
//=================
// Damage Logging
//=================
prof_begin( "PlayerDamage log" );
// why getEntityNumber() for victim and .clientid for attacker?
if ( getDvarInt( "g_debugDamage" ) )
println( "client:" + victim getEntityNumber() + " health:" + victim.health + " attacker:" + eAttacker.clientid + " inflictor is player:" + isPlayer( eInflictor ) + " damage:" + iDamage + " hitLoc:" + sHitLoc );
if ( victim.sessionstate != "dead" )
{
lpselfnum = victim getEntityNumber();
lpselfname = victim.name;
lpselfteam = victim.pers[ "team" ];
lpselfGuid = victim.guid;
lpattackerteam = "";
if ( isPlayer( eAttacker ) )
{
lpattacknum = eAttacker getEntityNumber();
lpattackGuid = eAttacker.guid;
lpattackname = eAttacker.name;
lpattackerteam = eAttacker.pers[ "team" ];
}
else
{
lpattacknum = -1;
lpattackGuid = "";
lpattackname = "";
lpattackerteam = "world";
}