summaryrefslogtreecommitdiffstats
path: root/src/Items/ItemBed.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Items/ItemBed.h')
-rw-r--r--src/Items/ItemBed.h60
1 files changed, 38 insertions, 22 deletions
diff --git a/src/Items/ItemBed.h b/src/Items/ItemBed.h
index 98f9f614f..7b8dde637 100644
--- a/src/Items/ItemBed.h
+++ b/src/Items/ItemBed.h
@@ -2,8 +2,8 @@
#pragma once
#include "ItemHandler.h"
-#include "../World.h"
-#include "../Blocks/BlockBed.h"
+#include "Blocks/BlockBed.h"
+#include "BlockEntities/BedEntity.h"
@@ -22,35 +22,51 @@ public:
}
- virtual bool IsPlaceable(void) override
- {
- return true;
- }
-
-
- virtual bool GetBlocksToPlace(
- cWorld & a_World,
- cPlayer & a_Player,
- const cItem & a_EquippedItem,
- const Vector3i a_PlacedBlockPos,
- eBlockFace a_ClickedBlockFace,
- const Vector3i a_CursorPos,
- sSetBlockVector & a_BlocksToPlace
- ) override
+ virtual bool CommitPlacement(cPlayer & a_Player, const cItem & a_HeldItem, const Vector3i a_PlacePosition, const eBlockFace a_ClickedBlockFace, const Vector3i a_CursorPosition) override
{
const auto BlockMeta = cBlockBedHandler::YawToMetaData(a_Player.GetYaw());
- const auto HeadPosition = a_PlacedBlockPos + cBlockBedHandler::MetaDataToDirection(BlockMeta);
+ const auto HeadPosition = a_PlacePosition + cBlockBedHandler::MetaDataToDirection(BlockMeta);
- // Vanilla only allows beds to be placed into air
+ auto & World = *a_Player.GetWorld();
+ BLOCKTYPE HeadType;
+ NIBBLETYPE HeadMeta;
+ World.GetBlockTypeMeta(HeadPosition, HeadType, HeadMeta);
+
+ // Vanilla only allows beds to be placed into air.
// Check if there is empty space for the "head" block:
- if (a_World.GetBlock(HeadPosition) != E_BLOCK_AIR)
+ if (!cBlockHandler::For(HeadType).DoesIgnoreBuildCollision(World, a_HeldItem, HeadPosition, HeadMeta, a_ClickedBlockFace, false))
{
return false;
}
// The "foot", and the "head" block:
- a_BlocksToPlace.emplace_back(a_PlacedBlockPos, E_BLOCK_BED, BlockMeta);
- a_BlocksToPlace.emplace_back(HeadPosition, E_BLOCK_BED, BlockMeta | 0x08);
+ if (
+ !a_Player.PlaceBlocks(
+ {
+ { a_PlacePosition, E_BLOCK_BED, BlockMeta },
+ { HeadPosition, E_BLOCK_BED, static_cast<NIBBLETYPE>(BlockMeta | 0x08) }
+ })
+ )
+ {
+ return false;
+ }
+
+ auto SetColor = [&a_HeldItem](cBlockEntity & a_BlockEntity)
+ {
+ ASSERT(a_BlockEntity.GetBlockType() == E_BLOCK_BED);
+
+ static_cast<cBedEntity &>(a_BlockEntity).SetColor(a_HeldItem.m_ItemDamage);
+ return false;
+ };
+ World.DoWithBlockEntityAt(a_PlacePosition, SetColor);
+ World.DoWithBlockEntityAt(HeadPosition, SetColor);
+
+ return true;
+ }
+
+
+ virtual bool IsPlaceable(void) override
+ {
return true;
}
};