Add Context Based Steering, ABM Spawning fixes

This commit is contained in:
ElCeejo 2022-09-24 01:17:10 -07:00
parent 5b4b5e7331
commit 64de7d9ed5
4 changed files with 185 additions and 101 deletions

63
api.lua
View file

@ -121,9 +121,11 @@ function creatura.get_node_height_from_def(name)
end
end
local get_node = minetest.get_node
function creatura.get_node_def(node) -- Node can be name or pos
if type(node) == "table" then
node = minetest.get_node(node).name
node = get_node(node).name
end
local def = minetest.registered_nodes[node] or default_node_def
if def.walkable
@ -133,45 +135,28 @@ function creatura.get_node_def(node) -- Node can be name or pos
return def
end
function creatura.get_ground_level(pos, max_diff)
local pos2 = pos -- Prevent modifying table that shouldn't be changed
pos2.y = math.floor(pos2.y - 0.49)
local node = minetest.get_node(pos2)
local node_under = minetest.get_node({
x = pos2.x,
y = pos2.y - 1,
z = pos2.z
})
local walkable = creatura.get_node_def(node_under.name).walkable and not creatura.get_node_def(node.name).walkable
if walkable then
return pos2
end
if not creatura.get_node_def(node_under.name).walkable then
for _ = 1, max_diff do
pos2.y = pos2.y - 1
node = minetest.get_node(pos2)
node_under = minetest.get_node({
x = pos2.x,
y = pos2.y - 1,
z = pos2.z
})
walkable = creatura.get_node_def(node_under.name).walkable and not creatura.get_node_def(node.name).walkable
if walkable then break end
end
else
for _ = 1, max_diff do
pos2.y = pos2.y + 1
node = minetest.get_node(pos2)
node_under = minetest.get_node({
x = pos2.x,
y = pos2.y - 1,
z = pos2.z
})
walkable = creatura.get_node_def(node_under.name).walkable and not creatura.get_node_def(node.name).walkable
if walkable then break end
local get_node_def = creatura.get_node_def
function creatura.get_ground_level(pos, range)
range = range or 2
local above = vector.round(pos)
local under = {x = above.x, y = above.y - 1, z = above.z}
if not get_node_def(above).walkable and get_node_def(under).walkable then return above end
if get_node_def(above).walkable then
for i = 1, range do
under = above
above = {x = above.x, y = above.y + 1, z = above.z}
if not get_node_def(above).walkable and get_node_def(under).walkable then return above end
end
end
return pos2
if not get_node_def(under).walkable then
for i = 1, range do
above = under
under = {x = under.x, y = under.y - 1, z = under.z}
if not get_node_def(above).walkable and get_node_def(under).walkable then return above end
end
end
return above
end
function creatura.is_pos_moveable(pos, width, height)
@ -192,7 +177,7 @@ function creatura.is_pos_moveable(pos, width, height)
local ray = minetest.raycast(pos3, pos4, false, false)
for pointed_thing in ray do
if pointed_thing.type == "node" then
local name = minetest.get_node(pointed_thing.under).name
local name = get_node(pointed_thing.under).name
if creatura.get_node_def(name).walkable then
return false
end