okay i found the problem:
in AActor::GetLifetimeReplicatedProps:
DOREPLIFETIME_CONDITION( AActor, ReplicatedMovement, COND_SimulatedOrPhysics );
then in APawn::PostNetReceiveLocationAndRotation:
if( Role == ROLE_SimulatedProxy )
so my Role is ROLE_AutonomousProxy
I’ve managed to hack around the issue by:
replicating the movement data myself, then faking a role change before applying the movement:
while not ideal, this works. Is there a better way to solve my problem thats not hackey?