Skip to content

Commit

Permalink
Merge remote-tracking branch 'queatz/furnace-is-not-out-nor-can-rat-e…
Browse files Browse the repository at this point in the history
…scape'
  • Loading branch information
celeron55 committed Aug 30, 2011
2 parents 625dac8 + 134e49c commit 87b9e54
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 13 deletions.
34 changes: 26 additions & 8 deletions src/content_nodemeta.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,16 +182,24 @@ std::string FurnaceNodeMetadata::infoText()
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;
}
}
Expand Down Expand Up @@ -221,9 +229,14 @@ bool FurnaceNodeMetadata::step(float dtime)
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;
}
Expand Down Expand Up @@ -252,13 +265,18 @@ bool FurnaceNodeMetadata::step(float dtime)
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;
Expand Down
24 changes: 21 additions & 3 deletions src/inventory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,7 @@ InventoryItem * InventoryList::addItem(u32 i, InventoryItem *newitem)
}
}

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);
Expand All @@ -558,11 +558,11 @@ bool InventoryList::itemFits(u32 i, InventoryItem *newitem)
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;
Expand All @@ -571,6 +571,24 @@ bool InventoryList::itemFits(u32 i, InventoryItem *newitem)
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)
Expand Down
8 changes: 7 additions & 1 deletion src/inventory.h
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,13 @@ class InventoryList
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.
Expand Down
2 changes: 1 addition & 1 deletion src/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2446,7 +2446,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
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;