Na verdade, não implementei isso (pode haver alguns problemas que não estou vendo imediatamente), mas achei que tentaria ajudar.
Aqui está o que você disse que está acontecendo:
O cliente A envia entrada em T0
Servidor recebe entrada em T1
Todos os clientes recebem a alteração no T2
No T2, no entanto, usando a previsão do cliente, o Cliente A agora está em uma posição apropriada para T4.
Provavelmente seria útil pensar em termos de tempo do servidor. É (provavelmente) muito parecido com o funcionamento da interpolação .
Todo comando é enviado com um horário do servidor. O tempo do servidor é calculado no início de uma partida consultando o tique do servidor, compensando o tempo de ping. No cliente, você tem sua própria contagem de ticks local e cada comando enviado é convertido em ticks de servidor (é uma operação simples de subtração)
Além disso, o cliente está sempre processando "no passado". Portanto, você assume que o mundo que o cliente vê está, digamos, 100ms atrás do que realmente é o tempo do servidor.
Então, vamos reformular seu exemplo com o horário do servidor (designado por S).
O cliente envia entrada em T0 com o tempo do servidor S0 (o que eu acho é realmente "representação do cliente do tempo do servidor menos o tempo de interpolação"). O cliente não espera pela resposta do servidor e move-se imediatamente.
O servidor recebe entrada em T1. O servidor descobre a posição autoritativa do cliente no horário do servidor S0 fornecido pelo cliente. Envia isso para o cliente.
O cliente recebe a posição autoritativa em T2 (ainda com a designação do horário do servidor S0). O cliente controla algum tempo passado de eventos anteriores (provavelmente apenas uma fila de todas as previsões não confirmadas).
Se a posição / velocidade prevista / o que o servidor enviar de volta para S0 for diferente do que o cliente armazenou em S0, o cliente lida com isso de alguma forma. Voltando ao player para a posição anterior, ou re-estimulando a entrada anterior, ou talvez algo que eu não tenha pensado.