Redo crafting with sfinv

master
stujones11 2019-05-07 22:41:02 +01:00 committed by Maksim
parent 9cdf0cc470
commit 2f1516c650
49 changed files with 248 additions and 88 deletions

View File

@ -24,27 +24,6 @@ end
local time = 0
sfinv.override_page("sfinv:crafting", {
title = "Crafting",
get = function(self, player, context)
local player_name = player:get_player_name();
local form = [[
listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]
list[current_player;craft;4,1;2,1;1]
list[current_player;craft;4,2;2,1;4]
list[current_player;craftpreview;7.05,1.54;1,1;]
list[detached:split;main;7.99,3.15;1,1;]
image[1.5,0;2,4;default_player2d.png]
]] ..
"list[detached:"..player_name.."_armor;armor;0,0;1,1;]"..
"list[detached:"..player_name.."_armor;armor;0,1;1,1;1]"..
"list[detached:"..player_name.."_armor;armor;0,2;1,1;2]"..
"list[detached:"..player_name.."_armor;armor;0,3;1,1;3]"..
"image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;true;]"
return sfinv.make_formspec(player, context, form , true)
end,
})
armor = {
player_hp = {},
elements = {"head", "torso", "legs", "feet"},

View File

@ -1,2 +1 @@
default
sfinv

View File

@ -0,0 +1,3 @@
default
sfinv
3d_armor?

View File

@ -0,0 +1,72 @@
local show_armor = minetest.get_modpath("3d_armor")
local function item_drop(itemstack, dropper, pos)
if dropper:is_player() then
local v = dropper:get_look_dir()
local p = {x=pos.x, y=pos.y+1.2, z=pos.z}
p.x = p.x+(math.random(1,3)*0.2)
p.z = p.z+(math.random(1,3)*0.2)
local obj = minetest.env:add_item(p, itemstack)
if obj then
v.x = v.x*4
v.y = v.y*4 + 2
v.z = v.z*4
obj:setvelocity(v)
end
else
minetest.add_item(pos, itemstack)
end
return itemstack
end
local function drop_fields(player, name)
local inv = player:get_inventory()
for i,stack in ipairs(inv:get_list(name)) do
item_drop(stack, player, player:get_pos())
stack:clear()
inv:set_stack(name, i, stack)
end
end
sfinv.override_page("sfinv:crafting", {
title = "Crafting",
get = function(self, player, context)
local form = [[
background[-0.19,-0.25;9.41,9.49;crafting_gui_formbg.png]
listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]
list[current_player;craft;4,1;2,1;1]
list[current_player;craft;4,2;2,1;4]
list[current_player;craftpreview;7.05,1.54;1,1;]
list[detached:split;main;7.99,3.15;1,1;]
image[1.5,0;2,4;default_player2d.png]
image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;true]
]]
if show_armor then
local player_name = player:get_player_name()
form = form ..
"list[detached:"..player_name.."_armor;armor;0,0;1,1;]"..
"list[detached:"..player_name.."_armor;armor;0,1;1,1;1]"..
"list[detached:"..player_name.."_armor;armor;0,2;1,1;2]"..
"list[detached:"..player_name.."_armor;armor;0,3;1,1;3]"
end
return sfinv.make_formspec(player, context, form, true)
end,
on_player_receive_fields = function(self, player, context, fields)
if fields.quit then
drop_fields(player, "craft")
end
end,
})
local split_inv = minetest.create_detached_inventory("split", {
allow_move = function(_, _, _, _, _, count, _)
return count
end,
allow_put = function(_, _, _, stack, _)
return stack:get_count() / 2
end,
allow_take = function(_, _, _, stack, _)
return stack:get_count()
end,
})
split_inv:set_size("main", 1)

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -1,6 +1,67 @@
local player_inventory = {}
local inventory_cache = {}
local offset = {}
local hoch = {}
local bg = {}
offset["blocks"] = "-0.29,-0.25"
offset["deco"] = "0.98,-0.25"
offset["mese"] = "2.23,-0.25"
offset["rail"] = "3.495,-0.25"
offset["misc"] = "4.75,-0.25"
offset["all"] = "8.99,-0.25"
offset["food"] = "-0.29,8.12"
offset["tools"] = "0.98,8.12"
offset["combat"] = "2.23,8.12"
offset["brew"] = "4.78,8.12"
offset["matr"] = "3.495,8.12"
offset["inv"] = "8.99,8.12"
hoch["blocks"] = ""
hoch["deco"] = ""
hoch["mese"] = ""
hoch["rail"] = ""
hoch["misc"] = ""
hoch["all"] = ""
hoch["food"] = "^[transformfy"
hoch["tools"] = "^[transformfy"
hoch["combat"] = "^[transformfy"
hoch["brew"] = "^[transformfy"
hoch["matr"] = "^[transformfy"
hoch["inv"] = "^[transformfy"
local dark_bg = "crafting_creative_bg_dark.png"
local function reset_menu_item_bg()
bg["blocks"] = dark_bg
bg["deco"] = dark_bg
bg["mese"] = dark_bg
bg["rail"] = dark_bg
bg["misc"] = dark_bg
bg["all"] = dark_bg
bg["food"] = dark_bg
bg["tools"] = dark_bg
bg["combat"] = dark_bg
bg["brew"] = dark_bg
bg["matr"] = dark_bg
bg["inv"] = dark_bg
end
local function get_item_list(group)
local item_list = {}
for name, def in pairs(minetest.registered_items) do
if (not def.groups.not_in_creative_inventory or
def.groups.not_in_creative_inventory == 0) and
def.description and def.description ~= "" then
if minetest.get_item_group(name, group) > 0 then
item_list[name] = def
end
end
end
return item_list
end
local function init_creative_cache(items)
inventory_cache[items] = {}
local i_cache = inventory_cache[items]
@ -90,6 +151,63 @@ trash:set_size("main", 1)
creative.formspec_add = ""
local function get_creative_formspec(player_name, start_i, pagenum, page, pagemax)
reset_menu_item_bg()
pagenum = math.floor(pagenum) or 1
local slider_height = 4 / pagemax
local slider_pos = slider_height * (pagenum - 1) + 2.2
local formspec = ""
local main_list = "list[detached:creative_" .. player_name ..
";main;0,1.75;9,5;"..tostring(start_i).."]"
local name = "all"
if page ~= nil then name = page end
bg[name] = "crafting_creative_bg.png"
if name == "inv" then
main_list = "image[-0.2,1.7;11.35,2.33;crafting_creative_bg.png]"..
"image[-0.3,0.15;3,4.3;crafting_inventory_armor2.png]"..
"list[current_player;main;0,3.75;9,3;9]"..
"list[detached:"..player_name.."_armor;armor;0.02,1.7;1,1;]"..
"list[detached:"..player_name.."_armor;armor;0.02,2.7;1,1;1]"..
"list[detached:"..player_name.."_armor;armor;0.98,1.7;1,1;2]"..
"list[detached:"..player_name.."_armor;armor;0.98,2.7;1,1;3]"
end
local formspec = "image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;true;]"..
"background[-0.19,-0.25;10.5,9.87;crafting_inventory_creative.png]"..
"bgcolor[#080808BB;true]"..
"listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]"..
"label[-5,-5;"..name.."]"..
"image[" .. offset[name] .. ";1.5,1.44;crafting_creative_active.png"..hoch[name].."]"..
"image_button[-0.1,0;1,1;"..bg["blocks"].."^crafting_creative_build.png;build;]".. --build blocks
"image_button[1.15,0;1,1;"..bg["deco"].."^crafting_creative_deko.png;deco;]".. --decoration blocks
"image_button[2.415,0;1,1;"..bg["mese"].."^crafting_creative_mese.png;mese;]".. --bluestone
"image_button[3.693,0;1,1;"..bg["rail"].."^crafting_creative_rail.png;rail;]".. --transportation
"image_button[4.93,0;1,1;"..bg["misc"].."^crafting_creative_misc.png;misc;]".. --miscellaneous
"image_button[9.19,0;1,1;"..bg["all"].."^crafting_creative_all.png;default;]".. --search
"image[0,1;5,0.75;fnt_"..name..".png]"..
"list[current_player;main;0,7;9,1;]"..
main_list..
"image_button[9.03,1.74;0.85,0.6;crafting_creative_up.png;creative_prev;]"..
"image_button[9.03,6.15;0.85,0.6;crafting_creative_down.png;creative_next;]"..
"image_button[-0.1,8.28;1,1;"..bg["food"].."^crafting_food.png;food;]".. --foodstuff
"image_button[1.15,8.28;1,1;"..bg["tools"].."^crafting_creative_tool.png;tools;]".. --tools
"image_button[2.415,8.28;1,1;"..bg["combat"].."^crafting_creative_sword.png;combat;]".. --combat
"image_button[3.693,8.28;1,1;"..bg["matr"].."^crafting_creative_matr.png;matr;]".. --brewing
"image_button[4.93,8.28;1,1;"..bg["brew"].."^crafting_inventory_brew.png;brew;]".. --materials^
"image_button[9.19,8.28;1,1;"..bg["inv"].."^crafting_creative_inv.png;inv;]".. --inventory
"list[detached:creative_trash;main;9,7;1,1;]"..
"image[9,7;1,1;crafting_creative_trash.png]"..
"image[9.04," .. tostring(slider_pos) .. ";0.78,"..tostring(slider_height) .. ";crafting_slider.png]"
if name == "all" then
formspec = formspec .. "field_close_on_enter[suche;false]" ..
"field[5.3,1.3;4,0.75;suche;;]"
end
if pagenum ~= nil then
formspec = formspec .. "p"..tostring(pagenum)
end
return formspec
end
function creative.register_tab(name, title, items)
sfinv.register_page("creative:" .. name, {
title = title,
@ -101,34 +219,11 @@ function creative.register_tab(name, title, items)
creative.update_creative_inventory(player_name, items)
local inv = player_inventory[player_name]
local start_i = inv.start_i or 0
local pagenum = math.floor(start_i / (3*9) + 1)
local pagemax = math.ceil(inv.size / (3*9))
return sfinv.make_formspec(player, context,
"label[6.75,3.85;" .. minetest.colorize("#FFFF00", tostring(pagenum)) .. " / " .. tostring(pagemax) .. "]" ..
[[
background[-0.19,-0.25;9.41,10.48;creative_gui_formbg.png]
image[4,3.7;1,1;creative_trash_icon.png]
listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]
list[current_player;main;0,5.5;9,3;9]
list[current_player;main;0,8.74;9,1;]
list[detached:creative_trash;main;4,3.7;1,1;]
listring[]
button[5.5.0,3.7;0.8,0.9;creative_prev;<]
button[8.25,3.7;0.8,0.9;creative_next;>]
button[2.1,3.9;0.8,0.5;creative_search;?]
button[2.75,3.9;0.8,0.5;creative_clear;X]
tooltip[creative_search;Search]
tooltip[creative_clear;Reset]
tooltip[creative_prev;Previous page]
tooltip[creative_next;Next page]
listring[current_player;main]
field_close_on_enter[creative_filter;false]
]] ..
"field[0.3,4.0;2.2,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. "]" ..
"listring[detached:creative_" .. player_name .. ";main]" ..
"list[detached:creative_" .. player_name .. ";main;0,0.5;9,3;" .. tostring(start_i) .. "]" ..
"image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;true;]"..
creative.formspec_add, false, "size[9,9.75]")
local pagenum = math.floor(start_i / (5*9) + 1)
local pagemax = math.ceil(inv.size / (5*9))
local formspec = get_creative_formspec(player_name, start_i,
pagenum, name, pagemax)
return sfinv.make_formspec(player, context, formspec, false, "size[10,9.3]")
end,
on_enter = function(self, player, context)
local player_name = player:get_player_name()
@ -142,30 +237,48 @@ function creative.register_tab(name, title, items)
local inv = player_inventory[player_name]
assert(inv)
if fields.creative_clear then
if fields.build then
sfinv.set_page(player, "creative:blocks")
elseif fields.deco then
sfinv.set_page(player, "creative:deco")
elseif fields.mese then
sfinv.set_page(player, "creative:mese")
elseif fields.rail then
sfinv.set_page(player, "creative:rail")
elseif fields.misc then
sfinv.set_page(player, "creative:misc")
elseif fields.default then
sfinv.set_page(player, "creative:all")
elseif fields.food then
sfinv.set_page(player, "creative:food")
elseif fields.tools then
sfinv.set_page(player, "creative:tools")
elseif fields.combat then
sfinv.set_page(player, "creative:combat")
elseif fields.matr then
sfinv.set_page(player, "creative:matr")
elseif fields.inv then
sfinv.set_page(player, "creative:inv")
elseif fields.brew then
sfinv.set_page(player, "creative:brew")
elseif fields.suche and
fields.key_enter_field == "suche" then
inv.start_i = 0
inv.filter = ""
creative.update_creative_inventory(player_name, items)
sfinv.set_player_inventory_formspec(player, context)
elseif fields.creative_search or
fields.key_enter_field == "creative_filter" then
inv.start_i = 0
inv.filter = fields.creative_filter:lower()
inv.filter = fields.suche:lower()
creative.update_creative_inventory(player_name, items)
sfinv.set_player_inventory_formspec(player, context)
elseif not fields.quit then
local start_i = inv.start_i or 0
if fields.creative_prev then
start_i = start_i - 3*9
start_i = start_i - 5*9
if start_i < 0 then
start_i = inv.size - (inv.size % (3*9))
start_i = inv.size - (inv.size % (5*9))
if inv.size == start_i then
start_i = math.max(0, inv.size - (3*9))
start_i = math.max(0, inv.size - (5*9))
end
end
elseif fields.creative_next then
start_i = start_i + 3*9
start_i = start_i + 5*9
if start_i >= inv.size then
start_i = 0
end
@ -179,9 +292,19 @@ function creative.register_tab(name, title, items)
end
creative.register_tab("all", "All", minetest.registered_items)
creative.register_tab("nodes", "Nodes", minetest.registered_nodes)
creative.register_tab("tools", "Tools", minetest.registered_tools)
creative.register_tab("craftitems", "Items", minetest.registered_craftitems)
creative.register_tab("inv", "Inv", {})
minetest.after(0, function()
creative.register_tab("blocks", "1", get_item_list("building"))
creative.register_tab("deco", "2", get_item_list("decorative"))
creative.register_tab("mese", "3", get_item_list("mese"))
creative.register_tab("rail", "4", get_item_list("rail"))
creative.register_tab("misc", "5", get_item_list("misc"))
creative.register_tab("food", "6", get_item_list("foodstuffs"))
creative.register_tab("tools", "7", get_item_list("tools"))
creative.register_tab("combat", "8", get_item_list("combat"))
creative.register_tab("matr", "9", get_item_list("materials"))
creative.register_tab("brew", "10", get_item_list("brewing"))
end)
local old_homepage_name = sfinv.get_homepage_name
function sfinv.get_homepage_name(player)

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 952 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

