Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function Create(self)
- -- Initialize variables and timers
- self.smgbodylist = {};
- self.smgbarrellist = {};
- self.smgmaglist = {};
- self.smgbulletlist = {};
- self.smgsoundlist = {};
- self.smgsoundlist["fire"] = {};
- self.smgsoundlist["reload"] = {};
- self.smgmuzzlelist = {};
- self.projectileteam = -1;
- self.allmodulesfound = false;
- self.ammocounter = 0;
- self.reloading = false;
- self.Body = {};
- self.Mag = {};
- self.Barrel = {};
- self.Bullet = {};
- self.FireSound = nil;
- self.ReloadSound = nil;
- self.MuzzleFlash = nil;
- self.firingtimer = Timer();
- -- Initial stats
- -- Basic stats
- self.rateoffire = 700;
- self.ammocapacity = 20;
- self.accuracy = 25;
- -- Initial modifiers
- self.rofmod = 0.8 + math.random()*0.4;
- self.magmod = 0.8 + math.random()*0.4;
- self.accmod = 0.8 + math.random()*0.4;
- self.firevelmod = 0.8 + math.random()*0.4;
- self.massmod = 0.8 + math.random()*0.4;
- self.sharpnessmod = 0.8 + math.random()*0.4;
- -- Load body modules
- dofile("Brolands.rte/smg/bodymodules.lua");
- BrolandsBodies(self);
- -- Load barrel modules
- dofile("Brolands.rte/smg/barrelmodules.lua");
- BrolandsBarrels(self);
- -- Load magazines modules
- dofile("Brolands.rte/smg/magazinemodules.lua");
- BrolandsMagazines(self);
- -- Load bullets
- dofile("Brolands.rte/smg/bulletmodules.lua");
- BrolandsBullets(self);
- -- Load muzzleflashes
- dofile("Brolands.rte/smg/muzzleflashmodules.lua");
- BrolandsMuzzleflashes(self);
- -- Load sounds
- dofile("Brolands.rte/smg/soundmodules.lua");
- BrolandsSounds(self);
- end
- function Update(self)
- -- Generate gun
- if self.allmodulesfound ~= true then
- -- Find the attachments
- for i=1,MovableMan:GetMOIDCount()-1 do
- local mo = MovableMan:GetMOFromID(i);
- if mo.PresetName == "SmgBody" and mo.RootID == self.RootID then
- self.Body["pointer"] = ToAttachable(mo);
- self.Body["pointer"].GetsHitByMOs = false;
- elseif mo.PresetName == "SmgMag" and mo.RootID == self.RootID then
- self.Mag["pointer"] = ToAttachable(mo);
- self.Mag["pointer"].GetsHitByMOs = false;
- elseif mo.PresetName == "SmgBarrel" and mo.RootID == self.RootID then
- self.Barrel["pointer"] = ToAttachable(mo);
- self.Barrel["pointer"].GetsHitByMOs = false;
- end
- if self.Body["pointer"] and self.Mag["pointer"] and self.Barrel["pointer"] then
- self.allmodulesfound = true;
- break;
- end
- end
- -- Body
- for k,v in pairs(self.smgbodylist[math.random(1,#self.smgbodylist)]) do self.Body[k] = v end
- -- for k,v in pairs(self.smgbodylist[15]) do self.Body[k] = v end
- self.Body["pointer"].Frame = self.Body["sprite"];
- -- Modify stat modifier with module modifier
- self.rofmod = self.rofmod * self.Body["rofmod"];
- self.magmod = self.magmod * self.Body["magmod"];
- self.accmod = self.accmod * self.Body["accmod"];
- self.firevelmod = self.firevelmod * self.Body["firevelmod"];
- self.massmod = self.massmod * self.Body["massmod"];
- self.sharpnessmod = self.sharpnessmod * self.Body["sharpnessmod"];
- -- Mag
- for k,v in pairs(self.smgmaglist[math.random(1,#self.smgmaglist)]) do self.Mag[k] = v end
- -- for k,v in pairs(self.smgmaglist[16]) do self.Mag[k] = v end
- self.Mag["pointer"].Frame = self.Mag["sprite"];
- self.Mag["offset"] = self.Body["magoffset"];
- -- Modify stat modifier with module modifier
- self.rofmod = self.rofmod * self.Mag["rofmod"];
- self.magmod = self.magmod * self.Mag["magmod"];
- self.accmod = self.accmod * self.Mag["accmod"];
- self.firevelmod = self.firevelmod * self.Mag["firevelmod"];
- self.massmod = self.massmod * self.Mag["massmod"];
- self.sharpnessmod = self.sharpnessmod * self.Mag["sharpnessmod"];
- -- Barrel
- for k,v in pairs(self.smgbarrellist[math.random(1,#self.smgbarrellist)]) do self.Barrel[k] = v end
- -- for k,v in pairs(self.smgbarrellist[18]) do self.Barrel[k] = v end
- self.Barrel["pointer"].Frame = self.Barrel["sprite"];
- self.Barrel["offset"] = self.Body["barreloffset"];
- -- Modify gun stat modifier with module modifier
- self.rofmod = self.rofmod * self.Barrel["rofmod"];
- self.magmod = self.magmod * self.Barrel["magmod"];
- self.accmod = self.accmod * self.Barrel["accmod"];
- self.firevelmod = self.firevelmod * self.Barrel["firevelmod"];
- self.massmod = self.massmod * self.Barrel["massmod"];
- self.sharpnessmod = self.sharpnessmod * self.Barrel["sharpnessmod"];
- -- Bullet
- for k,v in pairs(self.smgbulletlist[math.random(1,#self.smgbulletlist)]) do self.Bullet[k] = v end
- -- for k,v in pairs(self.smgbulletlist[3]) do self.Bullet[k] = v end
- -- Modify gun stat modifier with module modifier
- self.rofmod = self.rofmod * self.Bullet["rofmod"];
- self.magmod = self.magmod * self.Bullet["magmod"];
- self.accmod = self.accmod * self.Bullet["accmod"];
- self.firevelmod = self.firevelmod * self.Bullet["firevelmod"];
- self.massmod = self.massmod * self.Bullet["massmod"];
- self.sharpnessmod = self.sharpnessmod * self.Bullet["sharpnessmod"];
- -- Fire sound
- self.FireSound = self.smgsoundlist["fire"][self.Bullet["firesounds"][math.random(1,#self.Bullet["firesounds"])]];
- -- Reload sound
- self.ReloadSound = self.smgsoundlist["reload"][self.Mag["reloadsounds"][math.random(1,#self.Mag["reloadsounds"])]];
- -- Muzzle flash
- self.MuzzleFlash = self.smgmuzzlelist[self.Bullet["muzzleflash"][math.random(1,#self.Bullet["muzzleflash"])]];
- -- Done generating gun, apply gun stat modifiers
- self.rateoffire = Round(self.rateoffire * self.rofmod);
- self.ammocapacity = Round(self.ammocapacity * self.magmod);
- -- You can't be more precise than 100%
- if self.accuracy > 100 then
- self.accuracy = 100;
- else
- self.accuracy = Round(self.accuracy * self.accmod);
- end
- self.Bullet["firevel"] = Round(self.Bullet["firevel"] * self.firevelmod);
- self.Bullet["mass"] = self.Bullet["mass"] * self.massmod;
- self.Bullet["sharpness"] = Round(self.Bullet["sharpness"] * self.sharpnessmod);
- -- Output gun stats to console
- -- print("\nRate of fire: "..self.rateoffire.." Rounds Per Minute\nMagazine capacity: "..self.ammocapacity.." Rounds\nAccuracy: "..self.accuracy.."%\nProjectile type: "..self.Bullet["particle"].."\nProjectile mass: "..self.Bullet["mass"].."\nProjectile speed: "..self.Bullet["firevel"].."\nProjectile sharpness: "..self.Bullet["sharpness"].."\n");
- self.ammocounter = self.ammocapacity;
- -- Clear unneeded tables and variables
- self.smgbodylist = nil;
- self.smgbarrellist = nil;
- self.smgmaglist = nil;
- self.smgbulletlist = nil;
- self.smgsoundlist = nil;
- self.rofmod = nil;
- self.magmod = nil;
- self.accmod = nil;
- self.firevelmod = nil;
- self.massmod = nil;
- self.sharpnessmod = nil;
- end
- -- Figure out what team is currently holding the gun
- self.projectileteam = MovableMan:GetMOFromID(self.RootID).Team;
- -- Move around attachables
- if self.Body["pointer"].ToDelete ~= true and self.Body["pointer"].PresetName ~= "" then
- if self.HFlipped then
- self.Body["pointer"].Pos = self.Pos + Vector(self.Body["offset"].X * -1,self.Body["offset"].Y):RadRotate(self.RotAngle);
- else
- self.Body["pointer"].Pos = self.Pos + Vector(self.Body["offset"].X,self.Body["offset"].Y):RadRotate(self.RotAngle);
- end
- self.Body["pointer"].RotAngle = self.RotAngle;
- self.Body["pointer"].HFlipped = self.HFlipped;
- end
- if self.Mag["pointer"].ToDelete ~= true and self.Mag["pointer"].PresetName ~= "" then
- if self.HFlipped then
- self.Mag["pointer"].Pos = self.Pos + Vector(self.Mag["offset"].X * -1,self.Mag["offset"].Y):RadRotate(self.RotAngle);
- else
- self.Mag["pointer"].Pos = self.Pos + Vector(self.Mag["offset"].X,self.Mag["offset"].Y):RadRotate(self.RotAngle);
- end
- self.Mag["pointer"].RotAngle = self.RotAngle;
- self.Mag["pointer"].HFlipped = self.HFlipped;
- end
- if self.Barrel["pointer"].ToDelete ~= true and self.Barrel["pointer"].PresetName ~= "" then
- if self.HFlipped then
- self.Barrel["pointer"].Pos = self.Pos + Vector(self.Barrel["offset"].X * -1,self.Barrel["offset"].Y):RadRotate(self.RotAngle);
- else
- self.Barrel["pointer"].Pos = self.Pos + Vector(self.Barrel["offset"].X,self.Barrel["offset"].Y):RadRotate(self.RotAngle);
- end
- self.Barrel["pointer"].RotAngle = self.RotAngle;
- self.Barrel["pointer"].HFlipped = self.HFlipped;
- end
- if self:IsActivated() and self.firingtimer:IsPastSimMS(60000 / self.rateoffire) and self.ammocounter > 0 and self.Magazine ~= nil then
- self.ammocounter = self.ammocounter - 1;
- self.firingtimer:Reset()
- -- Decide which kind of particle to create depending on the bullets particle type
- if self.Bullet["particletype"] == "MOPixel" then
- self.particle = CreateMOPixel(self.Bullet["particle"],"Brolands.rte");
- elseif self.Bullet["particletype"] == "MOSRotating" then
- self.particle = CreateMOSRotating(self.Bullet["particle"],"Brolands.rte");
- elseif self.Bullet["particletype"] == "MOSParticle" then
- self.particle = CreateMOSParticle(self.Bullet["particle"],"Brolands.rte");
- end
- -- Decide which kind of particle to create depending on the muzzleflashs particle type
- if self.MuzzleFlash["particletype"] == "MOPixel" then
- self.particle2 = CreateMOPixel(self.MuzzleFlash["particle"],"Brolands.rte");
- elseif self.MuzzleFlash["particletype"] == "MOSRotating" then
- self.particle2 = CreateMOSRotating(self.MuzzleFlash["particle"],"Brolands.rte");
- elseif self.MuzzleFlash["particletype"] == "MOSParticle" then
- self.particle2 = CreateMOSParticle(self.MuzzleFlash["particle"],"Brolands.rte");
- end
- -- Figure out if the actor is sharpaiming or not.
- local MO = MovableMan:GetMOFromID(self.RootID)
- local Aiming = 1;
- if MO then
- local Actor = ToActor(MO)
- if Actor:GetController():IsState(Controller.AIM_SHARP) then
- Aiming = 0.5;
- else
- Aiming = 1;
- end
- end
- -- Create a direction vector for the projectile depending on if the gun is HFlipped or not
- if self.HFlipped == true then
- self.particle.Pos = self.Barrel["pointer"].Pos + Vector(self.Barrel["muzzleoffset"].X * -1,self.Barrel["muzzleoffset"].Y):RadRotate(self.RotAngle);
- if math.random() > 0.5 then
- self.firingvector = Vector(-1,0):RadRotate(self.RotAngle + math.random() * (math.pi/8) * ((100 - self.accuracy)/100) * Aiming);
- else
- self.firingvector = Vector(-1,0):RadRotate(self.RotAngle - math.random() * (math.pi/8) * ((100 - self.accuracy)/100) * Aiming);
- end
- else
- self.particle.Pos = self.Barrel["pointer"].Pos + Vector(self.Barrel["muzzleoffset"].X,self.Barrel["muzzleoffset"].Y):RadRotate(self.RotAngle);
- if math.random() > 0.5 then
- self.firingvector = Vector(1,0):RadRotate(self.RotAngle + math.random() * (math.pi/8) * ((100 - self.accuracy)/100) * Aiming);
- else
- self.firingvector = Vector(1,0):RadRotate(self.RotAngle - math.random() * (math.pi/8) * ((100 - self.accuracy)/100) * Aiming);
- end
- end
- self.particle.Mass = self.Bullet["mass"]
- self.particle.Sharpness = self.Bullet["sharpness"];
- self.particle.Vel = self.firingvector * self.Bullet["firevel"];
- self.particle.LifeTime = 1500;
- self.particle.Team = self.projectileteam;
- self.particle.IgnoresTeamHits = true;
- MovableMan:AddParticle(self.particle);
- -- Create firing sound emitter.
- self.particle = CreateAEmitter(self.FireSound,"Brolands.rte");
- self.particle.Pos = self.Pos;
- MovableMan:AddParticle(self.particle);
- -- Create muzzleflash
- self.particle2.Pos = self.Barrel["pointer"].Pos + Vector(self.Barrel["muzzleoffset"].X * -1,self.Barrel["muzzleoffset"].Y):RadRotate(self.RotAngle);
- self.particle2.Vel = self.Vel;
- MovableMan:AddParticle(self.particle2);
- end
- -- Keeps track of the magazine
- if self.Magazine == nil then
- self.Mag["pointer"].Scale = 0;
- self.ammocounter = self.ammocapacity;
- self.reloading = true;
- else
- self.Mag["pointer"].Scale = 1;
- self.Magazine.RoundCount = self.ammocounter;
- end
- if self.reloading == true and self.Magazine ~= nil then
- self.reloading = false;
- -- When the gun is done reloading, play reload sound
- self.particle = CreateAEmitter(self.ReloadSound,"Brolands.rte");
- self.particle.Pos = self.Pos;
- MovableMan:AddParticle(self.particle);
- end
- end
- function Destroy(self)
- end
- function Round(num, idp)
- local mult = 10^(idp or 0)
- return math.floor(num * mult + 0.5) / mult
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement