Improve mapgen, add grass, and include the fill tool.

This commit is contained in:
Signal 2026-01-15 18:54:28 -05:00
parent 1e897665bb
commit 4659a008ac
86 changed files with 1098 additions and 293 deletions

71
mods/rgt_world/biomes.lua Normal file
View file

@ -0,0 +1,71 @@
minetest.register_biome {
name = "forest",
node_top = "dirt_grass",
depth_top = 1,
node_filler = "dirt",
depth_filler = 5,
node_riverbed = "dirt",
depth_riverbed = 3,
node_dungeon = "cobble",
node_dungeon_alt = "stone_brick_large",
y_max = 3000,
y_min = 2,
vertical_blend = 2,
heat_point = 50,
humidity_point = 50,
}
minetest.register_biome {
name = "plains",
node_top = "dirt_grass",
depth_top = 1,
node_filler = "dirt",
depth_filler = 5,
node_riverbed = "dirt",
depth_riverbed = 3,
node_dungeon = "cobble",
node_dungeon_alt = "stone_brick_large",
y_max = 3000,
y_min = 2,
vertical_blend = 2,
heat_point = 50,
humidity_point = 30,
}
minetest.register_biome {
name = "beach",
node_top = "sand",
depth_top = 1,
node_filler = "sand",
depth_filler = 2,
node_riverbed = "sand",
depth_riverbed = 3,
node_dungeon = "cobble",
node_dungeon_alt = "stone_brick_large",
y_max = 1,
y_min = -3,
vertical_blend = 1,
heat_point = 50,
humidity_point = 50,
}

162
mods/rgt_world/config.lua Normal file
View file

