I used RunService.RenderStepped because that's the lag free thing i know
My problem is at line 106
Here is the script
local plr = game.Players.LocalPlayer local mouse = plr:getMouse() repeat wait(.2) until plr.Character local char = plr.Character char:WaitForChild("Humanoid") local function loadprint(module) print(module.." Loaded") end --Viewmodel Module local guns = game.ReplicatedStorage:WaitForChild("Guns") local viewmodelGun local diemaus = game.Players.LocalPlayer:getMouse() diemaus.Icon = "http://www.roblox.com/asset/?id=98386546" --local animationContent = game:GetService("KeyframeSequenceProvider"):RegisterKeyframeSequence(game.ReplicatedStorage.TestShot) --script.Animation.AnimationId = animationContent --game.Workspace.CurrentCamera.CameraType = Enum.CameraType.Scriptable local offset = Vector3.new(0, -.8 ,0.1) local modeloffset = CFrame.new(0, -.8 ,0.1) --[[local function SetViewmodelOffset(vector) if viewmodelGun then --viewmodelGun:SetPrimaryPartCFrame(cframe or game.Workspace.CurrentCamera.CoordinateFrame) offset = vector or Vector3.new(0,0,0) end end]] local function scan_nocollide(object) local obj = object or viewmodelGun if obj == nil then return end for _,v in pairs(obj:GetChildren()) do if v:IsA("BasePart") then v.CanCollide = false end if #v:GetChildren() > 0 then scan_nocollide(v) end end end local function ShowWeaponOnScreen(weapon) if guns:FindFirstChild(tostring(weapon)) then if viewmodelGun then viewmodelGun:Destroy() viewmodelGun = nil end if game.Workspace.CurrentCamera:FindFirstChild("Viewmodel") then -- Somehow a second viewmodel was being created when this was called twice, we just see if we created the viewmodel already and if that is the case we destroy the object. game.Workspace.CurrentCamera:FindFirstChild("Viewmodel"):Destroy() viewmodelGun = nil end viewmodelGun = guns:FindFirstChild(tostring(weapon)).Model:Clone() viewmodelGun.Name = "Viewmodel" viewmodelGun.Parent = game.Workspace.CurrentCamera scan_nocollide() end end script.ShowWeaponOnScreen.OnInvoke = ShowWeaponOnScreen --[[ print(game.Players.Player1.PlayerGui.ScreenGui.Viewmodel.PlayParticleOnPart:Invoke("MuzzleFlash", game.ReplicatedStorage.Guns.AK47.Resources.Particles.MuzzleFlash, function (name, icle) wait(0.1) icle.Enabled = false print("Disable Particle") end)) --]] script.SetViewmodelOffset.OnInvoke = SetViewmodelOffset script.PlayParticleOnPart.OnInvoke = function (partName, particle, callback) if not viewmodelGun then return end local icle = particle:Clone() icle.Parent = viewmodelGun:FindFirstChild(tostring(partName)) icle.Enabled = true if type(callback) == "function" then coroutine.wrap(function () callback(partName, icle) end)() end return icle end local delta = 0 local ti, prevTick = tick(), tick() --SetViewmodelOffset(Vector3.new(1, -0.75, 1.5)) --SetViewmodelOffset(Vector3.new(1,-1.35,-3)) local oldviewmodelCFrame local function GetViewmodelCFrame() if oldviewmodelCFrame then return oldviewmodelCFrame:lerp(game.Workspace.CurrentCamera.CoordinateFrame * CFrame.new(offset), 0.35) else return game.Workspace.CurrentCamera.CoordinateFrame * CFrame.new(offset) end end local RunSrv = game:GetService("RunService") RunSrv.RenderStepped:Connect(function() if viewmodelGun then ti = tick() delta = ti - prevTick local viewCFrame = GetViewmodelCFrame() viewmodelGun:SetPrimaryPartCFrame(viewCFrame * modeloffset) oldviewmodelCFrame = viewmodelGun:GetPrimaryPartCFrame() prevTick = tick() end end) local function FlickView(vector) local cframe = game.Workspace.CurrentCamera.CoordinateFrame * CFrame.Angles(math.rad(vector.x), math.rad(vector.y), math.rad(vector.z)) game.Workspace.CurrentCamera.CoordinateFrame = cframe return game.Workspace.CurrentCamera.CoordinateFrame end loadprint("Viewmodel")