Кратко, как работает.
В папке \settings находится packetsAionXX.ini из которого по коду пакета выбирается имя пакета, например для серверного пакета 00 находим имя пакета SM_STATUPDATE_HP
Код:
[server]
00=SM_STATUPDATE_HP
...
Сами пакеты лежат в папке \settings\packets.ini\aionXX или для LineageII лежат в папке \settings\packets.ini\gracia и т.д по названию хроник соответственно в папках clientpackets и serverpackets
Код:
\settings
|packetsAion21.ini
|packetsGracia.ini
+-\packets.ini
+aion21
|clientpackets
|serverpackets
+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) // возможные варианты (>|>=|<|<=|!|!=|==)
{
...
}
Поддерживаются подпрограммы (SM_INVENTORY_UPDATE.java):
Код:
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