@ -0,0 +1,162 @@
-- This file configures the Valleys mapgen settings to produce much larger-scale, more explorable terrain.
-- These settings were originally posted by voxelproof on the Minetest forum: https://forum.luanti.org/viewtopic.php?p=336441#p336441
minetest.set_mapgen_setting_noiseparams("mgvalleys_np_terrain_height", {
flags = "defaults",
lacunarity = 1,
offset = -10,
scale = 1000,
spread = vector.new(2048,2048,4096),
seed = 4541,
octaves = 6,
persistence = 0.45,
}, true)
minetest.set_mapgen_setting_noiseparams("mgvalleys_np_inter_valley_slope", {
flags = "defaults",
lacunarity = 2,
offset = 0.5,
scale = 0.5,
spread = vector.new(128,128,1024),
seed = 746,
octaves = 1,
persistence = 1,
}, true)
minetest.set_mapgen_setting_noiseparams("mgvalleys_np_inter_valley_fill", {
flags = "defaults",
lacunarity = 2,
offset = 0,
scale = 1,
spread = vector.new(256,512,256),
seed = 1993,
octaves = 6,
persistence = 0.8,
}, true)
minetest.set_mapgen_setting_noiseparams("mgvalleys_np_filler_depth", {
flags = "defaults",
lacunarity = 2,
offset = 0,
scale = 1.2,
spread = vector.new(256,256,256),
seed = 1605,
octaves = 3,
persistence = 0.5,
}, true)
minetest.set_mapgen_setting_noiseparams("mgvalleys_np_massive_caves", {
flags = "defaults",
lacunarity = 2,
offset = 0,
scale = 1,
spread = vector.new(512,256,256),
seed = 59033,
octaves = 6,
persistence = 0.63,
}, true)
minetest.set_mapgen_setting_noiseparams("mgvalleys_np_cave2", {
flags = "defaults",
lacunarity = 2,
offset = 0,
scale = 23, -- 13
spread = vector.new(67,67,67),
seed = 10325,
octaves = 3,
persistence = 0.5,
}, true)
minetest.set_mapgen_setting_noiseparams("mgvalleys_np_cave1", {
flags = "defaults",
lacunarity = 2,
offset = 0,
scale = 23, -- 13
spread = vector.new(61,61,61),
seed = 52534,
octaves = 3,
persistence = 0.3,
}, true)
--mgvalleys_cave_width = 0.01
--mgvalleys_river_size = 2
--mg_flags = caves, dungeons, light, decorations
--chunksize = 5
--mgvalleys_lava_features = 0
--mg_name = valleys
--mapgen_limit = 31000
--water_level = 1
--seed = 18446744073709545565
minetest.set_mapgen_setting_noiseparams("mgvalleys_np_rivers", {
flags = "defaults",
lacunarity = 2,
offset = 0,
scale = 2,
spread = vector.new(512,512,128),
seed = -6050,
octaves = 5,
persistence = 0.6,
}, true)
minetest.set_mapgen_setting_noiseparams("mg_biome_np_heat", {
flags = "defaults",
lacunarity = 2,
offset = 50,
scale = 50,
spread = vector.new(1000,1000,1000),
seed = 5349,
octaves = 3,
persistence = 0.5,
}, true)
--mgvalleys_water_features = 0
minetest.set_mapgen_setting_noiseparams("mg_biome_np_heat_blend", {
flags = "defaults",
lacunarity = 2,
offset = 0,
scale = 1.5,
spread = vector.new(8,8,8),
seed = 13,
octaves = 2,
persistence = 1,
}, true)
minetest.set_mapgen_setting_noiseparams("mg_biome_np_humidity", {
flags = "defaults",
lacunarity = 2,
offset = 50,
scale = 50,
spread = vector.new(1000,1000,1000),
seed = 842,
octaves = 3,
persistence = 0.5,
}, true)
minetest.set_mapgen_setting_noiseparams("mg_biome_np_humidity_blend", {
flags = "defaults",
lacunarity = 2,
offset = 0,
scale = 1.5,
spread = vector.new(8,8,8),
seed = 90003,
octaves = 2,
persistence = 1,
}, true)
minetest.set_mapgen_setting("mgvalleys_spflags", "altitude_chill, humid_rivers")
minetest.set_mapgen_setting_noiseparams("mgvalleys_np_valley_depth", {
flags = "defaults",
lacunarity = 2,
offset = 5,
scale = 4,
spread = vector.new(512,512,1024),
seed = -1914,
octaves = 1,
persistence = 1,
}, true)
minetest.set_mapgen_setting("mgvalleys_altitude_chill", 90)
minetest.set_mapgen_setting_noiseparams("mgvalleys_np_valley_profile", {
flags = "defaults",
lacunarity = 2,
offset = 0.6,
scale = 0.5,
spread = vector.new(64,2048,1024),
seed = 777,
octaves = 1,
persistence = 1,
}, true)
--mgvalleys_large_cave_depth = -33
--mgvalleys_massive_cave_depth = -256
minetest.set_mapgen_setting("mgvalleys_river_depth", 0, true)
-- This ensures both that caverns are appropriately hard to reach and that they won't be reached on a large scale by oceans.
minetest.set_mapgen_setting("mgvalleys_cavern_limit", -1400, true)

View file

