Мне было интересно, как многопользовательский протокол Half-Life 2 работает в таких модах, как Counter-Strike: Source или Day Of Defeat: Source. Я считаю, что они используют какой-то обфускацию и собственный алгоритм сжатия. Я хотел бы знать, как различные типы сообщений кодируются в пакете.
Как работает многопользовательский протокол Half-Life 2?
Ответы (5)
Half-Life 2, Counter-Strike: Source и другие игры используют движок Valves Source. У Valve есть вики для разработчиков, в которой рассказывается о многих вещах (прикольно посмотреть!). ..
Эти статьи могут вас заинтересовать:
Методы компенсации задержки во внутриигровом протоколе клиент/сервер, проектирование и оптимизация
Исходная многопользовательская сеть
Вам следует ознакомиться с документами Луиджи Ауриммаса о Half-Life. Там же вы найдете декодер пакетов и несколько дизассемблированных алгоритмов.
Информацию о обратном проектировании Half-Life 2 может быть трудно найти из-за ее важности для читерства. Я думаю, такие доски, как mpcforum, — лучший выбор.
Это действительно сложный вопрос, я предлагаю взглянуть на некоторые из сетевых игровых движков с открытым исходным кодом:
- http://www.hawksoft.com/hawknl/
- http://www.zoidcom.com/
- http://sourceforge.net/projects/opentnl
- http://www.gillius.org/gne/
Вы также можете посмотреть исходный код серии Quake, на которой основан оригинальный движок Half Life.
Хотя детали могут отличаться, общая структура довольно старая. Вот краткий обзор:
В ранних играх в жанре fps, таких как doom и Quake, позиция игрока обновлялась только в ответ на ответ сервера на вашу команду перемещения. То есть вы нажали кнопку перехода вперед, и клиент сообщил об этом серверу, сервер обновил вашу позицию в своей памяти, а затем передал новое игровое состояние вашему клиенту с вашей новой позицией. Это привело к очень запаздывающей игре: стрельба и даже движение в узких коридорах были игрой с предсказанием запаздывания.
Новые игры позволяют клиенту самостоятельно управлять стрельбой и движением игрока. Хотя это привело к плавному движению и стрельбе, это открыло больше возможностей для читерства путем взлома клиентского кода. Теперь каждый игрок перемещается и стреляет самостоятельно на своем компьютере и сообщает серверу о своих действиях. Это ломается только тогда, когда два игрока сталкиваются друг с другом или пытаются поймать усиление одновременно.
Теперь у сервера есть этот поток состояния клиента, поступающий от каждого игрока, и он должен синхронизировать их и сделать из них связную игру. Хитрость заключается в измерении задержки каждого игрока. Конечная цель состоит в том, чтобы иметь возможность стрелять из оружия с очень малой задержкой (например, из снайперской винтовки или рельсотрона) по врагу, движущемуся боком, и правильно попадать. Если известна задержка каждого игрока, предположим, что игрок А (задержка 50 мс) стреляет из пистолета по Б (задержка 60 мс). Чтобы сделать попадание, выстрел должен попасть в B, где B был 60 мс назад, откуда A был 50 мс назад.
Это очень приблизительный обзор, но он должен дать вам общее представление.
Я предлагаю вам изучить движки Quake 1-3. Они доступны с исходным кодом. Протокол Half-Life может быть немного другим, но, скорее всего, достаточно близким.