2024-12-11 11:28:08 +01:00

1029 lines
33 KiB
Plaintext

#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include maps\mp\perks\_perkfunctions;
PERK_STRING_TABLE = "mp/perkTable.csv";
PERK_REF_COLUMN = 1;
PERK_NAME_COLUMN = 2;
PERK_ICON_COLUMN = 3;
THERMO_DEBUFF_DURATION = 5000;
init()
{
level.perkFuncs = [];
//level.spawnGlowSplat = loadfx( "fx/misc/flare_ambient_destroy" );
level.spawnGlowModel["enemy"] = "emergency_flare_iw6";
level.spawnGlowModel["friendly"] = "emergency_flare_iw6";
level.spawnGlow["enemy"] = loadfx( "fx/misc/flare_ambient" );
level.spawnGlow["friendly"] = loadfx( "fx/misc/flare_ambient_green" );
//level.c4Death = loadfx( "fx/explosions/javelin_explosion" );
level.spawnFire = loadfx( "fx/props/barrelexp" );
level._effect["ricochet"] = loadfx( "fx/impacts/large_metalhit_1" );
// perks that currently only exist in script: these will error if passed to "setPerk", etc... CASE SENSITIVE! must be lower
level.scriptPerks = [];
level.perkSetFuncs = [];
level.perkUnsetFuncs = [];
level.fauxPerks = [];
level.scriptPerks[ "_specialty_blastshield" ] = true;
level.scriptPerks[ "_specialty_onemanarmy" ] = true;
level.scriptPerks[ "_specialty_rearview" ] = true;
level.scriptPerks[ "specialty_ac130" ] = true;
level.scriptPerks[ "specialty_akimbo" ] = true;
level.scriptPerks[ "specialty_anytwo" ] = true;
level.scriptPerks[ "specialty_armorpiercing" ] = true;
level.scriptPerks[ "specialty_assists" ] = true;
level.scriptPerks[ "specialty_autospot" ] = true;
level.scriptPerks[ "specialty_blackbox" ] = true;
level.scriptPerks[ "specialty_blastshield" ] = true;
level.scriptPerks[ "specialty_bloodrush" ] = true;
level.scriptPerks[ "specialty_boom" ] = true;
level.scriptPerks[ "specialty_challenger" ] = true;
level.scriptPerks[ "specialty_combat_speed" ] = true;
level.scriptPerks[ "specialty_comexp" ] = true;
level.scriptPerks[ "specialty_concussiongrenade" ] = true;
level.scriptPerks[ "specialty_dangerclose" ] = true;
level.scriptPerks[ "specialty_deadeye" ] = true;
level.scriptPerks[ "specialty_delaymine" ] = true;
level.scriptPerks[ "specialty_double_load" ] = true;
level.scriptPerks[ "specialty_endgame" ] = true;
level.scriptPerks[ "specialty_explosivedamage" ] = true;
level.scriptPerks[ "specialty_extra_attachment" ] = true;
level.scriptPerks[ "specialty_extra_deadly" ] = true;
level.scriptPerks[ "specialty_extra_equipment" ] = true;
level.scriptPerks[ "specialty_extraspecialduration" ] = true;
level.scriptPerks[ "specialty_falldamage" ] = true;
level.scriptPerks[ "specialty_fasterlockon" ] = true;
level.scriptPerks[ "specialty_feigndeath" ] = true;
level.scriptPerks[ "specialty_flashgrenade" ] = true;
level.scriptPerks[ "specialty_gambler" ] = true;
level.scriptPerks[ "specialty_gunsmith" ] = true;
level.scriptPerks[ "specialty_hard_shell" ] = true;
level.scriptPerks[ "specialty_hardjack" ] = true;
level.scriptPerks[ "specialty_hardline" ] = true;
level.scriptPerks[ "specialty_helicopter_minigun" ] = true;
level.scriptPerks[ "specialty_incog" ] = true;
level.scriptPerks[ "specialty_laststandoffhand" ] = true;
level.scriptPerks[ "specialty_littlebird_support" ] = true;
level.scriptPerks[ "specialty_localjammer" ] = true;
level.scriptPerks[ "specialty_luckycharm" ] = true;
level.scriptPerks[ "specialty_moreHealth" ] = true;
level.scriptPerks[ "specialty_omaquickchange" ] = true;
level.scriptPerks[ "specialty_onemanarmy" ] = true;
level.scriptPerks[ "specialty_overkillpro" ] = true;
level.scriptPerks[ "specialty_paint" ] = true;
level.scriptPerks[ "specialty_paint_pro" ] = true;
level.scriptPerks[ "specialty_pitcher" ] = true;
level.scriptPerks[ "specialty_precision_airstrike" ] = true;
level.scriptPerks[ "specialty_predator_missile" ] = true;
level.scriptPerks[ "specialty_primarydeath" ] = true;
level.scriptPerks[ "specialty_rearview" ] = true;
level.scriptPerks[ "specialty_refill_ammo" ] = true;
level.scriptPerks[ "specialty_refill_grenades" ] = true;
level.scriptPerks[ "specialty_regenfaster" ] = true;
level.scriptPerks[ "specialty_rollover" ] = true;
level.scriptPerks[ "specialty_saboteur" ] = true;
level.scriptPerks[ "specialty_secondarybling" ] = true;
level.scriptPerks[ "specialty_sentry_minigun" ] = true;
level.scriptPerks[ "specialty_shellshock" ] = true;
level.scriptPerks[ "specialty_shield" ] = true;
level.scriptPerks[ "specialty_smokegrenade" ] = true;
level.scriptPerks[ "specialty_steadyaimpro" ] = true;
level.scriptPerks[ "specialty_steelnerves" ] = true;
level.scriptPerks[ "specialty_stun_resistance" ] = true;
level.scriptPerks[ "specialty_tagger" ] = true;
level.scriptPerks[ "specialty_tank" ] = true;
level.scriptPerks[ "specialty_thermal" ] = true;
level.scriptPerks[ "specialty_triggerhappy" ] = true;
level.scriptPerks[ "specialty_twoprimaries" ] = true;
level.scriptPerks[ "specialty_weaponlaser" ] = true;
level.fauxPerks["specialty_shield"] = true;
// weapon buffs
level.scriptPerks["specialty_marksman"] = true;
level.scriptPerks["specialty_sharp_focus"] = true;
level.scriptPerks["specialty_bling"] = true;
level.scriptPerks["specialty_moredamage"] = true;
// weapon attachment perks
level.scriptPerks["specialty_rshieldradar"] = true;
level.scriptPerks["specialty_rshieldscrambler"] = true;
// death streaks
level.scriptPerks["specialty_combathigh"] = true;
level.scriptPerks["specialty_finalstand"] = true;
level.scriptPerks["specialty_c4death"] = true;
level.scriptPerks["specialty_juiced"] = true;
level.scriptPerks["specialty_revenge"] = true;
level.scriptPerks["specialty_light_armor"] = true;
level.scriptPerks["specialty_carepackage"] = true;
level.scriptPerks["specialty_stopping_power"] = true;
level.scriptPerks["specialty_uav"] = true;
// equipment
level.scriptPerks["bouncingbetty_mp"] = true;
level.scriptPerks["c4_mp"] = true;
level.scriptPerks["claymore_mp"] = true;
level.scriptPerks["frag_grenade_mp"] = true;
level.scriptPerks["semtex_mp"] = true;
level.scriptPerks["throwingknife_mp"] = true;
level.scriptPerks["throwingknifejugg_mp"] = true;
level.scriptPerks["thermobaric_grenade_mp"] = true;
level.scriptPerks["mortar_shell_mp"] = true;
level.scriptPerks["proximity_explosive_mp"] = true;
level.scriptPerks["mortar_shelljugg_mp"] = true;
// special grenades
level.scriptPerks["concussion_grenade_mp"] = true;
level.scriptPerks["flash_grenade_mp"] = true;
level.scriptPerks["smoke_grenade_mp"] = true;
level.scriptPerks["smoke_grenadejugg_mp"] = true;
level.scriptPerks["emp_grenade_mp"] = true;
//level.scriptPerks["specialty_portable_radar"] = true;
//level.scriptPerks["specialty_scrambler"] = true;
level.scriptPerks["specialty_tacticalinsertion"] = true;
level.scriptPerks["trophy_mp"] = true;
level.scriptPerks["motion_sensor_mp"] = true;
// specialty_null is assigned as a perk sometimes and it's not a code perk
level.scriptPerks["specialty_null"] = true;
level.perkSetFuncs["specialty_blastshield"] = ::setBlastShield;
level.perkUnsetFuncs["specialty_blastshield"] = ::unsetBlastShield;
level.perkSetFuncs["specialty_falldamage"] = ::setFreefall;
level.perkUnsetFuncs["specialty_falldamage"] = ::unsetFreefall;
level.perkSetFuncs["specialty_localjammer"] = ::setLocalJammer;
level.perkUnsetFuncs["specialty_localjammer"] = ::unsetLocalJammer;
level.perkSetFuncs["specialty_thermal"] = ::setThermal;
level.perkUnsetFuncs["specialty_thermal"] = ::unsetThermal;
level.perkSetFuncs["specialty_blackbox"] = ::setBlackBox;
level.perkUnsetFuncs["specialty_blackbox"] = ::unsetBlackBox;
level.perkSetFuncs["specialty_lightweight"] = ::setLightWeight;
level.perkUnsetFuncs["specialty_lightweight"] = ::unsetLightWeight;
level.perkSetFuncs["specialty_steelnerves"] = ::setSteelNerves;
level.perkUnsetFuncs["specialty_steelnerves"] = ::unsetSteelNerves;
level.perkSetFuncs["specialty_delaymine"] = ::setDelayMine;
level.perkUnsetFuncs["specialty_delaymine"] = ::unsetDelayMine;
level.perkSetFuncs["specialty_challenger"] = ::setChallenger;
level.perkUnsetFuncs["specialty_challenger"] = ::unsetChallenger;
level.perkSetFuncs["specialty_saboteur"] = ::setSaboteur;
level.perkUnsetFuncs["specialty_saboteur"] = ::unsetSaboteur;
level.perkSetFuncs["specialty_endgame"] = ::setEndGame;
level.perkUnsetFuncs["specialty_endgame"] = ::unsetEndGame;
level.perkSetFuncs["specialty_rearview"] = ::setRearView;
level.perkUnsetFuncs["specialty_rearview"] = ::unsetRearView;
level.perkSetFuncs["specialty_ac130"] = ::setAC130;
level.perkUnsetFuncs["specialty_ac130"] = ::unsetAC130;
level.perkSetFuncs["specialty_sentry_minigun"] = ::setSentryMinigun;
level.perkUnsetFuncs["specialty_sentry_minigun"] = ::unsetSentryMinigun;
level.perkSetFuncs["specialty_predator_missile"] = ::setPredatorMissile;
level.perkUnsetFuncs["specialty_predator_missile"] = ::unsetPredatorMissile;
level.perkSetFuncs["specialty_tank"] = ::setTank;
level.perkUnsetFuncs["specialty_tank"] = ::unsetTank;
level.perkSetFuncs["specialty_precision_airstrike"] = ::setPrecision_airstrike;
level.perkUnsetFuncs["specialty_precision_airstrike"] = ::unsetPrecision_airstrike;
level.perkSetFuncs["specialty_helicopter_minigun"] = ::setHelicopterMinigun;
level.perkUnsetFuncs["specialty_helicopter_minigun"] = ::unsetHelicopterMinigun;
level.perkSetFuncs["specialty_onemanarmy"] = ::setOneManArmy;
level.perkUnsetFuncs["specialty_onemanarmy"] = ::unsetOneManArmy;
level.perkSetFuncs["specialty_littlebird_support"] = ::setLittlebirdSupport;
level.perkUnsetFuncs["specialty_littlebird_support"] = ::unsetLittlebirdSupport;
level.perkSetFuncs["specialty_tacticalinsertion"] = ::setTacticalInsertion;
level.perkUnsetFuncs["specialty_tacticalinsertion"] = ::unsetTacticalInsertion;
//level.perkSetFuncs["specialty_scrambler"] = maps\mp\gametypes\_scrambler::setScrambler;
//level.perkUnsetFuncs["specialty_scrambler"] = maps\mp\gametypes\_scrambler::unsetScrambler;
//level.perkSetFuncs["specialty_portable_radar"] = maps\mp\gametypes\_portable_radar::setPortableRadar;
//level.perkUnsetFuncs["specialty_portable_radar"] = maps\mp\gametypes\_portable_radar::unsetPortableRadar;
level.perkSetFuncs["specialty_weaponlaser"] = ::setWeaponLaser;
level.perkUnsetFuncs["specialty_weaponlaser"] = ::unsetWeaponLaser;
level.perkSetFuncs["specialty_steadyaimpro"] = ::setSteadyAimPro;
level.perkUnsetFuncs["specialty_steadyaimpro"] = ::unsetSteadyAimPro;
level.perkSetFuncs["specialty_stun_resistance"] = ::setStunResistance;
level.perkUnsetFuncs["specialty_stun_resistance"] = ::unsetStunResistance;
level.perkSetFuncs["specialty_marksman"] = ::setMarksman;
level.perkUnsetFuncs["specialty_marksman"] = ::unsetMarksman;
level.perkSetFuncs["specialty_rshieldradar"] = ::setRShieldRadar;
level.perkUnsetFuncs["specialty_rshieldradar"] = ::unsetRShieldRadar;
level.perkSetFuncs["specialty_rshieldscrambler"] = ::setRShieldScrambler;
level.perkUnsetFuncs["specialty_rshieldscrambler"] = ::unsetRShieldScrambler;
level.perkSetFuncs["specialty_double_load"] = ::setDoubleLoad;
level.perkUnsetFuncs["specialty_double_load"] = ::unsetDoubleLoad;
level.perkSetFuncs["specialty_sharp_focus"] = ::setSharpFocus;
level.perkUnsetFuncs["specialty_sharp_focus"] = ::unsetSharpFocus;
level.perkSetFuncs["specialty_hard_shell"] = ::setHardShell;
level.perkUnsetFuncs["specialty_hard_shell"] = ::unsetHardShell;
level.perkSetFuncs["specialty_regenfaster"] = ::setRegenFaster;
level.perkUnsetFuncs["specialty_regenfaster"] = ::unsetRegenFaster;
level.perkSetFuncs["specialty_autospot"] = ::setAutoSpot;
level.perkUnsetFuncs["specialty_autospot"] = ::unsetAutoSpot;
level.perkSetFuncs["specialty_empimmune"] = ::setEmpImmune;
level.perkUnsetFuncs["specialty_empimmune"] = ::unsetEmpImmune;
level.perkSetFuncs["specialty_overkill_pro"] = ::setOverkillPro;
level.perkUnsetFuncs["specialty_overkill_pro"] = ::unsetOverkillPro;
level.perkSetFuncs["specialty_assists"] = ::setAssists;
level.perkUnsetFuncs["specialty_assists"] = ::unsetAssists;
level.perkSetFuncs["specialty_refill_grenades"] = ::setRefillGrenades;
level.perkUnsetFuncs["specialty_refill_grenades"] = ::unsetRefillGrenades;
level.perkSetFuncs["specialty_refill_ammo"] = ::setRefillAmmo;
level.perkUnsetFuncs["specialty_refill_ammo"] = ::unsetRefillAmmo;
level.perkSetFuncs["specialty_combat_speed"] = ::setCombatSpeed;
level.perkUnsetFuncs["specialty_combat_speed"] = ::unsetCombatSpeed;
level.perkSetFuncs["specialty_gambler"] = ::setGambler;
level.perkUnsetFuncs["specialty_gambler"] = ::unsetGambler;
level.perkSetFuncs["specialty_comexp"] = ::setComExp;
level.perkUnsetFuncs["specialty_comexp"] = ::unsetComExp;
level.perkSetFuncs["specialty_gunsmith"] = ::setGunsmith;
level.perkUnsetFuncs["specialty_gunsmith"] = ::unsetGunsmith;
level.perkSetFuncs["specialty_tagger"] = ::setTagger;
level.perkUnsetFuncs["specialty_tagger"] = ::unsetTagger;
level.perkSetFuncs["specialty_pitcher"] = ::setPitcher;
level.perkUnsetFuncs["specialty_pitcher"] = ::unsetPitcher;
level.perkSetFuncs["specialty_boom"] = ::setBoom;
level.perkUnsetFuncs["specialty_boom"] = ::unsetBoom;
level.perkSetFuncs["specialty_silentkill"] = ::setSilentkill;
level.perkUnsetFuncs["specialty_silentkill"] = ::unsetSilentkill;
level.perkSetFuncs["specialty_bloodrush"] = ::setBloodrush;
level.perkUnsetFuncs["specialty_bloodrush"] = ::unsetBloodrush;
level.perkSetFuncs["specialty_triggerhappy"] = ::setTriggerHappy;
level.perkUnsetFuncs["specialty_triggerhappy"] = ::unsetTriggerHappy;
level.perkSetFuncs["specialty_deadeye"] = ::setDeadeye;
level.perkUnsetFuncs["specialty_deadeye"] = ::unsetDeadeye;
level.perkSetFuncs["specialty_incog"] = ::setIncog;
level.perkUnsetFuncs["specialty_incog"] = ::unsetIncog;
level.perkSetFuncs["specialty_blindeye"] = ::setBlindeye;
level.perkUnsetFuncs["specialty_blindeye"] = ::unsetBlindeye;
level.perkSetFuncs["specialty_quickswap"] = ::setQuickswap;
level.perkUnsetFuncs["specialty_quickswap"] = ::unsetQuickswap;
level.perkSetFuncs["specialty_extraammo"] = ::setExtraAmmo;
level.perkUnsetFuncs["specialty_extraammo"] = ::unsetExtraAmmo;
level.perkSetFuncs["specialty_extra_equipment"] = ::setExtraEquipment;
level.perkUnsetFuncs["specialty_extra_equipment"] = ::unsetExtraEquipment;
level.perkSetFuncs["specialty_extra_deadly"] = ::setExtraDeadly;
level.perkUnsetFuncs["specialty_extra_deadly"] = ::unsetExtraDeadly;
// death streaks
level.perkSetFuncs["specialty_combathigh"] = ::setCombatHigh;
level.perkUnsetFuncs["specialty_combathigh"] = ::unsetCombatHigh;
level.perkSetFuncs["specialty_light_armor"] = ::setLightArmor;
level.perkUnsetFuncs["specialty_light_armor"] = ::unsetLightArmor;
level.perkSetFuncs["specialty_revenge"] = ::setRevenge;
level.perkUnsetFuncs["specialty_revenge"] = ::unsetRevenge;
level.perkSetFuncs["specialty_c4death"] = ::setC4Death;
level.perkUnsetFuncs["specialty_c4death"] = ::unsetC4Death;
level.perkSetFuncs["specialty_finalstand"] = ::setFinalStand;
level.perkUnsetFuncs["specialty_finalstand"] = ::unsetFinalStand;
level.perkSetFuncs["specialty_juiced"] = ::setJuiced;
level.perkUnsetFuncs["specialty_juiced"] = ::unsetJuiced;
level.perkSetFuncs["specialty_carepackage"] = ::setCarePackage;
level.perkUnsetFuncs["specialty_carepackage"] = ::unsetCarePackage;
level.perkSetFuncs["specialty_stopping_power"] = ::setStoppingPower;
level.perkUnsetFuncs["specialty_stopping_power"] = ::unsetStoppingPower;
level.perkSetFuncs["specialty_uav"] = ::setUAV;
level.perkUnsetFuncs["specialty_uav"] = ::unsetUAV;
// end death streaks
initPerkDvars();
level thread onPlayerConnect();
}
// Note: This function should only be used to validate perks from
// the load out.
validateEquipment( equipmentName, isLethal, shouldAssert )
{
shouldAssert = ter_op( IsDefined( shouldAssert ), shouldAssert, true );
// Some game modes incorrectly set the equipment to "none" which causes
// an assert below. -JC:09/18/13
equipmentName = ter_op( equipmentName == "none", "specialty_null", equipmentName );
if ( isLethal )
{
switch ( equipmentName )
{
// Default Loadout Lethal Equipment
case "specialty_null":
case "c4_mp":
case "semtex_mp":
case "frag_grenade_mp":
case "throwingknife_mp":
case "mortar_shell_mp":
case "proximity_explosive_mp":
// Juggernuat Lethal Equipment
case "throwingknifejugg_mp":
case "mortar_shelljugg_mp":
break;
default:
AssertEx( !shouldAssert, "validateEquipment() found invalid lethal: " + equipmentName + " in load equipment. This should never happen." );
equipmentName = "specialty_null";
break;
}
}
else
{
switch ( equipmentName )
{
// Default Loadout Tactical Equipment
case "specialty_null":
case "trophy_mp":
case "flash_grenade_mp":
case "smoke_grenade_mp":
case "concussion_grenade_mp":
case "motion_sensor_mp":
case "thermobaric_grenade_mp":
// Juggernuat Tactical Equipment
case "smoke_grenadejugg_mp":
break;
default:
AssertEx( !shouldAssert, "validateEquipment() found invalid tactical: " + equipmentName + " in load equipment. This should never happen." );
equipmentName = "specialty_null";
break;
}
}
return equipmentName;
}
// Note: This function should only be used to validate perks from
// standard loadouts.
validatePerk( perkName )
{
if ( !perksEnabled() )
{
perkName = "specialty_null";
}
else
{
switch ( perkName )
{
// Default Loadout Perks
case "specialty_null":
case "specialty_fastsprintrecovery":
case "specialty_fastreload":
case "specialty_lightweight":
case "specialty_marathon":
case "specialty_stalker":
case "specialty_pitcher":
case "specialty_sprintreload":
case "specialty_quickswap":
case "specialty_bulletaccuracy":
case "specialty_quickdraw":
case "specialty_silentkill":
case "specialty_blindeye":
case "specialty_quieter":
case "specialty_incog":
case "specialty_gpsjammer":
case "specialty_paint":
case "specialty_scavenger":
case "specialty_detectexplosive":
case "specialty_selectivehearing":
case "specialty_comexp":
case "specialty_falldamage":
case "specialty_regenfaster":
case "specialty_sharp_focus":
case "specialty_stun_resistance":
case "_specialty_blastshield":
case "specialty_extra_equipment":
case "specialty_extra_deadly":
case "specialty_extraammo":
case "specialty_extra_attachment":
case "specialty_explosivedamage":
case "specialty_gambler":
case "specialty_hardline":
case "specialty_boom":
case "specialty_twoprimaries":
case "specialty_deadeye":
break;
default:
AssertMsg( "validatePerk() found invalid perk: " + perkName + " in load out perks. This should never happen." );
perkName = "specialty_null";
break;
}
}
return perkName;
}
onPlayerConnect()
{
for(;;)
{
level waittill( "connected", player );
player thread onPlayerSpawned();
}
}
onPlayerSpawned()
{
self endon( "disconnect" );
self.perks = [];
self.perksPerkName = [];
self.perksUseSlot = [];
self.weaponList = [];
self.omaClassChanged = false;
for( ;; )
{
self waittill( "spawned_player" );
self.omaClassChanged = false;
self thread maps\mp\killstreaks\_portableAOEgenerator::generatorAOETracker();
}
}
thermoDebuffWatcher()
{
self endon( "disconnect" );
level endon( "game_ended" );
thermoDebuffEndTime = getTime() + THERMO_DEBUFF_DURATION;
wait 0.05;
self.thermoDebuffed = true;
while( true )
{
if( self.health == self.maxhealth )
{
self.thermoDebuffed = false;
return;
}
//max debuff time of 5 seconds if a player keeps getting hurt
if ( getTime() >= thermoDebuffEndTime )
{
self.thermoDebuffed = false;
return;
}
wait ( 0.05 );
}
}
cac_modified_damage( victim, attacker, damage, sMeansOfDeath, sWeapon, impactPoint, impactDir, sHitLoc, inflictor )
{
assert( isPlayer( victim ) || isAgent( victim ) );
assert( IsDefined( victim.team ) );
//IW6 added for higher health playlist
if ( matchMakingGame() && self.maxhealth > 100 )
{
if( isDefined( sWeapon ) && weaponClass( sWeapon ) == "spread" )
damage *= ( self.maxhealth/100 );
}
damageAdd = 0;
locJugScale = 0;
if( victim isJuggernaut() )
{
locJugScale = level.juggernautMod;
if( IsDefined( self.isJuggernautManiac ) && self.isJuggernautManiac )
{
locJugScale = level.juggernautManiacMod;
}
}
if( isBulletDamage( sMeansOfDeath ) )
{
if ( isFMJDamage( sWeapon, sMeansOfDeath, attacker ) )
{
locJugScale *= level.armorPiercingMod;
}
// show the victim on the minimap for N seconds
if( IsPlayer( attacker ) && attacker _hasPerk( "specialty_paint_pro" ) && !isKillstreakWeapon( sWeapon ) )
{
// make sure they aren't already painted before we process the challenge
if( !victim isPainted() )
attacker maps\mp\gametypes\_missions::processChallenge( "ch_bulletpaint" );
victim thread maps\mp\perks\_perkfunctions::setPainted( attacker );
}
// stopping power and armor vest cancel each other out
if( IsPlayer( attacker ) &&
( attacker _hasPerk( "specialty_bulletdamage" ) && victim _hasPerk( "specialty_armorvest" ) ) )
{
// purposely left empty
}
// if the attacker has the stopping power or has the more damage weapon buff
else if( IsPlayer( attacker ) &&
( attacker _hasPerk( "specialty_bulletdamage" ) || attacker _hasPerk( "specialty_moredamage" ) ) )
{
damageAdd += damage * level.bulletDamageMod;
}
// if the victim has armor vest take some damage off
else if ( victim _hasPerk( "specialty_armorvest" ) )
{
damageAdd -= damage * level.armorVestMod;
}
// let's handle juggernaut damaging here after all of the damageAdd math has happened
if ( victim isJuggernaut() )
{
// JC-09/20/13: In hardcore prevent shotguns from killing juggernauts
// in 1 shotgun blast. Worst case:
// 8 pellets at ( 25 dmg * juggScale ) = 2 dmg per pellet or 16 dmg total ( 53% of the 30 health )
if ( level.hardcoreMode && IsDefined( sWeapon ) && WeaponClass( sWeapon ) == "spread" )
{
damage = Min( damage, 25 ) * locJugScale;
damageAdd = Min( damage, 25 ) * locJugScale;
}
else
{
damage *= locJugScale;
damageAdd *= locJugScale;
}
}
}
else if( IsExplosiveDamageMOD( sMeansOfDeath ) )
{
//proximity explosive damage via stance adjustments
if ( sWeapon == "proximity_explosive_mp" && IsDefined( inflictor.origin ) )
{
if ( victim GetStance() == "prone" )
{
damage *= 0.65;
}
else if ( !victim IsOnGround() )
{
damage *= 0.80;
}
else if ( victim GetStance() == "crouch" )
{
damage *= 0.90;
}
}
// show the victim on the minimap for N seconds
if ( isPlayer(attacker) )
{
if( attacker != victim &&
( attacker IsItemUnlocked( "specialty_paint" ) && attacker _hasPerk( "specialty_paint" ) )
&& !isKillstreakWeapon( sWeapon ) )
{
if( !victim isPainted() )
attacker maps\mp\gametypes\_missions::processChallenge( "ch_paint_pro" );
victim thread maps\mp\perks\_perkfunctions::setPainted( attacker );
}
}
if ( isDefined( victim.thermoDebuffed ) && victim.thermoDebuffed )
{
damageAdd += int( damage * ( level.thermoDebuffMod ) );
}
if( sWeapon == "thermobaric_grenade_mp" )
{
// Thermos are 1HK in hardcore with a large blast radius. This reduces damage to 15/30 maxhealth, consistent with core 50/100
if ( level.hardcoreMode )
{
damage *=.3;
}
victim thread thermoDebuffWatcher();
}
if( isPlayer( attacker ) &&
weaponInheritsPerks( sWeapon ) &&
( attacker _hasPerk( "specialty_explosivedamage" ) && victim _hasPerk( "_specialty_blastshield" ) ) )
{
// purposely left empty
}
else if( isPlayer( attacker ) &&
weaponInheritsPerks( sWeapon ) &&
!isKillstreakWeapon( sWeapon ) &&
attacker _hasPerk( "specialty_explosivedamage" ) )
{
damageAdd += damage * level.explosiveDamageMod;
}
else if ( victim _hasPerk( "_specialty_blastshield" ) && !weaponIgnoresBlastShield( sWeapon ) &&
( !IsDefined( inflictor ) || !IsDefined( inflictor.stuckEnemyEntity ) || inflictor.stuckEnemyEntity != victim ))
{
passedThroughDamage = int( damage * level.blastShieldMod );
if ( maps\mp\gametypes\_weapons::isGrenade( sWeapon )
|| isWeaponAffectedByBlastShield( sWeapon )
)
{
passedThroughDamage = clamp( passedThroughDamage, 0, level.blastShieldClamp );
}
damageAdd -= damage - passedThroughDamage;
}
if( victim isJuggernaut() )
{
damageAdd *= locJugScale;
// If the missile is more than 1000 damage kill the jug
if( damage < 1000 )
{
damage *= locJugScale;
}
}
// fix for grenade spam at start of round
if ( !is_aliens() )
{
if ( ( 10 - ( level.gracePeriod - level.inGracePeriod ) ) > 0 )
{
damage *= level.gracePeriodGrenadeMod;
}
}
}
else if( sMeansOfDeath == "MOD_FALLING" )
{
if( victim _hasPerk( "specialty_falldamage" ) )
{
if( damage > 0 )
victim maps\mp\gametypes\_missions::processChallenge( "ch_falldamage" );
//eventually set a msg to do a roll
damageAdd = 0;
damage = 0;
}
else
{
if( victim isJuggernaut() )
{
damage *= locJugScale;
}
}
}
else if( sMeansOfDeath == "MOD_MELEE" )
{
if ( victim isJuggernaut() )
{
damage = 20;
damageAdd = 0;
}
// Horde
else if ( hasHeavyArmor( victim ) )
{
damage = 100;
}
else if ( IsDefined( victim.customMeleeDamageTaken ) && victim.customMeleeDamageTaken >= 0 )
{
damage = victim.customMeleeDamageTaken;
}
else
{
if ( maps\mp\gametypes\_weapons::isRiotShield( sWeapon ) )
{
if ( level.hardcoreMode )
{
damage = Int( victim.maxHealth + 1 );
}
else
{
damage = Int( victim.maxHealth * 0.66 );
}
}
else //knife
{
damage = victim.maxHealth + 1;
}
}
}
else if( sMeansOfDeath == "MOD_IMPACT" )
{
// let's handle juggernaut damaging here
if( victim isJuggernaut() )
{
switch( sWeapon )
{
case "concussion_grenade_mp":
case "flash_grenade_mp":
case "smoke_grenade_mp":
case "smoke_grenadejugg_mp":
case "frag_grenade_mp":
case "semtexproj_mp":
case "semtex_mp":
case "mortar_shell_mp":
case "mortar_shelljugg_mp":
damage = 5;
break;
default:
if( damage < 1000 )
damage = 25;
break;
}
damageAdd = 0;
}
}
else if( sMeansOfDeath == "MOD_UNKNOWN" || sMeansOfDeath == "MOD_MELEE_DOG" )
{
if( IsAgent( attacker ) && IsDefined( attacker.agent_type ) && attacker.agent_type == "dog" && victim isJuggernaut() )
{
victim ShellShock( "dog_bite", 2 );
damage *= locJugScale;
}
}
if ( victim _hasperk( "specialty_combathigh" ) )
{
if ( IsDefined( self.damageBlockedTotal ) && (!level.teamBased || (IsDefined( attacker ) && IsDefined( attacker.team ) && victim.team != attacker.team)) )
{
damageTotal = damage + damageAdd;
damageBlocked = (damageTotal - ( damageTotal / 3 ));
self.damageBlockedTotal += damageBlocked;
if ( self.damageBlockedTotal >= 101 )
{
self notify( "combathigh_survived" );
self.damageBlockedTotal = undefined;
}
}
if ( sWeapon != "throwingknife_mp" && sWeapon != "throwingknifejugg_mp" )
{
switch ( sMeansOfDeath )
{
case "MOD_FALLING":
case "MOD_MELEE":
break;
default:
damage = Int( damage/3 );
damageAdd = Int( damageAdd/3 );
break;
}
}
}
// Handle armor damage
if( IsDefined( victim.lightArmorHP ) )
{
switch( sWeapon )
{
case "throwingknife_mp":
case "throwingknifejugg_mp":
{
damage = victim.health;
damageAdd = 0;
break;
}
case "semtexproj_mp":
case "semtex_mp":
{
if( IsDefined( inflictor ) && IsDefined( inflictor.stuckEnemyEntity ) && inflictor.stuckEnemyEntity == victim )
{
damage = victim.health;
damageAdd = 0;
}
break;
}
default:
{
// Handle Armor Damage
// no armor damage in case of falling, melee, fmj or head shots
if ( sMeansOfDeath != "MOD_FALLING"
&& sMeansOfDeath != "MOD_MELEE"
&& !isHeadShot( sWeapon, sHitLoc, sMeansOfDeath, attacker )
&& !isFMJDamage( sWeapon, sMeansOfDeath, attacker )
)
{
victim.lightArmorHP -= ( damage + damageAdd );
damage = 0;
damageAdd = 0;
if ( victim.lightArmorHP <= 0 )
{
// since the light armor is gone, adjust the damage to be the excess damage that happens after the light armor hp is reduced
damage = abs( victim.lightArmorHP );
damageAdd = 0;
unsetLightArmor();
}
}
break;
}
}
}
// Horde
if( hasHeavyArmor(victim) )
{
victim.heavyArmorHP -= (damage + damageAdd);
damage = 0;
if( victim.heavyArmorHP < 0 )
{
damage = abs( victim.heavyArmorHP );
}
}
if ( !is_aliens() && ( damage <= 1 ) )
{
damage = 1;
}
else
{
damage = int( damage + damageAdd );
}
return damage;
}
initPerkDvars()
{
level.gracePeriodGrenadeMod = 8/100; // percentage of damage from grenades at the start of a game
level.juggernautMod = 8/100; // percentage of damage juggernaut takes
level.juggernautManiacMod = 8/100; // percentage of damage juggernaut takes
level.armorPiercingMod = 1.5; // increased bullet damage * this on vests, juggernauts and vehicles. IW6 Used by both specialty_armorpiercing and specialty_bulletpenetration
level.regenFasterMod = getIntProperty( "perk_fastRegenWaitMS", 500 )/1000; // regen health will start at a percent of the normal speed
level.regenFasterHealthMod = getIntProperty( "perk_fastRegenRate", 2 ); // regen health multiplied times the normal speed
level.bulletDamageMod = getIntProperty( "perk_bulletDamage", 40 )/100; // increased bullet damage by this %
level.explosiveDamageMod = getIntProperty( "perk_explosiveDamage", 40 )/100; // increased explosive damage by this %
level.blastShieldMod = getIntProperty( "perk_blastShieldScale", 65 )/100;
level.blastShieldClamp = getIntProperty( "perk_blastShieldClampHP", 80 );
level.thermoDebuffMod = getIntProperty( "weap_thermoDebuffMod", 185 )/100;
level.riotShieldMod = getIntProperty( "perk_riotShield", 100 )/100;
level.armorVestMod = getIntProperty( "perk_armorVest", 75 )/100; // percentage of damage you take
if( IsDefined( level.hardcoreMode ) && level.hardcoreMode )
{
level.blastShieldMod = getIntProperty( "perk_blastShieldScale_HC", 10 )/100; // percentage of damage you take
level.blastShieldClamp = getIntProperty( "perk_blastShieldClampHP_HC", 20 );
}
}
// CAC: Selector function, calls the individual cac features according to player's class settings
// Info: Called every time player spawns during loadout stage
cac_selector()
{
perks = self.specialty;
/*
self.detectExplosives = false;
if ( self _hasPerk( "specialty_detectexplosive" ) )
self.detectExplosives = true;
maps\mp\gametypes\_weapons::setupBombSquad();
*/
}
givePerksAfterSpawn()
{
self endon( "death" );
self endon( "disconnect" );
spawnPerks = [];
// Perks to add on spawn
if ( !self _hasPerk("specialty_blindeye" ) )
{
self givePerk( "specialty_blindeye", false );
spawnPerks[spawnPerks.size] = "specialty_blindeye";
}
if ( !self _hasPerk( "specialty_gpsjammer" ) )
{
self givePerk( "specialty_gpsjammer", false );
spawnPerks[spawnPerks.size] = "specialty_gpsjammer";
}
// Perks to remove after the spawn timer is up
if ( spawnPerks.size > 0 )
{
self.spawnPerk = true;
while( self.avoidKillstreakOnSpawnTimer > 0 )
{
self.avoidKillstreakOnSpawnTimer -= 0.05;
wait( 0.05 );
}
foreach ( perk in spawnPerks )
{
self _unsetPerk( perk );
}
self.spawnPerk = false;
self notify ( "starting_perks_unset" );
}
}
getPerkIcon( perkName )
{
return TableLookup( PERK_STRING_TABLE, PERK_REF_COLUMN, perkName, PERK_ICON_COLUMN );
}
getPerkName( perkName )
{
return TableLookupIString( PERK_STRING_TABLE, PERK_REF_COLUMN, perkName, PERK_NAME_COLUMN );
}
updateActivePerks( eInflictor, attacker, victim, iDamage, sMeansOfDeath )
{
// Make sure the perks are not triggered by killstreaks (exceptions are player based ones - i.e. Juggernauts)
if ( IsDefined ( eInflictor ) && IsPlayer( eInflictor ) && IsDefined( attacker ) && IsPlayer( attacker ) && attacker != victim )
{
// See if the attacker has the Trigger Happy ability
if( attacker _hasPerk("specialty_triggerhappy") )
attacker thread maps\mp\perks\_perkfunctions::setTriggerHappyInternal();
// See if the attacker has the Boom ability
if( attacker _hasPerk("specialty_boom") )
victim thread maps\mp\perks\_perkfunctions::setBoomInternal( attacker );
// See if the attacker has the Bloodrush ability
if( attacker _hasPerk("specialty_bloodrush") )
attacker thread maps\mp\perks\_perkfunctions::setBloodrushInternal();
// See if the attacker has the Deadeye ability
if( attacker _hasPerk("specialty_deadeye") )
attacker.deadeyeKillCount++;
// see if the attacker has the fastRecharge ability
attacker_pers_abilityRecharging = attacker.pers[ "abilityRecharging" ];
if( IsDefined( attacker_pers_abilityRecharging ) && attacker_pers_abilityRecharging )
attacker notify( "abilityFastRecharge" );
// see if the attacker has the extraTime ability
attacker_pers_abilityOn = attacker.pers[ "abilityOn" ];
if( IsDefined( attacker_pers_abilityOn ) && attacker_pers_abilityOn )
attacker notify( "abilityExtraTime" );
}
}