summaryrefslogtreecommitdiffstats
path: root/src/Items/ItemRedstoneDust.h
diff options
context:
space:
mode:
authorMattes D <github@xoft.cz>2014-12-24 19:44:15 +0100
committerMattes D <github@xoft.cz>2014-12-24 19:44:15 +0100
commitf07784b92f9e402706afce148ecc50430832ae16 (patch)
treefba1596ca7d59153645e2cf2a1b8f70cfc4892ab /src/Items/ItemRedstoneDust.h
parentReplaced a std::hash specialization with explicit type. (diff)
downloadcuberite-f07784b92f9e402706afce148ecc50430832ae16.tar
cuberite-f07784b92f9e402706afce148ecc50430832ae16.tar.gz
cuberite-f07784b92f9e402706afce148ecc50430832ae16.tar.bz2
cuberite-f07784b92f9e402706afce148ecc50430832ae16.tar.lz
cuberite-f07784b92f9e402706afce148ecc50430832ae16.tar.xz
cuberite-f07784b92f9e402706afce148ecc50430832ae16.tar.zst
cuberite-f07784b92f9e402706afce148ecc50430832ae16.zip
Diffstat (limited to 'src/Items/ItemRedstoneDust.h')
-rw-r--r--src/Items/ItemRedstoneDust.h37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/Items/ItemRedstoneDust.h b/src/Items/ItemRedstoneDust.h
index a2289239c..6d5fb521f 100644
--- a/src/Items/ItemRedstoneDust.h
+++ b/src/Items/ItemRedstoneDust.h
@@ -27,7 +27,20 @@ public:
BLOCKTYPE & a_BlockType, NIBBLETYPE & a_BlockMeta
) override
{
- if (!cBlockInfo::FullyOccupiesVoxel(a_World->GetBlock(a_BlockX, a_BlockY - 1, a_BlockZ))) // Some solid blocks, such as cocoa beans, are not suitable for dust
+ // Check if coords are out of range:
+ if ((a_BlockY <= 0) || (a_BlockY >= cChunkDef::Height))
+ {
+ return false;
+ }
+
+ // Check the block below, if it supports dust on top of it:
+ BLOCKTYPE BlockType;
+ NIBBLETYPE BlockMeta;
+ if (!a_World->GetBlockTypeMeta(a_BlockX, a_BlockY - 1, a_BlockZ, BlockType, BlockMeta))
+ {
+ return false;
+ }
+ if (!IsBlockTypeUnderSuitable(BlockType, BlockMeta))
{
return false;
}
@@ -36,6 +49,28 @@ public:
a_BlockMeta = 0;
return true;
}
+
+
+ /** Returns true if the specified block type / meta is suitable to have redstone dust on top of it. */
+ static bool IsBlockTypeUnderSuitable(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
+ {
+ if (cBlockInfo::FullyOccupiesVoxel(a_BlockType))
+ {
+ return true;
+ }
+
+ switch (a_BlockType)
+ {
+ case E_BLOCK_NEW_STONE_SLAB:
+ case E_BLOCK_WOODEN_SLAB:
+ case E_BLOCK_STONE_SLAB:
+ {
+ // Slabs can support redstone if they're upside down:
+ return ((a_BlockMeta & 0x08) != 0);
+ }
+ }
+ return false;
+ }
} ;