Packet info

↑↑↑Об.св.CL->LSLS->CLCL->GSGS->CL  ↓↓↓

Close

Автор данной статьи: KyberPrizrak  (мылo:

)

(создана/обновлена: 15.02.07г. - 6.07.07г.)

   Данная статья не появилась бы на свет, если бы не статья TechnoWiz@rd'a: Packets.htm, являющейся первой подобной статьей-справочником по пакетам Lineage2. Но в ней просто куууча грубейших ошибок, да и очень многих важных пакетов - попросту нету... В связи с чем я решил написать свою статью...

   Дизайн и структура данной статьи полностью скопированы со статьи TechnoWiz@rd'a. В остальном же все добывалось лично мной: структура пакетов бралась из исходников C4J-сервера, и тщательным образом сверялась с теми пакетами, которыми общаются C4ПТС-сервер и клиент (для этого использовались программы l2proxy и hLaPEx).

   Все, что находится в фигурных скобках {} - это те данные, в которых я частично или полностью не уверен! Осторожнее! (Все что касается RSA & GG - считайте что оно в фигурных скобках ^_^ )

Содержание

1. Общие сведения

2. Пакеты Client -> Login Server

3. Пакеты Login Server -> Client

4. Пакеты Client -> Game Server

5. Пакеты Game Server -> Client

1. Общие сведения

1.1. Процесс входа в игру:

1) Сразу после установки соединения сервер отправляет клиенту пакет Init

2) С этого момента, все следующие пакеты для/от LS зашифрованны Blowfish'ем, ключем является: Token + символ с кодом ноль (так что длина ключа не 20, а 21!)

3) Клиент отправляет пакет RequestAuthLogin, содержащий логин и пароль

4) Если авторизация прошла успешно, сервер присылает пакет LoginOk, содержащий SessionKey1. Иначе, сервер присылает пакет LoginFail, содержащий информацию о причине неудачной авторизации.

5) Клиент запрашивает список серверов отправляя пакет RequestServerList

6) Сервер присылает пакет ServerList, в котором содержится список доступных гейм серверов, с указанием IP-адресов/портов каждого сервера, его состояния, количеством игроков и некоторой другой информацией

7) Клиент отсылает пакет RequestServerLogin

8) Сервер проверяет, можно ли подключится к выбранному GS, если да - сервер присылает пакет PlayOk, содержащий SessionKey2. Иначе, сервер присылает пакет PlayFail, содержащий информацию почему нельзя подключится.

9) Теперь мы можем попрощатся с LS и закрыть соединение с ним. (мы получили от него все необходимые данные)

10) Открываем соединение с GS. (IP-адресс и порт сервера мы получили в пакете ServerList)

11) Клиент отправляет пакет ProtocolVersion

12) Сервер присылает пакет FirstKey, содержащий первые 4 байта ключа XorKey

13) С этого момента, все следующие пакеты для/от GS зашифрованны! (о шифровании и ключе - будет чуть ниже)

14) Клиент отправляет пакет RequestAuthLogin

15) Сервер присылает CharacterSelectionInfo, содержащий список чаров

16) [тут может идти общение с сервером по управлению чарами - создание, удаление, востановление. Вдаватся не буду, ибо вам это пока не нужно. Просто пропускаем этот пункт.]

17) Клиент отправляет пакет CharacterSelected, содержащий номер чара, которым мы хотим зайти

18) Сервер присылает пакет SSQInfo, он необходим клиенту для выбора цвета неба и луны.

19) Сервер присылает пакет CharacterSelected

20) Клиент отправляет пакет RequestManorList, и сразу же за ним отправляет пакет RequestQuestList

21) Сервер присылает пакет ExSendManorList

22) Сервер присылает пакет QuestList, но обратите внимание - в данный момент нам будет сказанно что квестов/итемов - ноль, даже если это не так

23) Клиент отправляет пакет EnterWorld - Поздравляю, мы в игре!

Замечание: GS через определенные интервалы времени (~60сек), присылает пакет NetPing, из которого мы должны сохранить значение, и вставив его в одноименный пакет NetPing, отправить серверу.

Дальше могу вас обрадовать - все просто до безобразия! ^_^

Кроме ответа на NetPing мы мы не обязанны чтолибо отсылать серверу. А значит можем бесконечно долго находится в игре и просто слушать то, что нам шлет сервер. Неизвестные пакеты мы просто игнорируем!

1.1.2 Общение с сервером по управлению чарами:

Создание:

1) Когда клиент открывает окошко создания чара, серверу отправляется пакет NewCharacter

2) Сервер присылает пакет NewCharacterSuccess, содержащий статы базовых классов в игре

3) При нажатии на кнопку создать, клиент оправляет пакет CharacterCreate

