mirror of
https://github.com/ElCeejo/creatura.git
synced 2025-07-10 00:30:31 -04:00
Add Context Based Steering, ABM Spawning fixes
This commit is contained in:
parent
5b4b5e7331
commit
64de7d9ed5
4 changed files with 185 additions and 101 deletions
63
api.lua
63
api.lua
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue