WarCraft 3: Сетевая игра, синхронизация и локальные действия

Выполнение кода и обращение к данным
Помимо всех манипуляций с вашей игрой, Warcraft 3 оснащен неслабой системой сетевой игры.
Компьютеры игроков (клиенты) общаются между собой, передавая команды игроков. Здесь важно понимать, как работает система защиты от читерства, я покажу это на двух примерах (они немного "грубые", но суть ясна).
Клиент - будет означать "компьютер игрока". Хост - клиент, создавший или "захостивший" текущий сеанс игры. Т.е. тот, кто выбирал карту и собирал игроков.
Хороший пример:
  • игрок1 отдает пехотинцу1 приказ идти
  • клиент1 отсылает UDP / IP пакет с приказом пехотинцу1 хосту
  • хост рассылает всем игрокам пакет с приказом пехотинцу1
  • клиент1 запускает обработку движения пехотинца1
  • хост и все остальные игроки запускают обработку движения пехотинца1
  • хост сверяет координаты пехотинца1 у себя и у всех клиентов
Пример десинка (рассинхронизации клиентов и отказ клиента в дальнейшем соединении):
  • игрок1 отдает пехотинцу1 приказ идти
  • клиент1 отсылает UDP / IP пакет с приказом пехотинцу1 хосту
  • хост рассылает всем клиентам пакет с приказом пехотинцу1
  • клиент1 запускает обработку движения пехотинца1, но здесь игрок1 что-то изменил у себя в клиенте1 и пехотинец1 побежал быстрее
  • хост и все остальные игроки запускают обработку движения пехотинца1
  • хост сверяет координаты пехотинца1 у себя и у всех игроков
    • координаты пехотинца1 у клиента1 не равны координатам у хоста
      • отсоединить клиента1
Именно так и работает десинк или защита от читерства.
Кстати, если кривые данные будут у хоста, хост выкинет всех игроков одновременно, т.е. это просто та ситуация, когда ошибка случилась на компьютере хоста, а не простых игроков. Поэтому не важно, выкинуло всех игроков или одного - причина может быть одна и та же.
Подробнее можно почитать в теме Toadcop'а: xgm.guru/forum/showthread.php?t=14916

Выполнение действий на отдельном клиенте

Разработчики jass предоставили нам такую удобную вещь как GetLocalPlayer(). Она позволяет выполнять некоторые действия только на одном клиенте независимо от других.
Всем, кто хочет узнать побольше о мультиплеере и какие данные могут различаться у разных игроков, добро пожаловать в статью GetLocalPlayer() от Doc.

Просмотров: 2 855

Diaboliko #1 - 5 лет назад 1
клиент1 запускает обработку движения пехотинца1
хост и все остальные игроки запускают обработку движения пехотинца1
Мне казалось что у клиента 1 и всех, кроме хоста, движение должно быть с задержкой. Или мои мысли не в том направлении?
ScorpioT1000 #2 - 5 лет назад 0
Diaboliko, где я писал про задержку?
Doc #3 - 5 лет назад 0
Diaboliko, ну да, так и есть. Все игроки загружаются и отсылают хосту пакет с месседжем о том, что они загрузились. Как только хост понимает, что все загрузились, он стартует и отсылает всем игрокам команду стартовать. Т.о. у хоста всегда игра будет чуть впереди. Но это мое имхо все.
Гораздо интереснее было бы прочитать, на основе чего и как синхронизируются юниты, например.
ScorpioT1000 #4 - 5 лет назад (отредактировано ) 0
Doc, это будет тяжело понимать, ведь udp пакеты явно в бинарном формате отсылаются. Ну и кому нужно время чтобы в них копаться, да еще и не с целью заработать бабла =)
Я понял. Дело не в задержке, а в том, что синхронизация скорее всего случается не по времени, а после каких-то событий. Т.е. перед тем, как, например, взять предмет, клиент шлет координаты юнита хосту. А у хоста допустим юнит еще не добежал до предмета. Так вот он сравнит координаты клиента только тогда, когда юнит хоста добежит до предмета. Но, естественно, в разумном интервале итп. Это как я предполагаю =)
ScorpioT1000 #5 - 4 года назад 1
Полезная информация, как строятся серьезные сетевые игры
p.s. модель синхронизации отличается от war3
Bornikkeny #6 - 4 года назад 0
ScorpioT1000:
Полезная информация, как строятся серьезные сетевые игры
p.s. модель синхронизации отличается от war3
Очень интересно :-) Я не знаток, но думаю, что разница в возрасте есть, значит отличается ;-D Новые подходы всегда актуальны? Наверное да :-)