mirror of
				https://github.com/ineedbots/iw4_bot_warfare.git
				synced 2025-10-30 17:36:57 +00:00 
			
		
		
		
	perks
This commit is contained in:
		
							
								
								
									
										400
									
								
								userraw/maps/mp/bots/perks/_perks.gsc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										400
									
								
								userraw/maps/mp/bots/perks/_perks.gsc
									
									
									
									
									
										Normal file
									
								
							| @@ -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" ); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user