4) Если чар удачно создан, сервер присылает пакет CharacterCreateSuccess, и следом за ним присылает обновленный список чаров: CharacterSelectionInfo. Если же создать чара не удалось, сервер присылает пакет CharacterCreateFail, и возвращаемся в предыдущий пункт

Удаление:

1) Клиент отправляет пакет CharacterDelete, содержащий номер чара, которого мы хотим удалить

2) Если чар удачно удален, сервер присылает пакет CharacterDeleteSuccess, если же удалить чара не удалось, сервер присылает пакет CharacterDeleteFail

3) Удалось удалить чара или нет, сервер присылает обновленный список чаров: CharacterSelectionInfo

Востановление:

1) Клиент отправляет пакет CharacterRestore, содержащий номер чара, которого мы хотим востановить

2) Если востановление было удачно, сервер присылает обновленный список чаров: CharacterSelectionInfo, если же нет, то ничего.

1.2. Шифрация пакетов GameServer'a:

Чтобы не загружать ваши и без того замученные головы, вместо алгоритмов, я дам готовые исходники (немного измененные для наглядности):

    char key_sc[8];     char key_cs[8];      void Encrypt(char *raw, int size)      {          int temp = 0;         for (int i=0; i<size; i++)          {              int temp2 = raw[i] &0xff;              raw[i] = (char)(temp2 ^ (key_cs[i&7] &0xff) ^ temp);              temp = raw[i];          }         int old = key_cs[0] &0xff;          old |= key_cs[1] << 8 &0xff00;          old |= key_cs[2] << 0x10 &0xff0000;          old |= key_cs[3] << 0x18 &0xff000000;          old += size;          key_cs[0] = (char)(old &0xff);          key_cs[1] = (char)(old >> 0x08 &0xff);          key_cs[2] = (char)(old >> 0x10 &0xff);          key_cs[3] = (char)(old >> 0x18 &0xff);      }       void Decode(char *input, int size)     {         int i = 0;         int j = 0;         for(int k=0; k < size; k++)         {             int i1 = input[k] & 0xFF;             input[k] = (char)(i1 ^ key_sc[j++] & 0xFF ^i);             i = i1;             if(j>7) j=0;         }         long l = key_sc[0] & 0xFF;         l |= key_sc[1] << 8 & 0xFF00;         l |= key_sc[2] << 16 & 0xFF0000;         l |= key_sc[3] << 24 & 0xFF000000;         l += size;         key_sc[0] = (char)(l & 255L);         key_sc[1] = (char)(l >> 8 & 255L);         key_sc[2] = (char)(l >> 16 & 255L);         key_sc[3] = (char)(l >> 24 & 255L);     }       void Key(char* packet, int len)     {         key_sc[0] = packet[4];         key_sc[1] = packet[5];         key_sc[2] = packet[6];         key_sc[3] = packet[7];         key_sc[4] = (char)0xA1;         key_sc[5] = (char)0x6C;         key_sc[6] = (char)0x54;         key_sc[7] = (char)0x87;         for(i=0;i<8;i++) {key_cs[i]=key_sc[i];}     }      void add_ckecksum(unsigned char *raw, int count) //вычисляет чексумму и вставляет её в пакет     {                                                //как пользоватся: add_ckecksum(CelyjPaket+2, DlinaPaketa-(2+4+4));         unsigned long chksum = 0;         unsigned long ecx;         int i = 0;         for(i = 0; i < count; i += 4)         {             ecx  = (unsigned long)raw[i];             ecx |= (unsigned long)raw[i + 1]<<8;             ecx |= (unsigned long)raw[i + 2]<<16;             ecx |= (unsigned long)raw[i + 3]<<24;             chksum ^= ecx;         }         memcpy(raw+count, (char *)&chksum, 4);     }      void RSAKeyDecode(char* RSAKey)     {         for (int i = 0; i < 64; i++)         {             RSAKey[i + 64] ^= RSAKey[i];         }         for (int i = 0; i < 4; i++)         {             RSAKey[i + 13] ^= RSAKey[i + 52];         }         for (int i = 0; i < 64; i++)         {             RSAKey[i] ^= RSAKey[i + 64];         }         for (int i = 0; i < 4; i++)         {             BYTE tmp = RSAKey[i];             RSAKey[i] = RSAKey[i + 77];             RSAKey[i + 77] = tmp;         }     }  

Во первых заметьте, что после каждой шифрации или дешифрации ключ которым мы пользовались, будет изменен! И обратите особое внимание, у нас два ключа!!! Одним мы шифруем пакеты, которые мы отправляем серверу, вторым мы дешифруем пакеты которые сервер присылает нам. Процедура Key из данных пакета FirstKey устанавливает нам оба ключа (изначально ключи равны друг-другу).

