149 lines
12 KiB
Plaintext
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;
|
|
} |