From 41a38e8d9098d6627cd26351577cf032e6996c87 Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Sun, 14 Oct 2012 18:30:16 +0000 Subject: Floody fluid simulator now dries up correctly, too. git-svn-id: http://mc-server.googlecode.com/svn/trunk@964 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/Chunk.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 72 insertions(+), 16 deletions(-) (limited to 'source/Chunk.cpp') diff --git a/source/Chunk.cpp b/source/Chunk.cpp index aaea4bf71..fa9cb91d3 100644 --- a/source/Chunk.cpp +++ b/source/Chunk.cpp @@ -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))); -- cgit v1.2.3