Неспешно делается парсер пакетов в пакетхаке на основе java исходников серверов. Есть определенные успехи.
Как известно из java исходников можно сделать расшифровку пакетов для packets.ini. Дело муторное, не все возможности предусмотрены. Захотелось сделать, что то типа такого, чтобы кинул эти исходники с минимальными исправлениями в папку settings и пакетхак мог сам их просматривая показывать содержимое пакета.
Так выглядит исходник пакета SM_SKILL_LIST для Aion.
Имеются и плюсы и минусы.
Из плюсов: легко модифицировать пакет.
Из минусов: неспешность вывода показа пакета, особенно заметно если исходник имеет большой размер.
Осталось найти приличные исходники java сервера Aion и LineageII и подготовить пакеты.
В принципе за день я смог в черновом варианте обработать клиентские пакеты Aion 2.1, так что это может занять не так много времени.
PS: код до конца еще не дописан.
PPS: просьба накидать мне логов пакетов для Aion 2.1 и 2.5, чтобы можно было тестировать правильность разбора пакетов.
PPPS: тестовый вариант я выложу на FTP (Внимание! При ошибках в описании пакета намертво виснет пакетхак!).
Тестировал на 2.5 (http://aion.atomixro.com/) пакеты бредовые показывает, совсем не соответствующие действительности. *.166 версия л2пх показывает нормальные пакеты. И еще вопрос не в тему (сорри), gamezaion.com работает на 2.6 евроклиенте пакеты вообще непонятно что показывают... кодировка поменялась чтоль в 2.6?
Кратко, как работает.
В папке \settings находится packetsAionXX.ini из которого по коду пакета выбирается имя пакета, например для серверного пакета 00 находим имя пакета SM_STATUPDATE_HP
Код:
[server]
00=SM_STATUPDATE_HP
...
Сами пакеты лежат в папке \settings\packets.ini\aionXX или для LineageII лежат в папке \settings\packets.ini\gracia и т.д по названию хроник соответственно в папках clientpackets и serverpackets
Описание для клиентских пакетов ищется в секции readImpl()
Код:
protected void readImpl()
{
...
}
Описание для серверных пакетов ищется в секции writeImpl()
Код:
protected void writeImpl()
{
...
}
Фигурные скобки {} должны быть на отдельной строке!
Обрабатываются конструкции:
Чтение из пакета c=1 байт, h=2 байта, d=4 байта, s=string, f=8 байт, n=4 байта, b=блок в N байт:
Код:
writeD(buf, effectedId); //имя поля будет effectedId
или
raceId = readC(); //имя поля будет raceId
writeB(buf, new byte[18]); //будет пропущено 18 байт
Цикл:
Код:
writeH(buf, size); //// цикл по переменной size
for (size)
{
...
}
или
Код:
amount = readH(); // цикл по переменной amount
for (int i = 0; i < amount; i++)
{
...
}
Условия:
Код:
raceId = readC();
switch (raceId)
{
case 0:
...
break;
case 1:
...
break;
default:
...
break;
}
или
Код:
if (type == 2) // возможные варианты (>|>=|<|<=|!|!=|==)
{
...
}
else
{
...
}
или
if (type) // возможные варианты (>|>=|<|<=|!|!=|==)
{
...
}
protected void writeGeneralInfo()
{
...
}
protected void writeImpl(AionConnection con, ByteBuffer buf)
{
...
writeH(buf, size); // number of entries
for (size)
{
writeGeneralInfo(buf, item);
...
}
}
Присвоение:
Код:
Size = 8;
//size будет равно 8
или
Size = 8;
Len=Size
//Len будет равно 8
или
int size = 134 - (history.getName().length() * 2 + 2);
//size будет равно вычислению 134 - длина строки getName *2+2
Комментарии в тексте пропускаются
Код:
writeC(buf, chatType); // type
или
/*
* 0 : all 1 : elyos 2 : asmodians
*/
writeD(buf, senderObjectId); // sender object id
Для подготовки packetsAionXX.ini по данным из файлов AionPacketHandlerFactory.java и ServerPacketsOpcodes.java сделана маленькая утилита makeOpcodesAion.
Обновил до версии 0.2
NLObP, и всё таки мне кажется что оптимальнее было бы делать не в пакетхаке возможность использовать сорци явы, а просто конвертер сорцев в packets.ini
__________________
Я здесь практически не появляюсь!, Skype - ikskor
NLObP, и всё таки мне кажется что оптимальнее было бы делать не в пакетхаке возможность использовать сорци явы, а просто конвертер сорцев в packets.ini
Я не настаиваю. Могу исходники отдельно выложить.
В packets.ini плохо проработана работа с пакетами. Да и саму её трудно делать. И для понимания одна длинная строка хуже чем нормальный листинг программы.
PS: причем совместимость со старыми packets.ini не потеряна. Новый парсер включается галочкой в настройках.
а я не протестую против твоей фичи, просто выражаю мнение, ничего против её наличия не имею)
ЗЫ в новом пакетхаке (если всётfки допишу когданить что то внятное) у меня наборот будет просто: разбираться пакеты будут скриптом, но скрипт сможет генерироваться из формата похожего на текущий packets.ini
__________________
Я здесь практически не появляюсь!, Skype - ikskor