示例#1
0
void ChunkManager::UnloadChunk(Chunk* pChunk)
{
	ChunkCoordKeys coordKeys;
	coordKeys.x = pChunk->GetGridX();
	coordKeys.y = pChunk->GetGridY();
	coordKeys.z = pChunk->GetGridZ();

	Chunk* pChunkXMinus = GetChunk(coordKeys.x - 1, coordKeys.y, coordKeys.z);
	Chunk* pChunkXPlus = GetChunk(coordKeys.x + 1, coordKeys.y, coordKeys.z);
	Chunk* pChunkYMinus = GetChunk(coordKeys.x, coordKeys.y - 1, coordKeys.z);
	Chunk* pChunkYPlus = GetChunk(coordKeys.x, coordKeys.y + 1, coordKeys.z);
	Chunk* pChunkZMinus = GetChunk(coordKeys.x, coordKeys.y, coordKeys.z - 1);
	Chunk* pChunkZPlus = GetChunk(coordKeys.x, coordKeys.y, coordKeys.z + 1);

	if (pChunkXMinus)
	{
		if (pChunkXMinus->GetxPlus())
		{
			pChunkXMinus->SetNumNeighbours(pChunkXMinus->GetNumNeighbours() - 1);
			pChunkXMinus->SetxPlus(NULL);
		}
	}
	if (pChunkXPlus)
	{
		if (pChunkXPlus->GetxMinus())
		{
			pChunkXPlus->SetNumNeighbours(pChunkXPlus->GetNumNeighbours() - 1);
			pChunkXPlus->SetxMinus(NULL);
		}
	}
	if (pChunkYMinus)
	{
		if (pChunkYMinus->GetyPlus())
		{
			pChunkYMinus->SetNumNeighbours(pChunkYMinus->GetNumNeighbours() - 1);
			pChunkYMinus->SetyPlus(NULL);
		}
	}
	if (pChunkYPlus)
	{
		if (pChunkYPlus->GetyMinus())
		{
			pChunkYPlus->SetNumNeighbours(pChunkYPlus->GetNumNeighbours() - 1);
			pChunkYPlus->SetyMinus(NULL);
		}
	}
	if (pChunkZMinus)
	{
		if (pChunkZMinus->GetzPlus())
		{
			pChunkZMinus->SetNumNeighbours(pChunkZMinus->GetNumNeighbours() - 1);
			pChunkZMinus->SetzPlus(NULL);
		}
	}
	if (pChunkZPlus)
	{
		if (pChunkZPlus->GetzMinus())
		{
			pChunkZPlus->SetNumNeighbours(pChunkZPlus->GetNumNeighbours() - 1);
			pChunkZPlus->SetzMinus(NULL);
		}
	}

	// Remove from map
	m_ChunkMapMutexLock.lock();
	map<ChunkCoordKeys, Chunk*>::iterator it = m_chunksMap.find(coordKeys);
	if (it != m_chunksMap.end())
	{
		m_chunksMap.erase(coordKeys);
	}
	m_ChunkMapMutexLock.unlock();

	// Clear chunk linkage
	if (m_pPlayer != NULL)
	{
		m_pPlayer->ClearChunkCacheForChunk(pChunk);
	}

	// Unload and delete
	pChunk->Unload();
	delete pChunk;
}
示例#2
0
void ChunkManager::UpdateChunkNeighbours(Chunk* pChunk, int x, int y, int z)
{
	pChunk->SetNumNeighbours(0);

	Chunk* pChunkXMinus = GetChunk(x - 1, y, z);
	Chunk* pChunkXPlus = GetChunk(x + 1, y, z);
	Chunk* pChunkYMinus = GetChunk(x, y - 1, z);
	Chunk* pChunkYPlus = GetChunk(x, y + 1, z);
	Chunk* pChunkZMinus = GetChunk(x, y, z - 1);
	Chunk* pChunkZPlus = GetChunk(x, y, z + 1);

	if (pChunkXMinus)
	{
		pChunk->SetNumNeighbours(pChunk->GetNumNeighbours() + 1);
		pChunk->SetxMinus(pChunkXMinus);
		if (pChunkXMinus->GetxPlus() == NULL)
		{
			pChunkXMinus->SetNumNeighbours(pChunkXMinus->GetNumNeighbours() + 1);
			pChunkXMinus->SetxPlus(pChunk);
		}
	}
	if (pChunkXPlus)
	{
		pChunk->SetNumNeighbours(pChunk->GetNumNeighbours() + 1);
		pChunk->SetxPlus(pChunkXPlus);
		if (pChunkXPlus->GetxMinus() == NULL)
		{
			pChunkXPlus->SetNumNeighbours(pChunkXPlus->GetNumNeighbours() + 1);
			pChunkXPlus->SetxMinus(pChunk);
		}
	}
	if (pChunkYMinus)
	{
		pChunk->SetNumNeighbours(pChunk->GetNumNeighbours() + 1);
		pChunk->SetyMinus(pChunkYMinus);
		if (pChunkYMinus->GetyPlus() == NULL)
		{
			pChunkYMinus->SetNumNeighbours(pChunkYMinus->GetNumNeighbours() + 1);
			pChunkYMinus->SetyPlus(pChunk);
		}
	}
	if (pChunkYPlus)
	{
		pChunk->SetNumNeighbours(pChunk->GetNumNeighbours() + 1);
		pChunk->SetyPlus(pChunkYPlus);
		if (pChunkYPlus->GetyMinus() == NULL)
		{
			pChunkYPlus->SetNumNeighbours(pChunkYPlus->GetNumNeighbours() + 1);
			pChunkYPlus->SetyMinus(pChunk);
		}
	}
	if (pChunkZMinus)
	{
		pChunk->SetNumNeighbours(pChunk->GetNumNeighbours() + 1);
		pChunk->SetzMinus(pChunkZMinus);
		if (pChunkZMinus->GetzPlus() == NULL)
		{
			pChunkZMinus->SetNumNeighbours(pChunkZMinus->GetNumNeighbours() + 1);
			pChunkZMinus->SetzPlus(pChunk);
		}
	}
	if (pChunkZPlus)
	{
		pChunk->SetNumNeighbours(pChunk->GetNumNeighbours() + 1);
		pChunk->SetzPlus(pChunkZPlus);
		if (pChunkZPlus->GetzMinus() == NULL)
		{
			pChunkZPlus->SetNumNeighbours(pChunkZPlus->GetNumNeighbours() + 1);
			pChunkZPlus->SetzMinus(pChunk);
		}
	}
}