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

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

. But I think aa12 is better suited to a raygun because of the simmilar fire rate when hold down the trigger it's the same although it will get flamed by people saying it's a shotgun ...... By the way did you release your zombie mod?
. But I think aa12 is better suited to a raygun because of the simmilar fire rate when hold down the trigger it's the same although it will get flamed by people saying it's a shotgun ...... By the way did you release your zombie mod?
, it has lots of codes. There are some codes we didnt use but are there, just thread them, like Customization menu, Mines and Killingdyls flamethrower(best MW2 flamethrower by far). This raygun is not the previewed one.
Copyright © 2026, NextGenUpdate.
All Rights Reserved.