summaryrefslogtreecommitdiffstats
path: root/src/Blocks/BlockSnow.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Blocks/BlockSnow.h')
-rw-r--r--src/Blocks/BlockSnow.h61
1 files changed, 12 insertions, 49 deletions
diff --git a/src/Blocks/BlockSnow.h b/src/Blocks/BlockSnow.h
index 299ec9f62..f3fa87a1b 100644
--- a/src/Blocks/BlockSnow.h
+++ b/src/Blocks/BlockSnow.h
@@ -20,58 +20,21 @@ private:
enum
{
- FullBlockMeta = 7 // Meta value of a full-height snow block
+ FullBlockMeta = 7 // Meta value of a full-height snow block.
};
- virtual bool GetPlacementBlockTypeMeta(
- cChunkInterface & a_ChunkInterface,
- cPlayer & a_Player,
- const Vector3i a_PlacedBlockPos,
- eBlockFace a_ClickedBlockFace,
- const Vector3i a_CursorPos,
- BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
- ) const override
- {
- a_BlockType = m_BlockType;
-
- // Check if incrementing existing snow height:
- BLOCKTYPE BlockBeforePlacement;
- NIBBLETYPE MetaBeforePlacement;
- a_ChunkInterface.GetBlockTypeMeta(a_PlacedBlockPos, BlockBeforePlacement, MetaBeforePlacement);
- if ((BlockBeforePlacement == E_BLOCK_SNOW) && (MetaBeforePlacement < FullBlockMeta))
- {
- // Only increment if:
- // - A snow block was already there (not first time placement) AND
- // - Height is smaller than the maximum possible
- a_BlockMeta = MetaBeforePlacement + 1;
- return true;
- }
-
- // First time placement, check placement is valid
- a_BlockMeta = 0;
- BLOCKTYPE BlockBelow;
- NIBBLETYPE MetaBelow;
- return (
- (a_PlacedBlockPos.y > 0) &&
- a_ChunkInterface.GetBlockTypeMeta(a_PlacedBlockPos.addedY(-1), BlockBelow, MetaBelow) &&
- CanBeOn(BlockBelow, MetaBelow)
- );
- }
-
-
-
-
- virtual bool DoesIgnoreBuildCollision(cChunkInterface & a_ChunkInterface, Vector3i a_Pos, cPlayer & a_Player, NIBBLETYPE a_Meta) const override
+ virtual bool DoesIgnoreBuildCollision(const cWorld & a_World, const cItem & a_HeldItem, const Vector3i a_Position, const NIBBLETYPE a_Meta, const eBlockFace a_ClickedBlockFace, const bool a_ClickedDirectly) const override
{
- if ((a_Player.GetEquippedItem().m_ItemType == E_BLOCK_SNOW) && (a_Meta < FullBlockMeta))
+ if (a_Meta == 0)
{
- return true; // If a player is holding a (thin) snow block and it's size can be increased, return collision ignored
+ return true; // If at normal snowfall height (lowest), we ignore collision.
}
- if (a_Meta == 0)
+ // Special case if a player is holding a (thin) snow block and its size can be increased:
+ if ((a_HeldItem.m_ItemType == E_BLOCK_SNOW) && (a_Meta < FullBlockMeta))
{
- return true; // If at normal snowfall height (lowest), we ignore collision
+ return !a_ClickedDirectly || (a_ClickedBlockFace == BLOCK_FACE_YP); // If clicked an adjacent block, or clicked YP directly, we ignore collision.
}
return false;
@@ -83,7 +46,7 @@ private:
virtual cItems ConvertToPickups(const NIBBLETYPE a_BlockMeta, const cItem * const a_Tool) const override
{
- // No drop unless dug up with a shovel
+ // No drop unless dug up with a shovel:
if ((a_Tool == nullptr) || !ItemCategory::IsShovel(a_Tool->m_ItemType))
{
return {};
@@ -104,13 +67,13 @@ private:
- virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, const Vector3i a_RelPos, const cChunk & a_Chunk) const override
+ virtual bool CanBeAt(const cChunk & a_Chunk, const Vector3i a_Position, const NIBBLETYPE a_Meta) const override
{
- if (a_RelPos.y <= 0)
+ if (a_Position.y <= 0)
{
return false;
}
- auto BelowPos = a_RelPos.addedY(-1);
+ auto BelowPos = a_Position.addedY(-1);
auto BlockBelow = a_Chunk.GetBlock(BelowPos);
auto MetaBelow = a_Chunk.GetMeta(BelowPos);
return CanBeOn(BlockBelow, MetaBelow);
@@ -141,7 +104,7 @@ private:
/** Returns true if snow can be placed on top of a block with the given type and meta. */
static bool CanBeOn(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
{
- // If block below is snowable, or it is a thin slow block and is a full thin snow block, say yay
+ // If block below is snowable, or it is a thin snow block and is a full thin snow block, say yay:
return (
cBlockInfo::IsSnowable(a_BlockType) ||
(