Como mencionado, isso é impossível, então eu tentaria outra abordagem:
Se você não tiver um servidor dedicado, escolha um cliente participante para se tornar o host (isso pode ser transferido se necessário).
O host agora executará toda a lógica importante do jogo, como detecção de hits, controles de IA, manipulação de inventário etc., bem como rastreamento de tempo (por exemplo, ditar o tempo do jogo).
Os outros clientes apenas tentarão permanecer sincronizados com o host, tentando estimar ou aproximar o valor esperado. Se o atraso aumentar ou houver perda de pacotes, as coisas podem ficar instáveis, mas é trivial recuperar o atraso, basicamente apenas aguardando a próxima atualização.
A maioria dos jogos (especialmente o FPS) oculta esse fato fazendo seu próprio cálculo local para o próprio movimento do jogador, tiros sendo disparados etc. para evitar que o jogo fique lento. Tudo ainda é corrigido com base nos dados do servidor. Isso pode levar a alguma confusão, por exemplo, você se vê atirando no inimigo, mas no mesmo momento em que cai morto (sem que o inimigo seja atingido), mas ainda é uma abordagem muito melhor do que a sincronização completa.
Se você ainda insistir em manter tudo em sincronia, provavelmente desejará criar algum tipo de etapa ou contador de quadros, para que todos os clientes processem apenas uma etapa lógica e depois sincronizem seus dados, etc. Lembre-se de que essa pode ser a largura de banda intensivo e lento, então eu não recomendaria fazer isso, a menos que você tenha muitos dados e sua jogabilidade seja baseada em turnos (por exemplo, jogos no estilo de artilharia / worms).