function technic.chests.send_digiline_message(pos, event, player, items) local set_channel = minetest.get_meta(pos):get_string("channel") local player_name = player and player:get_player_name() or "" digilines.receptor_send(pos, digilines.rules.default, set_channel, { event = event, items = items, player = player_name, pos = pos }) end local function item_matches(item, stack) -- Same macthing as pipeworks filter injector local name = stack:get_name() local wear = stack:get_wear() return (not item.name or name == item.name) and (not item.group or (type(item.group) == "string" and minetest.get_item_group(name, item.group) ~= 0)) and (not item.wear or (type(item.wear) == "number" and wear == item.wear) or (type(item.wear) == "table" and (not item.wear[1] or (type(item.wear[1]) == "number" and item.wear[1] <= wear)) and (not item.wear[2] or (type(item.wear[2]) == "number" and wear < item.wear[2])))) and (not item.metadata or (type(item.metadata) == "string" and stack:get_metadata() == item.metadata)) end function technic.chests.digiline_effector(pos, _, channel, msg) local meta = minetest.get_meta(pos) local set_channel = meta:get_string("channel") if channel ~= set_channel then return end if type(msg) ~= "table" or not msg.command then return end local inv = meta:get_inventory() if msg.command == "sort" then technic.chests.sort_inv(inv, meta:get_int("sort_mode")) elseif msg.command == "is_empty" then local empty = inv:is_empty("main") digilines.receptor_send(pos, digilines.rules.default, set_channel, empty) elseif msg.command == "get_list" then local inv_table = {} local list = inv:get_list("main") if list then for _,stack in ipairs(list) do if not stack:is_empty() then table.insert(inv_table, stack:get_name().." "..stack:get_count()) else table.insert(inv_table, "") end end end digilines.receptor_send(pos, digilines.rules.default, set_channel, inv_table) elseif msg.command == "get_stack" and type(msg.index) == "number" then local stack = inv:get_stack("main", msg.index) local item = stack:to_table() if item then -- item available at that slot local def = minetest.registered_items[stack:get_name()] item.groups = def and table.copy(def.groups) or {} digilines.receptor_send(pos, digilines.rules.default, set_channel, item) else -- nothing there, return nil digilines.receptor_send(pos, digilines.rules.default, set_channel, nil) end elseif msg.command == "contains_item" and (type(msg.item) == "string" or type(msg.item) == "table") then local contains = inv:contains_item("main", msg.item) digilines.receptor_send(pos, digilines.rules.default, set_channel, contains) elseif msg.command == "room_for_item" and (type(msg.item) == "string" or type(msg.item) == "table") then local room = inv:room_for_item("main", msg.item) digilines.receptor_send(pos, digilines.rules.default, set_channel, room) elseif msg.command == "count_item" and (type(msg.item) == "string" or type(msg.item) == "table") then local count = 0 local list = inv:get_list("main") if list then if type(msg.item) == "string" then local itemstack = ItemStack(msg.item) msg.item = { name = itemstack:get_name(), count = itemstack:get_count(), wear = string.match(msg.item, "%S*:%S*%s%d%s(%d)") and itemstack:get_wear(), metadata = string.match(msg.item, "%S*:%S*%s%d%s%d(%s.*)") and itemstack:get_meta():get_string("") } end for _,stack in pairs(list) do if not stack:is_empty() and item_matches(msg.item, stack) then count = count + stack:get_count() end end if msg.item.count and type(msg.item.count) == "number" and msg.item.count > 1 then count = math.floor(count / msg.item.count) end end digilines.receptor_send(pos, digilines.rules.default, set_channel, count) end end