Chests sorting by Zefram_Fysh

This commit is contained in:
RealBadAngel 2014-05-01 09:32:01 +02:00
parent 00d7c9bdea
commit 5c689acc22
8 changed files with 123 additions and 32 deletions

@ -26,6 +26,8 @@ minetest.register_craft({
technic.chests:register("Copper", {
width = 10,
sort = true,
autosort = true,
infotext = false,
color = false,
locked = false,
@ -33,6 +35,8 @@ technic.chests:register("Copper", {
technic.chests:register("Copper", {
width = 10,
sort = true,
autosort = true,
infotext = false,
color = false,
locked = true,

@ -27,6 +27,8 @@ minetest.register_craft({
technic.chests:register("Gold", {
width = 12,
sort = true,
autosort = true,
infotext = true,
color = true,
locked = false,
@ -34,6 +36,8 @@ technic.chests:register("Gold", {
technic.chests:register("Gold", {
width = 12,
sort = true,
autosort = true,
infotext = true,
color = true,
locked = true,

@ -27,6 +27,8 @@ minetest.register_craft({
technic.chests:register("Iron", {
width = 9,
sort = true,
autosort = false,
infotext = false,
color = false,
locked = false,
@ -34,6 +36,8 @@ technic.chests:register("Iron", {
technic.chests:register("Iron", {
width = 9,
sort = true,
autosort = false,
infotext = false,
color = false,
locked = true,

@ -33,3 +33,8 @@ Iron = Eisen
Mithril = Mithril
Silver = Silber
# Sorting
Sort =
Auto-sort is %s =
Off =
On =

@ -31,3 +31,8 @@ Iron =
Mithril =
Silver =
# Sorting
Sort =
Auto-sort is %s =
Off =
On =

@ -26,6 +26,8 @@ minetest.register_craft({
technic.chests:register("Mithril", {
width = 13,
sort = true,
autosort = true,
infotext = false,
color = false,
locked = false,
@ -33,6 +35,8 @@ technic.chests:register("Mithril", {
technic.chests:register("Mithril", {
width = 13,
sort = true,
autosort = true,
infotext = false,
color = false,
locked = true,

@ -56,50 +56,111 @@ local function check_color_buttons(pos, meta, chest_name, fields)
end
end
local function get_receive_fields(name, data)
if not data.infotext and not data.color then
return nil
local function set_formspec(pos, data, page)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
local formspec = data.formspec
if data.autosort then
local status = meta:get_int("autosort")
formspec = formspec.."button[2,5.1;3,0.8;autosort_to_"..(1-status)..";"..S("Auto-sort is %s"):format(status == 1 and S("On") or S("Off")).."]"
end
local lname = name:lower()
return function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
local page = "main"
if fields.edit_infotext then
page = "edit_infotext"
end
if fields.infotext_box then
meta:set_string("infotext", fields.infotext_box)
end
local formspec = data.formspec
if data.infotext then
local formspec_infotext = minetest.formspec_escape(meta:get_string("infotext"))
if page == "main" and data.infotext then
if page == "main" then
formspec = formspec.."image_button[2.1,0.1;0.8,0.8;"
.."technic_pencil_icon.png;edit_infotext;]"
.."label[3,0;"..formspec_infotext.."]"
end
if page == "edit_infotext" then
elseif page == "edit_infotext" then
formspec = formspec.."image_button[2.1,0.1;0.8,0.8;"
.."technic_checkmark_icon.png;save_infotext;]"
.."field[3.3,0.2;4.8,1;"
.."infotext_box;"..S("Edit chest description:")..";"
..formspec_infotext.."]"
end
end
if data.color then
local colorID = meta:get_int("color")
local colorName
if chest_mark_colors[colorID] then
colorName = chest_mark_colors[colorID][2]
else
colorName = S("None")
end
formspec = formspec.."label[8.2,9;"..S("Color Filter: %s"):format(colorName).."]"
end
meta:set_string("formspec", formspec)
end
local function sort_inventory(inv)
local inlist = inv:get_list("main")
local typecnt = {}
local typekeys = {}
for _, st in ipairs(inlist) do
if not st:is_empty() then
local n = st:get_name()
local w = st:get_wear()
local m = st:get_metadata()
local k = string.format("%s %05d %s", n, w, m)
if not typecnt[k] then
typecnt[k] = {
name = n,
wear = w,
metadata = m,
stack_max = st:get_stack_max(),
count = 0,
}
table.insert(typekeys, k)
end
typecnt[k].count = typecnt[k].count + st:get_count()
end
end
table.sort(typekeys)
local outlist = {}
for _, k in ipairs(typekeys) do
local tc = typecnt[k]
while tc.count > 0 do
local c = math.min(tc.count, tc.stack_max)
table.insert(outlist, ItemStack({
name = tc.name,
wear = tc.wear,
metadata = tc.metadata,
count = c,
}))
tc.count = tc.count - c
end
end
if #outlist > #inlist then return end
while #outlist < #inlist do
table.insert(outlist, ItemStack(nil))
end
inv:set_list("main", outlist)
end
local function get_receive_fields(name, data)
if not data.sort and not data.autosort and not data.infotext and not data.color then
return nil
end
local lname = name:lower()
return function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
local page = "main"
if fields.sort or (data.autosort and fields.quit and meta:get_int("autosort") == 1) then
sort_inventory(meta:get_inventory())
end
if fields.edit_infotext then
page = "edit_infotext"
end
if fields.autosort_to_1 then meta:set_int("autosort", 1) end
if fields.autosort_to_0 then meta:set_int("autosort", 0) end
if fields.infotext_box then
meta:set_string("infotext", fields.infotext_box)
end
if data.color then
-- This sets the node
local nn = "technic:"..lname..(data.locked and "_locked" or "").."_chest"
check_color_buttons(pos, meta, nn, fields)
local colorID = meta:get_int("color")
local colorName
if chest_mark_colors[colorID] then
colorName = chest_mark_colors[colorID][2]
else
colorName = S("None")
end
formspec = formspec.."label[8.2,9;"..S("Color Filter: %s"):format(colorName).."]"
end
meta:set_string("formspec", formspec)
set_formspec(pos, data, page)
end
end
@ -119,6 +180,9 @@ function technic.chests:register(name, data)
"background[-0.19,-0.25;"..width..".4,10.75;ui_form_bg.png]"..
"background[0,1;"..width..",4;technic_"..lname.."_chest_inventory.png]"..
"background[0,6;8,4;ui_main_inventory.png]"
if data.sort then
data.formspec = data.formspec.."button[0,5.1;1,0.8;sort;"..S("Sort").."]"
end
if data.color then
data.formspec = data.formspec..get_color_buttons()
end
@ -154,11 +218,8 @@ function technic.chests:register(name, data)
after_place_node = locked_after_place,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", data.formspec
..(data.color and "label[8.2,9;Color Filter: None" or "")
..(data.infotext and "image_button[2.1,0.1;0.8,0.8;"
.."technic_pencil_icon.png;edit_infotext;]" or ""))
meta:set_string("infotext", S("%s Chest"):format(name))
set_formspec(pos, data, "main")
local inv = meta:get_inventory()
inv:set_size("main", data.width * 4)
end,

@ -26,6 +26,8 @@ minetest.register_craft({
technic.chests:register("Silver", {
width = 11,
sort = true,
autosort = true,
infotext = true,
color = false,
locked = false,
@ -33,6 +35,8 @@ technic.chests:register("Silver", {
technic.chests:register("Silver", {
width = 11,
sort = true,
autosort = true,
infotext = true,
color = false,
locked = true,