Cuberite Forum

Full Version: Enchanting
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9 10 11
It's all enchanting done?
Enchanting is almost done. But currently on every item will be 3 enchantments when you have enough levels. And i forgot to remove the level from the player.
I fixed now some bugs.
2 features aren't working currently.
The first is the bookshelf checking and the second that every item will become the max amount of enchantments.

https://github.com/daniel0916/MCServer/c...9f4d1a651e
The Level in XP Converting is not perfect. When i am level 31 and enchant something i will have 3 level after the enchanting

And i found a bug in MCServer. The Enchantments are invisible. I will make a Report on Github
LO1ZB has a good idea.
He will check the bookshelves not on every enchanting.
He will check the bookshelves when a enchantment table will be placed (and save).
He will check the bookshelves when a bookshelves will be mined in the area of a enchantment table (and save).
He will check the bookshelves when a bookshelves will be placed in the area of a enchantment table (and save).

Is this better than check every enchanting how many bookshelves are around the enchantment table?
Not really. To save, he would need to make a place to save the info - so an enchantment table block entity with data that the vanilla doesn't have. So if someone loads a vanilla-generated world, you still need to calculate the number of bookshelves. Not to mention such weird cases such as a bookshelf being in one chunk and the enchanting table in the neighboring chunk, which is already unloaded, and for some reason the bookshelf gets destroyed - there's nowhere to save the updated value, because the enchanting table's chunk is not loaded.

Too much work for very little gain. The actual check for the number of bookshelves is done so infrequently that it's not worth the "optimizations". Much better to calculate the value when the enchantment table is rclked (so store the value in its UI window).
https://github.com/mc-server/MCServer/issues/886
Have anyone a idea why it's buggy?
Okay good. The enchanting system is ready. Only one thing didn't work. When you will move a item with shift click into the enchanting table the item is in the slot but the Clicked Method from cSlotAreaEnchanting won't be called. How can i add the shift click feature? Shift Click in the enchantment slot to do the item out is working (https://github.com/daniel0916/MCServer/b...a.cpp#L710 ).

What is wrong with this code?
int Bookshelves = 0;
	cBlockArea Area;
	Area.Read(a_World, PosX - 2, PosX + 2, PosY, PosY + 1, PosZ - 2, PosZ + 2);

	static const struct
	{
		int m_BookX, m_BookY, m_BookZ;  // Coords to check for bookcases
		int m_AirX, m_AirY, m_AirZ;  // Coords to check for air; if not air, the bookcase won't be counted
	} CheckCoords[] =
	{
		{ -2, 0, -2, -1, 0, -1 },  // Bookcase at {-2, 0, -2}, air at {-1, 0, -1}
		{ -1, 0, -2, -1, 0, -1 },  // Bookcase at {-1, 0, -2}, air at {-1, 0, -1}
		{ 0, 0, -2, 0, 0, -1 },    // Bookcase at {0, 0, -2}, air at {0, 0, -1}
		{ 1, 0, -2, 1, 0, -1 },    // Bookcase at {1, 0, -2}, air at {1, 0, -1}
		{ 2, 0, -2, 1, 0, -1 },    // Bookcase at {2, 0, -2}, air at {1, 0, -1}
		{ 2, 0, -1, 1, 0, -1 },    // Bookcase at {2, 0, -1}, air at {1, 0, -1}
		{ 2, 0, 0, 1, 0, 0 },      // Bookcase at {2, 0, 0}, air at {1, 0, 0}
		{ 2, 0, 1, 1, 0, 1 },      // Bookcase at {2, 0, 1}, air at {1, 0, 1}
		{ 2, 0, 2, 1, 0, 1 },      // Bookcase at {2, 0, 2}, air at {1, 0, 1}
		{ 1, 0, 2, 1, 0, 1 },      // Bookcase at {1, 0, 2}, air at {1, 0, 1}
		{ 0, 0, 2, 0, 0, 1 },      // Bookcase at {0, 0, 2}, air at {0, 0, 1}
		{ -1, 0, 2, -1, 0, 1 },    // Bookcase at {-1, 0, 2}, air at {-1, 0, 1}
		{ -2, 0, 2, -1, 0, 1 },    // Bookcase at {-2, 0, 2}, air at {-1, 0, 1}
		{ -2, 0, 1, -1, 0, 1 },    // Bookcase at {-2, 0, 1}, air at {-1, 0, 1}
		{ -2, 0, 0, -1, 0, 0 },    // Bookcase at {-2, 0, 0}, air at {-1, 0, 0}
		{ -2, 0, -1, -1, 0, -1 },   // Bookcase at {-2, 0, -1}, air at {-1, 0, -1}

		{ -2, 1, -2, -1, 1, -1 },  // Bookcase at {-2, 1, -2}, air at {-1, 1, -1}
		{ -1, 1, -2, -1, 1, -1 },  // Bookcase at {-1, 1, -2}, air at {-1, 1, -1}
		{ 0, 1, -2, 0, 1, -1 },    // Bookcase at {0, 1, -2}, air at {0, 1, -1}
		{ 1, 1, -2, 1, 1, -1 },    // Bookcase at {1, 1, -2}, air at {1, 1, -1}
		{ 2, 1, -2, 1, 1, -1 },    // Bookcase at {2, 1, -2}, air at {1, 1, -1}
		{ 2, 1, -1, 1, 1, -1 },    // Bookcase at {2, 1, -1}, air at {1, 1, -1}
		{ 2, 1, 0, 1, 1, 0 },      // Bookcase at {2, 1, 0}, air at {1, 1, 0}
		{ 2, 1, 1, 1, 1, 1 },      // Bookcase at {2, 1, 1}, air at {1, 1, 1}
		{ 2, 1, 2, 1, 1, 1 },      // Bookcase at {2, 1, 2}, air at {1, 1, 1}
		{ 1, 1, 2, 1, 1, 1 },      // Bookcase at {1, 1, 2}, air at {1, 1, 1}
		{ 0, 1, 2, 0, 1, 1 },      // Bookcase at {0, 1, 2}, air at {0, 1, 1}
		{ -1, 1, 2, -1, 1, 1 },    // Bookcase at {-1, 1, 2}, air at {-1, 1, 1}
		{ -2, 1, 2, -1, 1, 1 },    // Bookcase at {-2, 1, 2}, air at {-1, 1, 1}
		{ -2, 1, 1, -1, 1, 1 },    // Bookcase at {-2, 1, 1}, air at {-1, 1, 1}
		{ -2, 1, 0, -1, 1, 0 },    // Bookcase at {-2, 1, 0}, air at {-1, 1, 0}
		{ -2, 1, -1, -1, 1, -1 }   // Bookcase at {-2, 1, -1}, air at {-1, 1, -1}
	};

	for (size_t i = 0; i < ARRAYCOUNT(CheckCoords); i++)
	{
		if (
			(Area.GetRelBlockType(CheckCoords[i].m_AirX, CheckCoords[i].m_AirY, CheckCoords[i].m_AirZ) == E_BLOCK_AIR) &&  // There's air in the checkspot
			(Area.GetRelBlockType(CheckCoords[i].m_BookX, CheckCoords[i].m_BookY, CheckCoords[i].m_BookZ) == E_BLOCK_BOOKCASE)  // There's bookcase in the wanted place
			)
		{
			Bookshelves++;
			cRoot::Get()->BroadcastChat("Bookshelf");
		}
	}  // for i - CheckCoords
This is just an idea, but you could maybe use the cLineBlockTracer class.
Pages: 1 2 3 4 5 6 7 8 9 10 11