2 -- Aliases for map generator outputs
5 minetest.register_alias("mapgen_air", "air")
6 minetest.register_alias("mapgen_stone", "default:stone")
7 minetest.register_alias("mapgen_dirt", "default:dirt")
8 minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass")
9 minetest.register_alias("mapgen_sand", "default:sand")
10 minetest.register_alias("mapgen_water_source", "default:water_source")
11 minetest.register_alias("mapgen_river_water_source", "default:river_water_source")
12 minetest.register_alias("mapgen_lava_source", "default:lava_source")
13 minetest.register_alias("mapgen_gravel", "default:gravel")
14 minetest.register_alias("mapgen_desert_stone", "default:desert_stone")
15 minetest.register_alias("mapgen_desert_sand", "default:desert_sand")
16 minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow")
17 minetest.register_alias("mapgen_snowblock", "default:snowblock")
18 minetest.register_alias("mapgen_snow", "default:snow")
19 minetest.register_alias("mapgen_ice", "default:ice")
20 minetest.register_alias("mapgen_sandstone", "default:sandstone")
24 minetest.register_alias("mapgen_tree", "default:tree")
25 minetest.register_alias("mapgen_leaves", "default:leaves")
26 minetest.register_alias("mapgen_apple", "default:apple")
27 minetest.register_alias("mapgen_jungletree", "default:jungletree")
28 minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves")
29 minetest.register_alias("mapgen_junglegrass", "default:junglegrass")
30 minetest.register_alias("mapgen_pine_tree", "default:pine_tree")
31 minetest.register_alias("mapgen_pine_needles", "default:pine_needles")
35 minetest.register_alias("mapgen_cobble", "default:cobble")
36 minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble")
37 minetest.register_alias("mapgen_mossycobble", "default:mossycobble")
38 minetest.register_alias("mapgen_sandstonebrick", "default:sandstonebrick")
39 minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebrick")
46 -- All mapgens except singlenode
47 -- Blob ore first to avoid other ores inside blobs
49 function default.register_ores()
53 minetest.register_ore({
56 wherein = {"default:sand"},
57 clust_scarcity = 16 * 16 * 16,
61 noise_threshold = 0.0,
65 spread = {x = 5, y = 5, z = 5},
74 minetest.register_ore({
77 wherein = {"default:stone", "default:sandstone",
78 "default:desert_stone"},
79 clust_scarcity = 16 * 16 * 16,
83 noise_threshold = 0.0,
87 spread = {x = 5, y = 5, z = 5},
96 minetest.register_ore({
99 wherein = {"default:stone", "default:sandstone"},
100 clust_scarcity = 16 * 16 * 16,
104 noise_threshold = 0.0,
108 spread = {x = 5, y = 5, z = 5},
117 minetest.register_ore({
119 ore = "default:gravel",
120 wherein = {"default:stone"},
121 clust_scarcity = 16 * 16 * 16,
125 noise_threshold = 0.0,
129 spread = {x = 5, y = 5, z = 5},
138 minetest.register_ore({
139 ore_type = "scatter",
140 ore = "default:stone_with_coal",
141 wherein = "default:stone",
142 clust_scarcity = 8 * 8 * 8,
149 minetest.register_ore({
150 ore_type = "scatter",
151 ore = "default:stone_with_coal",
152 wherein = "default:stone",
153 clust_scarcity = 24 * 24 * 24,
162 minetest.register_ore({
163 ore_type = "scatter",
164 ore = "default:stone_with_iron",
165 wherein = "default:stone",
166 clust_scarcity = 12 * 12 * 12,
173 minetest.register_ore({
174 ore_type = "scatter",
175 ore = "default:stone_with_iron",
176 wherein = "default:stone",
177 clust_scarcity = 9 * 9 * 9,
184 minetest.register_ore({
185 ore_type = "scatter",
186 ore = "default:stone_with_iron",
187 wherein = "default:stone",
188 clust_scarcity = 7 * 7 * 7,
195 minetest.register_ore({
196 ore_type = "scatter",
197 ore = "default:stone_with_iron",
198 wherein = "default:stone",
199 clust_scarcity = 24 * 24 * 24,
208 minetest.register_ore({
209 ore_type = "scatter",
210 ore = "default:stone_with_mese",
211 wherein = "default:stone",
212 clust_scarcity = 18 * 18 * 18,
219 minetest.register_ore({
220 ore_type = "scatter",
221 ore = "default:stone_with_mese",
222 wherein = "default:stone",
223 clust_scarcity = 14 * 14 * 14,
230 minetest.register_ore({
231 ore_type = "scatter",
232 ore = "default:mese",
233 wherein = "default:stone",
234 clust_scarcity = 36 * 36 * 36,
243 minetest.register_ore({
244 ore_type = "scatter",
245 ore = "default:stone_with_gold",
246 wherein = "default:stone",
247 clust_scarcity = 15 * 15 * 15,
254 minetest.register_ore({
255 ore_type = "scatter",
256 ore = "default:stone_with_gold",
257 wherein = "default:stone",
258 clust_scarcity = 13 * 13 * 13,
267 minetest.register_ore({
268 ore_type = "scatter",
269 ore = "default:stone_with_diamond",
270 wherein = "default:stone",
271 clust_scarcity = 17 * 17 * 17,
278 minetest.register_ore({
279 ore_type = "scatter",
280 ore = "default:stone_with_diamond",
281 wherein = "default:stone",
282 clust_scarcity = 15 * 15 * 15,
291 minetest.register_ore({
292 ore_type = "scatter",
293 ore = "default:stone_with_copper",
294 wherein = "default:stone",
295 clust_scarcity = 12 * 12 * 12,
302 minetest.register_ore({
303 ore_type = "scatter",
304 ore = "default:stone_with_copper",
305 wherein = "default:stone",
306 clust_scarcity = 9 * 9 * 9,
319 -- All mapgens except mgv6 and singlenode
321 function default.register_biomes()
322 minetest.clear_registered_biomes()
326 minetest.register_biome({
328 node_dust = "default:snowblock",
329 node_top = "default:snowblock",
331 node_filler = "default:snowblock",
333 node_stone = "default:ice",
334 node_water_top = "default:ice",
335 depth_water_top = 10,
337 node_river_water = "default:ice",
344 minetest.register_biome({
345 name = "glacier_ocean",
346 node_dust = "default:snowblock",
347 node_top = "default:sand",
349 node_filler = "default:sand",
352 --node_water_top = "",
353 --depth_water_top = ,
355 --node_river_water = "",
364 minetest.register_biome({
367 node_top = "default:dirt_with_snow",
369 node_filler = "default:dirt",
372 --node_water_top = "",
373 --depth_water_top = ,
375 --node_river_water = "",
382 minetest.register_biome({
383 name = "tundra_ocean",
385 node_top = "default:sand",
387 node_filler = "default:sand",
390 --node_water_top = "",
391 --depth_water_top = ,
393 --node_river_water = "",
401 minetest.register_biome({
403 node_dust = "default:snow",
404 node_top = "default:dirt_with_snow",
406 node_filler = "default:dirt",
409 --node_water_top = "",
410 --depth_water_top = ,
412 --node_river_water = "",
419 minetest.register_biome({
420 name = "taiga_ocean",
422 node_top = "default:sand",
424 node_filler = "default:sand",
427 --node_water_top = "",
428 --depth_water_top = ,
430 --node_river_water = "",
439 minetest.register_biome({
440 name = "stone_grassland",
442 node_top = "default:dirt_with_grass",
444 node_filler = "default:dirt",
447 --node_water_top = "",
448 --depth_water_top = ,
450 --node_river_water = "",
457 minetest.register_biome({
458 name = "stone_grassland_dunes",
460 node_top = "default:sand",
462 node_filler = "default:sand",
465 --node_water_top = "",
466 --depth_water_top = ,
468 --node_river_water = "",
475 minetest.register_biome({
476 name = "stone_grassland_ocean",
478 node_top = "default:sand",
480 node_filler = "default:sand",
483 --node_water_top = "",
484 --depth_water_top = ,
486 --node_river_water = "",
494 minetest.register_biome({
495 name = "coniferous_forest",
497 node_top = "default:dirt_with_grass",
499 node_filler = "default:dirt",
502 --node_water_top = "",
503 --depth_water_top = ,
505 --node_river_water = "",
512 minetest.register_biome({
513 name = "coniferous_forest_dunes",
515 node_top = "default:sand",
517 node_filler = "default:sand",
520 --node_water_top = "",
521 --depth_water_top = ,
523 --node_river_water = "",
530 minetest.register_biome({
531 name = "coniferous_forest_ocean",
533 node_top = "default:sand",
535 node_filler = "default:sand",
538 --node_water_top = "",
539 --depth_water_top = ,
541 --node_river_water = "",
549 minetest.register_biome({
550 name = "sandstone_grassland",
552 node_top = "default:dirt_with_grass",
554 node_filler = "default:dirt",
556 node_stone = "default:sandstone",
557 --node_water_top = "",
558 --depth_water_top = ,
560 --node_river_water = "",
567 minetest.register_biome({
568 name = "sandstone_grassland_dunes",
570 node_top = "default:sand",
572 node_filler = "default:sand",
574 node_stone = "default:sandstone",
575 --node_water_top = "",
576 --depth_water_top = ,
578 --node_river_water = "",
585 minetest.register_biome({
586 name = "sandstone_grassland_ocean",
588 node_top = "default:sand",
590 node_filler = "default:sand",
592 node_stone = "default:sandstone",
593 --node_water_top = "",
594 --depth_water_top = ,
596 --node_river_water = "",
604 minetest.register_biome({
605 name = "deciduous_forest",
607 node_top = "default:dirt_with_grass",
609 node_filler = "default:dirt",
612 --node_water_top = "",
613 --depth_water_top = ,
615 --node_river_water = "",
622 minetest.register_biome({
623 name = "deciduous_forest_swamp",
625 node_top = "default:dirt",
627 node_filler = "default:dirt",
630 --node_water_top = "",
631 --depth_water_top = ,
633 --node_river_water = "",
640 minetest.register_biome({
641 name = "deciduous_forest_ocean",
643 node_top = "default:sand",
645 node_filler = "default:sand",
648 --node_water_top = "",
649 --depth_water_top = ,
651 --node_river_water = "",
660 minetest.register_biome({
663 node_top = "default:desert_sand",
665 node_filler = "default:desert_sand",
667 node_stone = "default:desert_stone",
668 --node_water_top = "",
669 --depth_water_top = ,
671 --node_river_water = "",
678 minetest.register_biome({
679 name = "desert_ocean",
681 node_top = "default:sand",
683 node_filler = "default:sand",
685 node_stone = "default:desert_stone",
686 --node_water_top = "",
687 --depth_water_top = ,
689 --node_river_water = "",
697 minetest.register_biome({
700 node_top = "default:dirt_with_dry_grass",
702 node_filler = "default:dirt",
705 --node_water_top = "",
706 --depth_water_top = ,
708 --node_river_water = "",
715 minetest.register_biome({
716 name = "savanna_swamp",
718 node_top = "default:dirt",
720 node_filler = "default:dirt",
723 --node_water_top = "",
724 --depth_water_top = ,
726 --node_river_water = "",
733 minetest.register_biome({
734 name = "savanna_ocean",
736 node_top = "default:sand",
738 node_filler = "default:sand",
741 --node_water_top = "",
742 --depth_water_top = ,
744 --node_river_water = "",
752 minetest.register_biome({
755 node_top = "default:dirt_with_grass",
757 node_filler = "default:dirt",
760 --node_water_top = "",
761 --depth_water_top = ,
763 --node_river_water = "",
770 minetest.register_biome({
771 name = "rainforest_swamp",
773 node_top = "default:dirt",
775 node_filler = "default:dirt",
778 --node_water_top = "",
779 --depth_water_top = ,
781 --node_river_water = "",
788 minetest.register_biome({
789 name = "rainforest_ocean",
791 node_top = "default:sand",
793 node_filler = "default:sand",
796 --node_water_top = "",
797 --depth_water_top = ,
799 --node_river_water = "",
808 minetest.register_biome({
809 name = "underground",
816 --node_water_top = "",
817 --depth_water_top = ,
819 --node_river_water = "",
829 -- Register decorations
834 function default.register_mgv6_decorations()
835 minetest.clear_registered_decorations()
839 minetest.register_decoration({
840 deco_type = "simple",
841 place_on = {"default:dirt_with_grass"},
846 spread = {x = 100, y = 100, z = 100},
853 decoration = "default:papyrus",
856 spawn_by = "default:water_source",
862 minetest.register_decoration({
863 deco_type = "simple",
864 place_on = {"default:desert_sand"},
869 spread = {x = 100, y = 100, z = 100},
876 decoration = "default:cactus",
884 minetest.register_decoration({
885 deco_type = "simple",
886 place_on = {"default:dirt_with_grass"},
891 spread = {x = 100, y = 100, z = 100},
898 decoration = "default:grass_"..length,
904 minetest.register_decoration({
905 deco_type = "simple",
906 place_on = {"default:desert_sand", "default:dirt_with_snow"},
911 spread = {x = 100, y = 100, z = 100},
918 decoration = "default:dry_shrub",
922 -- All mapgens except mgv6 and singlenode
924 local function register_grass_decoration(offset, scale, length)
925 minetest.register_decoration({
926 deco_type = "simple",
927 place_on = {"default:dirt_with_grass", "default:sand"},
932 spread = {x = 200, y = 200, z = 200},
937 biomes = {"stone_grassland", "sandstone_grassland",
938 "deciduous_forest", "coniferous_forest",
939 "stone_grassland_dunes", "sandstone_grassland_dunes",
940 "coniferous_forest_dunes"},
943 decoration = "default:grass_"..length,
947 local function register_dry_grass_decoration(offset, scale, length)
948 minetest.register_decoration({
949 deco_type = "simple",
950 place_on = {"default:dirt_with_dry_grass"},
955 spread = {x = 200, y = 200, z = 200},
960 biomes = {"savanna"},
963 decoration = "default:dry_grass_"..length,
967 function default.register_decorations()
968 minetest.clear_registered_decorations()
970 -- Apple tree and log
972 minetest.register_decoration({
973 deco_type = "schematic",
974 place_on = {"default:dirt_with_grass"},
979 spread = {x = 250, y = 250, z = 250},
984 biomes = {"deciduous_forest"},
987 schematic = minetest.get_modpath("default").."/schematics/apple_tree.mts",
988 flags = "place_center_x, place_center_z",
991 minetest.register_decoration({
992 deco_type = "schematic",
993 place_on = {"default:dirt_with_grass"},
998 spread = {x = 250, y = 250, z = 250},
1003 biomes = {"deciduous_forest"},
1007 size = { x = 3, y = 3, z = 1},
1009 { name = "air", prob = 0 },
1010 { name = "air", prob = 0 },
1011 { name = "air", prob = 0 },
1012 { name = "default:tree", param2 = 12, prob = 191 },
1013 { name = "default:tree", param2 = 12 },
1014 { name = "default:tree", param2 = 12, prob = 127 },
1015 { name = "air", prob = 0 },
1016 { name = "flowers:mushroom_brown", prob = 63 },
1017 { name = "air", prob = 0 },
1020 flags = "place_center_x",
1021 rotation = "random",
1024 -- Jungle tree and log
1026 minetest.register_decoration({
1027 deco_type = "schematic",
1028 place_on = {"default:dirt_with_grass", "default:dirt"},
1031 biomes = {"rainforest", "rainforest_swamp"},
1034 schematic = minetest.get_modpath("default").."/schematics/jungle_tree.mts",
1035 flags = "place_center_x, place_center_z",
1036 rotation = "random",
1039 minetest.register_decoration({
1040 deco_type = "schematic",
1041 place_on = {"default:dirt_with_grass", "default:dirt"},
1044 biomes = {"rainforest", "rainforest_swamp"},
1048 size = { x = 3, y = 3, z = 1},
1050 { name = "air", prob = 0 },
1051 { name = "air", prob = 0 },
1052 { name = "air", prob = 0 },
1053 { name = "default:jungletree", param2 = 12, prob = 191 },
1054 { name = "default:jungletree", param2 = 12 },
1055 { name = "default:jungletree", param2 = 12, prob = 127 },
1056 { name = "air", prob = 0 },
1057 { name = "flowers:mushroom_brown", prob = 127 },
1058 { name = "air", prob = 0 },
1061 flags = "place_center_x",
1062 rotation = "random",
1065 -- Taiga and temperate coniferous forest pine tree and log
1067 minetest.register_decoration({
1068 deco_type = "schematic",
1069 place_on = {"default:dirt_with_snow", "default:dirt_with_grass"},
1074 spread = {x = 250, y = 250, z = 250},
1079 biomes = {"taiga", "coniferous_forest"},
1082 schematic = minetest.get_modpath("default").."/schematics/pine_tree.mts",
1083 flags = "place_center_x, place_center_z",
1086 minetest.register_decoration({
1087 deco_type = "schematic",
1088 place_on = {"default:dirt_with_snow", "default:dirt_with_grass"},
1091 biomes = {"taiga", "coniferous_forest"},
1095 size = { x = 3, y = 3, z = 1},
1097 { name = "air", prob = 0 },
1098 { name = "air", prob = 0 },
1099 { name = "air", prob = 0 },
1100 { name = "default:pine_tree", param2 = 12, prob = 191 },
1101 { name = "default:pine_tree", param2 = 12 },
1102 { name = "default:pine_tree", param2 = 12, prob = 127 },
1103 { name = "air", prob = 0 },
1104 { name = "flowers:mushroom_red", prob = 63 },
1105 { name = "air", prob = 0 },
1108 flags = "place_center_x",
1109 rotation = "random",
1112 -- Acacia tree and log
1114 minetest.register_decoration({
1115 deco_type = "schematic",
1116 place_on = {"default:dirt_with_dry_grass"},
1121 spread = {x = 250, y = 250, z = 250},
1126 biomes = {"savanna"},
1129 schematic = minetest.get_modpath("default").."/schematics/acacia_tree.mts",
1130 flags = "place_center_x, place_center_z",
1131 rotation = "random",
1134 minetest.register_decoration({
1135 deco_type = "schematic",
1136 place_on = {"default:dirt_with_dry_grass"},
1141 spread = {x = 250, y = 250, z = 250},
1146 biomes = {"savanna"},
1150 size = { x = 3, y = 2, z = 1},
1152 { name = "air", prob = 0 },
1153 { name = "air", prob = 0 },
1154 { name = "air", prob = 0 },
1155 { name = "default:acacia_tree", param2 = 12, prob = 191 },
1156 { name = "default:acacia_tree", param2 = 12 },
1157 { name = "default:acacia_tree", param2 = 12, prob = 127 },
1160 flags = "place_center_x",
1161 rotation = "random",
1164 -- Aspen tree and log
1166 minetest.register_decoration({
1167 deco_type = "schematic",
1168 place_on = {"default:dirt_with_grass"},
1173 spread = {x = 250, y = 250, z = 250},
1178 biomes = {"deciduous_forest"},
1181 schematic = minetest.get_modpath("default").."/schematics/aspen_tree.mts",
1182 flags = "place_center_x, place_center_z",
1183 rotation = "random",
1186 minetest.register_decoration({
1187 deco_type = "schematic",
1188 place_on = {"default:dirt_with_grass"},
1193 spread = {x = 250, y = 250, z = 250},
1198 biomes = {"deciduous_forest"},
1202 size = { x = 3, y = 3, z = 1},
1204 { name = "air", prob = 0 },
1205 { name = "air", prob = 0 },
1206 { name = "air", prob = 0 },
1207 { name = "default:aspen_tree", param2 = 12 },
1208 { name = "default:aspen_tree", param2 = 12 },
1209 { name = "default:aspen_tree", param2 = 12, prob = 127 },
1210 { name = "flowers:mushroom_red", prob = 63 },
1211 { name = "flowers:mushroom_brown", prob = 63 },
1212 { name = "air", prob = 0 },
1215 flags = "place_center_x",
1216 rotation = "random",
1220 minetest.register_decoration({
1221 deco_type = "schematic",
1222 place_on = {"default:desert_sand"},
1227 spread = {x = 200, y = 200, z = 200},
1232 biomes = {"desert"},
1235 schematic = minetest.get_modpath("default").."/schematics/large_cactus.mts",
1236 flags = "place_center_x",
1237 rotation = "random",
1242 minetest.register_decoration({
1243 deco_type = "simple",
1244 place_on = {"default:desert_sand"},
1249 spread = {x = 200, y = 200, z = 200},
1254 biomes = {"desert"},
1257 decoration = "default:cactus",
1264 minetest.register_decoration({
1265 deco_type = "schematic",
1266 place_on = {"default:dirt"},
1271 spread = {x = 200, y = 200, z = 200},
1276 biomes = {"savanna_swamp"},
1279 schematic = minetest.get_modpath("default").."/schematics/papyrus.mts",
1284 register_grass_decoration(-0.03, 0.09, 5)
1285 register_grass_decoration(-0.015, 0.075, 4)
1286 register_grass_decoration(0, 0.06, 3)
1287 register_grass_decoration(0.015, 0.045, 2)
1288 register_grass_decoration(0.03, 0.03, 1)
1292 register_dry_grass_decoration(0.01, 0.05, 5)
1293 register_dry_grass_decoration(0.03, 0.03, 4)
1294 register_dry_grass_decoration(0.05, 0.01, 3)
1295 register_dry_grass_decoration(0.07, -0.01, 2)
1296 register_dry_grass_decoration(0.09, -0.03, 1)
1300 minetest.register_decoration({
1301 deco_type = "simple",
1302 place_on = {"default:dirt_with_grass"},
1305 biomes = {"rainforest"},
1308 decoration = "default:junglegrass",
1313 minetest.register_decoration({
1314 deco_type = "simple",
1315 place_on = {"default:desert_sand", "default:dirt_with_snow"},
1320 spread = {x = 200, y = 200, z = 200},
1325 biomes = {"desert", "tundra"},
1328 decoration = "default:dry_shrub",
1334 -- Generate nyan cats
1337 -- All mapgens except singlenode
1339 function default.make_nyancat(pos, facedir, length)
1340 local tailvec = {x = 0, y = 0, z = 0}
1341 if facedir == 0 then
1343 elseif facedir == 1 then
1345 elseif facedir == 2 then
1347 elseif facedir == 3 then
1353 local p = {x = pos.x, y = pos.y, z = pos.z}
1354 minetest.set_node(p, {name = "default:nyancat", param2 = facedir})
1355 for i = 1, length do
1356 p.x = p.x + tailvec.x
1357 p.z = p.z + tailvec.z
1358 minetest.set_node(p, {name = "default:nyancat_rainbow", param2 = facedir})
1362 function default.generate_nyancats(minp, maxp, seed)
1363 local height_min = -31000
1364 local height_max = -32
1365 if maxp.y < height_min or minp.y > height_max then
1368 local y_min = math.max(minp.y, height_min)
1369 local y_max = math.min(maxp.y, height_max)
1370 local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
1371 local pr = PseudoRandom(seed + 9324342)
1372 local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
1373 for i = 1, max_num_nyancats do
1374 if pr:next(0, 1000) == 0 then
1375 local x0 = pr:next(minp.x, maxp.x)
1376 local y0 = pr:next(minp.y, maxp.y)
1377 local z0 = pr:next(minp.z, maxp.z)
1378 local p0 = {x = x0, y = y0, z = z0}
1379 default.make_nyancat(p0, pr:next(0, 3), pr:next(3, 15))
1386 -- Detect mapgen to select functions
1389 -- Mods using singlenode mapgen can call these functions to enable
1390 -- the use of minetest.generate_ores or minetest.generate_decorations
1392 local mg_params = minetest.get_mapgen_params()
1393 if mg_params.mgname == "v6" then
1394 default.register_ores()
1395 default.register_mgv6_decorations()
1396 minetest.register_on_generated(default.generate_nyancats)
1397 elseif mg_params.mgname ~= "singlenode" then
1398 default.register_ores()
1399 default.register_biomes()
1400 default.register_decorations()
1401 minetest.register_on_generated(default.generate_nyancats)