forked from minetest-mods/digilines
		
	Chest not throwing away pipeworks info
tube = {...} = bad
tube = tableMergeImmutable(defaultChest.tube,{...}) = good
There was also a thing where the stack was sometimes already
stringified.
			
			
This commit is contained in:
		| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user