mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-10-31 15:35:21 +01:00 
			
		
		
		
	Lua implementation of furnace with visible active state
This commit is contained in:
		| @@ -1269,6 +1269,135 @@ minetest.register_node("default:furnace", { | |||||||
| 	end, | 	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", { | minetest.register_node("default:cobble", { | ||||||
| 	description = "Cobble", | 	description = "Cobble", | ||||||
| 	tile_images = {"default_cobble.png"}, | 	tile_images = {"default_cobble.png"}, | ||||||
|   | |||||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 376 B | 
		Reference in New Issue
	
	Block a user