Preserve banner names across place and pick up (#5565)

* Preserve banner names across place and pick up

Signed-off-by: Mike Jagdis <mjagdis@eris-associates.co.uk>

* Update src/BlockEntities/BannerEntity.h

---------

Signed-off-by: Mike Jagdis <mjagdis@eris-associates.co.uk>
Co-authored-by: Alexander Harkness <me@bearbin.net>
This commit is contained in:
mjagdis 2024-06-30 19:09:42 +01:00 committed by GitHub
parent c6c32bc2ed
commit b7de59de89
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 33 additions and 38 deletions

View File

@ -13,18 +13,10 @@
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):
cBannerEntity::cBannerEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World, unsigned char a_BaseColor, AString a_CustomName):
Super(a_BlockType, a_BlockMeta, a_Pos, a_World),
m_BaseColor(a_BaseColor)
m_BaseColor(a_BaseColor),
m_CustomName(std::move(a_CustomName))
{
ASSERT((a_BlockType == E_BLOCK_WALL_BANNER) || (a_BlockType == E_BLOCK_STANDING_BANNER));
}
@ -33,27 +25,11 @@ cBannerEntity::cBannerEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vect
unsigned char cBannerEntity::GetBaseColor() const
{
return m_BaseColor;
}
void cBannerEntity::SetBaseColor(const unsigned char a_Color)
{
m_BaseColor = a_Color;
}
cItems cBannerEntity::ConvertToPickups() const
{
return cItem(E_ITEM_BANNER, 1, static_cast<NIBBLETYPE>(GetBaseColor()));
cItem Item(E_ITEM_BANNER, 1, static_cast<NIBBLETYPE>(GetBaseColor()));
Item.m_CustomName = m_CustomName;
return Item;
}
@ -65,6 +41,7 @@ void cBannerEntity::CopyFrom(const cBlockEntity & a_Src)
Super::CopyFrom(a_Src);
auto & src = static_cast<const cBannerEntity &>(a_Src);
m_BaseColor = src.m_BaseColor;
m_CustomName = src.m_CustomName;
}

View File

@ -25,16 +25,20 @@ class cBannerEntity :
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);
cBannerEntity(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, Vector3i a_Pos, cWorld * a_World, unsigned char a_BaseColor = 1, AString a_CustomName = "");
unsigned char GetBaseColor() const;
void SetBaseColor(unsigned char a_Color);
unsigned char GetBaseColor() const { return m_BaseColor; }
void SetBaseColor(unsigned char a_Color) { m_BaseColor = a_Color; }
const AString & GetCustomName() const { return m_CustomName; }
void SetCustomName(const AString & a_CustomName) { m_CustomName = a_CustomName; }
private:
unsigned char m_BaseColor;
AString m_CustomName;
// cBlockEntity overrides:
virtual cItems ConvertToPickups() const override;
virtual void CopyFrom(const cBlockEntity & a_Src) override;

View File

@ -40,7 +40,9 @@ private:
{
ASSERT((a_BlockEntity.GetBlockType() == E_BLOCK_STANDING_BANNER) || (a_BlockEntity.GetBlockType() == E_BLOCK_WALL_BANNER));
static_cast<cBannerEntity &>(a_BlockEntity).SetBaseColor(static_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage));
cBannerEntity & BannerEntity = static_cast<cBannerEntity &>(a_BlockEntity);
BannerEntity.SetBaseColor(static_cast<NIBBLETYPE>(a_HeldItem.m_ItemDamage));
BannerEntity.SetCustomName(a_HeldItem.m_CustomName);
return false;
});

View File

@ -376,6 +376,10 @@ public:
mWriter.BeginCompound("");
AddBasicTileEntity(a_Entity,"Banner");
mWriter.AddInt("Base", static_cast<int>(a_Entity->GetBaseColor()));
if (!a_Entity->GetCustomName().empty())
{
mWriter.AddString("CustomName", a_Entity->GetCustomName());
}
mWriter.EndCompound();
}

View File

@ -890,15 +890,23 @@ OwnedBlockEntity cWSSAnvil::LoadBannerFromNBT(const cParsedNBT & a_NBT, int a_Ta
return nullptr;
}
unsigned char Color = 15;
AString CustomName;
// Reads base color from NBT
int CurrentLine = a_NBT.FindChildByName(a_TagIdx, "Base");
if (CurrentLine >= 0)
{
const auto Color = static_cast<unsigned char>(a_NBT.GetInt(CurrentLine));
return std::make_unique<cBannerEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World, Color);
Color = static_cast<unsigned char>(a_NBT.GetInt(CurrentLine));
}
return nullptr;
CurrentLine = a_NBT.FindChildByName(a_TagIdx, "CustomName");
if ((CurrentLine >= 0) && (a_NBT.GetType(CurrentLine) == TAG_String))
{
CustomName = a_NBT.GetString(CurrentLine);
}
return std::make_unique<cBannerEntity>(a_BlockType, a_BlockMeta, a_Pos, m_World, Color, CustomName);
}