103 lines
3.8 KiB
Lua
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
|