boiii-scripts/shared/drown.gsc
2023-04-13 17:30:38 +02:00

149 lines
12 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\damagefeedback_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\callbacks_shared;
#using scripts\shared\visionset_mgr_shared;
#namespace drown;
function autoexec __init__sytem__() { system::register("drown",&__init__,undefined,undefined); }
function __init__()
{
callback::on_spawned( &on_player_spawned );
level.drown_damage = GetDvarFloat( "player_swimDamage" );
level.drown_damage_interval = GetDvarFloat( "player_swimDamagerInterval" ) * 1000;
level.drown_damage_after_time = GetDvarFloat( "player_swimTime" ) * 1000;
level.drown_pre_damage_stage_time = 2000;
if(!isdefined(level.vsmgr_prio_overlay_drown_blur))level.vsmgr_prio_overlay_drown_blur=10;
visionset_mgr::register_info( "overlay", "drown_blur", 1, level.vsmgr_prio_overlay_drown_blur, 1, true, &visionset_mgr::ramp_in_out_thread_per_player, true );
clientfield::register( "toplayer", "drown_stage", 1, 3, "int" );
}
function activate_player_health_visionset()
{
self deactivate_player_health_visionset();
if( !self.drown_vision_set )
{
visionset_mgr::activate( "overlay", "drown_blur", self, .1, .25, .1 );
self.drown_vision_set = true;
}
}
function deactivate_player_health_visionset()
{
if( !isDefined( self.drown_vision_set ) || self.drown_vision_set )
{
visionset_mgr::deactivate( "overlay", "drown_blur", self );
self.drown_vision_set = false;
}
}
function on_player_spawned()
{
self thread watch_player_drowning();
self thread watch_player_drown_death();
self thread watch_game_ended();
self deactivate_player_health_visionset();
}
function watch_player_drowning()
{
self endon ( "disconnect" );
self endon ( "death" );
level endon( "game_ended" );
self.lastWaterDamageTime = self getlastoutwatertime();
self.drownStage = 0;
self clientfield::set_to_player( "drown_stage", 0 );
if( !isdefined( self.drown_damage_after_time ) )
{
self.drown_damage_after_time = level.drown_damage_after_time;
}
if ( ( isdefined( self.noDrowning ) && self.noDrowning ) )
{
return;
}
while( 1 )
{
if( ( self isplayerunderwater() ) && ( self isplayerswimming() ) )
{
if( ( GetTime() - self.lastWaterDamageTime > self.drown_damage_after_time - level.drown_pre_damage_stage_time ) && ( self.drownStage == 0 ) )
{
self.drownStage++;
self clientfield::set_to_player( "drown_stage", self.drownStage );
}
if( GetTime() - self.lastWaterDamageTime > self.drown_damage_after_time )
{
self.lastWaterDamageTime += level.drown_damage_interval;
drownFlags = 4 | 2;
self dodamage( level.drown_damage, self.origin, undefined, undefined, undefined, "MOD_DROWN", drownFlags );
self activate_player_health_visionset();
if( self.drownStage < 4 )
{
self.drownStage++;
self clientfield::set_to_player( "drown_stage", self.drownStage );
}
}
}
else
{
self.drownStage = 0;
self clientfield::set_to_player( "drown_stage", 0 );
self.lastWaterDamageTime = self getlastoutwatertime();
self deactivate_player_health_visionset();
}
{wait(.05);};
}
}
function watch_player_drown_death()
{
self endon ( "disconnect" );
self endon ( "game_ended" );
self waittill ( "death" );
self.drownStage = 0;
self clientfield::set_to_player( "drown_stage", 0 );
self deactivate_player_health_visionset();
}
function watch_game_ended()
{
self endon ( "disconnect" );
self endon ( "death" );
level waittill( "game_ended" );
self.drownStage = 0;
self clientfield::set_to_player( "drown_stage", 0 );
self deactivate_player_health_visionset();
}
function is_player_drowning()
{
drowning = true;
if ( !isdefined( self.drownStage ) || self.drownStage == 0 )
{
drowning = false;
}
return drowning;
}