Приветствую @SkepticalFox!
Нужна помощь с фиксом под свежий клиент
wotver: 1.32.0.4268
mapname: 07_lakeville
unpackhd: True
debug: True
AssertionError: (80857036, 80879116, 'BSMI')
Интересно узнать как зареверсить, чтобы в будущем помочь.
Если я правильно понимаю, надо в экзешнике игры структуру соответствующую найти, пока не понял методу для этого действия.
UPD:
С этой разобрался, там оказалось проще.
BSMI добавили поле структуры через нулевой разделитель:
_fields_ = [
(list, 'transforms', '<16f'),
(list, 'chunk_models', ChunkModel_v1_0_0),
(list, 'visibility_masks', '<I'),
(list, 'bsmo_models_id', '<2I'),
(list, 'animations_id', '<i'),
(list, 'model_animation', ModelAnimation_v1_16_1),
(list, '6_40', '<10I'),
(list, '7_4', '<I'),
(list, '8_12', '<3I'),
(list, '9_4', '<I'), # always 0
(list, '10_20', '<5f'),
(int, '11_4', '<I'),
(list, '12_4', '<I'),
(int, '13_4', '<I'), # <- Added
(list, '14_4', '<I'), # <- Added
]
Но дальше каскадом идёт апдейт другой структуры BWLC. С этим сложнее, так как не знаю типов данных в структуре
_fields_ = [
(list, 'pulse_light_list', PulseLight_v1_32_0_RU), # Previous _size_ = 100, New _size_ = 112
(list, 'pulse_spot_light_list', PulseSpotLight_v1_32_0_RU), # Previous _size_ = 104, New _size_ = 116
(list, 'frames', '<2f'),
]
# <zipfile.ZipExtFile name='spaces/07_lakeville/space.bin' mode='r'>
# print((i, repeat, struct_size, block_start, repeat * struct_size, block_start + repeat * struct_size))
# (0, 4, 112, 83563221, 448, 83563669)
# (1, 0, 116, 83563677, 0, 83563677)
# (2, 84, 8, 83563685, 672, 83564357)
Есть гипотеза, что добавили по 3 поля длиной по 4 байта - float, int.
Остальные не смотрел, но можно это легко сделать в качестве дебага переписать код для Base_JSON_Section
@row_seek(True)
def from_bin_stream(self, stream, row):
stream.seek(row.position)
self._data = {}
i = 0
while True:
if stream.tell() >= row.position + row.length:
break
struct_size, repeat = unpack('<2I', stream.read(8))
block_start = stream.tell()
print((i, repeat, struct_size, block_start, repeat * struct_size, block_start + repeat * struct_size))
if struct_size > 0:
if repeat > 0:
data = stream.read(repeat * struct_size)
self._data[f'field_{i}_raw'] = [data[i:i + struct_size] for i in range(0, repeat)]
else:
self._data[f'field_{i}_raw'] = []
else:
# Грязный хак, пока не устаканим модельку.
stream.seek(block_start - 4)
self._data[f'field_{i}'] = repeat
i += 1
UPD2:
Имея офсеты удобно анализировать данные простым инструментом, имея значения сдвигов блоков со схожими структурами данных.
xxd -s 80569988 -g 4 -d -l 4000 -c 64 space.bin
Есть еще полезный инструмент для более качественного реверса - ImHEX, рекомендую.