↑↑↑
Об.св.
CL->LS
LS->CL
CL->GS
GS->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 - считайте что оно в фигурных скобках ^_^ )


В качестве благодарности, отправте хотябы копейку на: R276344948837 или Z259994239465


Содержание

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 - RequestAuthLogin 00 - RequestAuthLogin (RSA) 02 - RequestServerLogin 05 - RequestServerList 07 - 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 - Init 00 - Init (RSA) 01 - LoginFail 03 - LoginOk 04 - ServerList 06 - PlayFail 07 - PlayOk 0B - 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 - MoveBackwardToLocation 00 - ProtocolVersion 03 - EnterWorld 08 - RequestAuthLogin 0B - CharacterCreate 0C - CharacterDelete 0D - CharacterSelected 0E - NewCharacter 0F - RequestItemList 11 - RequestUnEquipItem 14 - UseItem 38 - Say2 48 - ValidatePosition 62 - CharacterRestore 63 - RequestQuestList 73 - RequestPrivateStoreManage A8 - NetPing D008 - 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 - FirstKey 01 - MoveToLocation 03 - CharInfo 04 - UserInfo 0B - SpawnItem 0C - DropItem 12 - DeleteObject 13 - CharacterSelectionInfo 15 - CharacterSelected 16 - NpcInfo 17 - NewCharacterSuccess 19 - CharacterCreateSuccess 1A - CharacterCreateFail 1B - ItemList 23 - CharacterDeleteSuccess 24 - CharacterDeleteFail 27 - InventoryUpdate 4A - Say2 80 - QuestList 9C - PrivateStoreMsg B9 - PrivateStoreMsgBuy D3 - NetPing DB - RecipeShopMsg F8 - SSQInfo FE1B - 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)
Копирование материала без ссылок на эту страницу, ЗАПРЕЩАЕТСЯ!