1
0

Added the CanPushBlock method for the piston push check.

This allows the recursive check for blocks to push, which is needed to implement the slime blocks into the piston system.
This commit is contained in:
bibo38 2015-11-02 22:12:58 +01:00
parent d92a92d78a
commit e2d88106a9
2 changed files with 41 additions and 24 deletions

View File

@ -86,28 +86,38 @@ bool cBlockPistonHandler::GetPlacementBlockTypeMeta(
int cBlockPistonHandler::FirstPassthroughBlock(int a_PistonX, int a_PistonY, int a_PistonZ, NIBBLETYPE pistonmeta, cWorld * a_World)
bool cBlockPistonHandler::CanPushBlock(
int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World, bool a_RequirePushable,
std::unordered_set<Vector3i, VectorHasher<int>> & a_BlocksPushed, NIBBLETYPE a_PistonMeta
)
{
// Examine each of the 12 blocks ahead of the piston:
for (int ret = 0; ret < PISTON_MAX_PUSH_DISTANCE; ret++)
BLOCKTYPE currBlock;
NIBBLETYPE currMeta;
a_World->GetBlockTypeMeta(a_BlockX, a_BlockY, a_BlockZ, currBlock, currMeta);
if (currBlock == E_BLOCK_AIR)
{
BLOCKTYPE currBlock;
NIBBLETYPE currMeta;
AddPistonDir(a_PistonX, a_PistonY, a_PistonZ, pistonmeta, 1);
a_World->GetBlockTypeMeta(a_PistonX, a_PistonY, a_PistonZ, currBlock, currMeta);
if (cBlockInfo::IsPistonBreakable(currBlock))
{
// This block breaks when pushed, extend up to here
return ret;
}
if (!CanPush(currBlock, currMeta))
{
// This block cannot be pushed at all, the piston can't extend
return -1;
}
// Air can be pushed
return true;
}
// There is no space for the blocks to move, piston can't extend
return -1;
if (!CanPush(currBlock, currMeta))
{
return !a_RequirePushable;
}
if (a_BlocksPushed.size() >= PISTON_MAX_PUSH_DISTANCE)
{
return false;
}
if (!a_BlocksPushed.emplace(a_BlockX, a_BlockY, a_BlockZ).second || cBlockInfo::IsPistonBreakable(currBlock))
{
return true; // Element exist already
}
AddPistonDir(a_BlockX, a_BlockY, a_BlockZ, a_PistonMeta, 1);
return CanPushBlock(a_BlockX, a_BlockY, a_BlockZ, a_World, true, a_BlocksPushed, a_PistonMeta);
}
@ -126,10 +136,12 @@ void cBlockPistonHandler::ExtendPiston(int a_BlockX, int a_BlockY, int a_BlockZ,
return;
}
int dist = FirstPassthroughBlock(a_BlockX, a_BlockY, a_BlockZ, pistonMeta, a_World);
if (dist < 0)
int dist = 1; // TODO
AddPistonDir(a_BlockX, a_BlockY, a_BlockZ, pistonMeta, 1);
std::unordered_set<Vector3i, VectorHasher<int>> blocksPushed;
if (!CanPushBlock(a_BlockX, a_BlockY, a_BlockZ, a_World, true, blocksPushed, pistonMeta))
{
// FirstPassthroughBlock says piston can't push anything, bail out
// Can't push anything, bail out
return;
}

View File

@ -3,6 +3,8 @@
#include "BlockHandler.h"
#include <unordered_set>
class cWorld;
@ -152,8 +154,11 @@ private:
return CanPush(a_BlockType, a_BlockMeta);
}
/** Returns how many blocks the piston has to push (where the first free space is); < 0 when unpushable */
static int FirstPassthroughBlock(int a_PistonX, int a_PistonY, int a_PistonZ, NIBBLETYPE a_PistonMeta, cWorld * a_World);
/** Tries to push a block and increases the pushed blocks variable. Returns true if the block is pushable */
static bool CanPushBlock(
int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World, bool a_RequirePushable,
std::unordered_set<Vector3i, VectorHasher<int>> & a_BlocksPushed, NIBBLETYPE a_PistonMeta
);
} ;