Jump to content
Korean Random

space.bin (CompiledSpace) - packer/unpacker


Recommended Posts

  • 2 months later...
  • 1 month later...
  • 2 weeks later...
  • 4 weeks later...

um hi, I'm new here, can anyone tell me how to remove water from the map, it's really necessary.(translated)хм привет я здесь новенький, может кто подскажет как убрать воду с карты, это очень нужно.

Link to comment
Short link
Share on other sites

  • 9 months later...
On 11/16/2023 at 11:55 PM, AddNikita said:

@SkepticalFox на ру тесте 1.23.0.0 леста в секцию WTCP добавила 12 байт, похоже на c_float * 3, не c_uint32 это точно. Подмечу, ИЗМЕНИЛИ НА РУ ТЕСТЕ, на еу тесте ничего не меняли.

Поправил, также поднял требование до версии python до 3.11 - dataclasses очень уж нужная штука

скоро займусь более внимательным версионированием EU клиента, сейчас добавил базовую поддержку выставления Realm у секций RU/EU

Edited by SkepticalFox
  • Upvote 2
Link to comment
Short link
Share on other sites

  • 1 month later...

Приветствую!
Нужна помощь с фиксом структур под свежий клиент.

 

wotver: 1.32.0.4268
mapname: 07_lakeville
unpackhd: True
debug: True

AssertionError: (80857036, 80879116, 'BSMI')

 

Интересно узнать как зареверсить, чтобы в будущем помочь.

Если я правильно понимаю, надо в экзешнике игры структуру соответствующую найти, пока не понял методу для этого действия.

  • Upvote 1
Link to comment
Short link
Share on other sites

Приветствую @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, рекомендую.

 

Screenshot from 2025-01-27 19-01-07.png

Screenshot from 2025-01-27 22-16-43.png

Edited by Zver2020
  • Upvote 2
Link to comment
Short link
Share on other sites

  • 1 month later...

@SkepticalFox, можешь объяснить, как anca_reader воспользоваться? Надо анимацию старую распаковать, а на 15 странице у тебя как раз лежит пример работы.

Edited by Leonardo_Shpah
Link to comment
Short link
Share on other sites

Hello

I found the tool a long time ago, however, I don't know how to use it. I guess it's made for players knowledgable in the field already and I'm not when it comes to coding, but maybe someone could show how to unpack space.bin step by step? I've been looking for any "how to" tutorial for months and this forum is the last place for now.

I would really appreciate any help

have a nice day

 

translated:

Привет

Я нашел этот инструмент давно, однако не знаю, как им пользоваться. Думаю, он создан для игроков, которые уже разбираются в этой области, а я не разбираюсь в кодировании, но, может быть, кто-то сможет показать, как распаковать space.bin пошагово? Я месяцами искал какие-нибудь руководства «как это сделать», и этот форум — последнее место на данный момент.

Буду очень признателен за любую помощь

хорошего дня

  • Upvote 2
Link to comment
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.
Note: Your post will require moderator approval before it will be visible.

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