я сейчас делаю прототип игры, используя следующую логику:
1. всё состояние игры хранится на сервере (положения объектов и т.д.)
2. каждый тик сервер отправляет на клиент пакет с данными об объектах, которые попадают в поле видимости данного клиента (в зависимости от его местоположения)
3. клиент в свой клиентский тик отрисовывает последние полученные данные
4. клиент слушает команды ввода и моментально отправляет их на сервер
5. сервер двигает объекты в соответствии с получаемыми командами
6. goto п.2
Ключевой момент - клиент не может сообщать серверу изменения состояний объектов. Клиент может сообщать только пользовательский ввод, а уж как на него реагировать – решает сервер.
Порядок пунктов у меня не совсем такой для серверного тика, по факту вот так:
серверный тик:
1. обновление состояния объектов в зависимости от комманд и прочих данных
2. проверка коллизий
3. обновление клиентов