@@ -91,22 +91,42 @@ function sfinv.get_formspec(player, context)
91
91
end
92
92
end
93
93
94
- function sfinv .set_player_inventory_formspec (player , context )
94
+ function sfinv .get_or_create_context (player )
95
+ local name = player :get_player_name ()
96
+ local context = sfinv .contexts [name ]
95
97
if not context then
96
- local name = player :get_player_name ()
97
- context = sfinv .contexts [name ]
98
- if not context then
99
- context = {
100
- page = sfinv .get_homepage_name (player )
101
- }
102
- sfinv .contexts [name ] = context
103
- end
98
+ context = {
99
+ page = sfinv .get_homepage_name (player )
100
+ }
101
+ sfinv .contexts [name ] = context
104
102
end
103
+ return context
104
+ end
105
+
106
+ function sfinv .set_context (player , context )
107
+ sfinv .contexts [player :get_player_name ()] = context
108
+ end
105
109
106
- local fs = sfinv .get_formspec (player , context )
110
+ function sfinv .set_player_inventory_formspec (player , context )
111
+ local fs = sfinv .get_formspec (player ,
112
+ context or sfinv .get_or_create_context (player ))
107
113
player :set_inventory_formspec (fs )
108
114
end
109
115
116
+ function sfinv .set_page (player , pagename )
117
+ local context = sfinv .get_or_create_context (player )
118
+ local oldpage = sfinv .pages [context .page ]
119
+ if oldpage and oldpage .on_leave then
120
+ oldpage :on_leave (player , context )
121
+ end
122
+ context .page = pagename
123
+ local page = sfinv .pages [pagename ]
124
+ if page .on_enter then
125
+ page :on_enter (player , context )
126
+ end
127
+ sfinv .set_player_inventory_formspec (player , context )
128
+ end
129
+
110
130
minetest .register_on_joinplayer (function (player )
111
131
if sfinv .enabled then
112
132
minetest .after (0.5 , function ()
@@ -132,30 +152,21 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
132
152
return false
133
153
end
134
154
135
- -- Handle Events
155
+ -- Was a tab selected?
136
156
if fields .tabs and context .nav then
137
157
local tid = tonumber (fields .tabs )
138
158
if tid and tid > 0 then
139
159
local id = context .nav [tid ]
140
160
local page = sfinv .pages [id ]
141
161
if id and page then
142
- local oldpage = sfinv .pages [context .page ]
143
- if oldpage and oldpage .on_leave then
144
- oldpage :on_leave (player , context )
145
- end
146
- context .page = id
147
- if page .on_enter then
148
- page :on_enter (player , context )
149
- end
150
- sfinv .set_player_inventory_formspec (player , context )
162
+ sfinv .set_page (player , id )
151
163
end
152
164
end
153
- return
154
- end
155
-
156
- -- Pass to page
157
- local page = sfinv .pages [context .page ]
158
- if page and page .on_player_receive_fields then
159
- return page :on_player_receive_fields (player , context , fields )
165
+ else
166
+ -- Pass event to page
167
+ local page = sfinv .pages [context .page ]
168
+ if page and page .on_player_receive_fields then
169
+ return page :on_player_receive_fields (player , context , fields )
170
+ end
160
171
end
161
172
end )
0 commit comments