Да, и забыл сказать - и Blowfish, и Xor-шифрация шифруют пакет начиная с третего байта! (т.е. первые два байта, означающие размер пакета - НЕ ШИФРУЮТСЯ НИКОГДА!!!)

P.S. тема "пишем своего бота" - все вопросы по пакетному уровню, или по написанию бота можете задавать туда

2. Пакеты Client -> Login Server

00 - RequestAuthLogin00 - RequestAuthLogin (RSA)02 - RequestServerLogin05 - RequestServerList07 - RequestGGAuth

RequestAuthLogin

Формат: 32 00           // Длина 00              // Тип XX XX XX XX XX XX XX XX XX XX XX XX XX XX       // Login (учтите, эта строка - массив из 14 символов) XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX // Password (... из 16 символов ...) 08 00 00 00 00 00 00 00 00 XX XX XX XX     // чексумма 00 00 00 00  Замечание: Если длина логина/пароля равна длине массива, то строка идет без ноль-терминатора!

RequestAuthLogin (RSA)

Формат: AA 00           // Длина 00              // Тип[начало зашифрованного блока] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 XX XX XX XX XX XX XX XX XX XX XX XX XX XX  // Login (учтите, эта строка - массив из 14 символов) XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX  // Password (... из 16 символов ...)[конец зашифрованного блока] XX XX XX XX     // GGAuthResponse из GGAuth XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX 08 00 00 00 00 00 00 00 00 XX XX XX XX     // чексумма 00 00 00 00  Замечание: Если длина логина/пароля равна длине массива, то строка идет без ноль-терминатора!

RequestGGAuth

Формат: 22 00           // Длина 07              // Тип XX XX XX XX     // ID сессии 23 92 90 4d 18 30 b5 7c 96 61 41 47 05 07 96 fb 00 00 00 f2 12 ba a9     // чексумма 00 00 00 00 

RequestServerLogin

Формат: 1A 00           // Длина 02              // Тип XX XX XX XX     // SessionKey1_FistPart из LoginOk XX XX XX XX     // SessionKey1_SecondPart из LoginOk XX              // ID сервера 00 00 00 00 00 00 XX XX XX XX     // чексумма 00 00 00 00 

RequestServerList

Формат: 1A 00           // Длина 05              // Тип XX XX XX XX     // SessionKey1_FistPart из LoginOk XX XX XX XX     // SessionKey1_SecondPart из LoginOk 04 00 00 00 00 00 00 XX XX XX XX     // чексумма 00 00 00 00 

3. Пакеты Login Server -> Client

00 - Init00 - Init (RSA)01 - LoginFail03 - LoginOk04 - ServerList06 - PlayFail07 - PlayOk0B - GGAuth

Init

Формат: 0B 00           // Длина 00              // Тип XX XX XX XX     // ID сессии XX XX XX XX     // Ревизия протокола, на моем сервере она равна 0x785A

Init (RSA)

Формат: 9B 00           // Длина 00              // Тип XX XX XX XX     // ID сессии XX XX XX XX     // Ревизия протокола[начало зашифрованного RSA-ключа] XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX [конец зашифрованного RSA-ключа] XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX // неизвестно для чего это (в яве тут нули)

GGAuth

Формат: 12 00           // Длина 0B              // Тип XX XX XX XX     // GGAuthResponse 00 00 00 00 00 00 00 XX XX XX XX     // чексуммаЗамечание: пакет из С4 ява

LoginFail

Формат: 12 00           // Длина 01              // Тип XX              // причина неудачной авторизации 00 00 00 00 00 00 XX XX XX XX     // чексумма 00 00 00 00  Причина:   0x03 - Password does not match this account.            0x07 - The account is already in use. Access denied.            0x12 - Your usage term has expired.  Please visit the official Lineage2 website at...   Замечание: в байтах 5-10, и последних четырех - часто попадается мусор...

LoginOk

Формат: 32 00           // Длина 03              // Тип XX XX XX XX     // SessionKey1_FistPart XX XX XX XX     // SessionKey1_SecondPart 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  XX XX XX XX     // чексумма 00 00 00 00  Замечание: в байтах 40-42, и последних четырех - часто попадается мусор...

ServerList

Формат: XX XX           // Длина 04              // Тип XX              // Количество серверов XX              // {номер LS}[начало повторяющегося блока] XX              // ID сервера XX XX XX XX     // IP-аддресс GS XX XX XX XX     // Port GS XX              // возрастной лимит XX              // PVP сервер: 1-да, 0 - нет XX XX           // Количество игроков онлайн XX XX           // Максимальное количество игроков XX              // Статус сервера: 1-UP, 0-DOWN XX XX XX XX     // {Статус сервера} XX              // {Статус сервера}[конец повторяющегося блока] 00 00 00 XX XX XX XX     // чексумма 00 00 00 00  Замечание: в последних 4 байтах и 2 байтах перед чексуммой - часто попадается мусор...

