PDA

Просмотр полной версии : Делаем packetsAion.ini


NLObP
13.04.2011, 21:08
Вот, что уже имеем в pakets.ini.


Для L2PacketHack3.5.167+
From AION X Engine 2.1

Типы данных, используемые в пакетах:
c: Byte (1 байт)
h: Word (2 байта)
d: DWord (4 байта)
i: integer (4 байта)
f: Real/Double (8 байт) используется в Lineage II
n: Real/Double (4 байт) используется в Aion
q: Int64 (8 байт целое)
s: String


Во многих пакетах, очень часто встречаются циклические списки, пример:
18=StatusUpdate:o(ObjectID)d(ListSize:Loop.0002.00 02)d(unk)d(ID)d(Value)

здесь в куске d(ListSize:Loop.0002.0002)
ListSize - количество повторов цикла
Loop - означает что будет цикл
0002 - элемент пакета с которого начинать цикл
0002 - сколько элементов циклить
т.е. элементы d(ID) и d(Value) будут повторятся ListSize количество раз, d(unk) просто выводится и в цикле не участвует.

или

18=StatusUpdate:o(ObjectID)d(ListSize:For.0002)d(I D)d(Value)

здесь в куске d(ListSize:For.0002)
ListSize - количество повторов цикла
For - означает что будет цикл
0002 - сколько элементов циклить
т.е. элементы d(ID) и d(Value) будут повторятся ListSize количество раз.

Оператор выбора switch в java имеет следующий вид:

