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

622 lines
14 KiB
Plaintext

#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
init()
{
level.mp_recovery_killstreak = SpawnStruct();
level.mp_recovery_killstreak.killstreak_InUse = false;
level.mp_recovery_killstreak.killstreak_duration = 25;
level.mp_recovery_killstreak.speed_scale = 1.25;
level.mp_recovery_killstreak.health_scale = 1.75;
level.mp_recovery_killstreak.max_health_amplify_object = 1500;
level.mp_recovery_killstreak.exo_super_vfx = LoadFX( "vfx/lights/air_light_exosuper_yellow" );
level.mp_recovery_killstreak.amplify_vfx = LoadFX( "vfx/lights/air_light_amplifymachine_yellow" );
amplify_ring_side_01 = getent("damage_ring_01","targetname");
amplify_ring_side_02 = getent("damage_ring_02","targetname");
level.mp_recovery_killstreak.DamageRingsArray = [amplify_ring_side_01, amplify_ring_side_02];
foreach( damage_ring in level.mp_recovery_killstreak.DamageRingsArray )
{
damage_ring HudOutlineEnable(1, true);
damage_ring SetCanDamage(true);
damage_ring SetCanRadiusDamage(true);
damage_ring.Max_fake_health = level.mp_recovery_killstreak.max_health_amplify_object;
damage_ring.health = damage_ring.Max_fake_health;
damage_ring.maxhealth = damage_ring.Max_fake_health;
damage_ring.fakehealth = damage_ring.Max_fake_health;
VFX_points = getstructarray(damage_ring.target, "targetname");
damage_ring.tag_array = [];
foreach(VFX_point in VFX_points)
{
tag = spawn_tag_origin();
tag.origin = VFX_point.origin;
tag show();
damage_ring.tag_array[damage_ring.tag_array.size] = tag;
}
}
/#
//Used for tuning purposes. Please do not delete.
// SetDvarIfUninitialized( "killstreak_duration", 25 );
#/
precacheString( &"KILLSTREAKS_MP_RECOVERY" );
level.killStreakFuncs[ "mp_recovery" ] = ::tryUseMpRecovery;
level.mapKillStreak = "mp_recovery";
level thread onRecoveryPlayerConnect();
}
tryUseMpRecovery( lifeId, modules )
{
if ( level.mp_recovery_killstreak.killstreak_InUse )
{
self iPrintLnBold( &"MP_RECOVERY_IN_USE" );
return false;
}
if ( self isUsingRemote() )
{
return false;
}
if ( self isAirDenied() )
{
return false;
}
if ( self isEMPed() )
{
return false;
}
result = exoTeamBuffSetup( self );
if ( IsDefined( result ) && result )
{
self maps\mp\_matchdata::logKillstreakEvent( "mp_recovery", self.origin );
}
return result;
}
exoTeamBuffSetup(owner)
{
if(IsDefined(owner))
{
level.mp_recovery_killstreak.killstreak_InUse = true;
level.mp_recovery_killstreak.owner = owner;
level.mp_recovery_killstreak.killstreak_team = owner.team;
}
else
{
return false;
}
killstreakTeam = owner.team;
thread StartExoRecoveryKillstreak(owner, killstreakTeam);
return true;
}
StartExoRecoveryKillstreak(owner, killstreakTeam)
{
SetupAmplifierDamageMonitor(owner, killstreakTeam);
// TurnOnPlayerHUDOutline( owner, killstreakTeam)
SortPlayersAndGivePowers(owner, killstreakTeam);
thread SetMapKillstreakTimer();
level waittill_any("time_up", "amplifier_destroyed");
ShutOffAmplifyObjectVFX();
ShutOffAllPlayersExoBuffs();
level notify("recovery_streak_over");
wait(0.25);
level.mp_recovery_killstreak.killstreak_InUse = false;
}
SetMapKillstreakTimer()
{
level endon("recovery_streak_over");
wait(level.mp_recovery_killstreak.killstreak_duration);
level notify("time_up");
}
SetupAmplifierDamageMonitor(owner, killstreakTeam)
{
faction = "atlas";
teamToShow = "axis";
if(killstreakTeam == "axis")
{
faction = "atlas";
teamToShow = "allies";
}
else if(killstreakTeam == "allies")
{
faction = "sentinel";
teamToShow = "axis";
}
AmplifyIconArt = "faction_128_" + faction;
foreach( damage_ring in level.mp_recovery_killstreak.DamageRingsArray )
{
damage_ring SetCanDamage(true);
damage_ring SetCanRadiusDamage(true);
damage_ring.health = damage_ring.Max_fake_health;
damage_ring.maxhealth = damage_ring.Max_fake_health;
damage_ring.fakehealth = damage_ring.Max_fake_health;
damage_ring thread StartAmplifyObjectVFX();
damage_ring thread MonitorAmplifierDamage(owner, killstreakTeam);
/////// don't put icons up for side you can't get to
if(level.DynamicEventStatus == "before" && damage_ring.targetname == "damage_ring_02")
{
continue;
}
else if(level.DynamicEventStatus == "after" && damage_ring.targetname == "damage_ring_01")
{
continue;
}
if(level.teamBased == false)
{
foreach(player in level.players)
{
if(player != owner)
{
damage_ring maps\mp\_entityheadIcons::setHeadIcon(player, AmplifyIconArt, (0,0,0), 18, 18, undefined, undefined, undefined, true, false, false );
}
}
}
else if(level.teamBased == true)
{
damage_ring maps\mp\_entityheadIcons::setHeadIcon(teamToShow, AmplifyIconArt, (0,0,0), 18, 18, undefined, undefined, undefined, true, false, false );
}
}
}
MonitorAmplifierDamage(owner, killstreakTeam)
{
level endon( "recovery_streak_over" );
while(level.mp_recovery_killstreak.killstreak_InUse == true)
{
self waittill("damage", amount, attacker, direction, point, means_of_death, model, tag, part_name, damage_flags, weapon_name);
if(!IsValidStreakPlayer(attacker, owner, killstreakTeam))
{
self.fakehealth += (amount * -1);
if(self.fakehealth <= 0)
{
level notify("amplifier_destroyed");
return;
}
}
}
}
StartAmplifyObjectVFX()
{
foreach( damage_ring in level.mp_recovery_killstreak.DamageRingsArray )
{
foreach(tag in damage_ring.tag_array)
{
PlayFXOnTag( level.mp_recovery_killstreak.amplify_vfx, tag, "tag_origin" );
}
}
}
ShutOffAmplifyObjectVFX()
{
ShutOffPlayerHUDOutline();
foreach( damage_ring in level.mp_recovery_killstreak.DamageRingsArray )
{
damage_ring destroyPlayerIcons();
foreach(tag in damage_ring.tag_array)
{
StopFXOnTag( level.mp_recovery_killstreak.amplify_vfx, tag, "tag_origin" );
}
}
}
destroyPlayerIcons() //Borrowed some of this script from _entityheadicons.gsc::setHeadIcon()
{
if ( IsDefined (self.entityHeadIcons) )
{
if ( isDefined( self.entityHeadIcons[ "allies" ] ) )
{
self.entityHeadIcons[ "allies" ] destroy();
self.entityHeadIcons[ "allies" ] = undefined;
}
if ( isDefined( self.entityHeadIcons[ "axis" ] ) )
{
self.entityHeadIcons[ "axis" ] destroy();
self.entityHeadIcons[ "axis" ] = undefined;
}
foreach(player in level.players)
{
if ( isDefined( self.entityHeadIcons[ player.guid ] ) )
{
self.entityHeadIcons[ player.guid ] destroy();
self.entityHeadIcons[ player.guid ] = undefined;
}
}
}
}
ShutOffPlayerHUDOutline()
{
foreach(player in level.players)
{
foreach( damage_ring in level.mp_recovery_killstreak.DamageRingsArray )
{
damage_ring HudOutlineDisableForClient(player);
}
}
}
TurnOnPlayerHUDOutline( owner, killstreakTeam)
{
foreach(player in level.players)
{
if(!IsValidStreakPlayer(player, owner, killstreakTeam))
{
foreach( damage_ring in level.mp_recovery_killstreak.DamageRingsArray )
{
damage_ring HudOutlineEnableForClient(player, 1, true);
}
}
}
}
SortPlayersAndGivePowers(owner, killstreakTeam)
{
foreach(player in level.players)
{
if(IsValidStreakPlayer(player, owner, killstreakTeam) == true)
{
if( isReallyAlive(player))
{
player SetupSuperExo();
player thread GiveSuperExo();
}
}
player thread MonitorSpawnDurringStreak(owner, killstreakTeam);
}
thread MonitorConnectedDuringStreak(owner, killstreakTeam);
}
ShutOffAllPlayersExoBuffs()
{
// TODO make it play with exo abilities overclock and health gen etc
foreach(player in level.players)
{
player ShutOffExoBuffs();
}
}
ShutOffExoBuffs()
{
if(isdefined(self.SuperExoSettings) && isdefined(self.SuperExoSettings.IsActive))
{
self.SuperExoSettings.IsActive = false;
}
self ShutOffSpeed();
self ShutOffFX();
self ShutOffHealth();
self ShutOffSlam();
}
ShutOffSlam()
{
if(IsDefined(self.CAC_has_slam) && self.CAC_has_slam == true)
{
// do nothing for now
}
else
{
if ( self _hasPerk( "specialty_exo_slamboots" ) )
{
// UnSetPerk
_unsetPerk("specialty_exo_slamboots");
}
}
self.CAC_has_slam = undefined;
}
ShutOffSpeed()
{
self.moveSpeedScaler = level.basePlayerMoveScale;
if ( self _hasPerk( "specialty_lightweight" ) )
{
self.moveSpeedScaler = lightWeightScalar();
}
self maps\mp\gametypes\_weapons::updateMoveSpeedScale();
}
ShutOffHealth()
{
self.maxhealth = int( self.maxhealth / level.mp_recovery_killstreak.health_scale );
if( self.health > self.maxhealth )
{
self.health = self.maxhealth;
}
self.healthRegenLevel = undefined;
}
ShutOffFX()
{
if( Isdefined(self.SuperExoSettings) && IsDefined( self.SuperExoSettings.overlay ) )
{
self.SuperExoSettings.overlay Destroy();
}
if ( IsDefined( level.mp_recovery_killstreak.exo_super_vfx ) )
{
if(isReallyAlive(self))
{
StopFXOnTag( level.mp_recovery_killstreak.exo_super_vfx, self, "tag_shield_back" );
StopFXOnTag( level.mp_recovery_killstreak.exo_super_vfx, self, "j_knee_le" );
StopFXOnTag( level.mp_recovery_killstreak.exo_super_vfx, self, "j_knee_ri" );
}
}
}
GiveSuperExo()
{
// TODO make it play with exo abilities overclock and health gen etc
self SetupSuperExo();
self.SuperExoSettings.IsActive = true;
self GiveSuperSpeed();
self GiveSuperHealth();
self GiveSuperStomp();
self GiveSuperPunch();
self GiveSuperRepulse();
self TurnOnSuperFX();
self thread WatchForDeath();
}
WatchForDeath()
{
level endon( "game_ended" );
level endon( "recovery_streak_over" );
self endon( "disconnect" );
self waittill("death");
if(level.mp_recovery_killstreak.killstreak_InUse == true)
{
self ShutOffExoBuffs();
}
}
GiveSuperSpeed()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "faux_spawn" );
self.moveSpeedScaler = level.mp_recovery_killstreak.speed_scale;
self maps\mp\gametypes\_weapons::updateMoveSpeedScale();
}
GiveSuperHealth()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "faux_spawn" );
self.maxhealth = int( self.maxhealth * level.mp_recovery_killstreak.health_scale );
self.ignoreRegenDelay = true;
self.healthRegenLevel = .99;
self notify( "damage" );
}
GiveSuperStomp()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "faux_spawn" );
self.CAC_has_slam = undefined;
if( self _hasPerk( "specialty_exo_slamboots" ) )
{
self.CAC_has_slam = true;
}
else
{
self givePerk( "specialty_exo_slamboots", false );
self.CAC_has_slam = false;
}
}
GiveSuperPunch()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "faux_spawn" );
}
GiveSuperRepulse()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "faux_spawn" );
self thread maps\mp\_exo_repulsor::do_exo_repulsor();
}
TurnOnSuperFX()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "faux_spawn" );
//temp hud overlay
if(!isdefined(self.SuperExoSettings.overlay))
{
self.SuperExoSettings.overlay = NewClientHudElem( self );
self.SuperExoSettings.overlay.x = 0;
self.SuperExoSettings.overlay.y = 0;
self.SuperExoSettings.overlay.horzAlign = "fullscreen";
self.SuperExoSettings.overlay.vertAlign = "fullscreen";
self.SuperExoSettings.overlay SetShader( "exo_hud_cloak_overlay", 640, 480 );
self.SuperExoSettings.overlay.archive = true;
self.SuperExoSettings.overlay.alpha = 1.0;
}
// temp vfx
if ( IsDefined( level.mp_recovery_killstreak.exo_super_vfx ) )
{
PlayFXOnTag( level.mp_recovery_killstreak.exo_super_vfx, self, "tag_shield_back" );
PlayFXOnTag( level.mp_recovery_killstreak.exo_super_vfx, self, "j_knee_le" );
PlayFXOnTag( level.mp_recovery_killstreak.exo_super_vfx, self, "j_knee_ri" );
}
//temp activation sound
// self playLocalSound( "earn_superbonus" );
}
SetupSuperExo()
{
if(!isdefined(self.SuperExoSettings))
{
self.SuperExoSettings = SpawnStruct();
}
if ( !IsDefined( level.mp_recovery_killstreak.exo_super_vfx ) )
{
level.mp_recovery_killstreak.exo_super_vfx = LoadFX( "vfx/lights/air_light_exosuper_yellow" );
}
self.SuperExoSettings.IsActive = false;
}
IsValidStreakPlayer(player, owner, killstreakTeam)
{
if(level.teamBased == false && Isdefined(owner) && player == owner)
{
return true;
}
else if(level.teamBased == true && player.team == killstreakTeam)
{
return true;
}
else
{
return false;
}
}
MonitorSpawnDurringStreak(owner, killstreakTeam)
{
self endon("disconnect");
level endon( "game_ended" );
level endon( "recovery_streak_over" );
while(level.mp_recovery_killstreak.killstreak_InUse == true)
{
self waittill("spawned_player");
if(IsValidStreakPlayer(self, owner, killstreakTeam) == true)
{
wait(0.25); // because of an overlay bug being destroyed then created on spawn
if(level.mp_recovery_killstreak.killstreak_InUse == true)
{
self SetupSuperExo();
self thread GiveSuperExo();
}
}
}
}
MonitorConnectedDuringStreak(owner, killstreakTeam)
{
level endon( "game_ended" );
level endon( "recovery_streak_over" );
while(level.mp_recovery_killstreak.killstreak_InUse == true)
{
level waittill( "connected", player );
player MonitorSpawnDurringStreak(owner, killstreakTeam);
}
}
onRecoveryPlayerConnect()
{
level endon( "game_ended" );
while ( true )
{
level waittill( "connected", player );
foreach( damage_ring in level.mp_recovery_killstreak.DamageRingsArray )
{
damage_ring HudOutlineDisableForClient(player);
}
player thread onRecoveryPlayerDisconnect();
}
}
onRecoveryPlayerDisconnect()
{
level endon( "game_ended" );
self waittill( "disconnect" );
}