forked from VoxeLibre/VoxeLibre
use vector.new in mcl_dungeons (#4567)
No functional changes, just more vector API, which supposedly is faster? Reviewed-on: VoxeLibre/VoxeLibre#4567 Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land> Co-authored-by: kno10 <erich.schubert@gmail.com> Co-committed-by: kno10 <erich.schubert@gmail.com>
This commit is contained in:
parent
71881154e9
commit
72c7489976
|
@ -3,11 +3,8 @@
|
||||||
mcl_dungeons = {}
|
mcl_dungeons = {}
|
||||||
|
|
||||||
local mg_name = minetest.get_mapgen_setting("mg_name")
|
local mg_name = minetest.get_mapgen_setting("mg_name")
|
||||||
|
|
||||||
-- Are dungeons disabled?
|
-- Are dungeons disabled?
|
||||||
if mcl_vars.mg_dungeons == false or mg_name == "singlenode" then
|
if mcl_vars.mg_dungeons == false or mg_name == "singlenode" then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
--lua locals
|
--lua locals
|
||||||
--minetest
|
--minetest
|
||||||
|
@ -19,6 +16,7 @@ local get_meta = minetest.get_meta
|
||||||
local emerge_area = minetest.emerge_area
|
local emerge_area = minetest.emerge_area
|
||||||
|
|
||||||
--vector
|
--vector
|
||||||
|
local vector_new = vector.new
|
||||||
local vector_add = vector.add
|
local vector_add = vector.add
|
||||||
local vector_subtract = vector.subtract
|
local vector_subtract = vector.subtract
|
||||||
|
|
||||||
|
@ -43,24 +41,17 @@ local max_y = mcl_vars.mg_overworld_max - 1
|
||||||
local attempts = math_ceil(((mcl_vars.chunksize * mcl_vars.MAP_BLOCKSIZE) ^ 3) / 8192) -- 63 = 80*80*80/8192
|
local attempts = math_ceil(((mcl_vars.chunksize * mcl_vars.MAP_BLOCKSIZE) ^ 3) / 8192) -- 63 = 80*80*80/8192
|
||||||
|
|
||||||
local dungeonsizes = {
|
local dungeonsizes = {
|
||||||
{ x=5, y=4, z=5},
|
vector_new(5, 4, 5),
|
||||||
{ x=5, y=4, z=7},
|
vector_new(5, 4, 7),
|
||||||
{ x=7, y=4, z=5},
|
vector_new(7, 4, 5),
|
||||||
{ x=7, y=4, z=7},
|
vector_new(7, 4, 7),
|
||||||
}
|
}
|
||||||
|
|
||||||
--[[local dirs = {
|
|
||||||
{ x= 1, y=0, z= 0 },
|
|
||||||
{ x= 0, y=0, z= 1 },
|
|
||||||
{ x=-1, y=0, z= 0 },
|
|
||||||
{ x= 0, y=0, z=-1 },
|
|
||||||
}]]
|
|
||||||
|
|
||||||
local surround_vectors = {
|
local surround_vectors = {
|
||||||
{ x=-1, y=0, z=0 },
|
vector_new(-1, 0, 0),
|
||||||
{ x=1, y=0, z=0 },
|
vector_new( 1, 0, 0),
|
||||||
{ x=0, y=0, z=-1 },
|
vector_new( 0, 0, -1),
|
||||||
{ x=0, y=0, z=1 },
|
vector_new( 0, 0, 1),
|
||||||
}
|
}
|
||||||
|
|
||||||
local loottable =
|
local loottable =
|
||||||
|
@ -138,8 +129,8 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param)
|
||||||
if check then
|
if check then
|
||||||
for tx = x+1, x+dim.x do
|
for tx = x+1, x+dim.x do
|
||||||
for tz = z+1, z+dim.z do
|
for tz = z+1, z+dim.z do
|
||||||
local fdef = registered_nodes[get_node({x = tx, y = y_floor , z = tz}).name]
|
local fdef = registered_nodes[get_node(vector_new(tx, y_floor , tz)).name]
|
||||||
local cdef = registered_nodes[get_node({x = tx, y = y_ceiling, z = tz}).name]
|
local cdef = registered_nodes[get_node(vector_new(tx, y_ceiling, tz)).name]
|
||||||
if not fdef or not fdef.walkable or not cdef or not cdef.walkable then return false end
|
if not fdef or not fdef.walkable or not cdef or not cdef.walkable then return false end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -155,25 +146,25 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param)
|
||||||
|
|
||||||
local x2,z2 = x+dim.x+1, z+dim.z+1
|
local x2,z2 = x+dim.x+1, z+dim.z+1
|
||||||
|
|
||||||
if get_node({x=x, y=y+1, z=z}).name == "air" and get_node({x=x, y=y+2, z=z}).name == "air" then
|
if get_node(vector_new(x, y+1, z)).name == "air" and get_node(vector_new(x, y+2, z)).name == "air" then
|
||||||
openings_counter = openings_counter + 1
|
openings_counter = openings_counter + 1
|
||||||
if not openings[x] then openings[x]={} end
|
if not openings[x] then openings[x]={} end
|
||||||
openings[x][z] = true
|
openings[x][z] = true
|
||||||
table_insert(corners, {x=x, z=z})
|
table_insert(corners, {x=x, z=z})
|
||||||
end
|
end
|
||||||
if get_node({x=x2, y=y+1, z=z}).name == "air" and get_node({x=x2, y=y+2, z=z}).name == "air" then
|
if get_node(vector_new(x2, y+1, z)).name == "air" and get_node(vector_new(x2, y+2, z)).name == "air" then
|
||||||
openings_counter = openings_counter + 1
|
openings_counter = openings_counter + 1
|
||||||
if not openings[x2] then openings[x2]={} end
|
if not openings[x2] then openings[x2]={} end
|
||||||
openings[x2][z] = true
|
openings[x2][z] = true
|
||||||
table_insert(corners, {x=x2, z=z})
|
table_insert(corners, {x=x2, z=z})
|
||||||
end
|
end
|
||||||
if get_node({x=x, y=y+1, z=z2}).name == "air" and get_node({x=x, y=y+2, z=z2}).name == "air" then
|
if get_node(vector_new(x, y+1, z2)).name == "air" and get_node(vector_new(x, y+2, z2)).name == "air" then
|
||||||
openings_counter = openings_counter + 1
|
openings_counter = openings_counter + 1
|
||||||
if not openings[x] then openings[x]={} end
|
if not openings[x] then openings[x]={} end
|
||||||
openings[x][z2] = true
|
openings[x][z2] = true
|
||||||
table_insert(corners, {x=x, z=z2})
|
table_insert(corners, {x=x, z=z2})
|
||||||
end
|
end
|
||||||
if get_node({x=x2, y=y+1, z=z2}).name == "air" and get_node({x=x2, y=y+2, z=z2}).name == "air" then
|
if get_node(vector_new(x2, y+1, z2)).name == "air" and get_node(vector_new(x2, y+2, z2)).name == "air" then
|
||||||
openings_counter = openings_counter + 1
|
openings_counter = openings_counter + 1
|
||||||
if not openings[x2] then openings[x2]={} end
|
if not openings[x2] then openings[x2]={} end
|
||||||
openings[x2][z2] = true
|
openings[x2][z2] = true
|
||||||
|
@ -181,13 +172,13 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param)
|
||||||
end
|
end
|
||||||
|
|
||||||
for wx = x+1, x+dim.x do
|
for wx = x+1, x+dim.x do
|
||||||
if get_node({x=wx, y=y+1, z=z}).name == "air" and get_node({x=wx, y=y+2, z=z}).name == "air" then
|
if get_node(vector_new(wx, y+1, z)).name == "air" and get_node(vector_new(wx, y+2, z)).name == "air" then
|
||||||
openings_counter = openings_counter + 1
|
openings_counter = openings_counter + 1
|
||||||
if check and openings_counter > 5 then return end
|
if check and openings_counter > 5 then return end
|
||||||
if not openings[wx] then openings[wx]={} end
|
if not openings[wx] then openings[wx]={} end
|
||||||
openings[wx][z] = true
|
openings[wx][z] = true
|
||||||
end
|
end
|
||||||
if get_node({x=wx, y=y+1, z=z2}).name == "air" and get_node({x=wx, y=y+2, z=z2}).name == "air" then
|
if get_node(vector_new(wx, y+1, z2)).name == "air" and get_node(vector_new(wx, y+2, z2)).name == "air" then
|
||||||
openings_counter = openings_counter + 1
|
openings_counter = openings_counter + 1
|
||||||
if check and openings_counter > 5 then return end
|
if check and openings_counter > 5 then return end
|
||||||
if not openings[wx] then openings[wx]={} end
|
if not openings[wx] then openings[wx]={} end
|
||||||
|
@ -195,13 +186,13 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for wz = z+1, z+dim.z do
|
for wz = z+1, z+dim.z do
|
||||||
if get_node({x=x, y=y+1, z=wz}).name == "air" and get_node({x=x, y=y+2, z=wz}).name == "air" then
|
if get_node(vector_new(x, y+1, wz)).name == "air" and get_node(vector_new(x, y+2, wz)).name == "air" then
|
||||||
openings_counter = openings_counter + 1
|
openings_counter = openings_counter + 1
|
||||||
if check and openings_counter > 5 then return end
|
if check and openings_counter > 5 then return end
|
||||||
if not openings[x] then openings[x]={} end
|
if not openings[x] then openings[x]={} end
|
||||||
openings[x][wz] = true
|
openings[x][wz] = true
|
||||||
end
|
end
|
||||||
if get_node({x=x2, y=y+1, z=wz}).name == "air" and get_node({x=x2, y=y+2, z=wz}).name == "air" then
|
if get_node(vector_new(x2, y+1, wz)).name == "air" and get_node(vector_new(x2, y+2, wz)).name == "air" then
|
||||||
openings_counter = openings_counter + 1
|
openings_counter = openings_counter + 1
|
||||||
if check and openings_counter > 5 then return end
|
if check and openings_counter > 5 then return end
|
||||||
if not openings[x2] then openings[x2]={} end
|
if not openings[x2] then openings[x2]={} end
|
||||||
|
@ -243,7 +234,7 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param)
|
||||||
-- Check conditions. If okay, start generating
|
-- Check conditions. If okay, start generating
|
||||||
if check and (openings_counter < 1 or openings_counter > 5) then return end
|
if check and (openings_counter < 1 or openings_counter > 5) then return end
|
||||||
|
|
||||||
minetest.log("action","[mcl_dungeons] Placing new dungeon at "..minetest.pos_to_string({x=x,y=y,z=z}))
|
minetest.log("action","[mcl_dungeons] Placing new dungeon at "..minetest.pos_to_string(vector_new(x, y, z)))
|
||||||
-- Okay! Spawning starts!
|
-- Okay! Spawning starts!
|
||||||
|
|
||||||
-- Remember spawner chest positions to set metadata later
|
-- Remember spawner chest positions to set metadata later
|
||||||
|
@ -276,7 +267,7 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param)
|
||||||
local currentChest = 1
|
local currentChest = 1
|
||||||
|
|
||||||
-- Calculate the mob spawner position, to be re-used for later
|
-- Calculate the mob spawner position, to be re-used for later
|
||||||
local sp = {x = x + math_ceil(dim.x/2), y = y+1, z = z + math_ceil(dim.z/2)}
|
local sp = vector_new(x + math_ceil(dim.x/2), y+1, z + math_ceil(dim.z/2))
|
||||||
local rn = registered_nodes[get_node(sp).name]
|
local rn = registered_nodes[get_node(sp).name]
|
||||||
if rn and rn.is_ground_content then
|
if rn and rn.is_ground_content then
|
||||||
table_insert(spawner_posses, sp)
|
table_insert(spawner_posses, sp)
|
||||||
|
@ -288,7 +279,7 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param)
|
||||||
for tx = x, maxx do
|
for tx = x, maxx do
|
||||||
for tz = z, maxz do
|
for tz = z, maxz do
|
||||||
for ty = y, maxy do
|
for ty = y, maxy do
|
||||||
local p = {x = tx, y=ty, z=tz}
|
local p = vector_new(tx, ty, tz)
|
||||||
|
|
||||||
-- Do not overwrite nodes with is_ground_content == false (e.g. bedrock)
|
-- Do not overwrite nodes with is_ground_content == false (e.g. bedrock)
|
||||||
-- Exceptions: cobblestone and mossy cobblestone so neighborings dungeons nicely connect to each other
|
-- Exceptions: cobblestone and mossy cobblestone so neighborings dungeons nicely connect to each other
|
||||||
|
@ -327,7 +318,7 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param)
|
||||||
else
|
else
|
||||||
if (ty==y+1) and (tx==x+1 or tx==maxx-1 or tz==z+1 or tz==maxz-1) and (currentChest < totalChests + 1) and (chestSlots[currentChest] == chestSlotCounter) then
|
if (ty==y+1) and (tx==x+1 or tx==maxx-1 or tz==z+1 or tz==maxz-1) and (currentChest < totalChests + 1) and (chestSlots[currentChest] == chestSlotCounter) then
|
||||||
currentChest = currentChest + 1
|
currentChest = currentChest + 1
|
||||||
table_insert(chests, {x=tx, y=ty, z=tz})
|
table_insert(chests, vector_new(tx, ty, tz))
|
||||||
else
|
else
|
||||||
swap_node(p, {name = "air"})
|
swap_node(p, {name = "air"})
|
||||||
end
|
end
|
||||||
|
@ -337,7 +328,7 @@ local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param)
|
||||||
-- Place next chest at the wall (if it was its chosen wall slot)
|
-- Place next chest at the wall (if it was its chosen wall slot)
|
||||||
if forChest and (currentChest < totalChests + 1) and (chestSlots[currentChest] == chestSlotCounter) then
|
if forChest and (currentChest < totalChests + 1) and (chestSlots[currentChest] == chestSlotCounter) then
|
||||||
currentChest = currentChest + 1
|
currentChest = currentChest + 1
|
||||||
table_insert(chests, {x=tx, y=ty, z=tz})
|
table_insert(chests, vector_new(tx, ty, tz))
|
||||||
-- else
|
-- else
|
||||||
--swap_node(p, {name = "air"})
|
--swap_node(p, {name = "air"})
|
||||||
end
|
end
|
||||||
|
@ -411,8 +402,8 @@ local function dungeons_nodes(minp, maxp, blockseed)
|
||||||
local x = pr:next(minp.x, maxp.x-dim.x-1)
|
local x = pr:next(minp.x, maxp.x-dim.x-1)
|
||||||
local y = pr:next(ymin , ymax -dim.y-1)
|
local y = pr:next(ymin , ymax -dim.y-1)
|
||||||
local z = pr:next(minp.z, maxp.z-dim.z-1)
|
local z = pr:next(minp.z, maxp.z-dim.z-1)
|
||||||
local p1 = {x=x,y=y,z=z}
|
local p1 = vector_new(x, y, z)
|
||||||
local p2 = {x = x+dim.x+1, y = y+dim.y+1, z = z+dim.z+1}
|
local p2 = vector_new(x+dim.x+1, y+dim.y+1, z+dim.z+1)
|
||||||
minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2))
|
minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2))
|
||||||
emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr})
|
emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr})
|
||||||
end
|
end
|
||||||
|
@ -422,7 +413,7 @@ end
|
||||||
function mcl_dungeons.spawn_dungeon(p1, _, pr)
|
function mcl_dungeons.spawn_dungeon(p1, _, pr)
|
||||||
if not p1 or not pr or not p1.x or not p1.y or not p1.z then return end
|
if not p1 or not pr or not p1.x or not p1.y or not p1.z then return end
|
||||||
local dim = dungeonsizes[pr:next(1, #dungeonsizes)]
|
local dim = dungeonsizes[pr:next(1, #dungeonsizes)]
|
||||||
local p2 = {x = p1.x+dim.x+1, y = p1.y+dim.y+1, z = p1.z+dim.z+1}
|
local p2 = vector_new(p1.x+dim.x+1, p1.y+dim.y+1, p1.z+dim.z+1)
|
||||||
minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2))
|
minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2))
|
||||||
emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr, dontcheck=true})
|
emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr, dontcheck=true})
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue