diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index f37b34444..d55ec0430 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -1,5 +1,11 @@ mcl_util = {} +local MAPGEN_LIMIT = 32000 + +function mcl_util.get_mapgen_limit() + return MAPGEN_LIMIT +end + -- Updates all values in t using values from to*. function table.update(t, ...) for _, to in ipairs {...} do diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index f5e50ba2a..1a7982ece 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -24,6 +24,10 @@ local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= fa local mobs_debug = minetest.settings:get_bool("mobs_debug", false) -- Shows helpful debug info above each mob local spawn_logging = minetest.settings:get_bool("mcl_logging_mobs_spawn",true) +local MAPGEN_LIMIT = mcl_util.get_mapgen_limit() +local MAPGEN_MOB_LIMIT = mcl_util.get_mapgen_limit() - 50 + + -- Peaceful mode message so players will know there are no monsters if minetest.settings:get_bool("only_peaceful_mobs", false) then minetest.register_on_joinplayer(function(player) @@ -328,6 +332,26 @@ local function update_timers (self, dtime) end end +function mob_class:outside_limits() + local pos = self.object:get_pos() + if pos then + local posx = math.abs(pos.x) + local posy = math.abs(pos.y) + local posz = math.abs(pos.z) + if posx > MAPGEN_MOB_LIMIT or posy > MAPGEN_MOB_LIMIT or posz > MAPGEN_MOB_LIMIT then + if posx > MAPGEN_LIMIT or posy > MAPGEN_LIMIT or posz > MAPGEN_LIMIT then + minetest.log("action", "Warning mob past limits of worldgen: " .. minetest.pos_to_string(pos)) + else + minetest.log("action", "Warning mob close to limits of worldgen: " .. minetest.pos_to_string(pos)) + self:set_velocity(0) + self.state = "stand" + self:set_animation( "stand") + end + return true + end + end +end + -- main mob function function mob_class:on_step(dtime) local pos = self.object:get_pos() @@ -335,6 +359,10 @@ function mob_class:on_step(dtime) if self:check_despawn(pos, dtime) then return true end + if self:outside_limits() then + return + end + if self:check_death_and_slow_mob() then --minetest.log("action", "Mob is dying: ".. tostring(self.name)) -- Do we abandon out of here now?