1029 lines
33 KiB
Plaintext
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" );
|
|
}
|
|
}
|
|
|