From dd9b33db6743812f33bcfe97910d9a110fb0b4f9 Mon Sep 17 00:00:00 2001
From: darkrose <lisa@ltmnet.com>
Date: Sun, 3 Jun 2012 00:27:48 +1000
Subject: [PATCH] Use new node metadata API for chests and furnaces; use
 cisoun's textures

---
 mods/default/init.lua                         | 299 +++++++++++++++++-
 .../textures/default_furnace_bottom.png       | Bin 0 -> 731 bytes
 .../textures/default_furnace_front.png        | Bin 246 -> 651 bytes
 .../textures/default_furnace_front_active.png | Bin 0 -> 826 bytes
 .../default/textures/default_furnace_side.png | Bin 236 -> 731 bytes
 mods/default/textures/default_furnace_top.png | Bin 0 -> 731 bytes
 6 files changed, 292 insertions(+), 7 deletions(-)
 create mode 100644 mods/default/textures/default_furnace_bottom.png
 create mode 100644 mods/default/textures/default_furnace_front_active.png
 create mode 100644 mods/default/textures/default_furnace_top.png

diff --git a/mods/default/init.lua b/mods/default/init.lua
index 3d7dd310..ff82e3af 100644
--- a/mods/default/init.lua
+++ b/mods/default/init.lua
@@ -1122,9 +1122,24 @@ minetest.register_node("default:sign_wall", {
 		--wall_bottom = <default>
 		--wall_side = <default>
 	},
-	groups = {choppy=2,dig_immediate=2,flammable=2},
+	groups = {choppy=2,dig_immediate=2},
 	legacy_wallmounted = true,
 	sounds = default.node_sound_defaults(),
+	on_construct = function(pos)
+		--local n = minetest.env:get_node(pos)
+		local meta = minetest.env:get_meta(pos)
+		meta:set_string("formspec", "hack:sign_text_input")
+		meta:set_string("infotext", "\"\"")
+	end,
+	on_receive_fields = function(pos, formname, fields, sender)
+		--print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
+		local meta = minetest.env:get_meta(pos)
+		fields.text = fields.text or ""
+		print((sender:get_player_name() or "").." wrote \""..fields.text..
+				"\" to sign at "..minetest.pos_to_string(pos))
+		meta:set_string("text", fields.text)
+		meta:set_string("infotext", '"'..fields.text..'"')
+	end,
 })
 
 minetest.register_node("default:chest", {
@@ -1132,32 +1147,302 @@ minetest.register_node("default:chest", {
 	tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
 		"default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
 	paramtype2 = "facedir",
-	metadata_name = "chest",
-	groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2},
+	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
 	legacy_facedir_simple = true,
 	sounds = default.node_sound_wood_defaults(),
+	on_construct = function(pos)
+		local meta = minetest.env:get_meta(pos)
+		meta:set_string("formspec",
+				"invsize[8,9;]"..
+				"list[current_name;main;0,0;8,4;]"..
+				"list[current_player;main;0,5;8,4;]")
+		meta:set_string("infotext", "Chest")
+		local inv = meta:get_inventory()
+		inv:set_size("main", 8*4)
+	end,
+	can_dig = function(pos,player)
+		local meta = minetest.env:get_meta(pos);
+		local inv = meta:get_inventory()
+		return inv:is_empty("main")
+	end,
+    on_metadata_inventory_move = function(pos, from_list, from_index,
+			to_list, to_index, count, player)
+		minetest.log("action", player:get_player_name()..
+				" moves stuff in chest at "..minetest.pos_to_string(pos))
+		return minetest.node_metadata_inventory_move_allow_all(
+				pos, from_list, from_index, to_list, to_index, count, player)
+	end,
+    on_metadata_inventory_offer = function(pos, listname, index, stack, player)
+		minetest.log("action", player:get_player_name()..
+				" moves stuff to chest at "..minetest.pos_to_string(pos))
+		return minetest.node_metadata_inventory_offer_allow_all(
+				pos, listname, index, stack, player)
+	end,
+    on_metadata_inventory_take = function(pos, listname, index, count, player)
+		minetest.log("action", player:get_player_name()..
+				" takes stuff from chest at "..minetest.pos_to_string(pos))
+		return minetest.node_metadata_inventory_take_allow_all(
+				pos, listname, index, count, player)
+	end,
 })
 
+local function has_locked_chest_privilege(meta, player)
+	if player:get_player_name() ~= meta:get_string("owner") then
+		return false
+	end
+	return true
+end
+
 minetest.register_node("default:chest_locked", {
 	description = "Locked Chest",
 	tile_images = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
 		"default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"},
 	paramtype2 = "facedir",
-	metadata_name = "locked_chest",
-	groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2},
+	groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
 	legacy_facedir_simple = true,
 	sounds = default.node_sound_wood_defaults(),
+	after_place_node = function(pos, placer)
+		local meta = minetest.env:get_meta(pos)
+		meta:set_string("owner", placer:get_player_name() or "")
+		meta:set_string("infotext", "Locked Chest (owned by "..
+				meta:get_string("owner")..")")
+	end,
+	on_construct = function(pos)
+		local meta = minetest.env:get_meta(pos)
+		meta:set_string("formspec",
+				"invsize[8,9;]"..
+				"list[current_name;main;0,0;8,4;]"..
+				"list[current_player;main;0,5;8,4;]")
+		meta:set_string("infotext", "Locked Chest")
+		meta:set_string("owner", "")
+		local inv = meta:get_inventory()
+		inv:set_size("main", 8*4)
+	end,
+	can_dig = function(pos,player)
+		local meta = minetest.env:get_meta(pos);
+		local inv = meta:get_inventory()
+		return inv:is_empty("main")
+	end,
+    on_metadata_inventory_move = function(pos, from_list, from_index,
+			to_list, to_index, count, player)
+		local meta = minetest.env:get_meta(pos)
+		if not has_locked_chest_privilege(meta, player) then
+			minetest.log("action", player:get_player_name()..
+					" tried to access a locked chest belonging to "..
+					meta:get_string("owner").." at "..
+					minetest.pos_to_string(pos))
+			return
+		end
+		minetest.log("action", player:get_player_name()..
+				" moves stuff in locked chest at "..minetest.pos_to_string(pos))
+		return minetest.node_metadata_inventory_move_allow_all(
+				pos, from_list, from_index, to_list, to_index, count, player)
+	end,
+    on_metadata_inventory_offer = function(pos, listname, index, stack, player)
+		local meta = minetest.env:get_meta(pos)
+		if not has_locked_chest_privilege(meta, player) then
+			minetest.log("action", player:get_player_name()..
+					" tried to access a locked chest belonging to "..
+					meta:get_string("owner").." at "..
+					minetest.pos_to_string(pos))
+			return stack
+		end
+		minetest.log("action", player:get_player_name()..
+				" moves stuff to locked chest at "..minetest.pos_to_string(pos))
+		return minetest.node_metadata_inventory_offer_allow_all(
+				pos, listname, index, stack, player)
+	end,
+    on_metadata_inventory_take = function(pos, listname, index, count, player)
+		local meta = minetest.env:get_meta(pos)
+		if not has_locked_chest_privilege(meta, player) then
+			minetest.log("action", player:get_player_name()..
+					" tried to access a locked chest belonging to "..
+					meta:get_string("owner").." at "..
+					minetest.pos_to_string(pos))
+			return
+		end
+		minetest.log("action", player:get_player_name()..
+				" takes stuff from locked chest at "..minetest.pos_to_string(pos))
+		return minetest.node_metadata_inventory_take_allow_all(
+				pos, listname, index, count, player)
+	end,
 })
 
 minetest.register_node("default:furnace", {
 	description = "Furnace",
-	tile_images = {"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
+	tile_images = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png",
 		"default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
 	paramtype2 = "facedir",
-	metadata_name = "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,
+	can_dig = function(pos,player)
+		local meta = minetest.env:get_meta(pos);
+		local inv = meta:get_inventory()
+		if not inv:is_empty("fuel") then
+			return false
+		elseif not inv:is_empty("dst") then
+			return false
+		elseif not inv:is_empty("src") then
+			return false
+		end
+		return true
+	end,
+})
+
+minetest.register_node("default:furnace_active", {
+	description = "Furnace",
+	tile_images = {"default_furnace_top.png", "default_furnace_bottom.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,
+	can_dig = function(pos,player)
+		local meta = minetest.env:get_meta(pos);
+		local inv = meta:get_inventory()
+		if not inv:is_empty("fuel") then
+			return false
+		elseif not inv:is_empty("dst") then
+			return false
+		elseif not inv:is_empty("src") then
+			return false
+		end
+		return true
+	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") >= cooked.time 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", {
diff --git a/mods/default/textures/default_furnace_bottom.png b/mods/default/textures/default_furnace_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..c86782a2147130bb2b12644fb767e33ad5f4b1de
GIT binary patch
literal 731
zcmV<10wn#3P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007_Nkl<ZILkeg
zO^X~=7=@qvSzXmVGm9}Bvj|zJ5J(^ql_U@i2>vTw>QaA;8<*}~=t3f>5qc&B=A);&
zYPzOw-MaU^E_#^7yL&lso^y`+@%wMfVzD5LV2wd3#jx7}kh5Tn##jeMh;b(8L|xYa
zhzR!W$vJaMc<<2KFvp09FwZm3o_x%2zyHN@xr9=%-ZO=OwH5&9J$Bo5IOm8l(liab
zVIZf(YPF)>Tv1gOec$7}N5&CKL1~Tmo-BecrI2$5V7J?0twm|g#pNZ-)smDmi@Iix
zk)y*E1+dm4B3x}Y*bo8$);a2G!P(gvRaNoj^Jo0|_nH@<J?7_Menly@x0q(OZF^@y
z{q)0krLJp4g#LO*T`vHLF>>$t15Qp)S*@0P0b__^B7{J*Z1xP^o%fW|(e*t>Yn-)|
zQdrbAZ~i&u@h1=X@7)E)SmHEctU+r-IPdV@VTWPh`uchgB_%=#%=3)Dx#8&O2xBdh
zg}!fZqs<s&07xnA1+><P2&EMCE#bCpY1@{E_mA0JwRrCshT#r4fKm!;j6p<DN|91x
z97jZi*DpV%X_f$d_2Mbp?H21CMasTh#?mx3w(om#&ZLwu#$c`G>sO!i@5wo(wB#&o
zw_6TYtGmL*I8)a(&N=KCPaomELn)2Y3hx|BDO3^GC#QST#xTW5yglzdAq2*8#IE0O
z0Pt0Xi16_KF;!Ku*<7HsX4vgGJUpc9dx{8ERWVHyeb?=`5T=Pz3S$W5oLOtlgAecV
z<k3fWP@VV0+du0ZX`abx57XwHQA!~q9IOto#<IKaSiip{Wud7X!W1Z_5M#tS2f$*n
zAjXKj8AmGT>H3bV+lqek`Z<5Rc}ppU;pXNpwm3~V=MWLLZHx7u{{cAUfRWPZZyo>u
N002ovPDHLkV1f`gW61yj

literal 0
HcmV?d00001

diff --git a/mods/default/textures/default_furnace_front.png b/mods/default/textures/default_furnace_front.png
index 1620a27c33f54a34d92789d9757050b0cd5a4235..8f01e993c1f6b6563eb7da52e250e0e7caee0a44 100644
GIT binary patch
delta 637
zcmV-@0)qYa0gDBY8Gi-<001BJ|6u?C00DDSM?wIu&K&6g000JJOGiWi{{a60|De66
zlK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX1_KZdCS-Ldxc~qH3rR#lR5;6(
zkxfffVHk$5=RNP4bZTf5Vi75oW~q@-6y&NO5Cl;W5kXLkB7bPpM%uK9AShb3>u<Q|
zgI1!^huOzyQ)7Wm9&MbNGjrzHne)DHi=vf+b1k36_1rhNT)lGH4G;9vnawiu@hjp9
zQKLbBZ#T2W5=tqw){G49Vd`}rV+@_yEPcJ*%oR(hW*js9sYn=Bsnu$fgMc`ylP0U+
z43+XSQ5Yi5V1KYAX+mF5H-+y3En`q=nvx`|6u$jr^ynbXMo6=|LRMR5KTK0zD$%T$
zS^2d{RI6}gXfIzD7HK63T5II|*)z`bJ$z5-(2B$RwsZ03J=Ws!{V`@fmuR*e0Aa0;
zoIZ8ZDJ&gYQLU62e=$WXO<9lYm(H;el(8uMOa^&)_kWhlb^2(#%7q(u*a-K=u94ZC
z!^?D_OG{OJ*CJoYvr#7By=TX+enb>Hjv^wH&@M^b#3ATlIY5cU^K@GRV-l<r^oipm
zc*-#TY@#heZc7#?9=b690}<DDg(zxZokEwZAtKVYVD#7s)(SfQ-9oLAKtynE{bUob
z@>mD*=yt(vC*pYW^!Wz<%0ICsx3vrFK)-xj!1o;6x^|*Hh1SCGKo5oD9M%ffI*fH3
z8rsj~n|YM-aH#)x-Hc;4`5Ees3Zg&(2M_F~6vQ~^@buq#ja5`CD=6(_j3sS3bSA?e
XRPOsmrfZG+00000NkvXXu0mjf=bIvr

delta 229
zcmV<B02=>`1@-}u8Gix*005AYXf^-<00VPENmK|32;1RL-~a#s32;bRa{vGi!~g&e
z!~vBn4jTXf0GUZdK~yM_m6Fj71R)4S?+hJGLJzh@Pu8X%R)C?0`*353ySg4<W_ZYC
z^qW%p{8Q9gn<O(EX8`lSXshb|J})ve0P>Am>&l6Ulv2zrj9#T1+S?1>@oQa{0H~^n
zoXijaGh^n~+A1HfhZD$mX+SyWiFgc}JpCFgfH0)fSohG<QeV19dkoh=jM4wX$Jgu+
fK=*J~)kFIMm33R9{$b~i00000NkvXXu0mjfd*EPE

diff --git a/mods/default/textures/default_furnace_front_active.png b/mods/default/textures/default_furnace_front_active.png
new file mode 100644
index 0000000000000000000000000000000000000000..10ffd1fa2973e0570fff53369687e45d17246d55
GIT binary patch
literal 826
zcmV-A1I7G_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00094Nkl<ZILmF0
zO=uit0EVA$=9}G}&98sWiq@<#twIxZ@h5^UXoQN0UbIS}l;EKT?4=%RAb1ffLh$co
zE-88t4|*$#hf*&!U^PuCrZz^`)~1{6rn}jl+4<R-Z|3u`STDZUhxg$TZ@qa`k3Uqz
z&gZ$b`X|B^c<nZOiv_NfD;S1>l#<fE2l#3EH<Bd5&ga=vEU;FtVE946#mi+Jr%9{T
zqF${McrGdmK_~3gxA7bYp%W5PA{DV`xWM|gDshrvD5Z#^koBvZ?4Q_&-*)hu4e~PO
z%C8rx*DCmKoyN^Ayw(m+jE(Zg#ujlDA*Dnde*HCVS|*k$7|cq>Mu(U_G0*?))JJn%
z`n`f5YXF><ixEa4f#(u=E^*Le`ouh6ya<ag{CE8J75H!x-gx^YY24vvb(31PN|GwX
zrysnl`)muDh8#KmKC@3jp%+{qoCL)EQ1IY~RXAPl3g_pJk?HBf%;b=jS`$mhT=-=P
zfMbur@iSl<@a43CX9hVm+vapRzEyPY`~`LwM=>%sGVnZ_UY!Bk0APF(8Z!_Vfc-X%
z&GGfrDR|^E;*+jG>X1bFL@LFoZdZvq9+p(-S!kSvZ+x&G9fk)FLG28<o18ocdKUB&
zNHfOJF-k=klTVj;?!Y*itbmt+(gLp@1V-)zvj~l4IC_}5gTO$SXDv-GC+Y9+MXvvK
zgPau-#tKRcurk9}t1xx<GPu`a?>q4KB0LW~+2ulx6GkB&WgzQKhuiuDR@R1<87M6<
zmCQi?9w@v7*}EXsAi2f!J)bjqU;@`SkwGVhRG|&KTk!7&9)_M_NMo=DAq5`q@{Y3j
z@#i(#A&AdDeotFg!gt@FB`Z7h_Xv7(2`cW8YKbW!V+x$MB8*HFSsYKWYv^7g1@ipL
zI+m%~HME;MZnrUX%zcGk${X7VA;{Z#f{xF#6C*4wuOUR1ekGAI2cbgxK|t2Z;I?<D
z)psy};_wI?Ti4NAW6B7Ckz$UmT7+q7luA)?3z^CA4-F|^=`538SpWb407*qoM6N<$
Ef+T~1_y7O^

literal 0
HcmV?d00001

diff --git a/mods/default/textures/default_furnace_side.png b/mods/default/textures/default_furnace_side.png
index 63cb162fe5315f3b8c921c9e09be95c1a0ac573e..c86782a2147130bb2b12644fb767e33ad5f4b1de 100644
GIT binary patch
delta 708
zcmV;#0z3We0ow(TBYy&-Nkl<ZILkegO^X~=7=@qvSzXmVGm9}Bvj|zJ5J(^ql_U@i
z2>vTw>QaA;8<*}~=t3f>5qc&B=A);&YPzOw-MaU^E_#^7yL&lso^y`+@%wMfVzD5L
zV2wd3#jx7}kh5Tn##jeMh;b(8L|xYahzR!W$vJaMc<<2KFn`C0h%nDH&z^kDZ@>S=
za=C<3u--F;fVCC?=RJ1YbvWmUG14>*yI~-w#A>yo-CR*s6@B01yhp|nN<nFj_ns_*
zE~Suj24J__VXZ}J&Bf&<%hi&UGmE-rj*+9o6$P-?A|hOEHrNmX0M<F`YQfpr8C6yB
z<@0C!`S+R^pMO2(=U;wBDYdtlX0~m6XF>h+!*`{wYea<pdPiL^0EjVi@Av~wPET2_
zmU{tXh+!gxK(lQ24Bnmhl+w}lJw|JswUkm=)HQGZIpy&u5BTrh1;$w7G-0ekYeP8i
z@ZMpEVc`1udJiQfLI}+BjK8_z=;#PzEs}-4Z*QZ`7=L2`NGa_FwAP3Sr4;ln;kIpQ
z+m?s-kJ((cc<&g7;SM-}QVMH~K}1kWky2tDM?{3zFF&PemH>S9;wjth7V8{E%D!C2
z(lj-;?|X92q?9nmV6ElrSD*9m$vLI8<ScBrTMkyMyTZjdQ`a@lIqVltAK|@2DUH$!
z?;J`gRDTiHC#QST#xTW5yglzdAq2*8#IE0O0Pt0Xi16_KF;!Ku*<7HsX4vgGJUpc9
zdx{8ERWVHyeb?=`5T=Pz3S$W5oLOtlgAecV<k3fWP@VV0+du0ZX`abx57XwHQA!~q
z9IOto#<IKaSiip{Wud7X!W1Z_5M#tS2f$*nAU(#2y%|R;=jr;6tJ{ix^ZGe|ym?D0
qh2iGrF19#LIOh-%wrz{`p8o+j<baXV=x-hX0000<MNUMnLSTZ%t7C)!

delta 209
zcmV;?051RA1?&NkBYyw{b3#c}2nYxWd<bNS00009a7bBm000ie000ie0hKEb8vp<R
zj!8s8R5*=|Q_B^AAPlQK2FR$4o(=S%^<hbixd4{L^usa6IPC!d-x^8VeK#}f7C`bt
zP^3BD)Wul@z#{l@pn@(`5v79+F@^cuV=yCS@m~%qyj`eTl}dF5!0JF*uhQwe;i<?Z
z?-Z0}p9SA%LTy*=3bF<}LWJyspJPqbKrN3c`)gW*S<Tn@7OFa3P{&~Zh@pBh00000
LNkvXXu0mjf{$*8X

diff --git a/mods/default/textures/default_furnace_top.png b/mods/default/textures/default_furnace_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..c86782a2147130bb2b12644fb767e33ad5f4b1de
GIT binary patch
literal 731
zcmV<10wn#3P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007_Nkl<ZILkeg
zO^X~=7=@qvSzXmVGm9}Bvj|zJ5J(^ql_U@i2>vTw>QaA;8<*}~=t3f>5qc&B=A);&
zYPzOw-MaU^E_#^7yL&lso^y`+@%wMfVzD5LV2wd3#jx7}kh5Tn##jeMh;b(8L|xYa
zhzR!W$vJaMc<<2KFvp09FwZm3o_x%2zyHN@xr9=%-ZO=OwH5&9J$Bo5IOm8l(liab
zVIZf(YPF)>Tv1gOec$7}N5&CKL1~Tmo-BecrI2$5V7J?0twm|g#pNZ-)smDmi@Iix
zk)y*E1+dm4B3x}Y*bo8$);a2G!P(gvRaNoj^Jo0|_nH@<J?7_Menly@x0q(OZF^@y
z{q)0krLJp4g#LO*T`vHLF>>$t15Qp)S*@0P0b__^B7{J*Z1xP^o%fW|(e*t>Yn-)|
zQdrbAZ~i&u@h1=X@7)E)SmHEctU+r-IPdV@VTWPh`uchgB_%=#%=3)Dx#8&O2xBdh
zg}!fZqs<s&07xnA1+><P2&EMCE#bCpY1@{E_mA0JwRrCshT#r4fKm!;j6p<DN|91x
z97jZi*DpV%X_f$d_2Mbp?H21CMasTh#?mx3w(om#&ZLwu#$c`G>sO!i@5wo(wB#&o
zw_6TYtGmL*I8)a(&N=KCPaomELn)2Y3hx|BDO3^GC#QST#xTW5yglzdAq2*8#IE0O
z0Pt0Xi16_KF;!Ku*<7HsX4vgGJUpc9dx{8ERWVHyeb?=`5T=Pz3S$W5oLOtlgAecV
z<k3fWP@VV0+du0ZX`abx57XwHQA!~q9IOto#<IKaSiip{Wud7X!W1Z_5M#tS2f$*n
zAjXKj8AmGT>H3bV+lqek`Z<5Rc}ppU;pXNpwm3~V=MWLLZHx7u{{cAUfRWPZZyo>u
N002ovPDHLkV1f`gW61yj

literal 0
HcmV?d00001

-- 
GitLab