Roblox AnimationPlayed on server out of order compared to client

I am playing M1 combat animations on the client. I am doing server side checks via AnimationPlayed event replication to the server. One check I do is make sure animIDs are played according to the M1 Combat order, e.g, punch1, punch2, etc. In addition there is the blocking animation, which I also play on the client and check for on the server via AnimationPlayed.

There are times where I’d activate block to interrupt the m1 combat sequence, where the client would think punch2 anim played after enabling and disabling block anim (on loop as long as block is enabled), but the server would think punch2 happened before enabling and disabling block anim. I don’t know if it’s some sort of network aggregation roblox is doing and it cannot determine the order of events when it hits the server? The order of animations is crucial, so it would be nice to have some closure.

I’ve also experienced this on just the regular m1 sequence without blocking, where it would get two m1 anims out of order if their animationplayed events happen within the same frame on the server, allowing a one frame delay to get things in order fixed that issue.

Is this intended behavior that is just undocumented, or is there something I am missing?

I also just ran into this problem.

I also have run into a similiar problem, which might have emerged from the same cause.

I’m trying to spawn vfx on clients using AnimationPlayed. The way it works is that Client1 will connect to it’s own Humanoid.AnimationPlayed and then play vfx on its AnimationEvents.

Client1 does the same for Client2, Client3 etc etc.

However the problem I’ve run into is that Humanoid.AnimationPlayed fires differently on Clients that don’t own that Humanoid.

Let me provide a video that visualizes this:

Here, we have two clients. Client1 and Client2. Client1 is the one running.
The left output is Client2 who has connected to Client1’s Humanoid.AnimationPlayed and right output is Client1 connecting to itself.

Right output is what is expected on the left also, but it turns out that Roblox fires it differently for clients connecting to a humanoid that isn’t theirs.

I haven’t found a reason for this yet.