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

158 lines
3.5 KiB
Plaintext

/*
Adrenaline Boost
Author: Ben Retan
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;
CONST_mute_device_radius_min = 350; // Radius at which sounds are fully attenuated
CONST_mute_device_radius_max = 600; // Radius at which sounds are no longer attenuated
CONST_mute_device_timeout = 20; // How long the muting effect should last
CONST_mute_device_fade_time = 0.25; // How long it should take to fade out the muting effect when the device expires
watchMuteBombUsage()
{
self endon( "spawned_player" );
self endon( "disconnect" );
self endon( "death" );
self endon( "faux_spawn" );
if(!IsDefined(level.adrenalineSettings))
{
MuteBombInit();
}
while ( 1 )
{
self waittill( "grenade_fire", mute_device, weapname );
if ( weapname == "mute_bomb_mp" )
{
if( !IsAlive( self ) )
{
mute_device delete();
return;
}
thread tryUseMuteBomb( mute_device );
}
}
}
MuteBombInit()
{
self.adrenalineSettings = SpawnStruct();
}
tryUseMuteBomb( mute_device ) // self == player
{
// Force init (this is for test bots)
if(!IsDefined(self.adrenalineSettings))
{
MuteBombInit();
}
thread StartMuteBomb( mute_device );
thread MonitorPlayerDeath( mute_device );
mute_device thread MonitorMuteBombDeath();
return true;
}
StartMuteBomb( mute_device )
{
self endon("ClearMuteBomb");
self endon("death");
mute_device endon( "death" );
mute_device PlaySound( "mute_device_activate" );
wait( 0.75 );
mute_device AddSoundMuteDevice( CONST_mute_device_radius_min, CONST_mute_device_radius_max, CONST_mute_device_fade_time );
mute_device PlayLoopSound( "mute_device_active_lp" );
mute_device thread MonitorMuteBombPlayers();
wait( CONST_mute_device_timeout );
mute_device ScaleVolume( 0.0, CONST_mute_device_fade_time );
mute_device RemoveSoundMuteDevice( CONST_mute_device_fade_time );
mute_device notify( "ShutdownMuteBomb" );
wait( CONST_mute_device_fade_time );
mute_device StopLoopSound();
}
MonitorPlayerDeath( mute_device )
{
mute_device endon( "ShutdownMuteBomb" );
self waittill( "death" );
if ( IsDefined( mute_device ) )
{
mute_device RemoveSoundMuteDevice( CONST_mute_device_fade_time );
mute_device notify( "ShutdownMuteBomb" );
}
}
MonitorMuteBombDeath() // self == mute_device
{
self endon( "ShutdownMuteBomb" );
self waittill( "death" );
if ( IsDefined( self ) )
{
self RemoveSoundMuteDevice( CONST_mute_device_fade_time );
self notify( "ShutdownMuteBomb" );
}
}
MonitorMuteBombPlayers() // self == mute_device
{
self endon( "ShutdownMuteBomb" );
// Use a radius halfway between the min and max
radius = CONST_mute_device_radius_min + ( ( CONST_mute_device_radius_max - CONST_mute_device_radius_min ) / 2 );
self.touchingPlayers = [];
while ( 1 )
{
foreach ( player in level.players )
{
dist = Distance( self.origin, player.origin );
touching = array_contains( self.touchingPlayers, player );
if ( dist <= radius )
{
if ( !touching )
{
self.touchingPlayers = array_add( self.touchingPlayers, player );
player PlayLocalSound( "mute_device_active_enter" );
}
}
else
{
if ( touching )
{
self.touchingPlayers = array_remove( self.touchingPlayers, player );
player PlayLocalSound( "mute_device_active_exit" );
}
}
}
wait( 0.05 );
}
}