Add error handling to sunlight checking to prevent crashing and improve diagnosis.
parent
b19cc8a5e6
commit
7fe1be2c18
|
@ -64,6 +64,24 @@ function mcl_util.check_dtime_timer(self, dtime, timer_name, threshold)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Minetest 5.3.0 or less can only measure the light level. This came in at 5.4
|
||||||
|
-- This function has been known to fail in multiple places so the error handling is added increase safety and improve
|
||||||
|
-- debugging. See:
|
||||||
|
-- https://git.minetest.land/MineClone2/MineClone2/issues/1392
|
||||||
|
function mcl_util.get_natural_light (pos, time)
|
||||||
|
local status, retVal = pcall(minetest.get_natural_light, pos, time)
|
||||||
|
if status then
|
||||||
|
return retVal
|
||||||
|
else
|
||||||
|
minetest.log("warning", "Failed to get natural light at pos: " .. dump(pos) .. ", time: " .. dump(time))
|
||||||
|
if (pos) then
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
minetest.log("warning", "Node at pos: " .. dump(node.name))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
function mcl_util.file_exists(name)
|
function mcl_util.file_exists(name)
|
||||||
if type(name) ~= "string" then return end
|
if type(name) ~= "string" then return end
|
||||||
local f = io.open(name)
|
local f = io.open(name)
|
||||||
|
|
|
@ -643,7 +643,7 @@ function mob_class:do_env_damage()
|
||||||
--minetest.log("warning", "Pos is ignored: " .. dump(pos))
|
--minetest.log("warning", "Pos is ignored: " .. dump(pos))
|
||||||
end
|
end
|
||||||
|
|
||||||
local sunlight = minetest.get_natural_light(pos, self.time_of_day)
|
local sunlight = mcl_util.get_natural_light(pos, self.time_of_day)
|
||||||
|
|
||||||
if self.light_damage ~= 0 and (sunlight or 0) > 12 then
|
if self.light_damage ~= 0 and (sunlight or 0) > 12 then
|
||||||
if self:deal_light_damage(pos, self.light_damage) then
|
if self:deal_light_damage(pos, self.light_damage) then
|
||||||
|
|
|
@ -240,7 +240,7 @@ end
|
||||||
local function start_firework_rocket(pos)
|
local function start_firework_rocket(pos)
|
||||||
local p = get_point_on_circle(pos,math.random(32,64),32)
|
local p = get_point_on_circle(pos,math.random(32,64),32)
|
||||||
local n = minetest.get_node(p)
|
local n = minetest.get_node(p)
|
||||||
local l = minetest.get_natural_light(pos,0.5)
|
local l = mcl_util.get_natural_light(pos,0.5)
|
||||||
if n.name ~= "air" or l <= minetest.LIGHT_MAX then return end
|
if n.name ~= "air" or l <= minetest.LIGHT_MAX then return end
|
||||||
local o = minetest.add_entity(p,"mcl_bows:rocket_entity")
|
local o = minetest.add_entity(p,"mcl_bows:rocket_entity")
|
||||||
o:get_luaentity()._harmless = true
|
o:get_luaentity()._harmless = true
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
local zombie_siege_enabled = minetest.settings:get_bool("mcl_raids_zombie_siege", false)
|
local zombie_siege_enabled = minetest.settings:get_bool("mcl_raids_zombie_siege", false)
|
||||||
|
|
||||||
local function check_spawn_pos(pos)
|
local function check_spawn_pos(pos)
|
||||||
return minetest.get_natural_light(pos) < 7
|
return mcl_util.get_natural_light(pos) < 7
|
||||||
end
|
end
|
||||||
|
|
||||||
local function spawn_zombies(self)
|
local function spawn_zombies(self)
|
||||||
|
|
|
@ -35,29 +35,17 @@ local function path_to_sunlight_exists(position, light_level)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function sunlight_visible(position)
|
local function sunlight_visible(position)
|
||||||
local light_level
|
local light_level = mcl_util.get_natural_light (position)
|
||||||
-- Minetest 5.4.0+ can measure the daylight level at a position
|
if light_level >= 12 then
|
||||||
if nil ~= minetest.get_natural_light then
|
--minetest.log("Light is greater than 12")
|
||||||
light_level = minetest.get_natural_light(
|
return true
|
||||||
position,
|
else
|
||||||
nil
|
|
||||||
)
|
|
||||||
if light_level >= 12 then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
else -- Minetest 5.3.0 or less can only measure the light level
|
|
||||||
local time = minetest.get_timeofday() * 24000
|
local time = minetest.get_timeofday() * 24000
|
||||||
-- only check light level during day
|
-- only check light level during day
|
||||||
if time > 6000 and time < 18000 then
|
if time > 6000 and time < 18000 then
|
||||||
light_level = minetest.get_node_light(
|
light_level = minetest.get_node_light(position, nil)
|
||||||
position,
|
|
||||||
nil
|
|
||||||
)
|
|
||||||
if light_level >= 12 then
|
if light_level >= 12 then
|
||||||
return path_to_sunlight_exists(
|
return path_to_sunlight_exists(position, 12)
|
||||||
position,
|
|
||||||
12
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue