summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCy <whatever>2013-10-14 19:34:53 -0700
committerCy <whatever>2013-10-14 19:34:53 -0700
commit31833710506da70022e12511e7bc026891fbdf51 (patch)
tree63f9ea75826743aad98c65a5055ea81fa64331cf
parent21048dc5ac5cb740f5bb4692c0cbf1192f6d8902 (diff)
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.
-rw-r--r--digilines_inventory/chest.lua68
1 files changed, 43 insertions, 25 deletions
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)