Server does not update physics actors' position

Hello all. I’m using Unreal 4.25 and trying to have a vehicle (horse-driven carriage) simulated on the server using physics, and the carriage’s main chassis transform replicated to clients.
I’m well-aware that such direct replication is bandwidth-heavy, but there will be only very few such carts on the map at any given moment of time, and it’s important that they are both physically simulated, and that their transform is correctly replicated to all clients.

The carts are Skeletal Mesh (1 chassis and 4 wheels).
It is a Root Component.
It is set to Replicate, Always Relevant, Replicate Movement, Replicate Movement to autonomous proxy.
I’ve gotten the chassis transform to replicate across two clients, but the blueprint which applies the force to move it - on the server, in the blueprint’s Tick - does not update it’s position at all.

The result is quite bizzare - the clients locally apply a force, in world space, but the strength and point of application of the force is stationary (the carriage’s spawn position) - as it never updates on the server.

If I make the carriage not an independent actor but a child component of the horse - it loses movement replication (and I’ve read that movement replication only works on root nodes). Also, if the carriage is a child component of the horse - it’s position on the server does get updated - but ONLY while the horse is being actively moved. Otherwise the physics appear to freeze on the server - and be simulated locally and independently on clients.

My question: how to get an actor’s physics simulation to ALWAYS tick on the server, and never go to sleep/freeze / go dormant? I’ve already tried all the intuitive things, such as setting Net Dormancy in the Details of such an actor to “Never”. Didn’t find any obvious setting that would indicate that this actor’s physics are to go to sleep under any conditions. Currently using UE 4.25 with PhysX but we’ll be migrating to 4.26 w. Chaos once Chaos is stable.

Discovered that when I debug in PIE, if I “Play as Listen Server” - the carriage is both synced and correctly updated, and there are two types of transform printouts:
Client 0:
OTOH, if “Play as Client” (used to be called “Dedicated Server” in former Unreal versions) - then I get 3 instances:
Client 0:
Client 1:

  • and only the Clients’ transforms get updated. They are synced, but since the Server’s transform doesn’t get updated - the force on the caravan is incorrect.
    The physics actors have multiple setting related to replication, physics simulation, including one specifically named “Enable Physics on Dedicated Server” - which I have checked, of course.

My guess is that if the server is also a client (as in “Play as Listen Server” - then something makes sure the physics are awake and are, in fact. simulated correctly.
Whereas in case of “Play as Client” (with separate dedicated server process) - that dedicated server has the physics go dormant/asleep for whatever reason.

I strongly suspect that the “Enable Physics on Dedicated Server” feature might be broken. That, or there’s some obscure condition for it to actually do what it says, that I haven’t met.

Any ideas?

Did you set the property “Visibility Based Anim Tick Option” to “Always Tick Pose and Refresh Bones” in your skeletal mesh ? There is no rendering in the dedicated server and by default in UE4 the “Bone Refresh” (used for physics) will never happen when there is no rendering. That why it is working when you play as Listen Server because you can look your carriage. If you are curious, try to play as listen server but make the client (not the server) be the only one to look the carriage. You will have a surprise…