Протокол ТЗ

Материал из TZ WiKi
Перейти к: навигация, поиск

В данной статье собрана информация по процессу обмена игрового сервера и клиента 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).
Обратная связь