PlayFail

Формат: 12 00           // Длина 06              // Тип XX              // Причина 00 00 00 00 00 00 XX XX XX XX     // чексумма 00 00 00 00  Причина: { 0x08 - Access failed.  Please try again later... } Замечание: в байтах 5-10, и последних четырех - часто попадается мусор...

PlayOk

Формат: 1A 00           // Длина 07              // Тип XX XX XX XX     // SessionKey2_FistPart XX XX XX XX     // SessionKey2_SecondPart 01 00 00 00 00 00 00 XX XX XX XX     // чексумма 00 00 00 00  Замечание: в байтах 13-18, и последних четырех - часто попадается мусор...

4. Пакеты Client -> Game Server

01 - MoveBackwardToLocation00 - ProtocolVersion03 - EnterWorld08 - RequestAuthLogin0B - CharacterCreate0C - CharacterDelete0D - CharacterSelected0E - NewCharacter0F - RequestItemList11 - RequestUnEquipItem14 - UseItem38 - Say248 - ValidatePosition62 - CharacterRestore63 - RequestQuestList73 - RequestPrivateStoreManageA8 - NetPingD008 - RequestManorList

ProtocolVersion

Формат: 07 01           // Длина 00              // Тип XX XX XX XX     // ProtocolVersion [далее идет массив-константа, который хз от чего зависит, у меня он такой:] 09 07 54 56 03 09 0B 01 07 02 54 54 56 07 00 02 55 56 00 51 00 53 57 04 07 55 08 54 01 07 01 53 00 56 55 56 01 06 05 04 51 03 08 51 08 51 56 04 54 06 55 08 02 09 51 56 01 53 06 55 04 53 00 56 56 53 01 09 02 09 01 51 54 51 09 55 56 09 03 04 07 05 55 04 06 55 04 06 09 04 51 01 08 08 06 05 52 06 04 01 07 54 03 06 52 55 06 55 55 51 01 02 04 54 03 55 54 01 57 51 55 05 52 05 54 07 51 51 55 07 02 53 53 00 52 05 52 07 01 54 00 03 05 05 08 06 05 05 06 03 00 0D 08 01 07 09 03 51 03 07 53 09 51 06 07 54 0A 50 56 02 52 04 05 55 51 02 53 00 08 54 04 52 56 06 02 09 00 08 03 53 56 01 05 00 55 06 08 56 04 0D 06 07 52 06 07 04 0A 06 01 04 54 04 00 05 02 04 54 00 09 52 53 05 04 01 04 05 05 01 52 51 52 0D 06 51 08 09 54 53 00 0D 01 02 03 54 53 01 05 03 08 56 54 07 02 54 0B 06  Др.названия: VersionCheck, SendProtocolVersion Замечание: кто знает, от чего зависит этот "массив-константа", плз напишите мне на мыло:

RequestAuthLogin

Формат: XX XX           // Длина 08              // Тип XX XX ... 00 00 // Login (Unicode строка) XX XX XX XX     // SessionKey2_SecondPart XX XX XX XX     // SessionKey2_FistPart XX XX XX XX     // SessionKey1_FistPart XX XX XX XX     // SessionKey1_SecondPart 01 00 00 00  Др.названия: AuthLogin

CharacterSelected

Формат: 15 00           // Длина 0D              // Тип XX XX XX XX     // Номер чара 00 00 00 00 00 00 00 00 00 00 00 00 00 00  

RequestManorList

Формат: 05 00           // Длина D0              // Тип 08 00           // Подтип

RequestQuestList

Формат: 03 00           // Длина 63              // Тип

EnterWorld

Формат: 13 00           // Длина 03              // Тип 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

NetPing

Формат: 0F 00           // Длина A8              // Тип XX XX XX XX     // {ID пинга}, из пакета NetPing XX XX XX XX     // Пинг 00 08 00 00 

NewCharacter

Формат: 03 00           // Длина 0E              // Тип

CharacterCreate

Формат: XX XX           // Длина 0B              // Тип XX XX ... 00 00 // Имя создаваемого чара (Unicode строка) XX XX XX XX     // Race XX XX XX XX     // Sex XX XX XX XX     // ClassID XX XX XX XX     // INT XX XX XX XX     // STR XX XX XX XX     // CON XX XX XX XX     // MEN XX XX XX XX     // DEX XX XX XX XX     // WIT XX XX XX XX     // HairStyle XX XX XX XX     // HairColor XX XX XX XX     // Face  Замечание: STR,DEX,CON,INT,WIT,MEN - это базовые статы выбранного класса, знаем мы их из пакета NewCharacterSuccess (но на самом деле, сервер их игнорирует!) 

