Pepelaz Posted February 10, 2018 Share Posted February 10, 2018 Вышел бета-тест 1.0, в котором модели танков теперь хранятся havok-файлах, собственно вопрос как их теперь расковырять. Господа, кто-нибудь что-нибудь нарыл в этом направлении? Интересует любая информация: парсеры, либы, наработки или даже общие соображения как оно там всё устроенно. 1 @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted February 10, 2018 Share Posted February 10, 2018 (edited) @Pepelaz а разве там не используется модель в старом формате, если havok выключен в настройках, а havok файл, если включен? А по структуре файл очень похож на пакованный файл и вряд ли там есть геометрия Edited February 10, 2018 by SkepticalFox @ Quote Link to comment Short link Share on other sites More sharing options...
Pepelaz Posted February 10, 2018 Author Share Posted February 10, 2018 Ага, обычные визуальные модели остались, а коллижн модели нет, сейчас в папке с ресурсами лежат хавок-файлы, типа Hull.havok, Chassis.havok и т. д. Привычные *.primitives_processed и *.visual_processed исчезли. Пробовал открыть эти новые файлы с помощью hkxcmd.exe, предположив, что это обычные переименованные hkx-файлы Хавока (пакованные xml), но ничего не вышло. Либо это не hkx-файлы, либо используется более новый формат. Ещё вариант, что это собственная разработка ВГ, тогда совсем плохо. @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted February 10, 2018 Share Posted February 10, 2018 (edited) 3 hours ago, Pepelaz said: а коллижн модели нет ну вот сразу бы сказал, что про колижн 5 hours ago, Pepelaz said: общие соображения как оно там всё устроенно. сейчас скрипт накидаю получает hkx файлы из havok файла from collections import OrderedDict from struct import unpack from io import BytesIO, SEEK_SET, SEEK_CUR, SEEK_END def subHavok_load(data, parent_sec_name): packedGroups = OrderedDict() data = BytesIO(data) ENTRY_DATA_MASK = ~(1<<31) data.seek(-4, SEEK_END) endEntriesInfo = data.tell() startEntriesInfoOffset = unpack('<I', data.read(4))[0] data.seek(-4-startEntriesInfoOffset, SEEK_END) position = 4 while data.tell() < endEntriesInfo: entryDataLen, _, nameLen = unpack('<I16sI', data.read(24)) dataName = data.read(nameLen).decode('ascii') packedGroups[dataName] = { 'length': entryDataLen, 'position': position } position += (entryDataLen + 3) & (~3) data.seek(((nameLen+3) & ~3)-nameLen, SEEK_CUR) for sec_name, info in packedGroups.items(): data.seek(info['position']) with open('%s_%s.hkx' % (parent_sec_name, sec_name), 'wb') as f: f.write(data.read(info['length'])) def havok_load(data): packedGroups = OrderedDict() data = BytesIO(data) ENTRY_DATA_MASK = ~(1<<31) data.seek(-4, SEEK_END) endEntriesInfo = data.tell() startEntriesInfoOffset = unpack('<I', data.read(4))[0] data.seek(-4-startEntriesInfoOffset, SEEK_END) position = 4 while data.tell() < endEntriesInfo: entryDataLen, _, nameLen = unpack('<I16sI', data.read(24)) dataName = data.read(nameLen).decode('ascii') packedGroups[dataName] = { 'length': entryDataLen, 'position': position } position += (entryDataLen + 3) & (~3) data.seek(((nameLen+3) & ~3)-nameLen, SEEK_CUR) for sec_name, info in packedGroups.items(): data.seek(info['position']) subHavok_load(data.read(info['length']), sec_name) with open('Background1.havok', 'rb') as f: havok_load(f.read()) 3 hours ago, Pepelaz said: с помощью hkxcmd.exe для танков надо что-то поновее, версия 1.4 (2012 года) не подойдет Не удивительно, ведь он собран с 2010.2 Havok Content Tools, а надо с 2014 Havok Content Tools Есть еще это https://github.com/Highflex/havok2fbx/ и это https://github.com/Dexesttp/hkxpack Но оно тоже требует доработки @Mixaill, поможете? Edited February 10, 2018 by SkepticalFox 1 @ Quote Link to comment Short link Share on other sites More sharing options...
tricsi Posted February 10, 2018 Share Posted February 10, 2018 3 часа назад, Pepelaz сказал: Ещё вариант, что это собственная разработка ВГ, тогда совсем плохо. они так об этом и пишут ".. По этой причине мы перенесли разработку движка клиента внутрь компании и создали решение, которое соответствует потребностям игры, — движок Core. " @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted February 10, 2018 Share Posted February 10, 2018 (edited) 3 minutes ago, tricsi said: ".. По этой причине мы перенесли разработку движка клиента внутрь компании и создали решение, которое соответствует потребностям игры, — движок Core. " ну хавок явно не их) они только пакуют в свой .havok-файл hkx файлы Edited February 10, 2018 by SkepticalFox @ Quote Link to comment Short link Share on other sites More sharing options...
tricsi Posted February 10, 2018 Share Posted February 10, 2018 @SkepticalFox хорошо если не изменили под себя, оставив название, ведь не скажут как паковали.. ) @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted February 10, 2018 Share Posted February 10, 2018 1 minute ago, tricsi said: ведь не скажут как паковали. есть инфа, что уже очень долгое время они раздают утилитки тем, кто NDA подпишет) @ Quote Link to comment Short link Share on other sites More sharing options...
tricsi Posted February 10, 2018 Share Posted February 10, 2018 @SkepticalFox хмм... пытки ? с пристрастием ? :)) @ Quote Link to comment Short link Share on other sites More sharing options...
Mixaill Posted February 10, 2018 Share Posted February 10, 2018 5 часов назад, SkepticalFox сказал: ну вот сразу бы сказал, что про колижн сейчас скрипт накидаю получает hkx файлы из havok файла from collections import OrderedDict from struct import unpack from io import BytesIO, SEEK_SET, SEEK_CUR, SEEK_END def subHavok_load(data, parent_sec_name): packedGroups = OrderedDict() data = BytesIO(data) ENTRY_DATA_MASK = ~(1<<31) data.seek(-4, SEEK_END) endEntriesInfo = data.tell() startEntriesInfoOffset = unpack('<I', data.read(4))[0] data.seek(-4-startEntriesInfoOffset, SEEK_END) position = 4 while data.tell() < endEntriesInfo: entryDataLen, _, nameLen = unpack('<I16sI', data.read(24)) dataName = data.read(nameLen).decode('ascii') packedGroups[dataName] = { 'length': entryDataLen, 'position': position } position += (entryDataLen + 3) & (~3) data.seek(((nameLen+3) & ~3)-nameLen, SEEK_CUR) for sec_name, info in packedGroups.items(): data.seek(info['position']) with open('%s_%s.hkx' % (parent_sec_name, sec_name), 'wb') as f: f.write(data.read(info['length'])) def havok_load(data): packedGroups = OrderedDict() data = BytesIO(data) ENTRY_DATA_MASK = ~(1<<31) data.seek(-4, SEEK_END) endEntriesInfo = data.tell() startEntriesInfoOffset = unpack('<I', data.read(4))[0] data.seek(-4-startEntriesInfoOffset, SEEK_END) position = 4 while data.tell() < endEntriesInfo: entryDataLen, _, nameLen = unpack('<I16sI', data.read(24)) dataName = data.read(nameLen).decode('ascii') packedGroups[dataName] = { 'length': entryDataLen, 'position': position } position += (entryDataLen + 3) & (~3) data.seek(((nameLen+3) & ~3)-nameLen, SEEK_CUR) for sec_name, info in packedGroups.items(): data.seek(info['position']) subHavok_load(data.read(info['length']), sec_name) with open('Background1.havok', 'rb') as f: havok_load(f.read()) для танков надо что-то поновее, версия 1.4 (2012 года) не подойдет Не удивительно, ведь он собран с 2010.2 Havok Content Tools, а надо с 2014 Havok Content Tools Есть еще это https://github.com/Highflex/havok2fbx/ и это https://github.com/Dexesttp/hkxpack Но оно тоже требует доработки @Mixaill, поможете? Отсюда не работает? https://drive.google.com/drive/folders/0B8SgSQGjqypSS3JoZWRDaEVacVE @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted February 10, 2018 Share Posted February 10, 2018 (edited) 23 minutes ago, Mixaill said: Отсюда не работает? собственно я не пробовал Версия немного смущает 23 minutes ago, Mixaill said: https://drive.google.com/drive/folders/0B8SgSQGjqypSS3JoZWRDaEVacVE здесь 2014.1.1 максимальная наверное лучше доработать распаковщик на Java Edited February 10, 2018 by SkepticalFox @ Quote Link to comment Short link Share on other sites More sharing options...
Pepelaz Posted February 12, 2018 Author Share Posted February 12, 2018 (edited) Скормил питоновскому скрипту от Скептического лиса файл Chassis.havok от МС-1. Получил staticModules_default.hkx и staticModules_trigger.hkx. Hkxcmd ожидаемо их не смог сконвертировать ибо версия не та, сказал "File is not loadable". Havok Content Tools версии 2014.1.1 кушать файлы тоже отказался, с ошибкой "Unable to detect format from stream". Явовский конвертер HKXPack работать также отказался вылетев с исключением OutOfMemory. ПС:Лис, у тебя там на скриншоте в дереве слева засветились havok2fbx.exe и hkxcmd.exe, может это то, что надо? Edited February 12, 2018 by Pepelaz @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted February 12, 2018 Share Posted February 12, 2018 3 hours ago, Pepelaz said: ПС:Лис, у тебя там на скриншоте в дереве слева засветились havok2fbx.exe и hkxcmd.exe, может это то, что надо? не, они тоже не работают @ Quote Link to comment Short link Share on other sites More sharing options...
tricsi Posted February 12, 2018 Share Posted February 12, 2018 не знаю что это... SDK V2017 0100@ S8DATA Destruction 2013 Scene Data hkMemoryResourceContainer @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted February 12, 2018 Share Posted February 12, 2018 21 minutes ago, tricsi said: V2017 Havok слишком скрыт сейчас, прямо как Scaleform Только крупные игроки могут позволить новые версии SDK @ Quote Link to comment Short link Share on other sites More sharing options...
tricsi Posted February 12, 2018 Share Posted February 12, 2018 @SkepticalFox т.е картоха собрала контейнеры на этом ? в оглавлении так пишет..а в инете ссылается на андроид... @ Quote Link to comment Short link Share on other sites More sharing options...
MasterModeley Posted February 14, 2018 Share Posted February 14, 2018 (edited) Вот до чего я пока докопался в staticModules_default: - блок TAG0 - блок SDKV : версия SDK в текстовом виде - блок DATA : данные геометрии и физики (?) - блок TYPE - TSTR : строки (в большинстве с префиксом hk* ) - TNA1 : ? - FSTR : строки (имена параметров?) - TBDY : ? - TPAD : ? - блок INDX - ITEM : массив индексов { uint32 флаги(?), uint32 позиция в блоке DATA, uint32 количество (не размер!) данных } Причём, блок TYPE кажется одинаков для всех файлов(?) Может ли кто-нибудь кинуть в меня "типичный" havok файл, который можно конвертировать hkxcmd и посмотреть, что в итоге должно примерно получиться? Можно бросаться уже конвертированными. Edited February 14, 2018 by MasterModeley @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted February 14, 2018 Share Posted February 14, 2018 (edited) 3 hours ago, MasterModeley said: Может ли кто-нибудь кинуть в меня "типичный" havok файл, который можно конвертировать hkxcmd и посмотреть, что в итоге должно примерно получиться? Можно бросаться уже конвертированными. https://github.com/Dexesttp/hkxpack/tree/master/core/src/test/resources Там и структура в доках расписана для той версии Edited February 14, 2018 by SkepticalFox @ Quote Link to comment Short link Share on other sites More sharing options...
MasterModeley Posted February 14, 2018 Share Posted February 14, 2018 2 часа назад, SkepticalFox сказал: https://github.com/Dexesttp/hkxpack/tree/master/core/src/test/resources Там и структура в доках расписана для той версии К сожалению, там слишком маленький тестовый файл. И на первый взгляд он не имеет ничего общего с исследуемой версией. @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted February 14, 2018 Share Posted February 14, 2018 @MasterModeley видимо нужно искать человека с Fallout 4 @ 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.