diff options
Diffstat (limited to 'src/BlockEntities')
-rw-r--r-- | src/BlockEntities/BannerEntity.cpp | 78 | ||||
-rw-r--r-- | src/BlockEntities/BannerEntity.h | 43 | ||||
-rw-r--r-- | src/BlockEntities/BlockEntity.cpp | 8 | ||||
-rw-r--r-- | src/BlockEntities/CMakeLists.txt | 2 |
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 |