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

213 lines
11 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\callbacks_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\filter_shared;
#namespace explode;
function autoexec __init__sytem__() { system::register("explode",&__init__,undefined,undefined); }
function __init__()
{
level.dirt_enable_explosion = GetDvarInt( "scr_dirt_enable_explosion", 1 );
level.dirt_enable_slide = GetDvarInt( "scr_dirt_enable_slide", 1 );
level.dirt_enable_fall_damage = GetDvarInt( "scr_dirt_enable_fall_damage", 1 );
callback::on_localplayer_spawned( &localplayer_spawned );
/#
level thread updateDvars();
#/
}
/#
function updateDvars()
{
while(1)
{
level.dirt_enable_explosion = GetDvarInt( "scr_dirt_enable_explosion", level.dirt_enable_explosion );
level.dirt_enable_slide = GetDvarInt( "scr_dirt_enable_slide", level.dirt_enable_slide );
level.dirt_enable_fall_damage = GetDvarInt( "scr_dirt_enable_fall_damage", level.dirt_enable_fall_damage );
wait(1.0);
}
}
#/
function localplayer_spawned( localClientNum )
{
if( self != GetLocalPlayer( localClientNum ) )
return;
if ( level.dirt_enable_explosion || level.dirt_enable_slide || level.dirt_enable_fall_damage )
{
filter::init_filter_sprite_dirt( self );
filter::disable_filter_sprite_dirt( self, 5 );
if( level.dirt_enable_explosion )
{
self thread watchForExplosion( localClientNum );
}
if( level.dirt_enable_slide )
{
self thread watchForPlayerSlide( localClientNum );
}
if( level.dirt_enable_fall_damage )
{
self thread watchForPlayerFallDamage( localClientNum );
}
}
}
function watchForPlayerFallDamage( localClientNum )
{
self endon ( "entityshutdown" );
seed = 0;
xDir = 0.0;
yDir = 270.0;
while( 1 )
{
self waittill( "fall_damage" );
self thread doTheDirty( localclientnum, xDir, yDir, 1.0, 1000, 500 );
}
}
function watchForPlayerSlide( localClientNum )
{
self endon ( "entityshutdown" );
seed = 0;
self.wasPlayerSliding = false;
xDir = 0.0;
yDir = 6000.0;
while( 1 )
{
self.isPlayerSliding = self IsPlayerSliding();
if( self.isPlayerSliding )
{
if( !self.wasPlayerSliding )
{
self notify( "endTheDirty" );
seed = RandomFloatRange( 0.0, 1.0 );
}
filter::set_filter_sprite_dirt_opacity( self, 5, 1.0 );
filter::set_filter_sprite_dirt_seed_offset( self, 5, seed );
filter::enable_filter_sprite_dirt( self, 5 );
filter::set_filter_sprite_dirt_source_position( self, 5, xDir, yDir, 1.0 );
filter::set_filter_sprite_dirt_elapsed( self, 5, GetServerTime( localClientNum ) );
}
else if( self.wasPlayerSliding )
{
self thread doTheDirty( localclientnum, xDir, yDir, 1.0, 300, 300 );
}
self.wasPlayerSliding = self.isPlayerSliding;
{wait(.016);};
}
}
function doTheDirty( localClientNum, right, up, distance, dirtDuration, dirtFadeTime )
{
self endon( "entityshutdown" );
self notify( "doTheDirty" );
self endon( "doTheDirty" );
self endon( "endTheDirty" );
filter::enable_filter_sprite_dirt( self, 5 );
filter::set_filter_sprite_dirt_seed_offset( self, 5, RandomFloatRange( 0.0, 1.0 ) );
startTime = GetServerTime( localClientNum );
currentTime = startTime;
elapsedTime = 0;
while( elapsedTime < dirtDuration )
{
if( elapsedTime > dirtDuration - dirtFadeTime )
{
filter::set_filter_sprite_dirt_opacity( self, 5, ( ( dirtDuration - elapsedTime ) / dirtFadeTime ) );
}
else
{
filter::set_filter_sprite_dirt_opacity( self, 5, 1.0 );
}
filter::set_filter_sprite_dirt_source_position( self, 5, right, up, distance );
filter::set_filter_sprite_dirt_elapsed( self, 5, currentTime );
{wait(.016);};
currentTime = GetServerTime( localClientNum );
elapsedTime = currentTime - startTime;
}
filter::disable_filter_sprite_dirt( self, 5 );
}
function watchForExplosion( localClientNum )
{
self endon ( "entityshutdown" );
while ( true )
{
level waittill( "explode", localClientNum, position, mod, weapon, owner_cent );
explosionDistance = Distance( self.origin, position );
if ( ( ( mod == "MOD_GRENADE_SPLASH" ) || ( mod == "MOD_PROJECTILE_SPLASH" ) ) && ( explosionDistance < 600 ) && !GetInKillcam( localClientNum ) && !IsThirdPerson( localClientNum ) )
{
cameraAngles = self GetCamAngles();
if( !isDefined( cameraAngles ) )
continue;
forwardVec = VectorNormalize( AnglesToForward( cameraAngles ) );
upVec = VectorNormalize( AnglesToUp( cameraAngles ) );
rightVec = VectorNormalize( AnglesToRight( cameraAngles ) );
explosionVec = VectorNormalize( position - (self GetCamPos() ) );
if( VectorDot( forwardVec, explosionVec ) > 0 )
{
trace = bulletTrace( GetLocalClientEyePos( localClientNum ), position, false, self );
if ( trace["fraction"] >= .9 )
{
uDot = -1.0 * VectorDot( explosionVec, upVec );
rDot = VectorDot( explosionVec, rightVec );
uDotAbs = abs( uDot );
rDotAbs = abs( rDot );
if( udotabs > rdotabs )
{
if( udot > 0 )
{
uDot = 1.0;
}
else
{
uDot = -1.0;
}
}
else
{
if( rDot > 0 )
{
rDot = 1.0;
}
else
{
rDot = -1.0;
}
}
self thread doTheDirty( localClientNum, rDot, uDot, ( 1.0 - explosionDistance / 600 ), 2000, 500 );
}
}
}
}
}