CharacterDelete

Формат: 07 00           // Длина 0C              // Тип XX XX XX XX     // Номер чара

CharacterRestore

Формат: 07 00           // Длина 62              // Тип XX XX XX XX     // Номер чара

Say2

Формат: XX XX           // Длина 38              // Тип XX XX ... 00 00 // Отправляемое сообщение (Unicode строка) XX XX XX XX     // Тип сообщения (аналогичен Say2) XX XX ... 00 00 // Имя получателя (Unicode строка)  Замечание: Имя получателя - присутсвует только если "Тип сообщения" = 2 (т.е. только если это приватное сообщение!)

RequestItemList

Формат: 03 00           // Длина 0F              // Тип

UseItem

Формат: 0B 00           // Длина 14              // Тип XX XX XX XX     // ObjectID 00 00 00 00 

RequestUnEquipItem

Формат: 07 00           // Длина 11              // Тип XX XX XX XX     // BodyPart: 1 - Under                              2 - REar                              4 - LEar                              8 - Neck                             16 - RFinger                             32 - LFinger                             64 - Head                            128 - RHand                            256 - LHand                            512 - Gloves                           1024 - Chest                           2048 - Legs                           4096 - Feet                           8192 - Back                           16384- LRHand                           32768- Hair

MoveBackwardToLocation

Формат: 1F 00           // Длина 01              // Тип XX XX XX XX     // DestX XX XX XX XX     // DestY XX XX XX XX     // DestZ XX XX XX XX     // CurX XX XX XX XX     // CurY XX XX XX XX     // CurZ XX XX XX XX     // Для передвижения используем клаву или мышь? (0-клава 1-мышь)

ValidatePosition

Формат: 17 00           // Длина 48              // Тип XX XX XX XX     // CurX XX XX XX XX     // CurY XX XX XX XX     // CurZ XX XX XX XX     // Heading 00 00 00 00     // ???

RequestPrivateStoreManage

Формат: 03 00           // Длина 73              // ТипДр.названия: RequestPrivateStoreManageSell, TradeRequest

5. Пакеты Game Server -> Client

00 - FirstKey01 - MoveToLocation03 - CharInfo04 - UserInfo0B - SpawnItem0C - DropItem12 - DeleteObject13 - CharacterSelectionInfo15 - CharacterSelected16 - NpcInfo17 - NewCharacterSuccess19 - CharacterCreateSuccess1A - CharacterCreateFail1B - ItemList23 - CharacterDeleteSuccess24 - CharacterDeleteFail27 - InventoryUpdate4A - Say280 - QuestList9C - PrivateStoreMsgB9 - PrivateStoreMsgBuyD3 - NetPingDB - RecipeShopMsgF8 - SSQInfoFE1B - ExSendManorList

FirstKey

Формат: 10 00           // Длина 00              // Тип XX              // Неизвестно XX XX XX XX     // XorKey_FistPart 01 00 00 00  01 00 00 00  Др.названия: KeyPacket, XorKey

CharacterSelectionInfo

Формат: XX XX            // Длина 13               // Тип XX XX XX XX      // количество чаров[начало повторяющегося блока] XX XX ... 00 00  // Name (Unicode строка) XX XX XX XX      // Char ID XX XX ... 00 00  // Login (Unicode строка) XX XX XX XX      // Session ID XX XX XX XX      // Clan ID 00 00 00 00 XX XX XX XX      // Sex XX XX XX XX      // Race XX XX XX XX      // BaseClass ID 01 00 00 00 XX XX XX XX      // X XX XX XX XX      // Y XX XX XX XX      // Z XX XX XX XX XX XX XX XX  // HP (вещественный тип - Double) XX XX XX XX XX XX XX XX  // MP (вещественный тип - Double) XX XX XX XX      // SP XX XX XX XX      // EXP XX XX XX XX      // lvl XX XX XX XX      // Karma 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 XX XX XX XX      // ItemObjectID Under XX XX XX XX      // ItemObjectID REar XX XX XX XX      // ItemObjectID LEar XX XX XX XX      // ItemObjectID Neck XX XX XX XX      // ItemObjectID RFinger XX XX XX XX      // ItemObjectID LFinger XX XX XX XX      // ItemObjectID Head XX XX XX XX      // ItemObjectID RHand XX XX XX XX      // ItemObjectID LHand XX XX XX XX      // ItemObjectID Gloves XX XX XX XX      // ItemObjectID Chest XX XX XX XX      // ItemObjectID Legs XX XX XX XX      // ItemObjectID Feet XX XX XX XX      // ItemObjectID Back XX XX XX XX      // ItemObjectID LRHand XX XX XX XX      // ItemObjectID Hair XX XX XX XX      // ItemID Under XX XX XX XX      // ItemID REar XX XX XX XX      // ItemID LEar XX XX XX XX      // ItemID Neck XX XX XX XX      // ItemID RFinger XX XX XX XX      // ItemID LFinger XX XX XX XX      // ItemID Head XX XX XX XX      // ItemID RHand XX XX XX XX      // ItemID LHand XX XX XX XX      // ItemID Gloves XX XX XX XX      // ItemID Chest XX XX XX XX      // ItemID Legs XX XX XX XX      // ItemID Feet XX XX XX XX      // ItemID Back XX XX XX XX      // ItemID LRHand XX XX XX XX      // ItemID Hair XX XX XX XX      // HairStyle XX XX XX XX      // HairColor XX XX XX XX      // Face XX XX XX XX XX XX XX XX  // MaxHP (вещественный тип - Double) XX XX XX XX XX XX XX XX  // MaxMP (вещественный тип - Double) XX XX XX XX      // Delete (количество секунд до удаления) XX XX XX XX      // Class ID XX XX XX XX      // Last Used? (for auto-select char) XX               // Enchant Effect (на сколько заточенна пушка)[конец повторяющегося блока]Др.названия: CharSelectInfo

