Changing Main Game Loop Or Change World Class

The only replicated actors here would be Player Controllers, Player States and GameStates. With 4-player game means 12 replicated objects - not big deal.

PlayerController - Can be used to generate messages based on input or current state of game. Messages would be something like training a unit in barracks, ordering unit to attack, etc.

GameStates - Push own messages to the server, receive messages from other players.

GameState - Hold current turn counter. At end of turn, notify server that this client is done. When all clients signal end of turn, the server should increment turn count and distribute relevant commands to clients.

All remaining actors are not replicated and their state can only be changed via incoming messages.

As for physics I don’t know what you wish to do with it. If it’s just for visuals, then no problem. Simulate it traditionally and no one will ever notice that there are slight differences in simulation between objects. However if your game’s gameplay depends on physics, then you indeed have a problem. In this article you can see that physx is non-deterministic, which makes it rather difficult to use in lockstep scenario. If physics are important, a solution might be to create your own deterministic and simplified implementation of physics phenomena you need(rather doable without custom engine loop). Same thing may apply(but doesn’t need to) to path finding system.