1
0

Floody fluid simulator now dries up correctly, too.

git-svn-id: http://mc-server.googlecode.com/svn/trunk@964 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
madmaxoft@gmail.com
2012-10-14 18:30:16 +00:00
parent 5b7de82a79
commit 41a38e8d90
8 changed files with 184 additions and 49 deletions

View File

@@ -480,15 +480,7 @@ void cChunk::CheckBlocks(void)
Vector3i WorldPos = PositionToWorldPosition( BlockPos );
cBlockHandler * Handler = BlockHandler(GetBlock(index));
if (!Handler->CanBeAt(m_World, WorldPos.x, WorldPos.y, WorldPos.z))
{
if (Handler->DoesDropOnUnsuitable())
{
Handler->DropBlock(m_World, WorldPos.x, WorldPos.y, WorldPos.z);
}
m_World->SetBlock(WorldPos.x, WorldPos.y, WorldPos.z, E_BLOCK_AIR, 0);
}
Handler->Check(m_World, WorldPos.x, WorldPos.y, WorldPos.z);
} // for itr - ToTickBlocks[]
}
@@ -918,13 +910,8 @@ void cChunk::SetBlock( int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType
}
}
m_ToTickBlocks.push_back( MakeIndex( a_RelX, a_RelY, a_RelZ ) );
m_ToTickBlocks.push_back( MakeIndex( a_RelX + 1, a_RelY, a_RelZ ) );
m_ToTickBlocks.push_back( MakeIndex( a_RelX - 1, a_RelY, a_RelZ ) );
m_ToTickBlocks.push_back( MakeIndex( a_RelX, a_RelY + 1, a_RelZ ) );
m_ToTickBlocks.push_back( MakeIndex( a_RelX, a_RelY - 1, a_RelZ ) );
m_ToTickBlocks.push_back( MakeIndex( a_RelX, a_RelY, a_RelZ + 1 ) );
m_ToTickBlocks.push_back( MakeIndex( a_RelX, a_RelY, a_RelZ - 1 ) );
m_ToTickBlocks.push_back(index);
CheckNeighbors(a_RelX, a_RelY, a_RelZ);
Vector3i WorldPos = PositionToWorldPosition( a_RelX, a_RelY, a_RelZ );
cBlockEntity* BlockEntity = GetBlockEntity( WorldPos );
@@ -964,6 +951,75 @@ void cChunk::SetBlock( int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType
void cChunk::CheckNeighbors(int a_RelX, int a_RelY, int a_RelZ)
{
int BlockX = m_PosX * cChunkDef::Width + a_RelX;
int BlockZ = m_PosZ * cChunkDef::Width + a_RelZ;
if (a_RelX < cChunkDef::Width)
{
m_ToTickBlocks.push_back(MakeIndexNoCheck(a_RelX + 1, a_RelY, a_RelZ));
}
else
{
m_ChunkMap->CheckBlock(BlockX + 1, a_RelY, BlockZ);
}
if (a_RelX > 0)
{
m_ToTickBlocks.push_back( MakeIndexNoCheck(a_RelX - 1, a_RelY, a_RelZ));
}
else
{
m_ChunkMap->CheckBlock(BlockX - 1, a_RelY, BlockZ);
}
if (a_RelY < cChunkDef::Height - 1)
{
m_ToTickBlocks.push_back(MakeIndexNoCheck(a_RelX, a_RelY + 1, a_RelZ));
}
if (a_RelY > 0)
{
m_ToTickBlocks.push_back(MakeIndexNoCheck(a_RelX, a_RelY - 1, a_RelZ));
}
if (a_RelZ < cChunkDef::Width - 1)
{
m_ToTickBlocks.push_back(MakeIndexNoCheck(a_RelX, a_RelY, a_RelZ + 1));
}
else
{
m_ChunkMap->CheckBlock(BlockX, a_RelY, BlockZ + 1);
}
if (a_RelZ > 0)
{
m_ToTickBlocks.push_back(MakeIndexNoCheck(a_RelX, a_RelY, a_RelZ - 1));
}
else
{
m_ChunkMap->CheckBlock(BlockX, a_RelY, BlockZ - 1);
}
}
void cChunk::CheckBlock(int a_RelX, int a_RelY, int a_RelZ)
{
if (!IsValid())
{
return;
}
m_ToTickBlocks.push_back(MakeIndexNoCheck(a_RelX, a_RelY, a_RelZ));
}
void cChunk::FastSetBlock( int a_X, int a_Y, int a_Z, BLOCKTYPE a_BlockType, BLOCKTYPE a_BlockMeta)
{
ASSERT(!((a_X < 0 || a_X >= Width || a_Y < 0 || a_Y >= Height || a_Z < 0 || a_Z >= Width)));