Автор данной статьи: 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 - 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) Копирование материала без ссылок на эту страницу, ЗАПРЕЩАЕТСЯ!
|
|