May I see your code for your velocity compensation? Generally, if you’re okay with semi-decent hitboxes, velocity compensation with ping factored in is enough.
My server-sided hitboxes aren’t perfect, but since I wanted to play around with a custom hitbox solution for a game I’m doing work on, I tried this:
- Use Suphi Kaner’s Packet module to send a player’s character position 30 times per second to the server (just a fancy remoteEvent that’s slightly more performant, i think?)
- A server module, which we’ll call ReplicationModule tracks the positions of every player for the last second, prune any data from beyond a second ago on the server. It stores this data sent to it as a table of {timeItWasSent, CFrameSent}
- My hitbox module just calls this other module and gives it the current time in os.clock().
- ReplicationModule checks the last 2 entries in its table for that player (i’m using table.insert to put values in the table for each player, so the last 2 entries are the most recent), and it then does a bit of math to figure out the position to interpolate the CFrames in the table to to predict where the player actually is on the server.
- My hitboxModule takes this CFrame and then applies the velocity and ping offset to it.
Here’s the math part!
It’s not the cleanest, haha 
ReplicationService.GetHistoricalCFrame = function(player: Player, snapshot: number)
local timestampRegistry = cframeRegistry[player]
--print(timestampRegistry)
if not timestampRegistry or #timestampRegistry < 2 then
return
end
local latestEntry = timestampRegistry[#timestampRegistry]
local secondLatestEntry = timestampRegistry[#timestampRegistry - 1]
if snapshot > latestEntry[1] then
local delta = latestEntry[1] - secondLatestEntry[1]
if delta <= 0 then return latestEntry[2] end
local extrapolationAlpha = (snapshot - latestEntry[1])/delta
return secondLatestEntry[2]:Lerp(latestEntry[2], 1 + extrapolationAlpha)
end
return (nil :: any) :: CFrame
end
It worked well enough at 200 walkspeed. It wasn’t perfect, but I hope this gives you an idea on how to handle this issue if you want something a bit more accurate than plain velocity prediction!
For peak asymmetrical horror game speeds for killers, like maybe 30-50, it worked well in my opinion.
Hope you figure this out swiftly!
EDIT: OOPS, I just saw your post where you show the code!
The kicker is probably you invoking the client!
I’m no expert, but I think that yields the script for a while, and is generally bad practice since if the client suddenly disappears, I think the game doesn’t know what to do?
Your hitboxes are likely more delayed than usual due to the ping compensation. Remove the ping compensation and you’ll notice a MASSIVE improvement, and implement the solution above too if you want some slightly smoother hitboxes.