summaryrefslogtreecommitdiffstats
path: root/src/Blocks/BlockEntity.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Blocks/BlockEntity.h')
-rw-r--r--src/Blocks/BlockEntity.h55
1 files changed, 52 insertions, 3 deletions
diff --git a/src/Blocks/BlockEntity.h b/src/Blocks/BlockEntity.h
index 77d6a7f1e..f592dbd83 100644
--- a/src/Blocks/BlockEntity.h
+++ b/src/Blocks/BlockEntity.h
@@ -3,23 +3,40 @@
#include "BlockHandler.h"
#include "ChunkInterface.h"
+#include "../Item.h"
+#include "../BlockEntities/BlockEntityWithItems.h"
-class cBlockEntityHandler : public cBlockHandler
+
+/** Wrapper for blocks that have a cBlockEntity descendant attached to them and can be "used" by the player.
+Forwards the "use" event to the block entity. */
+class cBlockEntityHandler:
+ public cBlockHandler
{
+ using super = cBlockHandler;
+
public:
- cBlockEntityHandler(BLOCKTYPE a_BlockType)
- : cBlockHandler(a_BlockType)
+
+ cBlockEntityHandler(BLOCKTYPE a_BlockType):
+ super(a_BlockType)
{
}
+
+
+
+
virtual bool OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override
{
return a_ChunkInterface.UseBlockEntity(&a_Player, a_BlockX, a_BlockY, a_BlockZ);
}
+
+
+
+
virtual bool IsUseable() override
{
return true;
@@ -29,3 +46,35 @@ public:
+
+/** Wrapper for blocks that have a cBlockEntityWithItems descendant attached to them.
+When converting to pickups, drops self with meta reset to zero, and adds the container contents. */
+template <typename Base = cBlockEntityHandler>
+class cContainerEntityHandler:
+ public Base
+{
+public:
+
+ cContainerEntityHandler(BLOCKTYPE a_BlockType):
+ Base(a_BlockType)
+ {
+ }
+
+
+
+
+
+ virtual cItems ConvertToPickups(NIBBLETYPE a_BlockMeta, cBlockEntity * a_BlockEntity, const cEntity * a_Digger, const cItem * a_Tool) override
+ {
+ // Reset meta to 0
+ cItems res(cItem(Base::m_BlockType, 1, 0));
+
+ // Drop the contents:
+ if (a_BlockEntity != nullptr)
+ {
+ auto container = static_cast<cBlockEntityWithItems *>(a_BlockEntity);
+ res.AddItemGrid(container->GetContents());
+ }
+ return res;
+ }
+};