Refactor decorations

Split them into pre- and post-data voxelmanip operations
pull/2/head
Bram van den Heuvel 2024-04-30 17:00:37 +02:00 committed by Bram
parent 4c3d40fdbd
commit 3c38b5844a
1 changed files with 64 additions and 74 deletions

138
init.lua
View File

@ -298,6 +298,7 @@ function internal.clean_deco_def(def)
decoration = def.decoration, decoration = def.decoration,
schematic = def.schematic, schematic = def.schematic,
fill_ratio = def.fill_ratio, fill_ratio = def.fill_ratio,
biomes = def.biomes,
} }
if def.place_on == "floor" or def.place_on == "ceiling" then if def.place_on == "floor" or def.place_on == "ceiling" then
@ -782,7 +783,7 @@ function internal.generate_caves(data, minp, maxp)
end end
end) end)
return vmanip.arr, schems return vmanip, schems
end end
-- Get the noise params for the cave biome temperature. -- Get the noise params for the cave biome temperature.
@ -905,76 +906,51 @@ end
-- minetest.chat_send_all(os.time() .. " - " .. text) -- minetest.chat_send_all(os.time() .. " - " .. text)
-- end -- end
-- Place a table full of schematics into the world -- Place all schematic decorations into the world
function internal.place_schematics(schems) function internal.place_schematic_decorations(vmanip, schems)
for _, schem in ipairs(schems) do for _, schem in ipairs(schems) do
local pos = schem.pos local pos = schem.pos
local deco = schem.deco local deco = schem.deco
if deco.deco_type == "simple" then if deco.deco_type ~= "schematic" then
local h_min = deco.height
local h_max = math.max(deco.height_max, deco.height)
local dy = deco.place_offset_y - 1
if deco.place_on == "floor" then
for y = 1, math.random(h_min, h_max), 1 do
minetest.set_node(
{ x = pos.x, y = pos.y + y + dy, z = pos.z },
{ name = deco.decoration }
)
end
elseif deco.place_on == "ceiling" then
for y = 1, math.random(h_min, h_max), 1 do
minetest.set_node(
{ x = pos.x, y = pos.y - y - dy, z = pos.z },
{ name = deco.decoration }
)
end
else
error("Unknown place_on parameter `" .. deco.place_on .. "` for simple decoration!")
end
elseif deco.deco_type == "schematic" then
local name = deco.schematic
local force_placement = true
if string.find("force_placement", deco.flags) then
force_placement = true
end
if deco.place_on == "floor" then
local n = minetest.place_schematic(
pos, name, deco.rotation, deco.replacements,
force_placement, deco.flags
)
if type(n) == "nil" then
minetest.chat_send_all("Squeak could not load!")
else
minetest.chat_send_all("Placed a Squeak!")
if not tpd_yet then
minetest.get_player_by_name("singleplayer"):move_to(pos)
tpd_yet = true
minetest.chat_send_all(internal.pos_to_str(pos))
end
end
elseif deco.place_on == "ceiling" then
-- Aim to place schematic against the ceiling, not through it
local h = minetest.read_schematic(name).size.y
local c_pos = { x = pos.x, y = pos.y - h, z = pos.z }
if string.find("place_center_y", deco.flags) then
c_pos = pos
end
minetest.place_schematic(
pos, name, deco.rotation, deco.replacements,
force_placement, deco.flags
)
else
error("Unknown place_on parameter `" .. deco.place_on .. "` for simple decoration!")
end
else else
error("Unknown decoration type `" .. deco.deco_type .. "`") minetest.place_schematic_on_vmanip(
vmanip, pos,
deco.schematic, deco.rotation, deco.replacement,
true, deco.flags
)
end
end
end
-- Place all simple decorations into the world
function internal.place_simple_decorations(flat, schems)
for _, schem in ipairs(schems) do
if schem.deco.deco_type == "simple" then
local pos = schem.pos
local deco = schem.deco
local i = flat:pos_to_index(pos)
local dir = nil
if deco.place_on == "floor" then
dir = flat.up
elseif deco.place_on == "ceiling" then
dir = flat.down
else
error("Invalid place_on value `" .. deco.place_on .. "`")
end
local h_min = deco.height
local h_max = math.max(deco.height, deco.height_max)
for dy = 0, math.random(h_min, h_max) - 1, 1 do
local li = i + dir * dy
flat:set_index(li, minetest.get_content_id(deco.decoration))
end
end end
end end
end end
@ -1203,14 +1179,14 @@ minetest.register_on_generated(function(minp, maxp, blockseed)
math.randomseed(blockseed) math.randomseed(blockseed)
local vm = minetest.get_mapgen_object("voxelmanip") local vm = minetest.get_mapgen_object("voxelmanip")
local data = vm:get_data() local flat, schems = internal.generate_caves(vm:get_data(), minp, maxp)
data, schems = internal.generate_caves(data, minp, maxp) internal.place_simple_decorations(flat, schems)
vm:set_data(data) vm:set_data(flat.arr)
vm:write_to_map() vm:write_to_map()
internal.place_schematics(schems) internal.place_schematic_decorations(vm, schems)
end) end)
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@ -1317,8 +1293,8 @@ noordstar_caves.register_biome({
node_wall = "mcl_core:sand", node_wall = "mcl_core:sand",
node_roof = "mcl_ocean:sea_lantern", node_roof = "mcl_ocean:sea_lantern",
node_dust = "mcl_core:snow", node_dust = "mcl_core:snow",
heat_point = 0, heat_point = 80,
humidity_point = 0, humidity_point = 80,
}) })
noordstar_caves.register_biome({ noordstar_caves.register_biome({
name = "test2", name = "test2",
@ -1328,6 +1304,11 @@ noordstar_caves.register_biome({
heat_point = 100, heat_point = 100,
humidity_point = 100, humidity_point = 100,
}) })
-- noordstar_caves.register_biome({
-- name = "test3",
-- heat_point = 50,
-- humidity_point = 50,
-- })
noordstar_caves.register_decoration({ noordstar_caves.register_decoration({
deco_type = "simple", deco_type = "simple",
@ -1338,11 +1319,20 @@ noordstar_caves.register_decoration({
height_max = 8, height_max = 8,
biomes = { "test" }, biomes = { "test" },
}) })
noordstar_caves.register_decoration({
deco_type = "simple",
place_on = "floor",
fill_ratio = 0.1,
decoration = "mcl_ocean:sea_lantern",
height = 1,
height_max = 4,
biomes = { "test2" },
})
noordstar_caves.register_decoration({ noordstar_caves.register_decoration({
deco_type = "schematic", deco_type = "schematic",
place_on = "floor", place_on = "floor",
fill_ratio = 0.005, fill_ratio = 0.005,
schematic = "test.mts", schematic = squeak,
rotation = "random", rotation = "random",
place_offset_y = 5, -- place_offset_y = 5,
}) })