From 20c84b98f864515763c94323b08199bdf1eb057c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 21 Feb 2017 01:41:13 +0100 Subject: [PATCH] Complete refresh of furnace mod - Take code from Minetest Game 0.4.15 - The progress arrow now works - Less bugs --- .../textures/crafting_inventory_furnace.png | Bin 22154 -> 0 bytes .../crafting_inventory_furnace_on.png | Bin 22141 -> 0 bytes mods/ITEMS/mcl_furnaces/README.md | 12 + mods/ITEMS/mcl_furnaces/init.lua | 436 ++++++++++-------- .../textures/default_furnace_bg.png | Bin 1189 -> 0 bytes .../textures/gui_furnace_arrow_bg.png | Bin 0 -> 370 bytes .../textures/gui_furnace_arrow_fg.png | Bin 0 -> 341 bytes .../textures/mcl_furnaces_formspec.png | Bin 0 -> 2718 bytes 8 files changed, 247 insertions(+), 201 deletions(-) delete mode 100644 mods/ITEMS/mcl_core/textures/crafting_inventory_furnace.png delete mode 100644 mods/ITEMS/mcl_core/textures/crafting_inventory_furnace_on.png create mode 100644 mods/ITEMS/mcl_furnaces/README.md delete mode 100644 mods/ITEMS/mcl_furnaces/textures/default_furnace_bg.png create mode 100644 mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_bg.png create mode 100644 mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_fg.png create mode 100644 mods/ITEMS/mcl_furnaces/textures/mcl_furnaces_formspec.png diff --git a/mods/ITEMS/mcl_core/textures/crafting_inventory_furnace.png b/mods/ITEMS/mcl_core/textures/crafting_inventory_furnace.png deleted file mode 100644 index e80c3c9b69deda77aa95d9b347f82fe4f876286b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22154 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 diff --git a/mods/ITEMS/mcl_core/textures/crafting_inventory_furnace_on.png b/mods/ITEMS/mcl_core/textures/crafting_inventory_furnace_on.png deleted file mode 100644 index 80d3e26f4e95ed2f6736d7bbbbc9089bd3c3c2fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22141 zcmeAS@N?(olHy`uVBq!ia0y~yVD@8RU>4wDV_;wqP%#BjEa{HEjtmSN`?>!lvNA9* za29w(7Bet#3xF`=TIIc^3=9ksC9V-A!TD(=<%vb93~dIoxyImUH< z3=E;aJzX3_D&pS$b=;KFIc-X$@s?M6BQLZ`UP+15Ry&gL;`;yRtAmVoWUTsGw)sQ# zq2iS%gd7d5)s^f|vzI$7|3CfzZ~fov^*{f=|If(4@L>NR`<;{jUEllV`QnpjK;Vu2 z?^h3>WEdHP!0+!*-F}(>zx^;J4GjLj|9AZV5BdL}u08x>|Nr^_KmY%QgC)}T-~U%* z@%LnXjm1+&28M?JI{$9h|IYs}-7d_)a6sI?#$szbBLl-f;{ppt28KNk3YZueDh@tm zVPN>sbeNNY;Q=dHAvd2o14Dzjj2{C7gTBQa1_p*W>T9U0{{MIX|L^@-|9Kb~>hk&2 z>#E=WsC56G&cN`Yy4d35?d;>{t#8>gGc??veYo>}oORv3i~l4U82;Ro@%!^l#*Tqu z&*_Ip^3OkHVK}fGEaZnFv`@}&{g!f_`mdj_pWpxM*WdNGjK$y1^{zgC>E6aI4#8X!Wy2dy6yQN8GZW_N{N}-efS7p<%y# zyYT+K-;TezbZ_IItLNkG|G#?ueSg;Zm@VacP$OZcvon17{>D6D5 z&a0n6Ti(F)z3lX?(@tH z=N}Y2+WtNK|HEJJe#hJX|N43TzPkUb!|&IB{i*%l?*FOP-$6RV&x6SF`Roky4n91R z|9<_y!(Z=y-(U6b>ht$i-~V2JzQ6AOtE<2F)%{zy{(XHoD2~rRM=|)-=kmS3|GoYk zzrX(LtJ-+``s>%f?_d4bn4#f0C@sKUT>tgw?t8WWzy4f*e}C22ee37%fBpLR{j2{Z z84i55ob%%?JSg`6`V;$p-~V5KuD_4pTXp~X`TJkL{(TQhY!7}y!#D;U#__fP)|KD? z4+&BP$;|NI5*oHYz+nqD5E7IKlAYmSF*Hm+fWs8(LP!uINIr%?&tYNt8yuDpFGGS3 zLCP@vI1diP@c$2gf1O_r4UOIJ_uKvd`aAsX-1=+tBEbo=`oeanG(0b| zV3fbw$NF#XVNQmB^JM%ExIcCH@!bBu=ftgL3#4$voqLCKg{_wy8=f$6X$TI(V z0h8UShhLJj-##dxXn*ha|MlAY-LBQiKX`62hXIs1Yxl4DYj@y$p#>v@{L_M8b&|gn3;vKu+ ze#l|}WA?9K$BTZSD=)A>#Os0kSFYPnyIsDo89567ExRRu=Kr$V@8Lx#YD0cE|GdBD z{XZ{MbF=CV{zq0n3r95=r1<XG{4X zQRFo9!TjpKgt%MQ|F}@xFyR~f8{w_>-~CY>+`h#=Vg8E0yXz+*yTNYBU&h}lZ}+$P zqc|9>c+KDIA2`W2860lj)yLxxKKz2n9`(U*`JXM_`*{5W)F{H`=Q~@{|5F&k#K#>8 zY2uT6(eF3bs8OUdv*eCxR5A3Ul)(M~_F>PzvhusAhw&|#1qYc5) zCh%zEpE~`a72x(>&ibv)4D(JuWC1nHj$gaQ$Z-DYKn@Vmeh7-zHry|>`1}3;zx)2T ztSk8Ti!(6nH*Ob}fB2n=;X(Pcf=9}K;uskIoRjgZX}QnM&~X3ec3HpppND_HKl`4Y z;lTSd50AM2_{+fXW3J_#9~}GT;o6xQ9+ZFEZaZgR-Tzg4Kc8QB|Nkq{FvtE&_dceB z$Cd1}&+ELEg$xw@dvoYU{*K@K+lGN*|Fpv|?F;_?3kMGaP5stqpA8x+`v=wV?F`7>>-WLNmR^6~ zU-i9`fuU~g{bvPP_aozM|G)Yij!dpQ|Nkmzkn1yaFD zIs1!h|E>S`FC25ci=E-Y^&*SE?BL-m#2CzgylqxM5uF|Etf}?}2-# z;va|$8sA#K2TaDy|G#?w|Erioc8m-^w#xYZKL{RyyZRY4vbFkq{a++2R-eEB_1*9L z@DR3v`WG~mQ}zG)`S_i7|HJG5uLiphG^Ta;ISmc9|M3Sr8o2uP_x0d`w*9|;$L|IC zasIcj^UJT^<77BcY%!R z|JCR9>+bId4+Q>y1scx$89u-M*7f>(q1EaP4Cfyf{5tqN9u&gyvHR=4zWco%7QyT7 z{%=|Tf6wY~ehdur9^d9${_XhVPp^KipTGap-ShQdzt%#Ayu$0gevaP{PLZ+u|F5?F zd!L`7;s4yjFK5sD|LXPcb#Z&&zka^{&nwU{Bq;suuKOQe{R@<%{#&Ezhs|w|f2i-H;*2Ppjwu|MfTgmi50k zzy8L*efhtRf#J{leQyhz?w`Ew{9@`iJ_c|>Du1DG@zTA_;32Jp>{}jZWWHx$c(7B( z?*rpoi>O=H3=9=|#1FV1+AimZJW{52YxmD`tN&7%X#T4^7IWmz)E}thom-EIdi_iD z5@eUXK2 z1ko0>o{NUWMFJ5%fLI`Il^>Zs>Y34)8BJ!RdFC#-02wXKKqW7@U_>e-F_@!8^TRKr z^~`7sfM7;JQZSllM)S;QtC`q72BgXv%`^1LGoUWz<9_>pN52v1>|*w8%Pr^pV_HweST}h>osH8C@|ny8H<= zeL&1&vC%vOT81~eFl}^U+UUYGP>*bMWh${HCpn$7>)Yl0>i>K^zW+uXXdVXqP`2nNj_-cJAxgkqf=#%03peP2OaN`6>V|2z?@ZsvFx&A+_<&trKWaPVv?6MuX6 zk2S8f)G~hj&+HTSx1Ga+jxDz`@3)xq@8|jYpcGJWjm{i{k{U5H;-h0=^ce#iodzGB z1|OXUADspVEee9nJ|IorVP}pO&7(#0=#<{*lpc|*hQKR~K+8o(myV2f0kGF7*hPm| zJ@f0@;g|jP|9*(y2F)Si>0BePvWE1e?>#N}B@Nm{3tD&$5yIO&hnP?e>fkdlFx0ct z<3LZUcEHIzlvMsll|d_bX8r%=zGd~F_wy~U_{zY*aG>7o|E}r(-v58S|6eym{!6`# z-^G1A3=ALUpPZk+6|*W`aSCVyYoKRzEW3Nj(-|NFUL e;{Tui&##m(S~zv7*KGy{1_n=8KbLh*2~7aaTXoI= diff --git a/mods/ITEMS/mcl_furnaces/README.md b/mods/ITEMS/mcl_furnaces/README.md new file mode 100644 index 00000000..7bdcae46 --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/README.md @@ -0,0 +1,12 @@ +Furnaces for MineClone 2. +Heavily based on Minetest Game (default/furnace.lua). + +License of source code +---------------------- +LGPLv2.1 +Based on code from Minetest Game. +Modified by Wuzzy. + +License of media +---------------- +MIT License diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index a7a5eff9..75d068aa 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -1,6 +1,33 @@ -local furnace_inactive_formspec = - "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png^crafting_inventory_furnace.png]".. + +-- +-- Formspecs +-- + +local function active_formspec(fuel_percent, item_percent) + return "size[9,8.75]".. + "background[-0.19,-0.25;9.41,9.49;mcl_furnaces_formspec.png]".. + mcl_vars.inventory_header.. + "list[current_player;main;0,4.5;9,3;9]".. + "list[current_player;main;0,7.74;9,1;]".. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "list[current_name;dst;5.75,1.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-fuel_percent)..":default_furnace_fire_fg.png]".. + "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + "image_button[8,0;1,1;craftguide_book.png;__mcl_craftguide;]".. + "tooltip[__mcl_craftguide;Show crafting recipes]".. + "listring[current_name;dst]".. + "listring[current_player;main]".. + "listring[current_name;src]".. + "listring[current_player;main]".. + "listring[current_name;fuel]".. + "listring[current_player;main]" +end + +local inactive_formspec = "size[9,8.75]".. + "background[-0.19,-0.25;9.41,9.49;mcl_furnaces_formspec.png]".. mcl_vars.inventory_header.. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. @@ -8,6 +35,7 @@ local furnace_inactive_formspec = "list[current_name;fuel;2.75,2.5;1,1;]".. "list[current_name;dst;5.75,1.5;1,1;]".. "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. "image_button[8,0;1,1;craftguide_book.png;__mcl_craftguide;]".. "tooltip[__mcl_craftguide;Show crafting recipes]".. "listring[current_name;dst]".. @@ -23,23 +51,184 @@ local craftguide = function(pos, formname, fields, sender) end end +-- +-- Node callback functions that are the same for active and inactive furnace +-- + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "fuel" then + if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + return stack:get_count() + else + return 0 + end + elseif listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +local function furnace_node_timer(pos, elapsed) + -- + -- Inizialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + local inv = meta:get_inventory() + local srclist, fuellist + + local cookable, cooked + local fuel + + local update = true + while update do + update = false + + srclist = inv:get_list("src") + fuellist = inv:get_list("fuel") + + -- + -- Cooking + -- + + -- Check if we have cookable content + local aftercooked + cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + cookable = cooked.time ~= 0 + + -- Check if we have enough fuel to burn + if fuel_time < fuel_totaltime then + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + elapsed + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + elapsed + if src_time >= cooked.time then + -- Place result in dst list if possible + if inv:room_for_item("dst", cooked.item) then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + src_time = src_time - cooked.time + update = true + end + end + end + else + -- Furnace ran out of fuel + if cookable then + -- We need to get new fuel + local afterfuel + fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list + fuel_totaltime = 0 + src_time = 0 + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + update = true + fuel_totaltime = fuel.time + (fuel_time - fuel_totaltime) + src_time = src_time + elapsed + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + src_time = 0 + end + fuel_time = 0 + end + + elapsed = 0 + end + + if fuel and fuel_totaltime > fuel.time then + fuel_totaltime = fuel.time + end + if srclist[1]:is_empty() then + src_time = 0 + end + + -- + -- Update formspec and node + -- + local formspec = inactive_formspec + local item_state + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + end + + local result = false + + if fuel_totaltime ~= 0 then + local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) + formspec = active_formspec(fuel_percent, item_percent) + swap_node(pos, "mcl_furnaces:furnace_active") + -- make sure timer restarts automatically + result = true + else + swap_node(pos, "mcl_furnaces:furnace") + -- stop timer on the inactive furnace + minetest.get_node_timer(pos):stop() + end + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + + return result +end + minetest.register_node("mcl_furnaces:furnace", { description = "Furnace", - tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", - "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"}, + tiles = { + "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", - is_ground_content = false, - stack_max = 64, groups = {cracky=2, container=4, deco_block=1}, + is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", furnace_inactive_formspec) - local inv = meta:get_inventory() - inv:set_size("fuel", 1) - inv:set_size("src", 1) - inv:set_size("dst", 1) - end, + + on_timer = furnace_node_timer, after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) local meta2 = meta @@ -54,58 +243,45 @@ minetest.register_node("mcl_furnaces:furnace", { end meta:from_table(meta2:to_table()) end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) + + on_construct = function(pos) local meta = minetest.get_meta(pos) + meta:set_string("formspec", inactive_formspec) local inv = meta:get_inventory() - if listname == "fuel" then - if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then - return stack:get_count() - else - return 0 - end - elseif listname == "src" then - return stack:get_count() - elseif listname == "dst" then - return 0 - end + inv:set_size('src', 1) + inv:set_size('fuel', 1) + inv:set_size('dst', 1) end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack(from_list, from_index) - if to_list == "fuel" then - if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then - return count - else - return 0 - end - elseif to_list == "src" then - return count - elseif to_list == "dst" then - return 0 - end + + on_metadata_inventory_move = function(pos) + minetest.get_node_timer(pos):start(1.0) end, + on_metadata_inventory_put = function(pos) + -- start timer function, it will sort out whether furnace can burn or not. + minetest.get_node_timer(pos):start(1.0) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, on_receive_fields = craftguide, }) minetest.register_node("mcl_furnaces:furnace_active", { description = "Furnace", - tiles = {"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"}, + tiles = { + "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", - is_ground_content = false, light_source = 13, drop = "mcl_furnaces:furnace", - groups = {cracky=2, container=4, not_in_creative_inventory=1}, + groups = {cracky=2, container=4, deco_block=1, not_in_creative_inventory=1}, + is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", furnace_inactive_formspec) - local inv = meta:get_inventory() - inv:set_size("fuel", 1) - inv:set_size("src", 1) - inv:set_size("dst", 1) - end, + on_timer = furnace_node_timer, + after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) local meta2 = meta @@ -120,153 +296,11 @@ minetest.register_node("mcl_furnaces:furnace_active", { end meta:from_table(meta2:to_table()) end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if listname == "fuel" then - if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then - return stack:get_count() - else - return 0 - end - elseif listname == "src" then - return stack:get_count() - elseif listname == "dst" then - return 0 - end - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack(from_list, from_index) - if to_list == "fuel" then - if minetest.get_craft_result({method="fuel",width=1,items={stack}}).time ~= 0 then - return count - else - return 0 - end - elseif to_list == "src" then - return count - elseif to_list == "dst" then - return 0 - end - end, + + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, on_receive_fields = craftguide, }) -minetest.register_abm({ - nodenames = {"mcl_furnaces:furnace","mcl_furnaces:furnace_active"}, - interval = 1.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local meta = minetest.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 - local aftercooked - - if srclist then - cooked, aftercooked = 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 - inv:set_stack("src", 1, aftercooked.items[1]) - else - print("Could not insert '"..cooked.item:to_string().."'") - end - meta:set_string("src_time", 0) - end - end - - if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then - local percent = math.floor(meta:get_float("fuel_time") / - meta:get_float("fuel_totaltime") * 100) - minetest.swap_node(pos, { name = "mcl_furnaces:furnace_active", param = node.param, param2 = node.param2 }) - meta:set_string("formspec", - "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png^crafting_inventory_furnace.png]".. - mcl_vars.inventory_header.. - "list[current_player;main;0,4.5;9,3;9]".. - "list[current_player;main;0,7.74;9,1;]".. - "list[current_name;src;2.75,0.5;1,1;]".. - "list[current_name;fuel;2.75,2.5;1,1;]".. - "list[current_name;dst;5.75,1.5;1,1;]".. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. - (100-percent)..":default_furnace_fire_fg.png]".. - "image_button[8,0;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;Show crafting recipes]".. - "listring[current_name;dst]".. - "listring[current_player;main]".. - "listring[current_name;src]".. - "listring[current_player;main]".. - "listring[current_name;fuel]".. - "listring[current_player;main]") - return - end - - local fuel = nil - local afterfuel - 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, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) - end - - if fuel.time <= 0 then - minetest.swap_node(pos, { name = "mcl_furnaces:furnace", param = node.param, param2 = node.param2 }) - meta:set_string("formspec", furnace_inactive_formspec) - return - end - - if cooked.item:is_empty() then - if was_active then - minetest.swap_node(pos, { name = "mcl_furnaces:furnace", param = node.param, param2 = node.param2 }) - meta:set_string("formspec", furnace_inactive_formspec) - end - return - end - - meta:set_string("fuel_totaltime", fuel.time) - meta:set_string("fuel_time", 0) - - inv:set_stack("fuel", 1, afterfuel.items[1]) - end, -}) - -minetest.register_craft({ - output = 'mcl_furnaces:furnace', - recipe = { - {'mcl_core:cobble', 'mcl_core:cobble', 'mcl_core:cobble'}, - {'mcl_core:cobble', '', 'mcl_core:cobble'}, - {'mcl_core:cobble', 'mcl_core:cobble', 'mcl_core:cobble'}, - } -}) - diff --git a/mods/ITEMS/mcl_furnaces/textures/default_furnace_bg.png b/mods/ITEMS/mcl_furnaces/textures/default_furnace_bg.png deleted file mode 100644 index a538893296975d46a4502f38bcc4888a3f88f32c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1189 zcmeAS@N?(olHy`uVBq!ia0y~yU`$|OVD#Z&W?*1Aba9$70|SF)fKP~PcX#)(W5@pg z|Ifg{U~X<68X6iOA74~d)ZN|P*Vngd)v6skb{so)?CjaISFT*Se*OBRM~^;y`0)S# z|6tYvIR*v>=8_=4UED%DYsZ4K@zRaV!o>^o57{nPHc z=z~T3{QIw}{Sf<7`-1WMB;B>|?@Ag>Ib-?b-klKj1cjZ&Usz-G-0$aIM!Ig$3 zhUb$WH!y#&EGWNu(#7_`Vzi8%f9gT)6euX1q&GLq_@BA@SU6Ud19Nuex3)L zI~9Y}?^qpAdcaV_H^*=KOO~2SzCPDOt6B5fvc2#2zVvp!!7-2L4&U{|^IVS9vdefk zo;|qN_Slu)JHiD^R=(y~-EqFr`hNL=OuY@I1@&z!&PN(ER8RUXWTDHtP27;-&e>z1 z8{RIf<(u)kSYj#AoYQt9TaGc%>OpOzZj7yef|4BcW32AZY~EJ z7@7YaKCpWwqs_~@+bVf}4#ytYzVYm^w6+t|U0j&U_K^&x3x z#qTdaW}fn94{yQi>T>0u#SG7)FO&<<_C2~?r(o3& wvCp;)?~fOR9@IFn`+IJKbn?kL%5Um@W;s9ow7=vF0|Nttr>mdKI;Vst01N=@1^@s6 diff --git a/mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_bg.png b/mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..587685717cf6def4cf38f96801542d7d26d382e1 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU@+idVPIgmwRFQ11_lO}bVpxD28NCO+mi?V3(d3p_MEJ^JADmn#-Ezzrlu@b+daz{^k=h*#b|B_zx_Yr<9Z(J zd*?nrSj%Vk=kDQd``tf2R?ipwbIPDCoON+UV2ACBtgW0y{5s-I0xb$GiW~>`vwVKf za3R_1_7l(PrVI=WswJ)wB`Jv|saDBFsfi`23`Pcq=DG$(x<-Z}28LD!W>yA<+8~C( jedfj1C>nC}Q!>*kacfu?C*97#z`)??>gTe~DWM4f$*p)c literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_fg.png b/mods/ITEMS/mcl_furnaces/textures/gui_furnace_arrow_fg.png new file mode 100644 index 0000000000000000000000000000000000000000..7a9ec4e5ea3f6c03191ba730f6854edbd0e16bbc GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU@+idU|?VfJ+8i)fq{V~-O<;Pfnj4m_n$;o zkb-27AYTTCDm4a%h86~fUknTk4KElNN(~qoUL`OvSj}Ky5HFasE6|34fq|(c$S;_I zp=|P53lJ~K+ueoXe|!I#{R|8Y>?NMQuIvw)L>bvQLOU*>WME+M_jGX#u{izq;zr&E z0|6FC?puomx|RyAk|=5_Z8)*#=4~6@vd$@?2>=AtXbu1X literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_furnaces/textures/mcl_furnaces_formspec.png b/mods/ITEMS/mcl_furnaces/textures/mcl_furnaces_formspec.png new file mode 100644 index 0000000000000000000000000000000000000000..f8191ffd2272529bfe9e74bb1ade663c5f859e1d GIT binary patch literal 2718 zcmeAS@N?(olHy`uVBq!ia0y~yVD@8RU>0CuW?*1=#HC@%z`($g?&#~tz_78O`%fY( z0|SFXvPY0F14ES>14Ba#1H&%{28M z$s@kK_w6sw-L7hRR&Efw8XS9M1!v}+OsR_nmzf`!yfP`Yy18hM+niZvb@>x+#M~%( z-g`N2j+^Q3%T3U914&p!CQdpip7zA#RjSN$yAv}XUCHqDvy!EM)O@-1^54hk+uHjs z{SBSJv=Evb+OG> z_Ve$@?%4gS{2li@I#vqei;|s}AAi1jxN`a1)$32ayaiQj==VGQ@0Xqbw_ZM7FZvp0 zLa_buPru&(o&WsLzaynbHXhI1&R#$7b;oOHS+cBJ?!Z_3gPML*L8hGed<8YVTx`5N zU6A+K_3jLYaY>pdp|}_1Bk~!3*E}y}ngTe~DWM4fn+Wx} literal 0 HcmV?d00001