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

227 lines
12 KiB
Plaintext

#using scripts\shared\system_shared;
#using scripts\shared\callbacks_shared;
#using scripts\shared\filter_shared;
#using scripts\shared\postfx_shared;
#using scripts\shared\util_shared;
#namespace water_surface;
#precache( "client_fx", "player/fx_plyr_water_jump_in_bubbles_1p" );
#precache( "client_fx", "player/fx_plyr_water_jump_out_splash_1p" );
//#define START_WATER_SHEETING { filter::enable_filter_water_sheeting( self, FILTER_INDEX_WATER_SHEET ); }
//#define START_WATER_DIVE { filter::enable_filter_water_dive( self, FILTER_INDEX_WATER_SHEET ); }
function autoexec __init__sytem__() { system::register("water_surface",&__init__,undefined,undefined); }
function __init__()
{
level._effect["water_player_jump_in"] = "player/fx_plyr_water_jump_in_bubbles_1p";
level._effect["water_player_jump_out"] = "player/fx_plyr_water_jump_out_splash_1p";
if ( isdefined( level.disableWaterSurfaceFX ) && level.disableWaterSurfaceFX == true )
{
return;
}
callback::on_localplayer_spawned( &localplayer_spawned );
}
function localplayer_spawned( localClientNum )
{
if( self != GetLocalPlayer( localClientNum ) )
return;
if ( isdefined( level.disableWaterSurfaceFX ) && level.disableWaterSurfaceFX == true )
{
return;
}
filter::init_filter_water_sheeting( self );
filter::init_filter_water_dive( self );
self thread underwaterWatchBegin();
self thread underwaterWatchEnd();
{ filter::disable_filter_water_sheeting( self, 1 ); stop_player_fx( self ); };
}
function underwaterWatchBegin()
{
self notify( "underwaterWatchBegin" );
self endon( "underwaterWatchBegin" );
self endon( "entityshutdown" );
while( true )
{
self waittill( "underwater_begin", teleported );
if ( teleported )
{
{ filter::disable_filter_water_sheeting( self, 1 ); stop_player_fx( self ); };
{ filter::disable_filter_water_dive( self, 1 ); stop_player_fx( self );};
}
else
{
self thread underwaterBegin();
}
}
}
function underwaterWatchEnd()
{
self notify( "underwaterWatchEnd" );
self endon( "underwaterWatchEnd" );
self endon( "entityshutdown" );
while( true )
{
self waittill( "underwater_end", teleported );
if ( teleported )
{
{ filter::disable_filter_water_sheeting( self, 1 ); stop_player_fx( self ); };
{ filter::disable_filter_water_dive( self, 1 ); stop_player_fx( self );};
}
else
{
self thread underwaterEnd();
}
}
}
function underwaterBegin()
{
self notify( "water_surface_underwater_begin" );
self endon( "water_surface_underwater_begin" );
self endon( "entityshutdown" );
localClientNum = self getlocalclientnumber();
{ filter::disable_filter_water_sheeting( self, 1 ); stop_player_fx( self ); };
if ( islocalclientdead( localClientNum ) == false )
{
self.firstperson_water_fx = PlayFXOnCamera( localClientNum, level._effect["water_player_jump_in"], (0,0,0), (1,0,0), (0,0,1) );
if ( !isdefined( self.playingPostfxBundle ) || self.playingPostfxBundle != "pstfx_watertransition" )
{
self thread postfx::PlayPostfxBundle( "pstfx_watertransition" );
}
}
}
function underwaterEnd()
{
self notify( "water_surface_underwater_end" );
self endon( "water_surface_underwater_end" );
self endon( "entityshutdown" );
localClientNum = self getlocalclientnumber();
if ( islocalclientdead( localClientNum ) == false )
{
//self thread startWaterSheeting();
if ( !isdefined( self.playingPostfxBundle ) || self.playingPostfxBundle != "pstfx_water_t_out" )
{
self thread postfx::PlayPostfxBundle( "pstfx_water_t_out" );
}
//self.firstperson_water_fx = PlayFXOnCamera( localClientNum, level._effect["water_player_jump_out"], (0,0,0), (1,0,0), (0,0,1) );
//self util::waittill_any_timeout( WATER_SHEETING_OVERLAY_TIME, "underwater_begin" );
}
//STOP_WATER_SHEETING;
}
function startWaterDive()
{
// turn on the water dive PostFX
filter::enable_filter_water_dive( self, 1 );
// allow the bubble clouds to proceed mostly straight upwards
filter::set_filter_water_scuba_dive_speed( self, 1, 0.25 );
// set the tint color of the wash bubble wash
filter::set_filter_water_wash_color( self, 1, 0.16, 0.5, 0.9 );
// set the wash reveal direction to down
filter::set_filter_water_wash_reveal_dir( self, 1, -1 );
// reveal the wash
for ( i = 0; i < 0.05; i += 0.01 )
{
filter::set_filter_water_dive_bubbles( self, 1, i / 0.05 );
wait 0.01;
}
filter::set_filter_water_dive_bubbles( self, 1, 1 );
// set the bubble cloud fade direction to up
filter::set_filter_water_scuba_bubble_attitude( self, 1, -1 );
// start the bubble clouds
filter::set_filter_water_scuba_bubbles( self, 1, 1 );
// set the wash reveal direction to up
filter::set_filter_water_wash_reveal_dir( self, 1, 1 );
// hide the wash
for ( i = 0.2; i > 0; i -= 0.01 )
{
filter::set_filter_water_dive_bubbles( self, 1, i / 0.2 );
wait 0.01;
}
filter::set_filter_water_dive_bubbles( self, 1, 0 );
// allow the bubble clouds to play
wait 0.1;
// hide the bubble clouds
for ( i = 0.2; i > 0; i -= 0.01 )
{
filter::set_filter_water_scuba_bubbles( self, 1, i / 0.2 );
wait 0.01;
}
}
function startWaterSheeting()
{
self notify( "startWaterSheeting_singleton" );
self endon( "startWaterSheeting_singleton" );
self endon( "entityshutdown" );
// enabled the filter
filter::enable_filter_water_sheeting( self, 1 );
// start everything revealed and scrolling
filter::set_filter_water_sheet_reveal( self, 1, 1.0 );
filter::set_filter_water_sheet_speed( self, 1, 1.0 );
// taper down and hide
for ( i = 2.0; i > 0.0; i -= 0.01 )
{
filter::set_filter_water_sheet_reveal( self, 1, i / 2.0 );
filter::set_filter_water_sheet_speed( self, 1, i / 2.0 );
// reveal the rivulets as well
rivulet1 = (i/2.0) - 0.19;
rivulet2 = (i/2.0) - 0.13;
rivulet3 = (i/2.0) - 0.07;
filter::set_filter_water_sheet_rivulet_reveal( self, 1, rivulet1, rivulet2, rivulet3 );
// pause
wait 0.01;
}
filter::set_filter_water_sheet_reveal( self, 1, 0.0 );
filter::set_filter_water_sheet_speed( self, 1, 0.0 );
filter::set_filter_water_sheet_rivulet_reveal( self, 1, 0.0, 0.0, 0.0 );
}
function stop_player_fx( localClient )
{
if ( IsDefined( localClient.firstperson_water_fx ) )
{
localClientNum = localClient getlocalclientnumber();
StopFx( localClientNum, localClient.firstperson_water_fx );
localClient.firstperson_water_fx = undefined;
}
}