-- 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