diff --git a/digilines_inventory/chest.lua b/digilines_inventory/chest.lua index 2ae499b..c7a0ea8 100644 --- a/digilines_inventory/chest.lua +++ b/digilines_inventory/chest.lua @@ -25,9 +25,18 @@ local sendMessage = function (pos, msg, channel) end tableMerge = function(first_table,second_table) + if second_table == nil then return end for k,v in pairs(second_table) do first_table[k] = v end end +tableMergeImmutable = function(first_table, second_table) + if first_table == nil then return second_table end + if second_table == nil then return first_table end + copy = table.copy(first_table) + for k,v in pairs(second_table) do copy[k] = v end + return copy +end + local mychest = table.copy(defaultChest) function defer(what,...) @@ -36,13 +45,20 @@ function defer(what,...) end end -tableMerge(mychest,{ +function maybeString(stack) + if type(stack)=='string' then return stack + elseif type(stack)=='table' then return dump(stack) + else return stack:to_string() + end +end + +mychest = tableMergeImmutable(defaultChest,{ description = "Digiline Chest", digiline = { - receptor = { - rules=digiline.rules.default - }, - effector = {} + receptor = {}, + effector = { + action = function(pos,node,channel,msg) end + } }, on_construct = function(pos) defaultChest.on_construct(pos) @@ -52,11 +68,14 @@ tableMerge(mychest,{ end, on_receive_fields = function(pos, formname, fields, sender) minetest.get_meta(pos):set_string("channel",fields.channel) - return defer(defaultChest.on_receive_fields, pos, formname, fields, sender) + return defer(defaultChest.on_receive_fields, pos, formname, fields, sender) end, - tube = { - -- note: mese filters cannot put part of a stack in the destination. + tube = tableMergeImmutable(defaultChest.tube, { + -- note: mese filters cannot put part of a stack in the destination. -- space for 50 coal with 99 added will pop out 99, not 49. + connects = function(i,param2) + return not pipeworks.connects.facingFront(i,param2) + end, insert_object = function(pos, node, stack, direction) local leftover = defaultChest.tube.insert_object(pos,node,stack,direction) local count = leftover:get_count() @@ -64,8 +83,8 @@ tableMerge(mychest,{ local derpstack = stack:get_name()..' 1' if not defaultChest.tube.can_insert(pos, node, derpstack, direction) then -- when you can't put a single more of whatever you just put, - -- you'll get a put for it, then a full - sendMessage(pos,"full "..stack:to_string()..' '..tostring(count)) + -- you'll get a put for it, then a full + sendMessage(pos,"full "..maybeString(stack)..' '..tostring(count)) end else -- this happens when the chest has received two stacks in a row and @@ -73,54 +92,53 @@ tableMerge(mychest,{ -- You get a put for the first stack, a put for the second -- and then a overflow with the first in stack and the second in leftover -- and NO full? - sendMessage(pos,"overflow "..stack:to_string()..' '..tostring(count)) + sendMessage(pos,"overflow "..maybeString(stack)..' '..tostring(count)) end return leftover end, can_insert = function(pos, node, stack, direction) local can = defaultChest.tube.can_insert(pos, node, stack, direction) if can then - sendMessage(pos,"put "..stack:to_string()) + sendMessage(pos,"put "..maybeString(stack)) else -- overflow and lost means that items are gonna be out as entities :/ - sendMessage(pos,"lost "..stack:to_string()) + sendMessage(pos,"lost "..maybeString(stack)) end return can end, - input_inventory=defaultChest.input_inventory - }, + }), allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if not mychest.can_insert(pos,nil,stack,nil) then - sendMessage(pos,"uoverflow "..stack:to_string()) + if not mychest.tube.can_insert(pos,nil,stack,nil) then + sendMessage(pos,"uoverflow "..maybeString(stack)) end - local ret = defer(defaultChest.allow_metadata_inventory_put, pos, listname, index, stack, player) + local ret = defer(defaultChest.allow_metadata_inventory_put, pos, listname, index, stack, player) if ret then return ret end return stack:get_count() end, on_metadata_inventory_put = function(pos, listname, index, stack, player) local channel = minetest.get_meta(pos):get_string("channel") - local send = function(msg) + local send = function(msg) sendMessage(pos,msg,channel) end -- direction is only for furnaces -- as the item has already been put, can_insert should return false if the chest is now full. local derpstack = stack:get_name()..' 1' - if mychest.can_insert(pos,nil,derpstack,nil) then - send("uput "..stack:to_string()) + if mychest.tube.can_insert(pos,nil,derpstack,nil) then + send("uput "..maybeString(stack)) else - send("ufull "..stack:to_string()) + send("ufull "..maybeString(stack)) end return defer(defaultChest.on_metadata_inventory_put, pos, listname, index, stack, player) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) - sendMessage(pos,"utake "..stack:to_string()) + sendMessage(pos,"utake "..maybeString(stack)) return defaultChest.on_metadata_inventory_take(pos, listname, index, stack, player) end }) -if mychest.can_insert == nil then +if mychest.tube.can_insert == nil then -- we can use the can_insert function from pipeworks, but will duplicate if not found. - mychest.can_insert = function(pos,node,stack,direction) + mychest.tube.can_insert = function(pos,node,stack,direction) local meta=minetest.get_meta(pos) local inv=meta:get_inventory() return inv:room_for_item("main",stack)