/* Minetest-c55 Copyright (C) 2010-2011 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "inventorymanager.h" #include "log.h" #include "environment.h" #include "scriptapi.h" #include "serverobject.h" #include "main.h" // for g_settings #include "settings.h" #include "utility.h" #include "craftdef.h" /* InventoryLocation */ std::string InventoryLocation::dump() const { std::ostringstream os(std::ios::binary); serialize(os); return os.str(); } void InventoryLocation::serialize(std::ostream &os) const { switch(type){ case InventoryLocation::UNDEFINED: { os<<"undefined"; } break; case InventoryLocation::CURRENT_PLAYER: { os<<"current_player"; } break; case InventoryLocation::PLAYER: { os<<"player:"<getInventory(from_inv); Inventory *inv_to = mgr->getInventory(to_inv); if(!inv_from){ infostream<<"IMoveAction::apply(): FAIL: source inventory not found: " <<"from_inv=\""<getList(from_list); InventoryList *list_to = inv_to->getList(to_list); /* If a list doesn't exist or the source item doesn't exist */ if(!list_from){ infostream<<"IMoveAction::apply(): FAIL: source list not found: " <<"from_inv=\""<moveItem(from_i, list_to, to_i, count); mgr->setInventoryModified(from_inv); if(inv_from != inv_to) mgr->setInventoryModified(to_inv); infostream<<"IMoveAction::apply(): moved at " <<" count="<getList(from_list); /* If a list doesn't exist or the source item doesn't exist */ if(!list_from){ infostream<<"IDropAction::apply(): FAIL: source list not found: " <<"from_inv=\""<getItem(from_i).empty()) { infostream<<"IDropAction::apply(): FAIL: source item not found: " <<"from_inv=\""<addItem(from_i, item2); // Unless we have put the same amount back as we took in the first place, // set inventory modified flag if(item2.count != item1.count) mgr->setInventoryModified(from_inv); } infostream<<"IDropAction::apply(): dropped " <<" from inv=\""<getList("craft"); InventoryList *list_craftresult = inv_craft->getList("craftresult"); /* If a list doesn't exist or the source item doesn't exist */ if(!list_craft){ infostream<<"ICraftAction::apply(): FAIL: craft list not found: " <<"craft_inv=\""<getSize() < 1){ infostream<<"ICraftAction::apply(): FAIL: craftresult list too short: " <<"craft_inv=\""<itemFits(0, crafted)) { // Decrement input and add crafting output getCraftingResult(inv_craft, crafted, true, gamedef); list_craftresult->addItem(0, crafted); mgr->setInventoryModified(craft_inv); actionstream<getDescription() <<" crafts " < 1) count_remaining--; // Get next crafting result found = getCraftingResult(inv_craft, crafted, false, gamedef); } infostream<<"ICraftAction::apply(): crafted " <<" craft_inv=\""<getList("craft"); if(!clist || clist->getSize() != 9) return false; // Mangle crafting grid to an another format CraftInput ci; ci.method = CRAFT_METHOD_NORMAL; ci.width = 3; for(u16 i=0; i<9; i++) ci.items.push_back(clist->getItem(i)); // Find out what is crafted and add it to result item slot CraftOutput co; bool found = gamedef->getCraftDefManager()->getCraftResult( ci, co, decrementInput, gamedef); if(found) result.deSerialize(co.item, gamedef->getItemDefManager()); if(found && decrementInput) { // CraftInput has been changed, apply changes in clist for(u16 i=0; i<9; i++) { clist->changeItem(i, ci.items[i]); } } return found; }