From 7437bab3016e1eb27752f079254fecfd2b6011c5 Mon Sep 17 00:00:00 2001 From: DanDuncombe Date: Sun, 24 Nov 2013 18:28:55 +0000 Subject: [PATCH] SMELTER is now used for alloy recipes --- mods/crafter/README.md | 80 +++++++ mods/crafter/init.lua | 110 ++++++++++ mods/doors/init.lua | 2 +- mods/metals/init.lua | 121 +++++++---- mods/smelter/README.md | 92 ++++++++ mods/smelter/depends.txt | 3 + mods/smelter/init.lua | 205 ++++++++++++++++++ .../smelter/textures/smelter_smelter_base.png | Bin 0 -> 835 bytes .../textures/smelter_smelter_front.png | Bin 0 -> 817 bytes .../textures/smelter_smelter_front_active.png | Bin 0 -> 894 bytes .../smelter/textures/smelter_smelter_side.png | Bin 0 -> 798 bytes mods/smelter/textures/smelter_smelter_top.png | Bin 0 -> 663 bytes 12 files changed, 570 insertions(+), 43 deletions(-) create mode 100644 mods/crafter/README.md create mode 100644 mods/crafter/init.lua create mode 100644 mods/smelter/README.md create mode 100644 mods/smelter/depends.txt create mode 100644 mods/smelter/init.lua create mode 100644 mods/smelter/textures/smelter_smelter_base.png create mode 100644 mods/smelter/textures/smelter_smelter_front.png create mode 100644 mods/smelter/textures/smelter_smelter_front_active.png create mode 100644 mods/smelter/textures/smelter_smelter_side.png create mode 100644 mods/smelter/textures/smelter_smelter_top.png diff --git a/mods/crafter/README.md b/mods/crafter/README.md new file mode 100644 index 0000000..a2a05b8 --- /dev/null +++ b/mods/crafter/README.md @@ -0,0 +1,80 @@ +=== Crafter MOD for MINETEST-C55 === +by Master Gollum + +Introduction: + + This is an utility MOD, itself does nothing. Clones the crafting + definition system to allow new MOD developers to create their + own craft systems. For example a pottery wheel to do items with + clay, a mill to produce flour from cereals, etc. + + How it works? + It give you 2 functions crafter.register_craft(craft) and + crafter.get_craft_result(data). The main difference with the + default ones is that they are not restricted for the method + name, you can use whatever name you want and create a new + family of crafts. They are used exactly as the default ones + are used, with the exception that register_craft requires + the method property. + + Example: + + -- In the list of definitions + crafter.register_craft({ + type = 'pottery', + output = 'potter:awasome_jar', + recipe = { + {'default:clay_lump','default:clay_lump'}, + {'default:clay_lump','default:clay_lump'}, + } + }) + + -- Inside your the abm of your crafter node + local shape = inv:get_list("shape") + crafter.get_craft_result({method = "pottery", width = 4, items = shape}) + + +Release Notes + + Version 0.1 + Initial version + +PS: This document has been structured as the README.txt of PilzAdam in + his Bed MOD. + +How to install: + Unzip the archive an place it in minetest-base-directory/mods/minetest/ + if you have a windows client or a linux run-in-place client. If you + have a linux system-wide instalation place it in + ~/.minetest/mods/minetest/. + If you want to install this mod only in one world create the folder + worldmods/ in your worlddirectory. + For further information or help see: + http://wiki.minetest.com/wiki/Installing_Mods + + +License: +Sourcecode: WTFPL (see below) +Graphics: WTFPL (see below) + +See also: +http://minetest.net/ + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + + + + + diff --git a/mods/crafter/init.lua b/mods/crafter/init.lua new file mode 100644 index 0000000..8885b36 --- /dev/null +++ b/mods/crafter/init.lua @@ -0,0 +1,110 @@ +crafter={ + debug=false, + crafts={}, + empty={item=ItemStack(nil),time=0} +} + +function crafter.register_craft(craft) + assert(craft.type ~= nil and craft.recipe ~= nil and craft.output ~= nil, + "Invalid craft definition, it must have type, recipe and output") + assert(type(craft.recipe)=="table" and type(craft.recipe[1])=="table","'recipe' must be a bidimensional table") + minetest.log("verbose","registerCraft ("..craft.type..", output="..craft.output.." recipe="..dump(craft.recipe)) + craft._h=#craft.recipe + craft._w=#craft.recipe[1] + -- TODO check that all the arrays have the same length... + crafter.crafts[#crafter.crafts+1]=craft +end + +function crafter.get_craft_result(data) + assert(data.method ~= nil and data.items ~= nil, "Invalid call, method and items must be provided") + local w = 1 + if data.width ~= nil and data.width>0 then + w=data.width + end + local r=nil + for zz,craft in ipairs(crafter.crafts) do + r=crafter._check_craft(data,w,craft) + if r ~= nil then + if crafter.debug then + print("Craft found, returning "..dump(r.item)) + end + return r + end + end + return crafter.empty +end + +function crafter._check_craft(data,w,c) + if c.type == data.method then + -- Here we go.. + for i=1,w-c._h+1 do + for j=1,w-c._w+1 do + local p=(i-1)*w+j + if crafter.debug then + print("Checking data.items["..dump(i).."]["..dump(j).."]("..dump(p)..")="..dump(data.items[p]:get_name()).." vs craft.recipe[1][1]="..dump(c.recipe[1][1])) + end + if data.items[p]:get_name() == c.recipe[1][1] then + for m=1,c._h do + for n=1,c._w do + local q=(i+m-1-1)*w+j+n-1 + if crafter.debug then + print(" Checking data.items["..dump(i+m-1).."]["..dump(j+n-1).."]("..dump(q)..")="..dump(data.items[q]:get_name()).. + " vs craft.recipe["..dump(m).."]["..dump(n).."]="..dump(c.recipe[m][n])) + end + if c.recipe[m][n] ~= data.items[q]:get_name() then + return nil + end + end + end + -- found! we still must check that is not any other stuff outside the limits of the recipe sizes... + -- Checking at right of the matching square + for m=i-c._h+1+1,w do + for n=j+c._w,w do + local q=(m-1)*w+n + if crafter.debug then + print(" Checking right data.items["..dump(m).."]["..dump(n).."]("..dump(q)..")="..dump(data.items[q]:get_name())) + end + if data.items[q]:get_name() ~= "" then + return nil + end + end + end + -- Checking at left of the matching square (the first row has been already scanned) + for m=i-c._h+1+1+1,w do + for n=1,j-1 do + local q=(m-1)*w+n + if crafter.debug then + print(" Checking left data.items["..dump(m).."]["..dump(n).."]("..dump(q)..")="..dump(data.items[q]:get_name())) + end + if data.items[q]:get_name() ~= "" then + return nil + end + end + end + -- Checking at bottom of the matching square + for m=i+c._h,w do + for n=j,j+c._w do + local q=(m-1)*w+n + if crafter.debug then + print(" Checking bottom data.items["..dump(m).."]["..dump(n).."]("..dump(q)..")="..dump(data.items[q]:get_name())) + end + if data.items[q]:get_name() ~= "" then + return nil + end + end + end + if crafter.debug then + print("Craft found! "..c.output) + end + return {item=ItemStack(c.output),time=1} + elseif data.items[p] ~= nil and data.items[p]:get_name() ~= "" then + if crafter.debug then + print("Invalid data item "..dump(data.items[p]:get_name())) + end + return nil + end + end + end + end +end + diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 4b517e0..a3792f3 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -280,7 +280,7 @@ for i=1, #metals.list do inventory_image = "metals_"..metals.list[i].."_block.png^doors_grey.png", groups = {snappy=1,cracky=2}, tiles_bottom = {"metals_"..metals.list[i].."_block.png"}, - tiles_top = {"hatches_"..metals.list[i].."_hatch.png"}, + tiles_top = {"metals_"..metals.list[i].."_block.png"}, }) minetest.register_craft({ output = "doors:door_"..metals.list[i], diff --git a/mods/metals/init.lua b/mods/metals/init.lua index 4f9adea..3fadf5d 100644 --- a/mods/metals/init.lua +++ b/mods/metals/init.lua @@ -331,88 +331,125 @@ for i, mineral in ipairs(minerals.list) do end -- --- Alloys +-- Alloys (needs smelter) -- - - -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:oroide_unshaped 4", - recipe = {"metals:copper_unshaped", "metals:copper_unshaped", "metals:tin_unshaped", "metals:zinc_unshaped"}, + recipe = { + {"metals:copper_unshaped","metals:copper_unshaped"}, + {"metals:tin_unshaped","metals:zinc_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:tumbaga_unshaped 4", - recipe = {"metals:copper_unshaped", "metals:copper_unshaped", "metals:gold_unshaped", "metals:gold_unshaped"}, + recipe = { + {"metals:copper_unshaped","metals:copper_unshaped"}, + {"metals:gold_unshaped","metals:gold_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:monel_unshaped 4", - recipe = {"metals:nickel_unshaped", "metals:nickel_unshaped", "metals:nickel_unshaped", "metals:copper_unshaped"}, + recipe = { + {"metals:nickel_unshaped","metals:nickel_unshaped"}, + {"metals:nickel_unshaped","metals:copper_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:german_silver_unshaped 4", - recipe = {"metals:copper_unshaped", "metals:copper_unshaped", "metals:copper_unshaped", "metals:nickel_unshaped"}, + recipe = { + {"metals:copper_unshaped","metals:copper_unshaped"}, + {"metals:copper_unshaped","metals:nickel_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:albata_unshaped 4", - recipe = {"metals:copper_unshaped", "metals:nickel_unshaped", "metals:zinc_unshaped", "metals:zinc_unshaped"}, + recipe = { + {"metals:copper_unshaped","metals:nickel_unshaped"}, + {"metals:zinc_unshaped","metals:zinc_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:steel_unshaped 4", - recipe = {"metals:wrought_iron_unshaped", "metals:wrought_iron_unshaped", "metals:wrought_iron_unshaped", "metals:pig_iron_unshaped"}, + recipe = { + {"metals:wrought_iron_unshaped","metals:wrought_iron_unshaped"}, + {"metals:wrought_iron_unshaped","metals:pig_iron_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:brass_unshaped 4", - recipe = {"metals:copper_unshaped", "metals:copper_unshaped", "metals:copper_unshaped", "metals:zinc_unshaped"}, + recipe = { + {"metals:copper_unshaped","metals:copper_unshaped"}, + {"metals:copper_unshaped","metals:zinc_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:sterling_silver_unshaped 4", - recipe = {"metals:silver_unshaped", "metals:silver_unshaped", "metals:silver_unshaped", "metals:copper_unshaped"}, + recipe = { + {"metals:silver_unshaped","metals:silver_unshaped"}, + {"metals:silver_unshaped","metals:copper_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:rose_gold_unshaped 4", - recipe = {"metals:gold_unshaped", "metals:gold_unshaped", "metals:gold_unshaped", "metals:brass_unshaped"}, + recipe = { + {"metals:gold_unshaped","metals:gold_unshaped"}, + {"metals:gold_unshaped","metals:brass_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:black_bronze_unshaped 4", - recipe = {"metals:copper_unshaped", "metals:copper_unshaped", "metals:gold_unshaped", "metals:silver_unshaped"}, + recipe = { + {"metals:copper_unshaped","metals:copper_unshaped"}, + {"metals:gold_unshaped","metals:silver_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:bismuth_bronze_unshaped 4", - recipe = {"metals:copper_unshaped", "metals:copper_unshaped", "metals:bismuth_unshaped", "metals:tin_unshaped"} + recipe = { + {"metals:copper_unshaped","metals:copper_unshaped"}, + {"metals:bismuth_unshaped","metals:tin_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:bronze_unshaped 4", - recipe = {"metals:copper_unshaped", "metals:copper_unshaped", "metals:copper_unshaped", "metals:tin_unshaped"} + recipe = { + {"metals:copper_unshaped","metals:copper_unshaped"}, + {"metals:copper_unshaped","metals:tin_unshaped"} + } }) -minetest.register_craft({ - type = "shapeless", +crafter.register_craft({ + type = "smelting", output = "metals:black_steel_unshaped 4", - recipe = {"metals:steel_unshaped", "metals:steel_unshaped", "metals:nickel_unshaped", "metals:black_bronze_unshaped"} + recipe = { + {"metals:steel_unshaped","metals:steel_unshaped"}, + {"metals:nickel_unshaped","metals:black_bronze_unshaped"} + } }) -- diff --git a/mods/smelter/README.md b/mods/smelter/README.md new file mode 100644 index 0000000..4ea2043 --- /dev/null +++ b/mods/smelter/README.md @@ -0,0 +1,92 @@ +=== Crafter MOD for MINETEST-C55 === +by Master Gollum + +Introduction: + + This MOD introduces a new kind of Furnace called Smelter. + It is intended for provide a mean for smelt materials, for + example to create alloys in a more realistic way. + This MOD adds also a new kind of crafts (smelting) with a + 2x2 grid. + + + The first release transform iron_ore in iron_ingot also + iron_ingot + coal_lump in steel_ingot as example of + uses. + + CRAFT for a Smelter + [cobble] [cobble] [cobble] + [cobble] [furnace] [cobble] + [cobble] [cobble] [cobble] + +For developers: + + Anyone that intends to define a new smelting they MUST + be registered with the crafter MOD. + + crafter.register_craft({ + type = "smelting", + output = "smelter:iron_ingot", + recipe = { + {"default:iron_lump"} + } + }) + + crafter.register_craft({ + type = "smelting", + output = "default:steel_ingot", + recipe = { + {"smelter:iron_ingot"}, + {"default:coal_lump"} + } + }) + +Depends + default + crafter + + +Release Notes + + Version 0.1 + Initial version + +PS: This document has been structured as the README.txt of PilzAdam in + his Bed MOD. + +How to install: + Unzip the archive an place it in minetest-base-directory/mods/minetest/ + if you have a windows client or a linux run-in-place client. If you + have a linux system-wide instalation place it in + ~/.minetest/mods/minetest/. + If you want to install this mod only in one world create the folder + worldmods/ in your worlddirectory. + For further information or help see: + http://wiki.minetest.com/wiki/Installing_Mods + + +License: +Sourcecode: WTFPL (see below) +Graphics: WTFPL (see below) + +See also: +http://minetest.net/ + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + + + + + diff --git a/mods/smelter/depends.txt b/mods/smelter/depends.txt new file mode 100644 index 0000000..106bcf2 --- /dev/null +++ b/mods/smelter/depends.txt @@ -0,0 +1,3 @@ +default +crafter +metals diff --git a/mods/smelter/init.lua b/mods/smelter/init.lua new file mode 100644 index 0000000..021a14a --- /dev/null +++ b/mods/smelter/init.lua @@ -0,0 +1,205 @@ +smelter={} + + +smelter.smelter_formspec = + "size[8,7]".. + "image[4,1;1,1;default_furnace_fire_bg.png]".. + "list[current_name;fuel;3,1;1,1;]".. + "list[current_name;src;0,0;2,2;]".. + "list[current_name;dst;6,0;2,2;]".. + "list[current_player;main;0,3;8,4;]" + +minetest.register_node("smelter:smelter", { + description = "Smelter", + tiles = {"smelter_smelter_top.png", "smelter_smelter_base.png", "smelter_smelter_side.png", + "smelter_smelter_side.png", "smelter_smelter_side.png", "smelter_smelter_front.png"}, + paramtype2 = "facedir", + 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", smelter.smelter_formspec) + meta:set_string("infotext", "Smelter") + local inv = meta:get_inventory() + inv:set_size("fuel", 1) + inv:set_size("src", 4) + 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("smelter:smelter_active", { + description = "Smelter", + tiles = {"smelter_smelter_top.png", "smelter_smelter_base.png", "smelter_smelter_side.png", + "smelter_smelter_side.png", "smelter_smelter_side.png", "smelter_smelter_front_active.png"}, + paramtype2 = "facedir", + light_source = 8, + drop = "smelter:smelter", + groups = {cracky=2, not_in_creative_inventory=1}, + 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", smelter.smelter_formspec) + meta:set_string("infotext", "Smelter"); + local inv = meta:get_inventory() + inv:set_size("fuel", 1) + inv:set_size("src", 4) + 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_abm({ + nodenames = {"smelter:smelter","smelter:smelter_active"}, + interval = 2.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + -- Init the values + 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 + + -- Get the source materials + local inv = meta:get_inventory() + local srclist = inv:get_list("src") + local cooked = nil + if srclist then + cooked = crafter.get_craft_result({method = "smelting", width = 2, items = srclist}) + --cooked = default.get_craft_result({method = "cooking", width = 1, items = srclist}) + end + + local was_active = false + local consume = false + print("Fuel time: "..dump(meta:get_float("fuel_time"))) + print("Fuel totaltime: "..dump(meta:get_float("fuel_totaltime"))) + + 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 not cooked.item:is_empty() 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 + consume = true + -- Put result in "dst" list + inv:add_item("dst", cooked.item) + -- take stuff from "src" list + for i=1,4 do + srcstack = inv:get_stack("src", i) + if not srcstack:is_empty() then + print("Removing "..srcstack:get_name()) + srcstack:take_item(1) + inv:set_stack("src", i, srcstack) + end + end + 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) + meta:set_string("infotext","Smelter active: "..percent.."%") + hacky_swap_node(pos,"smelter:smelter_active") + meta:set_string("formspec", + "size[8,7]".. + "image[4,1;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-percent)..":default_furnace_fire_fg.png]".. + "list[current_name;fuel;3,1;1,1;]".. + "list[current_name;src;0,0;2,2;]".. + "list[current_name;dst;6,0;2,2;]".. + "list[current_player;main;0,3;8,4;]") + return + end + + local fuel = nil + local cooked = nil + local fuellist = inv:get_list("fuel") + local srclist = inv:get_list("src") + + if srclist then + cooked = crafter.get_craft_result({method = "smelting", width = 2, 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","Smelter out of fuel") + hacky_swap_node(pos,"smelter:smelter") + meta:set_string("formspec", smelter.smelter_formspec) + return + end + + if cooked.item:is_empty() then + if was_active then + meta:set_string("infotext","Smelter is empty") + hacky_swap_node(pos,"smelter:smelter") + meta:set_string("formspec", smelter.smelter_formspec) + end + return + end + + meta:set_string("fuel_totaltime", fuel.time) + meta:set_string("fuel_time", 0) + if consume then + local stack = inv:get_stack("fuel", 1) + stack:take_item() + inv:set_stack("fuel", 1, stack) + end + end, +}) + +minetest.register_craft({ + output = 'smelter:smelter', + recipe = { + {'default:brick', 'default:brick', 'default:brick'}, + {'default:brick', '', 'default:brick'}, + {'default:stone_slab', 'default:stone_slab', 'default:stone_slab'}, + } +}) + +crafter.register_craft({ + type = "smelting", + output = "default:bronze_ingot", + recipe = { + {"default:copper_ingot"}, + {"default:steel_ingot"} + } +}) diff --git a/mods/smelter/textures/smelter_smelter_base.png b/mods/smelter/textures/smelter_smelter_base.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6795e468cf03e4e69c59c7a4bc798b79aa2133 GIT binary patch literal 835 zcmV-J1HAl+P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyx1 z4i*;1I`w@300P5FL_t(I%O%oVZsJH7K;cur%a^hZ1_A_<^a^@)BaLRK(^8K#oe3RC z4B;As?^W}V4V;HhNB!~VU#|GP@c8sdHq5vb1@C!Inj{R86s*63-J3 zhXdDZfwh+5V@g$)^tPw28loh@6QOHc@@>v+Hb;~ouj>tcZ}B~k$z%db(R3YJYnBfW z42K!B`JB2cQQ}C`1nVsC?;BoL|DmUM6HF9QRTcB`gz=)c z2mXD2X1n{KZCaEFUDu;Uge=P#jYgDZMHm_aU(+@n$J2=@G8|85ob4Hp#`Mmj2Og)( z1to%xO-y+!`PlE#fsZF1hy9r>8?sCmtT%65E@zx`WLbt-!2u$Ia}NFUpP!^jf)Y)n z6utBy3Wvp7%WOKq6Jfjkpss7~CR6IVW|WOMpU&vM?@>zOYvFD@Cg1J26$K89vyLbV zXqpa-qicI!H*2t8@ia-$VGyDe#IfOU*dt2l`kw3O727*JZ$w>{v~`2lKBH_%zTNTd z=@C&1>1>Y@kIUr~C4$0|rU~D_f5$`-zg|{scYBu01tyM&?Zv=sl=Lse@#18_JB;|NIk>@+QzQ@FdYf<0_A$8Mm zybhY%ospQB#d3*Kjvs&jAP6Jm z>FEh2uwMVBDsSK{MN!bUEg~NG^En@fJ+18sLZ7CtSgl?OqJYrX{14StT<|t`k0by9 N002ovPDHLkV1mMha0UPX literal 0 HcmV?d00001 diff --git a/mods/smelter/textures/smelter_smelter_front.png b/mods/smelter/textures/smelter_smelter_front.png new file mode 100644 index 0000000000000000000000000000000000000000..b73411c0ddcc65607f33ec61bbac5f21910f1292 GIT binary patch literal 817 zcmV-11J3-3P)_^0=`K^ zK~y-)b&^kOTxAr-fA63BckZ1`lT12^!G)hdKY+NXkYyWHOWabLZas-uu2Tl8oK>Yz~~~@SJlV9`VJcb8cQ5 zBH!c8xeE;MeuET}aZ$3?2+2&vQW(%3O?ct_>m1y^LF{QVQvslNh7$ndvSKr7;3YA? zcKeL;l0W;0w3CRk9+CzDr+BnKqIM1mNPt%8(;Lso^PIhDh7y8i=#%&w0AFc}s^-0q zKjrGJpJ~M*083GT`0DfP&RIuoYufELgZ=%*rrJ7`6i6v~VrAh+K|Cc7_w2b9{L7 zC$h5Qle_o%doTtdGZlaA4arSKQPpH8b!Rw1c?u2iWIQDaG}axTTv>~f0$*#AP&3X; z-g@~(CPjg-^nWi_HR8+9uDR2O1%wkQC9u}A@{A{^emsknb{j1o{77Xj0IOTuJpKM_ zw339LMuY)kHec{(wzfIAeFK2AX@mQBo}&L694!==D@*Mhy_0MJ#GXb;!DwF6ItkAp zn{%2UnFbyJNuY`1h(Idc6YgW z={1_o1m_$}&6LC8h$KlF91KX)l+OA(LO34&{t!P1k(-;F2noGjmwcXqvrMN`j4?>5 vIJ>sS!QlX7EBwHtEOH({{s%ww2|Ufe#J5FGj;itF00000NkvXXu0mjf`)F|J literal 0 HcmV?d00001 diff --git a/mods/smelter/textures/smelter_smelter_front_active.png b/mods/smelter/textures/smelter_smelter_front_active.png new file mode 100644 index 0000000000000000000000000000000000000000..22ee4064129aadbe9a326ea3f5c1e98833e0e4bd GIT binary patch literal 894 zcmV-^1A+XBP)& zIb1H+>5hGVueWehN&Kiy+OpWzwXF`3)<{4CsS-T5w7df+}hgt6vY}P1yV|$d*uWl-X5@PcAldp z#jDRB!%o_$6?1gb+AP7wKMej{=jiH1zW-zkRWFgh`+oGL^Qc;pwPKa!VZ>4)gYI>3 zRYZ38UgV5pQ*8IpT64?#W&SuB^TvfMTyJ&(7zQD~ZMJ#HQtT>Bv$D@&H9w-*?x9RI zVX)Ed(;AK0f9EpZ69cNXM^I9bFbq<*L3iwP$Gv;_b>UWC`(>K5Gy5hL!w7Ne?br2o z=NJ%Lpp+nvV`gt+vd!aW&AKjz`0*RUI0hhp@CdapKgCcI+cXfig&2%>{ON;7Xq-C@ zztDd(-5E}`A7$B81b%>$0^^5DlT3OF&krd3RUUshgPGSfQegE>y5Ba~|MJuH{yszP zW5G3dNYY7CuW#b{0Wz1%QYaMAaYV1*L$(xqm!9Ij2ln9A0xZkovqK+oaV_S}v)|$Q zK7+x4*}O~Awh_l)cv0K7jqAE>RI7|eV=|c(T5GbIG_7`rR4Prg(IlNtQ&?C)2+h^? zt0XKNxwyE9kWi_V8IOjbWBUC*K@cFNVt#IpMyp8>ha@Z$-y2gZ{Y%15V3`L016kcx UILs*DKL7v#07*qoM6N<$f)y;F?f?J) literal 0 HcmV?d00001 diff --git a/mods/smelter/textures/smelter_smelter_side.png b/mods/smelter/textures/smelter_smelter_side.png new file mode 100644 index 0000000000000000000000000000000000000000..f7503931ea72b188f9489d8cb660746fe824e7a6 GIT binary patch literal 798 zcmV+(1L6FMP)c#dx?Hbn`5x?HXS@bi*Evw_|8`C~L=mFB#eEeM+) zd9|eFy4>NP>xinZk$?mUw8MCnkfteD@dir>4zxqlQ2;oWA}cEZrt5^j*8sFV7xm!T z7u2REFcnfttVd^jyx&xr8cPbKlo(@h9EZW#rvNlfjrKHZ_VQ;sd&R3g@y?U(`30Mo zKLL3@n z_4NmSypN+WM2WwCr`+GxJ-^`HFF&9xiMAC&yNG0a-#fib8 zy<(>{RCUdGpA7)tR#;LHZF7Qsc;=feclnVm*WSIwRd~LKt1JLU(QaV8O311TOA0Kx z>&01#Z|^dq!pF}DfublV$^z@r8K=N0AHo32QOJj%@W8ex@&Zc=)T{BFgI0qqFBs)h zhNB@u3Xa1bwryjKK?uoYI>q^K!eMZT=X=a%S7dpC41zZOexKS@tm8Gdxil|Z0?{VcX2!4P>6a*mz16jH70q#T)jUkW8V`kDl)6?D6 zRqdk9n7ccNbKstPE_?BKb)4ynBO9yt`ybvAqcF|psw&obO}Tr6sCDn@>E?zfMXYlG zVz(aw@UnctuS(zhwAT%j?0dHt_?67`r(72RfFCCVQxpUcfVy(_!%>nX$HSO2Hmw}r z5da)6(%b+zj7D`&0jO16v9$J}utnV(BH}CU>i_^_3r>uPthJ8gEVScmzD4L$y?MI7s|Ic99i<73OOf;SaVx8~yqtbt# zq&4LNn3J3U9E8K(I0=)i>8Wlw;=~*wd?mspt9vRld8r0qa>HIee^vquu!3>UthF;i zaCUMs2{Tz~CI|%kx|3TAV79Y<^!}CLq@-ZVWutM)H#+O5n;QVGOjSQ`9f_Z3=cT)u zTT>MK{iuYV6r9*#oYi#>;4B`OjnR}V0r;+{cokQ00DFT7zPjSzD6%j<^fmmkG~HmBmqR!Oj9ZqWs-mCJtd_CFi|^#CT$D8 x(q3L>+UTo}18YG9YZ+(q#%jyj%THAn_ZOcA4qPT$%)$Tw002ovPDHLkV1nm(Arb%p literal 0 HcmV?d00001