Skip to content

Commit 00c2dde

Browse files
t4imparamat
authored andcommittedAug 1, 2016
Doors: Fix potential crashes, code improvements
Fix crash when doors are placed under unknown nodes. Share a can_dig among doors, that does not crash on nil-player. Only set can_dig if we actually protect the door.
1 parent 4fba897 commit 00c2dde

File tree

1 file changed

+14
-31
lines changed

1 file changed

+14
-31
lines changed
 

Diff for: ‎mods/doors/init.lua

+14-31
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,14 @@ local function on_place_node(place_to, newnode,
203203
end
204204
end
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+
206214
function 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

Comments
 (0)
Please sign in to comment.