1
0
cuberite-2a/src/ChunkStay.cpp
madmaxoft 9cebc9157c Rewritten Lua ChunkStay API into a single function, cWorld:ChunkStay().
This fixes problems with indeterminate class object lifespan (Lua-GC) and forgetting to disable it or keep it until ready.
2014-02-10 22:47:10 +01:00

138 lines
2.0 KiB
C++

// ChunkStay.cpp
// Implements the cChunkStay class representing a base for classes that keep chunks loaded
#include "Globals.h"
#include "ChunkStay.h"
#include "ChunkMap.h"
cChunkStay::cChunkStay(void) :
m_ChunkMap(NULL)
{
}
cChunkStay::~cChunkStay()
{
Clear();
}
void cChunkStay::Clear(void)
{
if (m_ChunkMap != NULL)
{
Disable();
}
m_Chunks.clear();
}
void cChunkStay::Add(int a_ChunkX, int a_ChunkZ)
{
ASSERT(m_ChunkMap == NULL);
for (cChunkCoordsVector::const_iterator itr = m_Chunks.begin(); itr != m_Chunks.end(); ++itr)
{
if ((itr->m_ChunkX == a_ChunkX) && (itr->m_ChunkZ == a_ChunkZ))
{
// Already present
return;
}
} // for itr - Chunks[]
m_Chunks.push_back(cChunkCoords(a_ChunkX, ZERO_CHUNK_Y, a_ChunkZ));
}
void cChunkStay::Remove(int a_ChunkX, int a_ChunkZ)
{
ASSERT(m_ChunkMap == NULL);
for (cChunkCoordsVector::iterator itr = m_Chunks.begin(); itr != m_Chunks.end(); ++itr)
{
if ((itr->m_ChunkX == a_ChunkX) && (itr->m_ChunkZ == a_ChunkZ))
{
// Found, un-"stay"
m_Chunks.erase(itr);
return;
}
} // for itr - m_Chunks[]
}
void cChunkStay::Enable(cChunkMap & a_ChunkMap)
{
ASSERT(m_ChunkMap == NULL);
m_OutstandingChunks = m_Chunks;
m_ChunkMap = &a_ChunkMap;
a_ChunkMap.AddChunkStay(*this);
}
void cChunkStay::Disable(void)
{
ASSERT(m_ChunkMap != NULL);
m_ChunkMap->DelChunkStay(*this);
m_ChunkMap = NULL;
}
bool cChunkStay::ChunkAvailable(int a_ChunkX, int a_ChunkZ)
{
// Check if this is a chunk that we want:
bool IsMine = false;
for (cChunkCoordsVector::iterator itr = m_OutstandingChunks.begin(), end = m_OutstandingChunks.end(); itr != end; ++itr)
{
if ((itr->m_ChunkX == a_ChunkX) && (itr->m_ChunkZ == a_ChunkZ))
{
m_OutstandingChunks.erase(itr);
IsMine = true;
break;
}
} // for itr - m_OutstandingChunks[]
if (!IsMine)
{
return false;
}
// Call the appropriate callbacks:
OnChunkAvailable(a_ChunkX, a_ChunkZ);
if (m_OutstandingChunks.empty())
{
return OnAllChunksAvailable();
}
return false;
}