LINUX.ORG.RU

Сервер многопользовательской риалтайм-игры. Логика.


2

3

Где бы почитать мировой опыт дизайна логики игровых серверов многопользовательских риалтайм-игр?

Немного удивляет наличие читеров в многопользовательских риалтайм-играх, типа GTA San Andreas. Как модификацией клиента делается возможным изменение скорости машин? Почему нельзя было сделать передачу на сервер только событий начала и конца различных вызываемых пользователем событий? Сел в тачку ID = 123, нажал педаль газа, на сервер улетел «газ», сервер взял параметры тачки 123 и она едет в памяти у сервера. Как её при этом отрисовывает клиент - пофигу. Факт в том, что другие не могут увидеть её едущей быстрее, чем она едет внутри сервера, а там она едет так, как предписывают главные серверные физические модели. На других клиентов идут координаты этой машины только из серверной копии виртуального мира... События столкновений и т.п. обсчитываются так же на сервере и рассылаются всем только оттуда, в том числе самому ездоку. Откуда возможность читерства?

Вот есть у меня такая игрушка, сделанная за 2 дня на коленке на JavaScript. http://dagoneev.no-ip.biz/game/ Зафигачить бы туда онлайн. Как я себе это представляю? На сервере крутится поток и 30 раз в секунду делает очередной шаг времени, вычисляя новое состояние мира с учётом имеющееся на данный момент состояние всех объектов «танк едет, снаряд летит, этот тут, тот здесь» и т.п. Если новости касаются твоего поля зрения, тебе отправляются данные.

В чём ущербность такого подхода?

★☆

Последнее исправление: kiverattes (всего исправлений: 2)

Ответ на: комментарий от anonymous

Ан нет, работает, но упорото.

anonymous
()

это бага или нет, что пятна крови не простреливаются?
и слишком просто, особенно со шквальным огнём

teod0r ★★★★★
()
Последнее исправление: teod0r (всего исправлений: 1)

Немного удивляет наличие читеров в многопользовательских риалтайм-играх, типа GTA San Andreas. Как модификацией клиента делается возможным изменение скорости машин? Почему нельзя было сделать передачу на сервер только событий начала и конца различных вызываемых пользователем событий? Сел в тачку ID = 123, нажал педаль газа, на сервер улетел «газ», сервер взял параметры тачки 123 и она едет в памяти у сервера. Как её при этом отрисовывает клиент - пофигу. Факт в том, что другие не могут увидеть её едущей быстрее, чем она едет внутри сервера, а там она едет так, как предписывают главные серверные физические модели. На других клиентов идут координаты этой машины только из серверной копии виртуального мира... События столкновений и т.п. обсчитываются так же на сервере и рассылаются всем только оттуда, в том числе самому ездоку. Откуда возможность читерства?

Много где работает именно так. Делают на клиенте, потому что проще. А потом всякими античитами обмазываются.

Вот есть у меня такая игрушка, сделанная за 2 дня на коленке на JavaScript. http://dagoneev.no-ip.biz/game/ Зафигачить бы туда онлайн. Как я себе это представляю? На сервере крутится поток и 30 раз в секунду делает очередной шаг времени, вычисляя новое состояние мира с учётом имеющееся на данный момент состояние всех объектов «танк едет, снаряд летит, этот тут, тот здесь» и т.п. Если новости касаются твоего поля зрения, тебе отправляются данные.

Не понял. Танчики вроде шустро гоняют, часто стреляют. Что за квант в 30 сек?

staseg ★★★★★
()
Ответ на: комментарий от ii343hbka

Да я сам протупил. 30 раз в секунду он написал.

PS. Обычно хватает кванта 0.1 сек.

staseg ★★★★★
()

о
спрошу тут
всегда интересовало, куда деваются события, которые вертятся на сервере, летят на сервер, есть твой пинг раза в 2(например) больше периода квантования?
становятся в очередь?

ii343hbka ★★★
()
Последнее исправление: ii343hbka (всего исправлений: 1)

События столкновений и т.п. обсчитываются так же на сервере

Коллизии обычно считаются вместе с физикой на клиенте.

GAMer ★★★★★
()
Ответ на: комментарий от ii343hbka

Причем тут пинг? Все события просто льются в сеть. Если у тебя высокий пинг, ты будешь получать их с задержками (пока данные прольются по сети). Главное, чтобы у клиента была необходимая полоса пропускания.

staseg ★★★★★
()
Ответ на: комментарий от teod0r

пятна крови не простреливаются

ааа. это трупики

когда зажат шквальный огонь, если на его пути трупик, то через какое-то время огонь делается обрезанным на выходе из танка даже не доходя до преграды

