Comme mentionné, c'est impossible, alors j'essaierais une autre approche:
Si vous n'avez pas de serveur dédié, élisez un client participant pour devenir l'hôte (cela peut être transféré si le besoin s'en fait sentir).
L'hôte exécutera désormais toutes les logiques de jeu importantes, telles que la détection des coups, les contrôles de l'IA, la gestion des stocks, etc., ainsi que le suivi du temps (c'est-à-dire la dictée du temps de jeu).
Les autres clients essaieront simplement de rester synchronisés avec l'hôte, en essayant d'estimer ou d'approximer la valeur attendue. Si le décalage augmente ou qu'il y a perte de paquets, les choses peuvent devenir saccadées, mais il est trivial de rattraper le retard, essentiellement en attendant la prochaine mise à jour.
La plupart des jeux (en particulier les FPS) cachent ce fait en faisant leur propre calcul local pour le propre mouvement du joueur, les coups de feu tirés, etc. pour éviter que le jeu ne se sente lent. Tout est toujours corrigé en fonction des données du serveur. Cela peut entraîner une certaine confusion, par exemple, vous vous voyez tirer sur l'ennemi, mais au même moment où vous tombez mort (sans que l'ennemi ne frappe), mais c'est toujours une bien meilleure approche que la synchronisation complète.
Si vous insistez toujours pour que tout soit synchronisé, vous voudrez probablement créer une sorte de compteur d'étapes ou de trames, de sorte que tous les clients ne traitent qu'une seule étape logique, puis synchronisent leurs données, etc. Gardez à l'esprit que cela peut être à la fois de la bande passante intensive ainsi que laggy, donc je ne recommanderais pas de le faire à moins d'avoir beaucoup de données autrement et votre gameplay est basé sur le tour (par exemple les jeux de style Artillerie / Worms).