Jump to content
Korean Random

Парсинг реплеев, прошу разъяснить


Recommended Posts

Вернулся я тут к давнешней затее (хотел лет 5 назад, но тогда руки не дошли сесть и разобраться) сделать свой (на C#) минималистичный парсер реплеев (минимум данных, состав команды, нанесенный дамаг, чат и по мелочи), но столкнулся с непониманием как это работает.

Сперва распишу, что понял:

Понял как распарсить файл реплеев, вытянуть незашифрованный json, распаковать и раскодировать остальное до получения отдельных NetPacket. Структура пакетов более менее понятна благодаря Monstrofil и его описанию. А вот дальнейшее, как парсить содержимое пакетов - темный лес.

Опытным путем, по сигнатурам нашел и понял как распарсить пакеты (по определенным messageID) содержащие нанесенный урон, кто кому и сколько, кто кого уничтожил ну и чат.

Просто брал данные из генерируемого replays_unpack json и искал их в пакетах, так нашел пакеты в которых содержится нанесенный урон, пакеты сождержащие информацию кто-кого убил нашел аналолгичным способом. Пакеты содержащие сообщения чата практически случайно сам.

Собственно это практически половина того, что мне надо.

 

Но вот мне не понятно, в частности, как распарсить пакет содержащий начальные данные о составе команд (для версии 12.7 это 0x8 с messageID 130). В hex редакторе нахожу раздельно все что мне надо, но цельную структуру файла понять не могу. 

Исходник replays_unpack я смотрел, кое что оттуда подчеркнул, но python знаю плохо и там все сложно и запутано.

В частности вообще не могу понять взаимосвязь между .xml,.def файлами и пакетами и тем более как ими пользоваться.

Так же не могу понять как, например, replays_unpack парсит то, что я уже сам разобрался как получить, например кто кому и сколько нанес дамага или кто кого убил, ведь я там не нашел какой бы то нибыло привязки к messageID (или плохо искал?). 

Я видимо не понял какой-то базовый принцип.

Прошу вкратце, но с какой-то конкретикой разъяснить принцип. По сути меня интересует только вышеупомянутый пакет с базовыми настройками боя.
Прикреплю его дамп (взят из случайного реплея, принятого как исходный для разбора) к сообщению, вдруг пригодится.

P.S. WoWS-ReplaysUnpack я видел и смотрел, но знаний C# и способности разбираться в чужом коде не хватает для понимая базового принципа завязанного на .xml и .def файлах.
 

 

08_130

Edited by Exploratorem
Link to comment
Short link
Share on other sites

entities.xml - перечень entity используемых клиентом

*.def - описание методов и свойств entity, описание типов данных в "сообщениях"

 

    <makeDenunciation>
      <Exposed></Exposed>
      <Arg>	OBJECT_ID	</Arg>
      <Arg>	INT32	</Arg>
      <Arg>	INT8	</Arg>
    </makeDenunciation>

^^ метод makeDenunciation, размер 9 байт (OBJECT_ID (4) + INT32 (4) + INT (8), именно в таком порядке и с такими размерами аргументы будут запакованы в сообщении

 

 

messageID - порядковый номер сообщения (подиндекс в entityProperty или entityMethod) конкретной entity, сообщения должны быть отсортированы по их размеру (для методов - сумме размеров всех аргументов, для свойств - размеру свойства, размеры вычисляются из базовых типов, кастомные типы прописываются в alias.xml).

 

Привязка к messageID вычисляется примерно тут.
https://github.com/Monstrofil/replays_unpack/blob/master/replay_unpack/core/entity_def/entity_description.py#L119

 

p.s. "но знаний C# и способности разбираться в чужом коде не хватает" --> так или иначе придется разбираться, ну или переписывать с ноля, но тут я только пожелаю удачи и вернетесь вы через полгода =)

p.p.s. вот этот readme как раз про messageId... https://github.com/Monstrofil/replays_unpack/blob/master/docs/Getting exposed index for properties and methods.md

Edited by Monstrofil
  • Upvote 1
Link to comment
Short link
Share on other sites

  • 2 weeks later...

@SkepticalFox @Monstrofil благодарю! 

Частично разобрался с WoWS-ReplaysUnpack и как к нему добавлять свои обработчики событий. Все же проще использовать его в качестве готового "движка", чем изобретать свой велосипед на квадратных колесах.

 

Еще есть пара вопросов. Правильно я понял, что из реплея весь нанесенный урон можно вытянуть только для записавшего реплей через receiveDamageStat(), а для других можно лишь довольстсвоваться уроном от ГК (и возможно торпед, еще не разобрался) из receiveDamagesOnShip(), куда урон от ПМК не входит?

 

@Monstrofil, а из-за чего в replay_unpack для 12.8 был убран вывод battle_results который был добавлен только в 12.7?  В том виде как он был в 12.7 на 12.8 не "взлетел"? Но из-за чего, структура поменялась или дело в чем-то другом?

Edited by Exploratorem
Link to comment
Short link
Share on other sites

7 часов назад, Exploratorem сказал:

@Monstrofil, а из-за чего в replay_unpack для 12.8 был убран вывод battle_results который был добавлен только в 12.7?  В том виде как он был в 12.7 на 12.8 не "взлетел"? Но из-за чего, структура поменялась или дело в чем-то другом?

Новый battle result не используется на replayswows.com, а поддерживать такое количество констант относительно каждой новой версии клиента вхолостую я не хочу.

Link to comment
Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...