summaryrefslogtreecommitdiffstats
path: root/src/Blocks/BlockSlab.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Blocks/BlockSlab.h')
-rw-r--r--src/Blocks/BlockSlab.h84
1 files changed, 68 insertions, 16 deletions
diff --git a/src/Blocks/BlockSlab.h b/src/Blocks/BlockSlab.h
index 58e85013e..19b25595d 100644
--- a/src/Blocks/BlockSlab.h
+++ b/src/Blocks/BlockSlab.h
@@ -11,7 +11,6 @@
#include "BlockHandler.h"
#include "../Items/ItemHandler.h"
-#include "Root.h"
#include "ChunkInterface.h"
#include "../Entities/Player.h"
@@ -26,13 +25,11 @@ public:
{
}
-
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
{
a_Pickups.push_back(cItem(m_BlockType, 1, a_BlockMeta & 0x7));
}
-
virtual bool GetPlacementBlockTypeMeta(
cChunkInterface & a_ChunkInterface, cPlayer * a_Player,
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace,
@@ -87,15 +84,13 @@ public:
return true;
}
-
- /// Returns true if the specified blocktype is one of the slabs handled by this handler
+ /** Returns true if the specified blocktype is one of the slabs handled by this handler */
static bool IsAnySlabType(BLOCKTYPE a_BlockType)
{
- return ((a_BlockType == E_BLOCK_WOODEN_SLAB) || (a_BlockType == E_BLOCK_STONE_SLAB) || (a_BlockType == E_BLOCK_NEW_STONE_SLAB));
+ return ((a_BlockType == E_BLOCK_WOODEN_SLAB) || (a_BlockType == E_BLOCK_STONE_SLAB) || (a_BlockType == E_BLOCK_RED_SANDSTONE_SLAB));
}
-
virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) override
{
if ((a_BlockFace == BLOCK_FACE_NONE) || (a_Player->GetEquippedItem().m_ItemType != static_cast<short>(m_BlockType)))
@@ -103,30 +98,82 @@ public:
return;
}
- // Sends the slab back to the client. It's to refuse a doubleslab placement.
+ // Sends the slab back to the client. It's to refuse a doubleslab placement. */
a_Player->GetWorld()->SendBlockTo(a_BlockX, a_BlockY, a_BlockZ, a_Player);
}
-
- /// Converts the single-slab blocktype to its equivalent double-slab blocktype
+ /** Converts the single-slab blocktype to its equivalent double-slab blocktype */
static BLOCKTYPE GetDoubleSlabType(BLOCKTYPE a_SingleSlabBlockType)
{
switch (a_SingleSlabBlockType)
{
- case E_BLOCK_STONE_SLAB: return E_BLOCK_DOUBLE_STONE_SLAB;
+ case E_BLOCK_STONE_SLAB: return E_BLOCK_DOUBLE_STONE_SLAB;
case E_BLOCK_WOODEN_SLAB: return E_BLOCK_DOUBLE_WOODEN_SLAB;
- case E_BLOCK_NEW_STONE_SLAB: return E_BLOCK_DOUBLE_NEW_STONE_SLAB;
+ case E_BLOCK_RED_SANDSTONE_SLAB: return E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB;
}
ASSERT(!"Unhandled slab type!");
return E_BLOCK_AIR;
}
-
virtual NIBBLETYPE MetaMirrorXZ(NIBBLETYPE a_Meta) override
{
// Toggle the 4th bit - up / down:
return (a_Meta ^ 0x08);
}
+
+ virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) override
+ {
+ a_Meta &= 0x7;
+
+ switch (m_BlockType)
+ {
+ case E_BLOCK_STONE_SLAB:
+ {
+ switch (a_Meta)
+ {
+ case E_META_STONE_SLAB_SANDSTONE: return 2;
+ case E_META_STONE_SLAB_PLANKS: return 13;
+ case E_META_STONE_SLAB_STONE_BRICK:
+ case E_META_STONE_SLAB_STONE:
+ case E_META_STONE_SLAB_COBBLESTONE: return 11;
+ case E_META_STONE_SLAB_BRICK: return 28;
+ case E_META_STONE_SLAB_NETHER_BRICK: return 35;
+ case E_META_STONE_SLAB_QUARTZ: return 8;
+ default:
+ {
+ ASSERT(!"Unhandled meta in slab handler!");
+ return 0;
+ }
+ }
+ }
+ case E_BLOCK_WOODEN_SLAB:
+ {
+ switch (a_Meta)
+ {
+ case E_META_WOODEN_SLAB_BIRCH: return 2;
+ case E_META_WOODEN_SLAB_JUNGLE: return 10;
+ case E_META_WOODEN_SLAB_OAK: return 13;
+ case E_META_WOODEN_SLAB_ACACIA: return 15;
+ case E_META_WOODEN_SLAB_DARK_OAK: return 26;
+ case E_META_WOODEN_SLAB_SPRUCE: return 34;
+ default:
+ {
+ ASSERT(!"Unhandled meta in slab handler!");
+ return 0;
+ }
+ }
+ }
+ case E_BLOCK_RED_SANDSTONE_SLAB:
+ {
+ return 10;
+ }
+ default:
+ {
+ ASSERT(!"Unhandled blocktype in slab handler!");
+ return 0;
+ }
+ }
+ }
} ;
@@ -142,7 +189,6 @@ public:
{
}
-
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
{
BLOCKTYPE Block = GetSingleSlabType(m_BlockType);
@@ -153,13 +199,19 @@ public:
{
switch (a_BlockType)
{
- case E_BLOCK_DOUBLE_STONE_SLAB: return E_BLOCK_STONE_SLAB;
+ case E_BLOCK_DOUBLE_STONE_SLAB: return E_BLOCK_STONE_SLAB;
case E_BLOCK_DOUBLE_WOODEN_SLAB: return E_BLOCK_WOODEN_SLAB;
- case E_BLOCK_DOUBLE_NEW_STONE_SLAB: return E_BLOCK_NEW_STONE_SLAB;
+ case E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB: return E_BLOCK_DOUBLE_RED_SANDSTONE_SLAB;
}
ASSERT(!"Unhandled double slab type!");
return a_BlockType;
}
+
+ virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) override
+ {
+ // For doule slabs, the meta values are the same. Only the meaning of the 4th bit changes, but that's ignored in the below handler
+ return BlockHandler(GetSingleSlabType(m_BlockType))->GetMapBaseColourID(a_Meta);
+ }
} ;