Villager: Fix unstuck behavior for slabs and paths
This commit is contained in:
parent
2c902fb862
commit
a3c71daaf1
@ -122,6 +122,27 @@ local is_node_blocking_water_ok = function(node)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Check if node makes villager stuck if inside
|
||||||
|
local is_node_stucking = function(node)
|
||||||
|
local def = minetest.registered_nodes[node.name]
|
||||||
|
if not def then
|
||||||
|
-- Unknown nodes are blocking
|
||||||
|
return true
|
||||||
|
elseif minetest.get_item_group(node.name, "door") ~= 0
|
||||||
|
or minetest.get_item_group(node.name, "slab") ~= 0
|
||||||
|
or minetest.get_item_group(node.name, "path") ~= 0 then
|
||||||
|
return false
|
||||||
|
elseif def.damage_per_second > 0 then
|
||||||
|
-- No damage allowed
|
||||||
|
return true
|
||||||
|
elseif def.walkable then
|
||||||
|
-- Walkable by definition = blocking
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Returns true if node is swimmable
|
-- Returns true if node is swimmable
|
||||||
local is_node_swimmable = function(node)
|
local is_node_swimmable = function(node)
|
||||||
local def = minetest.registered_nodes[node.name]
|
local def = minetest.registered_nodes[node.name]
|
||||||
@ -1031,9 +1052,9 @@ local movement_decider_step = function(task_queue, mob, dtime)
|
|||||||
local mnode2 = minetest.get_node(rmobpos2)
|
local mnode2 = minetest.get_node(rmobpos2)
|
||||||
|
|
||||||
-- Test if mob is stuck; unstuck it if that's the case
|
-- Test if mob is stuck; unstuck it if that's the case
|
||||||
if is_node_blocking_water_ok(mnode) or is_node_blocking_water_ok(mnode2) then
|
if is_node_stucking(mnode) or is_node_stucking(mnode2) then
|
||||||
local current_task_entry = task_queue.tasks:getFirst()
|
local current_task_entry = task_queue.tasks:getFirst()
|
||||||
if current_task_entry and current_task_entry.data and current_task_entry.data.label == "get unstuck" then
|
if current_task_entry and current_task_entry.data and current_task_entry.data.label ~= "stand still" then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
rp_mobs.clear_task_queue(task_queue)
|
rp_mobs.clear_task_queue(task_queue)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user