View File

Before

Width:  |  Height:  |  Size: 210 B

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

View File

@ -4,7 +4,7 @@ sfinv = {
contexts = {},
enabled = true,
gui_bg = "bgcolor[#080808BB;true]",
gui_bg_img = "background[-0.19,-0.25;9.41,9.49;gui_formbg.png]",
gui_bg_img = "",
gui_slots = "listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]",
}
@ -30,13 +30,15 @@ function sfinv.override_page(name, def)
end
function sfinv.get_nav_fs(player, context, nav, current_idx)
-- Only show tabs if there is more than one page
--[[ Only show tabs if there is more than one page
if #nav > 1 then
return "tabheader[0,0;sfinv_nav_tabs;" .. table.concat(nav, ",") ..
";" .. current_idx .. ";true;false]"
else
return ""
end
]]--
return ""
end
local theme_main = "bgcolor[#080808BB;true]" .. sfinv.gui_bg ..

View File

@ -4,26 +4,8 @@ sfinv.register_page("sfinv:crafting", {
title = "Crafting",
get = function(self, player, context)
return sfinv.make_formspec(player, context, [[
listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]
list[current_player;craft;4,1;2,1;1]
list[current_player;craft;4,2;2,1;4]
list[current_player;craftpreview;7.05,1.54;1,1;]
list[detached:split;main;7.99,3.15;1,1;]
image[1.5,0;2,4;default_player2d.png;]
image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;true]
list[current_player;craft;1.75,0.5;3,3;]
list[current_player;craftpreview;5.75,1.5;1,1;]
]], true)
end
})
local split_inv = minetest.create_detached_inventory("split", {
allow_move = function(_, _, _, _, _, count, _)
return count
end,
allow_put = function(_, _, _, stack, _)
return stack:get_count() / 2
end,
allow_take = function(_, _, _, stack, _)
return stack:get_count()
end,
})
split_inv:set_size("main", 1)