Cuberite Forum
Implementing banner - Printable Version

+- Cuberite Forum (https://forum.cuberite.org)
+-- Forum: Cuberite (https://forum.cuberite.org/forum-4.html)
+--- Forum: Development (https://forum.cuberite.org/forum-13.html)
+--- Thread: Implementing banner (/thread-2451.html)

Pages: 1 2 3 4


Implementing banner - Seyaku - 05-21-2016

I'm working on adding support for the banners. From what I understand, banner items have extra nbt data associated with them, containing information about the patterns and color. Currently I don't see how I can access this information, or can this be deduced from the meta flag?

Any insight on how to get the necessary info the create the block and blockentity would be great.


I already implemented most code for the item handler, blocks (wall and standing) and the entity. (by using the sign as an example) Also added the necessary networking code to send entity updates for the banners and currently looking on what to add to the chunk class and the chunk serializer.


RE: Implementing banner - xoft - 05-21-2016

Hello, and welcome to the forum.

There's currently no extra storage associated with items. So far what we've done with other items (fireworks, to the best of my knowledge) is to simply add all the necessary fields directly into the cItem class.


RE: Implementing banner - Seyaku - 05-22-2016

Hmm I think we need a more generic solution than to add extra fields to cItem for each item that has extra meta data. I'll experiment a bit with this myself.

Also, I just came across this code:
unique_ptr<class> ptr = make_unique<class>()

only to release it via release() on return. Doesn't this add more overhead as opposed to just make a heap allocation via 'new' and return the pointer?


RE: Implementing banner - Jammet - 05-22-2016

Wow, you're really implementing banners! :] I was just hoping someone would do that.


RE: Implementing banner - Seyaku - 05-22-2016

Just an update, banners can now be placed but I only see them when reconnecting. I'm assuming I need to send an update to let the client know about the new banner. Looking at the other item handlers it must be something like this, but it doesn't work. Any pointers?

	virtual bool OnPlayerPlace(
		cWorld & a_World, cPlayer & a_Player, const cItem & a_EquippedItem,
		int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace,
		int a_CursorX, int a_CursorY, int a_CursorZ
	) override
	{
		// If the regular placement doesn\'t work, do no further processing:
		if (!super::OnPlayerPlace(a_World, a_Player, a_EquippedItem, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ))
		{
			return false;
		}

		AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
		
		// Use a callback to set the properties of the banner entity
		class cCallback : public cBlockEntityCallback
		{
			cPlayer & m_Player;
			NIBBLETYPE m_BlockMeta;

			virtual bool Item(cBlockEntity * a_BlockEntity)
			{
				if (!(a_BlockEntity->GetBlockType() == E_BLOCK_STANDING_BANNER || a_BlockEntity->GetBlockType() == E_BLOCK_WALL_BANNER))
				{
					return false;
				}
				auto BannerEntity = static_cast<cBannerEntity *>(a_BlockEntity);

				//TODO base color and patterns

				BannerEntity->GetWorld()->BroadcastBlockEntity(BannerEntity->GetPosX(), BannerEntity->GetPosY(), BannerEntity->GetPosZ());
				//m_Player.GetClientHandle()->SendUpdateBlockEntity(*a_BlockEntity);
				return false;
			}

		public:
			cCallback(cPlayer & a_CBPlayer, NIBBLETYPE a_BlockMeta) :
				m_Player(a_CBPlayer),
				m_BlockMeta(a_BlockMeta)
			{}
		};
		cCallback Callback(a_Player, static_cast<NIBBLETYPE>(a_BlockFace));
		a_World.DoWithBlockEntityAt(a_BlockX, a_BlockY, a_BlockZ, Callback);

		return true;
	}



RE: Implementing banner - Jammet - 05-22-2016

I hope someone here knows the solution to that problem. Smile


RE: Implementing banner - xoft - 05-22-2016

As for the unique_ptr question, I believe the code has other return paths that don't release the pointer, thus using its auto-delete feature.


RE: Implementing banner - Seyaku - 05-22-2016

Yay! Got it working. Added a meta data storage system to cItem which reads/writes to/from NBT and JSON. Placement and data saving works (placed banners to chunks and items to json).

All that is left is adding the crafting recipes.


RE: Implementing banner - xoft - 05-23-2016

I'm interested in the metadata storage system, what are you using for it?

Personally I'd probably go with Json::Value for a root value, which would be a dictionary of other values, as needed. Since there are plans to make the Json library available to plugins, it would mean the easiest bindings generation.


RE: Implementing banner - Seyaku - 05-23-2016

Check https://github.com/cuberite/cuberite/compare/master...sladage:banner

Item.h should give you a good idea. I made it as generic as possible.