SSQInfo

Формат: 05 00           // Длина F8              // Тип XX XX           // кто победил в Seven Signs:                     258: Dawn                     257: Dusk                     { 256: None }Др.названия: SignsSky

CharacterSelected

Формат: XX XX            // Длина 15               // Тип XX XX ... 00 00  // CharName (Unicode строка) XX XX XX XX      // Char ID XX XX ... 00 00  // { Title (Unicode строка) } XX XX XX XX      // Session ID XX XX XX XX      // Clan ID 00 00 00 00 XX XX XX XX      // Sex XX XX XX XX      // Race XX XX XX XX      // { Class ID } 01 00 00 00 XX XX XX XX      // X XX XX XX XX      // Y XX XX XX XX      // Z XX XX XX XX XX XX XX XX  // HP (вещественный тип - Double) XX XX XX XX XX XX XX XX  // MP (вещественный тип - Double) XX XX XX XX      // SP XX XX XX XX      // EXP XX XX XX XX      // lvl XX XX XX XX      // Karma 00 00 00 00 XX XX XX XX      // STR XX XX XX XX      // DEX XX XX XX XX      // CON XX XX XX XX      // INT XX XX XX XX      // WIT XX XX XX XX      // MEN[дальше идет муть какаято, в которой я так и не разобрался (зависит от ProtocolVersion)] 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 XX XX 00 00      // { in-game time??? } 00 00 00 00 XX 00 00 00      // неизвестно 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  Др.названия: CharSelected

ExSendManorList

Формат: XX XX            // Длина FE               // Тип 1B 00            // Подтип XX XX XX XX      // количество территорий, где можно манорить[начало повторяющегося блока] XX XX XX XX      // номер XX XX ... 00 00  // имя территории (Unicode строка)[конец повторяющегося блока]

QuestList

!!! этот пакет не доделан!!!  Формат: XX XX           // Длина 80              // Тип XX XX           // Количество незавершенных квестов[начало повторяющегося блока 1] XX XX XX XX      // Quest ID XX XX XX XX      // Stage of quest progress[конец повторяющегося блока 1] XX XX           // {Количество какихто итемов}[начало повторяющегося блока 2] XX XX XX XX      // dropItemObjID XX XX XX XX      // dropItemID XX XX XX XX      // dropItemCount XX XX XX XX      // неизвестно[конец повторяющегося блока 2]   !!! этот пакет не доделан!!! 

NetPing

Формат: 07 00           // Длина D3              // Тип XX XX XX XX     // {ID пинга}

NewCharacterSuccess

Формат: XX XX           // Длина 17              // Тип XX XX XX XX     // Количество базовых классов в игре[начало повторяющегося блока] XX XX XX XX      // расса XX XX XX XX      // класс 46 00 00 00 XX XX XX XX      // STR 0a 00 00 00 46 00 00 00 XX XX XX XX      // DEX 0a 00 00 00 46 00 00 00 XX XX XX XX      // CON 0a 00 00 00 46 00 00 00 XX XX XX XX      // INT 0a 00 00 00 46 00 00 00 XX XX XX XX      // WIT 0a 00 00 00 46 00 00 00 XX XX XX XX      // MEN 0a 00 00 00 [конец повторяющегося блока]Др.названия: CharTemplates

CharacterCreateSuccess

Формат: 07 00           // Длина 19              // Тип 01 00 00 00  Др.названия: CharCreateOk

CharacterCreateFail

Формат: 07 00           // Длина 1A              // Тип XX XX XX XX     // Причина: 0x02 - Name already exists.Др.названия: CharCreateFail

