Refactor decorations
Split them into pre- and post-data voxelmanip operationspull/2/head
parent
4c3d40fdbd
commit
3c38b5844a
138
init.lua
138
init.lua
|
@ -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,
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue