From 4ba2b5179eedc50f76c1f25bdd091c0b3cc56cb7 Mon Sep 17 00:00:00 2001 From: Ekdohibs Date: Thu, 21 Dec 2017 10:28:06 +0100 Subject: [PATCH] Furnace: Fix being able to cook items without enough fuel This was triggered when too much time had elapsed when timer was called. Also, fix timer resolution giving free fuel time. --- mods/default/furnace.lua | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index 4b822058..05056e6b 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -119,7 +119,7 @@ local function furnace_node_timer(pos, elapsed) local fuel local update = true - while update do + while elapsed > 0 and update do update = false srclist = inv:get_list("src") @@ -134,13 +134,18 @@ local function furnace_node_timer(pos, elapsed) cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) cookable = cooked.time ~= 0 + local el = math.min(elapsed, fuel_totaltime - fuel_time) + if cookable then -- fuel lasts long enough, adjust el to cooking duration + el = math.min(el, cooked.time - src_time) + end + -- Check if we have enough fuel to burn if fuel_time < fuel_totaltime then -- The furnace is currently active and has enough fuel - fuel_time = fuel_time + elapsed + fuel_time = fuel_time + el -- If there is a cookable item then check if it is ready yet if cookable then - src_time = src_time + elapsed + src_time = src_time + el if src_time >= cooked.time then -- Place result in dst list if possible if inv:room_for_item("dst", cooked.item) then @@ -149,6 +154,9 @@ local function furnace_node_timer(pos, elapsed) src_time = src_time - cooked.time update = true end + else + -- Item could not be cooked: probably missing fuel + update = true end end else @@ -166,8 +174,7 @@ local function furnace_node_timer(pos, elapsed) -- Take fuel from fuel list inv:set_stack("fuel", 1, afterfuel.items[1]) update = true - fuel_totaltime = fuel.time + (fuel_time - fuel_totaltime) - src_time = src_time + elapsed + fuel_totaltime = fuel.time + (fuel_totaltime - fuel_time) end else -- We don't need to get new fuel since there is no cookable item @@ -177,7 +184,7 @@ local function furnace_node_timer(pos, elapsed) fuel_time = 0 end - elapsed = 0 + elapsed = elapsed - el end if fuel and fuel_totaltime > fuel.time then