103 lines
3.8 KiB
Lua

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