Как выкачать кусок майнкрафта в c #? - PullRequest
1 голос
/ 28 мая 2019

Поэтому я пытаюсь создать свой собственный редактор карт Minecraft в Unity3d, который использует c #.Я использую это как ссылку https://minecraft.gamepedia.com/Region_file_format. Я могу проанализировать таблицу чанков файла региона, и затем я могу использовать эту таблицу, чтобы найти сжатые чанки, начиная с магических байтов zlib 78 9C.Моя идея состоит в том, чтобы использовать System.IO.Compression.DeflateStream для распаковки этого фрагмента данных, но когда я делаю это, я получаю ошибку IOException: Corrupted data ReadInternal, исходящую из CheckResult метода DelfateStreamNative.Если я экспортирую порцию во временный файл и использую nodejs zlib для его раздувания, то он работает, но я думаю, что он пропускает контрольную сумму, потому что независимо от того, сколько данных я ему даю, он работает и возвращает мне что-то.

Я не могу себе представить, что инфлятор .NET сломан, поэтому я должен что-то делать не так.Длина сжатого чанка, который я анализирую до того, как сжатые данные кажутся неправильными, потому что мой первый чанк, как говорят, имеет размер 644 байта, но когда я смотрю на файл в шестнадцатеричном формате, у меня есть 1230 байт до заполнения нулями.К сожалению, 3-битный заголовок блока zlib указывает, что блок динамически сжимается, поэтому я не могу легко определить код EOB, и я действительно не понимаю RFC 1951, поэтому выяснение, где заканчивается буфер дефляции и начинается контрольная сумма, мне не под силу.И снова nodejs zlib не волнует, если я дам ему 644 байта или 1230, но чтобы получить полный распакованный кусок, я предполагаю, что мне нужно предоставить ему все сжатые данные.

Есть кто-нибудь, у кого есть распакованные фрагменты Minecraftв файлах области наковальни дают мне некоторое понимание?

1 Ответ

1 голос
/ 28 мая 2019

Итак, я скомпилировал пример puff.c из github, который предназначен для демонстрации раздувания буферов zlib, и заметил, что синтаксический анализатор не анализирует первые два байта 'магических файлов' буфера, которые я не понимаю, откуда он знает размер окна, поскольку он закодирован в этих байтах. Но в любом случае у меня возникла мысль, что .NET-инфлятор также не хочет этих байтов. И БАМ! Это разбирает. Итак, некоторые советы для тех, кто хочет накачать куски майнкрафта, вам нужно создать смещение поиска в файле .mca как sectorIndex * 4096 + 7, а не sectorIndex * 4096 + 5, и для любого, кто получает ошибку контрольной суммы от System.IO.Compression.DeflateStream, возможно, вам нужно убедиться, что вы отправка ему буфера RFC 1951, а не буфера RFC 1950.

...