s1-scripts-dev/raw/maps/mp/_adrenaline.gsc
2025-05-21 16:23:17 +02:00

292 lines
7.5 KiB
Plaintext

/*
Exo Overclock
Author: Keith Evans
Description: A piece of equipment used to give you temporarily increased speed
*/
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
#include maps\mp\gametypes\_hostmigration;
#include maps\mp\perks\_perkfunctions;
#include maps\mp\_snd_common_mp;
CONST_Adrenaline_SpeedScale = 1.12;
CONST_Adrenaline_Timeout = 10;
watchAdrenalineUsage() // self = player
{
self notify( "exo_overclock_taken" ); // Cleans up existing Exo Overclock threads.
level endon( "game_ended" );
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "faux_spawn" );
self endon( "exo_overclock_taken" );
if ( !self HasWeapon( "adrenaline_mp" ) )
return;
self AdrenalineInit();
self thread MonitorPlayerDeath();
self thread wait_for_game_end();
while ( 1 )
{
self waittill( "exo_adrenaline_fire" );
if( !IsAlive( self ) )
return;
self thread tryUseAdrenaline();
}
}
AdrenalineInit()
{
self.overclock_on = false;
self BatterySetDischargeScale( "adrenaline_mp", 1.0 );
full_energy = self BatteryGetSize( "adrenaline_mp" );
if ( self GetTacticalWeapon() == "adrenaline_mp" )
{
self SetClientOmnvar( "exo_ability_nrg_req0", 0 );
self SetClientOmnvar( "exo_ability_nrg_total0", full_energy );
self SetClientOmnvar( "ui_exo_battery_level0", full_energy );
}
else if ( self GetLethalWeapon() == "adrenaline_mp" )
{
self SetClientOmnvar( "exo_ability_nrg_req1", 0 );
self SetClientOmnvar( "exo_ability_nrg_total1", full_energy );
self SetClientOmnvar( "ui_exo_battery_level1", full_energy );
}
if ( !IsDefined( level.exo_overclock_vfx_le_active ) )
level.exo_overclock_vfx_le_active = LoadFX( "vfx/lights/exo_overclock_hip_le_start" );
if ( !IsDefined( level.exo_overclock_vfx_ri_active ) )
level.exo_overclock_vfx_ri_active = LoadFX( "vfx/lights/exo_overclock_hip_ri_start" );
if ( !IsDefined( level.exo_overclock_vfx_le_inactive ) )
level.exo_overclock_vfx_le_inactive = LoadFX( "vfx/lights/exo_overclock_hip_le_inactive" );
if ( !IsDefined( level.exo_overclock_vfx_ri_inactive ) )
level.exo_overclock_vfx_ri_inactive = LoadFX( "vfx/lights/exo_overclock_hip_ri_inactive" );
wait( 0.05 );
if ( !inVirtualLobby() )
{
//turn on fx for inactive exo overclock
PlayFXOnTag( level.exo_overclock_vfx_le_inactive, self, "J_Hip_LE" );
PlayFXOnTag( level.exo_overclock_vfx_ri_inactive, self, "J_Hip_RI" );
}
}
tryUseAdrenaline( ) // self == player
{
self endon( "exo_overclock_taken" );
if ( self.overclock_on == true )
{
self thread StopAdrenaline( true );
}
else
{
self thread StartAdrenaline();
}
}
killOverclockFx() // self == player
{
if ( IsDefined( self.overclock_fx_l ) )
{
self.overclock_fx_l delete();
self.overclock_fx_l = undefined;
}
if ( IsDefined( self.overclock_fx_r ) )
{
self.overclock_fx_r delete();
self.overclock_fx_r = undefined;
}
}
StartAdrenaline() //self == player
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "faux_spawn" );
self endon( "exo_overclock_taken" );
self endon( "EndAdrenaline" );
self.overclock_on = true;
// Need to handle this here because Exo Overclock is not processed like a grenade as other Exo Abilities are.
maps\mp\gametypes\_gamelogic::setHasDoneCombat( self, true );
self.adrenaline_speed_scalar = CONST_Adrenaline_SpeedScale;
if ( self _hasPerk( "specialty_lightweight" ) )
{
// lightWeightScalar() does not return the percent speed boost from lightweight but the full scalar, hence the -1.
self.moveSpeedScaler = self.adrenaline_speed_scalar + ( lightWeightScalar() - 1 );
}
else
{
self.moveSpeedScaler = self.adrenaline_speed_scalar;
}
//for coop - set movespeed to be based of the class setting
if ( isdefined ( level.isHorde ) && level.isHorde )
{
class = self GetClientOmnvar ( "ui_horde_player_class" );
self.moveSpeedScaler = min ( ( level.classSettings[class]["speed"] + 0.25 ), CONST_Adrenaline_SpeedScale );
}
self maps\mp\gametypes\_weapons::updateMoveSpeedScale();
self BatteryDischargeBegin( "adrenaline_mp" );
self maps\mp\_exo_battery::set_exo_ability_hud_omnvar( "adrenaline_mp", "ui_exo_battery_toggle", 1 );
self thread maps\mp\_exo_battery::update_exo_battery_hud( "adrenaline_mp" );
self thread monitor_overclock_battery_charge();
// activation sound
self snd_message( "mp_exo_overclock_activate" );
// vfx
self killOverclockFx();
wait( 0.05 );
if ( !self.overclock_on ) //turned off during wait?
return;
if ( !IsDefined( self.exo_cloak_on ) || self.exo_cloak_on == false )
{
self.overclock_fx_l = SpawnLinkedFx( level.exo_overclock_vfx_le_active, self, "J_Hip_LE" );
self.overclock_fx_r = SpawnLinkedFx( level.exo_overclock_vfx_ri_active, self, "J_Hip_RI" );
TriggerFX( self.overclock_fx_l );
TriggerFX( self.overclock_fx_r );
}
//jwells - overlay VFX handled in code so killcam will work
}
StopAdrenaline( should_play_fx ) // self = player
{
if ( !isDefined( self.overclock_on ) || !self.overclock_on )
return;
if ( !IsDefined( should_play_fx ) )
{
should_play_fx = true;
}
self notify( "EndAdrenaline" );
self.overclock_on = false;
if ( self _hasPerk( "specialty_lightweight" ) )
{
self.moveSpeedScaler = lightWeightScalar();
}
else
{
self.moveSpeedScaler = level.basePlayerMoveScale;
}
//for coop - set movespeed back to the class setting
if ( isdefined ( level.isHorde ) && level.isHorde )
{
class = self GetClientOmnvar ( "ui_horde_player_class" );
self.moveSpeedScaler = level.classSettings[class]["speed"];
}
self maps\mp\gametypes\_weapons::updateMoveSpeedScale();
self.adrenaline_speed_scalar = undefined;
self BatteryDischargeEnd( "adrenaline_mp" );
self maps\mp\_exo_battery::set_exo_ability_hud_omnvar( "adrenaline_mp", "ui_exo_battery_toggle", 0 );
self killOverclockFx();
if ( should_play_fx == true )
{
// deactivation sound
self snd_message( "mp_exo_overclock_deactivate" );
wait( 0.05 );
if ( !IsDefined( self.exo_cloak_on ) || self.exo_cloak_on == false )
{
self.overclock_fx_l = SpawnLinkedFx( level.exo_overclock_vfx_le_inactive, self, "J_Hip_LE" );
self.overclock_fx_r = SpawnLinkedFx( level.exo_overclock_vfx_ri_inactive, self, "J_Hip_RI" );
TriggerFX( self.overclock_fx_l );
TriggerFX( self.overclock_fx_r );
}
}
//jwells - overlay VFX handled in code so killcam will work
}
MonitorPlayerDeath()
{
self endon( "disconnect" );
self waittill_any( "death", "joined_team", "faux_spawn", "exo_overclock_taken" );
self thread StopAdrenaline( false );
}
monitor_overclock_battery_charge() // self = player
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "faux_spawn" );
self endon( "exo_overclock_taken" );
self endon( "EndAdrenaline" );
while ( self.overclock_on == true )
{
if ( self BatteryGetCharge( "adrenaline_mp" ) <= 0 )
{
thread StopAdrenaline( true );
}
wait( 0.05 );
}
}
take_exo_overclock() //self = player
{
self notify( "kill_battery" );
self notify( "exo_overclock_taken" );
self takeWeapon( "adrenaline_mp" );
}
give_exo_overclock() //self = player
{
self giveWeapon( "adrenaline_mp" );
self thread watchAdrenalineUsage();
}
wait_for_game_end() // self = player
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "faux_spawn" );
self endon( "exo_overclock_taken" );
level waittill( "game_ended" );
self thread StopAdrenaline( false );
}