With networked motion controllers, what's the right way for a Client to throw a replicated object?

I’m updating some code based on the VR template to work for multiplayer. My game involves players throwing daggers, and that throwing needs to feel precise. Working in Blueprint.

On a single player listen server, I can safely “throw” objects by enabling physics simulation and detaching them from the controller. I’ve tried this approach for a client/server model, using Run on Server events to send the client’s controllers and input events, but it’s hugely unreliable.

If I trust the server, the object doesn’t go anywhere - unless it’s received an update in the same frame I let go, but then it launches too fast. So that’s not the right call.

I’m trying to trust the client, and having other issues. I’ve tried calculating the “release velocity” by comparing the last frame and current frame’s transforms in both rotation and location, sending that to the server during the “Drop” event. Unfortunately I’m tearing my hair out trying to find the correct angular rotation vector to send, and figuring out how to order [toggling physics simulation, toggling dagger attachment, teleporting the dagger to the client’s last reported orientation, applying/setting velocities].

I wrote a gargantuan blueprint function to convert a (delta) rotator to an axis/angle to use as an angular velocity, impulse but given that’s there’s no built-in for this, I worry I’m doing it wrong. Am I overthinking this? Is there an easier way for VR clients to throw objects that’s replicated, stable, and believable?


Bonus question: if an input event fires, where does it fit in the [Actor Tick, Input Event, Motion Controller Component position update] sequence? If it doesn’t land on a tick, how can I tell how far the hand/dagger has moved since the last tick, and how long it’s been?