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