This should be a viable workflow for your shoving synchronization:
- Client pushes an NPC
- Client determines where NPC will be shoved and what "time flag" the shove will be completed at by using GetServerTimeNow() + shoveDuration, whatever that happens to be
- Client locally sets attributes on the shoved NPC so that the player client has instantaneous feedback
- Client sends time flag and "where NPC will be shoved" to server, allowing it to set attributes that all clients can see.
- All clients (including the sending client) use attribute changes in order to initiate the active shoving state
conditions to consider:
- exploiters can shove npcs into oblivion
- clients that receive the timeFlag update should not apply the tween state if the delta for the shoving animation is greater than shoveDuration