From ed434d763143b0e42d9e0e2d903898c8cc84aeba Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Wed, 27 Mar 2019 11:45:20 +0200 Subject: [PATCH] casting table base --- metal_melter/caster.lua | 4 +- multifurnace/casting_table.lua | 173 ++++++++++++++++++ multifurnace/faucet.lua | 2 +- multifurnace/init.lua | 1 + .../textures/multifurnace_table_side.png | Bin 0 -> 346 bytes .../textures/multifurnace_table_top.png | Bin 0 -> 352 bytes 6 files changed, 177 insertions(+), 3 deletions(-) create mode 100644 multifurnace/casting_table.lua create mode 100644 multifurnace/textures/multifurnace_table_side.png create mode 100644 multifurnace/textures/multifurnace_table_top.png 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 0000000000000000000000000000000000000000..85e3c5e76b9c166a78b83dfd3ddff84f2fdc55fd GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfV`gbid4<%-8fl=AY-UJAiF1B#Zfaf$kjuc}T$GwvlA5AW zo>`Ki;O^-gkfN8$4irD^>Eak-aeC>bK(50I0xtL0{bM;PIO+F%?Q#Qwjy(HQdcM&a zmvlOeURl^p&79REJ(bZ*lcB@I#5nnWc~rLH^dP5DMg!xlwf@Y4oEyK(vF-id{PA_v z`_1_!fuV;FoXJ>w^be40?6CH0J{y+-5A$P-U267HOQ$@T##nT&ea7icHMY6)o_D-A zxXRjIw9G|?;kEtuvIB`9{C@e=suVoTX<}v$-8<#L84u07-X9J=xb!@**Y=m(%U8x} h4Y{}VR3omN9^==Nuk003wrm0U)6><@Wt~$(69B?be9Zs= literal 0 HcmV?d00001 diff --git a/multifurnace/textures/multifurnace_table_top.png b/multifurnace/textures/multifurnace_table_top.png new file mode 100644 index 0000000000000000000000000000000000000000..a5031613b1e87e9e287ba43299611312d6e9f7bd GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfV`gbiNuvY1R$T=O$!3N`lsM<-=BDPA0J#hd&PAz-C8;S2 z<(VZJ3hti10V#T^>_G98o-U3d8t115SqdF?;1J%>YX9)R{l(V36PzR+)qFR#9*<+O z+A#NdXZ<;*0-5%iscC6pqTKKD(*Bqjm$MhdUQenNTeWJH(d9F0yCl_S1%JPnlg!Up zqsJg~>@d^99JSfA#Gjs%oXM%6RPo=Yzo)c$&W>uA53N=wowqXF>Rr+K`01Iqhqnk+ z=ld-+Om#KRZ?l|XbLeb@wd%Kkry|BvS3C*wkz4C@Y3sC(47Swu1!*o_OT^8aXC2z2 qDwW-4`6l{F$ySCt-~ax8|Cfp9%{`ZBhBH$^zV&qVb6Mw<&;$Vdl!8(K literal 0 HcmV?d00001