278 lines
8.3 KiB
Lua
278 lines
8.3 KiB
Lua
-- holostorage cabling
|
|
|
|
local function get_formspec(title, filter)
|
|
local fl = "Blacklist"
|
|
|
|
if filter ~= nil then
|
|
if filter == 1 then
|
|
fl = "Whitelist"
|
|
end
|
|
else
|
|
fl = nil
|
|
end
|
|
|
|
if fl then
|
|
fl = "button[0,2.5;2,1;filter;"..fl.."]"
|
|
else
|
|
fl = ""
|
|
end
|
|
|
|
return "size[8,8.5]"..
|
|
default.gui_bg..
|
|
default.gui_bg_img..
|
|
default.gui_slots..
|
|
"label[0,0;"..title.."]"..
|
|
"list[context;filter;0,1.5;8,1;]"..
|
|
"list[current_player;main;0,4.25;8,1;]"..
|
|
"list[current_player;main;0,5.5;8,3;8]"..
|
|
fl..
|
|
"listring[context;filter]"..
|
|
"listring[current_player;main]"..
|
|
default.get_hotbar_bg(0, 4.25)
|
|
end
|
|
|
|
local function inventory_ghost_put(pos, listname, index, stack, player)
|
|
if minetest.is_protected(pos, player:get_player_name()) then
|
|
return 0
|
|
end
|
|
|
|
local inv = minetest.get_meta(pos):get_inventory()
|
|
stack:set_count(1)
|
|
inv:set_stack(listname, index, stack)
|
|
return 0
|
|
end
|
|
|
|
local function inventory_ghost_take(pos, listname, index, stack, player)
|
|
if minetest.is_protected(pos, player:get_player_name()) then
|
|
return 0
|
|
end
|
|
|
|
local inv = minetest.get_meta(pos):get_inventory()
|
|
inv:set_stack(listname, index, ItemStack(nil))
|
|
return 0
|
|
end
|
|
|
|
local function flip_filter(pos, form, fields, player)
|
|
local node = minetest.get_node(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local ndef = minetest.registered_nodes[node.name].description
|
|
if fields["filter"] then
|
|
local f = meta:get_int("filter")
|
|
if f == 0 then f = 1 else f = 0 end
|
|
meta:set_int("filter", f)
|
|
|
|
meta:set_string("formspec", get_formspec(ndef, f))
|
|
end
|
|
end
|
|
|
|
-- Import Bus
|
|
minetest.register_node("holostorage:import_bus", {
|
|
description = "Import Bus",
|
|
tiles = {
|
|
"holostorage_machine_block.png", "holostorage_machine_block.png", "holostorage_machine_block.png",
|
|
"holostorage_machine_block.png", "holostorage_machine_block.png", "holostorage_import.png",
|
|
},
|
|
paramtype2 = "facedir",
|
|
is_ground_content = false,
|
|
groups = {
|
|
holostorage_distributor = 1,
|
|
holostorage_device = 1,
|
|
cracky = 2,
|
|
oddly_breakable_by_hand = 2
|
|
},
|
|
on_construct = function (pos)
|
|
holostorage.network.clear_networks(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", get_formspec("Import Bus", 0))
|
|
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("filter", 8)
|
|
|
|
meta:set_int("filter", 0)
|
|
end,
|
|
after_dig_node = holostorage.network.clear_networks,
|
|
on_receive_fields = flip_filter,
|
|
holostorage_run = function (pos, _, controller)
|
|
local network = minetest.hash_node_position(controller)
|
|
local node = minetest.get_node(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local front = holostorage.front(pos, node.param2)
|
|
|
|
local front_node = minetest.get_node(front)
|
|
if front_node.name ~= "air" then
|
|
local front_meta = minetest.get_meta(front)
|
|
local front_inv = front_meta:get_inventory()
|
|
local front_pos = minetest.pos_to_string(front)
|
|
local front_def = minetest.registered_nodes[front_node.name]
|
|
if front_inv:get_list("main") then
|
|
local list = front_inv:get_list("main")
|
|
local filter_type = meta:get_int("filter")
|
|
for index, stack in pairs(list) do
|
|
if not stack:is_empty() then
|
|
local can_take = false
|
|
local copystack = front_inv:get_stack("main", index)
|
|
copystack:set_count(1)
|
|
|
|
if filter_type == 0 and inv:contains_item("filter", copystack) then
|
|
can_take = false
|
|
elseif filter_type == 1 and inv:contains_item("filter", copystack) then
|
|
can_take = true
|
|
else
|
|
can_take = true
|
|
end
|
|
|
|
meta:set_string("infotext", "Importing from Inventory at "..front_pos)
|
|
|
|
if can_take then
|
|
local success, outst = holostorage.network.insert_item(network, copystack)
|
|
if success then
|
|
stack:set_count(stack:get_count() - 1)
|
|
front_inv:set_stack("main", index, stack)
|
|
break -- Don't take more than one per cycle
|
|
end
|
|
end
|
|
end
|
|
end
|
|
front_inv:set_list("main", list)
|
|
return
|
|
end
|
|
end
|
|
meta:set_string("infotext", "No Inventory Found")
|
|
end,
|
|
allow_metadata_inventory_take = inventory_ghost_take,
|
|
allow_metadata_inventory_put = inventory_ghost_put
|
|
})
|
|
|
|
-- Export Bus
|
|
minetest.register_node("holostorage:export_bus", {
|
|
description = "Export Bus",
|
|
tiles = {
|
|
"holostorage_machine_block.png", "holostorage_machine_block.png", "holostorage_machine_block.png",
|
|
"holostorage_machine_block.png", "holostorage_machine_block.png", "holostorage_export.png",
|
|
},
|
|
paramtype2 = "facedir",
|
|
is_ground_content = false,
|
|
groups = {
|
|
holostorage_distributor = 1,
|
|
holostorage_device = 1,
|
|
cracky = 2,
|
|
oddly_breakable_by_hand = 2
|
|
},
|
|
on_construct = function (pos)
|
|
holostorage.network.clear_networks(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", get_formspec("Export Bus"))
|
|
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("filter", 8)
|
|
end,
|
|
after_dig_node = holostorage.network.clear_networks,
|
|
holostorage_run = function (pos, _, controller)
|
|
local network = minetest.hash_node_position(controller)
|
|
local node = minetest.get_node(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local front = holostorage.front(pos, node.param2)
|
|
|
|
local front_node = minetest.get_node(front)
|
|
if front_node.name ~= "air" then
|
|
local front_meta = minetest.get_meta(front)
|
|
local front_pos = minetest.pos_to_string(front)
|
|
local front_inv = front_meta:get_inventory()
|
|
local front_def = minetest.registered_nodes[front_node.name]
|
|
if front_inv:get_list("main") then
|
|
local items = holostorage.network.get_storage_inventories(network)
|
|
for index, stack in pairs(items) do
|
|
if not stack:is_empty() then
|
|
local can_take = false
|
|
stack:set_count(1)
|
|
|
|
if inv:contains_item("filter", stack) then
|
|
can_take = true
|
|
end
|
|
|
|
if not front_inv:room_for_item("main", stack) then
|
|
can_take = false
|
|
meta:set_string("infotext", "Inventory full")
|
|
end
|
|
|
|
meta:set_string("infotext", "Exporting to Inventory at "..front_pos)
|
|
|
|
if can_take then
|
|
local success, gotten = holostorage.network.take_item(network, stack)
|
|
if success then
|
|
front_inv:add_item("main", gotten)
|
|
break -- Don't take more than one per cycle
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return
|
|
end
|
|
end
|
|
meta:set_string("infotext", "No Inventory Found")
|
|
end,
|
|
allow_metadata_inventory_take = inventory_ghost_take,
|
|
allow_metadata_inventory_put = inventory_ghost_put
|
|
})
|
|
|
|
-- External Storage Bus
|
|
|
|
-- Export Bus
|
|
minetest.register_node("holostorage:external_storage_bus", {
|
|
description = "External Storage Bus",
|
|
tiles = {
|
|
"holostorage_machine_block.png", "holostorage_machine_block.png", "holostorage_machine_block.png",
|
|
"holostorage_machine_block.png", "holostorage_machine_block.png", "holostorage_external.png",
|
|
},
|
|
paramtype2 = "facedir",
|
|
is_ground_content = false,
|
|
groups = {
|
|
holostorage_distributor = 1,
|
|
holostorage_device = 1,
|
|
holostorage_storage = 1,
|
|
cracky = 2,
|
|
oddly_breakable_by_hand = 2
|
|
},
|
|
on_construct = function (pos)
|
|
holostorage.network.clear_networks(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("inv_pos", "")
|
|
meta:set_string("inv_name", "")
|
|
end,
|
|
after_dig_node = holostorage.network.clear_networks,
|
|
on_destruct = function (pos)
|
|
local node = minetest.get_node(pos)
|
|
local front = holostorage.front(pos, node.param2)
|
|
minetest.forceload_free_block(front)
|
|
end,
|
|
holostorage_run = function (pos, _, controller)
|
|
local node = minetest.get_node(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local front = holostorage.front(pos, node.param2)
|
|
|
|
local front_node = minetest.get_node(front)
|
|
if front_node.name ~= "air" then
|
|
local front_meta = minetest.get_meta(front)
|
|
local front_inv = front_meta:get_inventory()
|
|
if front_inv:get_list("main") then
|
|
local pos_str = minetest.pos_to_string(front)
|
|
minetest.forceload_block(front)
|
|
meta:set_string("infotext", "Serving Inventory at "..pos_str)
|
|
meta:set_string("inv_pos", pos_str)
|
|
meta:set_string("inv_name", "main")
|
|
end
|
|
return
|
|
end
|
|
meta:set_string("infotext", "No Inventory Found")
|
|
meta:set_string("inv_pos", "")
|
|
end,
|
|
allow_metadata_inventory_take = inventory_ghost_take,
|
|
allow_metadata_inventory_put = inventory_ghost_put
|
|
})
|
|
|
|
holostorage.devices["holostorage:import_bus"] = true
|
|
holostorage.devices["holostorage:export_bus"] = true
|
|
holostorage.devices["holostorage:external_storage_bus"] = true
|