To effectively get rid of this, you can do these solutions:
Handle the projectile entirely on client. Including hitreg:
secure the data on the server though, then fireallclients BUT the plr that sent, to replicate the projectile visual. Don’t do damage on the client either.
The best way to provide a good user-experience, unless you make a custom character (like chickynoid) and history tick system (look at Valve article about lag comp).
If you want server side hitreg, OK. You can do these two options:
When you shoot the projectile, in the onserverevent, instead of having projectile visuals on the server, straight up fireallclients, do visuals there, not hitreg.
Right before you fireserver for the projectile, do the projectile VISUAL on the client that would be firing the remote. Then, on the server event, again, don’t handle visuals. Replicate to all clients but the one who fired the event.
An example to replicate to all clients that aren’t the one that sent the remote:
Remote.OnServerEvent:Connect(function(plr)
For _, Client in game.Players:GetPlayers() do
if Client == plr then continue end
Replicate:FireClient(client)
end
end)