Добавлен ScorpioT1000,
опубликован
Выполнение кода и обращение к данным
Содержание:
Помимо всех манипуляций с вашей игрой, 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
- координаты пехотинца1 у клиента1 не равны координатам у хоста
Именно так и работает десинк или защита от читерства.
Кстати, если кривые данные будут у хоста, хост выкинет всех игроков одновременно, т.е. это просто та ситуация, когда ошибка случилась на компьютере хоста, а не простых игроков. Поэтому не важно, выкинуло всех игроков или одного - причина может быть одна и та же.
Подробнее можно почитать в теме Toadcop'а: xgm.ru/forum/showthread.php?t=14916
Выполнение действий на отдельном клиенте
Разработчики jass предоставили нам такую удобную вещь как GetLocalPlayer(). Она позволяет выполнять некоторые действия только на одном клиенте независимо от других.
Всем, кто хочет узнать побольше о мультиплеере и какие данные могут различаться у разных игроков, добро пожаловать в статью GetLocalPlayer() от Doc.
Всем, кто хочет узнать побольше о мультиплеере и какие данные могут различаться у разных игроков, добро пожаловать в статью GetLocalPlayer() от Doc.
Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован ScorpioT1000