Seems to be an issue with the client being delayed, or something along those lines. A longer fix would be to retrieve the current CFrame of that arrow and fire it to the client to ensure that the position is replicated client-side; although that method isn’t very efficient, it’s the only solution I can offer so far.
The way you scripted is somewhat bad practice, you can improve this by instead of checking just your player, by checking if the part parent is a player.
if game:GetService("Players"):GetPlayerFromCharacter(part) then
-- don't do stuff
Anyways back to the original problem, I HIGHLY suggest looking into raycasting for the arrow. Maybe take a look into this
I created my bow using raycasting, as it is more effective.
Here is an example from my bow, what I did was create a ray in front of the bow, which then if it found something it would stop the arrow.
local newpoint = root.CFrame*Vector3.new(0,5,0)--*speed
local nextpoint = root.Position+root.CFrame.lookVector
local ray = Ray.new(root.Position,(newpoint-root.CFrame.p))
local hit,point,normal,material = workspace:FindPartOnRayWithIgnoreList(ray,ignore,false,true)
if hit then
Well this is still using it’s own custom arrow physics, the purpose of the ray is to detect if the arrow is going going to collide with something in front of it. And if there is something in front of it, it stops the arrow. The raycasting gun is just an example of how to use raycasting.