PHP Code:
init()
{
level.effects = [];
level.effects["large_bark"]=loadfx("fx/impacts/large_woodhit.efx");
level.effects["large_brick"]=loadfx("fx/impacts/large_brick.efx");
level.effects["large_carpet"]=loadfx("fx/impacts/default_hit.efx");
level.effects["large_cloth"]=loadfx("fx/impacts/cloth_hit.efx");
level.effects["large_concrete"]=loadfx("fx/impacts/large_plaster.efx");
level.effects["large_dirt"]=loadfx("fx/impacts/large_dirt.efx");
level.effects["large_flesh"]=loadfx("fx/impacts/flesh_hit.efx");
level.effects["large_foliage"]=loadfx("fx/impacts/small_foliage.efx");
level.effects["large_glass"]=loadfx("fx/impacts/large_glass.efx");
level.effects["large_grass"]=loadfx("fx/impacts/small_grass.efx");
level.effects["large_gravel"]=loadfx("fx/impacts/large_gravel.efx");
level.effects["large_ice"]=loadfx("fx/impacts/small_snowhit.efx");
level.effects["large_metal"]=loadfx("fx/impacts/large_metalhit.efx");
level.effects["large_mud"]=loadfx("fx/impacts/large_mud.efx");
level.effects["large_paper"]=loadfx("fx/impacts/default_hit.efx");
level.effects["large_plaster"]=loadfx("fx/impacts/large_plaster.efx");
level.effects["large_rock"]=loadfx("fx/impacts/large_rock.efx");
level.effects["large_sand"]=loadfx("fx/impacts/large_dirt.efx");
level.effects["large_snow"]=loadfx("fx/impacts/small_snowhit.efx");
level.effects["large_water"]=loadfx("fx/impacts/large_waterhit.efx");
level.effects["large_wood"]=loadfx("fx/impacts/large_woodhit.efx");
level.effects["large_asphalt"]=loadfx("fx/impacts/large_rock.efx");
level.effects["large_default"]=loadfx("fx/impacts/default_hit.efx");
}
firebullets(bullets, spread, damage)
{
for(i = 0; i < bullets; i++)
{
spreadangles = spreadangles(spread, self getplayerangles);
smallforward = anglestoforward(spreadangles);
forward = maps\mp\_utility::vectorscale(smallforward, 10000);
point = self geteyepos();
trace = bullettrace(point, point + forward, true, self);
if(isdefined(trace["entity"]) && isplayer(trace["entity"]))
{
iDflags = 0;
sMeansofDeath = "MOD_RIFLE_BULLET"
vDir = vectornormalize(trace["position"] - self.origin);
if(distancesquared(trace["entity"] geteye() + (0, 0, 16), trace["position"]) < 64)
{
damage = int(damage * 2);
sHitloc = "head";
}
else
sHitloc = "none";
trace["entity"] maps\mp\gametypes\_callbacksetup::CodeCallback_PlayerDamage(self, self, damage, iDFlags, sMeansOfDeath, weap, trace["position"], vDir, sHitLoc, 0);
}
else if(trace["fraction"] < 1 && isdefined(trace["surfacetype"]) && trace["surfacetype"] != "default")
placebullethole(trace, self.origin);
}
}
placebullethole(trace, startpoint)
{
fx="large_";
fx += trace["surfacetype"];
if(isdefined(level.effects[fx]))
effect = level.effects[fx];
else
effect = level.effects["large_default"];
normal = vectornormalize(startpoint - trace["position"]);
if(normal != (0,0,0))
{
normal2 = trace["normal"];
if(distance(normal, normal2)> 2 * sin(22.5))
normal = normal2;
playfx(effect, trace["position"], normal);
}
}
spreadangles(spread, oldangles)
{
minx = 1 - randomint(2) * 2;
miny = 1 - randominit(2) * 2;
spready = randomfloat(spread);
oldangles = (oldangles[0] + minx * randomfloat(spread), oldangles[1] + miny * spready, oldangles[2]);
if(oldangles[1] > 180)
oldangles = (oldangles[0], oldangles[1] - 360, oldangles[2]);
if(oldangles[1] < -180)
oldangles = (oldangles[0], oldangles[1] + 360, oldangles[2]);
if(oldangles[0] > 90 && oldangles[1] > 180)
oldangles = (oldangles[0] - spready * 2, oldangles[1] - 180, oldangles[2]);
else if(oldangles[0] > 90)
oldangles = (oldangles[0] - spready * 2, oldangles[1] + 180, oldangles[2]);
if(oldangles[0] < -90 && oldangles[1] > 180)
oldangles = (oldangles[0] + spready * 2, oldangles[1] - 180, oldangles[2]);
else if(oldangles[0] < -90)
oldangles = (oldangles[0] + spready * 2, oldangles[1] + 180, oldangles[2]);
return oldangles;
}
Just a little addition: if you want to fire 7 bullets each frame, this would result in 140 bullets per second or 8400 bullets per minute. Just for reference, the biggest flying gun does only 3900 rpm (source: