Jump to content
Korean Random
Pepelaz

Как вскрыть файл с расширением havok?

Recommended Posts

Вышел бета-тест 1.0, в котором модели танков теперь хранятся havok-файлах, собственно вопрос как их теперь расковырять. Господа, кто-нибудь что-нибудь нарыл в этом направлении? Интересует любая информация: парсеры, либы, наработки или даже общие соображения как оно там всё устроенно.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

@Pepelaz а разве там не используется модель в старом формате, если havok выключен в настройках, а havok файл, если включен?

А по структуре файл очень похож на пакованный файл и вряд ли там есть геометрия

Edited by SkepticalFox

Share this post


Link to post

Short link
Share on other sites

Ага, обычные визуальные модели остались, а коллижн модели нет, сейчас в папке с ресурсами лежат хавок-файлы, типа Hull.havok, Chassis.havok  и т. д. Привычные *.primitives_processed и *.visual_processed исчезли.

 

Пробовал открыть эти новые файлы с помощью hkxcmd.exe, предположив, что это обычные переименованные hkx-файлы Хавока (пакованные xml), но ничего не вышло. Либо это не hkx-файлы, либо используется более новый формат. Ещё вариант, что это собственная разработка ВГ, тогда совсем плохо.

Share this post


Link to post

Short link
Share on other sites
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 by SkepticalFox
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
3 часа назад, Pepelaz сказал:

 Ещё вариант, что это собственная разработка ВГ, тогда совсем плохо.

они так об этом и пишут

".. По этой причине мы перенесли разработку движка клиента внутрь компании и создали решение, которое соответствует потребностям игры, — движок Core. "

 

Share this post


Link to post

Short link
Share on other sites
3 minutes ago, tricsi said:

".. По этой причине мы перенесли разработку движка клиента внутрь компании и создали решение, которое соответствует потребностям игры, — движок Core. "

ну хавок явно не их) они только пакуют в свой .havok-файл hkx файлы

Edited by SkepticalFox

Share this post


Link to post

Short link
Share on other sites

@SkepticalFox

хорошо если не изменили под себя, оставив название, ведь не скажут как паковали.. )

Share this post


Link to post

Short link
Share on other sites
1 minute ago, tricsi said:

ведь не скажут как паковали.

есть инфа, что уже очень долгое время они раздают утилитки тем, кто NDA подпишет)

Share this post


Link to post

Short link
Share on other sites
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

Share this post


Link to post

Short link
Share on other sites
23 minutes ago, Mixaill said:

Отсюда не работает?

собственно я не пробовал

 

image.thumb.png.1e7dea85eaaf4881c662e93c9ff1384f.png

Версия немного смущает

23 minutes ago, Mixaill said:

здесь 2014.1.1 максимальная

наверное лучше доработать распаковщик на Java

Edited by SkepticalFox

Share this post


Link to post

Short link
Share on other sites

Скормил питоновскому скрипту от Скептического лиса файл 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 by Pepelaz

Share this post


Link to post

Short link
Share on other sites
3 hours ago, Pepelaz said:

ПС:Лис, у тебя там на скриншоте в дереве слева засветились havok2fbx.exe и hkxcmd.exe, может это то, что надо?

не, они тоже не работают

Share this post


Link to post

Short link
Share on other sites

не знаю что это...

 

SDK V2017 0100@ S8DATA

Destruction 2013 Scene Data hkMemoryResourceContainer

Share this post


Link to post

Short link
Share on other sites
21 minutes ago, tricsi said:

V2017

Havok слишком скрыт сейчас, прямо как Scaleform

Только крупные игроки могут позволить новые версии SDK

Share this post


Link to post

Short link
Share on other sites

@SkepticalFox 

т.е картоха собрала контейнеры на этом ?

в оглавлении так пишет..а в инете ссылается на андроид...

Share this post


Link to post

Short link
Share on other sites

Вот до чего я пока докопался в staticModules_default:

- блок TAG0

     - блок SDKV :  версия SDK в текстовом виде

     - блок DATA :  данные геометрии и физики (?)

- блок TYPE

     - TSTR : строки (в большинстве с префиксом hk* )

     - TNA1 : ?

     - FSTR : строки (имена параметров?)

     - TBDY : ?

     - TPAD : ?

- блок INDX

     - ITEM : массив индексов { uint32 флаги(?), uint32 позиция в блоке DATA, uint32 количество (не размер!) данных }

 

Причём, блок TYPE кажется одинаков для всех файлов(?)

 

Может ли кто-нибудь кинуть в меня "типичный" havok файл, который можно конвертировать hkxcmd и посмотреть, что в итоге должно примерно получиться? Можно бросаться уже конвертированными.

Edited by MasterModeley

Share this post


Link to post

Short link
Share on other sites
3 hours ago, MasterModeley said:

Может ли кто-нибудь кинуть в меня "типичный" havok файл, который можно конвертировать hkxcmd и посмотреть, что в итоге должно примерно получиться? Можно бросаться уже конвертированными.

https://github.com/Dexesttp/hkxpack/tree/master/core/src/test/resources

Там и структура в доках расписана для той версии

Edited by SkepticalFox

Share this post


Link to post

Short link
Share on other sites
2 часа назад, SkepticalFox сказал:

https://github.com/Dexesttp/hkxpack/tree/master/core/src/test/resources

Там и структура в доках расписана для той версии

 

К сожалению, там слишком маленький тестовый файл. И на первый взгляд он не имеет ничего  общего с исследуемой версией.

Share this post


Link to post

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.

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...