#include common_scripts\utility; #include maps\mp\_utility; #include maps\mp\gametypes\_hud_util; #include maps\mp\perks\_perkfunctions; #include common_scripts\_portable_radar; colorPerkReady = ( 0.568, 0.902, 0.568 ); colorPerkUsing = ( 0.568, 0.902, 0.568 ); colorPerkRecharging = ( 0.902, 0.251, 0.098 ); init() { level._perkFuncs = []; precacheShader( "combathigh_overlay" ); precacheShader( "specialty_painkiller" ); precacheShader( "compassping_revenge" ); precacheShader( "compassping_lidar" ); precacheShader( "compassping_enemy" ); 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_bulletpenetration"] = true; level._scriptPerks["specialty_extraspecialduration"] = true; level._scriptPerks["specialty_rollover"] = true; level._scriptPerks["specialty_armorpiercing"] = true; level._scriptPerks["specialty_omaquickchange"] = true; level._scriptPerks["specialty_equipmenthack"] = true; level._scriptPerks["specialty_fasthealthregen"] = true; level._scriptPerks["specialty_flakjacket"] = true; level._scriptPerks["specialty_spectre"] = true; level._scriptPerks["specialty_spectrepro"] = true; level._scriptPerks["_specialty_rearview"] = true; level._scriptPerks["_specialty_onemanarmy"] = true; level._fauxPerks["specialty_tacticalinsertion"] = true; level._fauxPerks["specialty_shield"] = true; level._scriptPerks["specialty_netpainkiller"] = true; level._scriptPerks["specialty_dishclip"] = true; level._scriptPerks["specialty_revenge"] = true; level._scriptPerks["specialty_uav"] = true; level._scriptPerks["specialty_rechargetest"] = true; level._scriptPerks["specialty_portable_radar"] = true; level._scriptPerks["specialty_loaded"] = true; level._scriptPerks["specialty_fasterlockon"] = true; level._scriptPerks["specialty_twoprimaries"] = true; level._scriptPerks["specialty_twoprimariesoffhand"] = true; level._scriptPerks["specialty_twoprimarieslethal"] = true; level._scriptPerks["specialty_twoprimariesholder"] = true; level._scriptPerks["specialty_marksman"] = true; level._scriptPerks["specialty_ninjaholder"] = true; level._scriptPerks["specialty_marathonholder"] = true; level._scriptPerks["specialty_explosivedamage"] = true; level._scriptPerks["specialty_quickdrawholder"] = true; level._scriptPerks["specialty_gasmask"] = true; level._scriptPerks["specialty_fastcarepackagerecovery"] = true; level._scriptPerks["specialty_paint"] = true; level._scriptPerks["specialty_paint_pro"] = true; level._scriptPerks["specialty_juiced"] = true; /* level.perkSetFuncs[""] = ::; level.perkUnsetFuncs[""] = ::; */ level._perkSetFuncs["specialty_bling"] = ::setBling; level._perkUnsetFuncs["specialty_bling"] = ::unsetBling; level._perkSetFuncs["specialty_twoprimaries"] = ::setTwoPrimaries; level._perkUnsetFuncs["specialty_twoprimaries"] = ::unsetTwoPrimaries; level._perkSetFuncs["specialty_twoprimariesholder"] = ::setTwoPrimariesHolder; level._perkUnsetFuncs["specialty_twoprimariesholder"] = ::unsetTwoPrimariesHolder; level._perkSetFuncs["specialty_equipmenthack"] = ::setEquipmentHack; level._perkUnsetFuncs["specialty_equipmenthack"] = ::unsetEquipmentHack; level._perkSetFuncs["specialty_fasterlockon"] = ::setFasterLockOn; level._perkUnsetFuncs["specialty_fasterlockon"] = ::unsetFasterLockOn; level._perkSetFuncs["specialty_rechargetest"] = ::setRechargeTest; level._perkUnsetFuncs["specialty_rechargetest"] = ::unsetRechargeTest; 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; level._perkSetFuncs["specialty_juggersuit"] = ::setJuggersuit; level._perkUnsetFuncs["specialty_juggersuit"] = ::unsetJuggersuit; level._perkSetFuncs["specialty_stealthsuit"] = ::setStealthSuit; level._perkUnsetFuncs["specialty_stealthsuit"] = ::unsetStealthsuit; level._perkSetFuncs["specialty_tacsuit"] = ::setTacsuit; level._perkUnsetFuncs["specialty_tacsuit"] = ::unsetTacsuit; level._perkSetFuncs["specialty_agisuit"] = ::setAgisuit; level._perkUnsetFuncs["specialty_agisuit"] = ::unsetAgisuit; level._perkSetFuncs["specialty_jetsuit"] = ::setJetsuit; level._perkUnsetFuncs["specialty_jetsuit"] = ::unsetJetsuit; level._perkSetFuncs["specialty_fasthealthregen"] = ::setFastHealthRegen; level._perkUnsetFuncs["specialty_fasthealthregen"] = ::unsetFastHealthRegen; level._perkSetFuncs["specialty_flakjacket"] = ::setFlakJacket; level._perkUnsetFuncs["specialty_flakjacket"] = ::unsetFlakJacket; level._perkSetFuncs["specialty_spectre"] = ::setSpectre; level._perkUnsetFuncs["specialty_spectre"] = ::unsetSpectre; level._perkSetFuncs["specialty_spectrepro"] = ::setSpectrePro; level._perkUnsetFuncs["specialty_spectrepro"] = ::unsetSpectrePro; level._perkSetFuncs["specialty_netpainkiller"] = ::setNetPainkiller; level._perkUnsetFuncs["specialty_netpainkiller"] = ::unsetNetPainkiller; level._perkSetFuncs["specialty_dishclip"] = ::setDishClip; level._perkUnsetFuncs["specialty_dishclip"] = ::unsetDishClip; level._perkSetFuncs["specialty_revenge"] = ::setRevenge; level._perkUnsetFuncs["specialty_revenge"] = ::unsetRevenge; level._perkSetFuncs["specialty_uav"] = ::setUAV; level._perkUnsetFuncs["specialty_uav"] = ::unsetUAV; level._perkSetFuncs["specialty_portable_radar"] = ::setPortableRadar; level._perkUnsetFuncs["specialty_portable_radar"] = ::unsetPortableRadar; level._perkSetFuncs["specialty_quieter"] = ::setQuieter; level._perkUnsetFuncs["specialty_quieter"] = ::unsetQuieter; level._perkSetFuncs["specialty_hardline"] = ::setHardline; level._perkUnsetFuncs["specialty_hardline"] = ::unsetHardline; level._perkSetFuncs["specialty_marksman"] = ::setMarksman; level._perkUnsetFuncs["specialty_marksman"] = ::unsetMarksman; level._perkSetFuncs["specialty_ninjaholder"] = ::setNinjaholder; level._perkUnsetFuncs["specialty_ninjaholder"] = ::unsetNinjaholder; level._perkSetFuncs["specialty_explosivedamage"] = ::setExplosivedamage; level._perkUnsetFuncs["specialty_explosivedamage"] = ::unsetExplosivedamage; level._perkSetFuncs["specialty_marathonholder"] = ::setMarathonholder; level._perkUnsetFuncs["specialty_marathonholder"] = ::unsetMarathonholder; level._perkSetFuncs["specialty_quickdrawholder"] = ::setQuickdrawholder; level._perkUnsetFuncs["specialty_quickdrawholder"] = ::unsetQuickdrawholder; level._perkUseFuncs["specialty_fastcarepackagerecovery"] = ::useFastCarePackage; level._perkUnUseFuncs["specialty_fastcarepackagerecovery"] = ::unUseFastCarePackage; level._perkUseFuncs["specialty_rollover"] = ::useRollover; level._perkUnUseFuncs["specialty_rollover"] = ::unUseRollover; level._perkSetFuncs["specialty_gasmask"] = ::setGasMask; level._perkUnsetFuncs["specialty_gasmask"] = ::unsetGasMask; level._perkSetFuncs["specialty_juiced"] = ::setJuiced; level._perkUnsetFuncs["specialty_juiced"] = ::unsetJuiced; initRechargeablePerks(); initPerkDvars(); level thread onPlayerConnect(); } precacheShaders() { precacheShader( "specialty_blastshield" ); precacheShader( "scavenger_pickup" ); } initRechargeablePerks() { precacheItem( "xraydevice_mp" ); level._scriptPerks["specialty_rechargetest"] = true; level._scriptPerks["specialty_Mobilityexpert"] = true; level._scriptPerks["specialty_Steathexpert"] = true; level._scriptPerks["specialty_Awarenessexpert"] = true; level._scriptPerks["specialty_xrayvision"] = true; level._scriptPerks["specialty_disruptor"] = true; level._scriptPerks["specialty_grapplinghook"] = true; level._rechargeablePerks["specialty_rechargetest"] = true; level._rechargeablePerks["specialty_Mobilityexpert"] = true; level._rechargeablePerks["specialty_Steathexpert"] = true; level._rechargeablePerks["specialty_Awarenessexpert"] = true; level._rechargeablePerks["specialty_xrayvision"] = true; level._rechargeablePerks["specialty_disruptor"] = true; level._rechargeablePerks["specialty_grapplinghook"] = true; level._perkUseFuncs["specialty_rechargetest"] = ::useRechargeTest; level._perkUnUseFuncs["specialty_rechargetest"] = ::unUseRechargeTest; level._perkUseFuncs["specialty_grapplinghook"] = ::useGrapplingHook; level._perkUnUseFuncs["specialty_grapplinghook"] = ::unUseGrapplingHook; level._perkUseFuncs["specialty_Mobilityexpert"] = ::useAgileAvenger; level._perkUnUseFuncs["specialty_Mobilityexpert"] = ::unUseAgileAvenger; level._perkUseFuncs["specialty_Steathexpert"] = ::useStealthAssasin; level._perkUnUseFuncs["specialty_Steathexpert"] = ::unUseStealthAssasin; level._perkUseFuncs["specialty_Awarenessexpert"] = ::useAwarenessExpert; level._perkUnUseFuncs["specialty_Awarenessexpert"] = ::unUseAwarenessExpert; level._perkUseFuncs["specialty_xrayvision"] = ::usexrayvision; level._perkUnUseFuncs["specialty_xrayvision"] = ::unUsexrayvision; level._perkUseFuncs["specialty_disruptor"] = ::useDisrputor; level._perkUnUseFuncs["specialty_disruptor"] = ::unUseDisruptor; level._defaultPerkCooldown = 20; //a rechargeable perk can be used every perkCooldown seconds level._defaultPerkDuration = 5; //a rechargeable perk will be active for PerkDuration seconds //the game will assert if perkDuration is > perkCooldown level._perkCooldowns["specialty_rechargetest"] = 20; level._perkDurations["specialty_rechargetest"] = 5; level._perkCooldowns["specialty_Mobilityexpert"] = 40; level._perkDurations["specialty_Mobilityexpert"] = 20; level._perkCooldowns["specialty_Steathexpert"] = 40; level._perkDurations["specialty_Steathexpert"] = 20; level._perkCooldowns["specialty_Awarenessexpert"] = 30; level._perkDurations["specialty_Awarenessexpert"] = 8; level._perkCooldowns["specialty_xrayvision"] = 50; level._perkDurations["specialty_xrayvision"] = 15; level._perkCooldowns["specialty_disruptor"] = 6; level._perkDurations["specialty_disruptor"] = 3; } monitorRechargePerkUsage() { self endon( "death" ); self endon( "disconnect" ); self endon( "clear_recharge_perks" ); //self notifyOnPlayerCommand( "use_rechargeable_perk", "+frag" ); self notifyOnPlayerCommand( "use_rechargeable_perk", "+smoke" ); //taking this out, its causing a problem when switching classes at the start of the match //self waittill( "spawned_player" ); self createRechargeablePerkHudInfo(); self thread destroyRechargeablePerkHudInfoOnDeath(); //get the rechargeable perk that is currently equipped ( this is really just a name used to identify callback scripts ) //along with its cooldown/duration timers perk = self.rechargeablePerk; cooldown = level._defaultPerkCooldown; duration = level._defaultPerkDuration; rechargeStep = 0.05; if( isDefined( level._perkCooldowns[perk] )) { cooldown = level._perkCooldowns[perk]; } if( isDefined( level._perkDurations[perk] )) { duration = level._perkDurations[perk]; } //assert that callbacks for that perk exist assert( isDefined( level._scriptPerks[perk] )); assert( isDefined( level._perkUseFuncs[perk] )); assert( isDefined( level._perkUnUseFuncs[perk] )); assert( duration < cooldown ); for( ;; ) { self.rechargeablePerkProgressBar.bar.color = colorPerkReady; self.breakRechargablePerk = false; //wait until player activates rechargeable perk self waittill( "use_rechargeable_perk" ); rechargeTimer = 0.0; dechargeTimer = 0.0; //launch use script ( this script should turn on any special abilities ) self [[ level._perkUseFuncs[perk] ]](); //set the ui bar to show that we are using the rechargeable perk self.rechargeablePerkProgressBar.bar.color = colorPerkUsing; //TagZP test called this functionality a bug, we currently do not need it so i am disableing it for now. //self thread watchForPerkBreakout(); //drain the bar during the usage while( dechargeTimer < duration && self.breakRechargablePerk == false ) { frac = 1.0 - ( dechargeTimer / duration ); updateRechargeablePerkHudInfo( frac ); dechargeTimer += rechargeStep; wait( rechargeStep ); } self notify( "rechargeable_perk_complete" ); //launch un-use script ( this script should turn off any special abilities ) self [[ level._perkUnUseFuncs[perk] ]](); //now wait for the cooldown to finish, re-fill the progress bar for this duration self.rechargeablePerkProgressBar.bar.color = colorPerkRecharging; waitTime = cooldown - duration; while( rechargeTimer < waitTime ) { updateRechargeablePerkHudInfo( rechargeTimer / waitTime ); rechargeTimer += rechargeStep; wait( rechargeStep ); } updateRechargeablePerkHudInfo( 1.0 ); } } monitorRechargePerkUsageNoRecharge() { self endon( "death" ); self endon( "disconnect" ); self endon( "clear_recharge_perks" ); //self notifyOnPlayerCommand( "toggle_rechargeable_perk", "+frag" ); self notifyOnPlayerCommand( "toggle_rechargeable_perk", "+smoke" ); //taking this out, its causing a problem when switching classes at the start of the match //self waittill( "spawned_player" ); //setup the bar in the UI self createRechargeablePerkHudInfo(); self.rechargeablePerkProgressBar.bar.color = colorPerkReady; self thread destroyRechargeablePerkHudInfoOnDeath(); //get the rechargeable perk that is currently equipped ( this is really just a name used to identify callback scripts ) //along with its cooldown/duration timers perk = self.rechargeablePerk; duration = level._defaultPerkDuration; rechargeStep = 0.1; if( isDefined( level._perkDurations[perk] )) { duration = level._perkDurations[perk]; } //assert that callbacks for that perk exist assert( isDefined( level._scriptPerks[perk] )); assert( isDefined( level._perkUseFuncs[perk] )); assert( isDefined( level._perkUnUseFuncs[perk] )); assert( duration > 0 ); //monitors how long the perk has been on for self.usageTimer = 0.0; for( ;; ) { //wait until player activates rechargeable perk self waittill( "toggle_rechargeable_perk" ); //use this variable know if the perk is toggled on/off self.toggleRechargablePerk = true; //spawn off a script to watch for the toggle off. self thread watchForPerkToggleOff(); //if our meter is empty do not allow usage if( self.usageTimer >= duration ) { continue; } //Activate the perk self [[ level._perkUseFuncs[perk] ]](); //wait for the bar to fully drain or for the player to toggle the perk off while( self.usageTimer <= duration && self.toggleRechargablePerk == true ) { frac = 1.0 - ( self.usageTimer / duration ); updateRechargeablePerkHudInfo( frac ); self.usageTimer += rechargeStep; wait( rechargeStep ); } //if we have exhausted the entire bar if( self.usageTimer >= duration ) { self notify( "rechargeable_perk_complete" ); self.rechargeablePerkProgressBar.bar.color = colorPerkRecharging; } //De-Activate the perk self [[ level._perkUnUseFuncs[perk] ]](); } } //call this on the player to add more energy into their energy pool //do not pass in any amount to refil the bar to full givePerkEnergy( amount ) { if( !isDefined( self.usageTimer )) { return; } if( !isDefined( amount )) { if( isDefined( self.usageTimer )) { //refill the bar, i.e. the player has used 0.0 time out of their energy pool self.usageTimer = 0.0; } } else { self.usageTimer -= amount; //clamp to 0.0 if( self.usageTime < 0.0 ) { self.usageTime = 0.0; } } } watchForPerkBreakout() { self endon( "death" ); self endon( "disconnect" ); self endon( "clear_recharge_perks" ); msg = self waittill_any_return( "use_rechargeable_perk", "rechargeable_perk_complete" ); if( msg == "use_rechargeable_perk" ) { self.breakRechargablePerk = true; } } watchForPerkToggleOff() { self endon( "death" ); self endon( "disconnect" ); self endon( "rechargeable_perk_complete" ); self endon( "clear_recharge_perks" ); msg = self waittill_any_return( "toggle_rechargeable_perk" ); if( msg == "toggle_rechargeable_perk" && self.toggleRechargablePerk == true ) { self.toggleRechargablePerk = false; } } createRechargeablePerkHudInfo() { // Recharge bar self.rechargeablePerkProgressBar = self createRechargeBar( colorPerkReady, 100, 6 ); //self.rechargeablePerkProgressBar setPoint("CENTER", "BOTTOM", 290, -66 ); self.rechargeablePerkProgressBar setPoint("LEFT", "TOP", -407, 123 ); self.rechargeablePerkProgressBar.alpha = 0.65; self.rechargeablePerkProgressBar.bar.alpha = 0.65; //self.rechargeablePerkProgressBar.layer = "visor"; self updateRechargeablePerkHudInfo( 1.0 ); } createRechargeBar( color, width, height, flashFrac ) { barElem = newClientHudElem( self ); barElem.x = 0 ; barElem.y = 0; barElem.frac = 0; barElem.color = color; barElem.sort = -2; barElem.shader = "progress_bar_fill"; barElem setShader( "progress_bar_fill", width, height ); barElem.hidden = false; barElem.hidewheninmenu = true; if ( isDefined( flashFrac ) ) { barElem.flashFrac = flashFrac; } //barElem.layer = "visor"; barElemBG = newClientHudElem( self ); barElemBG.elemType = "bar"; barElemBG.width = width; barElemBG.height = height; barElemBG.xOffset = 0; barElemBG.yOffset = 0; barElemBG.bar = barElem; barElemBG.children = []; barElemBG.sort = -3; barElemBG.color = (0,0,0); barElemBG.alpha = 0.5; barElemBG setParent( level._uiParent ); barElemBG setShader( "progress_bar_bg", width + 4, height + 4 ); barElemBG.hidden = false; barElemBG.hidewheninmenu = true; return barElemBG; } destroyRechargeablePerkHudInfoOnDeath() { msg = self waittill_any_return( "death", "clear_recharge_perks" ); self destroyRechargeablePerkHudInfo(); } destroyRechargeablePerkHudInfo() { if( isDefined( self.rechargeablePerkProgressBar )) { self.rechargeablePerkProgressBar destroyElem(); } } updateRechargeablePerkHudInfo( percent ) { self.rechargeablePerkProgressBar updateBar( percent ); } monitorXrayTest() { self endon( "death" ); self endon( "clear_recharge_perks" ); self notifyOnPlayerCommand( "activate_xray", "+smoke" ); println( "monitor xray test" ); for( ;; ) { self waittill( "activate_xray" ); //dont activate if the player is using the mini-uav /* if( self hasWeapon( level._miniuav_player_weapons[ "view_model_weapon" ] )) { continue; } */ self xraySequence(); } } xraySequence() { self endon( "death" ); self endon( "clear_recharge_perks" ); maxDuration = 1000.0; primary = self.primaryWeapon; //self takeWeapon( primary ); self giveWeapon( "xraydevice_mp" ); self switchToWeapon( "xraydevice_mp" ); wait( 0.5 ); self SetXRayVision ( true ); self thread xrayUpdateBeep(); wait( 0.5 ); totalWait = 0.0; //hold out until the button is released for( ;; ) { if( self SecondaryOffhandButtonPressed() && totalWait < maxDuration ) { wait 0.05; totalWait += 0.05; } else { break; } } self notify( "xray_off" ); self SetXRayVision ( false ); self takeWeapon( "xraydevice_mp" ); self switchToWeapon( primary ); } givePerk( perkName ) { if ( IsSubStr( perkName, "_mp" ) ) { if ( perkName == "frag_grenade_mp" ) self SetOffhandPrimaryClass( "frag" ); if ( perkName == "throwingknife_mp" ) self SetOffhandPrimaryClass( "throwingknife" ); if ( perkName == "hulc_rocket_mp" ) self SetOffhandPrimaryClass( "hulc_rocket" ); if ( perkName == "hulc_lidar_mp" ) self SetOffhandPrimaryClass( "hulc_lidar" ); if ( perkName == "hulc_frag_mp" ) self SetOffhandPrimaryClass( "hulc_frag" ); if ( perkName == "hulc_semtex_mp" ) self SetOffhandPrimaryClass( "hulc_semtex" ); if ( perkName == "hulc_n00b_mp" ) self SetOffhandPrimaryClass( "hulc_n00b" ); self _giveWeapon( perkName, 0 ); //Un-comment the following section to give the HULC suit one extra lethal gredane if ( self hasPerk ( "specialty_twoprimaries", false )) { self SetWeaponAmmoStock( perkName, (WeaponStartAmmo ( perkName ) + 1)); } else { 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.rechargeablePerks = []; 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 ) ); // show the victim on the minimap for N seconds if( IsPlayer( attacker ) && attacker _hasPerk( "specialty_paint_pro" ) && !isKillstreakWeapon( weapon ) ) { victim thread maps\mp\perks\_perkfunctions::setPainted( attacker.team ); } if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_bulletdamage" ) && ( victim _hasPerk( "specialty_armorvest" ) || victim _hasPerk("specialty_juggersuit") || victim _hasPerk("specialty_netpainkiller") )) damageAdd += 0; else if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_bulletdamage" ) ) damageAdd += damage*level._bulletDamageMod; else if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_armorpiercing" ) && (victim _hasPerk("specialty_armorvest" )) ) damageAdd += 0; else if ( (victim _hasPerk("specialty_armorvest")) || (victim _hasPerk("specialty_netpainkiller")) ) damageAdd -= damage*(1-level._armorVestMod); else if ( victim _hasPerk("specialty_juggersuit") ) { damageAdd -= damage*(1-level._juggersuitMod); } if ( isPlayer( attacker ) && attacker _hasPerk( "specialty_fmj" ) && victim _hasPerk ( "specialty_armorvest" ) ) damageAdd += damage*level._hollowPointDamageMod; } else if ( isExplosiveDamage( meansOfDeath ) ) { if( IsPlayer( attacker ) && attacker != victim && attacker _hasPerk( "specialty_paint" ) && !isKillstreakWeapon( weapon ) ) { victim thread maps\mp\perks\_perkfunctions::setPainted( attacker.team ); } 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_juggersuit") ) { damageAdd -= damage*(1-level._juggersuitExplosiveDamageMod); } else if( victim _hasPerk("specialty_flakjacket") ) { damageAdd -= damage*(1-level._flakJacketMod); } 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; } } else if (meansOfDeath == "MOD_MELEE" ) { // modify melee damage if ( isPlayer( attacker ) && weaponInheritsPerks( weapon ) && attacker _hasPerk( "specialty_armorpiercing" ) && (victim _hasPerk("specialty_armorvest" )) ) { damageAdd = 0; } else if ( victim _hasPerk( "specialty_armorvest" ) ) { damageAdd -= damage*(1-level._armorvestMeleeDamageMod); } else if ( victim _hasPerk("specialty_juggersuit" ) ) { damageAdd -= damage*(1-level._juggersuitMeleeDamageMod); } } else if (meansofDeath == "MOD_IMPACT" ) { // modify throwing knife damage if ( victim _hasPerk("specialty_armorvest" ) ) { damageAdd -= damage*(1-level._armorvestImpactDamageMod); } else if ( victim _hasPerk("specialty_juggersuit" ) ) { damageAdd -= damage*(1-level._juggersuitImpactDamageMod); } } 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", 100 )/100; // percentage of damage you take in the Trophy Suit level._armorvestMeleeDamageMod = getIntProperty( "perk_armorvest_melee_damage", 50 )/100; // percentage of melee damage you take in the Trophy Suit level._armorvestImpactDamageMod = getIntProperty( "perk_armorvest_impact_damage", 50 )/100; // percentage of impact (throwing knife and others) damage you take in the Trophy suit level._juggersuitMod = getIntProperty( "perk_juggersuit", 8 )/100; // percentage of bullet damage you take in the jugger suit level._juggersuitExplosiveDamageMod = getIntProperty( "perk_juggersuit_explosive_damage", 8 )/100; // percentage of explosive damage you take in the jugger suit level._juggersuitMeleeDamageMod = getIntProperty( "perk_juggersuit_melee_damage", 20 )/100; // percentage of melee damage you take in the jugger suit level._juggersuitImpactDamageMod = getIntProperty( "perk_juggersuit_impact_damage", 20 )/100; // percentage of impact (throwing knife and others) damage you take in the jugger suit 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 % level._flakJacketMod = getIntProperty( "perk_flakjacket", 45 )/100; // percentage of explosive damage you take with the flakjacket perk } // 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" ); }