Add executeSaveAll and wait for async chunk saves

This commit is contained in:
ChristianF 2026-03-10 12:30:00 +01:00
parent d7596aa28c
commit b4cd510cc7
10 changed files with 51 additions and 8 deletions

View file

@ -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()
{

View file

@ -74,6 +74,9 @@ public:
// static Logger logger = Logger.getLogger("Minecraft");
static unordered_map<wstring, int> 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;

View file

@ -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

View file

@ -16,6 +16,7 @@
#endif
#include <cstdint>
#include "..\Minecraft.Client\Common\BuildVer.h"
#ifdef _DURANGO
#include <xdk.h>
@ -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"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.