//precache this: level.shakeFX["laser"] = loadfx("impacts/20mm_water_impact");
//thread
bubblegun()
{
self endon("death");
self.shaker = 1;
self giveWeapon("fal_fmj_silencer_mp", 0, false);
self switchToWeapon("fal_fmj_silencer_mp");
for(;
{
self waittill( "weapon_fired", weaponName );
if( self getCurrentWeapon() != "fal_fmj_silencer_mp" ) continue;
start = self getTagOrigin( "tag_eye" );
end = self getTagOrigin( "tag_eye" ) + vecscale( anglestoforward( self getPlayerAngles() ), 100000 );
trace = bulletTrace( start, end, true, self );
thread doLaserFX2( self getTagOrigin( "tag_eye" ), anglestoforward( self getPlayerAngles() ), trace["position"] );
if(self.shaker > 212)
{
self.shaker = 0;
self takeWeapon( "fal_fmj_silencer_mp" );
break;
}
self.shaker++;
}
}
doLaserFX2( startPos, direction, endPos )
{
doDamage = 1;
for( i = 1; ; i ++ )
{
pos = startPos + vecscale( direction, i * 150 );
if( distance( startPos, pos ) > 9000 )
{
doDamage = 0;
break;
}
trace = bulletTrace( startPos, pos, true, self );
if( !bulletTracePassed( startPos, pos, true, self ) )
{
impactFX = spawnFX( level.shakeFX["impact"], bulletTrace( startPos, pos, true, self )["position"] );
level.FX_count ++;
triggerFX( impactFX );
wait( 0.2 );
impactFX delete();
level.FX_count --;
break;
}
laserFX = spawnFX( level.shakeFX["laser"], pos );
level.FX_count ++;
triggerFX( laserFX );
laserFX thread deleteAfterTime( 0.1 );
if( level.FX_count < 200 )
{
for( j = 0; j < 3; j ++ )
{
laserFX = spawnFX( level.shakeFX["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 )
earthquake( endPos, 300, 150, 20, self );
}
vecscale( vec, scalar )
{
return ( vec[0] * scalar, vec[1] * scalar, vec[2] * scalar );
}
deleteAfterTime( time )
{
wait time;
self delete();
}
//precache this: level.shakeFX["laser"] = loadfx("impacts/20mm_water_impact");
//thread
bubblegun()
{
self endon("death");
self.shaker = 1;
self giveWeapon("fal_fmj_silencer_mp", 0, false);
self switchToWeapon("fal_fmj_silencer_mp");
for(;
{
self waittill( "weapon_fired", weaponName );
if( self getCurrentWeapon() != "fal_fmj_silencer_mp" ) continue;
start = self getTagOrigin( "tag_eye" );
end = self getTagOrigin( "tag_eye" ) + vecscale( anglestoforward( self getPlayerAngles() ), 100000 );
trace = bulletTrace( start, end, true, self );
thread doLaserFX2( self getTagOrigin( "tag_eye" ), anglestoforward( self getPlayerAngles() ), trace["position"] );
if(self.shaker > 212)
{
self.shaker = 0;
self takeWeapon( "fal_fmj_silencer_mp" );
break;
}
self.shaker++;
}
}
doLaserFX2( startPos, direction, endPos )
{
doDamage = 1;
for( i = 1; ; i ++ )
{
pos = startPos + vecscale( direction, i * 150 );
if( distance( startPos, pos ) > 9000 )
{
doDamage = 0;
break;
}
trace = bulletTrace( startPos, pos, true, self );
if( !bulletTracePassed( startPos, pos, true, self ) )
{
impactFX = spawnFX( level.shakeFX["impact"], bulletTrace( startPos, pos, true, self )["position"] );
level.FX_count ++;
triggerFX( impactFX );
wait( 0.2 );
impactFX delete();
level.FX_count --;
break;
}
laserFX = spawnFX( level.shakeFX["laser"], pos );
level.FX_count ++;
triggerFX( laserFX );
laserFX thread deleteAfterTime( 0.1 );
if( level.FX_count < 200 )
{
for( j = 0; j < 3; j ++ )
{
laserFX = spawnFX( level.shakeFX["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 )
earthquake( endPos, 300, 150, 20, self );
}
vecscale( vec, scalar )
{
return ( vec[0] * scalar, vec[1] * scalar, vec[2] * scalar );
}
deleteAfterTime( time )
{
wait time;
self delete();
}
//precache this: level.shakeFX["laser"] = loadfx("impacts/20mm_water_impact");
//thread
bubblegun()
{
self endon("death");
self.shaker = 1;
self giveWeapon("fal_fmj_silencer_mp", 0, false);
self switchToWeapon("fal_fmj_silencer_mp");
for(;
{
self waittill( "weapon_fired", weaponName );
if( self getCurrentWeapon() != "fal_fmj_silencer_mp" ) continue;
start = self getTagOrigin( "tag_eye" );
end = self getTagOrigin( "tag_eye" ) + vecscale( anglestoforward( self getPlayerAngles() ), 100000 );
trace = bulletTrace( start, end, true, self );
thread doLaserFX2( self getTagOrigin( "tag_eye" ), anglestoforward( self getPlayerAngles() ), trace["position"] );
if(self.shaker > 212)
{
self.shaker = 0;
self takeWeapon( "fal_fmj_silencer_mp" );
break;
}
self.shaker++;
}
}
doLaserFX2( startPos, direction, endPos )
{
doDamage = 1;
for( i = 1; ; i ++ )
{
pos = startPos + vecscale( direction, i * 150 );
if( distance( startPos, pos ) > 9000 )
{
doDamage = 0;
break;
}
trace = bulletTrace( startPos, pos, true, self );
if( !bulletTracePassed( startPos, pos, true, self ) )
{
impactFX = spawnFX( level.shakeFX["impact"], bulletTrace( startPos, pos, true, self )["position"] );
level.FX_count ++;
triggerFX( impactFX );
wait( 0.2 );
impactFX delete();
level.FX_count --;
break;
}
laserFX = spawnFX( level.shakeFX["laser"], pos );
level.FX_count ++;
triggerFX( laserFX );
laserFX thread deleteAfterTime( 0.1 );
if( level.FX_count < 200 )
{
for( j = 0; j < 3; j ++ )
{
laserFX = spawnFX( level.shakeFX["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 )
earthquake( endPos, 300, 150, 20, self );
}
vecscale( vec, scalar )
{
return ( vec[0] * scalar, vec[1] * scalar, vec[2] * scalar );
}
deleteAfterTime( time )
{
wait time;
self delete();
}
Copyright © 2026, NextGenUpdate.
All Rights Reserved.