assert(src_list);
const InventoryItem *src_item = src_list->getItem(0);
- if(src_item)
+ if(src_item) {
+ InventoryList *dst_list = m_inventory->getList("dst");
+ if(!dst_list->roomForCookedItem(src_item))
+ return "Furnace is overloaded";
return "Furnace is out of fuel";
+ }
else
return "Furnace is inactive";
}
else
{
- std::string s = "Furnace is active (";
- s += itos(m_fuel_time/m_fuel_totaltime*100);
- s += "%)";
+ std::string s = "Furnace is active";
+ // Do this so it doesn't always show (0%) for weak fuel
+ if(m_fuel_totaltime > 3) {
+ s += " (";
+ s += itos(m_fuel_time/m_fuel_totaltime*100);
+ s += "%)";
+ }
return s;
}
}
assert(src_list);
const InventoryItem *src_item = src_list->getItem(0);
+ bool room_available = false;
+
+ if(src_item && src_item->isCookable())
+ room_available = dst_list->roomForCookedItem(src_item);
+
// Start only if there are free slots in dst, so that it can
// accomodate any result item
- if(dst_list->getFreeSlots() > 0 && src_item && src_item->isCookable())
+ if(room_available)
{
m_src_totaltime = 3;
}
m_src_totaltime = 0;
}
changed = true;
- continue;
+
+ // Fall through if the fuel item was used up this step
+ if(m_fuel_time < m_fuel_totaltime)
+ continue;
}
/*
- If there is no source item or source item is not cookable, stop loop.
+ If there is no source item or source item is not cookable,
+ or furnace became overloaded, stop loop.
*/
- if(src_item == NULL || m_src_totaltime < 0.001)
+ if((m_fuel_time < m_fuel_totaltime || dst_list->roomForCookedItem(src_item) == false)
+ && (src_item == NULL || m_src_totaltime < 0.001))
{
m_step_accumulator = 0;
break;
}
}
-bool InventoryList::itemFits(u32 i, InventoryItem *newitem)
+bool InventoryList::itemFits(const u32 i, const InventoryItem *newitem)
{
// If it is an empty position, it's an easy job.
const InventoryItem *to_item = getItem(i);
return true;
}
- // If not addable, return the item
+ // If not addable, fail
if(newitem->addableTo(to_item) == false)
return false;
- // If the item fits fully in the slot, add counter and delete it
+ // If the item fits fully in the slot, pass
if(newitem->getCount() <= to_item->freeSpace())
{
return true;
return false;
}
+bool InventoryList::roomForItem(const InventoryItem *item)
+{
+ for(u32 i=0; i<m_items.size(); i++)
+ if(itemFits(i, item))
+ return true;
+ return false;
+}
+
+bool InventoryList::roomForCookedItem(const InventoryItem *item)
+{
+ const InventoryItem *cook = item->createCookResult();
+ if(!cook)
+ return false;
+ bool room = roomForItem(cook);
+ delete cook;
+ return room;
+}
+
InventoryItem * InventoryList::takeItem(u32 i, u32 count)
{
if(count == 0)
InventoryItem * addItem(u32 i, InventoryItem *newitem);
// Checks whether the item could be added to the given slot
- bool itemFits(u32 i, InventoryItem *newitem);
+ bool itemFits(const u32 i, const InventoryItem *newitem);
+
+ // Checks whether there is room for a given item
+ bool roomForItem(const InventoryItem *item);
+
+ // Checks whether there is room for a given item aftr it has been cooked
+ bool roomForCookedItem(const InventoryItem *item);
// Takes some items from a slot.
// If there are not enough, takes as many as it can.
if(g_settings.getBool("creative_mode") == false)
{
// Skip if inventory has no free space
- if(ilist->getUsedSlots() == ilist->getSize())
+ if(ilist->roomForItem(item) == false)
{
dout_server<<"Player inventory has no free space"<<std::endl;
return;