forked from VoxeLibre/VoxeLibre
Fix mobs operating when in, above or next to ignore
This commit is contained in:
parent
744b47088b
commit
551a3ce829
|
@ -2,6 +2,13 @@ mcl_util = {}
|
||||||
|
|
||||||
dofile(minetest.get_modpath(minetest.get_current_modname()).."/roman_numerals.lua")
|
dofile(minetest.get_modpath(minetest.get_current_modname()).."/roman_numerals.lua")
|
||||||
|
|
||||||
|
mcl_util.plane_adjacents = {
|
||||||
|
vector.new(1,0,0),
|
||||||
|
vector.new(-1,0,0),
|
||||||
|
vector.new(0,0,1),
|
||||||
|
vector.new(0,0,-1),
|
||||||
|
}
|
||||||
|
|
||||||
-- Updates all values in t using values from to*.
|
-- Updates all values in t using values from to*.
|
||||||
function table.update(t, ...)
|
function table.update(t, ...)
|
||||||
for _, to in ipairs {...} do
|
for _, to in ipairs {...} do
|
||||||
|
|
|
@ -387,6 +387,7 @@ local function on_step_work (self, dtime)
|
||||||
local pos = self.object:get_pos()
|
local pos = self.object:get_pos()
|
||||||
if not pos then return end
|
if not pos then return end
|
||||||
|
|
||||||
|
if self:check_in_unloaded_area(pos) then return end
|
||||||
if self:check_despawn(pos, dtime) then return true end
|
if self:check_despawn(pos, dtime) then return true end
|
||||||
if self:outside_limits() then return end
|
if self:outside_limits() then return end
|
||||||
|
|
||||||
|
|
|
@ -679,11 +679,7 @@ function mob_class:do_env_damage()
|
||||||
local pos3 = vector.offset(pos, 0, 1, 0)
|
local pos3 = vector.offset(pos, 0, 1, 0)
|
||||||
self.standing_under = node_ok(pos3, "air").name
|
self.standing_under = node_ok(pos3, "air").name
|
||||||
|
|
||||||
-- don't fall when on ignore, just stand still
|
if self.standing_in == "mcl_flowers:wither_rose" then
|
||||||
if self.standing_in == "ignore" then
|
|
||||||
self.object:set_velocity({x = 0, y = 0, z = 0})
|
|
||||||
-- wither rose effect
|
|
||||||
elseif self.standing_in == "mcl_flowers:wither_rose" then
|
|
||||||
mcl_potions.give_effect_by_level("withering", self.object, 2, 2)
|
mcl_potions.give_effect_by_level("withering", self.object, 2, 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1094,3 +1090,32 @@ function mob_class:check_suspend(player_in_active_range)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local plane_adjacents = table.copy(mcl_util.plane_adjacents)
|
||||||
|
table.insert(plane_adjacents, vector.new(0,-1,0))
|
||||||
|
|
||||||
|
local function is_node_loaded(pos)
|
||||||
|
local current_node = minetest.get_node(pos)
|
||||||
|
if current_node.name == "ignore" then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
function mob_class:check_in_unloaded_area(pos)
|
||||||
|
local unloaded = false
|
||||||
|
if not is_node_loaded(pos) then
|
||||||
|
unloaded = true
|
||||||
|
else
|
||||||
|
for _,v in pairs(plane_adjacents) do
|
||||||
|
if not is_node_loaded(vector.add(pos, v)) then
|
||||||
|
unloaded = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if unloaded then
|
||||||
|
-- do not fall or walk, or think. just stop it. we aren't ready for you yet
|
||||||
|
self.object:set_velocity(vector.zero())
|
||||||
|
end
|
||||||
|
return unloaded
|
||||||
|
end
|
Loading…
Reference in New Issue