Exploratorem Posted September 12, 2023 Share Posted September 12, 2023 (edited) Вернулся я тут к давнешней затее (хотел лет 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 September 12, 2023 by Exploratorem @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted September 12, 2023 Share Posted September 12, 2023 https://web.archive.org/web/20190228164843/http://wiki.vbaddict.net/pages/Data_Packets Может быть полезно 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Monstrofil Posted September 13, 2023 Share Posted September 13, 2023 (edited) 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 September 13, 2023 by Monstrofil 1 @ Quote Link to comment Short link Share on other sites More sharing options...
Exploratorem Posted September 25, 2023 Author Share Posted September 25, 2023 (edited) @SkepticalFox @Monstrofil благодарю! Частично разобрался с WoWS-ReplaysUnpack и как к нему добавлять свои обработчики событий. Все же проще использовать его в качестве готового "движка", чем изобретать свой велосипед на квадратных колесах. Еще есть пара вопросов. Правильно я понял, что из реплея весь нанесенный урон можно вытянуть только для записавшего реплей через receiveDamageStat(), а для других можно лишь довольстсвоваться уроном от ГК (и возможно торпед, еще не разобрался) из receiveDamagesOnShip(), куда урон от ПМК не входит? @Monstrofil, а из-за чего в replay_unpack для 12.8 был убран вывод battle_results который был добавлен только в 12.7? В том виде как он был в 12.7 на 12.8 не "взлетел"? Но из-за чего, структура поменялась или дело в чем-то другом? Edited September 25, 2023 by Exploratorem @ Quote Link to comment Short link Share on other sites More sharing options...
Monstrofil Posted September 25, 2023 Share Posted September 25, 2023 7 часов назад, Exploratorem сказал: @Monstrofil, а из-за чего в replay_unpack для 12.8 был убран вывод battle_results который был добавлен только в 12.7? В том виде как он был в 12.7 на 12.8 не "взлетел"? Но из-за чего, структура поменялась или дело в чем-то другом? Новый battle result не используется на replayswows.com, а поддерживать такое количество констант относительно каждой новой версии клиента вхолостую я не хочу. @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
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.