mirror of
https://github.com/smartcmd/MinecraftConsoles.git
synced 2026-05-09 00:24:15 +00:00
Fixed DLC map loading / saving, missing chunks (#1114)
* fixed all DLC maps * fixed old saves have overlapping chunks with the new system
This commit is contained in:
@@ -455,6 +455,74 @@ unordered_map<wstring, ConsoleSchematicFile *> *LevelGenerationOptions::getUnfin
|
|||||||
|
|
||||||
void LevelGenerationOptions::loadBaseSaveData()
|
void LevelGenerationOptions::loadBaseSaveData()
|
||||||
{
|
{
|
||||||
|
#ifdef _WINDOWS64
|
||||||
|
|
||||||
|
int gameRulesCount = m_parentDLCPack ? m_parentDLCPack->getDLCItemsCount(DLCManager::e_DLCType_GameRulesHeader) : 0;
|
||||||
|
|
||||||
|
wstring baseSave = getBaseSavePath();
|
||||||
|
wstring packName = baseSave.substr(0, baseSave.find(L'.'));
|
||||||
|
|
||||||
|
for (int i = 0; i < gameRulesCount; ++i)
|
||||||
|
{
|
||||||
|
DLCGameRulesHeader* dlcFile = static_cast<DLCGameRulesHeader*>(m_parentDLCPack->getFile(DLCManager::e_DLCType_GameRulesHeader, i));
|
||||||
|
|
||||||
|
if (!dlcFile->getGrfPath().empty())
|
||||||
|
{
|
||||||
|
File grf(L"Windows64Media\\DLC\\" + packName + L"\\Data\\" + dlcFile->getGrfPath());
|
||||||
|
|
||||||
|
if (grf.exists())
|
||||||
|
{
|
||||||
|
wstring path = grf.getPath();
|
||||||
|
HANDLE fileHandle = CreateFileW(path.c_str(), GENERIC_READ, 0, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr);
|
||||||
|
|
||||||
|
if (fileHandle != INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
DWORD dwFileSize = grf.length();
|
||||||
|
DWORD bytesRead;
|
||||||
|
PBYTE pbData = new BYTE[dwFileSize];
|
||||||
|
BOOL bSuccess = ReadFile(fileHandle, pbData, dwFileSize, &bytesRead, nullptr);
|
||||||
|
CloseHandle(fileHandle);
|
||||||
|
|
||||||
|
if (bSuccess)
|
||||||
|
{
|
||||||
|
dlcFile->setGrfData(pbData, dwFileSize, m_stringTable);
|
||||||
|
app.m_gameRules.setLevelGenerationOptions(dlcFile->lgo);
|
||||||
|
}
|
||||||
|
delete[] pbData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requiresBaseSave() && !getBaseSavePath().empty())
|
||||||
|
{
|
||||||
|
File save(L"Windows64Media\\DLC\\" + packName + L"\\Data\\" + baseSave);
|
||||||
|
|
||||||
|
if (save.exists())
|
||||||
|
{
|
||||||
|
wstring path = save.getPath();
|
||||||
|
HANDLE fileHandle = CreateFileW(path.c_str(), GENERIC_READ, 0, nullptr, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, nullptr);
|
||||||
|
|
||||||
|
if (fileHandle != INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
DWORD dwFileSize = GetFileSize(fileHandle, nullptr);
|
||||||
|
DWORD bytesRead;
|
||||||
|
PBYTE pbData = new BYTE[dwFileSize];
|
||||||
|
BOOL bSuccess = ReadFile(fileHandle, pbData, dwFileSize, &bytesRead, nullptr);
|
||||||
|
CloseHandle(fileHandle);
|
||||||
|
|
||||||
|
if (bSuccess)
|
||||||
|
setBaseSaveData(pbData, dwFileSize);
|
||||||
|
else
|
||||||
|
delete[] pbData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setLoadedData();
|
||||||
|
app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack);
|
||||||
|
|
||||||
|
#else
|
||||||
int mountIndex = -1;
|
int mountIndex = -1;
|
||||||
if(m_parentDLCPack != nullptr) mountIndex = m_parentDLCPack->GetDLCMountIndex();
|
if(m_parentDLCPack != nullptr) mountIndex = m_parentDLCPack->GetDLCMountIndex();
|
||||||
|
|
||||||
@@ -481,6 +549,7 @@ void LevelGenerationOptions::loadBaseSaveData()
|
|||||||
setLoadedData();
|
setLoadedData();
|
||||||
app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack);
|
app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int LevelGenerationOptions::packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask)
|
int LevelGenerationOptions::packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask)
|
||||||
|
|||||||
@@ -942,13 +942,18 @@ int CGameNetworkManager::ServerThreadProc( void* lpParameter )
|
|||||||
app.SetGameHostOption(eGameHostOption_All,param->settings);
|
app.SetGameHostOption(eGameHostOption_All,param->settings);
|
||||||
|
|
||||||
// 4J Stu - If we are loading a DLC save that's separate from the texture pack, load
|
// 4J Stu - If we are loading a DLC save that's separate from the texture pack, load
|
||||||
if( param->levelGen != nullptr && (param->texturePackId == 0 || param->levelGen->getRequiredTexturePackId() != param->texturePackId) )
|
if (param != nullptr && param->levelGen != nullptr && param->levelGen->isFromDLC())
|
||||||
{
|
{
|
||||||
while((Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin()))
|
while((Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin()))
|
||||||
{
|
{
|
||||||
Sleep(1);
|
Sleep(1);
|
||||||
}
|
}
|
||||||
param->levelGen->loadBaseSaveData();
|
param->levelGen->loadBaseSaveData();
|
||||||
|
|
||||||
|
while (!param->levelGen->hasLoadedData())
|
||||||
|
{
|
||||||
|
Sleep(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -937,7 +937,11 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring
|
|||||||
|
|
||||||
storage = shared_ptr<McRegionLevelStorage>(new McRegionLevelStorage(newFormatSave, File(L"."), name, true));
|
storage = shared_ptr<McRegionLevelStorage>(new McRegionLevelStorage(newFormatSave, File(L"."), name, true));
|
||||||
#else
|
#else
|
||||||
storage = std::make_shared<McRegionLevelStorage>(new ConsoleSaveFileOriginal(L""), File(L"."), name, true);
|
ConsoleSaveFileOriginal* pSave = new ConsoleSaveFileOriginal(L"");
|
||||||
|
|
||||||
|
pSave->ConvertToLocalPlatform();
|
||||||
|
storage = std::make_shared<McRegionLevelStorage>(pSave, File(L"."), name, true);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,11 @@ bool RegionFileCache::useSplitSaves(ESavePlatform platform)
|
|||||||
case SAVE_FILE_PLATFORM_XBONE:
|
case SAVE_FILE_PLATFORM_XBONE:
|
||||||
case SAVE_FILE_PLATFORM_PS4:
|
case SAVE_FILE_PLATFORM_PS4:
|
||||||
return true;
|
return true;
|
||||||
|
case SAVE_FILE_PLATFORM_WIN64:
|
||||||
|
{
|
||||||
|
LevelGenerationOptions* lgo = app.getLevelGenerationOptions();
|
||||||
|
return (lgo != nullptr && lgo->isFromDLC());
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user