2 -- Aliases for map generator outputs
5 minetest.register_alias("mapgen_stone", "default:stone")
6 minetest.register_alias("mapgen_dirt", "default:dirt")
7 minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass")
8 minetest.register_alias("mapgen_sand", "default:sand")
9 minetest.register_alias("mapgen_water_source", "default:water_source")
10 minetest.register_alias("mapgen_river_water_source", "default:river_water_source")
11 minetest.register_alias("mapgen_lava_source", "default:lava_source")
12 minetest.register_alias("mapgen_gravel", "default:gravel")
13 minetest.register_alias("mapgen_desert_stone", "default:desert_stone")
14 minetest.register_alias("mapgen_desert_sand", "default:desert_sand")
15 minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow")
16 minetest.register_alias("mapgen_snowblock", "default:snowblock")
17 minetest.register_alias("mapgen_snow", "default:snow")
18 minetest.register_alias("mapgen_ice", "default:ice")
19 minetest.register_alias("mapgen_sandstone", "default:sandstone")
23 minetest.register_alias("mapgen_tree", "default:tree")
24 minetest.register_alias("mapgen_leaves", "default:leaves")
25 minetest.register_alias("mapgen_apple", "default:apple")
26 minetest.register_alias("mapgen_jungletree", "default:jungletree")
27 minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves")
28 minetest.register_alias("mapgen_junglegrass", "default:junglegrass")
29 minetest.register_alias("mapgen_pine_tree", "default:pine_tree")
30 minetest.register_alias("mapgen_pine_needles", "default:pine_needles")
34 minetest.register_alias("mapgen_cobble", "default:cobble")
35 minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble")
36 minetest.register_alias("mapgen_mossycobble", "default:mossycobble")
37 minetest.register_alias("mapgen_sandstonebrick", "default:sandstonebrick")
38 minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebrick")
45 -- All mapgens except singlenode
46 -- Blob ore first to avoid other ores inside blobs
48 function default.register_ores()
52 minetest.register_ore({
55 wherein = {"default:sand"},
56 clust_scarcity = 16 * 16 * 16,
60 noise_threshold = 0.0,
64 spread = {x = 5, y = 5, z = 5},
73 minetest.register_ore({
76 wherein = {"default:stone", "default:sandstone",
77 "default:desert_stone"},
78 clust_scarcity = 16 * 16 * 16,
82 noise_threshold = 0.0,
86 spread = {x = 5, y = 5, z = 5},
95 minetest.register_ore({
98 wherein = {"default:stone", "default:sandstone"},
99 clust_scarcity = 16 * 16 * 16,
103 noise_threshold = 0.0,
107 spread = {x = 5, y = 5, z = 5},
116 minetest.register_ore({
118 ore = "default:gravel",
119 wherein = {"default:stone"},
120 clust_scarcity = 16 * 16 * 16,
124 noise_threshold = 0.0,
128 spread = {x = 5, y = 5, z = 5},
137 minetest.register_ore({
138 ore_type = "scatter",
139 ore = "default:stone_with_coal",
140 wherein = "default:stone",
141 clust_scarcity = 8 * 8 * 8,
148 minetest.register_ore({
149 ore_type = "scatter",
150 ore = "default:stone_with_coal",
151 wherein = "default:stone",
152 clust_scarcity = 24 * 24 * 24,
161 minetest.register_ore({
162 ore_type = "scatter",
163 ore = "default:stone_with_iron",
164 wherein = "default:stone",
165 clust_scarcity = 12 * 12 * 12,
172 minetest.register_ore({
173 ore_type = "scatter",
174 ore = "default:stone_with_iron",
175 wherein = "default:stone",
176 clust_scarcity = 9 * 9 * 9,
183 minetest.register_ore({
184 ore_type = "scatter",
185 ore = "default:stone_with_iron",
186 wherein = "default:stone",
187 clust_scarcity = 7 * 7 * 7,
194 minetest.register_ore({
195 ore_type = "scatter",
196 ore = "default:stone_with_iron",
197 wherein = "default:stone",
198 clust_scarcity = 24 * 24 * 24,
207 minetest.register_ore({
208 ore_type = "scatter",
209 ore = "default:stone_with_mese",
210 wherein = "default:stone",
211 clust_scarcity = 18 * 18 * 18,
218 minetest.register_ore({
219 ore_type = "scatter",
220 ore = "default:stone_with_mese",
221 wherein = "default:stone",
222 clust_scarcity = 14 * 14 * 14,
229 minetest.register_ore({
230 ore_type = "scatter",
231 ore = "default:mese",
232 wherein = "default:stone",
233 clust_scarcity = 36 * 36 * 36,
242 minetest.register_ore({
243 ore_type = "scatter",
244 ore = "default:stone_with_gold",
245 wherein = "default:stone",
246 clust_scarcity = 15 * 15 * 15,
253 minetest.register_ore({
254 ore_type = "scatter",
255 ore = "default:stone_with_gold",
256 wherein = "default:stone",
257 clust_scarcity = 13 * 13 * 13,
266 minetest.register_ore({
267 ore_type = "scatter",
268 ore = "default:stone_with_diamond",
269 wherein = "default:stone",
270 clust_scarcity = 17 * 17 * 17,
277 minetest.register_ore({
278 ore_type = "scatter",
279 ore = "default:stone_with_diamond",
280 wherein = "default:stone",
281 clust_scarcity = 15 * 15 * 15,
290 minetest.register_ore({
291 ore_type = "scatter",
292 ore = "default:stone_with_copper",
293 wherein = "default:stone",
294 clust_scarcity = 12 * 12 * 12,
301 minetest.register_ore({
302 ore_type = "scatter",
303 ore = "default:stone_with_copper",
304 wherein = "default:stone",
305 clust_scarcity = 9 * 9 * 9,
318 -- All mapgens except mgv6 and singlenode
320 function default.register_biomes()
321 minetest.clear_registered_biomes()
325 minetest.register_biome({
327 node_dust = "default:snowblock",
328 node_top = "default:snowblock",
330 node_filler = "default:snowblock",
332 node_stone = "default:ice",
333 node_water_top = "default:ice",
334 depth_water_top = 10,
336 node_river_water = "default:ice",
343 minetest.register_biome({
344 name = "glacier_ocean",
345 node_dust = "default:snowblock",
346 node_top = "default:sand",
348 node_filler = "default:sand",
351 --node_water_top = "",
352 --depth_water_top = ,
354 --node_river_water = "",
363 minetest.register_biome({
366 node_top = "default:dirt_with_snow",
368 node_filler = "default:dirt",
371 --node_water_top = "",
372 --depth_water_top = ,
374 --node_river_water = "",
381 minetest.register_biome({
382 name = "tundra_beach",
384 node_top = "default:gravel",
386 node_filler = "default:gravel",
389 --node_water_top = "",
390 --depth_water_top = ,
392 --node_river_water = "",
399 minetest.register_biome({
400 name = "tundra_ocean",
402 node_top = "default:sand",
404 node_filler = "default:sand",
407 --node_water_top = "",
408 --depth_water_top = ,
410 --node_river_water = "",
418 minetest.register_biome({
420 node_dust = "default:snow",
421 node_top = "default:dirt_with_snow",
423 node_filler = "default:dirt",
426 --node_water_top = "",
427 --depth_water_top = ,
429 --node_river_water = "",
436 minetest.register_biome({
437 name = "taiga_ocean",
439 node_top = "default:sand",
441 node_filler = "default:sand",
444 --node_water_top = "",
445 --depth_water_top = ,
447 --node_river_water = "",
456 minetest.register_biome({
457 name = "stone_grassland",
459 node_top = "default:dirt_with_grass",
461 node_filler = "default:dirt",
464 --node_water_top = "",
465 --depth_water_top = ,
467 --node_river_water = "",
474 minetest.register_biome({
475 name = "stone_grassland_dunes",
477 node_top = "default:sand",
479 node_filler = "default:sand",
482 --node_water_top = "",
483 --depth_water_top = ,
485 --node_river_water = "",
492 minetest.register_biome({
493 name = "stone_grassland_ocean",
495 node_top = "default:sand",
497 node_filler = "default:sand",
500 --node_water_top = "",
501 --depth_water_top = ,
503 --node_river_water = "",
511 minetest.register_biome({
512 name = "coniferous_forest",
514 node_top = "default:dirt_with_grass",
516 node_filler = "default:dirt",
519 --node_water_top = "",
520 --depth_water_top = ,
522 --node_river_water = "",
529 minetest.register_biome({
530 name = "coniferous_forest_dunes",
532 node_top = "default:sand",
534 node_filler = "default:sand",
537 --node_water_top = "",
538 --depth_water_top = ,
540 --node_river_water = "",
547 minetest.register_biome({
548 name = "coniferous_forest_ocean",
550 node_top = "default:sand",
552 node_filler = "default:sand",
555 --node_water_top = "",
556 --depth_water_top = ,
558 --node_river_water = "",
566 minetest.register_biome({
567 name = "sandstone_grassland",
569 node_top = "default:dirt_with_grass",
571 node_filler = "default:dirt",
573 node_stone = "default:sandstone",
574 --node_water_top = "",
575 --depth_water_top = ,
577 --node_river_water = "",
584 minetest.register_biome({
585 name = "sandstone_grassland_dunes",
587 node_top = "default:sand",
589 node_filler = "default:sand",
591 node_stone = "default:sandstone",
592 --node_water_top = "",
593 --depth_water_top = ,
595 --node_river_water = "",
602 minetest.register_biome({
603 name = "sandstone_grassland_ocean",
605 node_top = "default:sand",
607 node_filler = "default:sand",
609 node_stone = "default:sandstone",
610 --node_water_top = "",
611 --depth_water_top = ,
613 --node_river_water = "",
621 minetest.register_biome({
622 name = "deciduous_forest",
624 node_top = "default:dirt_with_grass",
626 node_filler = "default:dirt",
629 --node_water_top = "",
630 --depth_water_top = ,
632 --node_river_water = "",
639 minetest.register_biome({
640 name = "deciduous_forest_swamp",
642 node_top = "default:dirt",
644 node_filler = "default:dirt",
647 --node_water_top = "",
648 --depth_water_top = ,
650 --node_river_water = "",
657 minetest.register_biome({
658 name = "deciduous_forest_ocean",
660 node_top = "default:sand",
662 node_filler = "default:sand",
665 --node_water_top = "",
666 --depth_water_top = ,
668 --node_river_water = "",
677 minetest.register_biome({
680 node_top = "default:desert_sand",
682 node_filler = "default:desert_sand",
684 node_stone = "default:desert_stone",
685 --node_water_top = "",
686 --depth_water_top = ,
688 --node_river_water = "",
695 minetest.register_biome({
696 name = "desert_ocean",
698 node_top = "default:sand",
700 node_filler = "default:sand",
702 node_stone = "default:desert_stone",
703 --node_water_top = "",
704 --depth_water_top = ,
706 --node_river_water = "",
714 minetest.register_biome({
717 node_top = "default:dirt_with_dry_grass",
719 node_filler = "default:dirt",
722 --node_water_top = "",
723 --depth_water_top = ,
725 --node_river_water = "",
732 minetest.register_biome({
733 name = "savanna_swamp",
735 node_top = "default:dirt",
737 node_filler = "default:dirt",
740 --node_water_top = "",
741 --depth_water_top = ,
743 --node_river_water = "",
750 minetest.register_biome({
751 name = "savanna_ocean",
753 node_top = "default:sand",
755 node_filler = "default:sand",
758 --node_water_top = "",
759 --depth_water_top = ,
761 --node_river_water = "",
769 minetest.register_biome({
772 node_top = "default:dirt_with_grass",
774 node_filler = "default:dirt",
777 --node_water_top = "",
778 --depth_water_top = ,
780 --node_river_water = "",
787 minetest.register_biome({
788 name = "rainforest_swamp",
790 node_top = "default:dirt",
792 node_filler = "default:dirt",
795 --node_water_top = "",
796 --depth_water_top = ,
798 --node_river_water = "",
805 minetest.register_biome({
806 name = "rainforest_ocean",
808 node_top = "default:sand",
810 node_filler = "default:sand",
813 --node_water_top = "",
814 --depth_water_top = ,
816 --node_river_water = "",
825 minetest.register_biome({
826 name = "underground",
833 --node_water_top = "",
834 --depth_water_top = ,
836 --node_river_water = "",
846 -- Register decorations
851 function default.register_mgv6_decorations()
852 minetest.clear_registered_decorations()
856 minetest.register_decoration({
857 deco_type = "simple",
858 place_on = {"default:dirt_with_grass"},
863 spread = {x = 100, y = 100, z = 100},
870 decoration = "default:papyrus",
873 spawn_by = "default:water_source",
879 minetest.register_decoration({
880 deco_type = "simple",
881 place_on = {"default:desert_sand"},
886 spread = {x = 100, y = 100, z = 100},
893 decoration = "default:cactus",
901 minetest.register_decoration({
902 deco_type = "simple",
903 place_on = {"default:dirt_with_grass"},
908 spread = {x = 100, y = 100, z = 100},
915 decoration = "default:grass_"..length,
921 minetest.register_decoration({
922 deco_type = "simple",
923 place_on = {"default:desert_sand", "default:dirt_with_snow"},
928 spread = {x = 100, y = 100, z = 100},
935 decoration = "default:dry_shrub",
939 -- All mapgens except mgv6 and singlenode
941 local function register_grass_decoration(offset, scale, length)
942 minetest.register_decoration({
943 deco_type = "simple",
944 place_on = {"default:dirt_with_grass", "default:sand"},
949 spread = {x = 200, y = 200, z = 200},
954 biomes = {"stone_grassland", "sandstone_grassland",
955 "deciduous_forest", "coniferous_forest",
956 "stone_grassland_dunes", "sandstone_grassland_dunes",
957 "coniferous_forest_dunes"},
960 decoration = "default:grass_"..length,
964 local function register_dry_grass_decoration(offset, scale, length)
965 minetest.register_decoration({
966 deco_type = "simple",
967 place_on = {"default:dirt_with_dry_grass"},
972 spread = {x = 200, y = 200, z = 200},
977 biomes = {"savanna"},
980 decoration = "default:dry_grass_"..length,
984 function default.register_decorations()
985 minetest.clear_registered_decorations()
987 -- Apple tree and log
989 minetest.register_decoration({
990 deco_type = "schematic",
991 place_on = {"default:dirt_with_grass"},
996 spread = {x = 250, y = 250, z = 250},
1001 biomes = {"deciduous_forest"},
1004 schematic = minetest.get_modpath("default").."/schematics/apple_tree.mts",
1005 flags = "place_center_x, place_center_z",
1008 minetest.register_decoration({
1009 deco_type = "schematic",
1010 place_on = {"default:dirt_with_grass"},
1015 spread = {x = 250, y = 250, z = 250},
1020 biomes = {"deciduous_forest"},
1024 size = {x = 3, y = 3, z = 1},
1026 {name = "air", prob = 0},
1027 {name = "air", prob = 0},
1028 {name = "air", prob = 0},
1029 {name = "default:tree", param2 = 12, prob = 191},
1030 {name = "default:tree", param2 = 12},
1031 {name = "default:tree", param2 = 12, prob = 127},
1032 {name = "air", prob = 0},
1033 {name = "flowers:mushroom_brown", prob = 63},
1034 {name = "air", prob = 0},
1037 flags = "place_center_x",
1038 rotation = "random",
1041 -- Jungle tree and log
1043 minetest.register_decoration({
1044 deco_type = "schematic",
1045 place_on = {"default:dirt_with_grass", "default:dirt"},
1048 biomes = {"rainforest", "rainforest_swamp"},
1051 schematic = minetest.get_modpath("default").."/schematics/jungle_tree.mts",
1052 flags = "place_center_x, place_center_z",
1053 rotation = "random",
1056 minetest.register_decoration({
1057 deco_type = "schematic",
1058 place_on = {"default:dirt_with_grass", "default:dirt"},
1061 biomes = {"rainforest", "rainforest_swamp"},
1065 size = {x = 3, y = 3, z = 1},
1067 {name = "air", prob = 0},
1068 {name = "air", prob = 0},
1069 {name = "air", prob = 0},
1070 {name = "default:jungletree", param2 = 12, prob = 191},
1071 {name = "default:jungletree", param2 = 12},
1072 {name = "default:jungletree", param2 = 12, prob = 127},
1073 {name = "air", prob = 0},
1074 {name = "flowers:mushroom_brown", prob = 127},
1075 {name = "air", prob = 0},
1078 flags = "place_center_x",
1079 rotation = "random",
1082 -- Taiga and temperate coniferous forest pine tree and log
1084 minetest.register_decoration({
1085 deco_type = "schematic",
1086 place_on = {"default:dirt_with_snow", "default:dirt_with_grass"},
1091 spread = {x = 250, y = 250, z = 250},
1096 biomes = {"taiga", "coniferous_forest"},
1099 schematic = minetest.get_modpath("default").."/schematics/pine_tree.mts",
1100 flags = "place_center_x, place_center_z",
1103 minetest.register_decoration({
1104 deco_type = "schematic",
1105 place_on = {"default:dirt_with_snow", "default:dirt_with_grass"},
1110 spread = {x = 250, y = 250, z = 250},
1115 biomes = {"taiga", "coniferous_forest"},
1119 size = {x = 3, y = 3, z = 1},
1121 {name = "air", prob = 0},
1122 {name = "air", prob = 0},
1123 {name = "air", prob = 0},
1124 {name = "default:pine_tree", param2 = 12, prob = 191},
1125 {name = "default:pine_tree", param2 = 12},
1126 {name = "default:pine_tree", param2 = 12, prob = 127},
1127 {name = "air", prob = 0},
1128 {name = "flowers:mushroom_red", prob = 63},
1129 {name = "air", prob = 0},
1132 flags = "place_center_x",
1133 rotation = "random",
1136 -- Acacia tree and log
1138 minetest.register_decoration({
1139 deco_type = "schematic",
1140 place_on = {"default:dirt_with_dry_grass"},
1145 spread = {x = 250, y = 250, z = 250},
1150 biomes = {"savanna"},
1153 schematic = minetest.get_modpath("default").."/schematics/acacia_tree.mts",
1154 flags = "place_center_x, place_center_z",
1155 rotation = "random",
1158 minetest.register_decoration({
1159 deco_type = "schematic",
1160 place_on = {"default:dirt_with_dry_grass"},
1165 spread = {x = 250, y = 250, z = 250},
1170 biomes = {"savanna"},
1174 size = {x = 3, y = 2, z = 1},
1176 {name = "air", prob = 0},
1177 {name = "air", prob = 0},
1178 {name = "air", prob = 0},
1179 {name = "default:acacia_tree", param2 = 12, prob = 191},
1180 {name = "default:acacia_tree", param2 = 12},
1181 {name = "default:acacia_tree", param2 = 12, prob = 127},
1184 flags = "place_center_x",
1185 rotation = "random",
1188 -- Aspen tree and log
1190 minetest.register_decoration({
1191 deco_type = "schematic",
1192 place_on = {"default:dirt_with_grass"},
1197 spread = {x = 250, y = 250, z = 250},
1202 biomes = {"deciduous_forest"},
1205 schematic = minetest.get_modpath("default").."/schematics/aspen_tree.mts",
1206 flags = "place_center_x, place_center_z",
1209 minetest.register_decoration({
1210 deco_type = "schematic",
1211 place_on = {"default:dirt_with_grass"},
1216 spread = {x = 250, y = 250, z = 250},
1221 biomes = {"deciduous_forest"},
1225 size = {x = 3, y = 3, z = 1},
1227 {name = "air", prob = 0},
1228 {name = "air", prob = 0},
1229 {name = "air", prob = 0},
1230 {name = "default:aspen_tree", param2 = 12},
1231 {name = "default:aspen_tree", param2 = 12},
1232 {name = "default:aspen_tree", param2 = 12, prob = 127},
1233 {name = "flowers:mushroom_red", prob = 63},
1234 {name = "flowers:mushroom_brown", prob = 63},
1235 {name = "air", prob = 0},
1238 flags = "place_center_x",
1239 rotation = "random",
1243 minetest.register_decoration({
1244 deco_type = "schematic",
1245 place_on = {"default:desert_sand"},
1250 spread = {x = 200, y = 200, z = 200},
1255 biomes = {"desert"},
1258 schematic = minetest.get_modpath("default").."/schematics/large_cactus.mts",
1259 flags = "place_center_x",
1260 rotation = "random",
1265 minetest.register_decoration({
1266 deco_type = "simple",
1267 place_on = {"default:desert_sand"},
1272 spread = {x = 200, y = 200, z = 200},
1277 biomes = {"desert"},
1280 decoration = "default:cactus",
1287 minetest.register_decoration({
1288 deco_type = "schematic",
1289 place_on = {"default:dirt"},
1294 spread = {x = 200, y = 200, z = 200},
1299 biomes = {"savanna_swamp"},
1302 schematic = minetest.get_modpath("default").."/schematics/papyrus.mts",
1307 register_grass_decoration(-0.03, 0.09, 5)
1308 register_grass_decoration(-0.015, 0.075, 4)
1309 register_grass_decoration(0, 0.06, 3)
1310 register_grass_decoration(0.015, 0.045, 2)
1311 register_grass_decoration(0.03, 0.03, 1)
1315 register_dry_grass_decoration(0.01, 0.05, 5)
1316 register_dry_grass_decoration(0.03, 0.03, 4)
1317 register_dry_grass_decoration(0.05, 0.01, 3)
1318 register_dry_grass_decoration(0.07, -0.01, 2)
1319 register_dry_grass_decoration(0.09, -0.03, 1)
1323 minetest.register_decoration({
1324 deco_type = "simple",
1325 place_on = {"default:dirt_with_grass"},
1328 biomes = {"rainforest"},
1331 decoration = "default:junglegrass",
1336 minetest.register_decoration({
1337 deco_type = "simple",
1338 place_on = {"default:desert_sand", "default:dirt_with_snow"},
1343 spread = {x = 200, y = 200, z = 200},
1348 biomes = {"desert", "tundra"},
1351 decoration = "default:dry_shrub",
1357 -- Generate nyan cats
1360 -- All mapgens except singlenode
1362 function default.make_nyancat(pos, facedir, length)
1363 local tailvec = {x = 0, y = 0, z = 0}
1364 if facedir == 0 then
1366 elseif facedir == 1 then
1368 elseif facedir == 2 then
1370 elseif facedir == 3 then
1376 local p = {x = pos.x, y = pos.y, z = pos.z}
1377 minetest.set_node(p, {name = "default:nyancat", param2 = facedir})
1378 for i = 1, length do
1379 p.x = p.x + tailvec.x
1380 p.z = p.z + tailvec.z
1381 minetest.set_node(p, {name = "default:nyancat_rainbow", param2 = facedir})
1385 function default.generate_nyancats(minp, maxp, seed)
1386 local height_min = -31000
1387 local height_max = -32
1388 if maxp.y < height_min or minp.y > height_max then
1391 local y_min = math.max(minp.y, height_min)
1392 local y_max = math.min(maxp.y, height_max)
1393 local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
1394 local pr = PseudoRandom(seed + 9324342)
1395 local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
1396 for i = 1, max_num_nyancats do
1397 if pr:next(0, 1000) == 0 then
1398 local x0 = pr:next(minp.x, maxp.x)
1399 local y0 = pr:next(minp.y, maxp.y)
1400 local z0 = pr:next(minp.z, maxp.z)
1401 local p0 = {x = x0, y = y0, z = z0}
1402 default.make_nyancat(p0, pr:next(0, 3), pr:next(3, 15))
1409 -- Detect mapgen to select functions
1412 -- Mods using singlenode mapgen can call these functions to enable
1413 -- the use of minetest.generate_ores or minetest.generate_decorations
1415 local mg_params = minetest.get_mapgen_params()
1416 if mg_params.mgname == "v6" then
1417 default.register_ores()
1418 default.register_mgv6_decorations()
1419 minetest.register_on_generated(default.generate_nyancats)
1420 elseif mg_params.mgname ~= "singlenode" then
1421 default.register_biomes()
1422 default.register_ores()
1423 default.register_decorations()
1424 minetest.register_on_generated(default.generate_nyancats)