Протокол ТЗ
Материал из TZ WiKi
В данной статье собрана информация по процессу обмена игрового сервера и клиента TimeZero.
Содержание |
Общие характеристики протокола
В игре используется протокол на основе XML, хотя в данный момент не соответствует стандарту в некоторых, довольно незначительных, деталях. При отправке данных на сервере происходит сжатие данных оригинальным методом. Некоторые наиболее часто повторяющиеся части пакетов заменяются на 2-х байтовые "коды". Например фрамент « " damage="» заменяется на последовательность байтов с кодами 0x01 и ASCII('p'). Весь обмен со всеми серверами происходит по протоколу TCP и порту 5190. Это относится только к "прямому" подключению к серверу, без использования прокси. Далее будет рассматриваться только такое подключение. Терминатор передачи-приёма - байт с кодом 0x00.
Процедура входа в игру
Клиент соединяется с сервером main.timezero.ru и отсылает пакет
<LIST l="$LOGIN$" />
Где $LOGIN$ - это имя персонажа в TimeZero. В ответ с сервера приходит ответ:
<LIST><S host="city1.timezero.ru" id="1" first="1" api="city1.local"/><S host="city2.timezero.ru" id="2" api="city2.local"/></LIST>
Затем клиент закрывает соединение main.timezero.ru и последовательно пытается присоединиться к перечисленным в пакете LIST серверам.
При соединении клиент ждёт прихода пакета вида
<KEY s="xkllcpsdqhayhsmkmgwldkaodaodrxjp"/>
Аттрибут s содержит ключ данного соединения с игрой. Он используется при шифровании пароля. Функция шифрования нестандартная. В клиенте код шифрования спрятан в "испорченном" байт-коде. Декомпиляция возможна только вручную, ни один известный автору декомпилятор не справился.
В ответ клиент посылает пакет вида
<LOGIN l="%s" p="%s" v="%s" v2="%s" lang="%s" v3="%s" />
Атрибут l - это имя персонажа, p - пароль(захешированный функцией шифрования ключом), v - версия клиента(число, на момент написания - 101), v2 - версия клиента в виде "6.4.9(1.4.2)", lang - язык(ru, en и т.п.), v3 - локальный IP адрес компьютера.
В ответ клиент может получить следующие пакеты:
<ERROR code="%d"/> <OK l="%s" ses="%s"/>
Вообще, пакет ERROR используется только при критических ошибках клиента и после его получения клиент обычно отсоединяется. В аттрибуте "code" содержится причина ошибки в виде числового кода:
- 1 - реконнект. Игрок находится на другом игровом сервере. Клиент отсоединяется и повторяет попытку соединится со следующим сервером в списке полученном в пакете LIST(что непонятно, можно в пакете LIST отдавать только один сервер, на котором игрок находится в данный момент)
- 3 - персонажем зашли с другого компьютера
- 5 - старая версия игры(аттрибут v в пакете LOGIN)
- 9 - идёт обновление игры. сервер недоступен.
TODO: описать остальные коды
Получение пакета OK означает, что вход осуществлён. В аттрибуте ses передаётся идентификатор игровой "сессии". Он используется при установке соединения с чатом и будет описан позже.
После этого начинается стандартный обмен.
Описание пакетов по группам
Для удобства разобъём все пакеты на группы. Во-первых, это пакеты от клиента серверу. Во-вторых от сервера клиенту. Так же пакеты разделим на категории.
Клиент -> Сервер
GETME
Запрос параметров игрока.
GETINFO
Запрос параметров другого персонажа.
- login – логин запрашиваемого персонажа.
GOBLD
Переход в здание на локации (или выход из здания на улицу).
- n – номер здания. Похоже, что номера присвоены зданиям в том порядке, в котором они создавались; на многих локациях не хватает промежуточных номеров между зданиями, что может указывать на некогда существовавшие там, но ныне удалённые постройки. Значение 0 указывает на улицу (выход из здания).
GOLOC
Переход на другую локацию.
- n – номер локации. Может принимать значения от 1 до 9, кроме 5 (это локация, в которой вы находитесь). Нумерация идёт построчно слева направо и сверху вниз. Например, для перехода на северо-запад n = 1, на север – n = 2 и т. д.
- d – неизвестно;
- t1 – неизвестно;
- t2 – неизвестно.
HD
Запрос, связанный с шахтой (когда персонаж находится внутри неё).
- go – указывается, если нужно перейти в другую штольню. Может принимать значения от 1 до 4: 1 – влево, 2 – вверх и далее по часовой.
- Другие параметры пока не обнаружены, но они обязаны быть.
N
Пустой запрос. Посылается серверу каждые 45 секунд бездействия для подтверждения того, что клиент всё ещё на линии.
SH
Запрос, связанный с магазином.
- c – указывается при запросе товаров определённой категории. Значение параметра – идентификатор категории. Список идентификаторов:
- k – холодное оружие;
- p – пистолеты;
- v – винтовки/автоматы;
- w – тяжёлое оружие;
- e – энергетическое оружие;
- g – метательное оружие;
- m – боевые устройства;
- a – патроны;
- i – энергомодули;
- h – каски/береты;
- c – куртки/бронежилеты;
- l – нарукавники;
- t – брюки;
- b – обувь;
- f – гражданская одежда;
- q – комплекты;
- j – оборудование;
- d – медицина;
- s – ресурсы;
- y – крафт-реагенты;
- r – документы;
- z - прочее;
- 0 – импланты;
- 1 – мои вещи;
- s – параметр, отвечающий за фильтр, применяемый к вещам. Значение параметра может быть пяти видов:
- Пустое значение – фильтр не применяется, отображаются все товары категории;
- lvl:X-Y – фильтр по уровню. Отображаются только вещи, имеющие требование уровня от X до Y;
- q:X-X – фильтр по качеству. Отображаются только вещи качеством не ниже X (забагованный фильтр);
- txt:STRING – фильтр по названию. Выводит только те вещи, в названии которых встречается строка STRING;
- name:NAME,type:X,lvl:Y – фильтр выводит только товар конкретного типа. NAME - судя по всему, внутреннее название вещи, X – целое число (назначение неизвестно, но название намекает), Y – требование вещи по уровню (очевидно, применяется для того, чтобы отличать рарный товар вроде assault'a с требованием 5 уровня или hi-tech'а с требованием 7-го);
- p – параметр, содержащий номер запрашиваемой страницы. Нумерация начинается с нуля, так что отображаемая вам в магазине страница на единицу больше, чем та, что содержалась в запросе;
- au – назначение неизвестно. Отправляется только в том случае, если вы запрашиваете данные с аукциона;
- buy – указывается при запросе на покупку товара. Содержит идентификатор конкретного товара в виде числа;
- count – количество товара, которое вы хотите купить (только если товар стакается);
- cost – цена товара, который вы хотите купить (за штуку);
- full – назначение неизвестно. Значение - целое число, посылается отдельно после покупки какой-либо вещи.
Сервер -> Клиент
MYPARAM
Содержит описание игрока, все перки, а также вещи. TODO: добавить описание аттрибутов.
CLIENT_STATUS
UPDATE_VER
Точно назначение и действие не известно, хотя название довольно прозрачное.
IMS
Это пакет, содержащий телеграммы и сообщения о продаже вещей. Аттрибуты:
- m - специальным образом отформатированные сообщения
- l - назначение неизвестно(FIXME).