logistica-cd2025/logic/supplier.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