cSandSimulator: implemented InstantFall
git-svn-id: http://mc-server.googlecode.com/svn/trunk@1241 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
6744738a85
commit
86c97cb28a
@ -246,7 +246,33 @@ void cSandSimulator::FinishFalling(
|
|||||||
|
|
||||||
void cSandSimulator::DoInstantFall(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ)
|
void cSandSimulator::DoInstantFall(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ)
|
||||||
{
|
{
|
||||||
// TODO
|
// Remove the original block:
|
||||||
|
BLOCKTYPE FallingBlockType;
|
||||||
|
NIBBLETYPE FallingBlockMeta;
|
||||||
|
a_Chunk->GetBlockTypeMeta(a_RelX, a_RelY, a_RelZ, FallingBlockType, FallingBlockMeta);
|
||||||
|
a_Chunk->SetBlock(a_RelX, a_RelY, a_RelZ, E_BLOCK_AIR, 0);
|
||||||
|
|
||||||
|
// Search for a place to put it:
|
||||||
|
for (int y = a_RelY - 1; y >= 0; y--)
|
||||||
|
{
|
||||||
|
BLOCKTYPE BlockType = a_Chunk->GetBlock(a_RelX, y, a_RelZ);
|
||||||
|
if (
|
||||||
|
!DoesBreakFallingThrough(BlockType) &&
|
||||||
|
CanContinueFallThrough(BlockType)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Can fall further down
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finish the fall at the found bottom:
|
||||||
|
int BlockX = a_RelX + a_Chunk->GetPosX() * cChunkDef::Width;
|
||||||
|
int BlockZ = a_RelZ + a_Chunk->GetPosZ() * cChunkDef::Width;
|
||||||
|
FinishFalling(&m_World, BlockX, y + 1, BlockZ, FallingBlockType, FallingBlockMeta);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The block just "fell off the world" without leaving a trace
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user