Fix crash with unknown or ignore nodes

This commit is contained in:
Lars Mueller 2022-02-16 21:57:05 +01:00
parent c251f07ae5
commit 8b0e23f97e

View file

@ -62,8 +62,9 @@ local step_tick = 0.15
-- Local Utilities --
local default_node_def = {walkable = true} -- both ignore and unknown nodes are walkable
local function get_node_def(name)
return minetest.registered_nodes[name]
return minetest.registered_nodes[name] or default_node_def
end
local function get_ground_level(pos2, max_height)
@ -334,8 +335,8 @@ function mob:get_wander_pos(min_range, max_range, max_vert)
local pos2 = get_ground_level(vec_add(pos, vec_multi(vec_normal(move_dir), outset)), max_vert or min_range)
for i = 2, outset do
local out_pos = vec_add(pos, vec_multi(vec_normal(move_dir), i))
if minetest.registered_nodes[minetest.get_node(out_pos).name].walkable
or not minetest.registered_nodes[minetest.get_node(vec_raise(pos2, -1)).name].walkable then
if get_node_def(minetest.get_node(out_pos).name).walkable
or not get_node_def(minetest.get_node(vec_raise(pos2, -1)).name).walkable then
break
end
pos2 = out_pos
@ -354,7 +355,7 @@ function mob:get_wander_pos_3d(min_range, max_range)
local pos2 = vec_add(pos, vec_multi(vec_normal(move_dir), 1))
local fail_safe = 0
while fail_safe < 4
and minetest.registered_nodes[minetest.get_node(pos2).name].walkable do
and get_node_def(minetest.get_node(pos2).name).walkable do
move_dir = {
x = random(-10, 10) * 0.1,
z = random(-10, 10) * 0.1,
@ -364,7 +365,7 @@ function mob:get_wander_pos_3d(min_range, max_range)
end
for i = 2, outset do
local out_pos = vec_add(pos, vec_multi(vec_normal(move_dir), i))
if minetest.registered_nodes[minetest.get_node(out_pos).name].walkable then
if get_node_def(minetest.get_node(out_pos).name).walkable then
break
end
pos2 = out_pos
@ -377,7 +378,7 @@ function mob:is_pos_safe(pos)
local node = minetest.get_node(pos)
if not node then return false end
if minetest.get_item_group(node.name, "igniter") > 0
or minetest.registered_nodes[node.name].drawtype == "liquid" then return false end
or get_node_def(node.name).drawtype == "liquid" then return false end
local fall_safe = false
if self.max_fall ~= 0 then
for i = 1, self.max_fall or 3 do
@ -386,7 +387,7 @@ function mob:is_pos_safe(pos)
y = floor(mob_pos.y + 0.5) - i,
z = pos.z
}
if minetest.registered_nodes[minetest.get_node(fall_pos).name].walkable then
if get_node_def(minetest.get_node(fall_pos).name).walkable then
fall_safe = true
break
end
@ -1183,7 +1184,7 @@ function mob:_vitals()
end
if self:timer(1) then
local head_pos = vec_raise(stand_pos, self.height)
local head_def = minetest.registered_nodes[minetest.get_node(head_pos).name]
local head_def = get_node_def(minetest.get_node(head_pos).name)
if head_def.drawtype == "liquid"
and minetest.get_item_group(minetest.get_node(head_pos), "water") > 0 then
if self._breath <= 0 then
@ -1197,7 +1198,7 @@ function mob:_vitals()
self:memorize("_breath", self._breath)
end
end
local stand_def = minetest.registered_nodes[minetest.get_node(stand_pos).name]
local stand_def = get_node_def(minetest.get_node(stand_pos).name)
if minetest.get_item_group(minetest.get_node(stand_pos), "fire") > 0
and stand_def.damage_per_second then
local damage = stand_def.damage_per_second