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; }
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); } } }