casting table base

This commit is contained in:
Evert Prants 2019-03-27 11:45:20 +02:00
parent 442d2fa977
commit ed434d7631
Signed by: evert
GPG Key ID: 1688DA83D222D0B5
6 changed files with 177 additions and 3 deletions

View File

@ -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]

View File

@ -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
})

View File

@ -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)

View File

@ -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")

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B