In my gun, if I stand in one spot and shoot, the bullet will come out from the barrel. If I start jumping around like an idiot with the gun, or going in circles super fast, the bullet comes out from where it was 1 second ago. How to fix? My codes.
Bullet:
function getRemote(remote)
if remote:IsA("RemoteEvent") and remote.Name == "bulletReplicator" then
remote.OnClientEvent:connect(fire)
end
end
for _,remote in pairs(game.ReplicatedStorage:GetChildren()) do
getRemote(remote)
end
game.ReplicatedStorage.ChildAdded:Connect(function(remote)
getRemote(remote)
end)
local bulletStorage = Instance.new("Folder",workspace)
function fire(character,startPos,range,direction,gravity)
local lastPos = startPos
local startTime = tick()
local tracer = getTracer()
tracer.Position = startPos
local rayFilter = rayFilter(character)
while range > 0 do
local timeLength = (tick()-startTime)
local currentPos = startPos + (direction*timeLength)
currentPos = applyGravity(currentPos,gravity,timeLength)
local distance = (lastPos - currentPos).Magnitude
range = range-distance
local ray = workspace:Raycast(lastPos,currentPos-lastPos,rayFilter)
if ray then
local hit = ray.Instance
currentPos = ray.Position
end
updateTracer(tracer,lastPos,currentPos)
if ray then
break
end
lastPos = currentPos
task.wait()
end
task.wait()
tracer:Destroy()
end
function applyGravity(currentPos,gravity,timeLength)
return currentPos+(gravity*timeLength^2)
end
function updateTracer(tracer,lastPos,rayPos)
tracer.Size = Vector3.new(.1,.1,(lastPos-rayPos).Magnitude)
tracer.CFrame = CFrame.new(rayPos,lastPos)*CFrame.new(0,0, -(lastPos-rayPos).Magnitude/2)
end
function rayFilter(character)
local rayFilter = RaycastParams.new()
rayFilter.FilterDescendantsInstances = {character,bulletStorage}
rayFilter.FilterType = Enum.RaycastFilterType.Blacklist
return rayFilter
end
function getTracer()
local tracer = Instance.new("Part",bulletStorage)
tracer.Anchored = true
tracer.CanCollide = false
tracer.Locked = true
tracer.BrickColor = BrickColor.new("Gold")
tracer.Material = Enum.Material.Neon
return tracer
end
Mouse:
local player = game:GetService("Players").LocalPlayer
local mouse = player:GetMouse()
equipped = false
script.Parent.Equipped:Connect(function()
equipped = true
end)
script.Parent.Unequipped:Connect(function()
equipped = false
end)
function fireLoop()
while firing and equipped do
script.Parent.RemoteEvent:FireServer(mouse.Hit.p)
task.wait(.01)
end
firing = false
end
mouse.button1Down:connect(function()
if equipped == false then
return
end
local sound = Instance.new("Sound",script.Parent)
sound.SoundId = "rbxassetid://410814187"
sound:Play()
sound.Ended:connect(function()
sound:Destroy()
end)
mouse.button1Up:connect(function()
firing = false
end)
if firing == true then return end
firing = true
fireLoop()
end)
local remoteEvent = script.Parent:WaitForChild("RemoteEvent",15)
remoteEvent.OnClientEvent:Connect(function()
local hitMarker = Instance.new("Sound",script.Parent)
hitMarker.SoundId = "rbxassetid://160432334"
hitMarker:Play()
hitMarker.Ended:connect(function()
hitMarker:Destroy()
end)
end)
