From 3c9b3a423f0461ee6d8456fdae63d2bb05474856 Mon Sep 17 00:00:00 2001 From: INeedBots Date: Sun, 20 Sep 2020 23:43:57 -0600 Subject: [PATCH] perks --- userraw/maps/mp/bots/perks/_perks.gsc | 400 ++++++++++++++++++++++++++ 1 file changed, 400 insertions(+) create mode 100644 userraw/maps/mp/bots/perks/_perks.gsc diff --git a/userraw/maps/mp/bots/perks/_perks.gsc b/userraw/maps/mp/bots/perks/_perks.gsc new file mode 100644 index 0000000..92e4863 --- /dev/null +++ b/userraw/maps/mp/bots/perks/_perks.gsc @@ -0,0 +1,400 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; +#include maps\mp\perks\_perkfunctions; + +init() +{ + level.perkFuncs = []; + + precacheShader( "combathigh_overlay" ); + precacheShader( "specialty_painkiller" ); + + precacheModel( "weapon_riot_shield_mp" ); + precacheModel( "viewmodel_riot_shield_mp" ); + precacheString( &"MPUI_CHANGING_KIT" ); + + //level.spawnGlowSplat = loadfx( "misc/flare_ambient_destroy" ); + + level.spawnGlowModel["enemy"] = "mil_emergency_flare_mp"; + level.spawnGlowModel["friendly"] = "mil_emergency_flare_mp"; + level.spawnGlow["enemy"] = loadfx( "misc/flare_ambient" ); + level.spawnGlow["friendly"] = loadfx( "misc/flare_ambient_green" ); + level.c4Death = loadfx( "explosions/oxygen_tank_explosion" ); + + level.spawnFire = loadfx( "props/barrelexp" ); + + precacheModel( level.spawnGlowModel["friendly"] ); + precacheModel( level.spawnGlowModel["enemy"] ); + + precacheString( &"MP_DESTROY_TI" ); + + precacheShaders(); + + level._effect["ricochet"] = loadfx( "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_blastshield"] = true; + level.scriptPerks["specialty_akimbo"] = true; + level.scriptPerks["specialty_siege"] = true; + level.scriptPerks["specialty_falldamage"] = true; + level.scriptPerks["specialty_fmj"] = true; + level.scriptPerks["specialty_shield"] = true; + level.scriptPerks["specialty_feigndeath"] = true; + level.scriptPerks["specialty_shellshock"] = true; + level.scriptPerks["specialty_delaymine"] = true; + level.scriptPerks["specialty_localjammer"] = true; + level.scriptPerks["specialty_thermal"] = true; + level.scriptPerks["specialty_finalstand"] = true; + level.scriptPerks["specialty_blackbox"] = true; + level.scriptPerks["specialty_steelnerves"] = true; + level.scriptPerks["specialty_flashgrenade"] = true; + level.scriptPerks["specialty_smokegrenade"] = true; + level.scriptPerks["specialty_concussiongrenade"] = true; + level.scriptPerks["specialty_challenger"] = true; + level.scriptPerks["specialty_tacticalinsertion"] = true; + level.scriptPerks["specialty_saboteur"] = true; + level.scriptPerks["specialty_endgame"] = true; + level.scriptPerks["specialty_rearview"] = true; + level.scriptPerks["specialty_hardline"] = true; + level.scriptPerks["specialty_ac130"] = true; + level.scriptPerks["specialty_sentry_minigun"] = true; + level.scriptPerks["specialty_predator_missile"] = true; + level.scriptPerks["specialty_helicopter_minigun"] = true; + level.scriptPerks["specialty_tank"] = true; + level.scriptPerks["specialty_precision_airstrike"] = true; + level.scriptPerks["specialty_bling"] = true; + level.scriptPerks["specialty_carepackage"] = true; + level.scriptPerks["specialty_onemanarmy"] = true; + level.scriptPerks["specialty_littlebird_support"] = true; + level.scriptPerks["specialty_primarydeath"] = true; + level.scriptPerks["specialty_secondarybling"] = true; + level.scriptPerks["specialty_combathigh"] = true; + level.scriptPerks["specialty_c4death"] = true; + level.scriptPerks["specialty_explosivedamage"] = true; + level.scriptPerks["specialty_copycat"] = true; + level.scriptPerks["specialty_laststandoffhand"] = true; + level.scriptPerks["specialty_dangerclose"] = true; + + level.scriptPerks["specialty_extraspecialduration"] = true; + level.scriptPerks["specialty_rollover"] = true; + level.scriptPerks["specialty_armorpiercing"] = true; + level.scriptPerks["specialty_omaquickchange"] = true; + level.scriptPerks["specialty_fastmeleerecovery"] = true; + + level.scriptPerks["_specialty_rearview"] = true; + level.scriptPerks["_specialty_onemanarmy"] = true; + + level.fauxPerks["specialty_tacticalinsertion"] = true; + level.fauxPerks["specialty_shield"] = true; + + + /* + level.perkSetFuncs[""] = ::; + level.perkUnsetFuncs[""] = ::; + */ + + level.perkSetFuncs["specialty_blastshield"] = ::setBlastShield; + level.perkUnsetFuncs["specialty_blastshield"] = ::unsetBlastShield; + + level.perkSetFuncs["specialty_siege"] = ::setSiege; + level.perkUnsetFuncs["specialty_siege"] = ::unsetSiege; + + 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_finalstand"] = ::setFinalStand; + level.perkUnsetFuncs["specialty_finalstand"] = ::unsetFinalStand; + + level.perkSetFuncs["specialty_combathigh"] = ::setCombatHigh; + level.perkUnsetFuncs["specialty_combathigh"] = ::unsetCombatHigh; + + 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_carepackage"] = ::setCarePackage; + level.perkUnsetFuncs["specialty_carepackage"] = ::unsetCarePackage; + + 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_c4death"] = ::setC4Death; + level.perkUnsetFuncs["specialty_c4death"] = ::unsetC4Death; + + level.perkSetFuncs["specialty_tacticalinsertion"] = ::setTacticalInsertion; + level.perkUnsetFuncs["specialty_tacticalinsertion"] = ::unsetTacticalInsertion; + + initPerkDvars(); + + level thread onPlayerConnect(); +} + + + +precacheShaders() +{ + precacheShader( "specialty_blastshield" ); +} + + +givePerk( perkName ) +{ + if ( IsSubStr( perkName, "_mp" ) ) + { + if ( perkName == "frag_grenade_mp" ) + self SetOffhandPrimaryClass( "frag" ); + if ( perkName == "throwingknife_mp" ) + self SetOffhandPrimaryClass( "throwingknife" ); + + self _giveWeapon( perkName, 0 ); + self giveStartAmmo( perkName ); + + self setPerk( perkName, false ); + return; + } + + if ( isSubStr( perkName, "specialty_null" ) || isSubStr( perkName, "specialty_weapon_" ) ) + { + self setPerk( perkName, false ); + return; + } + + self _setPerk( perkName ); + +} + + +validatePerk( perkIndex, perkName ) +{ + if ( getDvarInt ( "scr_game_perks" ) == 0 ) + { + if ( tableLookup( "mp/perkTable.csv", 1, perkName, 5 ) != "equipment" ) + return "specialty_null"; + } + + /* Validation disabled for now + if ( tableLookup( "mp/perkTable.csv", 1, perkName, 5 ) != ("perk"+perkIndex) ) + { + println( "^1Warning: (" + self.name + ") Perk " + perkName + " is not allowed for perk slot index " + perkIndex + "; replacing with no perk" ); + return "specialty_null"; + } + */ + + return perkName; +} + + +onPlayerConnect() +{ + for(;;) + { + level waittill( "connected", player ); + player thread onPlayerSpawned(); + } +} + + +onPlayerSpawned() +{ + self endon( "disconnect" ); + + self.perks = []; + self.weaponList = []; + self.omaClassChanged = false; + + for( ;; ) + { + self waittill( "spawned_player" ); + + self.omaClassChanged = false; + self thread gambitUseTracker(); + } +} + + +drawLine( start, end, timeSlice ) +{ + drawTime = int(timeSlice * 20); + for( time = 0; time < drawTime; time++ ) + { + line( start, end, (1,0,0),false, 1 ); + wait ( 0.05 ); + } +} + + +cac_modified_damage( victim, attacker, damage, meansofdeath, weapon, impactPoint, impactDir, hitLoc ) +{ + assert( isPlayer( victim ) ); + assert( isDefined( victim.team ) ); + + damageAdd = 0; + + if ( isPrimaryDamage( meansOfDeath ) ) + { + assert( isDefined( attacker ) ); + + if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_bulletdamage" ) && victim _hasPerk( "specialty_armorvest" ) ) + damageAdd += 0; + else if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_bulletdamage" ) ) + damageAdd += damage*level.bulletDamageMod; + else if ( victim _hasPerk( "specialty_armorvest" ) ) + damageAdd -= damage*(1-level.armorVestMod); + + if ( isPlayer( attacker ) && attacker _hasPerk( "specialty_fmj" ) && victim _hasPerk ( "specialty_armorvest" ) ) + damageAdd += damage*level.hollowPointDamageMod; + } + else if ( isExplosiveDamage( meansOfDeath ) ) + { + if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_explosivedamage" ) && victim _hasPerk( "_specialty_blastshield" ) ) + damageAdd += 0; + else if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_explosivedamage" ) ) + damageAdd += damage*level.explosiveDamageMod; + else if ( victim _hasPerk( "_specialty_blastshield" ) ) + damageAdd -= damage*(1-level.blastShieldMod); + + if ( isKillstreakWeapon( weapon ) && isPlayer( attacker ) && attacker _hasPerk("specialty_dangerclose") ) + damageAdd += damage*level.dangerCloseMod; + } + else if (meansOfDeath == "MOD_FALLING") + { + if ( victim _hasPerk( "specialty_falldamage" ) ) + { + //eventually set a msg to do a roll + damageAdd = 0; + damage = 0; + } + } + + //if ( ( victim.xpScaler == 2 && isDefined( attacker ) ) && ( isPlayer( attacker ) || attacker.classname == "scrip_vehicle" ) ) + // damageAdd += 200; + + 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 ( weapon != "throwingknife_mp" ) + { + switch ( meansOfDeath ) + { + case "MOD_FALLING": + case "MOD_MELEE": + break; + default: + damage = damage/3; + damageAdd = damageAdd/3; + break; + } + } + } + + return int( damage + damageAdd ); +} + +initPerkDvars() +{ + level.bulletDamageMod = getIntProperty( "perk_bulletDamage", 40 )/100; // increased bullet damage by this % + level.hollowPointDamageMod = getIntProperty( "perk_hollowPointDamage", 65 )/100; // increased bullet damage by this % + level.armorVestMod = getIntProperty( "perk_armorVest", 75 )/100; // percentage of damage you take + level.explosiveDamageMod = getIntProperty( "perk_explosiveDamage", 40 )/100; // increased explosive damage by this % + level.blastShieldMod = getIntProperty( "perk_blastShield", 45 )/100; // percentage of damage you take + level.riotShieldMod = getIntProperty( "perk_riotShield", 100 )/100; + level.dangerCloseMod = getIntProperty( "perk_dangerClose", 100 )/100; + level.armorPiercingMod = getIntProperty( "perk_armorPiercingDamage", 40 )/100; // increased bullet damage by this % +} + +// 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(); + */ +} + + +gambitUseTracker() +{ + self endon ( "death" ); + self endon ( "disconnect" ); + level endon ( "game_ended" ); + + if ( getDvarInt ( "scr_game_perks" ) != 1 ) + return; + + gameFlagWait( "prematch_done" ); + + self notifyOnPlayerCommand( "gambit_on", "+frag" ); +}