1
0

Merge pull request #2638 from Gargaj/master

Implement block heights + adapt ground checks
This commit is contained in:
worktycho
2015-12-14 20:31:33 +00:00
16 changed files with 294 additions and 128 deletions

View File

@@ -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))

View File

@@ -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. */

View File

@@ -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);
}
} ;

View File

@@ -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));
}
} ;

View File

@@ -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
} ;