fixed Gamemode not saving

This commit is contained in:
Marvelco 2026-03-11 06:31:50 +02:00
parent 1036b7368e
commit 98fe275783

View file

@ -249,13 +249,105 @@ UIScene_LoadMenu::UIScene_LoadMenu(int iPad, void *initData, UILayer *parentLaye
#endif
#endif
#ifdef _WINDOWS64
if (params->saveDetails != nullptr && params->saveDetails->UTF8SaveName[0] != '\0')
if (params->saveDetails != nullptr && params->saveDetails->UTF8SaveFilename[0] != '\0')
{
wchar_t wSaveName[128];
ZeroMemory(wSaveName, sizeof(wSaveName));
mbstowcs(wSaveName, params->saveDetails->UTF8SaveName, 127);
m_levelName = wstring(wSaveName);
m_labelGameName.init(m_levelName);
wchar_t wFilename[MAX_SAVEFILENAME_LENGTH];
ZeroMemory(wFilename, sizeof(wFilename));
mbstowcs(wFilename, params->saveDetails->UTF8SaveFilename, MAX_SAVEFILENAME_LENGTH - 1);
wstring filePath = wstring(L"Windows64\\GameHDD\\") + wstring(wFilename) + wstring(L"\\saveData.ms");
HANDLE hFile = CreateFileW(filePath.c_str(), GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr);
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD fileSize = GetFileSize(hFile, nullptr);
unsigned char* rawData = new unsigned char[fileSize];
DWORD bytesRead = 0;
ReadFile(hFile, rawData, fileSize, &bytesRead, nullptr);
CloseHandle(hFile);
unsigned char* saveData = rawData;
unsigned int saveSize = fileSize;
bool freeSaveData = false;
if (*(unsigned int*)rawData == 0)
{
unsigned int decompSize = *(unsigned int*)(rawData + 4);
if (decompSize > 0 && decompSize <= 128 * 1024 * 1024)
{
saveData = new unsigned char[decompSize];
Compression::getCompression()->Decompress(saveData, &decompSize, rawData + 8, fileSize - 8);
saveSize = decompSize;
freeSaveData = true;
}
}
if (saveSize >= 12)
{
unsigned int headerOffset = *(unsigned int*)saveData;
unsigned int numEntries = *(unsigned int*)(saveData + 4);
const unsigned int entrySize = sizeof(FileEntrySaveData);
if (headerOffset < saveSize && numEntries > 0 && numEntries < 10000 && headerOffset + numEntries * entrySize <= saveSize)
{
FileEntrySaveData* table = (FileEntrySaveData*)(saveData + headerOffset);
for (unsigned int i = 0; i < numEntries; i++)
{
if (wcscmp(table[i].filename, L"level.dat") == 0)
{
unsigned int off = table[i].startOffset;
unsigned int len = table[i].length;
if (off >= 12 && off + len <= saveSize && len > 0 && len < 4 * 1024 * 1024)
{
byteArray ba;
ba.data = (byte*)(saveData + off);
ba.length = len;
CompoundTag* root = NbtIo::decompress(ba);
if (root != nullptr)
{
CompoundTag* dataTag = root->getCompound(L"Data");
if (dataTag != nullptr)
{
int savedGameType = dataTag->getInt(L"GameType");
switch (savedGameType)
{
case 1:
m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE));
m_bGameModeCreative = true;
m_iGameModeId = GameType::CREATIVE->getId();
break;
#ifdef _ADVENTURE_MODE_ENABLED
case 2:
m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_ADVENTURE));
m_bGameModeCreative = false;
m_iGameModeId = GameType::ADVENTURE->getId();
break;
#endif
default:
m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_SURVIVAL));
m_bGameModeCreative = false;
m_iGameModeId = GameType::SURVIVAL->getId();
break;
}
}
delete root;
}
}
break;
}
}
}
}
if (freeSaveData) delete[] saveData;
delete[] rawData;
}
m_bRetrievingSaveThumbnail = false;
}
#endif
}