switch (выражение) { case
значение1:
// последовательность операторов
break;
case значение2:
// последовательность операторов
break;
...
case значениеN:
// последовательность операторов
break;
default:
// последовательность операторов, выполняемая по умолчанию

У нас оператор выбора выглядит так, пример:

17=SM_MESSAGE:h(id2)c(chatType:switch.0002.0003)c( RaceId)d(ObjectId)_(id:case.0.2)h(unk)s(message)_( id:case.1.3)h(unk)d(unk)s(message)_(id:case.2.4)h( unk) d(unk)d(unk)s(message) s(Name)s(message)


здесь в куске c(chatType:switch.0002.0003)
chatType - выражение, тип чата (1 байт)
switch - ключевое слово оператора выбора
0002 - сколько элементов после switch пропускать, т.е. элементы c(RaceId)d(ObjectId) просто выводятся в расшифровке на экран
0003 - сколько элементов _(id:case присутствует в switch

в куске _(id:case.0000.0002)h(unk)s(message)
_ - пропускается
id - пропускается, сюда можно вписать имя идентификатора
case - ключевое слово для элемента выбора со значением 0000
0002 – количество элементов в блоке case, т.е. элементы h(unk)s(message)
Последние элементы s(Name)s(message) попадают под выбор default, т.е. если chatType не соответствует ни одному case, то в расшифровку попадают элементы s(Name)s(message).

Не значащие нули везде можно опускать, т.е. вместо 0001 пишем 1.

to be continued ...

NLObP
13.04.2011, 22:47
Есть проблемы. Вот например кусок пакета SM_PLAYER_INFO по данным aionxemu (http://aionxemu.googlecode.com/svn/trunk/)

List<Item> items = player.getEquipment().getEquippedItemsWithoutStigm a();
short mask = 0;
for (Item item : items) {
mask |= item.getEquipmentSlot();
}

writeH(buf, mask);

for (Item item : items) {
if (item.getEquipmentSlot() < Short.MAX_VALUE * 2) {
writeD(buf, item.getItemSkinTemplate().getTemplateId());
GodStone godStone = item.getGodStone();
writeD(buf, godStone != null ? godStone.getItemId() : 0);
writeD(buf, item.getItemColor());
writeH(buf, 0x00);// unk (0x00)
}
}



никак не заменить куском

h(mask:Loop.1.4)d(ItemSkinTemplateId)d(ItemId)d(It emColor)h(0)
0109 h mask: 32767 (0x7FFF)
0111 d ItemSkinTemplateId: 101500796 (0x060CC77C)
0115 d ItemId: 0 (0x00000000)
0119 d ItemColor: 0 (0x00000000)
0123 h 0: 0 (0x0000)
элемент mask имеет нереальное значение, хотя в пакете реальное повторение от 12 до 15 раз.

В каком месте узнать величину повторений for (Item item : items)? Как это клиент узнает?

xkor
14.04.2011, 16:00
элемент mask имеет нереальное значение, хотя в пакете реальное повторение от 12 до 15 раз.

В каком месте узнать величину повторений for (Item item : items)? Как это клиент узнает?хех, всё очень просто, mask это битовая маска, сколько бит в ней установлено столько и элементов в списке, правда в пакетхаке для такого придётся дополнительный костыль мутить ибо ничего встроенного чтоб превратить эту маску в число элементов нету
я вот так количество вычислял:
k:=fp.ReadH; // EquipmentMask
c:=0;
for i:=0 to 15 do c:=c+((k shr i)and 1);


Добавлено через 4 минуты
Эта битовая маска заодно указывает на что надета каждая вещь из списка

NLObP
14.04.2011, 23:47
xkor, спасибо, получилось! Добавил оператор LoopM в котором параметр цикла маска.

Добавлено через 31 минуту
Ещё вопрос.
Это writeH(buf, -1 * this.size & 0xFFFF);
эквивалентно этому?size:=(size XOR $FFFF)+1

Добавлено через 34 минуты
Блин, голову сломаешь с такого пакета 19=SM_INVENTORY_INFO
protected void writeImpl(AionConnection con, ByteBuffer buf) {
if (this.packetType == EMPTY) {
writeD(buf, 0);
writeH(buf, 0);
return;
}

// something wrong with cube part.
writeC(buf, 1); // TRUE/FALSE (1/0) update cube size
writeC(buf, CUBE); // cube size from npc (so max 5 for now)
writeC(buf, 0); // cube size from quest (so max 2 for now)
writeC(buf, 0); // unk?
writeH(buf, size); // number of entries

for (Item item : items) {
writeGeneralInfo(buf, item);

ItemTemplate itemTemplate = item.getItemTemplate();

if (itemTemplate.getTemplateId() == ItemId.KINAH.value()) {
writeKinah(buf, item, true);
} else if (itemTemplate.isWeapon()) {
writeWeaponInfo(buf, item, true);
} else if (itemTemplate.isArmor()) {
writeArmorInfo(buf, item, true, false, false);
} else if (itemTemplate.isStigma()) {
writeStigmaInfo(buf, item);
} else {
writeGeneralItemInfo(buf, item, false, false);
writeC(buf, 0);
}
}
}


Добавлено через 2 минуты
Вот эти соответствия в цифрах есть?
itemTemplate.getTemplateId() == ItemId.KINAH.value()
itemTemplate.isWeapon
itemTemplate.isArmor
itemTemplate.isStigma

Добавлено через 1 минуту
Пока только нашел
KINAH(182400001),
ANGELS_EYE(186000037),
DEMONS_EYE(186000038),
BROKEN_COIN(182005367),
PLATINUM_ELYOS(186000005),
PLATINUM_ASMODIANS(186000010);
правда в пакетах таких цифр не нахожу

Добавлено через 13 минут
Походу нужен itemsid.ini нормальный. Кто сделает?

mars2107
20.03.2013, 15:46
Во избежания лишних тем, спрошу здесь. Будет ли расшифровка пакетов для 3.5-3.9 или у вас в планах на 4.0 переключиться сразу?

NLObP
20.03.2013, 23:11
Во избежания лишних тем, спрошу здесь. Будет ли расшифровка пакетов для 3.5-3.9 или у вас в планах на 4.0 переключиться сразу?

Если есть исходники джава сервера для 3.5-3.9, то есть шанс на подготовку packets.ini

mars2107
26.03.2013, 16:40
Точно не могу скачать какая версия, но то что 3.5+ точно.

http://rghost.ru/44786541

пасс: 2212

NLObP
27.03.2013, 00:03
Точно не могу скачать какая версия, но то что 3.5+ точно.

http://rghost.ru/44786541

пасс: 2212

Спс. Посмотрю.

mars2107
27.03.2013, 13:22
Вы информацию берете для создания *.ini файла с этих классов?


http://ipic.su/55RE.jpg

как это сделать указано выше, я правильно понял?

NLObP
27.03.2013, 23:51
как это сделать указано выше, я правильно понял?
Да. Еще можно почитать здесь (http://coderx.ru/showthread.php?t=8731&highlight=writeImpl).