mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-10-31 07:25:22 +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, | ||||
| }) | ||||
|  | ||||
| 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"}, | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 376 B | 
		Reference in New Issue
	
	Block a user