Well, I think this is where we say this is simply just the demonstration of NetworkOwnership
!!!
what the heck is that?
Well, explained briefly, it’s simply just any unanchored object inheriting the network latency of its “network owner”. The owner won’t see the latency of the physics since it’s the owner of said object, but everyone else would see that latency of the object.
Let’s use this scenario: We have a tool that acts like a basketball, allowing you to throw it and dribble it and whatnot. Within that script, it sets the network ownership of the ball object to the player who currently has the ball when they decide to throw it.
If the player who owns the ball had a ping of 50 ms, then the ball’s physics of being thrown would be 50 ms slower to others than it would to the owner of the ball. (The player)
If the player who owns the ball had a ping of 200 ms, however, the ball’s physics would be 200 ms slower to others than the player who threw that ball.
In your scenario, your NPC is owned by the server I’m assuming, (whether that is they’ve been moved into the workspace via server script, or simply was in the workspace before runtime) meaning its parts network ownership (mainly the root part) is being owned by the server. So, since no one else has the ownership of those parts, they’ll get the network latency of the NPC on top of their own network latency.
So how would you fix this? It actually depends.
If you don’t mind the latency of the NPC, and it doesn’t impact the gameplay of players too much, then you don’t need to change much since it’s internet on the client’s part. So, you really can’t do anything here.
Now, if the NPC is needed to be as synced as possible, I suggest you have the NPC’s movement be handled on the client’s, so that they can see the NPC moving in real time with no latency. Just have the server check if it’s close enough to do said task. (Like what @happya_x said) I do think, though, the NPC’s root part needs to set its network ownership to the clients (or the client with the shortest latency) to control the movement of the NPC. This will leave room for exploits though, which is why I said make sure the NPC is positioned where they should be with the server-sided script, as a checker to make sure it’s following its set path. There are more things you would have to check, like if the NPC is jumping when it shouldn’t, but I think you get the gist of “checking if the movement of the NPC is sanitized”.
Hopefully this helps. (I might’ve just talked a mouthful for no reason, though, LOL)