Протокол ТЗ

Материал из 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).
Обратная связь