Added a cWorld:PrepareChunk function.
It prepares the chunk - loads or generates it and lights it. The spawn prepare process uses this function.
This commit is contained in:
@@ -140,11 +140,11 @@ size_t cWorldStorage::GetSaveQueueLength(void)
|
||||
|
||||
|
||||
|
||||
void cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkZ)
|
||||
void cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_Callback)
|
||||
{
|
||||
ASSERT(m_World->IsChunkQueued(a_ChunkX, a_ChunkZ));
|
||||
|
||||
m_LoadQueue.EnqueueItem(cChunkCoords(a_ChunkX, a_ChunkZ));
|
||||
m_LoadQueue.EnqueueItem(cChunkCoordsWithCallback(a_ChunkX, a_ChunkZ, a_Callback));
|
||||
m_Event.Set();
|
||||
}
|
||||
|
||||
@@ -152,11 +152,11 @@ void cWorldStorage::QueueLoadChunk(int a_ChunkX, int a_ChunkZ)
|
||||
|
||||
|
||||
|
||||
void cWorldStorage::QueueSaveChunk(int a_ChunkX, int a_ChunkZ)
|
||||
void cWorldStorage::QueueSaveChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_Callback)
|
||||
{
|
||||
ASSERT(m_World->IsChunkValid(a_ChunkX, a_ChunkZ));
|
||||
|
||||
m_SaveQueue.EnqueueItemIfNotPresent(cChunkCoords(a_ChunkX, a_ChunkZ));
|
||||
m_SaveQueue.EnqueueItem(cChunkCoordsWithCallback(a_ChunkX, a_ChunkZ, a_Callback));
|
||||
m_Event.Set();
|
||||
}
|
||||
|
||||
@@ -166,7 +166,11 @@ void cWorldStorage::QueueSaveChunk(int a_ChunkX, int a_ChunkZ)
|
||||
|
||||
void cWorldStorage::UnqueueLoad(int a_ChunkX, int a_ChunkZ)
|
||||
{
|
||||
m_LoadQueue.Remove(cChunkCoords(a_ChunkX, a_ChunkZ));
|
||||
m_LoadQueue.RemoveIf([=](cChunkCoordsWithCallback & a_Item)
|
||||
{
|
||||
return (a_Item.m_ChunkX == a_ChunkX) && (a_Item.m_ChunkZ == a_ChunkZ);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -175,7 +179,11 @@ void cWorldStorage::UnqueueLoad(int a_ChunkX, int a_ChunkZ)
|
||||
|
||||
void cWorldStorage::UnqueueSave(const cChunkCoords & a_Chunk)
|
||||
{
|
||||
m_SaveQueue.Remove(a_Chunk);
|
||||
m_SaveQueue.RemoveIf([=](cChunkCoordsWithCallback & a_Item)
|
||||
{
|
||||
return (a_Item.m_ChunkX == a_Chunk.m_ChunkX) && (a_Item.m_ChunkZ == a_Chunk.m_ChunkZ);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -244,14 +252,23 @@ void cWorldStorage::Execute(void)
|
||||
|
||||
bool cWorldStorage::LoadOneChunk(void)
|
||||
{
|
||||
cChunkCoords ToLoad(0, 0);
|
||||
// Dequeue an item, bail out if there's none left:
|
||||
cChunkCoordsWithCallback ToLoad(0, 0, nullptr);
|
||||
bool ShouldLoad = m_LoadQueue.TryDequeueItem(ToLoad);
|
||||
|
||||
if (ShouldLoad)
|
||||
if (!ShouldLoad)
|
||||
{
|
||||
return LoadChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkZ);
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
|
||||
// Load the chunk:
|
||||
bool res = LoadChunk(ToLoad.m_ChunkX, ToLoad.m_ChunkZ);
|
||||
|
||||
// Call the callback, if specified:
|
||||
if (ToLoad.m_Callback != nullptr)
|
||||
{
|
||||
ToLoad.m_Callback->Call(ToLoad.m_ChunkX, ToLoad.m_ChunkZ);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
@@ -260,17 +277,30 @@ bool cWorldStorage::LoadOneChunk(void)
|
||||
|
||||
bool cWorldStorage::SaveOneChunk(void)
|
||||
{
|
||||
cChunkCoords ToSave(0, 0);
|
||||
// Dequeue one chunk to save:
|
||||
cChunkCoordsWithCallback ToSave(0, 0, nullptr);
|
||||
bool ShouldSave = m_SaveQueue.TryDequeueItem(ToSave);
|
||||
if (ShouldSave && m_World->IsChunkValid(ToSave.m_ChunkX, ToSave.m_ChunkZ))
|
||||
if (!ShouldSave)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Save the chunk, if it's valid:
|
||||
if (m_World->IsChunkValid(ToSave.m_ChunkX, ToSave.m_ChunkZ))
|
||||
{
|
||||
m_World->MarkChunkSaving(ToSave.m_ChunkX, ToSave.m_ChunkZ);
|
||||
if (m_SaveSchema->SaveChunk(ToSave))
|
||||
if (m_SaveSchema->SaveChunk(cChunkCoords(ToSave.m_ChunkX, ToSave.m_ChunkZ)))
|
||||
{
|
||||
m_World->MarkChunkSaved(ToSave.m_ChunkX, ToSave.m_ChunkZ);
|
||||
}
|
||||
}
|
||||
return ShouldSave;
|
||||
|
||||
// Call the callback, if specified:
|
||||
if (ToSave.m_Callback != nullptr)
|
||||
{
|
||||
ToSave.m_Callback->Call(ToSave.m_ChunkX, ToSave.m_ChunkZ);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user