54 lines
1.8 KiB
Lua
54 lines
1.8 KiB
Lua
|
|
local META_SUPPLIER_LISTNAME = "suptarlist"
|
|
|
|
function logistica.get_supplier_target(pos)
|
|
local node = minetest.get_node_or_nil(pos)
|
|
if not node then return nil end
|
|
local shift = logistica.get_rot_directions(node.param2).backward
|
|
if not shift then return nil end
|
|
return {x = (pos.x + shift.x),
|
|
y = (pos.y + shift.y),
|
|
z = (pos.z + shift.z)}
|
|
end
|
|
|
|
function logistica.get_supplier_target_list(pos)
|
|
logistica.load_position(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
return meta:get_string(META_SUPPLIER_LISTNAME)
|
|
end
|
|
|
|
function logistica.set_supplier_target_list(pos, listName)
|
|
logistica.load_position(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string(META_SUPPLIER_LISTNAME, listName)
|
|
end
|
|
|
|
function logistica.get_supplier_max_item_transfer(pos)
|
|
local node = minetest.get_node_or_nil(pos)
|
|
if not node then return 0 end
|
|
local def = minetest.registered_nodes[node.name]
|
|
if def and def.logistica and def.logistica.supplier_transfer_rate then
|
|
return def.logistica.supplier_transfer_rate
|
|
else
|
|
return 0
|
|
end
|
|
end
|
|
|
|
-- returns an ItemStack of how many items were taken
|
|
function logistica.take_item_from_supplier(pos, stack)
|
|
logistica.load_position(pos)
|
|
if not logistica.is_machine_on(pos) then return ItemStack("") end
|
|
local meta = minetest.get_meta(pos)
|
|
local canTake = math.min(stack:get_count(), logistica.get_supplier_max_item_transfer(pos))
|
|
local copyStack = ItemStack(stack)
|
|
copyStack:set_count(canTake)
|
|
|
|
local targetListName = meta:get_string(META_SUPPLIER_LISTNAME)
|
|
local targetPos = logistica.get_supplier_target(pos)
|
|
logistica.load_position(targetPos)
|
|
local targetInv = minetest.get_meta(targetPos):get_inventory()
|
|
local targetList = targetInv:get_list(targetListName)
|
|
if not targetList then copyStack:set_count(0); return copyStack end
|
|
return targetInv:remove_item(targetListName, copyStack)
|
|
end
|