@@ -203,6 +203,14 @@ local function on_place_node(place_to, newnode,
203203 end
204204end
205205
206+ local function can_dig_door (pos , digger )
207+ local digger_name = digger and digger :get_player_name ()
208+ if digger_name and minetest .get_player_privs (digger_name ).protection_bypass then
209+ return true
210+ end
211+ return minetest .get_meta (pos ):get_string (" doors_owner" ) == digger_name
212+ end
213+
206214function doors .register (name , def )
207215 if not name :find (" :" ) then
208216 name = " doors:" .. name
@@ -273,8 +281,10 @@ function doors.register(name, def)
273281 end
274282
275283 local above = {x = pos .x , y = pos .y + 1 , z = pos .z }
276- if not minetest .registered_nodes [
277- minetest .get_node (above ).name ].buildable_to then
284+ local top_node = minetest .get_node_or_nil (above )
285+ local topdef = top_node and minetest .registered_nodes [top_node .name ]
286+
287+ if not topdef or not topdef .buildable_to then
278288 return itemstack
279289 end
280290
@@ -336,21 +346,6 @@ function doors.register(name, def)
336346 end
337347 def .recipe = nil
338348
339- local can_dig = function (pos , digger )
340- if not def .protected then
341- return true
342- end
343- if minetest .check_player_privs (digger , " protection_bypass" ) then
344- return true
345- end
346- local meta = minetest .get_meta (pos )
347- local owner_name
348- if digger then
349- owner_name = digger :get_player_name ()
350- end
351- return meta :get_string (" doors_owner" ) == owner_name
352- end
353-
354349 if not def .sounds then
355350 def .sounds = default .node_sound_wood_defaults ()
356351 end
@@ -379,14 +374,12 @@ function doors.register(name, def)
379374 minetest .remove_node ({x = pos .x , y = pos .y + 1 , z = pos .z })
380375 nodeupdate ({x = pos .x , y = pos .y + 1 , z = pos .z })
381376 end
382- def .can_dig = function (pos , player )
383- return can_dig (pos , player )
384- end
385377 def .on_rotate = function (pos , node , user , mode , new_param2 )
386378 return false
387379 end
388380
389381 if def .protected then
382+ def .can_dig = can_dig_door
390383 def .on_blast = function () end
391384 else
392385 def .on_blast = function (pos , intensity )
@@ -540,16 +533,6 @@ function doors.register_trapdoor(name, def)
540533 local name_closed = name
541534 local name_opened = name .. " _open"
542535
543- local function check_player_priv (pos , player )
544- if not def .protected or
545- minetest .check_player_privs (player , " protection_bypass" ) then
546- return true
547- end
548- local meta = minetest .get_meta (pos )
549- local player_name = player and player :get_player_name ()
550- return meta :get_string (" doors_owner" ) == player_name
551- end
552-
553536 def .on_rightclick = function (pos , node , clicker , itemstack , pointed_thing )
554537 _doors .trapdoor_toggle (pos , node , clicker )
555538 return itemstack
@@ -560,9 +543,9 @@ function doors.register_trapdoor(name, def)
560543 def .paramtype = " light"
561544 def .paramtype2 = " facedir"
562545 def .is_ground_content = false
563- def .can_dig = check_player_priv
564546
565547 if def .protected then
548+ def .can_dig = can_dig_door
566549 def .after_place_node = function (pos , placer , itemstack , pointed_thing )
567550 local pn = placer :get_player_name ()
568551 local meta = minetest .get_meta (pos )
0 commit comments