KeyframeReached on Client or Server?

I’m currently reworking a combat system I previously made. Back then, all animations were played on the server. I know that, in general, it’s preferred to play animations on the client, but I really liked the server-side approach because it made syncing hitboxes with animations much easier. I didn’t have to rely on task.delay / Promise.delay to manually adjust timings, which will probably become messy quickly, especially with weapons that have varying swing speeds and abilities in general.

Now that I’m optimizing the system, I’m trying to move all animation playback to the client. This means I need to access animation keyframes client-side and signal the server when certain events (e.g., hitboxes) should occur. I’ve set up a module on the server that tells the client to play the animation, catch the keyframes, and send relevant info back to the server.

However, I’m now questioning whether this added complexity and potential performance cost is worth it. Sending multiple remote events per animation seems inefficient, and I’m concerned it might impact both performance and game security.

So my questions for those with more experience or who’ve dealt with similar challenges:

  1. For animations that require precise keyframe syncing (e.g., for hitboxes), is it better to just play them on the server?
  2. Is the performance/security gain of fully client-side animations worth the effort and the extra remote calls?

If anyone is more experienced with this and/or has found a solution, please let me know.

Im pretty sure that in your attack animation character is not attacking immediately. If it is, you can add delay before actually attack, and also add ping to delay. So it will sync even with laggy players.