diff --git a/metal_melter/caster.lua b/metal_melter/caster.lua index c92847f..b44dcc7 100644 --- a/metal_melter/caster.lua +++ b/metal_melter/caster.lua @@ -193,7 +193,7 @@ local function find_castable(metal_name, cast_name) return nil end -local function get_cast_for_name(name) +function metal_caster.get_cast_for_name(name) for index, value in pairs(metal_caster.casts) do local mod = value.mod_name or "metal_melter" if name == mod..":"..index.."_cast" then @@ -335,7 +335,7 @@ local function caster_node_timer(pos, elapsed) metal_type = fluidity.get_metal_for_fluid(metal.fluid) local caststack = inv:get_stack("cast", 1):get_name() - local castname = get_cast_for_name(caststack) + local castname = metal_caster.get_cast_for_name(caststack) if castname ~= nil then -- Cast metal using a cast local cast = metal_caster.casts[castname] diff --git a/multifurnace/casting_table.lua b/multifurnace/casting_table.lua new file mode 100644 index 0000000..d939e25 --- /dev/null +++ b/multifurnace/casting_table.lua @@ -0,0 +1,173 @@ + +local function create_item_entity(istack, cast, tpos) + local vpos = vector.add(tpos, {x=0,y=0.5,z=0}) + local e = minetest.add_entity(vpos, "multifurnace:table_item") + e:set_rotation({x = 1.570796, y = 0, z = 0}) + e:get_luaentity():set_item(istack:get_name()) + e:get_luaentity():set_is_cast(cast) +end + +local function set_item_entities(inv, pos) + local vpos = vector.add(pos, {x=0,y=1,z=0}) + local ents = minetest.get_objects_inside_radius(vpos, 1) + local virtual = {} + + for _,object in pairs(ents) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "multifurnace:table_item" then + table.insert(virtual, object) + end + end + + local cast = inv:get_stack("cast", 1) + local item = inv:get_stack("item", 1) + + if #virtual >= 2 then + for _,v in pairs(virtual) do + local lent = v:get_luaentity() + if lent:is_cast() then + if cast:is_empty() then + v:remove() + else + lent:set_item(cast:get_name()) + end + else + if item:is_empty() then + v:remove() + else + lent:set_item(item:get_name()) + end + end + end + elseif #virtual == 1 then + local lent = virtual[1]:get_luaentity() + if lent:is_cast() then + if cast:is_empty() then + virtual[1]:remove() + else + lent:set_item(cast:get_name()) + end + if not item:is_empty() then + create_item_entity(item, false, pos) + end + else + if item:is_empty() then + virtual[1]:remove() + else + lent:set_item(item:get_name()) + end + if not cast:is_empty() then + create_item_entity(cast, true, pos) + end + end + else + if not item:is_empty() then + create_item_entity(item, false, pos) + end + if not cast:is_empty() then + create_item_entity(cast, true, pos) + end + end +end + +minetest.register_node("multifurnace:casting_table", { + description = "Casting Table", + drawtype = "nodebox", + paramtype1 = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5000, -0.5000, -0.5000, -0.2500, 0.1875, -0.2500}, + {0.2500, -0.5000, -0.5000, 0.5000, 0.1875, -0.2500}, + {0.2500, -0.5000, 0.2500, 0.5000, 0.1875, 0.5000}, + {-0.5000, -0.5000, 0.2500, -0.2500, 0.1875, 0.5000}, + {-0.5000, 0.1875, -0.5000, 0.5000, 0.4375, 0.5000}, + {-0.5000, 0.4375, -0.5000, 0.4375, 0.5000, -0.4375}, + {-0.4375, 0.4375, 0.4375, 0.5000, 0.5000, 0.5000}, + {-0.5000, 0.4375, -0.4375, -0.4375, 0.5000, 0.5000}, + {0.4375, 0.4375, -0.5000, 0.5000, 0.5000, 0.4375} + } + }, + tiles = {"multifurnace_table_top.png", "multifurnace_table_side.png"}, + groups = { cracky = 1, multifurnace_accessory = 1 }, + on_construct = function (pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + inv:set_size("cast", 1) + inv:set_size("item", 1) + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local i = itemstack:get_name() + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + local cast = metal_caster.get_cast_for_name(i) + + if inv:get_stack("cast", 1):is_empty() and cast then + inv:set_stack("cast", 1, itemstack:take_item(1)) + set_item_entities(inv, pos) + --elseif inv:get_stack("item", 1):is_empty() and not cast then + -- inv:set_stack("item", 1, itemstack:take_item(1)) + -- set_item_entities(inv, pos) + end + + return itemstack + end, + on_punch = function(pos, node, puncher, pointed_thing) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + local to_give = nil + + if not inv:get_stack("item", 1):is_empty() then + to_give = inv:get_stack("item", 1) + inv:set_list("item", {}) + elseif not inv:get_stack("cast", 1):is_empty() then + -- TODO: check for liquid + to_give = inv:get_stack("cast", 1) + inv:set_list("cast", {}) + end + + if to_give and puncher then + local inp = puncher:get_inventory() + if inp:room_for_item("main", to_give) then + inp:add_item("main", to_give) + else + minetest.item_drop(to_give, puncher, vector.add(pos, {x=0,y=1,z=0})) + end + set_item_entities(inv, pos) + return false + end + + return true + end, + can_dig = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:get_stack("item", 1):is_empty() and inv:get_stack("cast", 1):is_empty() + end, +}) + +minetest.register_entity("multifurnace:table_item", { + initial_properties = { + physical = false, + collide_with_objects = false, + visual = "item", + visual_size = {x = 0.45, y = 0.45, z = 0.5}, + textures = {}, + pointable = false, + static_save = true, + }, + item = "air", + cast = false, + set_item = function (self, itm) + self.item = itm + self.object:set_properties({textures = {self.item}}) + end, + is_cast = function (self) + return self.cast + end, + set_is_cast = function (self, is) + self.cast = is == true + end +}) diff --git a/multifurnace/faucet.lua b/multifurnace/faucet.lua index 663b808..e2b4109 100644 --- a/multifurnace/faucet.lua +++ b/multifurnace/faucet.lua @@ -1,6 +1,6 @@ -- Faucet is a simple liquid transfer node -local FAUCET_PER_SECOND = 122 +local FAUCET_PER_SECOND = metal_melter.spec.ingot local function update_timer (pos) local t = minetest.get_node_timer(pos) diff --git a/multifurnace/init.lua b/multifurnace/init.lua index 1159968..e2e281a 100644 --- a/multifurnace/init.lua +++ b/multifurnace/init.lua @@ -9,6 +9,7 @@ multifurnace.modpath = modpath dofile(modpath .. "/multi.lua") dofile(modpath .. "/faucet.lua") +dofile(modpath .. "/casting_table.lua") dofile(modpath .. "/furnace.lua") dofile(modpath .. "/nodes.lua") dofile(modpath .. "/crafting.lua") diff --git a/multifurnace/textures/multifurnace_table_side.png b/multifurnace/textures/multifurnace_table_side.png new file mode 100644 index 0000000..85e3c5e Binary files /dev/null and b/multifurnace/textures/multifurnace_table_side.png differ diff --git a/multifurnace/textures/multifurnace_table_top.png b/multifurnace/textures/multifurnace_table_top.png new file mode 100644 index 0000000..a503161 Binary files /dev/null and b/multifurnace/textures/multifurnace_table_top.png differ