local fuel = 260 local oven_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, -0.3125, 0.5, 0.4375}, -- bottom_left {0.3125, -0.5, -0.5, 0.5, 0.5, 0.4375}, -- bottom_right {-0.5, -0.5, -0.5, 0.5, -0.25, 0.4375}, -- bottom_bottom {-0.5, -0.5, -0.125, 0.5, 0.5, 0.4375}, -- bottom_inside {-0.5, 0.125, -0.5, 0.5, 0.5, 0.4375}, -- bottom_top {-0.5, -0.5, -0.5, 0.5, -0.1875, -0.4375}, -- bottom_front {-0.4375, 0.5, 0.25, 0.4375, 1.125, 0.4375}, -- top_back {-0.5, 0.5, -0.4375, -0.3125, 1.125, 0.4375}, -- top_left {0.3125, 0.5, -0.4375, 0.5, 1.125, 0.4375}, -- top_right {-0.5, 0.625, -0.4375, 0.5, 1.125, 0.4375}, -- top_front {-0.25, -0.5, 0, 0.25, 1.375, 0.5}, -- stack_thing } } minetest.register_node("pizzaria:pizza_oven_slot", { drawtype = "airlike", paramtype = "light", sunlight_propagates = true, walkable = false, pointable = false, diggable = false, buildable_to = true, floodable = true, air_equivalent = true, drop = "", groups = {not_in_creative_inventory=1}, on_construct = function(pos) local down = {x=pos.x, y=pos.y-1, z=pos.z} if minetest.get_node(down).name ~= "pizzaria:pizza_oven" then minetest.remove_node(pos) end end, }) local function pizza_above(pos) local up = {x=pos.x, y=pos.y+1, z=pos.z} local node = minetest.get_node(up) local def = minetest.registered_nodes[node.name] if def then if def.cooked then return "raw", def.cooked end if def.done then return "cooked", "pizzaria:burnt_pizza" end if node.name == "pizzaria:burnt_pizza" then return "burnt", nil end end return false, nil end local function get_oven_state(pos) local node = minetest.get_node(pos) if node.name == "pizzaria:pizza_oven" then return "empty" elseif node.name == "pizzaria:pizza_oven_fueled" then return "fueled" elseif node.name == "pizzaria:pizza_oven_active" then return "active" end return false end local function swap_node(pos, name) local node = minetest.get_node(pos) if name == node.name or not name then return end node.name = name local timer = minetest.get_node_timer(pos) local timeout = timer:get_timeout() local elapsed = timer:get_elapsed() minetest.swap_node(pos, node) timer = minetest.get_node_timer(pos) timer:set(timeout, elapsed) end local function start_timer(pos, elapsed) --Pizza pos local pizza_pos = {x=pos.x, y=pos.y+1, z=pos.z} --Meta values local meta = minetest.get_meta(pos) local cook_time_elapsed = meta:get_float("cook_time_elapsed") local cook_time = meta:get_float("cook_time") local fuel_time = meta:get_float("fuel_time") local timer = minetest.get_node_timer(pos) --Node States local pizza, cooked = pizza_above(pos) local oven = get_oven_state(pos) --Mode specification local mode = "" if not pizza and oven == "empty" then mode = "empty" elseif pizza == "raw" and oven == "active" then mode = "cooking" elseif cooked == "pizzaria:burnt_pizza" then mode = "burning" elseif oven == "empty" and pizza then mode = "fuel_empty" elseif not pizza and oven ~= "empty" then mode = "nopizza" end --Run timers based on mode if pizza and oven == "active" and cook_time > 0 then meta:set_float("cook_time_elapsed", cook_time_elapsed+elapsed) end if oven == "active" and fuel_time > 0 then meta:set_float("fuel_time", fuel_time-elapsed) end --Update values cook_time_elapsed = meta:get_float("cook_time_elapsed") fuel_time = meta:get_float("fuel_time") if not pizza then meta:set_float("cook_time_elapsed", 0) meta:set_float("cook_time", 0) minetest.set_node(pizza_pos, {name = "pizzaria:pizza_oven_slot"}) end --Make a change if cook_time_elapsed > cook_time and cooked then minetest.set_node(pizza_pos, {name=cooked}) meta:set_float("cook_time_elapsed", 0) meta:set_float("cook_time", 50) end if fuel_time <= 1 then swap_node(pos, "pizzaria:pizza_oven") if mode == "burning" then meta:set_float("cook_time_elapsed", 0) meta:set_float("cook_time", 0) end end --Infotext local infotext = "Pizza: 100%\nFuel: none;" local fuel_percentage = math.max(math.ceil(0.5+fuel_time/fuel*98), 0) local cook_percentage = math.floor(0.5+cook_time_elapsed/cook_time*99) if mode == "nopizza" then infotext = "Pizza: none;\n".. "Fuel: ".. fuel_percentage.. "%" elseif mode == "cooking" then infotext = "Pizza: "..cook_percentage.."%\n".. "Fuel: ".. fuel_percentage.. "%" elseif mode == "fuel_empty" then infotext = "Pizza: "..cook_percentage.."%\n".. "Fuel: none;" elseif mode == "empty" then infotext = "Pizza: none;\nFuel: none;" elseif oven == "fueled" and pizza ~= "cooked" then infotext = "Pizza: "..cook_percentage.."%\n".. "Fuel: ".. fuel_percentage.. "%" elseif mode == "burning" then infotext = "Pizza will burn in: ".. math.floor(cook_time-cook_time_elapsed).."s\n".. "Fuel: ".. fuel_percentage.. "%" elseif pizza == "cooked" and oven == "empty" then infotext = "Pizza: 100%\n".. "Fuel: none;" elseif pizza == "burnt" then infotext = "Pizza: Burnt" end local oven_state = "" if oven == "active" then oven_state = "Active" else oven_state = "Extinguished" end meta:set_string("infotext", infotext.."\n"..oven_state) --Start next timer local tick = cook_time/fuel timer:start(tick) end local function rightclick(pos, node, player, itemstack, pointed_thing) local name = itemstack:get_name() local def = minetest.registered_nodes[name] local pizzaspace = pizza_above(pos) if def and def.cook_time and def.cooked and not pizzaspace then local meta = minetest.get_meta(pos) local up = {x = pos.x, y = pos.y+1, z = pos.z} local itemdef = minetest.registered_nodes[name] local cook_time = itemdef.cook_time minetest.set_node(up, {name = name}) meta:set_float("cook_time", math.random(cook_time.min, cook_time.max)) if node.name == "pizzaria:pizza_oven_active" then start_timer(pos, 0) meta:set_float("cook_time_elapsed", 0) end if not minetest.is_creative_enabled(player:get_player_name()) then itemstack:take_item() end end return itemstack end local function after_destruct(pos, oldnode) local up = {x = pos.x, y = pos.y+1, z = pos.z} local pizza = pizza_above(pos) local oven = oldnode.name minetest.dig_node(up) if jpizza.has_depends.fire and oven == "pizzaria:pizza_oven_active" then if minetest.get_node(pos).name == "air" then minetest.set_node(pos, {name = "fire:basic_flame"}) end end end minetest.register_node("pizzaria:pizza_oven_active", { drawtype = "mesh", paramtype2 = "facedir", paramtype = "light", light_source = 8, drop = "pizzaria:pizza_oven", groups = {cracky = 3, level = 1, pizza_oven = 1, not_in_creative_inventory=1}, tiles = { { name = "pizzaria_pizza_oven_active_animated.png", backface_culling = false, animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 3.0, }, }, }, mesh = "pizzaria_pizza_oven.obj", selection_box = oven_box, collision_box = oven_box, on_rightclick = rightclick, after_destruct = after_destruct, on_timer = start_timer, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("pizzaria:pizza_oven_fueled", { drawtype = "mesh", paramtype2 = "facedir", groups = {cracky = 3, level = 1, pizza_oven = 1, not_in_creative_inventory=1}, tiles = { "pizzaria_pizza_oven_fueled.png", }, mesh = "pizzaria_pizza_oven.obj", drop = "pizzaria:pizza_oven", selection_box = oven_box, collision_box = oven_box, after_destruct = after_destruct, on_punch = function(pos, node, player) local itemstack = player:get_wielded_item() if itemstack:get_name() == "default:torch" or itemstack:get_name() == "fire:flint_and_steel" then swap_node(pos, "pizzaria:pizza_oven_active") start_timer(pos, 0) end end, on_ignite = function(pos, igniter) swap_node(pos, "pizzaria:pizza_oven_active") start_timer(pos, 0) end, on_rightclick = rightclick, on_timer = start_timer, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("pizzaria:pizza_oven", { description = "Pizza Oven", drawtype = "mesh", paramtype2 = "facedir", groups = {cracky = 3, level = 1, pizza_oven = 1}, tiles = { "pizzaria_pizza_oven.png", }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_float("cook_time_elapsed", 0) meta:set_float("cook_time", 0) meta:set_float("fuel_time", 0) start_timer(pos, 0) end, mesh = "pizzaria_pizza_oven.obj", selection_box = oven_box, collision_box = oven_box, after_destruct = after_destruct, on_rightclick = function(pos, node, player, itemstack, pointed_thing) local itemstack = player:get_wielded_item() if minetest.get_item_group(itemstack:get_name(), "tree") > 0 then if not minetest.is_creative_enabled(player:get_player_name()) then itemstack:take_item() end swap_node(pos, "pizzaria:pizza_oven_fueled") minetest.get_meta(pos):set_float("fuel_time", fuel) end return rightclick(pos, node, player, itemstack, pointed_thing) end, on_timer = start_timer, sounds = default.node_sound_stone_defaults(), }) minetest.register_craft({ output = "pizzaria:reinforced_brick", recipe = { {"default:clay_brick", "default:clay_brick", "default:clay_brick"}, {"default:clay_brick", "default:clay_brick", "default:clay_brick"}, {"default:clay_brick", "default:clay_brick", "default:clay_brick"}, } }) minetest.register_craft({ output = "pizzaria:pizza_oven", recipe = { {"pizzaria:reinforced_brick", "jelys_pizzaria:reinforced_brick", "jelys_pizzaria:reinforced_brick"}, {"pizzaria:reinforced_brick", "", "jelys_pizzaria:reinforced_brick"}, {"pizzaria:reinforced_brick", "jelys_pizzaria:reinforced_brick", "jelys_pizzaria:reinforced_brick"}, } })