@@ -2137,23 +2137,41 @@ local bookshelf_formspec =
2137
2137
" listring[current_player;main]" ..
2138
2138
default .get_hotbar_bg (0 ,2.85 )
2139
2139
2140
- local function get_bookshelf_formspec (inv )
2140
+ local function update_bookshelf (pos )
2141
+ local meta = minetest .get_meta (pos )
2142
+ local inv = meta :get_inventory ()
2143
+ local invlist = inv :get_list (" books" )
2144
+
2141
2145
local formspec = bookshelf_formspec
2142
- local invlist = inv and inv :get_list (" books" )
2143
2146
-- Inventory slots overlay
2144
2147
local bx , by = 0 , 0.3
2148
+ local n_written , n_empty = 0 , 0
2145
2149
for i = 1 , 16 do
2146
2150
if i == 9 then
2147
2151
bx = 0
2148
2152
by = by + 1
2149
2153
end
2150
- if not invlist or invlist [i ]:is_empty () then
2154
+ local stack = invlist [i ]
2155
+ if stack :is_empty () then
2151
2156
formspec = formspec ..
2152
2157
" image[" .. bx .. " ," .. by .. " ;1,1;default_bookshelf_slot.png]"
2158
+ else
2159
+ local metatable = stack :get_meta ():to_table () or {}
2160
+ if metatable .fields and metatable .fields .text then
2161
+ n_written = n_written + stack :get_count ()
2162
+ else
2163
+ n_empty = n_empty + stack :get_count ()
2164
+ end
2153
2165
end
2154
2166
bx = bx + 1
2155
2167
end
2156
- return formspec
2168
+ meta :set_string (" formspec" , formspec )
2169
+ if n_written + n_empty == 0 then
2170
+ meta :set_string (" infotext" , " Empty Bookshelf" )
2171
+ else
2172
+ meta :set_string (" infotext" , " Bookshelf (" .. n_written ..
2173
+ " written, " .. n_empty .. " empty books)" )
2174
+ end
2157
2175
end
2158
2176
2159
2177
minetest .register_node (" default:bookshelf" , {
@@ -2167,9 +2185,9 @@ minetest.register_node("default:bookshelf", {
2167
2185
2168
2186
on_construct = function (pos )
2169
2187
local meta = minetest .get_meta (pos )
2170
- meta :set_string (" formspec" , get_bookshelf_formspec (nil ))
2171
2188
local inv = meta :get_inventory ()
2172
2189
inv :set_size (" books" , 8 * 2 )
2190
+ update_bookshelf (pos )
2173
2191
end ,
2174
2192
can_dig = function (pos ,player )
2175
2193
local inv = minetest .get_meta (pos ):get_inventory ()
@@ -2184,20 +2202,17 @@ minetest.register_node("default:bookshelf", {
2184
2202
on_metadata_inventory_move = function (pos , from_list , from_index , to_list , to_index , count , player )
2185
2203
minetest .log (" action" , player :get_player_name () ..
2186
2204
" moves stuff in bookshelf at " .. minetest .pos_to_string (pos ))
2187
- local meta = minetest .get_meta (pos )
2188
- meta :set_string (" formspec" , get_bookshelf_formspec (meta :get_inventory ()))
2205
+ update_bookshelf (pos )
2189
2206
end ,
2190
2207
on_metadata_inventory_put = function (pos , listname , index , stack , player )
2191
2208
minetest .log (" action" , player :get_player_name () ..
2192
- " moves stuff to bookshelf at " .. minetest .pos_to_string (pos ))
2193
- local meta = minetest .get_meta (pos )
2194
- meta :set_string (" formspec" , get_bookshelf_formspec (meta :get_inventory ()))
2209
+ " puts stuff to bookshelf at " .. minetest .pos_to_string (pos ))
2210
+ update_bookshelf (pos )
2195
2211
end ,
2196
2212
on_metadata_inventory_take = function (pos , listname , index , stack , player )
2197
2213
minetest .log (" action" , player :get_player_name () ..
2198
2214
" takes stuff from bookshelf at " .. minetest .pos_to_string (pos ))
2199
- local meta = minetest .get_meta (pos )
2200
- meta :set_string (" formspec" , get_bookshelf_formspec (meta :get_inventory ()))
2215
+ update_bookshelf (pos )
2201
2216
end ,
2202
2217
on_blast = function (pos )
2203
2218
local drops = {}
0 commit comments