Player Animations - Server or Client?

Generally speaking a common recommendation is to run animations for players on the client and allow Roblox to do the replication for you. This is something you will see over and over again on the Developer Forums when the question comes up.

However, after myself making an entire published game that involves a lot of VFX (anime game) there has been some issue with using this method.

Consider this scenario:

  1. A player decides to fire off a projectile fireball attack at a target
  2. They press the key for the ability and we show them a windup animation
  3. We then send the signal to the server where will will perform checks such as cooldown and others
  4. If we are good to go, we will then do projectile calculations, hitboxes damages
  5. We also immediately fire a remote event for all players to see the resulting VFX(visual effects)

Now about the character animations for the fireball initiating player:

  1. They have a windup animation (before server checks)
  2. Theres an animation when they actually shoot the firebal (after server checks)

Now if we play animation 1 on the initiating players client, all will be good. This is because Roblox will replicate that animation for us and the flow of replication from client → server → client is the same as the other VFX. Any latency experienced by observing players will be relatively the same.

Now lets look at animation 2, that should only be played after server checks. After the server does its work, it will send the remote to all players. If the player receiving this remote is the initiating player, we need to play the animation on their character so other players see it too.

We have 2 choices:

  1. We player the animation only on the character that initiated the fireball. This is not ideal because for all players to see it, it must then go through the whole replication pipeline. This means the animation will arrive late and not be synced to the other VFX.
  2. We play the animation on the all clients who received the remote. This is also bad because of the animation replication, this animation will play twice for observing players, once immediately after receiving the remote, and then again after the replication.

neither of these is ideal, in the case of my last game i opted for playing animations on the initiating player from the server so they would arrive at the same time as the other VFX and not create any duplicates. I did not like this solution because i wold rather have one simple way t render animations but the way Roblox enforces character animations to replicate makes this whole thing a lot messier than it needs to be.

What have other people done in this situation? How did you solve this?

Honestly, Roblox really needs an option to disable animation replication when you play it.