Clean up GenerateChunk/TouchChunk
- Remove TouchChunk - Remove unused bool return value in GenerateChunk - Remove ShouldGenerateIfLoadFailed
This commit is contained in:
parent
72ae5ecb5a
commit
08bd77e547
|
@ -59,7 +59,6 @@ cChunk::cChunk(
|
||||||
cAllocationPool<cChunkData::sChunkSection> & a_Pool
|
cAllocationPool<cChunkData::sChunkSection> & a_Pool
|
||||||
):
|
):
|
||||||
m_Presence(cpInvalid),
|
m_Presence(cpInvalid),
|
||||||
m_ShouldGenerateIfLoadFailed(false),
|
|
||||||
m_IsLightValid(false),
|
m_IsLightValid(false),
|
||||||
m_IsDirty(false),
|
m_IsDirty(false),
|
||||||
m_IsSaving(false),
|
m_IsSaving(false),
|
||||||
|
@ -163,15 +162,6 @@ void cChunk::SetPresence(cChunk::ePresence a_Presence)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cChunk::SetShouldGenerateIfLoadFailed(bool a_ShouldGenerateIfLoadFailed)
|
|
||||||
{
|
|
||||||
m_ShouldGenerateIfLoadFailed = a_ShouldGenerateIfLoadFailed;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cChunk::MarkRegenerating(void)
|
void cChunk::MarkRegenerating(void)
|
||||||
{
|
{
|
||||||
// Set as queued again:
|
// Set as queued again:
|
||||||
|
@ -267,15 +257,8 @@ void cChunk::MarkLoadFailed(void)
|
||||||
{
|
{
|
||||||
ASSERT(m_Presence == cpQueued);
|
ASSERT(m_Presence == cpQueued);
|
||||||
|
|
||||||
// If the chunk is marked as needed, generate it:
|
// The chunk is always needed, generate it:
|
||||||
if (m_ShouldGenerateIfLoadFailed)
|
m_World->GetGenerator().QueueGenerateChunk({m_PosX, m_PosZ}, false);
|
||||||
{
|
|
||||||
m_World->GetGenerator().QueueGenerateChunk({m_PosX, m_PosZ}, false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_Presence = cpInvalid;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -79,9 +79,6 @@ public:
|
||||||
Wakes up any calls to cChunkMap::GetHeight() when setting to cpPresent. */
|
Wakes up any calls to cChunkMap::GetHeight() when setting to cpPresent. */
|
||||||
void SetPresence(ePresence a_Presence);
|
void SetPresence(ePresence a_Presence);
|
||||||
|
|
||||||
/** Called to indicate whether the chunk should be queued in the generator if it fails to load. Set by cChunkMap::GetChunk(). */
|
|
||||||
void SetShouldGenerateIfLoadFailed(bool a_ShouldGenerateIfLoadFailed);
|
|
||||||
|
|
||||||
/** Marks all clients attached to this chunk as wanting this chunk. Also sets presence to cpQueued. */
|
/** Marks all clients attached to this chunk as wanting this chunk. Also sets presence to cpQueued. */
|
||||||
void MarkRegenerating(void);
|
void MarkRegenerating(void);
|
||||||
|
|
||||||
|
@ -106,8 +103,7 @@ public:
|
||||||
void MarkSaved(void); // Marks the chunk as saved, if it didn't change from the last call to MarkSaving()
|
void MarkSaved(void); // Marks the chunk as saved, if it didn't change from the last call to MarkSaving()
|
||||||
void MarkLoaded(void); // Marks the chunk as freshly loaded. Fails if the chunk is already valid
|
void MarkLoaded(void); // Marks the chunk as freshly loaded. Fails if the chunk is already valid
|
||||||
|
|
||||||
/** Marks the chunk as failed to load.
|
/** Queues the chunk for generating. */
|
||||||
If m_ShouldGenerateIfLoadFailed is set, queues the chunk for generating. */
|
|
||||||
void MarkLoadFailed(void);
|
void MarkLoadFailed(void);
|
||||||
|
|
||||||
/** Gets all chunk data, calls the a_Callback's methods for each data type */
|
/** Gets all chunk data, calls the a_Callback's methods for each data type */
|
||||||
|
@ -576,8 +572,6 @@ private:
|
||||||
/** Holds the presence status of the chunk - if it is present, or in the loader / generator queue, or unloaded */
|
/** Holds the presence status of the chunk - if it is present, or in the loader / generator queue, or unloaded */
|
||||||
ePresence m_Presence;
|
ePresence m_Presence;
|
||||||
|
|
||||||
/** If the chunk fails to load, should it be queued in the generator or reset back to invalid? */
|
|
||||||
bool m_ShouldGenerateIfLoadFailed;
|
|
||||||
bool m_IsLightValid; // True if the blocklight and skylight are calculated
|
bool m_IsLightValid; // True if the blocklight and skylight are calculated
|
||||||
bool m_IsDirty; // True if the chunk has changed since it was last saved
|
bool m_IsDirty; // True if the chunk has changed since it was last saved
|
||||||
bool m_IsSaving; // True if the chunk is being saved
|
bool m_IsSaving; // True if the chunk is being saved
|
||||||
|
|
|
@ -1603,16 +1603,6 @@ bool cChunkMap::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString &
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cChunkMap::TouchChunk(int a_ChunkX, int a_ChunkZ)
|
|
||||||
{
|
|
||||||
cCSLock Lock(m_CSChunks);
|
|
||||||
GetChunk(a_ChunkX, a_ChunkZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cChunkMap::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_Callback)
|
void cChunkMap::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_Callback)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSChunks);
|
cCSLock Lock(m_CSChunks);
|
||||||
|
@ -1636,76 +1626,10 @@ void cChunkMap::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkC
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cChunkMap::GenerateChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_Callback)
|
void cChunkMap::GenerateChunk(int a_ChunkX, int a_ChunkZ)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSChunks);
|
cCSLock Lock(m_CSChunks);
|
||||||
cChunkPtr Chunk = GetChunkNoLoad(a_ChunkX, a_ChunkZ);
|
GetChunk(a_ChunkX, a_ChunkZ); // Touches the chunk, loading or generating it
|
||||||
if (Chunk == nullptr)
|
|
||||||
{
|
|
||||||
// Generic error while getting the chunk - out of memory?
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try loading the chunk:
|
|
||||||
if ((Chunk == nullptr) || (!Chunk->IsValid()))
|
|
||||||
{
|
|
||||||
Chunk->SetPresence(cChunk::cpQueued);
|
|
||||||
class cPrepareLoadCallback: public cChunkCoordCallback
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
cPrepareLoadCallback(cWorld & a_CBWorld, cChunkMap & a_CBChunkMap, cChunkCoordCallback * a_CBCallback):
|
|
||||||
m_World(a_CBWorld),
|
|
||||||
m_ChunkMap(a_CBChunkMap),
|
|
||||||
m_Callback(a_CBCallback)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// cChunkCoordCallback override:
|
|
||||||
virtual void Call(cChunkCoords a_Coords, bool a_CBIsSuccess) override
|
|
||||||
{
|
|
||||||
// If success is reported, the chunk is already valid, no need to do anything else:
|
|
||||||
if (a_CBIsSuccess)
|
|
||||||
{
|
|
||||||
if (m_Callback != nullptr)
|
|
||||||
{
|
|
||||||
m_Callback->Call(a_Coords, true);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The chunk failed to load, generate it:
|
|
||||||
cCSLock CBLock(m_ChunkMap.m_CSChunks);
|
|
||||||
cChunkPtr CBChunk = m_ChunkMap.GetChunkNoLoad(a_Coords.m_ChunkX, a_Coords.m_ChunkZ);
|
|
||||||
|
|
||||||
if (CBChunk == nullptr)
|
|
||||||
{
|
|
||||||
// An error occurred, but we promised to call the callback, so call it even when there's no real chunk data:
|
|
||||||
if (m_Callback != nullptr)
|
|
||||||
{
|
|
||||||
m_Callback->Call(a_Coords, false);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CBChunk->SetPresence(cChunk::cpQueued);
|
|
||||||
m_World.GetGenerator().QueueGenerateChunk(a_Coords, false, m_Callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
cWorld & m_World;
|
|
||||||
cChunkMap & m_ChunkMap;
|
|
||||||
cChunkCoordCallback * m_Callback;
|
|
||||||
};
|
|
||||||
m_World->GetStorage().QueueLoadChunk(a_ChunkX, a_ChunkZ, new cPrepareLoadCallback(*m_World, *this, a_Callback));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The chunk is valid, just call the callback:
|
|
||||||
if (a_Callback != nullptr)
|
|
||||||
{
|
|
||||||
a_Callback->Call({a_ChunkX, a_ChunkZ}, true);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -317,9 +317,6 @@ public:
|
||||||
Returns false if there's no sign at those coords, true if found. */
|
Returns false if there's no sign at those coords, true if found. */
|
||||||
bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Lua-accessible
|
bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Lua-accessible
|
||||||
|
|
||||||
/** Touches the chunk, causing it to be loaded or generated */
|
|
||||||
void TouchChunk(int a_ChunkX, int a_ChunkZ);
|
|
||||||
|
|
||||||
/** Queues the chunk for preparing - making sure that it's generated and lit.
|
/** Queues the chunk for preparing - making sure that it's generated and lit.
|
||||||
The specified chunk is queued to be loaded or generated, and lit if needed.
|
The specified chunk is queued to be loaded or generated, and lit if needed.
|
||||||
The specified callback is called after the chunk has been prepared. If there's no preparation to do, only the callback is called.
|
The specified callback is called after the chunk has been prepared. If there's no preparation to do, only the callback is called.
|
||||||
|
@ -327,12 +324,8 @@ public:
|
||||||
void PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter = {}); // Lua-accessible
|
void PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter = {}); // Lua-accessible
|
||||||
|
|
||||||
/** Queues the chunk for generating.
|
/** Queues the chunk for generating.
|
||||||
First attempts to load the chunk from the storage. If that fails, queues the chunk for generating.
|
First attempts to load the chunk from the storage. If that fails, queues the chunk for generating. */
|
||||||
The specified callback is called after the chunk has been loaded / generated.
|
void GenerateChunk(int a_ChunkX, int a_ChunkZ); // Lua-accessible
|
||||||
It is legal to call without the callback.
|
|
||||||
Returns true if successful, false if not (possibly an out-of-memory error).
|
|
||||||
If the return value is true, the callback was / will be called. */
|
|
||||||
bool GenerateChunk(int a_ChunkX, int a_ChunkZ, cChunkCoordCallback * a_CallAfter = nullptr); // Lua-accessible
|
|
||||||
|
|
||||||
/** Marks the chunk as failed-to-load */
|
/** Marks the chunk as failed-to-load */
|
||||||
void ChunkLoadFailed(int a_ChunkX, int a_ChunkZ);
|
void ChunkLoadFailed(int a_ChunkX, int a_ChunkZ);
|
||||||
|
|
|
@ -2870,15 +2870,6 @@ void cWorld::RemoveClientFromChunkSender(cClientHandle * a_Client)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWorld::TouchChunk(int a_ChunkX, int a_ChunkZ)
|
|
||||||
{
|
|
||||||
m_ChunkMap->TouchChunk(a_ChunkX, a_ChunkZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWorld::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter)
|
void cWorld::PrepareChunk(int a_ChunkX, int a_ChunkZ, std::unique_ptr<cChunkCoordCallback> a_CallAfter)
|
||||||
{
|
{
|
||||||
m_ChunkMap->PrepareChunk(a_ChunkX, a_ChunkZ, std::move(a_CallAfter));
|
m_ChunkMap->PrepareChunk(a_ChunkX, a_ChunkZ, std::move(a_CallAfter));
|
||||||
|
@ -2980,7 +2971,6 @@ bool cWorld::SetTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_Op
|
||||||
void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ)
|
void cWorld::RegenerateChunk(int a_ChunkX, int a_ChunkZ)
|
||||||
{
|
{
|
||||||
m_ChunkMap->MarkChunkRegenerating(a_ChunkX, a_ChunkZ);
|
m_ChunkMap->MarkChunkRegenerating(a_ChunkX, a_ChunkZ);
|
||||||
|
|
||||||
m_Generator.QueueGenerateChunk({a_ChunkX, a_ChunkZ}, true);
|
m_Generator.QueueGenerateChunk({a_ChunkX, a_ChunkZ}, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -353,9 +353,6 @@ public:
|
||||||
/** Removes client from ChunkSender's queue of chunks to be sent */
|
/** Removes client from ChunkSender's queue of chunks to be sent */
|
||||||
void RemoveClientFromChunkSender(cClientHandle * a_Client);
|
void RemoveClientFromChunkSender(cClientHandle * a_Client);
|
||||||
|
|
||||||
/** Touches the chunk, causing it to be loaded or generated */
|
|
||||||
void TouchChunk(int a_ChunkX, int a_ChunkZ);
|
|
||||||
|
|
||||||
/** Queues the chunk for preparing - making sure that it's generated and lit.
|
/** Queues the chunk for preparing - making sure that it's generated and lit.
|
||||||
The specified chunk is queued to be loaded or generated, and lit if needed.
|
The specified chunk is queued to be loaded or generated, and lit if needed.
|
||||||
The specified callback is called after the chunk has been prepared. If there's no preparation to do, only the callback is called.
|
The specified callback is called after the chunk has been prepared. If there's no preparation to do, only the callback is called.
|
||||||
|
@ -377,10 +374,10 @@ public:
|
||||||
/** Set the state of a trapdoor. Returns true if the trapdoor was updated, false if there was no trapdoor at those coords. */
|
/** Set the state of a trapdoor. Returns true if the trapdoor was updated, false if there was no trapdoor at those coords. */
|
||||||
bool SetTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_Open); // tolua_export
|
bool SetTrapdoorOpen(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_Open); // tolua_export
|
||||||
|
|
||||||
/** Regenerate the given chunk: */
|
/** Regenerate the given chunk. */
|
||||||
void RegenerateChunk(int a_ChunkX, int a_ChunkZ); // tolua_export
|
void RegenerateChunk(int a_ChunkX, int a_ChunkZ); // tolua_export
|
||||||
|
|
||||||
/** Generates the given chunk */
|
/** Generates the given chunk. */
|
||||||
void GenerateChunk(int a_ChunkX, int a_ChunkZ); // tolua_export
|
void GenerateChunk(int a_ChunkX, int a_ChunkZ); // tolua_export
|
||||||
|
|
||||||
/** Queues a chunk for lighting; a_Callback is called after the chunk is lighted */
|
/** Queues a chunk for lighting; a_Callback is called after the chunk is lighted */
|
||||||
|
|
Loading…
Reference in New Issue