function Create(self) self.ShootTimer = Timer() self.SharpRange = self.SharpLength self.Clicked = false self.Recoil = 0 self.AfterRecoil = 0 self.RecoilShake = 0 --You may change following variables to your likings self.ParticleMass = 1 --Mass of the projectile fired self.ParticleVel = 90 --speed of the projectile fired self.RecoilMulti = 1 --if for some reason you need to change the recoil without changing mass or velocity use this self.Grip = 1 --This is how fast you regain control self.MaxTurn = 2 self.MovementPunisherment = 1 self.Durability = 5 self.Shot = false self.Damage = math.random(0,self.Durability) end function Update(self) local negatore = 1 if self.HFlipped then negatore = -1; end self.RecoilShake = self.RecoilShake * 0.9 local RecoilReduction = 0.1 local user = nil for parent in MovableMan.Actors do if parent.ID == self.RootID then user = ToAHuman(parent) break end end if user ~= nil then local aim = ToAHuman(user):GetAimAngle(false) ToAHuman(user):SetAimAngle(aim + self.Recoil*0.000035 + self.RecoilShake*0.025) --Taking the user into account local ArmLength = 0 if self:IsOneHanded() then if user.FGArm ~= nil then RecoilReduction = RecoilReduction + user.FGArm.Mass*1.25 ArmLength = user.FGArm.Diameter end if user.BGArm ~= nil then RecoilReduction = RecoilReduction + user.BGArm.Mass*0.5 ArmLength = math.max(user.BGArm.Diameter , ArmLength) end else if user.FGArm ~= nil then RecoilReduction = RecoilReduction + user.FGArm.Mass ArmLength = user.FGArm.Diameter end if user.BGArm ~= nil then RecoilReduction = RecoilReduction + user.BGArm.Mass ArmLength = math.max(user.BGArm.Diameter , ArmLength) end end ArmLength = ArmLength + user.Diameter --Regaining control self.Recoil = self.Recoil * 0.96 local MovementMulti = ((ArmLength/self.MovementPunisherment - math.min(user.Vel.Magnitude , ArmLength/self.MovementPunisherment))/ArmLength*self.MovementPunisherment) if self.Recoil > 0.00018*self.Grip * MovementMulti^2*(25+user.Health)/200 * user.Mass then self.Recoil = self.Recoil - 0.00018*self.Grip * MovementMulti^2*(25+user.Health)/200 * user.Mass else self.Recoil = 0 end RecoilReduction = (RecoilReduction * user.Mass)^0.5 if self.Recoil > 18 then user:GetController():SetState(Controller.BODY_CROUCH,true) end if self.Recoil > 20 then user:GetController():SetState(Controller.WEAPON_DROP,true) end else self.Recoil = 0 end local shot = false if self.Magazine ~= nil then if self:IsActivated() then if self.Magazine.RoundCount > 0 and self.ShootTimer:IsPastSimMS(60000/self.RateOfFire) and self.Clicked == false then self.ShootTimer:Reset() if user ~= nil then self.AfterRecoil = self.AfterRecoil + self.ParticleMass*self.ParticleVel^2*self.RecoilMulti/100 self.RecoilShake = self.RecoilShake + (math.random()-0.5) / RecoilReduction*6 end self.Damage = self.Damage + 1 if self.Damage > self.Durability then local damagePar = CreateMOPixel("Laser Damage"); damagePar.Pos = self.MuzzlePos + self:RotateOffset(Vector(-math.random(0,self.Diameter/2),0)) damagePar.Vel = self.Vel + self:RotateOffset(Vector(80,0)) damagePar.Sharpness = 2000 MovableMan:AddParticle(damagePar); self.Damage = 0 end self.Clicked = true end else self.Clicked = false end else self.ShootTimer:Reset() end self.AfterRecoil = math.max(self.AfterRecoil - 8, 0) if user ~= nil then self.Recoil = self.Recoil + (self.AfterRecoil / RecoilReduction)^2 self.Recoil = math.max(self.Recoil, 0) self.SharpLength = math.max(0 , self.SharpRange - (self.Recoil*self.SharpRange) * 0.05 + (math.random(-self.Recoil*(100 - user.Health)^4, self.Recoil*(100 - user.Health)^4)*0.0000000025)^2*self.SharpRange)^2/self.SharpRange self.RotAngle = self.RotAngle + self.Recoil * negatore * 0.015*self.MaxTurn + (math.random(-self.Recoil*(100 - user.Health)^5, self.Recoil*(100 - user.Health)^5)*0.000000000025)^2 + self.RecoilShake * negatore end end