I have a simple multiplayer game and I need to disable input until every player reports that he is ready to play.

Gamemode is responsible for checking whether everyone ready or not. Then calls custom events on all controllers which call Enable Input node.
It’s doing fine on the listen server but it appears not to have any effect on the client. I still can move the pawn on the client.
The disable input function sets a boolean in the pawn which prevents input from working. However, in this case, this is occurring on the pawn in the server, but NOT the pawn on the client.
If you imagine there are two pawns - the pawn on the server, and the pawn on the client - and the one on the server has the input disabled, but the client one does not.
You have to call disable input on the client pawn, not the server’s representation of the client’s pawn.
To do this - make a function that is a client function, and have the server call that instead.
UFUNCTION(Client, Reliable)
void ClientDisableInput(APlayerController* PlayerController);
void APlayerCharacter::ClientDisableInput_Implementation(APlayerController* PlayerController)
{
DisableInput(PlayerController);
}
In blueprints, create a function that is called on the client, and just call disable input there.