void cPrefabStructure::PlacePieceOnGround(cPlacedPiece & a_Piece) { cPiece::cConnector FirstConnector = a_Piece.GetRotatedConnector(0); int ChunkX, ChunkZ; int BlockX = FirstConnector.m_Pos.x; int BlockZ = FirstConnector.m_Pos.z; int BlockY; cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ); cChunkDef::HeightMap HeightMap; m_HeightGen->GenHeightMap(ChunkX, ChunkZ, HeightMap); int TerrainHeight = cChunkDef::GetHeight(HeightMap, BlockX, BlockZ); a_Piece.MoveToGroundBy(TerrainHeight - FirstConnector.m_Pos.y + 1); }
virtual int GetPieceWeight( const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector, const cPiece & a_NewPiece ) override { // Check against the density: if (a_ExistingConnector.m_Type == 1) { const Vector3i & Coords = a_PlacedPiece.GetRotatedConnector(a_ExistingConnector).m_Pos; int rnd = (m_Noise.IntNoise3DInt(Coords.x, Coords.y, Coords.z) / 7) % 100; if (rnd > m_Density) { return 0; } } // Density check passed, relay to m_Prefabs: return m_Prefabs.GetPieceWeight(a_PlacedPiece, a_ExistingConnector, a_NewPiece); }