11pchest = {}
22
3+ local tubelibEnabled = minetest .global_exists (" tubelib" )
4+
35minetest .register_craft ({
46 output = " hook:pchest" ,
57 recipe = {
@@ -9,22 +11,38 @@ minetest.register_craft({
911 }
1012})
1113
12- pchest .setpchest = function (pos ,user )
14+ pchest .setpchest = function (pos ,user , item )
1315 local meta = minetest .get_meta (pos )
1416 meta :set_string (" owner" , user :get_player_name ())
1517 meta :set_int (" state" , 0 )
1618 meta :get_inventory ():set_size (" main" , 32 )
1719 meta :get_inventory ():set_size (" trans" , 1 )
18- meta :set_string (" formspec" ,
19- " size[8,8]" ..
20- " list[context;main;0,0;8,4;]" ..
21- " list[context;trans;0,0;0,0;]" ..
22- " list[current_player;main;0,4.3;8,4;]" ..
23- " listring[current_player;main]" ..
24- " listring[current_name;main]" )
20+ local tubelib = " true"
21+ if item .meta .tubelib then
22+ tubelib = item .meta .tubelib
23+ end
24+ meta :set_string (" tubelib" , tubelib )
25+ pchest .setformspec (meta )
2526 meta :set_string (" infotext" , " PChest by: " .. user :get_player_name ())
2627end
2728
29+ pchest .setformspec = function (meta )
30+ local header_space = 0
31+ local fieldspec = " "
32+ if tubelibEnabled then
33+ header_space = 1
34+ fieldspec = " checkbox[4,0;toggle_tubelib;Enable tubelib interaction;" .. meta :get_string (" tubelib" ).. " ]"
35+ end
36+ meta :set_string (" formspec" ,
37+ " size[8," .. (header_space + 8 ) .. " ]" ..
38+ fieldspec ..
39+ " list[context;main;0," .. (header_space + 0 ) .. " ;8,4;]" ..
40+ " list[context;trans;0,0;0,0;]" ..
41+ " list[current_player;main;0," .. (header_space + 4.3 ) .. " ;8,4;]" ..
42+ " listring[current_player;main]" ..
43+ " listring[current_name;main]" )
44+ end
45+
2846minetest .register_tool (" hook:pchest" , {
2947 description = " Portable locked chest" ,
3048 inventory_image = " hook_extras_chest3.png" ,
@@ -35,7 +53,7 @@ minetest.register_tool("hook:pchest", {
3553 local p = minetest .dir_to_facedir (user :get_look_dir ())
3654 local item = itemstack :to_table ()
3755 minetest .set_node (pointed_thing .above , {name = " hook:pchest_node" ,param1 = " " ,param2 = p })
38- pchest .setpchest (pointed_thing .above ,user )
56+ pchest .setpchest (pointed_thing .above ,user , item )
3957
4058 minetest .sound_play (" default_place_node_hard" , {pos = pointed_thing .above , gain = 1.0 , max_hear_distance = 5 })
4159
@@ -121,6 +139,17 @@ minetest.register_node("hook:pchest_node", {
121139 local m = minetest .get_meta (pos )
122140 return m :get_string (" owner" ) == " " and m :get_inventory ():is_empty (" main" )
123141 end ,
142+ on_receive_fields = function (pos , formname , fields , sender )
143+ local name = sender :get_player_name ()
144+ local meta = minetest .get_meta (pos )
145+ if name ~= meta :get_string (" owner" ) then
146+ return false
147+ end
148+ if fields .toggle_tubelib then
149+ meta :set_string (" tubelib" , fields .toggle_tubelib )
150+ end
151+ pchest .setformspec (meta )
152+ end ,
124153 on_punch = function (pos , node , player , pointed_thing )
125154 local meta = minetest .get_meta (pos )
126155 local name = player :get_player_name ()
@@ -134,9 +163,47 @@ minetest.register_node("hook:pchest_node", {
134163 table.insert (items ,v :to_table ())
135164 end
136165 local item = ItemStack (" hook:pchest" ):to_table ()
137- item .meta = {items = minetest .serialize (items )}
166+ item .meta = {items = minetest .serialize (items ), tubelib = meta : get_string ( ' tubelib ' ) }
138167 pinv :add_item (" main" , ItemStack (item ))
139168 minetest .set_node (pos , {name = " air" })
140169 minetest .sound_play (" default_dig_dig_immediate" , {pos = pos , gain = 1.0 , max_hear_distance = 5 ,})
141170 end
142- })
171+ })
172+
173+ if tubelibEnabled then
174+ tubelib .register_node (" hook:pchest_node" , {}, {
175+ on_pull_item = function (pos , side , player_name )
176+ local meta = minetest .get_meta (pos )
177+ if meta :get_string (' tubelib' ) ~= ' true' then
178+ return nil
179+ end
180+ local inv = meta :get_inventory ()
181+ for _ , stack in pairs (inv :get_list (" main" )) do
182+ if not stack :is_empty () then
183+ return inv :remove_item (" main" , stack :get_name ())
184+ end
185+ end
186+ return nil
187+ end ,
188+ on_push_item = function (pos , side , item , player_name )
189+ local meta = minetest .get_meta (pos )
190+ if meta :get_string (' tubelib' ) ~= ' true' then
191+ return false
192+ end
193+ local inv = meta :get_inventory ()
194+ if inv :room_for_item (" main" , item ) then
195+ inv :add_item (" main" , item )
196+ return true
197+ end
198+ return false
199+ end ,
200+ on_unpull_item = function (pos , side , item , player_name )
201+ local inv = minetest .get_meta (pos ):get_inventory ()
202+ if inv :room_for_item (" main" , item ) then
203+ inv :add_item (" main" , item )
204+ return true
205+ end
206+ return false
207+ end ,
208+ })
209+ end
0 commit comments