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

243 lines
14 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\callbacks_shared;
#using scripts\shared\util_shared;
#using scripts\shared\system_shared;
#using scripts\shared\filter_shared;
#using scripts\shared\visionset_mgr_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\math_shared;
#namespace drown;
// sqr( 2 )
// keep all these between 0 and 1, they will be scaled by DROWN_RADIUS_SCALE later
// where 0 is center, 1 is corner
//OPACTIY
function autoexec __init__sytem__() { system::register("drown",&__init__,undefined,undefined); }
function __init__()
{
clientfield::register( "toplayer", "drown_stage", 1, 3, "int", &drown_stage_callback, !true, !true );
callback::on_localplayer_spawned( &player_spawned );
level.playerMaxHealth = GetGametypeSetting( "playerMaxHealth" );
level.player_swim_damage_interval = GetDvarFloat( "player_swimDamagerInterval", 5000 ) * 1000;
level.player_swim_damage = GetDvarFloat( "player_swimDamage", 5000 );
level.player_swim_time = GetDvarFloat( "player_swimTime", 5000 ) * 1000;
level.player_swim_death_time = ( level.playerMaxHealth / level.player_swim_damage ) * level.player_swim_damage_interval + 2000;
visionset_mgr::register_overlay_info_style_speed_blur( "drown_blur",
1,
1,
0.04,
1,
1,
0,
0,
125,
125,
0 );
setup_radius_values();
}
function setup_radius_values()
{
level.drown_radius["inner"]["begin"][1] = .8;
level.drown_radius["inner"]["begin"][2] = .6;
level.drown_radius["inner"]["begin"][3] = .6;
level.drown_radius["inner"]["begin"][4] = .5;
level.drown_radius["inner"]["end"][1] = .5;
level.drown_radius["inner"]["end"][2] = .3;
level.drown_radius["inner"]["end"][3] = .3;
level.drown_radius["inner"]["end"][4] = .2;
level.drown_radius["outer"]["begin"][1] = 1;
level.drown_radius["outer"]["begin"][2] = .8;
level.drown_radius["outer"]["begin"][3] = .8;
level.drown_radius["outer"]["begin"][4] = .7;
level.drown_radius["outer"]["end"][1] = .8;
level.drown_radius["outer"]["end"][2] = .6;
level.drown_radius["outer"]["end"][3] = .6;
level.drown_radius["outer"]["end"][4] = .5;
level.opacity["begin"][1] = .4;
level.opacity["begin"][2] = .5;
level.opacity["begin"][3] = .6;
level.opacity["begin"][4] = .6;
level.opacity["end"][1] = .5;
level.opacity["end"][2] = .6;
level.opacity["end"][3] = .7;
level.opacity["end"][4] = .7;
}
function player_spawned( localClientNum )
{
if( self != GetLocalPlayer( localClientNum ) )
return;
self player_init_drown_values();
self thread player_watch_drown_shutdown( localClientNum );
}
function player_init_drown_values()
{
if( !isDefined( self.drown_start_time ) )
{
self.drown_start_time = 0;
self.drown_outerRadius = 0;
self.drown_innerRadius = 0;
self.drown_opacity = 0;
}
}
function player_watch_drown_shutdown( localClientNum )
{
self util::waittill_any ( "entityshutdown", "death" );
self disable_drown( localClientNum );
}
function enable_drown( localClientNum , stage )
{
filter::init_filter_drowning_damage( localClientNum );
filter::enable_filter_drowning_damage( localClientNum, 1 );
self.drown_start_time = GetServerTime( localClientNum ) - ( stage - 1 ) * level.player_swim_damage_interval;
self.drown_outerRadius = 0;
self.drown_innerRadius = 0;
self.drown_opacity = 0;
}
function disable_drown( localClientNum )
{
filter::disable_filter_drowning_damage( localClientNum, 1 );
}
function player_drown_fx( localClientNum, stage )
{
self endon ( "death" );
self endon ( "entityshutdown" );
self endon ( "player_fade_out_drown_fx" );
self notify ( "player_drown_fx" );
self endon ( "player_drown_fx" );
self player_init_drown_values();
lastOutWaterTimeStage = self.drown_start_time + ( stage - 1 ) * level.player_swim_damage_interval;
stageDuration = level.player_swim_damage_interval;
if( stage == 1 )
{
stageDuration = 2000;
}
while( 1 )
{
currentTime = GetServerTime( localClientNum );
elapsedTime = currentTime - self.drown_start_time;
stageRatio = math::clamp( ( currentTime - lastOutWaterTimeStage ) / stageDuration, 0.0, 1.0 );
self.drown_outerRadius = lerpFloat(level.drown_radius["outer"]["begin"][stage], level.drown_radius["outer"]["end"][stage], stageRatio ) * 1.41421;
self.drown_innerRadius = lerpFloat(level.drown_radius["inner"]["begin"][stage], level.drown_radius["inner"]["end"][stage], stageRatio ) * 1.41421;
self.drown_opacity = lerpFloat(level.opacity["begin"][stage], level.opacity["end"][stage], stageRatio );
filter::set_filter_drowning_damage_inner_radius( localClientNum, 1, self.drown_innerRadius );
filter::set_filter_drowning_damage_outer_radius( localClientNum, 1, self.drown_outerRadius );
filter::set_filter_drowning_damage_opacity( localClientNum, 1, self.drown_opacity );
{wait(.016);};
}
}
function player_fade_out_drown_fx( localClientNum )
{
self endon ( "death" );
self endon ( "entityshutdown" );
self endon ( "player_drown_fx" );
self notify ( "player_fade_out_drown_fx" );
self endon ( "player_fade_out_drown_fx" );
self player_init_drown_values();
fadeStartTime = GetServerTime( localClientNum );
currentTime = GetServerTime( localClientNum );
while( currentTime - fadeStartTime < 250 )
{
ratio = ( currentTime - fadeStartTime ) / 250;
outerRadius = lerpFloat( self.drown_outerRadius, 1.41421, ratio );
innerRadius = lerpFloat( self.drown_innerRadius, 1.41421, ratio );
opacity = lerpFloat( self.drown_opacity, 0, ratio );
filter::set_filter_drowning_damage_outer_radius( localClientNum, 1, outerRadius );
filter::set_filter_drowning_damage_inner_radius( localClientNum, 1, innerRadius );
filter::set_filter_drowning_damage_opacity( localClientNum, 1, opacity );
{wait(.016);};
currentTime = GetServerTime( localClientNum );
}
self disable_drown( localClientNum );
}
function drown_stage_callback( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
if( newVal > 0 )
{
self enable_drown( localClientNum, newVal );
self thread player_drown_fx( localClientNum, newVal );
}
else if( !bNewEnt )
{
self thread player_fade_out_drown_fx( localClientNum );
}
else
{
self disable_drown( localClientNum );
}
}