1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-08-11 17:51:04 +00:00

Fixed some problems with crafting and inventory

This commit is contained in:
Perttu Ahola 2011-04-11 21:28:04 +03:00
parent 81ac026e1f
commit 249c0dc68a
6 changed files with 75 additions and 34 deletions

View file

@ -2649,40 +2649,47 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
if(ma->to_inv == "current_player" &&
ma->from_inv == "current_player")
{
// Don't allow moving anything to craftresult
if(ma->to_list == "craftresult")
InventoryList *rlist = player->inventory.getList("craftresult");
assert(rlist);
InventoryList *clist = player->inventory.getList("craft");
assert(clist);
InventoryList *mlist = player->inventory.getList("main");
assert(mlist);
/*
Craftresult is no longer preview if something
is moved into it
*/
if(ma->to_list == "craftresult"
&& ma->from_list != "craftresult")
{
// Do nothing
disable_action = true;
// If it currently is a preview, remove
// its contents
if(player->craftresult_is_preview)
{
rlist->deleteItem(0);
}
player->craftresult_is_preview = false;
}
// When something is removed from craftresult
if(ma->from_list == "craftresult")
/*
Crafting takes place if this condition is true.
*/
if(player->craftresult_is_preview &&
ma->from_list == "craftresult")
{
player->craftresult_is_preview = false;
clist->decrementMaterials(1);
}
/*
If the craftresult is placed on itself, move it to
main inventory instead of doing the action
*/
if(ma->to_list == "craftresult"
&& ma->from_list == "craftresult")
{
disable_action = true;
// Remove stuff from craft
InventoryList *clist = player->inventory.getList("craft");
if(clist)
{
u16 count = ma->count;
if(count == 0)
count = 1;
clist->decrementMaterials(count);
}
// Do action
// Feed action to player inventory
//a->apply(&player->inventory);
a->apply(&c, this);
// Eat it
delete a;
// If something appeared in craftresult, throw it
// in the main list
InventoryList *rlist = player->inventory.getList("craftresult");
InventoryList *mlist = player->inventory.getList("main");
if(rlist && mlist && rlist->getUsedSlots() == 1)
{
InventoryItem *item1 = rlist->changeItem(0, NULL);
mlist->addItem(item1);
}
InventoryItem *item1 = rlist->changeItem(0, NULL);
mlist->addItem(item1);
}
}
}
@ -2690,7 +2697,6 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
if(disable_action == false)
{
// Feed action to player inventory
//a->apply(&player->inventory);
a->apply(&c, this);
// Eat the action
delete a;
@ -3066,6 +3072,7 @@ void Server::SendInventory(u16 peer_id)
DSTACK(__FUNCTION_NAME);
Player* player = m_env.getPlayer(peer_id);
assert(player);
/*
Calculate crafting stuff
@ -3074,11 +3081,15 @@ void Server::SendInventory(u16 peer_id)
{
InventoryList *clist = player->inventory.getList("craft");
InventoryList *rlist = player->inventory.getList("craftresult");
if(rlist)
if(rlist->getUsedSlots() == 0)
player->craftresult_is_preview = true;
if(rlist && player->craftresult_is_preview)
{
rlist->clearItems();
}
if(clist && rlist)
if(clist && rlist && player->craftresult_is_preview)
{
InventoryItem *items[9];
for(u16 i=0; i<9; i++)
@ -3355,8 +3366,8 @@ void Server::SendInventory(u16 peer_id)
found = true;
}
}
}
} // if creative_mode == false
/*