#using scripts\codescripts\struct; #using scripts\shared\clientfield_shared; #using scripts\shared\killstreaks_shared; #using scripts\shared\popups_shared; #using scripts\shared\system_shared; #using scripts\shared\util_shared; #using scripts\mp\_util; #using scripts\mp\killstreaks\_killstreaks; #namespace killstreak_bundles; function register_killstreak_bundle( killstreakType ) { level.killstreakBundle[killstreakType] = struct::get_script_bundle( "killstreak", "killstreak_" + killstreakType ); level.killstreakBundle["inventory_" + killstreakType] = level.killstreakBundle[killstreakType]; level.killstreakMaxHealthFunction = &killstreak_bundles::get_max_health; assert( isdefined( level.killstreakBundle[killstreakType] ) ); } function get_bundle( killstreak ) { if( killstreak.archetype === "raps" ) return level.killstreakBundle["raps_drone"]; else return level.killstreakBundle[killstreak.killstreakType]; } function get_hack_timeout() { killstreak = self; bundle = get_bundle( killstreak ); return bundle.ksHackTimeout; } function get_hack_protection() { killstreak = self; hackedProtection = false; bundle = get_bundle( killstreak ); if ( isdefined( bundle.ksHackProtection ) ) { hackedProtection = bundle.ksHackProtection; } return hackedProtection; } function get_hack_tool_inner_time() { killstreak = self; hackToolInnerTime = 10000; bundle = get_bundle( killstreak ); if ( isdefined( bundle.ksHackToolInnerTime ) ) { hackToolInnerTime = bundle.ksHackToolInnerTime; } return hackToolInnerTime; } function get_hack_tool_outer_time() { killstreak = self; hackToolOuterTime = 10000; bundle = get_bundle( killstreak ); if ( isdefined( bundle.ksHackToolOuterTime ) ) { hackToolOuterTime = bundle.ksHackToolOuterTime; } return hackToolOuterTime; } function get_hack_tool_inner_radius() { killstreak = self; hackedToolInnerRadius = 10000; bundle = get_bundle( killstreak ); if ( isdefined( bundle.ksHackToolInnerRadius ) ) { hackedToolInnerRadius = bundle.ksHackToolInnerRadius; } return hackedToolInnerRadius; } function get_hack_tool_outer_radius() { killstreak = self; hackedToolOuterRadius = 10000; bundle = get_bundle( killstreak ); if ( isdefined( bundle.ksHackToolOuterRadius ) ) { hackedToolOuterRadius = bundle.ksHackToolOuterRadius; } return hackedToolOuterRadius; } function get_lost_line_of_sight_limit_msec() { killstreak = self; hackedToolLostLineOfSightLimitMs = 1000; bundle = get_bundle( killstreak ); if ( isdefined( bundle.ksHackToolLostLineOfSightLimitMs ) ) { hackedToolLostLineOfSightLimitMs = bundle.ksHackToolLostLineOfSightLimitMs; } return hackedToolLostLineOfSightLimitMs; } function get_hack_tool_no_line_of_sight_time() { killstreak = self; hackToolNoLineOfSightTime = 1000; bundle = get_bundle( killstreak ); if ( isdefined( bundle.ksHackToolNoLineOfSightTime ) ) { hackToolNoLineOfSightTime = bundle.ksHackToolNoLineOfSightTime; } return hackToolNoLineOfSightTime; } function get_hack_scoreevent() { killstreak = self; hackedScoreEvent = undefined; bundle = get_bundle( killstreak ); if ( isdefined( bundle.ksHackScoreEvent ) ) { hackedScoreEvent = bundle.ksHackScoreEvent; } return hackedScoreEvent; } function get_hack_fx() { killstreak = self; hackFX = ""; bundle = get_bundle( killstreak ); if ( isdefined( bundle.ksHackFX ) ) { hackFX = bundle.ksHackFX; } return hackFX; } function get_hack_loop_fx() { killstreak = self; hackLoopFX = ""; bundle = get_bundle( killstreak ); if ( isdefined( bundle.ksHackLoopFX ) ) { hackLoopFX = bundle.ksHackLoopFX; } return hackLoopFX; } function get_max_health( killstreakType ) { bundle = level.killstreakBundle[killstreakType]; return bundle.ksHealth; } function get_low_health( killstreakType ) { bundle = level.killstreakBundle[killstreakType]; return bundle.ksLowHealth; } function get_hacked_health( killstreakType ) { bundle = level.killstreakBundle[killstreakType]; return bundle.ksHackedHealth; } function get_shots_to_kill( weapon, meansOfDeath, bundle ) { shotsToKill = undefined; switch( weapon.rootweapon.name ) { case "remote_missile_missile": shotsToKill = bundle.ksRemote_missile_missile; break; case "hero_annihilator": shotsToKill = bundle.ksHero_annihilator; break; case "hero_armblade": shotsToKill = bundle.ksHero_armblade; break; case "hero_bowlauncher": case "hero_bowlauncher2": case "hero_bowlauncher3": case "hero_bowlauncher4": if ( meansOfDeath == "MOD_PROJECTILE_SPLASH" || meansOfDeath == "MOD_PROJECTILE" ) { shotsToKill = bundle.ksHero_bowlauncher; } else { shotstoKill = -1; } break; case "hero_gravityspikes": shotsToKill = bundle.ksHero_gravityspikes; break; case "hero_lightninggun": shotsToKill = bundle.ksHero_lightninggun; break; case "hero_minigun": case "hero_minigun_body3": shotsToKill = bundle.ksHero_minigun; break; case "hero_pineapplegun": shotsToKill = bundle.ksHero_pineapplegun; break; case "hero_firefly_swarm": shotsToKill = (isdefined(bundle.ksHero_firefly_swarm)?bundle.ksHero_firefly_swarm:0) * 4; break; case "dart_blade": case "dart_turret": shotsToKill = bundle.ksDartsToKill; break; case "gadget_heat_wave": shotsToKill = bundle.ksHero_heatwave; break; } return (isdefined(shotsToKill)?shotsToKill:0); } function get_emp_grenade_damage( killstreakType, maxhealth ) { // weapon_damage returns as undefined if it is not handled here emp_weapon_damage = undefined; if ( isdefined( level.killstreakBundle[killstreakType] ) ) { bundle = level.killstreakBundle[killstreakType]; empGrenadesToKill = (isdefined(bundle.ksEmpGrenadesToKill)?bundle.ksEmpGrenadesToKill:0); if ( empGrenadesToKill == 0 ) { // not handled here } else if ( empGrenadesToKill > 0 ) { emp_weapon_damage = maxhealth / empGrenadesToKill + 1; } else { // immune emp_weapon_damage = 0; } } return emp_weapon_damage; } function get_weapon_damage( killstreakType, maxhealth, attacker, weapon, type, damage, flags, chargeShotLevel ) { // weapon_damage returns as undefined if it is not handled here weapon_damage = undefined; if ( isdefined( level.killstreakBundle[killstreakType] ) ) { bundle = level.killstreakBundle[killstreakType]; if ( isdefined( weapon ) ) { shotsToKill = get_shots_to_kill( weapon, type, bundle ); if ( shotsToKill == 0 ) { // not handled here } else if ( shotsToKill > 0 ) { if ( isdefined( chargeShotLevel ) && chargeShotLevel > 0 ) { // chargeShotLevel should be between 0 and 1. // 1 = full charge // > 0 = fraction of charge shotsToKill = shotsToKill / chargeShotLevel; } weapon_damage = maxhealth / shotsToKill + 1; } else { // immune weapon_damage = 0; } } if ( !isdefined( weapon_damage ) ) { if ( type == "MOD_RIFLE_BULLET" || type == "MOD_PISTOL_BULLET" || type == "MOD_HEAD_SHOT" ) { hasArmorPiercing = isdefined( attacker ) && isPlayer( attacker ) && attacker HasPerk( "specialty_armorpiercing" ); clipsToKill = (isdefined(bundle.ksClipsToKill)?bundle.ksClipsToKill:0); if( clipsToKill == -1 ) { // immune weapon_damage = 0; } else if ( hasArmorPiercing && self.aitype !== "spawner_bo3_robot_grunt_assault_mp_escort" ) // HACK TU4 FFOTD DT 150126 - Don't apply FMJ damage to the escort robot { weapon_damage = damage + int( damage * level.cac_armorpiercing_data); } if ( weapon.weapClass == "spread" ) { ksShotgunMultiplier = (isdefined(bundle.ksShotgunMultiplier)?bundle.ksShotgunMultiplier:1); if ( ksShotgunMultiplier == 0 ) { // not handled here } else if ( ksShotgunMultiplier > 0 ) { weapon_damage = (isdefined(weapon_damage)?weapon_damage:damage) * ksShotgunMultiplier; } } } else if ( ( type == "MOD_PROJECTILE" || type == "MOD_EXPLOSIVE" ) && ( !isdefined( weapon.isEmpKillstreak ) || !weapon.isEmpKillstreak ) && ( weapon.statIndex != level.weaponPistolEnergy.statIndex ) && ( weapon.statIndex != level.weaponSpecialCrossbow.statIndex ) && ( weapon.statIndex != level.weaponSmgNailGun.statIndex ) && ( weapon.statIndex != level.weaponBouncingBetty.statIndex ) ) { if ( weapon.statIndex == level.weaponShotgunEnergy.statIndex ) { shotgunEnergyToKill = (isdefined(bundle.ksShotgunEnergyToKill)?bundle.ksShotgunEnergyToKill:0); if ( shotgunEnergyToKill == 0 ) { // not handled here } else if ( shotgunEnergyToKill > 0 ) { weapon_damage = maxhealth / shotgunEnergyToKill + 1; } else { // immune weapon_damage = 0; } } else { rocketsToKill = (isdefined(bundle.ksRocketsToKill)?bundle.ksRocketsToKill:0); if ( rocketsToKill == 0 ) { // not handled here } else if ( rocketsToKill > 0 ) { if ( weapon.rootweapon.name == "launcher_multi" ) { rocketsToKill *= 2; } weapon_damage = maxhealth / rocketsToKill + 1; } else { // immune weapon_damage = 0; } } } else if (( type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH" ) && ( !isdefined( weapon.isEmpKillstreak ) || !weapon.isEmpKillstreak ) ) { grenadeDamageMultiplier = (isdefined(bundle.ksGrenadeDamageMultiplier)?bundle.ksGrenadeDamageMultiplier:0); if ( grenadeDamageMultiplier == 0 ) { // not handled here } else if ( grenadeDamageMultiplier > 0 ) { weapon_damage = damage * grenadeDamageMultiplier; } else { // immune weapon_damage = 0; } } else if ( type == "MOD_MELEE_WEAPON_BUTT" || type == "MOD_MELEE" ) { ksMeleeDamageMultiplier = (isdefined(bundle.ksMeleeDamageMultiplier)?bundle.ksMeleeDamageMultiplier:0); if ( ksMeleeDamageMultiplier == 0 ) { // not handled here } else if ( ksMeleeDamageMultiplier > 0 ) { weapon_damage = damage * ksMeleeDamageMultiplier; } else { // immune weapon_damage = 0; } } else if ( type == "MOD_PROJECTILE_SPLASH" ) { ksProjectileSpashMultiplier = (isdefined(bundle.ksProjectileSpashMultiplier)?bundle.ksProjectileSpashMultiplier:0); if ( ksProjectileSpashMultiplier == 0 ) { // not handled here } else if ( ksProjectileSpashMultiplier > 0 ) { weapon_damage = damage * ksProjectileSpashMultiplier; } else { // immune weapon_damage = 0; } } } } return weapon_damage; }