Add alternative suitable place search for Nether portals in portals branch

This commit is contained in:
kay27 2021-03-18 17:55:29 +04:00 committed by Nils Dagsson Moskopp
parent 4f002bcd83
commit 4a257481fe
Signed by untrusted user who does not match committer: erle
GPG Key ID: A3BC671C35191080
1 changed files with 42 additions and 0 deletions

View File

@ -64,6 +64,7 @@ local find_nodes_in_area = minetest.find_nodes_in_area
local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
local log = minetest.log local log = minetest.log
local pos_to_string = minetest.pos_to_string local pos_to_string = minetest.pos_to_string
local is_area_protected = minetest.is_area_protected
local limits = { local limits = {
nether = { nether = {
@ -446,6 +447,47 @@ local function ecb_scan_area(blockpos, action, calls_remaining, param)
create_portal_2(pos, name, obj) create_portal_2(pos, name, obj)
end end
local function ecb_scan_area_2(blockpos, action, calls_remaining, param)
if calls_remaining and calls_remaining > 0 then return end
local pos, pos1, pos2, name, obj = param.pos, param.pos1, param.pos2, param.name or "", param.obj
local pos0, distance
local nodes = find_nodes_in_area_under_air(pos1, pos2, {"group:building_block"})
if nodes then
local nc = #nodes
if nc > 0 then
log("action", "[mcl_portal] Area for destination Nether portal emerged! Found " .. tostring(nc) .. " nodes under the air around "..pos_to_string(pos))
for i=1,nc do
local node = nodes[i]
local node1 = {x=node.x, y=node.y+2, z=node.z }
local node2 = {x=node.x+3, y=node.y+4, z=node.z+3}
local nodes2 = find_nodes_in_area(node1, node2, {"air"})
if nodes2 then
local nc2 = #nodes2
if nc2 == 48 and not is_area_protected(node, node2, name) then
local distance0 = dist(pos, node)
if distance0 < 2 then
log("action", "[mcl_portal] found space at pos "..pos_to_string(node).." - creating a portal")
create_portal_2(node, name, obj)
return
end
if not distance or distance0 < distance then
distance = distance0
pos0 = {x=node.x, y=node.y, z=node.z}
end
end
end
end
end
end
if distance then -- several nodes of air might be better than lava lake, right?
log("action", "[mcl_portal] using backup pos "..pos_to_string(pos0).." to create a portal")
create_portal_2(pos0, name, obj)
return
end
log("action", "[mcl_portal] found no space, reverting to target pos "..pos_to_string(pos).." - creating a portal")
create_portal_2(pos, name, obj)
end
local function create_portal(pos, limit1, limit2, name, obj) local function create_portal(pos, limit1, limit2, name, obj)
-- we need to emerge the area here, but currently (mt5.4/mcl20.71) map generation is slow -- we need to emerge the area here, but currently (mt5.4/mcl20.71) map generation is slow
-- so we'll emerge single chunk only: 5x5x5 blocks, 80x80x80 nodes maximum -- so we'll emerge single chunk only: 5x5x5 blocks, 80x80x80 nodes maximum