2017-08-11 18:03:45 +02:00
|
|
|
-- Basic utilities to work with table operations in Lua, and specific querying
|
2017-07-14 01:04:00 +02:00
|
|
|
-- By Zorman2000
|
|
|
|
|
|
|
|
npc.utils = {}
|
|
|
|
|
|
|
|
function npc.utils.array_contains(array, item)
|
|
|
|
--minetest.log("Array: "..dump(array))
|
|
|
|
--minetest.log("Item being searched: "..dump(item))
|
|
|
|
for i = 1, #array do
|
|
|
|
--minetest.log("Equals? "..dump(array[i] == item))
|
|
|
|
if array[i] == item then
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
function npc.utils.array_is_subset_of_array(set, subset)
|
|
|
|
local match_count = 0
|
|
|
|
for j = 1, #subset do
|
|
|
|
for k = 1, #set do
|
|
|
|
if subset[j] == set[k] then
|
|
|
|
match_count = match_count + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-- Check match count
|
|
|
|
return match_count == #subset
|
|
|
|
end
|
|
|
|
|
|
|
|
function npc.utils.get_map_keys(map)
|
|
|
|
local result = {}
|
2017-08-29 20:55:38 +02:00
|
|
|
for key, _ in pairs(map) do
|
2017-07-14 01:04:00 +02:00
|
|
|
table.insert(result, key)
|
|
|
|
end
|
|
|
|
return result
|
2017-08-11 18:03:45 +02:00
|
|
|
end
|
|
|
|
|
2017-08-29 20:55:38 +02:00
|
|
|
function npc.utils.get_map_values(map)
|
|
|
|
local result = {}
|
|
|
|
for _, value in pairs(map) do
|
|
|
|
table.insert(result, value)
|
|
|
|
end
|
|
|
|
return result
|
|
|
|
end
|
|
|
|
|
2017-08-11 18:03:45 +02:00
|
|
|
-- This function searches for a node given the conditions specified in the
|
|
|
|
-- query object, starting from the given start_pos and up to a certain, specified
|
|
|
|
-- range.
|
|
|
|
-- Query object:
|
|
|
|
-- search_type: determines the direction to search nodes.
|
|
|
|
-- Valid values are: orthogonal, cross, cube
|
|
|
|
-- - orthogonal search means only nodes which are parallel to the search node's faces
|
|
|
|
-- will be considered. This limits the search to only 6 nodes.
|
|
|
|
-- - cross search will look at the same nodes as orthogonal, plus will also
|
|
|
|
-- check nodes diagonal to the node four horizontal nodes. This search looks at 14 nodes
|
|
|
|
-- - cube search means to look every node surrounding the node, including all diagonals.
|
|
|
|
-- This search looks at 26 nodes.
|
|
|
|
-- search_nodes: array of nodes to search for
|
|
|
|
-- surrounding_nodes: object specifying which neighbor nodes are to be expected and
|
|
|
|
-- at which locations. Valid keys are:
|
|
|
|
-- - North (+Z dir)
|
|
|
|
-- - East (+x dir)
|
|
|
|
-- - South (-Z dir)
|
|
|
|
-- - West (-X dir)
|
|
|
|
-- - Top (+Y dir)
|
|
|
|
-- - Bottom (-Y dir)
|
|
|
|
-- Example: ["bottom"] = {nodes={"default:dirt"}, criteria="all"}
|
|
|
|
-- Each object will contain nodes, and criteria for acceptance.
|
|
|
|
-- Criteria values are:
|
|
|
|
-- - any: true as long as one of the nodes on this side is one of the specified
|
|
|
|
-- in "nodes"
|
|
|
|
-- - all: true when the set of neighboring nodes on this side contain one or many of
|
|
|
|
-- the specified "nodes"
|
|
|
|
-- - all-exact: true when the set of neighboring nodes on this side contain all nodes
|
|
|
|
-- specified in "nodes"
|
|
|
|
-- - shape: true when the set of neighboring nodes on this side contains nodes in
|
|
|
|
-- the exact given shape. If so, nodes will not be an array, but a 2d array
|
|
|
|
-- of three rows and three columns, with the specific shape. Notice that
|
|
|
|
-- the nodes on the side can vary depending on the search type (orthogonal,
|
|
|
|
-- cross, cube)
|
|
|
|
function npc.utils.search_node(query, start_pos, range)
|
|
|
|
|
2017-07-14 01:04:00 +02:00
|
|
|
end
|