summaryrefslogtreecommitdiffstats
path: root/src/BlockEntities
diff options
context:
space:
mode:
Diffstat (limited to 'src/BlockEntities')
-rw-r--r--src/BlockEntities/BannerEntity.cpp78
-rw-r--r--src/BlockEntities/BannerEntity.h43
-rw-r--r--src/BlockEntities/BlockEntity.cpp8
-rw-r--r--src/BlockEntities/CMakeLists.txt2
4 files changed, 131 insertions, 0 deletions
diff --git a/src/BlockEntities/BannerEntity.cpp b/src/BlockEntities/BannerEntity.cpp
new file mode 100644
index 000000000..d7fda3cf7
--- /dev/null
+++ b/src/BlockEntities/BannerEntity.cpp
@@ -0,0 +1,78 @@
+
+// BannerEntity.cpp
+
+// Implements the cBannerEntity class representing a banner block in the world
+
+#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
+#include "BannerEntity.h"
+
+#include "../World.h"
+#include "../ClientHandle.h"
+
+
+
+
+
+cBannerEntity::cBannerEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World) :
+ cBannerEntity(a_BlockType, a_BlockMeta, a_Pos, a_World, 1)
+{
+}
+
+
+
+
+
+cBannerEntity::cBannerEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World, unsigned char a_BaseColor):
+ Super(a_BlockType, a_BlockMeta, a_Pos, a_World),
+ m_BaseColor(a_BaseColor)
+{
+ ASSERT((a_BlockType == E_BLOCK_WALL_BANNER) || (a_BlockType == E_BLOCK_STANDING_BANNER));
+}
+
+
+
+
+
+void cBannerEntity::CopyFrom(const cBlockEntity & a_Src)
+{
+ Super::CopyFrom(a_Src);
+ auto & src = static_cast<const cBannerEntity &>(a_Src);
+ m_BaseColor = src.m_BaseColor;
+}
+
+
+
+
+
+void cBannerEntity::SendTo(cClientHandle & a_Client)
+{
+ a_Client.SendBlockChange(m_Pos.x, m_Pos.y, m_Pos.z, m_BlockType, m_BlockMeta);
+ a_Client.SendUpdateBlockEntity(*this);
+}
+
+
+
+
+
+cItems cBannerEntity::ConvertToPickups() const
+{
+ return cItem(E_ITEM_BANNER, 1, static_cast<NIBBLETYPE>(GetBaseColor()));
+}
+
+
+
+
+
+unsigned char cBannerEntity::GetBaseColor() const
+{
+ return m_BaseColor;
+}
+
+
+
+
+
+void cBannerEntity::SetBaseColor(const unsigned char a_Color)
+{
+ m_BaseColor = a_Color;
+}
diff --git a/src/BlockEntities/BannerEntity.h b/src/BlockEntities/BannerEntity.h
new file mode 100644
index 000000000..d265f3279
--- /dev/null
+++ b/src/BlockEntities/BannerEntity.h
@@ -0,0 +1,43 @@
+
+// BannerEntity.h
+
+// Declares the cBannerEntity class representing a single banner in the world
+
+
+
+
+
+#pragma once
+
+#include "BlockEntity.h"
+
+
+
+
+
+// tolua_begin
+class cBannerEntity :
+ public cBlockEntity
+{
+ // tolua_end
+
+ using Super = cBlockEntity;
+
+public:
+
+ cBannerEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World);
+ cBannerEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World, unsigned char a_BaseColor);
+
+ unsigned char GetBaseColor() const;
+ void SetBaseColor(unsigned char a_Color);
+
+private:
+
+ unsigned char m_BaseColor;
+
+ // cBlockEntity overrides:
+ virtual cItems ConvertToPickups() const override;
+ virtual void CopyFrom(const cBlockEntity & a_Src) override;
+ virtual void SendTo(cClientHandle & a_Client) override;
+ virtual bool UsedBy(cPlayer * a_Player) override { return true; }
+} ; // tolua_export
diff --git a/src/BlockEntities/BlockEntity.cpp b/src/BlockEntities/BlockEntity.cpp
index a3b6b33a3..4b17f10a6 100644
--- a/src/BlockEntities/BlockEntity.cpp
+++ b/src/BlockEntities/BlockEntity.cpp
@@ -4,6 +4,7 @@
// Implements the cBlockEntity class that is the common ancestor for all block entities
#include "Globals.h"
+#include "BannerEntity.h"
#include "BeaconEntity.h"
#include "BedEntity.h"
#include "BlockEntity.h"
@@ -77,6 +78,11 @@ OwnedBlockEntity cBlockEntity::CreateByBlockType(const BLOCKTYPE a_BlockType, co
{
switch (a_BlockType)
{
+ // Banners:
+ case E_BLOCK_STANDING_BANNER:
+ case E_BLOCK_WALL_BANNER: return std::make_unique<cBannerEntity >(a_BlockType, a_BlockMeta, a_Pos, a_World);
+
+ // Others:
case E_BLOCK_BEACON: return std::make_unique<cBeaconEntity >(a_BlockType, a_BlockMeta, a_Pos, a_World);
case E_BLOCK_BED: return std::make_unique<cBedEntity >(a_BlockType, a_BlockMeta, a_Pos, a_World);
case E_BLOCK_BREWING_STAND: return std::make_unique<cBrewingstandEntity >(a_BlockType, a_BlockMeta, a_Pos, a_World);
@@ -144,7 +150,9 @@ bool cBlockEntity::IsBlockEntityBlockType(const BLOCKTYPE a_BlockType)
case E_BLOCK_MOB_SPAWNER:
case E_BLOCK_NOTE_BLOCK:
case E_BLOCK_SIGN_POST:
+ case E_BLOCK_STANDING_BANNER:
case E_BLOCK_TRAPPED_CHEST:
+ case E_BLOCK_WALL_BANNER:
case E_BLOCK_WALLSIGN:
{
return true;
diff --git a/src/BlockEntities/CMakeLists.txt b/src/BlockEntities/CMakeLists.txt
index d8ec1e005..63583d185 100644
--- a/src/BlockEntities/CMakeLists.txt
+++ b/src/BlockEntities/CMakeLists.txt
@@ -1,6 +1,7 @@
target_sources(
${CMAKE_PROJECT_NAME} PRIVATE
+ BannerEntity.cpp
BeaconEntity.cpp
BedEntity.cpp
BlockEntity.cpp
@@ -23,6 +24,7 @@ target_sources(
NoteEntity.cpp
SignEntity.cpp
+ BannerEntity.h
BeaconEntity.h
BedEntity.h
BlockEntity.h