be54e91335
Hide all buttons when no drive in slot, prevents spamming of log when search buttons are clicked with nothing to search. Move search field to the left so as to be in line with the inventory slots and move page number to the right for a more viewable interface due to spacing.
198 lines
6.0 KiB
Lua
198 lines
6.0 KiB
Lua
-- microexpansion/machines.lua
|
|
|
|
local me = microexpansion
|
|
|
|
-- [me chest] Get formspec
|
|
local function chest_formspec(pos, start_id, listname, page_max, query)
|
|
local list
|
|
local page_number = ""
|
|
local buttons = ""
|
|
local query = query or ""
|
|
|
|
if not listname then
|
|
list = "label[3,2;" .. minetest.colorize("red", "No cell!") .. "]"
|
|
else
|
|
list = "list[current_name;" .. listname .. ";0,0.3;8,4;" .. (start_id - 1) .. "]"
|
|
buttons = [[
|
|
button[3.56,4.35;1.8,0.9;tochest;To Drive]
|
|
tooltip[tochest;Move everything from your inventory to the ME drive.]
|
|
button[5.4,4.35;0.8,0.9;prev;<]
|
|
button[7.25,4.35;0.8,0.9;next;>]
|
|
tooltip[prev;Previous]
|
|
tooltip[next;Next]
|
|
field[0.29,4.6;2.2,1;filter;;]]..query..[[]
|
|
button[2.1,4.5;0.8,0.5;search;?]
|
|
button[2.75,4.5;0.8,0.5;clear;X]
|
|
tooltip[search;Search]
|
|
tooltip[clear;Reset]
|
|
]]
|
|
end
|
|
if page_max then
|
|
page_number = "label[6.15,4.5;" .. math.floor((start_id / 32)) + 1 ..
|
|
"/" .. page_max .."]"
|
|
end
|
|
|
|
return [[
|
|
size[9,9.5]
|
|
]]..
|
|
microexpansion.gui_bg ..
|
|
microexpansion.gui_slots ..
|
|
list ..
|
|
[[
|
|
label[0,-0.23;ME Chest]
|
|
list[current_name;cells;8.06,1.8;1,1;]
|
|
list[current_player;main;0,5.5;8,1;]
|
|
list[current_player;main;0,6.73;8,3;8]
|
|
listring[current_name;main]
|
|
listring[current_player;main]
|
|
field_close_on_enter[filter;false]
|
|
]]..
|
|
page_number ..
|
|
buttons
|
|
end
|
|
|
|
-- [me chest] Register node
|
|
microexpansion.register_node("chest", {
|
|
description = "ME Chest",
|
|
usedfor = "Can interact with items in ME storage cells",
|
|
tiles = {
|
|
"chest_top",
|
|
"chest_top",
|
|
"chest_side",
|
|
"chest_side",
|
|
"chest_side",
|
|
"chest_front",
|
|
},
|
|
is_ground_content = false,
|
|
groups = { cracky = 1 },
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", chest_formspec(pos, 1))
|
|
meta:set_string("inv_name", "none")
|
|
meta:set_int("page", 1)
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("cells", 1)
|
|
end,
|
|
can_dig = function(pos, player)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
return inv:is_empty("main")
|
|
end,
|
|
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
if listname == "main" then
|
|
return stack:get_count()
|
|
elseif listname == "cells" then
|
|
if minetest.get_item_group(stack:get_name(), "microexpansion_cell") ~= 0 then
|
|
return 1
|
|
else
|
|
return 0
|
|
end
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
if listname == "main" then
|
|
local inv = minetest.get_meta(pos):get_inventory()
|
|
inv:remove_item(listname, stack)
|
|
inv:add_item(listname, stack)
|
|
microexpansion.cell_desc(inv, "cells", 1)
|
|
elseif listname == "cells" then
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local items = minetest.deserialize(stack:get_meta():get_string("items"))
|
|
local size = me.get_cell_size(stack:get_name())
|
|
local page_max = me.int_to_pagenum(size) + 1
|
|
inv:set_size("main", me.int_to_stacks(size))
|
|
if items then
|
|
inv:set_list("main", items)
|
|
end
|
|
meta:set_string("inv_name", "main")
|
|
meta:set_string("formspec", chest_formspec(pos, 1, "main", page_max))
|
|
end
|
|
end,
|
|
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
local inv = minetest.get_meta(pos):get_inventory()
|
|
if listname == "search" then
|
|
inv:remove_item("main", stack)
|
|
end
|
|
microexpansion.cell_desc(inv, "cells", 1)
|
|
end,
|
|
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
if listname == "cells" then
|
|
local t = minetest.get_us_time()
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local tab = {}
|
|
local new_stack = inv:get_stack(listname, 1)
|
|
local item_meta = new_stack:get_meta()
|
|
for i = 1, inv:get_size("main") do
|
|
if inv:get_stack("main", i):get_name() ~= "" then
|
|
tab[#tab + 1] = inv:get_stack("main", i):to_string()
|
|
end
|
|
end
|
|
item_meta:set_string("items", minetest.serialize(tab))
|
|
inv:set_stack(listname, 1, new_stack)
|
|
inv:set_size("main", 0)
|
|
meta:set_int("page", 1)
|
|
meta:set_string("formspec", chest_formspec(pos, 1))
|
|
return new_stack:get_count()
|
|
end
|
|
return stack:get_count()
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local meta = minetest.get_meta(pos)
|
|
local page = meta:get_int("page")
|
|
local inv_name = meta:get_string("inv_name")
|
|
local inv = meta:get_inventory()
|
|
local page_max = math.floor(inv:get_size("main") / 32) + 1
|
|
local cell_stack = inv:get_stack("cells", 1)
|
|
if inv_name == "none" then
|
|
return
|
|
end
|
|
if fields.next then
|
|
if page + 32 > inv:get_size(inv_name) then
|
|
return
|
|
end
|
|
meta:set_int("page", page + 32)
|
|
meta:set_string("formspec", chest_formspec(pos, page + 32, inv_name, page_max))
|
|
elseif fields.prev then
|
|
if page - 32 < 1 then
|
|
return
|
|
end
|
|
meta:set_int("page", page - 32)
|
|
meta:set_string("formspec", chest_formspec(pos, page - 32, inv_name, page_max))
|
|
elseif fields.search or fields.key_enter_field == "filter" then
|
|
inv:set_size("search", 0)
|
|
if fields.filter == "" then
|
|
meta:set_int("page", 1)
|
|
meta:set_string("inv_name", "main")
|
|
meta:set_string("formspec", chest_formspec(pos, 1, "main", page_max))
|
|
else
|
|
local tab = {}
|
|
for i = 1, microexpansion.get_cell_size(cell_stack:get_name()) do
|
|
local match = inv:get_stack("main", i):get_name():find(fields.filter)
|
|
if match then
|
|
tab[#tab + 1] = inv:get_stack("main", i)
|
|
end
|
|
end
|
|
inv:set_list("search", tab)
|
|
meta:set_int("page", 1)
|
|
meta:set_string("inv_name", "search")
|
|
meta:set_string("formspec", chest_formspec(pos, 1, "search", page_max, fields.filter))
|
|
end
|
|
elseif fields.clear then
|
|
inv:set_size("search", 0)
|
|
meta:set_int("page", 1)
|
|
meta:set_string("inv_name", "main")
|
|
meta:set_string("formspec", chest_formspec(pos, 1, "main", page_max))
|
|
elseif fields.tochest then
|
|
local pinv = minetest.get_inventory({type="player", name=sender:get_player_name()})
|
|
microexpansion.move_inv({ inv=pinv, name="main" }, { inv=inv, name="main" })
|
|
end
|
|
end,
|
|
})
|