In general, if a part is near an in-game character, its physics will be calculated by that player’s device; otherwise it will be calculated by the server.
— Network Ownership | Documentation - Roblox Creator Hub
No easy solution in general, but that page is a useful read.
I recommend one of these:
NPC.PrimaryPart:SetNetworkOwner(nil)
- sets owner to server
- probably no skips or jumps
- might add delay to knockback even if its smooth
NPC.PrimaryPart:SetNetworkOwner(playerWhoHit)
- sets owner to the player whos fighting the NPC
- if you’re already the owner, no delay to knockback
- (if you’re not already the owner, could see a delay while the ownership switches)
- groups of players fighting the same NPC could get tricky
- buttery smooth knockback for the owner (hitter)
- skippy knockback (like you see now) for non-owners
- need to call
SetNetworkOwnershipAuto()eventually if you don’t want the hitter to be the owner forever