summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorh-v-smacker <hans-von-smacker+github@gmail.com>2018-08-03 06:53:29 +0300
committerh-v-smacker <hans-von-smacker+github@gmail.com>2018-08-03 06:53:29 +0300
commitb3c1939f7227ec8b625b33871bf85b07ef9abc77 (patch)
treef3e51a2ee8f48161cd51506f7997a1a81886b919
parent1d77b6b30788a48ea4ae347bafa31dde7a806564 (diff)
solar cooker
-rw-r--r--technic/machines/other/init.lua2
-rw-r--r--technic/machines/other/solar_furnace.lua206
-rw-r--r--technic/machines/register/recipes.lua3
-rw-r--r--technic/textures/technic_solar_furnace_bottom.pngbin0 -> 254 bytes
-rw-r--r--technic/textures/technic_solar_furnace_side.pngbin0 -> 340 bytes
-rw-r--r--technic/textures/technic_solar_furnace_top.pngbin0 -> 729 bytes
6 files changed, 211 insertions, 0 deletions
diff --git a/technic/machines/other/init.lua b/technic/machines/other/init.lua
index a67d1a1..a7e90d3 100644
--- a/technic/machines/other/init.lua
+++ b/technic/machines/other/init.lua
@@ -16,5 +16,7 @@ end
-- Coal-powered machines
dofile(path.."/coal_alloy_furnace.lua")
dofile(path.."/coal_furnace.lua")
+dofile(path.."/solar_furnace.lua")
+
dofile(path.."/anchor.lua")
diff --git a/technic/machines/other/solar_furnace.lua b/technic/machines/other/solar_furnace.lua
new file mode 100644
index 0000000..dba4789
--- /dev/null
+++ b/technic/machines/other/solar_furnace.lua
@@ -0,0 +1,206 @@
+
+-- A solar furnace is an auxiliary device which allows to use cooking recipes
+-- without fuel. The downside is half the speed of a fuel-consuming furnace
+-- and the need to be exposed to maximal direct sunlight at all times (L = 15).
+
+
+local S = technic.getter
+
+minetest.register_craft({
+ output = 'technic:solar_furnace',
+ recipe = {
+ {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
+ {'technic:composite_plate', 'default:furnace', 'technic:composite_plate'},
+ {'technic:cast_iron_ingot', 'technic:cast_iron_ingot', 'technic:cast_iron_ingot'},
+ }
+})
+
+local machine_name = S("Solar Furnace")
+local formspec =
+ "size[8,9]"..
+ "label[0,0;"..machine_name.."]"..
+ "image[2,2;1,1;technic_power_meter_bg.png]"..
+ "list[current_name;src;2,1;1,1;]"..
+ "list[current_name;dst;5,1;2,2;]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "listring[current_name;dst]"..
+ "listring[current_player;main]"..
+ "listring[current_name;src]"..
+ "listring[current_player;main]"
+
+minetest.register_node("technic:solar_furnace", {
+ description = machine_name,
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -1/2, -5/16, 5/16, 3/16, 5/16},
+ {-1/2, 3/16, -1/2, 1/2, 1/2, 1/2},
+ {-2/16, 1/2, -2/16, 2/16, 17/32, 2/16},
+ },
+ },
+ tiles = {"technic_solar_furnace_top.png", "technic_solar_furnace_bottom.png",
+ "technic_solar_furnace_side.png", "technic_solar_furnace_side.png",
+ "technic_solar_furnace_side.png", "technic_solar_furnace_side.png"},
+ paramtype2 = "facedir",
+ groups = {cracky=2},
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_stone_defaults(),
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec", formspec)
+ meta:set_string("infotext", machine_name)
+ local inv = meta:get_inventory()
+ inv:set_size("src", 1)
+ inv:set_size("dst", 4)
+ meta:set_int("elapsed", 0)
+ meta:set_int("cook_time", 0)
+ end,
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+})
+
+minetest.register_node("technic:solar_furnace_active", {
+ description = machine_name,
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -1/2, -5/16, 5/16, 3/16, 5/16},
+ {-1/2, 3/16, -1/2, 1/2, 1/2, 1/2},
+ {-2/16, 1/2, -2/16, 2/16, 17/32, 2/16},
+ },
+ },
+ tiles = {"technic_solar_furnace_top.png", "technic_solar_furnace_bottom.png",
+ "technic_solar_furnace_side.png", "technic_solar_furnace_side.png",
+ "technic_solar_furnace_side.png", "technic_solar_furnace_side.png"},
+ paramtype2 = "facedir",
+ light_source = 14,
+ drop = "technic:solar_furnace",
+ groups = {cracky=2, not_in_creative_inventory=1},
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_stone_defaults(),
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+})
+
+minetest.register_abm({
+ label = "Machines: run solar furnace",
+ nodenames = {"technic:solar_furnace", "technic:solar_furnace_active"},
+ interval = 1,
+ chance = 1,
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+
+ local recipe = nil
+
+ if not meta:get_int("elapsed") then
+ meta:set_int("elapsed", 0)
+ end
+
+ if not meta:get_int("cook_time") then
+ meta:set_int("cook_time", 0)
+ end
+
+ local light_pos = {x = pos.x, y = pos.y + 1, z = pos.z}
+
+ local powered = false
+
+ local node = minetest.get_node_or_nil(light_pos)
+
+ if minetest.get_node_light(light_pos) == 15 and node.name == "air" then
+ powered = true
+ end
+
+ local result = technic.get_recipe("cooking", inv:get_list("src"))
+ if result and result.time then
+ meta:set_int("cook_time", result.time * 2)
+ end
+
+
+
+ if powered then
+
+ if result then
+
+ if meta:get_int("elapsed") >= meta:get_int("cook_time") then
+
+ local percent = 100
+ meta:set_string("infotext", S("%s is active"):format(machine_name).." ("..percent.."%)")
+ meta:set_string("formspec",
+ "size[8,9]"..
+ "label[0,0;"..machine_name.."]"..
+ "image[2,2;1,1;technic_power_meter_bg.png^[lowpart:" .. percent .. ":technic_power_meter_fg.png]"..
+ "list[current_name;src;2,1;1,1;]"..
+ "list[current_name;dst;5,1;2,2;]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "listring[current_name;dst]"..
+ "listring[current_player;main]"..
+ "listring[current_name;src]"..
+ "listring[current_player;main]")
+
+ local result_stack = ItemStack(result.output)
+ if inv:room_for_item("dst", result_stack) then
+ inv:set_list("src", result.new_input)
+ inv:add_item("dst", result_stack)
+ end
+
+ meta:set_int("elapsed", 0)
+
+ local recipe = technic.get_recipe("cooking", inv:get_list("src"))
+
+ if not recipe then
+ meta:set_string("infotext", S("%s is empty"):format(machine_name))
+ technic.swap_node(pos, "technic:solar_furnace")
+ meta:set_string("formspec", formspec)
+ end
+
+ else
+
+ local percent = math.floor(meta:get_int("elapsed") / meta:get_int("cook_time") * 100)
+ if percent > 100 then
+ percent = 100
+ end
+ meta:set_string("infotext", S("%s is active"):format(machine_name).." ("..percent.."%)")
+ technic.swap_node(pos, "technic:solar_furnace_active")
+ meta:set_string("formspec",
+ "size[8,9]"..
+ "label[0,0;"..machine_name.."]"..
+ "image[2,2;1,1;technic_power_meter_bg.png^[lowpart:" .. percent .. ":technic_power_meter_fg.png]"..
+ "list[current_name;src;2,1;1,1;]"..
+ "list[current_name;dst;5,1;2,2;]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "listring[current_name;dst]"..
+ "listring[current_player;main]"..
+ "listring[current_name;src]"..
+ "listring[current_player;main]")
+ return
+
+ meta:set_int("elapsed", meta:get_int("elapsed") + 1)
+ end
+ else
+ meta:set_int("elapsed", 0)
+
+ meta:set_string("infotext", S("%s is empty"):format(machine_name))
+ technic.swap_node(pos, "technic:solar_furnace")
+ meta:set_string("formspec", formspec)
+ end
+
+ else
+
+ meta:set_int("elapsed", 0)
+
+ meta:set_string("infotext", S("%s cannot function\nMust be in full direct sunlight"):format(machine_name))
+ technic.swap_node(pos, "technic:solar_furnace")
+ meta:set_string("formspec", formspec)
+ end
+
+
+ end,
+})
+
diff --git a/technic/machines/register/recipes.lua b/technic/machines/register/recipes.lua
index d30fd4f..bef678a 100644
--- a/technic/machines/register/recipes.lua
+++ b/technic/machines/register/recipes.lua
@@ -67,6 +67,9 @@ end
function technic.get_recipe(typename, items)
if typename == "cooking" then -- Already builtin in Minetest, so use that
+ if not items then
+ return nil
+ end
local result, new_input = minetest.get_craft_result({
method = "cooking",
width = 1,
diff --git a/technic/textures/technic_solar_furnace_bottom.png b/technic/textures/technic_solar_furnace_bottom.png
new file mode 100644
index 0000000..bfefccb
--- /dev/null
+++ b/technic/textures/technic_solar_furnace_bottom.png
Binary files differ
diff --git a/technic/textures/technic_solar_furnace_side.png b/technic/textures/technic_solar_furnace_side.png
new file mode 100644
index 0000000..8c7128f
--- /dev/null
+++ b/technic/textures/technic_solar_furnace_side.png
Binary files differ
diff --git a/technic/textures/technic_solar_furnace_top.png b/technic/textures/technic_solar_furnace_top.png
new file mode 100644
index 0000000..6f17029
--- /dev/null
+++ b/technic/textures/technic_solar_furnace_top.png
Binary files differ