teod0r ★★★★★
()
Ответ на: комментарий от GAMer

Проезд препятствий не требует полноценной физики на сервере, ничего не рожает.

staseg ★★★★★
()

События столкновений и т.п. обсчитываются так же на сервере и рассылаются всем только оттуда, в том числе самому ездоку. Откуда возможность читерства?

Согласен с тем оратором, который сказал, что это не вариант

shamaz
()

World of tanks держат всю логику на сервере, включая систему видимости. Да, это даёт абсолютную защиту от читов и валхаков, но есть проблемы:

  • сервер действительно сложный и требует мощных машин
  • если на сервере даже малейшие тормоза - это почувствуют все и сразу
  • во многих ситуациях игроку видно квантование движения и видимости (с видимостью совсем плохо, игроки всё время ноют)
  • в wot очень крутая и сложная система компенсации пинга, если бы не она, то простая езда была бы страшной болью с дёрганными движениями, заезжанием не туда и т.п.
legolegs ★★★★★
()
Ответ на: комментарий от legolegs

Про систему компенсации пинга я тоже думал, но интересно как выглядит «крутая и сложная». Где бы почитать? )

kiverattes ★☆
() автор топика
Ответ на: комментарий от shamaz

Каких именно мощностей у какого именно сервера?

kiverattes ★☆
() автор топика
Ответ на: комментарий от shamaz

На сервере можно делать простые проверки, на клиенте полные. Если кто-то обойдет проверки на клиенте, будет немного заезжать в сложные по геометрии фигуры, но будет натыкаться на сервере на более простые правила (можно еще прикрутить к этим событиям логгирование, и в вечер пятницы, под пиво, просматривать логи, орудуя банхамером)

Dantix ★★
()

Собственно соглашусь с предыдущим оратором - где-то так и работает MaNGOS - эмулятор WoW. И кстати код там неплохой и читабельный

xanf
()
Ответ на: комментарий от Dantix

О каких проверках идет речь? Даже если мы упростим геометрию и будем проверять на столкновения с ней, то это может привести к ложным срабатываниям (как положительным, так и отрицательным). И зачем тогда весь сыр бор?

shamaz
()
Ответ на: комментарий от Dantix

но будет натыкаться на сервере на более простые правила

А, я понял. Ну эдак всё равно не надежно и выглядеть будет фиговенько

shamaz
()

У нас в L2J (как и в оригинальном L2) было так. Клиент и сервер считают независимо, чтобы минизировать трафик. Периодически синхронизируются. Параметры сервера имеют безусловный перевес. Соответственно — никакие читы на тему скорости и т.п. просто невозможны.

Не представляю, зачем делать иначе :)

KRoN73 ★★★★★
()
Ответ на: комментарий от kiverattes

Про систему компенсации пинга я тоже думал, но интересно как выглядит «крутая и сложная». Где бы почитать? )

Компенсация пинга еще в Quake 3 появилась. Можно исходники посмотреть, тогда всё старались оптимизировать до предела в том числе и сетевую модель. Но все равно панкбастерами обмазывались.

Классика: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

Да это жесть, проще движок взять готовый (не обязательно от valve) чем все это с нуля написать.

Hope ★★
()
Ответ на: комментарий от shamaz

Только у читеров, не забывай, что подавляющее большинство игроков читы не использует.

Dantix ★★
()
Ответ на: комментарий от KRoN73

Периодически - это сколько по времени? Если я пробегающего мимо пассажира вортексом ударил на 100к, что будет, когда сервер осознает, что это немного некоректная ситуация. Или так только перемещение считается, а боевка - только сервером?

Dantix ★★
()
Ответ на: комментарий от Dantix

Периодически - это сколько по времени?

Раз в секунду обычно.

Если я пробегающего мимо пассажира вортексом ударил на 100к

А активные события, естественно, синхронизируются сразу. Т.е. если ты кого-то атакуешь (или просто кликаешь бег в новое место), то событие сразу уходит на сервер со всеми твоими данными. А сервер уже перепроверит. Если надо — проведёт лишнюю синхронизацию клиента.

Или так только перемещение считается, а боевка - только сервером?

Всё — параллельно. Т.е., когда ты бежишь, твои промежуточные координаты считаются и клиентом, и сервером. Когда аткуешь — клиент рисует красивую атаку, а сервер высчитывает повреждения и активную реакцию окружения, высылая результат клиенту.

KRoN73 ★★★★★
()
Ответ на: комментарий от Hope

Чё-то из википедии непонятно, в чём соль программы.

kiverattes ★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.