示例#1
0
cBlockEntity * cChunkDesc::GetBlockEntity(int a_RelX, int a_RelY, int a_RelZ)
{
	auto Idx = cChunkDef::MakeIndex(a_RelX, a_RelY, a_RelZ);
	auto itr = m_BlockEntities.find(Idx);

	if (itr != m_BlockEntities.end())
	{
		// Already in the list:
		cBlockEntity * BlockEntity = itr->second;
		if (BlockEntity->GetBlockType() == GetBlockType(a_RelX, a_RelY, a_RelZ))
		{
			// Correct type, already present. Return it:
			return BlockEntity;
		}
		else
		{
			// Wrong type, the block type has been overwritten. Erase and create new:
			m_BlockEntities.erase(itr);
		}
	}

	int AbsX = a_RelX + m_ChunkX * cChunkDef::Width;
	int AbsZ = a_RelZ + m_ChunkZ * cChunkDef::Width;

	// The block entity is not created yet, try to create it and add to list:
	cBlockEntity * be = cBlockEntity::CreateByBlockType(GetBlockType(a_RelX, a_RelY, a_RelZ), GetBlockMeta(a_RelX, a_RelY, a_RelZ), AbsX, a_RelY, AbsZ);
	if (be == nullptr)
	{
		// No block entity for this block type
		return nullptr;
	}
	m_BlockEntities.insert({ Idx, be });
	return be;
}
示例#2
0
cBlockEntity * cChunkDesc::GetBlockEntity(int a_RelX, int a_RelY, int a_RelZ)
{
	int AbsX = a_RelX + m_ChunkX * cChunkDef::Width;
	int AbsZ = a_RelZ + m_ChunkZ * cChunkDef::Width;
	for (cBlockEntityList::iterator itr = m_BlockEntities.begin(), end = m_BlockEntities.end(); itr != end; ++itr)
	{
		if (((*itr)->GetPosX() == AbsX) && ((*itr)->GetPosY() == a_RelY) && ((*itr)->GetPosZ() == AbsZ))
		{
			// Already in the list:
			if ((*itr)->GetBlockType() != GetBlockType(a_RelX, a_RelY, a_RelZ))
			{
				// Wrong type, the block type has been overwritten. Erase and create new:
				m_BlockEntities.erase(itr);
				break;
			}
			// Correct type, already present. Return it:
			return *itr;
		}
	}  // for itr - m_BlockEntities[]
	
	// The block entity is not created yet, try to create it and add to list:
	cBlockEntity * be = cBlockEntity::CreateByBlockType(GetBlockType(a_RelX, a_RelY, a_RelZ), GetBlockMeta(a_RelX, a_RelY, a_RelZ), AbsX, a_RelY, AbsZ);
	if (be == NULL)
	{
		// No block entity for this block type
		return NULL;
	}
	m_BlockEntities.push_back(be);
	return be;
}