Exploratorem 0 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 Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #536903 Posted September 12, 2023 https://web.archive.org/web/20190228164843/http://wiki.vbaddict.net/pages/Data_Packets Может быть полезно 1 Quote Share this post Link to post Short link Share on other sites
Monstrofil 70 #536929 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 Share this post Link to post Short link Share on other sites
Exploratorem 0 #537213 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 Share this post Link to post Short link Share on other sites
Monstrofil 70 #537222 Posted September 25, 2023 7 часов назад, Exploratorem сказал: @Monstrofil, а из-за чего в replay_unpack для 12.8 был убран вывод battle_results который был добавлен только в 12.7? В том виде как он был в 12.7 на 12.8 не "взлетел"? Но из-за чего, структура поменялась или дело в чем-то другом? Новый battle result не используется на replayswows.com, а поддерживать такое количество констант относительно каждой новой версии клиента вхолостую я не хочу. Quote Share this post Link to post Short link Share on other sites