From 465b4162e79e923ce34698b7727407462be9a074 Mon Sep 17 00:00:00 2001 From: kno10 Date: Thu, 5 Sep 2024 21:28:47 +0200 Subject: [PATCH] use swap_node instead of set_node in mapgen, tweaks to end --- mods/CORE/mcl_util/init.lua | 13 +++++ mods/MAPGEN/mcl_biomes/init.lua | 6 +- mods/MAPGEN/mcl_mapgen_core/init.lua | 14 ++--- mods/MAPGEN/mcl_mapgen_core/v6.lua | 16 +++--- mods/MAPGEN/mcl_nether_fortresses/init.lua | 4 +- mods/MAPGEN/mcl_structures/end_spawn.lua | 58 ++++++++++---------- mods/MAPGEN/mcl_structures/ruined_portal.lua | 14 ++--- mods/MAPGEN/mcl_structures/witch_hut.lua | 2 +- mods/MAPGEN/mcl_terrain_features/init.lua | 22 ++++---- mods/MAPGEN/mcl_villages/paths.lua | 2 +- mods/MAPGEN/tsm_railcorridors/init.lua | 4 +- 11 files changed, 83 insertions(+), 72 deletions(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 6143bfb41..a39a897ba 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -1131,3 +1131,16 @@ if not vector.in_area then (pos.z >= min.z) and (pos.z <= max.z) end end + +if not minetest.bulk_swap_node then -- maybe in 5.10 https://github.com/minetest/minetest/pull/15043 + minetest.bulk_swap_node = function(pos_list, node) + -- for dense and large sets, we could also try a VManip, but often this enough for now + local swap_node = minetest.swap_node + for _, pos in ipairs(pos_list) do + swap_node(pos, node) + end + end + -- async emerge environment, untested: + if minetest.set_node == minetest.swap_node then minetest.bulk_swap_node = minetest.bulk_set_node end +end + diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index da18c755d..b2bb5fecd 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -3542,11 +3542,11 @@ local function mangrove_root_gennotify(t, minp, maxp, blockseed) if minetest.get_item_group(n, "water") > 0 then local wl = "mcl_mangrove:water_logged_roots" if n:find("river") then wl = "mcl_mangrove:river_water_logged_roots" end - minetest.bulk_set_node(minetest.find_nodes_in_area(v, vector.offset(v, 0, -l, 0), {"group:water"}), {name = wl}) + minetest.bulk_swap_node(minetest.find_nodes_in_area(v, vector.offset(v, 0, -l, 0), {"group:water"}), {name = wl}) elseif n == "mcl_mud:mud" then - minetest.bulk_set_node(minetest.find_nodes_in_area(v, vector.offset(v, 0, -l, 0), {"mcl_mud:mud"}), {name = "mcl_mangrove:mangrove_mud_roots"}) + minetest.bulk_swap_node(minetest.find_nodes_in_area(v, vector.offset(v, 0, -l, 0), {"mcl_mud:mud"}), {name = "mcl_mangrove:mangrove_mud_roots"}) elseif n == "air" then - minetest.bulk_set_node(minetest.find_nodes_in_area(v, vector.offset(v, 0, -l, 0), {"air"}), {name = "mcl_mangrove:mangrove_roots"}) + minetest.bulk_swap_node(minetest.find_nodes_in_area(v, vector.offset(v, 0, -l, 0), {"air"}), {name = "mcl_mangrove:mangrove_roots"}) end end end diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 0f223ad21..fee681649 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -432,7 +432,7 @@ minetest.register_lbm({ local grass_palette_index = mcl_util.get_palette_indexes_from_pos(pos).grass_palette_index if node.param2 ~= grass_palette_index then node.param2 = grass_palette_index - minetest.set_node(pos, node) + minetest.swap_node(pos, node) end end }) @@ -451,14 +451,14 @@ minetest.register_lbm({ minetest.place_node(vector.offset(pos, 0, 1, 0), node) -- Offset required, since otherwise the leaves sink one node for some reason. elseif node.param2 ~= foliage_palette_index and node.name ~= "mcl_core:vine" then node.param2 = foliage_palette_index - minetest.set_node(pos, node) + minetest.swap_node(pos, node) elseif node.name == "mcl_core:vine" then local biome_param2 = foliage_palette_index local rotation_param2 = mcl_util.get_colorwallmounted_rotation(pos) local final_param2 = (biome_param2 * 8) + rotation_param2 if node.param2 ~= final_param2 then node.param2 = final_param2 - minetest.set_node(pos, node) + minetest.swap_node(pos, node) end end end @@ -473,7 +473,7 @@ minetest.register_lbm({ local water_palette_index = mcl_util.get_palette_indexes_from_pos(pos).water_palette_index if node.param2 ~= water_palette_index then node.param2 = water_palette_index - minetest.set_node(pos, node) + minetest.swap_node(pos, node) end end }) @@ -486,7 +486,7 @@ minetest.register_lbm({ action = function(pos, node) if node.param2 ~= 3 then node.param2 = 3 - minetest.set_node(pos, node) + minetest.swap_node(pos, node) end end }) @@ -503,14 +503,14 @@ local function fix_foliage_missed(minp, maxp, blockseed) local foliage_palette_index = mcl_util.get_palette_indexes_from_pos(fpos).foliage_palette_index if fnode.param2 ~= foliage_palette_index and fnode.name ~= "mcl_core:vine" then fnode.param2 = foliage_palette_index - minetest.set_node(fpos, fnode) + minetest.swap_node(fpos, fnode) elseif fnode.name == "mcl_core:vine" then local biome_param2 = foliage_palette_index local rotation_param2 = mcl_util.get_colorwallmounted_rotation(fpos) local final_param2 = (biome_param2 * 8) + rotation_param2 if fnode.param2 ~= final_param2 then fnode.param2 = final_param2 - minetest.set_node(fpos, fnode) + minetest.swap_node(fpos, fnode) end end end diff --git a/mods/MAPGEN/mcl_mapgen_core/v6.lua b/mods/MAPGEN/mcl_mapgen_core/v6.lua index 23ac3faf2..350382b24 100644 --- a/mods/MAPGEN/mcl_mapgen_core/v6.lua +++ b/mods/MAPGEN/mcl_mapgen_core/v6.lua @@ -570,7 +570,7 @@ local function generate_mgv6_structures() local function place_tree_if_free(pos, prev_result) local nn = minetest.get_node(pos).name if nn == "mcl_flowers:waterlily" or nn == "mcl_core:water_source" or nn == "mcl_core:water_flowing" or nn == "air" then - minetest.set_node(pos, {name="mcl_core:tree", param2=0}) + minetest.swap_node(pos, {name="mcl_core:tree", param2=0}) return prev_result else return false @@ -676,9 +676,9 @@ local function generate_underground_mushrooms(minp, maxp, seed) local l = minetest.get_node_light(bpos, 0.5) if bpos.y >= min and bpos.y <= max and l and l <= 12 and pr_shroom:next(1,1000) < 4 then if pr_shroom:next(1,2) == 1 then - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) + minetest.swap_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) else - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) + minetest.swap_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) end end end @@ -715,14 +715,14 @@ local function generate_nether_decorations(minp, maxp, seed) special_deco(rack, function(bpos) -- Eternal fire on netherrack if pr_nether:next(1,100) <= 3 then - minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) + minetest.swap_node(bpos, {name = "mcl_fire:eternal_fire"}) end end) -- Eternal fire on magma cubes special_deco(magma, function(bpos) if pr_nether:next(1,150) == 1 then - minetest.set_node(bpos, {name = "mcl_fire:eternal_fire"}) + minetest.swap_node(bpos, {name = "mcl_fire:eternal_fire"}) end end) @@ -733,9 +733,9 @@ local function generate_nether_decorations(minp, maxp, seed) if bpos.y > mcl_vars.mg_lava_nether_max + 6 and l and l <= 12 and pr_nether:next(1,1000) <= 4 then -- TODO: Make mushrooms appear in groups, use Perlin noise if pr_nether:next(1,2) == 1 then - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) + minetest.swap_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) else - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) + minetest.swap_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) end end end) @@ -744,7 +744,7 @@ local function generate_nether_decorations(minp, maxp, seed) -- TODO: Spawn in Nether fortresses special_deco(ssand, function(bpos) if pr_nether:next(1, nether_wart_chance) == 1 then - minetest.set_node(bpos, {name = "mcl_nether:nether_wart"}) + minetest.swap_node(bpos, {name = "mcl_nether:nether_wart"}) end end) end diff --git a/mods/MAPGEN/mcl_nether_fortresses/init.lua b/mods/MAPGEN/mcl_nether_fortresses/init.lua index 248d651f0..57951c2e5 100644 --- a/mods/MAPGEN/mcl_nether_fortresses/init.lua +++ b/mods/MAPGEN/mcl_nether_fortresses/init.lua @@ -50,7 +50,7 @@ vl_structures.register_structure("nether_bridge",{ table.insert(bricks,leg) end end - minetest.bulk_set_node(bricks, {name = "mcl_nether:nether_brick", param2 = 2}) + minetest.bulk_swap_node(bricks, {name = "mcl_nether:nether_brick", param2 = 2}) end }) @@ -112,7 +112,7 @@ vl_structures.register_structure("nether_outpost_with_bridges",{ table.insert(bricks,leg) end end - minetest.bulk_set_node(bricks, {name = "mcl_nether:nether_brick", param2 = 2}) + minetest.bulk_swap_node(bricks, {name = "mcl_nether:nether_brick", param2 = 2}) local p1, p2 = vector.offset(pos,-45,12,-45), vector.offset(pos,45,22,45) vl_structures.spawn_mobs("mobs_mc:witherskeleton",{"mcl_blackstone:blackstone_chiseled_polished"},p1,p2,pr,5) diff --git a/mods/MAPGEN/mcl_structures/end_spawn.lua b/mods/MAPGEN/mcl_structures/end_spawn.lua index 8dee555cb..a518b9597 100644 --- a/mods/MAPGEN/mcl_structures/end_spawn.lua +++ b/mods/MAPGEN/mcl_structures/end_spawn.lua @@ -14,9 +14,9 @@ mcl_structures.spawn_end_gateway_portal = function(pos) vl_structures.place_schematic(pos, 0, schematic, "0", { name="end_gateway_portal", prepare = false }) end -local function make_endspike(pos, width, height) +local function make_endspike(pos, rad, height) -- FIXME: why find_nodes, not just use the circle? - local nn = minetest.find_nodes_in_area(vector.offset(pos, -width/2, 0, -width/2), vector.offset(pos, width/2, 0, width/2), {"air", "group:solid"}) + local nn = minetest.find_nodes_in_area(vector.offset(pos, -rad, 0, -rad), vector.offset(pos, rad, 0, rad), {"air", "group:solid"}) table.sort(nn,function(a, b) return vector.distance(pos, a) < vector.distance(pos, b) end) @@ -26,20 +26,21 @@ local function make_endspike(pos, width, height) table.insert(nodes, vector.offset(nn[i], 0, j, 0)) end end - minetest.bulk_set_node(nodes, {name = "mcl_core:obsidian"}) + minetest.bulk_swap_node(nodes, {name = "mcl_core:obsidian"}) return vector.offset(pos, 0, height, 0) end -function make_cage(pos, width) +function make_cage(pos, rad) if not xpanes then return end local nodes = {} - local r = math.max(1, math.floor(width/2) - 2) - for x=-r,r do for y = 0,width do for z = -r,r do - if x == r or x == -r or z==r or z == -r then - table.insert(nodes,vector.add(pos,vector.new(x,y,z))) - end - end end end - minetest.bulk_set_node(nodes, {name = "xpanes:bar_flat"} ) + local r = math.max(1, rad - 2) + for y = 0, rad * 2 do for xz = -r, r do + table.insert(nodes,vector.add(pos,vector.new(xz,y, r))) + table.insert(nodes,vector.add(pos,vector.new(xz,y,-r))) + table.insert(nodes,vector.add(pos,vector.new( r,y,xz))) + table.insert(nodes,vector.add(pos,vector.new(-r,y,xz))) + end end + minetest.bulk_swap_node(nodes, {name = "xpanes:bar_flat"} ) for _,p in pairs(nodes) do xpanes.update_pane(p) end end @@ -59,36 +60,33 @@ mcl_mapgen_core.register_generator("end structures", nil, function(minp, maxp, b local pos = mcl_vars.mg_end_platform_pos if vector.in_area(pos, minp, maxp) then local obby = minetest.find_nodes_in_area(vector.offset(pos,-2,0,-2),vector.offset(pos,2,0,2),{"air","mcl_end:end_stone"}) - local air = minetest.find_nodes_in_area(vector.offset(pos,-2,1,-2),vector.offset(pos,2,3,2),{"air","mcl_end:end_stone"}) - minetest.bulk_set_node(obby,{name="mcl_core:obsidian"}) - minetest.bulk_set_node(air,{name="air"}) + local air = minetest.find_nodes_in_area(vector.offset(pos,-2,1,-2),vector.offset(pos,2,3,2),{"air","mcl_end:end_stone"}) + minetest.bulk_swap_node(obby,{name="mcl_core:obsidian"}) + minetest.bulk_swap_node(air,{name="air"}) end -- end exit portal and pillars local pos = mcl_vars.mg_end_exit_portal_pos if vector.in_area(pos, minp, maxp) then - pr = PcgRandom(worldseed) + local pr = PcgRandom(worldseed) -- emerge pillars - for _, pos in ipairs(get_points_on_circle(vector.offset(mcl_vars.mg_end_exit_portal_pos, 0, -20, 0), 43, 10)) do - local d = pr:next(6,12) - local h = d * pr:next(4,6) - local p1, p2 = vector.offset(pos, -d / 2, 0, -d / 2), vector.offset(pos, d / 2, h + d, d / 2) - minetest.emerge_area(p1, p2, function(_, _, calls_remaining) - if calls_remaining ~= 0 then return end - local s = make_endspike(pos,d,h) - minetest.set_node(vector.offset(s,0,1,0),{name="mcl_core:bedrock"}) - minetest.add_entity(vector.offset(s,0,2,0),"mcl_end:crystal") - if pr:next(1,3) == 1 then - make_cage(vector.offset(s,0,1,0),d) - end - end) - end + local p1, p2 = vector.offset(pos, -43-6, -10, -43-6), vector.offset(pos, 43+6, 12*6-10, 43+6) + minetest.emerge_area(p1, p2, function(_, _, calls_remaining) + if calls_remaining ~= 0 then return end + for _, p in ipairs(get_points_on_circle(vector.offset(pos, 0, -10, 0), 43, 10)) do + local rad = pr:next(3,6) + local top = make_endspike(p, rad, rad * 2 * pr:next(4,6) - 10) + minetest.swap_node(vector.offset(top, 0, 1, 0), {name = "mcl_core:bedrock"}) + minetest.add_entity(vector.offset(top, 0, 2, 0), "mcl_end:crystal") + if pr:next(1, 3) == 1 then make_cage(vector.offset(top, 0, 1, 0), rad) end + end + end) -- emerge end portal local schematic = vl_structures.load_schematic(modpath.."/schematics/mcl_structures_end_exit_portal.mts") vl_structures.place_schematic(pos, 0, schematic, "0", { name = "end portal", prepare = false, after_place = function(pos,def,pr,pmin,pmax,size,rot) -- spawn ender dragon if minetest.settings:get_bool("only_peaceful_mobs", false) then return end - minetest.bulk_set_node(minetest.find_nodes_in_area(pmin, pmax, {"mcl_portals:portal_end"}), { name="air" }) + minetest.bulk_swap_node(minetest.find_nodes_in_area(pmin, pmax, {"mcl_portals:portal_end"}), { name="air" }) local obj = minetest.add_entity(vector.offset(pos, 3, 11, 3), "mobs_mc:enderdragon") if obj then local dragon_entity = obj:get_luaentity() diff --git a/mods/MAPGEN/mcl_structures/ruined_portal.lua b/mods/MAPGEN/mcl_structures/ruined_portal.lua index 697946431..95c6d8010 100644 --- a/mods/MAPGEN/mcl_structures/ruined_portal.lua +++ b/mods/MAPGEN/mcl_structures/ruined_portal.lua @@ -33,14 +33,14 @@ local def = { local rack = minetest.find_nodes_in_area(p1,p2,{"mcl_nether:netherrack"}) local brick = minetest.find_nodes_in_area(p1,p2,{"mcl_core:stonebrick"}) local obby = minetest.find_nodes_in_area(p1,p2,{"mcl_core:obsidian"}) - minetest.bulk_set_node(get_replacements(gold,30,pr),{name="air"}) - minetest.bulk_set_node(get_replacements(lava,20,pr),{name="mcl_nether:magma"}) - minetest.bulk_set_node(get_replacements(rack,7,pr),{name="mcl_nether:magma"}) - minetest.bulk_set_node(get_replacements(obby,30,pr),{name="mcl_core:crying_obsidian"}) - minetest.bulk_set_node(get_replacements(obby,10,pr),{name="air"}) - minetest.bulk_set_node(get_replacements(brick,50,pr),{name="mcl_core:stonebrickcracked"}) + minetest.bulk_swap_node(get_replacements(gold,30,pr),{name="air"}) + minetest.bulk_swap_node(get_replacements(lava,20,pr),{name="mcl_nether:magma"}) + minetest.bulk_swap_node(get_replacements(rack,7,pr),{name="mcl_nether:magma"}) + minetest.bulk_swap_node(get_replacements(obby,30,pr),{name="mcl_core:crying_obsidian"}) + minetest.bulk_swap_node(get_replacements(obby,10,pr),{name="air"}) + minetest.bulk_swap_node(get_replacements(brick,50,pr),{name="mcl_core:stonebrickcracked"}) brick = minetest.find_nodes_in_area(p1,p2,{"mcl_core:stonebrick"}) - minetest.bulk_set_node(get_replacements(brick,50,pr),{name="mcl_core:stonebrickmossy"}) + minetest.bulk_swap_node(get_replacements(brick,50,pr),{name="mcl_core:stonebrickmossy"}) end, loot = { ["mcl_chests:chest_small" ] ={{ diff --git a/mods/MAPGEN/mcl_structures/witch_hut.lua b/mods/MAPGEN/mcl_structures/witch_hut.lua index c21401fd9..611a75f31 100644 --- a/mods/MAPGEN/mcl_structures/witch_hut.lua +++ b/mods/MAPGEN/mcl_structures/witch_hut.lua @@ -40,7 +40,7 @@ local function hut_placement_callback(pos,def,pr,p1,p2) table.insert(tree,leg) end end - minetest.bulk_set_node(tree, {name = "mcl_core:tree", param2 = 2}) + minetest.bulk_swap_node(tree, {name = "mcl_core:tree", param2 = 2}) spawn_witch(p1,p2) end diff --git a/mods/MAPGEN/mcl_terrain_features/init.lua b/mods/MAPGEN/mcl_terrain_features/init.lua index 23e790102..11ca51145 100644 --- a/mods/MAPGEN/mcl_terrain_features/init.lua +++ b/mods/MAPGEN/mcl_terrain_features/init.lua @@ -33,8 +33,8 @@ local function makelake(pos,size,liquid,placein,border,pr,noair) airtower(nn[i],air,20) table.insert(lq,nn[i]) end - minetest.bulk_set_node(lq,{name=liquid}) - minetest.bulk_set_node(air,{name="air"}) + minetest.bulk_swap_node(lq,{name=liquid}) + minetest.bulk_swap_node(air,{name="air"}) air = {} local br = {} for k,v in pairs(lq) do @@ -61,8 +61,8 @@ local function makelake(pos,size,liquid,placein,border,pr,noair) end end end - minetest.bulk_set_node(br,{name=border}) - minetest.bulk_set_node(air,{name="air"}) + minetest.bulk_swap_node(br,{name=border}) + minetest.bulk_swap_node(air,{name="air"}) return true end) return true @@ -258,8 +258,8 @@ vl_structures.register_structure("basalt_column",{ end end end - minetest.bulk_set_node(magma,{name="mcl_nether:magma"}) - minetest.bulk_set_node(basalt,{name="mcl_blackstone:basalt"}) + minetest.bulk_swap_node(magma,{name="mcl_nether:magma"}) + minetest.bulk_swap_node(basalt,{name="mcl_blackstone:basalt"}) return true end }) @@ -299,8 +299,8 @@ vl_structures.register_structure("basalt_pillar",{ end end end - minetest.bulk_set_node(basalt,{name="mcl_blackstone:basalt"}) - minetest.bulk_set_node(magma,{name="mcl_nether:magma"}) + minetest.bulk_swap_node(basalt,{name="mcl_blackstone:basalt"}) + minetest.bulk_swap_node(magma,{name="mcl_nether:magma"}) return true end }) @@ -333,7 +333,7 @@ vl_structures.register_structure("lavadelta",{ for i=1,pr:next(1,#nn) do table.insert(lava,nn[i]) end - minetest.bulk_set_node(lava,{name="mcl_nether:nether_lava_source"}) + minetest.bulk_swap_node(lava,{name="mcl_nether:nether_lava_source"}) local basalt = {} local magma = {} for _,v in pairs(lava) do @@ -348,8 +348,8 @@ vl_structures.register_structure("lavadelta",{ table.insert(magma,v) end end - minetest.bulk_set_node(basalt,{name="mcl_blackstone:basalt"}) - minetest.bulk_set_node(magma,{name="mcl_nether:magma"}) + minetest.bulk_swap_node(basalt,{name="mcl_blackstone:basalt"}) + minetest.bulk_swap_node(magma,{name="mcl_nether:magma"}) return true end }) diff --git a/mods/MAPGEN/mcl_villages/paths.lua b/mods/MAPGEN/mcl_villages/paths.lua index c3b4be963..592c5dfa5 100644 --- a/mods/MAPGEN/mcl_villages/paths.lua +++ b/mods/MAPGEN/mcl_villages/paths.lua @@ -14,7 +14,7 @@ local path_ends = {} function mcl_villages.clean_no_paths(minp, maxp) local no_paths_nodes = minetest.find_nodes_in_area(minp, maxp, { "mcl_villages:no_paths" }) if #no_paths_nodes > 0 then - minetest.bulk_set_node(no_paths_nodes, { name = "air" }) + minetest.bulk_swap_node(no_paths_nodes, { name = "air" }) end end diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index 4d1c31cd9..59d370fdc 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -378,8 +378,8 @@ local function Platform(p, radius, node, node2) end end end - minetest.bulk_set_node(n1,node) - minetest.bulk_set_node(n2,node2) + minetest.bulk_swap_node(n1,node) + minetest.bulk_swap_node(n2,node2) end -- Chests