CharacterDeleteSuccess

Формат: 03 00           // Длина 23              // ТипДр.названия: CharDeleteOk

CharacterDeleteFail

Формат: 07 00           // Длина 24              // Тип XX XX XX XX     // ПричинаДр.названия: CharDeleteFail

UserInfo

!!! этот пакет не доделан!!!  Формат: XX XX            // Длина 04               // Тип XX XX XX XX      // X XX XX XX XX      // Y XX XX XX XX      // Z 00 00 00 00 XX XX XX XX      // ObjectId XX XX ... 00 00  // Name (Unicode строка) XX XX XX XX      // Race XX XX XX XX      // Sex XX XX XX XX      // ClassId XX XX XX XX      // lvl XX XX XX XX      // Exp XX XX XX XX      // STR XX XX XX XX      // DEX XX XX XX XX      // CON XX XX XX XX      // INT XX XX XX XX      // WIT XX XX XX XX      // MEN XX XX XX XX      // MaxHP XX XX XX XX      // CurrentHP XX XX XX XX      // MaxMP XX XX XX XX      // CurrentMP XX XX XX XX      // SP XX XX XX XX      // CurrentLoad XX XX XX XX      // MaxLoad 28 00 00 00 XX XX XX XX      // ItemObjectID Under XX XX XX XX      // ItemObjectID REar XX XX XX XX      // ItemObjectID LEar XX XX XX XX      // ItemObjectID Neck XX XX XX XX      // ItemObjectID RFinger XX XX XX XX      // ItemObjectID LFinger XX XX XX XX      // ItemObjectID Head XX XX XX XX      // ItemObjectID RHand XX XX XX XX      // ItemObjectID LHand XX XX XX XX      // ItemObjectID Gloves XX XX XX XX      // ItemObjectID Chest XX XX XX XX      // ItemObjectID Legs XX XX XX XX      // ItemObjectID Feet XX XX XX XX      // ItemObjectID Back XX XX XX XX      // ItemObjectID LRHand XX XX XX XX      // ItemObjectID Hair XX XX XX XX      // ItemID Under XX XX XX XX      // ItemID REar XX XX XX XX      // ItemID LEar XX XX XX XX      // ItemID Neck XX XX XX XX      // ItemID RFinger XX XX XX XX      // ItemID LFinger XX XX XX XX      // ItemID Head XX XX XX XX      // ItemID RHand XX XX XX XX      // ItemID LHand XX XX XX XX      // ItemID Gloves XX XX XX XX      // ItemID Chest XX XX XX XX      // ItemID Legs XX XX XX XX      // ItemID Feet XX XX XX XX      // ItemID Back XX XX XX XX      // ItemID LRHand XX XX XX XX      // ItemID Hair XX XX XX XX      // P.Atk XX XX XX XX      // P.Atk Speed XX XX XX XX      // P.Def XX XX XX XX      // EvasionRate XX XX XX XX      // Accuracy XX XX XX XX      // CriticalHit XX XX XX XX      // M.Atk XX XX XX XX      // Casting Speed XX XX XX XX      // P.Atk Speed XX XX XX XX      // M.Def XX XX XX XX      // Чар в режиме PvP? XX XX XX XX      // Karma[дальше идет муть, в которой я пока не разобрался] ?? ?? ... ?? ??  !!! этот пакет не доделан!!! 

Say2

Формат: XX XX            // Длина 4A               // Тип XX XX XX XX      // Object Id того чара, от кого это сообщение XX XX XX XX      // Тип сообщения XX XX ... 00 00  // Имя чара, от кого это сообщение (Unicode строка) XX XX ... 00 00  // Само сообщение (Unicode строка)Тип сообщения: 0x00 - General                0x01 - Shout                0x02 - Whisper                0x03 - Party                0x04 - Clan                0x08 - Trade                0x09 - Alliance                0x0A - Announcement  Др.названия: CreatureSay

NpcInfo

!!! этот пакет не доделан!!!  Формат: XX XX            // Длина 16               // Тип XX XX XX XX      // Object Id XX XX XX XX      // NpcTypeId (NpcID + 1000000) XX XX XX XX      // Можно ли атаковать этого NPC? XX XX XX XX      // X XX XX XX XX      // Y XX XX XX XX      // Z XX XX XX XX      // Heading (угол относительно вида сверху, перевод_в_градусы=Heading/65536*360)[дальше идет муть, в которой я пока не разобрался] ?? ?? ... ?? ??  !!! этот пакет не доделан!!! 

MoveToLocation

