summaryrefslogtreecommitdiffstats
path: root/src/WorldStorage
diff options
context:
space:
mode:
Diffstat (limited to 'src/WorldStorage')
-rwxr-xr-xsrc/WorldStorage/WSSAnvil.cpp13
-rw-r--r--src/WorldStorage/WorldStorage.cpp28
2 files changed, 28 insertions, 13 deletions
diff --git a/src/WorldStorage/WSSAnvil.cpp b/src/WorldStorage/WSSAnvil.cpp
index 4fc855589..1d81ac0b7 100755
--- a/src/WorldStorage/WSSAnvil.cpp
+++ b/src/WorldStorage/WSSAnvil.cpp
@@ -459,7 +459,7 @@ bool cWSSAnvil::LoadChunkFromNBT(const cChunkCoords & a_Chunk, const cParsedNBT
} // for y
//*/
- cSetChunkDataPtr SetChunkData(new cSetChunkData(
+ auto SetChunkData(cSetChunkData(
a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ,
BlockTypes, MetaData,
IsLightValid ? BlockLight : nullptr,
@@ -495,7 +495,16 @@ bool cWSSAnvil::SaveChunkToNBT(const cChunkCoords & a_Chunk, cFastNBTWriter & a_
a_Writer.AddInt("zPos", a_Chunk.m_ChunkZ);
cNBTChunkSerializer Serializer(a_Writer);
- if (!m_World->GetChunkData(a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, Serializer))
+ bool DataRetrivalSucceeded;
+
+ m_World->QueueTask(
+ [&Serializer, &a_Chunk, &DataRetrivalSucceeded](cWorld & a_World)
+ {
+ DataRetrivalSucceeded = a_World.GetChunkData(a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ, Serializer);
+ }
+ ).wait();
+
+ if (!DataRetrivalSucceeded)
{
LOGWARNING("Cannot get chunk [%d, %d] data for NBT saving", a_Chunk.m_ChunkX, a_Chunk.m_ChunkZ);
return false;
diff --git a/src/WorldStorage/WorldStorage.cpp b/src/WorldStorage/WorldStorage.cpp
index 55555d731..7c7bb4bfd 100644
--- a/src/WorldStorage/WorldStorage.cpp
+++ b/src/WorldStorage/WorldStorage.cpp
@@ -156,6 +156,7 @@ void cWorldStorage::QueueSaveChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallba
{
ASSERT(m_World->IsChunkValid(a_ChunkX, a_ChunkZ));
+ m_World->MarkChunkSaving(a_ChunkX, a_ChunkZ);
m_SaveQueue.EnqueueItem(cChunkCoordsWithCallback(a_ChunkX, a_ChunkZ, a_Callback));
m_Event.Set();
}
@@ -259,16 +260,18 @@ bool cWorldStorage::SaveOneChunk(void)
return false;
}
- // Save the chunk, if it's valid:
+ cChunkCoords SaveCoordinates(ToSave.m_ChunkX, ToSave.m_ChunkZ);
bool Status = false;
- if (m_World->IsChunkValid(ToSave.m_ChunkX, ToSave.m_ChunkZ))
+
+ // Save the chunk; validity is checked inside a cWorld task:
+ if (m_SaveSchema->SaveChunk(SaveCoordinates))
{
- m_World->MarkChunkSaving(ToSave.m_ChunkX, ToSave.m_ChunkZ);
- if (m_SaveSchema->SaveChunk(cChunkCoords(ToSave.m_ChunkX, ToSave.m_ChunkZ)))
- {
- m_World->MarkChunkSaved(ToSave.m_ChunkX, ToSave.m_ChunkZ);
- Status = true;
- }
+ Status = true;
+ m_World->QueueTask([SaveCoordinates](cWorld & a_World)
+ {
+ a_World.MarkChunkSaved(SaveCoordinates.m_ChunkX, SaveCoordinates.m_ChunkZ);
+ }
+ );
}
// Call the callback, if specified:
@@ -285,8 +288,6 @@ bool cWorldStorage::SaveOneChunk(void)
bool cWorldStorage::LoadChunk(int a_ChunkX, int a_ChunkZ)
{
- ASSERT(m_World->IsChunkQueued(a_ChunkX, a_ChunkZ));
-
cChunkCoords Coords(a_ChunkX, a_ChunkZ);
// First try the schema that is used for saving
@@ -305,7 +306,12 @@ bool cWorldStorage::LoadChunk(int a_ChunkX, int a_ChunkZ)
}
// Notify the chunk owner that the chunk failed to load (sets cChunk::m_HasLoadFailed to true):
- m_World->ChunkLoadFailed(a_ChunkX, a_ChunkZ);
+ m_World->QueueTask(
+ [a_ChunkX, a_ChunkZ](cWorld & a_World)
+ {
+ a_World.ChunkLoadFailed(a_ChunkX, a_ChunkZ);
+ }
+ );
return false;
}