Протокол ТЗ
В данной статье собрана информация по процессу обмена игрового сервера и клиента TimeZero.
Содержание |
Общие характеристики протокола
В игре используется протокол на основе XML, хотя в данный момент не соответствует стандарту в некоторых, довольно незначительных, деталях. При отправке данных на сервере происходит сжатие данных оригинальным методом. Некоторые наиболее часто повторяющиеся части пакетов заменяются на 2-х байтовые "коды". Например фрамент « " damage="» заменяется на последовательность байтов с кодами 0x01 и ASCII('p'). Весь обмен со всеми серверами происходит по протоколу TCP и порту 5190. Это относится только к "прямому" подключению к серверу, без использования прокси. Далее будет рассматриваться только такое подключение. Терминатор передачи-приёма - байт с кодом 0x00.
Процедура входа в игру
Клиент соединяется с сервером main.timezero.ru и отсылает пакет
<LIST l="$LOGIN$" />
Где $LOGIN$ - это имя персонажа в TimeZero(впоследствии, вместо логина клиент стал отсылать просто "qwerty"). В ответ с сервера приходит ответ:
<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 отдавать только один сервер, на котором игрок находится в данный момент);
- 2 - неверный пароль;
- 3 - персонажем зашли с другого компьютера;
- 4 - персонаж заблокирован;
- 5 - старая версия игры (аттрибут v в пакете LOGIN);
- 6 - для входа необходим электронный ключ;
- 7 - неверный электронный ключ;
- 8 - открыто ещё одно окно с игрой (устарело?);
- 9 - идёт обновление игры, сервер недоступен;
- 10 - сервер перегружен;
- 11 - язык клиента не соответствует языку сервера;
- 12 - попытка соединения не удалась (вероятно, на стороне сервера произошла необработанная ошибка).
Получение пакета OK означает, что вход осуществлён. В аттрибуте ses передаётся идентификатор игровой "сессии". Он используется при установке соединения с чатом и будет описан позже.
После этого начинается стандартный обмен.
Описание пакетов по группам
Для удобства разобъём все пакеты на группы. Во-первых, это пакеты от клиента серверу. Во-вторых от сервера клиенту. Так же пакеты разделим на категории.
Клиент -> Сервер
GETME
Запрос параметров игрока.
GETINFO
Запрос параметров другого персонажа.
- login – логин запрашиваемого персонажа.
GOBLD
Переход в здание на локации (или выход из здания на улицу).
- n – номер здания. Похоже, что номера присвоены зданиям в том порядке, в котором они создавались; на многих локациях не хватает промежуточных номеров между зданиями, что может указывать на некогда существовавшие там, но ныне удалённые постройки. Значение 0 указывает на улицу (выход из здания).
GOLOC
Переход на другую локацию. После перехода сервер присылает пакет вида <MYPARAM loc_time="1338738646" />. loc_time передаётся в t2, когда мы уходим с данной локации.
- n – номер локации. Может принимать значения от 1 до 9, кроме 5 (это локация, в которой вы находитесь). Нумерация идёт построчно слева направо и сверху вниз. Например, для перехода на северо-запад n = 1, на север – n = 2 и т. д.
- d – запрос у сервера информации по требуемым локациям после перехода(здания, монстры и т.д.). Нумерация такая же, как и в n. К примеру, d="147" означает, что сервер пришлёт информацию по локациям находящимся на северо-западе(1), западе(4) и юго-западе(7). Стоит заметить, что клиент хранит информацию о локациях, которые были запрошены ранее, потому, если клиенту известна информация о всех локациях вокруг той, в которую перешёл игрок - параметр 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:X – фильтр товаров при запросе данных аукциона.
- X=1 - показывать только товары магазина
- X=2 - показывать только товары аукциона (можно сделать ставку)
- X=3 - показывать всё товары;
- buy – указывается при запросе на покупку товара. Содержит идентификатор конкретного товара в виде числа;
- count – количество товара, которое вы хотите купить (только если товар стакается);
- cost – цена товара, который вы хотите купить (за штуку);
- full – назначение неизвестно. Значение - целое число, посылается отдельно после покупки какой-либо вещи.
CHAT
Пустой запрос. В ответ сервер присылает адрес сервера чата вида <CHAT server=\"chat.timezero.ru\" />. Стоит заметить, что ip-адрес домена chat.timezero.ru и main.timezero.ru совпадает.
Сервер -> Клиент
MYPARAM
Содержит описание игрока, все перки, а также вещи. Список атрибутов, присылаемых в этом пакете сильно варьируется. Большая часть приходит на запрос от клиента к серверу <GETME />, но во время игры они также приходят и по отдельности. Некоторые из них:
- time - время на сервере в секундах;
- exp - опыт персонажа;
- HP - очки жизни персонажа;
- maxHP - максимальное число очков жизни персонажа;
- psy - очки пси;
- maxPsy - максимальное количество очков пси;
- bio - очки био;
- maxBio - максимальное количество очков био;
- pro - целое число, обозначающее профессию;
- uniquest - целое число, обозначающее профессию на которую персонаж обучается;
- str - сила персонажа;
- dex - ловкость персонажа;
- int - интуиция персонажа;
- pow - выносливость персонажа;
- acc - меткость персонажа;
- intel - интеллект персонажа;
- X - позиция по X координате;
- Y - позиция по Y координате;
- cup_0 - количество медных монет;
- cup_1 - не известно, всегда 0;
- cup_2 - не известно, всегда 0;
- silv - количество серебряных монет;
- gold - количество золотых монет;
- p78money - перк-монеты;
- marks - эргон;
- pve_points - очки pve;
- hz - тип здания, в котором находится персонаж. Если персонаж находится на улице, то этот атрибут не присылается (0 по умолчанию);
- gametips - подсказки, которые игрок предпочёл более не показывать;
- lastlogin - время предыдущего входа в игру, timestamp;
- virus - далеко не заражение вирусом X, показатель биологического заражения;
- sk[n] - навыки владения оружием. Где n - число. Например, sk1 отвечает за пистолет, sk3 за тяжёлое вооружение;
- siluet - образ тела персонажа. Тип, тело, голова, волосы, оттенок;
- man - единица, если играем за мужчину;
- o - относится к вещам в рюкзаке. В пакете присутствует несколько атрибутов "o", каждый "o" относится к одному отдельному предмету. Включает в себя стоимость, название, очки действия на одевание и т.д.;
- loc_time - время на локации. Атрибут приходит при перемещении;
- id1 - вещественное число, назначение пока не выяснено;
- id2 - вещественное число, назначение пока не выяснено;
- hint - целое число, отвечает за сохранённую конфигурацию настроек в КПК;
- neednews - вероятно, указывает клиенту о надобности получения новостей. Название прозрачно, но точное назначение пока не выяснено;
- noduel - игнорировать вызовы на дуэль;
- gameflags - что-то связанное с настройками клиента;
- noUndress - с большей вероятностью не нулевой параметр означает пребывание на локации в которой нельзя переодеваться в бою(Батлзоны, Корал);
- ROOM - если персонаж в здании указывает на номер штольни(комнаты) в которой находится;
- loc_time - timestamp момента, когда можно будет перейти на другую локацию;
- list - список контактов;
- plist - список предметов на панели быстрого доступа;
- bsnow - значение равно 1 у персонажей начавших проходить квест "Первые хлопья тьмы". При включении снега на локации у таких игроков он будет отображаться чёрным;
- ill - параметр указывающий на вирус Х. "-1"-имунка, "2"-синий;
- repPVE - значение репутации Tramps;
- repP - значение репутации Палачей;
ERRGO
Приходит от сервера в случае ошибки при попытке перемещения (запрос GOLOC).
- code - код ошибки.
- 8 - выход из этой локации временно закрыт.
- 7 - недостаточно денег.
- 6 - персонажи ниже 3-го уровня не могут покидать купол.
- 5 - не прошло время ожидания на локации.
- 4 - низкий уровень жизни.
- 3 - персонаж перегружен.
- 2 - персонаж в бою или в процессе обмена.
- 1 - локация непроходима.
- t1 - то же значение, что было в пакете GOLOC
- t2 - то же значение, что было в пакете GOLOC
GOBLD
Приходит от сервера на запрос перехода в здание.
- n - номер здания, в которое перешли. "0" означает улицу. По непонятной причине дублируется;
- hz - идентификатор типа здания(арсенал, арена, портал и т.д.). Значение "0" означает улицу;
- owner - Значение равно "1", если в здание входит персонаж, имеющий ключ от данного; в противном случае значение равно "0".
SPECIAL
Пустой запрос. Назначение не известно.
CLIENT_STATUS
UPDATE_VER
Точно назначение и действие не известно, хотя название довольно прозрачное.
IMS
Это пакет, содержащий телеграммы и сообщения о продаже вещей. Аттрибуты:
- m - специальным образом отформатированные сообщения
- l - назначение неизвестно(FIXME).