1. Общие сведения
2. Пакеты Client -> Login Server
3. Пакеты Login Server -> Client
4. Пакеты Game Server -> Client
5. Пакеты Client -> Game Server
1. Общие сведения
1) Каждый пакет состоит из размера пакета(2 байта), типа пакета(1 байт) и блока параметров(переменная длина). В
пакетах логин
серверу в конце пакета добавляется контрольная сумма и дополняется нулями так, чтобы размер пакета был кратен 8-ми
байтам.
2) Строки в пакетах представлены байтами ANSI разделенными нулями, признаком конца строки является два нуля подряд.
Пример: 'A', 0x00, 'B', 0x00, 'C', 0x00, 0x00, 0x00
3) Байты в словах и двойных словах высылаются в обратном порядке. Т.е. если надо отправить число 1, то его следует
записать
как 01 00 00 00, а не 00 00 00 01.
4) Контрольная сумма пакета расчитывается так:
unsigned long checksum( unsigned char *packet, int count )
{
long chksum = 0L;
for( int i = 0; i < count; i += 4 ) chksum ^= *((unsigned long *)&raw);
return chksum;
};
5) Процесс соединения с гейм сервером:
1. Сразу после установки соединения сервер отправляет клиенту пакет Init
2. В ответ на него клиент отправляет пакет RequestGGAuth
3. Сервер отвечает на него пакетом GGAuth
4. Если сервер ответил, что авторизация прошла успешно, то клиент высылает пакет RequestAuthLogin, содержащий логин
и пароль
5. Проверка логина и пароля, в случае неудачи, сервер высылает пакет LoginFail, инатче LoginOk, содержащий session
key #1.
Для явы он постоянный.
6. Далее клиент запрашивает список серверов пакетом RequestServerList
7. В ответ на этот пакет сервер высылает клиенту ServerList, в нем содержиться список серверов и их IP адреса с
номерами портов.
8. После выбора game-сервера, и нажатия на ОК, клиент отсылает пакет RequestServerLogin
9. LoginServer выполняет проверки на бан, максимальное количество игроков, доступность сервера и т.п., если все
проверки пройдены,
то высылает пакет PlayOk, содержащий session key #2, этот ключь генерируется из текущего времени системы в мс,
номера сокета и еще всякой лабуды.
10. После этого клиент высылает пакет AuthLogin выбраному серверу, содержащий session key #1, session key #2 и
логин, необходимые
для генерации ключа по которому будет шифроваться весь трафик.
11. Сервер высылает пакет PlayOk, содержащий список чаров
2. Пакеты от клиетна серверу (Login Server)
00 - RequestAuthLogin
02 - RequestServerLogin
05 - RequestServerList
07 - RequestGGAuth
--------------------------------------------------------------------------------
RequestAuthLogin
Назначение: запрашивает авторизацию на логин сервере
Формат:
00
XX XX XX XX 00 00 // строка содержащая логин
XX XX XX XX 00 00 // строка содержащая пароль
08 // маркер конца секции логин/пароль
00 00 00 00 00 00 00 00 // не используется
XX XX XX XX // контрольная сумма
00 00 00 00 // выравнивание размера пакета
--------------------------------------------------------------------------------
RequestServerLogin
Назначение: запрашивает подключение к гейм серверу
Формат:
02
--------------------------------------------------------------------------------
RequestServerList
Назначение: запрашивает список game серверов
Формат:
05
??
--------------------------------------------------------------------------------
RequestGGAuth
Назначение: запрашивает Game Guard авторизицию
Формат:
07
??
--------------------------------------------------------------------------------
3. Пакеты от сервера клиенту (Login Server)
00 - Init
01 - LoginFail
03 - LoginOk
04 - ServerList
04 - PlayOk
0B - GGAuth
--------------------------------------------------------------------------------
Init
Назначение: передает клиенту список серверов и их состояние
Формат:
00
XX XX XX XX // ID сессии
XX XX XX XX // Ревизия протокола 0x785a или 0xc62
// Публичный ключ
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX
// Неизвестно
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
--------------------------------------------------------------------------------
LoginFail
Назначение: сообщает о неудачной попытке подключения к логин серверу
Формат:
01
XX XX XX XX // причина неудачи:
// 0x01 - системная ошибка
// 0x02 - неправельный пароль
// 0x03 - логин или пароль неверен
// 0x04 - доступ запрещен
// 0x05 - информация на аккаунте неверна(хз, наверно имеется ввиду ошибка в БД)
// 0x07 - аккаунт уже используется
// 0x09 - аккаунт забанен
// 0x10 - на сервере идут сервисные работы
// 0x12 - срок действия истек
// 0x13 - на аккаунте не осталось больше времени (видимо NCSoft собирается или собиралось заморочить и почасовую
оплату
--------------------------------------------------------------------------------
LoginOk
Назначение: высылается в подтсверждение на пакет RequestAuthLogin, в случае успешной проверки логина и пароля.
Формат:
03
XX XX XX XX // ? На яве 0x55555555
XX XX XX XX // session id. Это первая часть session id, для явы он постоянный
00 00 00 00
00 00 00 00
EA 03 00 00
00 00 00 00
00 00 00 00
02 00 00 00
XX XX XX XX // контрольная сумма
00 00 00 00 // выравнивание размера пакета
00 00 00 00
00 00 00
--------------------------------------------------------------------------------
ServerList
Назначение: передает клиенту список серверов и их состояние
Формат:
04
XX // количество серверов в списке
00 // неиспользуется или зарезервировано
// <<<<< Следующий блок повторяется для каждлого сервера в списке
XX // ID сервера
XX XX XX XX // IP аддрес гейм сервера
XX XX XX XX // порт сервера
XX // возрастной лимит
XX // PVP сервер: 00 - нет, 01 - да
XX XX // количество игроков онлайн
XX XX // максимальное количество игроков
XX // тестовый сервер: 00 - нет, 01 - да
XX XX XX XX // контрольная сумма
00 00 00 00 // выравнивание размера пакета
00 00 00 00
00
--------------------------------------------------------------------------------
PlayOk
Назначение: ответ на запрос авторизации на game-сервере
Формат:
07
XX XX XX XX // session id #2, вторая половина ключа сессии, генерируется случайно
?? ?? ?? ?? // непонятно, ява просто ставит тут 0x55667788
XX XX XX XX // контрольная сумма
00 00 00 00 // выравнивание размера пакета
00 00 00 00
00
--------------------------------------------------------------------------------
GGAuth
Назначение: ответ на запрос GameGuard авторизации
Формат:
0B
XX XX XX XX // ответ:
// 0x0B - Пропустить авторизацию
--------------------------------------------------------------------------------
4. Пакеты от сервера клиенту (Game Server)
01 - CharMoveToLocation
14 - AuthLoginFail
19 - CharCreateOk
1A - CharCreateFail
23 - CharDeleteOk
24 - CharDeleteFail
2F - ChangeWaitType
38 - TeleportToLocation
3E - ChangeMoveType
E1 - ChairSit
--------------------------------------------------------------------------------
CharMoveToLocation
Назначение: сообщает клиенту что чар переместился
Формат:
01
XX XX XX XX // ID объекта
XX XX XX XX // Текущее положение X
XX XX XX XX // Текущее положение Y
XX XX XX XX // Текущее положение Z
XX XX XX XX // Точка назначения X
XX XX XX XX // Точка назначения Y
XX XX XX XX // Точка назначения Z
--------------------------------------------------------------------------------
AuthLoginFail
Назначение: сообщает клиенту game-сервер отверг запрос на подключение
Формат:
14 // и/или 12 ???
XX XX XX XX // Причина:
// 0x00 - Текста нет
// 0x01 - Системная ошибка
// 0x02 - Пароль не соответствует аккаунту (причем тут тут game server ??? ему пароль даже не высылается Oo)
// 0x03 - Пароль не соответствует аккаунту (опять 25, корейцы млин)
// 0x04 - Попытка доступа неудачна, попробуйте позже.
// 0x05 - Неверный аккаунт, свяжитесь с службой поддержки
// 0x06 - Попытка доступа неудачна, попробуйте позже.(что-то у них многовато кодов на одну ошибку)
// 0x07 - Аккаунт уже используется(это вроде тоже логин сервер проверять должен)
// 0x08 - Попытка доступа неудачна, попробуйте позже.
// 0x09 - Попытка доступа неудачна, попробуйте позже.
// 0x10 - Попытка доступа неудачна, попробуйте позже.
--------------------------------------------------------------------------------
CharCreateOk
Назначение: сообщает клиенту что создание чара успешно завершено
Формат:
19
01
--------------------------------------------------------------------------------
CharCreateFail
Назначение: сообщает клиенту что попытка создания чара авершилась неудачей
Формат:
1A
XX XX XX XX // Причина:
// Creation Failed
// Слишком много чаров на акке
// Имя чара уже существует
// 16 eng chars. (слишком длинное имя ???)
--------------------------------------------------------------------------------
CharDeleteOk
Назначение: сообщает клиенту что удаление чара прошло успешно
Формат:
23
--------------------------------------------------------------------------------
CharDeleteFail
Назначение: сообщает клиенту что удаление чара завершилось неудачей
Формат:
24
--------------------------------------------------------------------------------
ChangeWaitType
Назначение: сообщает клиенту что чар изменил wait тип(незнаю как это лучше на русский перевести :-/ Короче по
параметрам понятоно что это такое)
Формат:
2F
XX XX XX XX // ID чара
XX XX XX XX // wait тип:
// 00 - сидеть
// 01 - стоять
// 02 - fake death
// 03 - отменить fake death
XX XX XX XX // X
XX XX XX XX // Y
XX XX XX XX // Z
--------------------------------------------------------------------------------
TeleportToLocation
Назначение: сообщает клиенту что чар телепортировался
Формат:
38
XX XX XX XX // ID чара
XX XX XX XX // X
XX XX XX XX // Y
XX XX XX XX // Z
--------------------------------------------------------------------------------
ChangeMoveType
Назначение: сообщает клиенту что чар изменил тип перемещения
Формат:
3E
XX XX XX XX // ID чара
XX XX XX XX // 00 - хотьба, 01 - бег
00 00 00 00 // C2
--------------------------------------------------------------------------------
ChairSit
Назначение: сообщает клиенту что чар сел
Формат:
E1
XX XX XX XX // ID объекта
XX XX XX XX // Static object ID
--------------------------------------------------------------------------------
5. Пакеты от клиетна серверу (Game Server)
00 - ProtocolVersion
01 - MoveBackwardToLocation
02 - Say
03 - EnterWorld
04 - Action
08 - AuthLogin
09 - Logout
0A - AttackRequest
0B - CharacterCreate
0C - CharacterDelete
0D - CharacterSelected
0F - RequestItemList
11 - RequestUnEquipItem
12 - RequestDropItem
14 - UseItem
15 - TradeRequest
16 - AddTradeItem
17 - TradeDone
1B - RequestSocialAction
1C - ChangeMoveType // устарел. Теперь юзается 'RequestActionUse'
1D - ChangeWaitType // устарел. Теперь юзается 'RequestActionUse'
1F - RequestBuyItem
21 - RequestBypassToServer
24 - RequestJoinPledge
25 - RequestAnswerJoinPledge
26 - RequestWithdrawalPledge
27 - RequestOustPledgeMember
29 - RequestJoinParty
2A - RequestAnswerJoinParty
2B - RequestWithDrawalParty
2C - RequestOustPartyMember
2F - RequestMagicSkillUse
30 - Appearing
33 - RequestShortCutReg
35 - RequestShortCutDel
37 - RequestTargetCanceld
38 - Say2
3С - RequestPledgeMemberList
3F - RequestSkillList
40 - AnswerTradeRequest
45 - RequestActionUse
46 - RequestRestart
48 - ValidatePosition
4A - StartRotating
4B - FinishRotating
4D - RequestStartPledgeWar
4F - RequestStopPledgeWar
55 - RequestGiveNickName
58 - RequestEnchantItem
59 - RequestDestroyItem
5E - RequestFriendInvite
5F - RequestAnswerFriendInvite
60 - RequestFriendList
61 - RequestFriendDel
62 - CharacterRestore
63 - RequestQuestList
64 - RequestQuestAbort
66 - RequestPledgeInfo
68 - RequestPledgeCrest
6A - RequestRide
6B - RequestAquireSkillInfo
6C - RequestAquireSkill
6D - RequestRestartPoint
6E - RequestGMCommand
6F - RequestPartyMatchConfig
70 - RequestPartyMatchList
71 - RequestPartyMatchDetail
72 - RequestCrystallizeItem
77 - SetPrivateStoreMsgSell
81 - RequestGmList
82 - RequestJoinAlly
83 - RequestAnswerJoinAlly
84 - AllyLeave
85 - AllyDismiss
88 - RequestAllyCrest
89 - RequestChangePetName
8A - RequestPetUseItem
8B - RequestGiveItemToPet
8C - RequestGetItemFromPet
8E - RequestAllyInfo
8F - RequestPetGetItem
94 - SetPrivateStoreMsgBuy
98 - RequestStartAllianceWar
9А - RequestStopAllianceWar
A0 - RequestBlock
A2 - RequestSiegeAttackerList
A4 - RequestJoinSiege
AС - RequestRecipeBookOpen
B9 - RequestEvaluate
BA - RequestHennaList
BB - RequestHennaItemInfo
BС - RequestHennaEquip
C1 - RequestMakeMacro
C2 - RequestDeleteMacro
CF - RequestAutoSoulShot
В0:10 - RequestExPledgeCrestLarge
В0:11 - RequestExSetPledgeCrestLarge
EE - RequestChangePartyLeader
--------------------------------------------------------------------------------
ProtocolVersion
Назначение: передает версию протокола используемого клиентом серверу
Формат:
00
XX XX XX XX // Версия протокола
--------------------------------------------------------------------------------
MoveBackwardToLocation
Назначение: запрос на перемещение чара
Формат:
01
XX XX XX XX // Координата X точки назначения
XX XX XX XX // Координата Y точки назначения
XX XX XX XX // Координата Z точки назначения
XX XX XX XX // Координата X текущего положения чара
XX XX XX XX // Координата Y текущего положения чара
XX XX XX XX // Координата Z текущего положения чара
XX XX XX XX // 00 - для движения используеться клавиатура, 01 - для движения используется мышь
--------------------------------------------------------------------------------
Say
Назначение: отправляет сообщение другим игрокам
Формат:
02
XX XX XX XX 00 00 // Cтрока сообщения
XX XX XX XX // Тип сообщение
// 0x00 - ALL
// 0x01 - SHOUT ( ! )
// 0x02 - TELL ( " )
// 0x03 - PARTY ( # )
// 0x04 - CLAN ( @ )
// 0x05 - GM
// 0x06 - PETITION_PLAYER
// 0x07 - PETITION_GM
// 0x08 - TRADE ( + )
// 0x09 - ALLIANCE ( $ )
// 0x0A - ANNOUNCEMENT
// 0x0F - PARTYROOM_ALL ( желтый )
// 0x10 - PARTYROOM_COMMANDER ( синий )
// 0x11 - Голос героя
XX XX XX XX 00 00 // Для приватных сообщений. Содержит ник чара которому предназначено сообщение.
--------------------------------------------------------------------------------