8 function sfinv.register_page(name, def)
9 assert(name, "Invalid sfinv page. Requires a name")
10 assert(def, "Invalid sfinv page. Requires a def[inition] table")
11 assert(def.get, "Invalid sfinv page. Def requires a get function.")
12 assert(not sfinv.pages[name], "Attempt to register already registered sfinv page " .. dump(name))
14 sfinv.pages[name] = def
16 table.insert(sfinv.pages_unordered, def)
19 function sfinv.override_page(name, def)
20 assert(name, "Invalid sfinv page override. Requires a name")
21 assert(def, "Invalid sfinv page override. Requires a def[inition] table")
22 local page = sfinv.pages[name]
23 assert(page, "Attempt to override sfinv page " .. dump(name) .. " which does not exist.")
24 for key, value in pairs(def) do
29 function sfinv.get_nav_fs(player, context, nav, current_idx)
30 -- Only show tabs if there is more than one page
32 return "tabheader[0,0;sfinv_nav_tabs;" .. table.concat(nav, ",") ..
33 ";" .. current_idx .. ";true;false]"
39 local theme_main = "bgcolor[#080808BB;true]" .. default.gui_bg ..
42 local theme_inv = default.gui_slots .. [[
43 list[current_player;main;0,4.7;8,1;]
44 list[current_player;main;0,5.85;8,3;8]
47 function sfinv.make_formspec(player, context, content, show_inv, size)
49 size or "size[8,8.6]",
51 sfinv.get_nav_fs(player, context, context.nav_titles, context.nav_idx),
55 tmp[#tmp + 1] = theme_inv
57 return table.concat(tmp, "")
60 function sfinv.get_homepage_name(player)
61 return "sfinv:crafting"
64 function sfinv.get_formspec(player, context)
65 -- Generate navigation tabs
69 for i, pdef in pairs(sfinv.pages_unordered) do
70 if not pdef.is_in_nav or pdef:is_in_nav(player, context) then
71 nav[#nav + 1] = pdef.title
72 nav_ids[#nav_ids + 1] = pdef.name
73 if pdef.name == context.page then
74 current_idx = #nav_ids
79 context.nav_titles = nav
80 context.nav_idx = current_idx
83 local page = sfinv.pages[context.page] or sfinv.pages["404"]
85 return page:get(player, context)
87 local old_page = context.page
88 local home_page = sfinv.get_homepage_name(player)
90 if old_page == home_page then
91 minetest.log("error", "[sfinv] Couldn't find " .. dump(old_page) ..
92 ", which is also the old page")
97 context.page = home_page
98 assert(sfinv.pages[context.page], "[sfinv] Invalid homepage")
99 minetest.log("warning", "[sfinv] Couldn't find " .. dump(old_page) ..
100 " so switching to homepage")
102 return sfinv.get_formspec(player, context)
106 function sfinv.get_or_create_context(player)
107 local name = player:get_player_name()
108 local context = sfinv.contexts[name]
111 page = sfinv.get_homepage_name(player)
113 sfinv.contexts[name] = context
118 function sfinv.set_context(player, context)
119 sfinv.contexts[player:get_player_name()] = context
122 function sfinv.set_player_inventory_formspec(player, context)
123 local fs = sfinv.get_formspec(player,
124 context or sfinv.get_or_create_context(player))
125 player:set_inventory_formspec(fs)
128 function sfinv.set_page(player, pagename)
129 local context = sfinv.get_or_create_context(player)
130 local oldpage = sfinv.pages[context.page]
131 if oldpage and oldpage.on_leave then
132 oldpage:on_leave(player, context)
134 context.page = pagename
135 local page = sfinv.pages[pagename]
136 if page.on_enter then
137 page:on_enter(player, context)
139 sfinv.set_player_inventory_formspec(player, context)
142 minetest.register_on_joinplayer(function(player)
143 if sfinv.enabled then
144 sfinv.set_player_inventory_formspec(player)
148 minetest.register_on_leaveplayer(function(player)
149 sfinv.contexts[player:get_player_name()] = nil
152 minetest.register_on_player_receive_fields(function(player, formname, fields)
153 if formname ~= "" or not sfinv.enabled then
158 local name = player:get_player_name()
159 local context = sfinv.contexts[name]
161 sfinv.set_player_inventory_formspec(player)
165 -- Was a tab selected?
166 if fields.sfinv_nav_tabs and context.nav then
167 local tid = tonumber(fields.sfinv_nav_tabs)
168 if tid and tid > 0 then
169 local id = context.nav[tid]
170 local page = sfinv.pages[id]
172 sfinv.set_page(player, id)
176 -- Pass event to page
177 local page = sfinv.pages[context.page]
178 if page and page.on_player_receive_fields then
179 return page:on_player_receive_fields(player, context, fields)