#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; }