Merge pull request #2638 from Gargaj/master
Implement block heights + adapt ground checks
This commit is contained in:
@@ -553,6 +553,16 @@ bool cBlockHandler::DoesDropOnUnsuitable(void)
|
||||
|
||||
|
||||
|
||||
/* default functionality: only test for height, since we assume full voxels with varying height */
|
||||
bool cBlockHandler::IsInsideBlock(const Vector3d & a_Position, const BLOCKTYPE a_BlockType, const NIBBLETYPE a_BlockMeta)
|
||||
{
|
||||
return a_Position.y < cBlockInfo::GetBlockHeight(a_BlockType);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cBlockHandler::Check(cChunkInterface & a_ChunkInterface, cBlockPluginInterface & a_PluginInterface, int a_RelX, int a_RelY, int a_RelZ, cChunk & a_Chunk)
|
||||
{
|
||||
if (!CanBeAt(a_ChunkInterface, a_RelX, a_RelY, a_RelZ, a_Chunk))
|
||||
|
||||
@@ -124,7 +124,11 @@ public:
|
||||
/** Returns if this block drops if it gets destroyed by an unsuitable situation.
|
||||
Default: true */
|
||||
virtual bool DoesDropOnUnsuitable(void);
|
||||
|
||||
|
||||
/** Tests if a_Position is inside the block where a_Position is relative to the origin of the block
|
||||
Note that this is considered from a "top-down" perspective i.e. empty spaces on the bottom of a block don't matter */
|
||||
virtual bool IsInsideBlock(const Vector3d & a_Position, const BLOCKTYPE a_BlockType, const NIBBLETYPE a_BlockMeta);
|
||||
|
||||
/** Called when one of the neighbors gets set; equivalent to MC block update.
|
||||
By default drops if position no more suitable (CanBeAt(), DoesDropOnUnsuitable(), Drop()),
|
||||
and wakes up all simulators on the block. */
|
||||
|
||||
@@ -174,6 +174,15 @@ public:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
virtual bool IsInsideBlock(const Vector3d & a_Position, const BLOCKTYPE a_BlockType, const NIBBLETYPE a_BlockMeta) override
|
||||
{
|
||||
if (a_BlockMeta & 0x8) // top half
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return cBlockHandler::IsInsideBlock(a_Position, a_BlockType, a_BlockMeta);
|
||||
}
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
@@ -88,6 +88,11 @@ public:
|
||||
UNUSED(a_Meta);
|
||||
return 14;
|
||||
}
|
||||
|
||||
virtual bool IsInsideBlock(const Vector3d & a_Position, const BLOCKTYPE a_BlockType, const NIBBLETYPE a_BlockMeta) override
|
||||
{
|
||||
return a_Position.y < (cBlockInfo::GetBlockHeight(a_BlockType) * (a_BlockMeta & 7));
|
||||
}
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
@@ -115,6 +115,38 @@ public:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** EXCEPTION a.k.a. why is this removed:
|
||||
This collision-detection is actually more accurate than the client, but since the client itself
|
||||
sends inaccurate / sparse data, it's easier to just err on the side of the client and keep the
|
||||
two in sync by assuming that if a player hit ANY of the stair's bounding cube, it counts as the ground. */
|
||||
#if 0
|
||||
bool IsInsideBlock(const Vector3d & a_Position, const BLOCKTYPE a_BlockType, const NIBBLETYPE a_BlockMeta)
|
||||
{
|
||||
if (a_BlockMeta & 0x4) // upside down
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if ((a_BlockMeta & 0x3) == 0) // tall side is east (+X)
|
||||
{
|
||||
return a_Position.y < ((a_Position.x > 0.5) ? 1.0 : 0.5);
|
||||
}
|
||||
else if ((a_BlockMeta & 0x3) == 1) // tall side is west (-X)
|
||||
{
|
||||
return a_Position.y < ((a_Position.x < 0.5) ? 1.0 : 0.5);
|
||||
}
|
||||
else if ((a_BlockMeta & 0x3) == 2) // tall side is south (+Z)
|
||||
{
|
||||
return a_Position.y < ((a_Position.z > 0.5) ? 1.0 : 0.5);
|
||||
}
|
||||
else if ((a_BlockMeta & 0x3) == 3) // tall side is north (-Z)
|
||||
{
|
||||
return a_Position.y < ((a_Position.z < 0.5) ? 1.0 : 0.5);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user