Se o seu projeto estiver na fase de planejamento, é recomendável projetá-lo para a rede desde o início. A aplicação de códigos de rede em um estado tardio do projeto provavelmente levará a uma refatoração maciça ou a uma grande quantidade de hackers, resultando em códigos dificilmente manejáveis e com erros.
A maneira mais limpa é implementar o jogo inteiro como se fosse um jogo em rede puro. Ou seja, implemente o código para um servidor dedicado e implemente esse código por ser apenas código do servidor. Implemente o código do cliente do jogo de maneira semelhante. Servidor e cliente podem ser executados no mesmo processo e nem precisam usar um soquete de rede real, mas devem ser entidades separadas e todo o código deve ser projetado para funcionar dessa maneira. Quando o jogador pular, não altere diretamente o vetor de pulo do jogador, mas envie um pacote 'jump-pressionado-tecla' para o servidor e deixe o servidor lidar com isso.
Isso significa que, mesmo em um jogo para um jogador, há um servidor invisível sendo executado em segundo plano. Uma versão multiplayer do mesmo jogo só precisa se conectar a um servidor remoto, em vez da versão local e pronto, multiplayer feito. As vantagens disso são:
sem código separado para single e multiplayer, o código de rede é testado e desenvolvido durante todo o código de limpeza do projeto
Projetos usando esse esquema são quase todos os jogos usando qualquer um dos mecanismos do Quake, Civilization 4, Neverwinter Nights e muitos outros.
Para conectar cliente e servidor no mesmo processo com latência zero, soquetes locais podem ser usados. Eles são fornecidos pelo Zoidcom e transmitem pacotes diretamente de um ZCom_Control para outro, sem passar por um soquete no nível do SO.