mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 02:43:44 +00:00
fix(level): read pre-chunk scene files of versions 31 and 33
Two fields of the scene files from before chunks were read for versions the client does not read them for (SceneLoader::ReadLvlFile, 1.10.64): - the "important" byte after the version and type is there only from version 32 (SceneLoader::ReadLvlHeader, 0x010117d0: headerVersion < 32 sets it to 0); - the five strings after the skydome's file are there only from version 34 (SceneLoader::ReadSkydomeInfo, 0x0102f550: headerVersion > 33); the reader took them from version 33. Seven scenes of the alpha leak (versions 31 and 33: Gnarled_assetsMIKET, dennis_gnarled_forest_02/_03-ninja/_03-pirate_0, scale_TEST_2, scale_test_2_0, scale_test_general) now read with all their objects. Every other scene file on disk reads the same objects as before. Check in game: every world spawns its objects as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -42,9 +42,9 @@ void LevelFile::Read(std::istream& file) {
|
||||
header.id = ChunkTypeID::FileInfo;
|
||||
BinaryIO::BinaryRead(file, header.chunkVersion);
|
||||
BinaryIO::BinaryRead(file, header.chunkType);
|
||||
// Only from version 32 (SceneLoader::ReadLvlHeader)
|
||||
uint8_t important = 0;
|
||||
BinaryIO::BinaryRead(file, important);
|
||||
// file.ignore(1); //probably used
|
||||
if (header.chunkVersion >= 32) BinaryIO::BinaryRead(file, important);
|
||||
if (header.chunkVersion > 36) {
|
||||
BinaryIO::BinaryRead(file, header.fileInfo.revision);
|
||||
}
|
||||
@@ -87,7 +87,8 @@ void LevelFile::Read(std::istream& file) {
|
||||
BinaryIO::BinaryRead(file, count);
|
||||
file.ignore(count);
|
||||
|
||||
if (header.chunkVersion >= 33) {
|
||||
// Five more strings from version 34 (SceneLoader::ReadSkydomeInfo)
|
||||
if (header.chunkVersion >= 34) {
|
||||
for (uint32_t i = 0; i < 5; ++i) {
|
||||
uint32_t count = 0;
|
||||
BinaryIO::BinaryRead(file, count);
|
||||
|
||||
@@ -276,7 +276,7 @@ TEST(LevelFileTests, ReadsChunkedObjects) {
|
||||
// Some live scenes (e.g. Nimbus Station's Gnarled Forest launch pad) are from before chunks
|
||||
TEST(LevelFileTests, ReadsFilesWithoutChunks) {
|
||||
ZoneBytes w;
|
||||
w.Put<uint16_t>(30).Put<uint16_t>(0).Put<uint8_t>(1); // version, type, important
|
||||
w.Put<uint16_t>(30).Put<uint16_t>(0); // version, type; no important byte before 32
|
||||
w.data.append(48 + 12, '\0'); // version 30 settings the world skips
|
||||
w.Put<uint32_t>(0); // no skydome
|
||||
w.Put<uint32_t>(1);
|
||||
@@ -293,7 +293,7 @@ TEST(LevelFileTests, ReadsFilesWithoutChunks) {
|
||||
|
||||
TEST(LevelFileTests, DamagedFilesKeepWhatWasRead) {
|
||||
ZoneBytes w;
|
||||
w.Put<uint16_t>(30).Put<uint16_t>(0).Put<uint8_t>(1);
|
||||
w.Put<uint16_t>(30).Put<uint16_t>(0);
|
||||
w.data.append(48 + 12, '\0');
|
||||
w.Put<uint32_t>(0).Put<uint32_t>(2);
|
||||
w.Object(30, 1, 0, "a=0:b");
|
||||
|
||||
Reference in New Issue
Block a user