Lua implementation of furnace with visible active state
authordarkrose <lisa@ltmnet.com>
Sat, 2 Jun 2012 10:26:20 +0000 (20:26 +1000)
committerPerttu Ahola <celeron55@gmail.com>
Sun, 3 Jun 2012 19:31:01 +0000 (22:31 +0300)
games/minimal/mods/default/init.lua
games/minimal/mods/default/textures/default_furnace_front_active.png [new file with mode: 0644]

index 3d68e71e946ebe3f9e97d749bdeb974ed148a69e..12d4eb37bd7d1e58bf875300957574ae7fe09b8a 100644 (file)
@@ -1269,6 +1269,135 @@ minetest.register_node("default:furnace", {
        end,
 })
 
+minetest.register_node("default:furnace_active", {
+       description = "Furnace",
+       tile_images = {"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
+               "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"},
+       paramtype2 = "facedir",
+       light_source = 8,
+       drop = "default:furnace",
+       groups = {cracky=2},
+       legacy_facedir_simple = true,
+       sounds = default.node_sound_stone_defaults(),
+       on_construct = function(pos)
+               local meta = minetest.env:get_meta(pos)
+               meta:set_string("formspec",
+                       "invsize[8,9;]"..
+                       "list[current_name;fuel;2,3;1,1;]"..
+                       "list[current_name;src;2,1;1,1;]"..
+                       "list[current_name;dst;5,1;2,2;]"..
+                       "list[current_player;main;0,5;8,4;]")
+               meta:set_string("infotext", "Furnace");
+               local inv = meta:get_inventory()
+               inv:set_size("fuel", 1)
+               inv:set_size("src", 1)
+               inv:set_size("dst", 4)
+       end,
+})
+
+function hacky_swap_node(pos,name)
+       local node = minetest.env:get_node(pos)
+       local meta = minetest.env:get_meta(pos)
+       local meta0 = meta:to_table()
+       if node.name == name then
+               return
+       end
+       node.name = name
+       local meta0 = meta:to_table()
+       minetest.env:set_node(pos,node)
+       meta = minetest.env:get_meta(pos)
+       meta:from_table(meta0)
+end
+
+minetest.register_abm({
+       nodenames = {"default:furnace","default:furnace_active"},
+       interval = 1.0,
+       chance = 1,
+       action = function(pos, node, active_object_count, active_object_count_wider)
+               local meta = minetest.env:get_meta(pos)
+               for i, name in ipairs({
+                               "fuel_totaltime",
+                               "fuel_time",
+                               "src_totaltime",
+                               "src_time"
+               }) do
+                       if meta:get_string(name) == "" then
+                               meta:set_float(name, 0.0)
+                       end
+               end
+
+               local inv = meta:get_inventory()
+
+               local srclist = inv:get_list("src")
+               local cooked = nil
+               
+               if srclist then
+                       cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
+               end
+               
+               local was_active = false
+               
+               if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
+                       was_active = true
+                       meta:set_float("fuel_time", meta:get_float("fuel_time") + 1)
+                       meta:set_float("src_time", meta:get_float("src_time") + 1)
+                       if cooked and cooked.item and meta:get_float("src_time") >= 3 then
+                               -- check if there's room for output in "dst" list
+                               if inv:room_for_item("dst",cooked.item) then
+                                       -- Put result in "dst" list
+                                       inv:add_item("dst", cooked.item)
+                                       -- take stuff from "src" list
+                                       srcstack = inv:get_stack("src", 1)
+                                       srcstack:take_item()
+                                       inv:set_stack("src", 1, srcstack)
+                               else
+                                       print("Could not insert '"..cooked.item.."'")
+                               end
+                               meta:set_string("src_time", 0)
+                       end
+               end
+               
+               if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
+                       meta:set_string("infotext","Furnace active: "..(meta:get_float("fuel_time")/meta:get_float("fuel_totaltime")*100).."%")
+                       hacky_swap_node(pos,"default:furnace_active")
+                       return
+               end
+
+               local fuel = nil
+               local cooked = nil
+               local fuellist = inv:get_list("fuel")
+               local srclist = inv:get_list("src")
+               
+               if srclist then
+                       cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
+               end
+               if fuellist then
+                       fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
+               end
+
+               if fuel.time <= 0 then
+                       meta:set_string("infotext","Furnace out of fuel")
+                       hacky_swap_node(pos,"default:furnace")
+                       return
+               end
+
+               if cooked.item:is_empty() then
+                       if was_active then
+                               meta:set_string("infotext","Furnace is empty")
+                               hacky_swap_node(pos,"default:furnace")
+                       end
+                       return
+               end
+
+               meta:set_string("fuel_totaltime", fuel.time)
+               meta:set_string("fuel_time", 0)
+               
+               local stack = inv:get_stack("fuel", 1)
+               stack:take_item()
+               inv:set_stack("fuel", 1, stack)
+       end,
+})
+
 minetest.register_node("default:cobble", {
        description = "Cobble",
        tile_images = {"default_cobble.png"},
diff --git a/games/minimal/mods/default/textures/default_furnace_front_active.png b/games/minimal/mods/default/textures/default_furnace_front_active.png
new file mode 100644 (file)
index 0000000..e4d8a5b
Binary files /dev/null and b/games/minimal/mods/default/textures/default_furnace_front_active.png differ