aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKahrl <kahrl@gmx.net>2012-01-31 20:42:49 +0100
committerPerttu Ahola <celeron55@gmail.com>2012-02-02 12:50:11 +0200
commit796009ef2152262ba9b2541256a880ff555449fd (patch)
treec26274ea1b1a25c151a9d7077f17fda7133a6e07 /src
parent0e8bd531c243c4e19217ef249c2316710cee44cc (diff)
downloadminetest-796009ef2152262ba9b2541256a880ff555449fd.tar.gz
minetest-796009ef2152262ba9b2541256a880ff555449fd.tar.bz2
minetest-796009ef2152262ba9b2541256a880ff555449fd.zip
Fix server hang when stepping a furnace with a huge dtime
Diffstat (limited to 'src')
-rw-r--r--src/content_nodemeta.cpp23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/content_nodemeta.cpp b/src/content_nodemeta.cpp
index 9fb5450cf..b36d57c89 100644
--- a/src/content_nodemeta.cpp
+++ b/src/content_nodemeta.cpp
@@ -441,6 +441,10 @@ bool FurnaceNodeMetadata::step(float dtime)
{
if(dtime > 60.0)
infostream<<"Furnace stepping a long time ("<<dtime<<")"<<std::endl;
+
+ InventoryList *dst_list = m_inventory->getList("dst");
+ assert(dst_list);
+
// Update at a fixed frequency
const float interval = 2.0;
m_step_accumulator += dtime;
@@ -452,8 +456,7 @@ bool FurnaceNodeMetadata::step(float dtime)
//infostream<<"Furnace step dtime="<<dtime<<std::endl;
- InventoryList *dst_list = m_inventory->getList("dst");
- assert(dst_list);
+ bool changed_this_loop = false;
// Check
// 1. if the source item is cookable
@@ -473,7 +476,7 @@ bool FurnaceNodeMetadata::step(float dtime)
bool burning = (m_fuel_time < m_fuel_totaltime);
if(burning)
{
- changed = true;
+ changed_this_loop = true;
m_fuel_time += dtime;
}
@@ -483,7 +486,7 @@ bool FurnaceNodeMetadata::step(float dtime)
float burntime;
if(burning)
{
- changed = true;
+ changed_this_loop = true;
m_src_time += dtime;
m_src_totaltime = cooktime;
infotext = "Furnace is cooking";
@@ -491,7 +494,7 @@ bool FurnaceNodeMetadata::step(float dtime)
else if(getBurnResult(true, burntime))
{
// Fuel inserted
- changed = true;
+ changed_this_loop = true;
m_fuel_time = 0;
m_fuel_totaltime = burntime;
//m_src_time += dtime;
@@ -507,7 +510,7 @@ bool FurnaceNodeMetadata::step(float dtime)
if(m_src_totaltime > 0.001 && m_src_time >= m_src_totaltime)
{
// One item fully cooked
- changed = true;
+ changed_this_loop = true;
dst_list->addItem(cookresult_item);
getCookResult(true, cookresult, cooktime); // decrement source
m_src_totaltime = 0;
@@ -541,7 +544,7 @@ bool FurnaceNodeMetadata::step(float dtime)
if(infotext != m_infotext)
{
m_infotext = infotext;
- changed = true;
+ changed_this_loop = true;
}
if(burning && m_fuel_time >= m_fuel_totaltime)
@@ -550,7 +553,11 @@ bool FurnaceNodeMetadata::step(float dtime)
m_fuel_totaltime = 0;
}
- if(!changed)
+ if(changed_this_loop)
+ {
+ changed = true;
+ }
+ else
{
m_step_accumulator = 0;
break;