@ -40,7 +40,7 @@ rgt.register_node("stone_tile", {
rgt.register_node("cobble", {
tiles = {"rgt_cobble.png"},
_variants = "all",
groups = {dig_immediate = 3}
groups = {stone = 1}
})
rgt.register_node("dirt", {
@ -54,11 +54,122 @@ rgt.register_node("dirt_mossy", {
})
rgt.register_node("dirt_grass", {
tiles = {"rgt_grass_top.png", "rgt_dirt.png", "rgt_dirt.png^rgt_grass_side.png"},
paramtype2 = "color",
tiles = {"rgt_grass_top.png", {name = "rgt_dirt.png", color = "#fff"}, {name = "rgt_dirt.png^rgt_grass_side_shadow.png", color = "#fff"}},
overlay_tiles = {"", "", "rgt_grass_side.png"},
palette = "rgt_palette_grass.png",
on_construct = function(pos)
end,
-- tiles = {"[fill:16x16:0,0:#3e7e7b^[fill:14x14:1,1:#326764"},
groups = {dig_immediate = 3}
})
-- Grass
for i = 1, 3 do
rgt.register_node("grass_"..i, {
drawtype = "plantlike",
paramtype = "light",
paramtype2 = "meshoptions",
place_param2 = 2,
sunlight_propagates = false,
tiles = {"rgt_grass_"..i..".png"},
groups = {attached_node = 3, dig_immediate = 3},
walkable = false,
selection_box = {
type = "fixed",
fixed = {
-6/16, -0.5, -6/16,
6/16, 6/16, 6/16
}
}
})
end
-- Tall grass
rgt.register_node("grass_tall_bottom", {
drawtype = "plantlike",
paramtype = "light",
paramtype2 = "meshoptions",
place_param2 = 2,
sunlight_propagates = false,
tiles = {"rgt_grass_tall.png^[verticalframe:2:1"},
groups = {attached_node = 3, dig_immediate = 3},
walkable = false,
selection_box = {
type = "fixed",
fixed = {
-6/16, -0.5, -6/16,
6/16, 0.5, 6/16
}
},
node_placement_prediction = "",
after_destruct = function(pos)
local above = pos:offset(0, 1, 0)
local na = minetest.get_node(above)
if na.name:find "grass_tall_top" then
minetest.remove_node(above)
end
end,
on_place = function(s, p, pt)
if pt.type ~= "node" then return end
local target = pt.above
if not minetest.get_node(target:offset(0, -1, 0)).name:find "dirt_grass" then
return
end
local above = target:offset(0, 1, 0)
if minetest.get_node(above).name == "air" then
minetest.set_node(target, {name = "grass_tall_bottom", param2 = 2})
minetest.set_node(above, {name = "grass_tall_top", param2 = 2})
s:take_item()
return s
end
end
})
rgt.register_node("grass_tall_top", {
drawtype = "plantlike",
paramtype = "light",
paramtype2 = "meshoptions",
place_param2 = 2,
sunlight_propagates = false,
tiles = {"rgt_grass_tall.png^[verticalframe:2:0"},
groups = {dig_immediate = 3},
walkable = false,
selection_box = {
type = "fixed",
fixed = {
-6/16, -0.5, -6/16,
6/16, 6/16, 6/16
}
},
drop = "grass_tall_bottom",
after_destruct = function(pos)
local below = pos:offset(0, -1, 0)
local nb = minetest.get_node(below)
if nb.name:find "grass_tall_bottom" then
minetest.remove_node(below)
end
end,
})
-- TODO: Tall grass
--rgt.register_node("tall_grass", {
-- drawtype = "mesh",
-- mesh = "rgt_plantlike_1x1x2.obj",
-- use_texture_alpha = "clip",
-- paramtype = "light",
-- sunlight_propagates = false,
-- tiles = {"rgt_grass_tall.png"},
-- groups = {dig_immediate = 3},
-- walkable = false
--})
rgt.register_node("path_grass", {
drawtype = "nodebox",
node_box = {
@ -91,43 +202,43 @@ rgt.register_node("oak_leaves", {
drawtype = "allfaces",
tiles = {"rgt_oak_leaves.png"},
use_texture_alpha = "clip",
groups = {dig_immediate = 3}
groups = {dig_immediate = 3},
})
rgt.register_node("oak_planks", {
tiles = {{name = "rgt_oak_planks.png", align_style = "world"}},
_variants = "all",
groups = {dig_immediate = 3}
groups = {dig_immediate = 3},
})
rgt.register_node("dark_planks", {
tiles = {{name = "rgt_dark_planks.png", align_style = "world"}},
_variants = "all",
groups = {dig_immediate = 3}
groups = {dig_immediate = 3},
})
rgt.register_node("spruce_planks", {
tiles = {{name = "rgt_spruce_planks.png", align_style = "world"}},
_variants = "all",
groups = {dig_immediate = 3}
groups = {dig_immediate = 3},
})
rgt.register_node("acacia_planks", {
tiles = {{name = "rgt_acacia_planks.png", align_style = "world"}},
_variants = "all",
groups = {dig_immediate = 3}
groups = {dig_immediate = 3},
})
rgt.register_node("redwood_planks", {
tiles = {{name = "rgt_redwood_planks.png", align_style = "world"}},
_variants = "all",
groups = {dig_immediate = 3}
groups = {dig_immediate = 3},
})
rgt.register_node("birch_planks", {
tiles = {{name = "rgt_birch_planks.png", align_style = "world"}},
_variants = "all",
groups = {dig_immediate = 3}
groups = {dig_immediate = 3},
})
@ -149,6 +260,13 @@ rgt.register_node("glass", {
--}
rgt.register_node("basalt", {
tiles = {{name = "rgt_basalt.png", align_style = "world"}},
_variants = "all",
groups = {dig_immediate = 3},
})
rgt.register_node("water", {
tiles = {"[fill:16x16:0,0:#2d5a7c77^[fill:14x14:1,1:#2d5a7c33"},
groups = {dig_immediate = 3},
@ -158,6 +276,7 @@ rgt.register_node("water", {
walkable = false,
climbable = true,
post_effect_color = "#2d5a7c55",
is_ground_content = false,
liquidtype = "source",
-- Minetest pro tip: Do not try to use aliases for these.
@ -178,6 +297,7 @@ rgt.register_node("water_flowing", {
walkable = false,
climbable = true,
post_effect_color = "#2d5a7c55",
is_ground_content = false,
liquidtype = "flowing",
liquid_alternative_source = "red_glazed_terracotta:water",
@ -230,6 +350,35 @@ minetest.register_alias("mapgen_water_source", "red_glazed_terracotta:water")
minetest.register_alias("mapgen_river_water_source", "red_glazed_terracotta:river_water")
--[[
Biomes to add:
[Temperate]
Steppe
Moor
Plains
Light Deciduous Forest
Dark Deciduous Forest
[Cold]
Alpine
Glacier
Taiga
Tundra
Coniferous Forest
[Warm]
Desert
Badlands
Jungle
Swamp
Marsh
--]]
include "biomes.lua"
rgt.register_node("light", {
tiles = {"[fill:1x1:0,0:#fed"},
@ -247,62 +396,80 @@ minetest.register_ore {
clust_size = 1
}
--minetest.register_decoration {
-- deco_type = "schematic",
-- place_on = "dirt_grass",
-- biomes = {"forest"},
-- y_min = 1,
-- fill_ratio = 0.01,
-- schematic = minetest.get_modpath(minetest.get_current_modname()).."/schems/tree.mts",
-- flags = "place_center_x, place_center_z",
-- place_offset_y = 1,
--}
minetest.register_biome{
name = "plains",
node_top = "dirt_grass",
depth_top = 1,
node_filler = "dirt",
depth_filler = 5,
node_riverbed = "dirt",
depth_riverbed = 3,
node_dungeon = "cobble",
node_dungeon_alt = "stone_brick_large",
y_max = 3000,
y_min = 2,
vertical_blend = 2,
heat_point = 50,
humidity_point = 50,
minetest.register_decoration {
deco_type = "schematic",
place_on = "dirt_grass",
biomes = {"forest"},
y_min = 1,
y_max = 8000,
fill_ratio = 0.01,
schematic = minetest.get_modpath(minetest.get_current_modname()).."/schems/tree.mts",
flags = "place_center_x, place_center_z",
place_offset_y = 1,
}
minetest.register_biome{
name = "beach",
minetest.register_decoration {
deco_type = "schematic",
place_on = "dirt_grass",
biomes = {"plains"},
y_min = 1,
noise_params = {
offset = 0,
scale = 0.25,
spread = {x = 8, y = 8, z = 8},
seed = 3456789,
octaves = 4,
persist = 0.6,
lacunarity = 3,
},
-- fill_ratio = 0.1,
schematic = {
size = {x = 1, y = 2, z = 1}, -- 1×2×1
data = {
{name = "grass_tall_bottom", prob = 255, param2 = 2},
{name = "grass_tall_top", prob = 255, param2 = 2},
},
},
place_offset_y = 1,
}
node_top = "sand",
depth_top = 1,
minetest.register_decoration {
deco_type = "simple",
place_on = "dirt_grass",
biomes = {"forest", "plains"},
decoration = {"grass_1", "grass_2", "grass_3"},
param2 = 2,
y_min = 1,
fill_ratio = 0.2,
}
node_filler = "sand",
depth_filler = 2,
minetest.override_item("", {
on_place = function(s, p, pt)
if minetest.get_node(pt.under).name:find "dirt_grass" then
minetest.set_node(pt.under, {name = "path_grass"})
end
-- minetest.spawn_tree(pt.above, {
-- axiom = "TF[FFA]",
-- rules_a = "F",
-- trunk = "oak_log",
-- leaves = "oak_leaves",
-- angle = 30,
-- iterations = 2,
-- random_level = 0,
-- trunk_type = "single",
---- thin_branches = true,
-- fruit_chance = 0,
-- fruit = "stone_brick"
-- })
end
})
node_riverbed = "sand",
depth_riverbed = 3,
node_dungeon = "cobble",
node_dungeon_alt = "stone_brick_large",
minetest.register_chatcommand("biome", {
func = function(name)
tell(name, minetest.get_biome_name(minetest.get_biome_data(minetest.get_player_by_name(name):get_pos()).biome))
end
})
y_max = 1,
y_min = -3,
vertical_blend = 1,
include "config.lua"
heat_point = 50,
humidity_point = 50,
}
--minetest.register_mapgen_script(minetest.get_modpath(minetest.get_current_modname()).."/mapgen.lua")

14
mods/rgt_world/mapgen.lua Normal file
View file

@ -0,0 +1,14 @@
local c = minetest.get_content_id
local c_stone = c "stone"
local np_continental = {
offset = 0,
scale = 1,
spread = {x = 4096, y = 4096, z = 4096},
seed = 12345,
octaves = 4,
persist = 0.6
}
local n_terrain = {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 440 B

After

Width:  |  Height:  |  Size: 450 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 B

After

Width:  |  Height:  |  Size: 338 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 354 B

After

Width:  |  Height:  |  Size: 302 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

View file

@ -11,7 +11,8 @@ function ns.register_slab(def)
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}
},
paramtype = "light",
paramtype2 = "facedir"
paramtype2 = "facedir",
_variant = "slab"
}))
end
@ -61,7 +62,8 @@ function ns.register_stair(def)
fixed = {{-0.5, -0.5, -0.5, 0.5, 0, 0.5}, {-0.5, -0.5, 0, 0.5, 0.5, 0.5}}
},
paramtype = "light",
paramtype2 = "facedir"
paramtype2 = "facedir",
_variant = "stair",
}))
rgt.register_node(def._name.."_stair_inner", extend(table.copy(def), {
@ -71,7 +73,8 @@ function ns.register_stair(def)
fixed = {{-0.5, -0.5, -0.5, 0.5, 0, 0.5}, {-0.5, -0.5, 0, 0.5, 0.5, 0.5}, {-0.5, -0.5, -0.5, 0, 0.5, 0.5}}
},
paramtype = "light",
paramtype2 = "facedir"
paramtype2 = "facedir",
_variant = "stair_inner",
}))
rgt.register_node(def._name.."_stair_outer", extend(def, {
@ -81,7 +84,8 @@ function ns.register_stair(def)
fixed = {{-0.5, -0.5, -0.5, 0.5, 0, 0.5}, {-0.5, -0.5, 0.5, 0, 0.5, 0}}
},
paramtype = "light",
paramtype2 = "facedir"
paramtype2 = "facedir",
_variant = "stair_outer",
}))
end