Add exporter, add filters to importer, add screenshot
This commit is contained in:
parent
cd2e72c307
commit
aeee127113
@ -1,6 +1,9 @@
|
|||||||
# Storagetest
|
# Storagetest
|
||||||
|
![](screenshot.png)
|
||||||
A solution to your hoarding addiction. In [Minetest](http://minetest.net).
|
A solution to your hoarding addiction. In [Minetest](http://minetest.net).
|
||||||
|
|
||||||
|
This mod adds devices into the game that allow you to build a mass storage system with ease.
|
||||||
|
|
||||||
This mod is an attempt at re-creating [Refined Storage](https://github.com/raoulvdberge/refinedstorage)
|
This mod is an attempt at re-creating [Refined Storage](https://github.com/raoulvdberge/refinedstorage)
|
||||||
in Minetest. I can't promise that this will ever be completed, but we'll see. Help is always welcome.
|
in Minetest. I can't promise that this will ever be completed, but we'll see. Help is always welcome.
|
||||||
|
|
||||||
|
11
network.lua
11
network.lua
@ -447,9 +447,14 @@ function storagetest.network.take_item(network_id, stack)
|
|||||||
local storage_nodes = storagetest.network.get_storage_devices(network_id)
|
local storage_nodes = storagetest.network.get_storage_devices(network_id)
|
||||||
|
|
||||||
for _,pos in pairs(storage_nodes) do
|
for _,pos in pairs(storage_nodes) do
|
||||||
local success = storagetest.take_stack(pos, stack)
|
local success, stacki = storagetest.take_stack(pos, stack)
|
||||||
if success then
|
if success and stacki then
|
||||||
return success
|
if stacki:get_count() == stack:get_count() then
|
||||||
|
return success, stacki
|
||||||
|
else
|
||||||
|
stack:set_count(stack:get_count() - stacki:get_count())
|
||||||
|
return storagetest.network.take_item(network_id, stack)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
158
nodes/bus.lua
158
nodes/bus.lua
@ -1,5 +1,70 @@
|
|||||||
-- Storagetest cabling
|
-- Storagetest 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
|
||||||
|
|
||||||
minetest.register_node("storagetest:import_bus", {
|
minetest.register_node("storagetest:import_bus", {
|
||||||
description = "Import Bus",
|
description = "Import Bus",
|
||||||
tiles = {
|
tiles = {
|
||||||
@ -16,11 +81,21 @@ minetest.register_node("storagetest:import_bus", {
|
|||||||
},
|
},
|
||||||
on_construct = function (pos)
|
on_construct = function (pos)
|
||||||
storagetest.network.clear_networks(pos)
|
storagetest.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,
|
end,
|
||||||
on_destruct = storagetest.network.clear_networks,
|
on_destruct = storagetest.network.clear_networks,
|
||||||
|
on_receive_fields = flip_filter,
|
||||||
storagetest_run = function (pos, _, controller)
|
storagetest_run = function (pos, _, controller)
|
||||||
local network = minetest.hash_node_position(controller)
|
local network = minetest.hash_node_position(controller)
|
||||||
local node = minetest.get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
local front = storagetest.front(pos, node.param2)
|
local front = storagetest.front(pos, node.param2)
|
||||||
|
|
||||||
local front_node = minetest.get_node(front)
|
local front_node = minetest.get_node(front)
|
||||||
@ -30,11 +105,22 @@ minetest.register_node("storagetest:import_bus", {
|
|||||||
local front_def = minetest.registered_nodes[front_node.name]
|
local front_def = minetest.registered_nodes[front_node.name]
|
||||||
if front_inv:get_list("main") then
|
if front_inv:get_list("main") then
|
||||||
local list = front_inv:get_list("main")
|
local list = front_inv:get_list("main")
|
||||||
|
local filter_type = meta:get_int("filter")
|
||||||
for index, stack in pairs(list) do
|
for index, stack in pairs(list) do
|
||||||
if not stack:is_empty() then
|
if not stack:is_empty() then
|
||||||
local allow_count = 0
|
local can_take = false
|
||||||
local copystack = front_inv:get_stack("main", index)
|
local copystack = front_inv:get_stack("main", index)
|
||||||
copystack:set_count(1)
|
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
|
||||||
|
|
||||||
|
if can_take then
|
||||||
local success, outst = storagetest.network.insert_item(network, copystack)
|
local success, outst = storagetest.network.insert_item(network, copystack)
|
||||||
if success then
|
if success then
|
||||||
stack:set_count(stack:get_count() - 1)
|
stack:set_count(stack:get_count() - 1)
|
||||||
@ -43,10 +129,80 @@ minetest.register_node("storagetest:import_bus", {
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
front_inv:set_list("main", list)
|
front_inv:set_list("main", list)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end,
|
||||||
|
allow_metadata_inventory_take = inventory_ghost_take,
|
||||||
|
allow_metadata_inventory_put = inventory_ghost_put
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_node("storagetest:export_bus", {
|
||||||
|
description = "Export Bus",
|
||||||
|
tiles = {
|
||||||
|
"storagetest_machine_block.png", "storagetest_machine_block.png", "storagetest_machine_block.png",
|
||||||
|
"storagetest_machine_block.png", "storagetest_machine_block.png", "storagetest_export.png",
|
||||||
|
},
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
is_ground_content = false,
|
||||||
|
groups = {
|
||||||
|
storagetest_distributor = 1,
|
||||||
|
storagetest_device = 1,
|
||||||
|
cracky = 2,
|
||||||
|
oddly_breakable_by_hand = 2
|
||||||
|
},
|
||||||
|
on_construct = function (pos)
|
||||||
|
storagetest.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,
|
||||||
|
on_destruct = storagetest.network.clear_networks,
|
||||||
|
storagetest_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 = storagetest.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_def = minetest.registered_nodes[front_node.name]
|
||||||
|
if front_inv:get_list("main") then
|
||||||
|
local items = storagetest.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
|
end
|
||||||
|
|
||||||
|
if not front_inv:room_for_item("main", stack) then
|
||||||
|
can_take = false
|
||||||
|
end
|
||||||
|
|
||||||
|
if can_take then
|
||||||
|
local success, gotten = storagetest.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
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
allow_metadata_inventory_take = inventory_ghost_take,
|
||||||
|
allow_metadata_inventory_put = inventory_ghost_put
|
||||||
})
|
})
|
||||||
|
|
||||||
storagetest.devices["storagetest:import_bus"] = true
|
storagetest.devices["storagetest:import_bus"] = true
|
||||||
|
storagetest.devices["storagetest:export_bus"] = true
|
||||||
|
@ -114,6 +114,7 @@ function storagetest.take_stack(pos, stack)
|
|||||||
local invs = storagetest.get_all_inventories(pos)
|
local invs = storagetest.get_all_inventories(pos)
|
||||||
if not invs then return {} end
|
if not invs then return {} end
|
||||||
local tabl = {}
|
local tabl = {}
|
||||||
|
local stack_ret
|
||||||
local success = false
|
local success = false
|
||||||
|
|
||||||
for _,diskptr in pairs(invs) do
|
for _,diskptr in pairs(invs) do
|
||||||
@ -121,9 +122,15 @@ function storagetest.take_stack(pos, stack)
|
|||||||
if invref then
|
if invref then
|
||||||
local list = invref:get_list("main")
|
local list = invref:get_list("main")
|
||||||
for i, stacki in pairs(list) do
|
for i, stacki in pairs(list) do
|
||||||
if stacki:get_name() == stack:get_name() and stacki:get_count() == stack:get_count() and stacki:get_wear() == stack:get_wear() then
|
if stacki:get_name() == stack:get_name() and stacki:get_wear() == stack:get_wear() then
|
||||||
success = true
|
success = true
|
||||||
|
if stack:get_count() >= stacki:get_count() then
|
||||||
|
stack:set_count(stacki:get_count())
|
||||||
stacki:clear()
|
stacki:clear()
|
||||||
|
else
|
||||||
|
stacki:set_count(stacki:get_count() - stack:get_count())
|
||||||
|
end
|
||||||
|
stack_ret = stack
|
||||||
list[i] = stacki
|
list[i] = stacki
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
@ -132,7 +139,7 @@ function storagetest.take_stack(pos, stack)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return success
|
return success, stack_ret
|
||||||
end
|
end
|
||||||
|
|
||||||
function storagetest.get_all_inventories(pos)
|
function storagetest.get_all_inventories(pos)
|
||||||
|
@ -54,9 +54,9 @@ function storagetest.grid.get_formspec(scroll_lvl, pages, craft_inv)
|
|||||||
if craft_inv then
|
if craft_inv then
|
||||||
title = "Crafting Grid"
|
title = "Crafting Grid"
|
||||||
height = 3
|
height = 3
|
||||||
craft = "list[current_player;craft;1.5,4;3,3;]"..
|
craft = "list[current_player;craft;1.5,3.8;3,3;]"..
|
||||||
"image[4.5,5;1,1;gui_furnace_arrow_bg.png^[transformR270]"..
|
"image[4.5,4.8;1,1;gui_furnace_arrow_bg.png^[transformR270]"..
|
||||||
"list[current_player;craftpreview;5.5,5;1,1;]"
|
"list[current_player;craftpreview;5.5,4.8;1,1;]"
|
||||||
end
|
end
|
||||||
|
|
||||||
local scroll = ""
|
local scroll = ""
|
||||||
|
BIN
screenshot.png
Normal file
BIN
screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 248 KiB |
Loading…
Reference in New Issue
Block a user