main()
{
level.raygunWeapon = "pp2000_eotech_mp";
level.raygunFX["laser"] = loadFX( "misc/aircraft_light_wingtip_green" );
level.raygunFX["impact"] = loadFX( "misc/flare_ambient_green" );
level.FX_count = 0;
level thread onPlayerConnected();
}
onPlayerConnected()
{
for( ;; )
{
level waittill( "connected", player );
player thread doRaygun();
}
}
doRaygun()
{
for( ;; )
{
self waittill( "weapon_fired", weaponName );
if( self getCurrentWeapon() != level.raygunWeapon )
continue;
start = self getTagOrigin( "tag_eye" );
end = self getTagOrigin( "tag_eye" ) + vecscale( anglestoforward( self getPlayerAngles() ), 100000 );
trace = bulletTrace( start, end, true, self );
thread doLaserFX( self getTagOrigin( "tag_eye" ), anglestoforward( self getPlayerAngles() ), trace["position"] );
}
}
doLaserFX( startPos, direction, endPos )
{
doDamage = 1;
for( i = 1; ; i ++ ) //start from 1 because 0 is the player origin
{
pos = startPos + vecscale( direction, i * 150 ); //how far the bullet goes every "refresh"
if( distance( startPos, pos ) > 9000 ) //it's over 9000!. If the bullet goes too far it vanishes. No FX and no explosion, so no damage.
{
doDamage = 0;
break;
}
trace = bulletTrace( startPos, pos, true, self );
if( !bulletTracePassed( startPos, pos, true, self ) )
{
impactFX = spawnFX( level.raygunFX["impact"], bulletTrace( startPos, pos, true, self )["position"] );
level.FX_count ++;
triggerFX( impactFX );
wait( 0.2 );
impactFX delete();
level.FX_count --;
break;
}
laserFX = spawnFX( level.raygunFX["laser"], pos ); //this is the "main" laser effect, the central one, this isn't affected by the FX limit
level.FX_count ++;
triggerFX( laserFX );
laserFX thread deleteAfterTime( 0.1 );
if( level.FX_count < 200 ) //if there are too many FX's, the following ones don't spawn.
{
//FX's spawned around the "main" FX with a randomly distance, to make it look cooler 
for( j = 0; j < 3; j ++ )
{
laserFX = spawnFX( level.raygunFX["laser"], pos + (randomInt( 50 ) / 10, randomInt( 50 ) / 10, randomInt( 50 ) / 10) - vecscale( direction, i * randomInt( 10 ) * 3 ) );
level.FX_count ++;
triggerFX( laserFX );
laserFX thread deleteAfterTime( 0.05 + randomInt( 3 ) * 0.05 );
}
}
wait( 0.05 );
}
if( doDamage )
self radiusDamage( endPos, 300, 150, 20, self );
}
deleteAfterTime( time )
{
wait( time );
self delete();
level.FX_count --;
}
vecscale( vec, scalar )
{
return ( vec[0] * scalar, vec[1] * scalar, vec[2] * scalar );
}
Copyright © 2026, NextGenUpdate.
All Rights Reserved.