Terrain *TerrainLattice::GetTerrainRelative(Terrain * pTerrain, int positionX, int positionY) { Terrain *pRequestedTerrain = NULL; if (-1 <= positionX && positionX <= 1 && -1 <= positionY && positionY <= 1) { int x, y; pTerrain->GetLatticePosition(x, y); x += positionX; y += positionY; TerrainTileCacheMap_type::iterator iter = m_pCachedTerrains.find(m_CurrentTerrainIndex[ParaTerrain::DIR_CENTER]); if(iter == m_pCachedTerrains.end()) { return NULL; } Terrain *pTerrainCenter = (*iter).second.pTerrain; int centerX, centerY; pTerrainCenter->GetLatticePosition(centerX, centerY); if (abs(x - centerX) <= m_WidthActiveTerrains && abs(y - centerY) <= m_HeightActiveTerrains) { if (0 <= x && 0 <= y) pRequestedTerrain = GetTerrain(x, y); } } return pRequestedTerrain; }
void TerrainLattice::SaveTerrain(bool bHeightMap, bool bTextures) { bool bSaveConfigFile = false; TerrainTileCacheMap_type::iterator itCurCP, itEndCP = m_pCachedTerrains.end(); for( itCurCP = m_pCachedTerrains.begin(); itCurCP != itEndCP; ++ itCurCP) { Terrain* pTerrain = (*itCurCP).second.pTerrain; if(pTerrain->IsModified()) { if(pTerrain->IsEmpty()){ pTerrain->SetModified(false, MODIFIED_ALL); } else { int x,y; pTerrain->GetLatticePosition(x,y); string sConfig = CGlobals::GetWorldInfo()->GetTerrainConfigFile(x,y); if(pTerrain->m_sConfigFile != sConfig) { pTerrain->m_sConfigFile = sConfig; pTerrain->SetModified(true, MODIFIED_CONFIGURATION | MODIFIED_TEXTURE); if (m_pLoader) { m_pLoader->UpdateTileConfigFile(x,y, sConfig); } bSaveConfigFile = true; } pTerrain->SaveToFile(); pTerrain->SetModified(false, MODIFIED_ALL); } } } // save global world config file if any terrain tile is newly created. if(m_bIsGlobalConfigModified || bSaveConfigFile) { if(m_pLoader){ m_pLoader->SaveWorldConfigFile(); } } m_bIsGlobalConfigModified = false; }