diff --git a/Minecraft.Client/MinecraftServer.cpp b/Minecraft.Client/MinecraftServer.cpp index bdcc9f813..8f40d9297 100644 --- a/Minecraft.Client/MinecraftServer.cpp +++ b/Minecraft.Client/MinecraftServer.cpp @@ -23,6 +23,7 @@ #include "..\Minecraft.World\net.minecraft.world.level.storage.h" #include "..\Minecraft.World\net.minecraft.world.h" #include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\ChunkStorage.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" #include "..\Minecraft.World\Pos.h" #include "..\Minecraft.World\System.h" @@ -234,11 +235,7 @@ static bool ExecuteConsoleCommand(MinecraftServer *server, const wstring &rawCom if (action == L"save-all") { - if (playerList != nullptr) - { - playerList->saveAll(nullptr, false); - } - server->info(L"World saved."); + server->executeSaveAll(); return true; } @@ -1369,6 +1366,46 @@ void MinecraftServer::saveAllChunks() } } +// 4J-JEV: Added +void MinecraftServer::executeSaveAll() +{ + broadcastStartSavingPacket(); + if (players != nullptr) + { + players->saveAll(Minecraft::GetInstance()->progressRenderer, false); + } + + for (unsigned int i = 0; i < levels.length; i++) + { + ServerLevel *level = levels[levels.length - 1 - i]; + if (level != nullptr) + { + level->save(true, Minecraft::GetInstance()->progressRenderer); + } + } + + if (levels[0] != nullptr) + { + levels[0]->saveToDisc(Minecraft::GetInstance()->progressRenderer, false); + } + + saveGameRules(); + + // 4J - ensure all asynchronous chunk saves are completed + for (unsigned int i = 0; i < levels.length; i++) + { + ServerLevel *level = levels[i]; + if (level != nullptr && level->cache != nullptr && level->cache->getStorage() != nullptr) + { + level->cache->getStorage()->WaitForAll(); + } + } + + broadcastStopSavingPacket(); + + info(L"World saved."); +} + // 4J-JEV: Added void MinecraftServer::saveGameRules() { diff --git a/Minecraft.Client/MinecraftServer.h b/Minecraft.Client/MinecraftServer.h index a33888bcc..45f000db3 100644 --- a/Minecraft.Client/MinecraftServer.h +++ b/Minecraft.Client/MinecraftServer.h @@ -74,6 +74,9 @@ public: // static Logger logger = Logger.getLogger("Minecraft"); static unordered_map ironTimers; + void saveAllChunks(); + void saveGameRules(); + void executeSaveAll(); private: static const int DEFAULT_MINECRAFT_PORT = 25565; @@ -142,8 +145,7 @@ private: bool loadLevel(LevelStorageSource *storageSource, const wstring& name, int64_t levelSeed, LevelType *pLevelType, NetworkGameInitData *initData); void setProgress(const wstring& status, int progress); void endProgress(); - void saveAllChunks(); - void saveGameRules(); +private: void stopServer(bool didInit); #ifdef _LARGE_WORLDS void overwriteBordersForNewWorldSize(ServerLevel* level); @@ -207,6 +209,7 @@ public: static void resetFlags() { s_bServerHalted = false; s_bSaveOnExitAnswered = false; } bool flagEntitiesToBeRemoved(unsigned int *flags); // 4J added + //void MinecraftServer::executeSaveAll(); private: //4J Added static MinecraftServer *server; diff --git a/Minecraft.Client/ServerChunkCache.h b/Minecraft.Client/ServerChunkCache.h index cf93fdc55..f1fced5d9 100644 --- a/Minecraft.Client/ServerChunkCache.h +++ b/Minecraft.Client/ServerChunkCache.h @@ -1,6 +1,7 @@ #pragma once #include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\File.h" +#include "..\Minecraft.World\ChunkStorage.h" #include "..\Minecraft.World\net.minecraft.world.level.storage.h" #include "..\Minecraft.World\JavaIntHash.h" #include "..\Minecraft.World\RandomLevelSource.h" @@ -53,6 +54,7 @@ public: #endif virtual LevelChunk **getCache() { return cache; } // 4J added + virtual ChunkStorage *getStorage() { return storage; } // 4J added // 4J-JEV Added; Remove chunk from the toDrop queue. #ifdef _LARGE_WORLDS diff --git a/Minecraft.World/stdafx.h b/Minecraft.World/stdafx.h index 37ec371f5..babeffa04 100644 --- a/Minecraft.World/stdafx.h +++ b/Minecraft.World/stdafx.h @@ -16,6 +16,7 @@ #endif #include +#include "..\Minecraft.Client\Common\BuildVer.h" #ifdef _DURANGO #include @@ -192,7 +193,7 @@ void MemSect(int sect); #include "..\Minecraft.Client\Common\Minecraft_Macros.h" #include "..\Minecraft.Client\Common\Colours\ColourTable.h" -#include "..\Minecraft.Client\Common\BuildVer.h" + #ifdef _XBOX #include "..\Minecraft.Client\Xbox\Xbox_App.h" diff --git a/x64/Release/redist64/binkawin64.asi b/x64/Release/redist64/binkawin64.asi index d363b31db..f0574d9d8 100644 Binary files a/x64/Release/redist64/binkawin64.asi and b/x64/Release/redist64/binkawin64.asi differ diff --git a/x64/Release/redist64/mss64dolby.flt b/x64/Release/redist64/mss64dolby.flt index 7e9eb6054..1842df34b 100644 Binary files a/x64/Release/redist64/mss64dolby.flt and b/x64/Release/redist64/mss64dolby.flt differ diff --git a/x64/Release/redist64/mss64ds3d.flt b/x64/Release/redist64/mss64ds3d.flt index c6a6a1252..77a0f8aaf 100644 Binary files a/x64/Release/redist64/mss64ds3d.flt and b/x64/Release/redist64/mss64ds3d.flt differ diff --git a/x64/Release/redist64/mss64dsp.flt b/x64/Release/redist64/mss64dsp.flt index 28caa28e9..5b47b314e 100644 Binary files a/x64/Release/redist64/mss64dsp.flt and b/x64/Release/redist64/mss64dsp.flt differ diff --git a/x64/Release/redist64/mss64eax.flt b/x64/Release/redist64/mss64eax.flt index c91b6e163..18d0033db 100644 Binary files a/x64/Release/redist64/mss64eax.flt and b/x64/Release/redist64/mss64eax.flt differ diff --git a/x64/Release/redist64/mss64srs.flt b/x64/Release/redist64/mss64srs.flt index 01baef15a..9412318ae 100644 Binary files a/x64/Release/redist64/mss64srs.flt and b/x64/Release/redist64/mss64srs.flt differ