Формат: 1F 00            // Длина 01               // Тип XX XX XX XX      // Object Id XX XX XX XX      // DestX XX XX XX XX      // DestY XX XX XX XX      // DestZ XX XX XX XX      // CurX XX XX XX XX      // CurY XX XX XX XX      // CurZЗамечание: Dest - в какую точку движется объект, Cur - текущее положение объекта Обратите внимание, что клиент сам определяет положение объекта пока тот движется между этими двумя точками. (надеюсь все помнят: Расстояние = Скорость * Время)

CharInfo

!!! этот пакет не доделан!!!  Формат: XX XX            // Длина 03               // Тип XX XX XX XX      // X XX XX XX XX      // Y XX XX XX XX      // Z XX XX XX XX      // Heading (угол относительно вида сверху, перевод_в_градусы=Heading/65536*360) XX XX XX XX      // ObjectID XX XX ... 00 00  // Name (Unicode строка) XX XX XX XX      // Race XX XX XX XX      // Sex XX XX XX XX      // Class ID  XX XX XX XX      //  XX XX XX XX      // [дальше идет муть, в которой я пока не разобрался] ?? ?? ... ?? ??  !!! этот пакет не доделан!!! 

DeleteObject

Формат: 0B 00            // Длина 12               // Тип XX XX XX XX      // Object Id 00 00 00 00 

SpawnItem

Формат: 23 00            // Длина 0B               // Тип XX XX XX XX      // Object ID XX XX XX XX      // Item ID XX XX XX XX      // X XX XX XX XX      // Y XX XX XX XX      // Z XX XX XX XX      // Stackable XX XX XX XX      // Count 00 00 00 00 

ItemList

Формат: XX XX            // Длина 1B               // Тип XX XX            // ShowWindow (Надо открыть окно инвентаря?) XX XX            // ItemCount[начало повторяющегося блока] XX XX            // ItemType1 XX XX XX XX      // ObjectID XX XX XX XX      // ItemID XX XX XX XX      // Count XX XX            // ItemType2 XX XX            // ??? XX XX            // isEquipped (1-да, 0-нет) XX XX XX XX      // BodyPart (параметр бесполезен - не различает положение R/L бижи) XX XX            // EnchantLevel XX XX            // ???[конец повторяющегося блока] ItemType1: 0-Weapon/Earring/Ring/Necklace            1-Helmet/Chest/Legs/Boots/Gloves            2-Shield            4-Item/QuestItem/Adena  ItemType2: 0-Weapon            1-Helmet/Chest/Legs/Boots/Gloves/Shield            2-Earring/Ring/Necklace            3-QuestItem            4-Adena            5-Item

DropItem

Формат: 27 00            // Длина 0C               // Тип XX XX XX XX      // Object ID того, кто дропнул предмет (игрок/Npc) XX XX XX XX      // Object ID предмета XX XX XX XX      // Item ID XX XX XX XX      // X XX XX XX XX      // Y XX XX XX XX      // Z XX XX XX XX      // Stackable XX XX XX XX      // Count 00 00 00 00 

PrivateStoreMsgBuy

Формат: XX XX            // Длина B9               // Тип XX XX XX XX      // ObjectID торговца XX XX ... 00 00  // StoreMsg (Unicode строка)  Др.названия: PrivateStoreBuyMsg

PrivateStoreMsg

Формат: XX XX            // Длина 9C               // Тип XX XX XX XX      // ObjectID торговца XX XX ... 00 00  // StoreMsg (Unicode строка)  Др.названия: PrivateStoreMsgSell

RecipeShopMsg

Формат: XX XX            // Длина DB               // Тип XX XX XX XX      // ObjectID торговца XX XX ... 00 00  // StoreMsg (Unicode строка)

InventoryUpdate

Формат: XX XX            // Длина 27               // Тип XX XX            // ItemCount[начало повторяющегося блока] XX XX            // Update type (1-add, 2-modify, 3-remove) XX XX            // ItemType1 XX XX XX XX      // ObjectID XX XX XX XX      // ItemID XX XX XX XX      // Count XX XX            // ItemType2 XX XX            // ??? XX XX            // isEquipped (1-да, 0-нет) XX XX XX XX      // BodyPart (параметр бесполезен - не различает положение R/L бижи) XX XX            // EnchantLevel XX XX            // ???[конец повторяющегося блока]Замечание: ItemType1, ItemType2 - аналогично ItemList

Сервер, на котором проводились исследования:

1) ПТС C4 сервер

2) RSA - нету

3) GG - нету (убит)

4) антиботы - никаких

5) ProtocolVersion=656

6) данные которые идут в пакете ProtocolVersion указанны тут.

7) Protocol=30810 (в пакете Init)

Все, что находится в фигурных скобках {} - это те данные, в которых я частично или полностью не уверен! Осторожнее!

Copyright (C) 2007 La2Kings (KyberPrizrak)

Копирование материала без ссылок на эту страницу, ЗАПРЕЩАЕТСЯ!