From 266fde8ff2b7e6de51d0998329b8042b200fae09 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 15 Aug 2017 19:40:53 +0200 Subject: [PATCH 01/75] Import biomes, gt2mc2 and related files from mc2plus gt2mc2 contains aliases. This mod is temporary and should be removed later. Kudos to maikerumine! --- mods/ITEMS/mcl_core/schematics/acacia_log.mts | Bin 0 -> 65 bytes mods/ITEMS/mcl_core/schematics/apple_log.mts | Bin 0 -> 90 bytes mods/ITEMS/mcl_core/schematics/apple_tree.mts | Bin 0 -> 169 bytes mods/ITEMS/mcl_core/schematics/aspen_log.mts | Bin 0 -> 118 bytes mods/ITEMS/mcl_core/schematics/aspen_tree.mts | Bin 0 -> 174 bytes mods/ITEMS/mcl_core/schematics/jungle_log.mts | Bin 0 -> 96 bytes .../ITEMS/mcl_core/schematics/jungle_tree.mts | Bin 0 -> 255 bytes mods/ITEMS/mcl_core/schematics/pine_log.mts | Bin 0 -> 93 bytes mods/ITEMS/mcl_core/schematics/pine_tree.mts | Bin 0 -> 176 bytes mods/MAPGEN/mcl_biomes/LICENSE | 5 + mods/MAPGEN/mcl_biomes/README.md | 1 + mods/MAPGEN/mcl_biomes/description.txt | 1 + mods/MAPGEN/mcl_biomes/init.lua | 1477 ++++++++++++++++- mods/MISC/gt2mc2/LICENSE | 21 + mods/MISC/gt2mc2/craftitems.lua | 317 ++++ mods/MISC/gt2mc2/depends.txt | 2 + mods/MISC/gt2mc2/enchanted.lua | 55 + mods/MISC/gt2mc2/init.lua | 792 +++++++++ mods/MISC/gt2mc2/mob_items.lua | 161 ++ 19 files changed, 2778 insertions(+), 54 deletions(-) create mode 100644 mods/ITEMS/mcl_core/schematics/acacia_log.mts create mode 100644 mods/ITEMS/mcl_core/schematics/apple_log.mts create mode 100644 mods/ITEMS/mcl_core/schematics/apple_tree.mts create mode 100644 mods/ITEMS/mcl_core/schematics/aspen_log.mts create mode 100644 mods/ITEMS/mcl_core/schematics/aspen_tree.mts create mode 100644 mods/ITEMS/mcl_core/schematics/jungle_log.mts create mode 100644 mods/ITEMS/mcl_core/schematics/jungle_tree.mts create mode 100644 mods/ITEMS/mcl_core/schematics/pine_log.mts create mode 100644 mods/ITEMS/mcl_core/schematics/pine_tree.mts create mode 100644 mods/MAPGEN/mcl_biomes/LICENSE create mode 100644 mods/MAPGEN/mcl_biomes/README.md create mode 100644 mods/MAPGEN/mcl_biomes/description.txt create mode 100644 mods/MISC/gt2mc2/LICENSE create mode 100644 mods/MISC/gt2mc2/craftitems.lua create mode 100644 mods/MISC/gt2mc2/depends.txt create mode 100644 mods/MISC/gt2mc2/enchanted.lua create mode 100644 mods/MISC/gt2mc2/init.lua create mode 100644 mods/MISC/gt2mc2/mob_items.lua diff --git a/mods/ITEMS/mcl_core/schematics/acacia_log.mts b/mods/ITEMS/mcl_core/schematics/acacia_log.mts new file mode 100644 index 0000000000000000000000000000000000000000..037bca8c32152f0927ff027811e918e713872b91 GIT binary patch literal 65 zcmeYb3HD`RVPIxpVqmPV2a?Q*nMDl3DXD3Rr8y;5iOGq{nThcwMX9M3bCMGnnB5Fg T5<1pzXP;zaW5d8XmC+Rd7>*KA literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_core/schematics/apple_log.mts b/mods/ITEMS/mcl_core/schematics/apple_log.mts new file mode 100644 index 0000000000000000000000000000000000000000..e7ee8f2b84ab06165c4537cd4607ec56e3066608 GIT binary patch literal 90 zcmeYb3HD`RVPFPA#`^kt5F;_Oh=C_1H7&6;r^KqHC^eNqEG;L$JhiCUDz~&aqbNT= qH$JH-zdWyEPI3YRvztLmLITt0N3Y*XK5^uclao{6WDtsDOalOtHXH!} literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_core/schematics/apple_tree.mts b/mods/ITEMS/mcl_core/schematics/apple_tree.mts new file mode 100644 index 0000000000000000000000000000000000000000..2bd57c1fc4aa36e2f03c6ac2989c86b575e2784e GIT binary patch literal 169 zcmeYb3HD`RVPIw8U|_AUx333bAfGugvxtE&B{eOvG^fNWCpEDwwU~hi#xE&KO=aMP z@e&IPa#AbiBqt~c89ZuT!tBPT#+IgVELCpPPM?C<9g#f_mlbAgsJv1pU-)dIY~9D7 zKYxDYU|PQG&;L)qKYxDx`n4hpbAVyM7kg%_iTd&S{fpMw$?vZG{q%qGEcboC+msj> J$|h)D1OV1LMcM!W literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_core/schematics/aspen_log.mts b/mods/ITEMS/mcl_core/schematics/aspen_log.mts new file mode 100644 index 0000000000000000000000000000000000000000..180e6fd1be8b31d1578f057edd7e3fb3f321c5ed GIT binary patch literal 118 zcmeYb3HD`RVPFPA#`^kt5Hm5eh(RbNH7&6;r^G6;xF9tzzN9EMl|dveC%-(ksMspE zv^b+EKR-9VC^dya3_~=jD8D?fVoq`b1GAe!N>T#b=U1=aK7H!QBPS=Pz{w!`m2m|C DeorWw literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_core/schematics/aspen_tree.mts b/mods/ITEMS/mcl_core/schematics/aspen_tree.mts new file mode 100644 index 0000000000000000000000000000000000000000..429a831c775320ace3f86c566380abea4dafb162 GIT binary patch literal 174 zcmeYb3HD`RVPIw8V_>bXx3{kc0(&5=uV-LpU{1^|Vh~A5O-n4zDX~f{E=bLb&q+-z zOD$#)LKQ73N=>bplbo=CE1|{t($N*H3D1;nJFb$@N>G}8lq2QfnbfA+j%y?i>0aSb zf7Q;t^^VK$FG=&`=jZoNcI9EvVtZ6&&^ect_5Vk~um4|5zG`%_EfW)9z8Y{|mxb}^ OLnAH?CI+>4*1Z5>DMP^k literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_core/schematics/jungle_log.mts b/mods/ITEMS/mcl_core/schematics/jungle_log.mts new file mode 100644 index 0000000000000000000000000000000000000000..54fa16d175a053f47c4ee55d678b33dbf507f314 GIT binary patch literal 96 zcmeYb3HD`RVPFPA#`^kt5F;_Oh(RbNH7&6;r^G6&G%r0TwWKIDl|d{mC%-(ksMspE wv^b+EKR-7C%3+vN=rSWXq^x~b|=M&Ewj4Te{H{7&mMdtdqdA`2WeXQr3zbp3r zu3VqKc~9kCufMz#HWd5EbX0U+WUiaJ>B^KDR?C}bNK9P8w`y*-b((2w_iRI{RjGG0 pZe8=SR^GI%s5x}m)LF^bFU!u(KR3Q8HKk%sasmUhn?XuK0@LS5uir{OapaMclT+Yi5Q<|=0|4+Z9U=e# literal 0 HcmV?d00001 diff --git a/mods/ITEMS/mcl_core/schematics/pine_tree.mts b/mods/ITEMS/mcl_core/schematics/pine_tree.mts new file mode 100644 index 0000000000000000000000000000000000000000..6f27d83921216011779cb297d1a771de9fdd0f85 GIT binary patch literal 176 zcmeYb3HD`RVPIw8XJD6#sisx1lv4L44QEnay{ zGxJs7r=rQ()^ocp?Ze-Pe0+DUOw{x1!PwBH*CJmzb82~<3s_*;T>IsJubl0gGkTg+ Q+mEcP(>cV(nP|!f0N>9^{{R30 literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_biomes/LICENSE b/mods/MAPGEN/mcl_biomes/LICENSE new file mode 100644 index 000000000..1f95d26c5 --- /dev/null +++ b/mods/MAPGEN/mcl_biomes/LICENSE @@ -0,0 +1,5 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/mods/MAPGEN/mcl_biomes/README.md b/mods/MAPGEN/mcl_biomes/README.md new file mode 100644 index 000000000..e4f3edc5e --- /dev/null +++ b/mods/MAPGEN/mcl_biomes/README.md @@ -0,0 +1 @@ +Biomes mod. By Wuzzy and maikerumine. diff --git a/mods/MAPGEN/mcl_biomes/description.txt b/mods/MAPGEN/mcl_biomes/description.txt new file mode 100644 index 000000000..496ffb217 --- /dev/null +++ b/mods/MAPGEN/mcl_biomes/description.txt @@ -0,0 +1 @@ +Adds the various biomes and biome-related things for non-v6 map generators. diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index ddbd8456e..f195bcab1 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -23,38 +23,238 @@ end -- All mapgens except mgv6, flat and singlenode local function register_biomes() + --[[ OVERWORLD ]] + + -- Icesheet minetest.register_biome({ - name = "ice_plains", + name = "icesheet", + node_dust = "mcl_core:snowblock", + node_top = "mcl_core:snowblock", + depth_top = 1, + node_filler = "mcl_core:snowblock", + depth_filler = 3, + node_stone = "mcl_core:packed_ice", + node_water_top = "mcl_core:ice", + depth_water_top = 10, + node_river_water = "mcl_core:ice", + node_riverbed = "mcl_core:gravel", + depth_riverbed = 2, + y_min = -8, + y_max = upper_limit, + heat_point = 0, + humidity_point = 73, + }) + + minetest.register_biome({ + name = "icesheet_ocean", + node_dust = "mcl_core:snowblock", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 3, + node_water_top = "mcl_core:ice", + depth_water_top = 10, + y_min = -112, + y_max = -9, + heat_point = 0, + humidity_point = 73, + }) + + -- Tundra + + minetest.register_biome({ + name = "tundra", + node_dust = "mcl_core:snowblock", + node_riverbed = "mcl_core:gravel", + depth_riverbed = 2, + y_min = 2, + y_max = upper_limit, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra_beach", + node_top = "mcl_core:gravel", + depth_top = 1, + node_filler = "mcl_core:gravel", + depth_filler = 2, + node_riverbed = "mcl_core:gravel", + depth_riverbed = 2, + y_min = -3, + y_max = 1, + heat_point = 0, + humidity_point = 40, + }) + + minetest.register_biome({ + name = "tundra_ocean", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 3, + node_riverbed = "mcl_core:gravel", + depth_riverbed = 2, + y_min = -112, + y_max = -4, + heat_point = 0, + humidity_point = 40, + }) + + -- Taiga + minetest.register_biome({ + name = "taiga", + node_top = "mcl_core:podzol", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 15, + y_max = upper_limit, + heat_point = 26, + humidity_point = 72, + }) + + minetest.register_biome({ + name = "taiga_ocean", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 3, + node_riverbed = "mcl_core:stone", + depth_riverbed = 2, + y_min = -112, + y_max = 1, + heat_point = 26, + humidity_point = 72, + }) + + -- Snowy grassland + + minetest.register_biome({ + name = "snowy_grassland", node_dust = "mcl_core:snow", node_top = "mcl_core:dirt_with_grass_snow", depth_top = 1, node_filler = "mcl_core:dirt", - depth_filler = 3, - node_riverbed = "mcl_core:dirt", + depth_filler = 1, + node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = 1, - y_max = 31000, - heat_point = 5, - humidity_point = 50, + y_min = 5, + y_max = upper_limit, + heat_point = 13, + humidity_point = 79, }) minetest.register_biome({ - name = "ice_plains2", - node_dust = "mcl_core:snowblock", - node_top = "mcl_core:dirt_with_grass_snow", + name = "snowy_grassland_ocean", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 3, + node_riverbed = "mcl_core:stone", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 13, + humidity_point = 79, + }) + + -- Grassland + + minetest.register_biome({ + name = "grassland", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 1, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 6, + y_max = upper_limit, + heat_point = 26, + humidity_point = 45, + }) + + minetest.register_biome({ + name = "grassland_dunes", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 2, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 5, + y_max = 1, + heat_point = 26, + humidity_point = 45, + }) + + + minetest.register_biome({ + name = "grassland_ocean", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 3, + node_riverbed = "mcl_core:stone", + depth_riverbed = 2, + y_min = -112, + y_max = 0, + heat_point = 26, + humidity_point = 45, + }) + + -- Coniferous forest + + minetest.register_biome({ + name = "coniferous_forest", + node_top = "mcl_core:dirt_with_grass", depth_top = 1, node_filler = "mcl_core:dirt", depth_filler = 3, - node_riverbed = "mcl_core:dirt", + node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = 1, - y_max = 31000, - heat_point = 0, - humidity_point = 50, + y_min = 6, + y_max = upper_limit, + heat_point = 47, + humidity_point = 73, --was 70 }) minetest.register_biome({ - name = "plains", + name = "coniferous_forest_dunes", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = 56, + heat_point = 47, + humidity_point = 73, --was 70 + }) + + minetest.register_biome({ + name = "coniferous_forest_ocean", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 3, + node_riverbed = "mcl_core:stone", + depth_riverbed = 2, + y_min = -112, + y_max = 0, + heat_point = 47, + humidity_point = 73, --was 70 + }) + + -- Deciduous forest + + + minetest.register_biome({ + name = "deciduous_forest", node_top = "mcl_core:dirt_with_grass", depth_top = 1, node_filler = "mcl_core:dirt", @@ -62,78 +262,822 @@ local function register_biomes() node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = 1, - y_max = 31000, - heat_point = 40, - humidity_point = 50, + y_max = upper_limit, + heat_point = 33, + humidity_point = 44, --was 68 }) minetest.register_biome({ - name = "beach", - node_top = "mcl_core:sand", + name = "deciduous_forest_shore", + node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:sand", + node_filler = "mcl_core:dirt", depth_filler = 3, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = 1, - y_max = 5, - heat_point = 40, - humidity_point = 50, + y_min = -1, + y_max = 0, + heat_point = 33, + humidity_point = 44, --was 68 }) + minetest.register_biome({ + name = "deciduous_forest_ocean", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 3, + node_riverbed = "mcl_core:stone", + depth_riverbed = 2, + y_min = -112, + y_max = -2, + heat_point = 33, + humidity_point = 44, --was 68 + }) + + -- Desert + minetest.register_biome({ name = "desert", + node_top = "mcl_core:redsand", + depth_top = 1, + node_filler = "mcl_core:redsand", + depth_filler = 1, + node_stone = "mcl_core:redsandstone", + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = upper_limit, + heat_point = 64, + humidity_point = 37, --was 16 + }) + + minetest.register_biome({ + name = "desert_ocean", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 3, + node_stone = "mcl_core:stone", + node_riverbed = "mcl_core:stone", + depth_riverbed = 2, + y_min = -112, + y_max = 0, + heat_point = 64, + humidity_point = 37, --was 16 + }) + + -- Sandstone desert + + minetest.register_biome({ + name = "sandstone_desert", + node_top = "mcl_core:sand", + depth_top = 1, + node_filler = "mcl_core:sand", + depth_filler = 1, + node_stone = "mcl_core:sandstone", + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 0, + y_max = upper_limit, + heat_point = 57, + humidity_point = 0, --was 0 + }) + + minetest.register_biome({ + name = "sandstone_desert_ocean", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 3, + node_stone = "mcl_core:stone", + node_riverbed = "mcl_core:stone", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 57, + humidity_point = 0, --was 0 + }) + + -- Cold desert + + minetest.register_biome({ + name = "cold_desert", + --node_dust = "", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 1, + node_riverbed = "mcl_core:stone", + depth_riverbed = 2, + y_min = 5, + y_max = upper_limit, + heat_point = 26, + humidity_point = 0, --was 0 + }) + + minetest.register_biome({ + name = "cold_desert_ocean", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 3, + node_riverbed = "mcl_core:stone", + depth_riverbed = 2, + y_min = -112, + y_max = 4, + heat_point = 26, + humidity_point = 0, --was 0 + }) + + -- Hot biomes + minetest.register_biome({ + name = "mesa", + node_top = "mcl_colorblocks:hardened_clay_orange", + depth_top = 1, + node_filler = "mcl_colorblocks:hardened_clay_orange", + depth_filler = 1, + node_stone = "mcl_colorblocks:hardened_clay_orange", + y_min = -35, + y_max = 31000, + heat_point = 88, + humidity_point = 20, --was 40 + }) + + + -- Savanna + minetest.register_biome({ + name = "savanna", + node_top = "mcl_core:dirt_with_grass", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 1, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = upper_limit, + heat_point = 50, + humidity_point = 46, --was 42 + }) + + minetest.register_biome({ + name = "savanna_shore", + node_top = "mcl_core:dirt", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = -1, + y_max = 0, + heat_point = 50, + humidity_point = 46, --was 42 + }) + + minetest.register_biome({ + name = "savanna_ocean", + node_top = "mcl_core:stone", + depth_top = 1, + node_filler = "mcl_core:stone", + depth_filler = 3, + node_riverbed = "mcl_core:stone", + depth_riverbed = 2, + y_min = -112, + y_max = -2, + heat_point = 50, + humidity_point = 46, --was 42 + }) + + -- Rainforest + + minetest.register_biome({ + name = "rainforest", + node_top = "mcl_core:podzol", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = 1, + y_max = upper_limit, + heat_point = 90, + humidity_point = 91, + }) + + minetest.register_biome({ + name = "rainforest_swamp", + node_top = "mcl_core:dirt", + depth_top = 1, + node_filler = "mcl_core:dirt", + depth_filler = 3, + node_riverbed = "mcl_core:sand", + depth_riverbed = 2, + y_min = -1, + y_max = 0, + heat_point = 90, + humidity_point = 91, + }) + + minetest.register_biome({ + name = "rainforest_ocean", node_top = "mcl_core:sand", depth_top = 1, node_filler = "mcl_core:sand", depth_filler = 3, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - node_stone = "mcl_core:sandstone", - y_min = 1, - y_max = 31000, - heat_point = 100, - humidity_point = 50, + y_min = -112, + y_max = -2, + heat_point = 90, + humidity_point = 91, }) + -- Mushroom biomes minetest.register_biome({ - name = "mesa", - node_top = "mcl_core:redsand", + name = "mushroom", + node_top = "mcl_core:mycelium", depth_top = 1, - node_filler = "mcl_core:hardened_clay", + node_filler = "mcl_core:dirt", depth_filler = 3, - node_riverbed = "mcl_core:redsand", + node_riverbed = "mcl_core:sand", depth_riverbed = 2, - node_stone = "mcl_core:hardened_clay", y_min = 1, - y_max = 5, - heat_point = 100, - humidity_point = 50, + y_max = 20, + heat_point = 99, + humidity_point = 99, }) minetest.register_biome({ - name = "mesa2", - node_top = "mcl_colorblocks:hardened_clay", + name = "mushroom_ocean", + node_top = "mcl_core:stone", depth_top = 1, - node_filler = "mcl_colorblocks:hardened_clay_orange", - depth_filler = 1, - node_riverbed = "mcl_core:redsand", + node_filler = "mcl_core:gravel", + depth_filler = 3, + node_riverbed = "mcl_core:coarse_dirt", depth_riverbed = 2, - node_stone = "mcl_core:hardened_clay", - y_min = 1, - y_max = 5, - heat_point = 100, - humidity_point = 50, + y_min = -112, + y_max = 0, + heat_point = 99, + humidity_point = 99, }) + --cold + minetest.register_biome({ + name = "mushroom_cold", + node_dust = "mcl_core:snow", + node_top = "mcl_core:mycelium_snow", + depth_top = 1, + node_filler = "mcl_core:coarse_dirt", + depth_filler = 3, + node_riverbed = "mcl_core:stone", + depth_riverbed = 2, + y_min = 56, + y_max = 900, + heat_point = -13, + humidity_point = 30, + }) + + + + -- Underground in Overworld minetest.register_biome({ name = "underground", y_min = -31000, - y_max = -113, + y_max = -10000, heat_point = 50, humidity_point = 50, }) + + + --[[ REALMS ]] + -- TODO: Make these work in v6, too. + + -- Separation void 1 + minetest.register_biome({ + name = "void_1", + node_stone = "mcl_core:void", + y_min = -2989, + y_max = -82, + heat_point = 50, + humidity_point = 50, + }) + + + --[[ THE NETHER ]] + minetest.register_biome({ + name = "nether_roof", + node_stone = "mcl_core:bedrock", + y_min = -3000, + y_max = -2990, + heat_point = 50, + humidity_point = 50, + }) + + minetest.register_biome({ + name = "nether", + node_filler = "mcl_nether:netherrack", + node_stone = "mcl_nether:netherrack", + y_min = -3369, + y_max = -3001, + heat_point = 50, + humidity_point = 50, + }) + + -- TODO: Different lava algorithm + minetest.register_biome({ + name = "nether_lava", + node_filler = "mcl_nether:nether_lava_source", + node_stone = "mcl_nether:nether_lava_source", + y_min = -3399, + y_max = -3370, + heat_point = 50, + humidity_point = 50, + }) + + minetest.register_biome({ + name = "nether_floor", + node_filler = "mcl_core:bedrock", + node_stone = "mcl_core:bedrock", + y_min = -3430, + y_max = -3400, + heat_point = 50, + humidity_point = 50, + }) + + -- Separation void 2 + minetest.register_biome({ + name = "void_2", + node_stone = "mcl_core:void", + y_min = -4900, + y_max = -3431, + heat_point = 50, + humidity_point = 50, + }) + + + --[[ The End ]] + + minetest.register_biome({ + name = "end", + node_filler = "mcl_end:end_stone", + node_stone = "air", + y_min = -6200, + y_max = -6000, + heat_point = 50, + humidity_point = 50, + }) + + -- Separation void 3 + minetest.register_biome({ + name = "void_3", + node_stone = "mcl_core:void", + y_min = -6700, + y_max = -6201, + heat_point = 50, + humidity_point = 50, + }) + + -- Realm barrier to separate the top of the End realm with the separation void + minetest.register_biome({ + name = "end_barrier", + node_filler = "mcl_core:realm_barrier", + node_stone = "mcl_core:realm_barrier", + y_min = -6800, + y_max = -6701, + heat_point = 50, + humidity_point = 50, + }) + +end + +-- Register “fake” ores directly related to the biomes +local function register_biomelike_ores() + + -- Fake moss stone boulder + -- TODO: Remove when real boulders are added + minetest.register_ore({ + ore_type = "blob", + ore = "mcl_core:mossycobble", + wherein = "mcl_core:podzol", + clust_scarcity = 16 * 16 * 16, + clust_size = 3, + y_min = 25, + y_max = 31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 3, y = 3, z = 3}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + }) + + --mcl_core STRATA + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:stone", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_scarcity = 1, + clust_num_ores = 3, + clust_size = 4, + y_min = 50, + y_max = 90, + noise_threshold = 0.4, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} + }) + + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:clay", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_scarcity = 1, + clust_num_ores = 12, + clust_size = 8, + y_min = 24, + y_max = 50, + noise_threshold = 0.4, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} + }) + + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:sandstone", + wherein ={"mcl_colorblocks:hardened_clay_orange"}, + clust_scarcity = 1, + clust_num_ores = 12, + clust_size = 10, + y_min = 10, + y_max = 30, + noise_threshold = 0.2, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} + }) + + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:dirt", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_scarcity = 1, + clust_num_ores = 12, + clust_size = 4, + y_min = -12, + y_max = 7, + noise_threshold = 0.4, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} + }) + + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:redsand", + wherein = { "mcl_colorblocks:hardened_clay_orange"}, + clust_scarcity = 1, + clust_num_ores = 12, + clust_size = 10, + y_min = 44, + y_max = 70, + noise_threshold = 0.7, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} + }) + + + -- MESA STRATA + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:redsand", + wherein = {"mcl_core:redsandstone", "mcl_colorblocks:hardened_clay_orange"}, + clust_scarcity = 1, + clust_num_ores = 8, + clust_size = 4, + y_min = 4, + y_max = 70, + noise_threshold = 0.4, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} + }) + + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_white", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 1, + y_min = 5, + y_max = 14, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_black", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 1, + y_min = 15, + y_max = 17, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70}, + }) + + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_brown", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 6, + y_min = 20, + y_max = 29, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_red", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 2, + y_min = 34, + y_max = 37, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_yellow", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 1, + y_min = 42, + y_max = 43, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_blue", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 1, + y_min = 43, + y_max = 44, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_yellow", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 1, + y_min = 44, + y_max = 45, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_yellow", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 1, + y_min = 45, + y_max = 47, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_light_blue", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 1, + y_min = 49, + y_max = 52, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_yellow", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 4, + y_min = 53, + y_max = 59, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_white", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 8, + y_min = 61, + y_max = 70, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_colorblocks:hardened_clay_purple", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + clust_size = 8, + y_min = 66, + y_max = 75, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:obsidian", + wherein = {"mcl_colorblocks:hardened_clay_orange"}, + + clust_size = 8, + y_min = 161, + y_max = 170, + noise_threshold = 0.0, + noise_params = {offset=0, scale=1, spread= {x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , + }) + + + --[[ NETHER GENERATION ]] + + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_nether:quartz_ore", + --wherein = "mcl_nether:rack", + wherein = {"mcl_nether:netherrack","mcl_core:stone"}, + clust_scarcity = 10*10*10, + clust_num_ores = 6, + clust_size = 5, + y_min = -3390, + y_max = -3000, + --y_max = NETHER_DEPTH, + }) + + -- Soul sand + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_nether:soul_sand", + wherein = {"mcl_nether:netherrack", "mcl_core:lava_source", + "mcl_core:redsandstone"}, + clust_scarcity = 13 * 13 * 13, + clust_size = 5, + y_min = -3390, + y_max = -3000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.1, + spread = {x = 5, y = 5, z = 5}, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + }) + + -- Magma blocks + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_nether:magma", + wherein = {"mcl_nether:netherrack", "mcl_core:lava_source", + "mcl_core:redsandstone"}, + clust_scarcity = 13 * 13 * 13, + clust_size = 5, + y_min = -3390, + y_max = -3000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.1, + spread = {x = 5, y = 5, z = 5}, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + }) + + + -- Glowstone + + minetest.register_ore({ + ore_type = "blob", + ore = "mcl_nether:glowstone", + wherein = {"mcl_nether:netherrack", "mcl_portals:nether_air"}, + clust_scarcity = 26 * 26 * 26, + clust_size = 5, + y_min = -3390, + y_max = -3000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.1, + spread = {x = 5, y = 5, z = 5}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + }) + + -- Gravel + + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:gravel", + wherein = {"mcl_nether:netherrack"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_min = -3390, + y_max = -3000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 5, y = 5, z = 5}, + seed = 766, + octaves = 1, + persist = 0.0 + }, + }) + + -- Lava in the Nether + + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_nether:nether_lava_source", + wherein = "mcl_nether:netherrack", + clust_scarcity =12 *12 * 12, + clust_num_ores = 2, + clust_size = 2, + y_min = -3390, + y_max = -3000, + }) + + + --Fire in the Nether + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_fire:eternal_fire", + wherein = "mcl_nether:netherrack", + clust_scarcity =12 *22 * 12, + clust_num_ores = 5, + clust_size = 5, + y_min = -3390, + y_max = -3000, + }) + + -- Generate holes in Nether + minetest.register_ore({ + ore_type = "sheet", + ore = "air", + wherein ={"mcl_nether:netherrack"}, + clust_scarcity = 1, + clust_num_ores = 32, + clust_size = 10, + y_min = -3390, + y_max = -3000, + noise_threshold = 0.2, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} + }) + + + --[[ THE END ]] + + -- Generate fake End + -- TODO: Remove both "ores" when there's a better End + + minetest.register_ore({ + ore_type = "blob", + ore = "mcl_end:end_stone", + wherein = {"mcl_core:void", "air"}, + clust_scarcity = 30 * 30 * 30, + clust_size = 17, + y_min = -5750, + y_max = -5701, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.1, + spread = {x = 5, y = 5, z = 5}, + seed = 16, + octaves = 1, + persist = 0.0 + }, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_end:end_stone", + wherein = {"mcl_core:void", "air"}, + clust_scarcity = 30 * 30 * 30, + clust_size = 34, + y_min = -5780, + y_max = -5711, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.1, + spread = {x = 70, y = 15, z = 70}, + seed = 16, + octaves = 1, + persist = 0.0 + }, + }) + + end @@ -152,7 +1096,7 @@ local function register_grass_decoration(offset, scale) octaves = 3, persist = 0.6 }, - biomes = {"plains"}, + biomes = {"grassland", "coniferous_forest", "deciduous_forest", "savanna"}, y_min = 1, y_max = 31000, decoration = "mcl_flowers:tallgrass", @@ -161,6 +1105,429 @@ end local function register_decorations() + -- Oak tree and log + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.0036, + scale = 0.0022, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("mcl_core").."/schematics/apple_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.00018, + scale = 0.00011, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_min = 1, + y_max = 31000, + schematic = { + size = {x = 3, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "mcl_core:tree", param2 = 12, prob = 191}, + {name = "mcl_core:tree", param2 = 12}, + {name = "mcl_core:tree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "mcl_mushrooms:mushroom_brown", prob = 63}, + {name = "air", prob = 0}, + }, + }, + flags = "place_center_x", + rotation = "random", + }) + + -- Jungle tree and log + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:podzol"}, + sidelen = 80, + fill_ratio = 0.09, + biomes = {"rainforest", "rainforest_swamp"}, + y_min = 0, + y_max = 31000, + schematic = minetest.get_modpath("mcl_core").."/schematics/jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:podzol"}, + sidelen = 80, + fill_ratio = 0.01, + biomes = {"rainforest", "rainforest_swamp"}, + y_min = 1, + y_max = 31000, + schematic = { + size = {x = 3, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "mcl_core:jungletree", param2 = 12, prob = 191}, + {name = "mcl_core:jungletree", param2 = 12}, + {name = "mcl_core:jungletree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "mcl_mushrooms:mushroom_brown", prob = 127}, + {name = "air", prob = 0}, + }, + }, + flags = "place_center_x", + rotation = "random", + }) + + -- Taiga and temperate coniferous forest pine tree and log + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass_snow", "mcl_core:dirt_with_grass", "mcl_core:podzol"}, + sidelen = 16, + noise_params = { + offset = 0.0096, + scale = 0.0022, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"taiga", "coniferous_forest","coniferous_forest_dunes"}, + y_min = 2, + y_max = 31000, + schematic = minetest.get_modpath("mcl_core").."/schematics/pine_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass_snow", "mcl_core:dirt_with_grass", "mcl_core:podzol"}, + sidelen = 80, + noise_params = { + offset = 0.00018, + scale = 0.00011, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"taiga", "coniferous_forest","coniferous_forest_dunes"}, + y_min = 1, + y_max = 31000, + schematic = { + size = {x = 3, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "mcl_core:sprucetree", param2 = 12, prob = 191}, + {name = "mcl_core:sprucetree", param2 = 12}, + {name = "mcl_core:sprucetree", param2 = 12, prob = 127}, + {name = "air", prob = 0}, + {name = "mcl_mushrooms:mushroom_red", prob = 63}, + {name = "air", prob = 0}, + }, + }, + flags = "place_center_x", + rotation = "random", + }) + + -- Acacia tree and log + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass", "mcl_core:coarse_dirt"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"savanna"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("mcl_core").."/schematics/acacia_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.001, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"savanna"}, + y_min = 1, + y_max = 31000, + schematic = { + size = {x = 3, y = 2, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "mcl_core:acaciatree", param2 = 12, prob = 191}, + {name = "mcl_core:acaciatree", param2 = 12}, + {name = "mcl_core:acaciatree", param2 = 12, prob = 127}, + }, + }, + flags = "place_center_x", + rotation = "random", + }) + + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:sand"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.0002, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"savanna"}, + y_min = 7, + y_max = 31000, + schematic = minetest.get_modpath("mcl_core").."/schematics/acacia_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + + -- Aspen tree and log + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = -0.0015, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_min = 1, + y_max = 31000, + schematic = minetest.get_modpath("mcl_core").."/schematics/aspen_tree.mts", + flags = "place_center_x, place_center_z", + }) + + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = -0.00008, + spread = {x = 250, y = 250, z = 250}, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = {"deciduous_forest"}, + y_min = 1, + y_max = 31000, + schematic = { + size = {x = 3, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, + {name = "mcl_core:birchtree", param2 = 12}, + {name = "mcl_core:birchtree", param2 = 12}, + {name = "mcl_core:birchtree", param2 = 12, prob = 127}, + {name = "mcl_mushrooms:mushroom_red", prob = 63}, + {name = "mcl_mushrooms:mushroom_brown", prob = 63}, + {name = "air", prob = 0}, + }, + }, + flags = "place_center_x", + rotation = "random", + }) + + + --Big dark oak W.I.P. + + --TODO MAKE SCHEMATICS + + + + --Red Mushroom + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:mycelium"}, + sidelen = 80, + fill_ratio = 0.004, + biomes = {"mushroom"}, + y_min = -6000, + y_max = 31000, + decoration = "mcl_mushrooms:mushroom_red", + }) + --Brown Mushroom + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:mycelium"}, + sidelen = 80, + fill_ratio = 0.003, + biomes = {"mushroom"}, + y_min = -6000, + y_max = 31000, + decoration = "mcl_mushrooms:mushroom_brown", + }) + + --Red Mushroom + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:mycelium", "mcl_core:mycelium_snow"}, + sidelen = 80, + fill_ratio = 0.0002, + biomes = {"mushroom", "mushroom_cold"}, + y_min = -6000, + y_max = 31000, + decoration = "mcl_mushrooms:mushroom_red", + }) + + --Huge Mushroom + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:mycelium", "mcl_core:mycelium_snow"}, + sidelen = 80, + fill_ratio = 0.0004, + biomes = {"mushroom", "mushroom_cold"}, + y_min = -6000, + y_max = 31000, + schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_brown.mts", + flags = "place_center_x", + rotation = "random", + }) + + + + --Huge Brown Mushroom + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:mycelium", "mcl_core:mycelium_snow"}, + sidelen = 80, + fill_ratio = 0.002, + biomes = {"mushroom", "mushroom_cold"}, + y_min = -6000, + y_max = 31000, + schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_brown.mts", + flags = "place_center_x", + rotation = "random", + }) + + --Huge Red Mushroom + minetest.register_decoration({ + deco_type = "schematic", + place_on = { "mcl_core:dirt_with_grass"}, + sidelen = 50, + fill_ratio = 0.0002, + biomes = { "deciduous_forest"}, + y_min = -6000, + y_max = 31000, + schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_red.mts", + flags = "place_center_x", + rotation = "random", + }) + + + -- Simple 1×1×1 moss stone + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:podzol"}, + sidelen = 80, + fill_ratio = 0.004, + biomes = {"taiga"}, + y_min = 10, + y_max = 31000, + decoration = "mcl_core:mossycobble", + }) + + --Nether Decorations + --Red Mushroom + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack"}, + sidelen = 80, + fill_ratio = 0.4, + biomes = {"nether"}, + y_min = -6000, + y_max = 31000, + decoration = "mcl_mushrooms:mushroom_red", + }) + --Brown Mushroom + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack"}, + sidelen = 80, + fill_ratio = 0.3, + biomes = {"nether"}, + y_min = -6000, + y_max = 31000, + decoration = "mcl_mushrooms:mushroom_brown", + }) + + -- FIXME: Does the placement of eternal fire and nether wart actually work? + --Fire + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack"}, + sidelen = 8, + fill_ratio = 0.9, + biomes = {"nether"}, + y_min = -6000, + y_max = 31000, + decoration = "mcl_fire:eternal_fire", + }) + -- Nether Wart + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:soul_sand"}, + sidelen = 80, + fill_ratio = 0.1, + biomes = {"nether"}, + y_min = -6000, + y_max = 31000, + decoration = "mcl_nether:nether_wart", + }) + -- Cactus minetest.register_decoration({ @@ -179,12 +1546,12 @@ local function register_decorations() y_min = 5, y_max = 31000, decoration = "mcl_core:cactus", + biomes = {"desert","sandstone_desert","grassland_dunes", "coniferous_forest_dunes"}, height = 1, height_max = 3, }) - -- Papyrus - + -- Sugar canes minetest.register_decoration({ deco_type = "schematic", place_on = {"mcl_core:dirt", "mcl_core:dirt_with_grass"}, @@ -197,7 +1564,7 @@ local function register_decorations() octaves = 3, persist = 0.7 }, - biomes = {"plains", "beach", "desert"}, + biomes = {"grassland", "savanna", "beach", "desert", "savanna_swamp"}, y_min = 0, y_max = 0, decoration = "mcl_core:reeds", @@ -251,6 +1618,7 @@ if mg_name ~= "v6" and mg_name ~= "flat" then minetest.clear_registered_decorations() minetest.clear_registered_schematics() register_biomes() + register_biomelike_ores() register_decorations() elseif mg_name == "flat" then -- Implementation of Minecraft's Superflat mapgen, classic style @@ -259,3 +1627,4 @@ elseif mg_name == "flat" then minetest.clear_registered_schematics() register_classic_superflat_biome() end +-- v6 decorations are handled in mcl_mapgen_core diff --git a/mods/MISC/gt2mc2/LICENSE b/mods/MISC/gt2mc2/LICENSE new file mode 100644 index 000000000..8864d4a39 --- /dev/null +++ b/mods/MISC/gt2mc2/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mods/MISC/gt2mc2/craftitems.lua b/mods/MISC/gt2mc2/craftitems.lua new file mode 100644 index 000000000..d87be2887 --- /dev/null +++ b/mods/MISC/gt2mc2/craftitems.lua @@ -0,0 +1,317 @@ +-- mods/gt2mc/craftitems.lua + +--====================== +--default to mcl_core +--====================== +--tools +minetest.register_alias("default:stick", "mcl_core:stick") +minetest.register_alias("default:pick_wood", "mcl_tools:pick_wood") +minetest.register_alias("default:pick_stone", "mcl_tools:pick_stone") +minetest.register_alias("default:pick_steel", "mcl_tools:pick_iron") +minetest.register_alias("default:pick_gold", "mcl_tools:pick_gold") +minetest.register_alias("default:pick_mese", "mcl_tools:pick_gold") +minetest.register_alias("default:pick_diamond", "mcl_tools:pick_diamond") +minetest.register_alias("default:shovel_wood", "mcl_tools:shovel_wood") +minetest.register_alias("default:shovel_stone", "mcl_tools:shovel_stone") +minetest.register_alias("default:shovel_steel", "mcl_tools:shovel_iron") +minetest.register_alias("default:shovel_gold", "mcl_tools:shovel_gold") +minetest.register_alias("default:shovel_mese", "mcl_tools:shovel_gold") +minetest.register_alias("default:shovel_diamond", "mcl_tools:shovel_diamond") +minetest.register_alias("default:axe_wood", "mcl_tools:axe_wood") +minetest.register_alias("default:axe_stone", "mcl_tools:axe_stone") +minetest.register_alias("default:axe_steel", "mcl_tools:axe_iron") +minetest.register_alias("default:axe_gold", "mcl_tools:axe_gold") +minetest.register_alias("default:axe_diamond", "mcl_tools:axe_diamond") +minetest.register_alias("default:sword_wood", "mcl_tools:sword_wood") +minetest.register_alias("default:sword_stone", "mcl_tools:sword_stone") +minetest.register_alias("default:sword_steel", "mcl_tools:sword_iron") +minetest.register_alias("default:sword_gold", "mcl_tools:sword_gold") +minetest.register_alias("default:sword_mese", "mcl_tools:sword_gold") +minetest.register_alias("default:sword_diamond", "mcl_tools:sword_diamond") +minetest.register_alias("default:shears", "mcl_tools:shears") +minetest.register_alias("mobs:shears", "mcl_tools:shears") +--farming tools +minetest.register_alias("farming:hoe_stone", "mcl_farming:hoe_stone") +minetest.register_alias("farming:hoe_iron", "mcl_farming:hoe_iron") +minetest.register_alias("farming:hoe_steel", "mcl_farming:hoe_iron") +minetest.register_alias("farming:hoe_diamond", "mcl_farming:hoe_diamond") +minetest.register_alias("farming:hoe_gold", "mcl_farming:hoe_gold") +minetest.register_alias("farming:hoe_mese", "mcl_farming:hoe_gold") +--moredefault misc +minetest.register_alias("default:paper", "mcl_core:paper") +minetest.register_alias("mcl_books:paper", "mcl_core:paper") +minetest.register_alias("default:book", "mcl_books:book") +minetest.register_alias("default:book_written", "mcl_books:written_book") +minetest.register_alias("mcl_books:book_written", "mcl_books:written_book") +minetest.register_alias("default:bowl", "mcl_core:bowl") +minetest.register_alias("mobs:bowl", "mcl_core:bowl") +--default ores, ingots +minetest.register_alias("default:coal_lump", "mcl_core:coal_lump") +minetest.register_alias("default:charcoal", "mcl_core:charcoal") +minetest.register_alias("default:iron_lump", "mcl_core:stone_with_iron") +minetest.register_alias("default:steel_lump", "mcl_core:stone_with_iron") +minetest.register_alias("default:gold_lump", "mcl_core:stone_with_gold") +minetest.register_alias("default:steel_ingot", "mcl_core:iron_ingot") +minetest.register_alias("default:gold_ingot", "mcl_core:gold_ingot") +minetest.register_alias("mcl_core:steel_ingot", "mcl_core:iron_ingot") +minetest.register_alias("default:clay_lump", "mcl_core:clay_lump") +minetest.register_alias("default:mese_crystal_fragment", "mcl_core:iron_ingot") +minetest.register_alias("default:obsidian_shard", "mcl_core:iron_ingot") +minetest.register_alias("default:stone_with_coal", "mcl_core:stone_with_coal") +minetest.register_alias("default:iron_nugget", "mcl_core:ironnugget") +minetest.register_alias("default:gold_nugget", "mcl_core:goldnugget") +minetest.register_alias("default:mese_crystal", "mcl_core:redstone") +minetest.register_alias("mcl_core:redstone", "mesecons:redstone") +minetest.register_alias("default:emerald_crystal", "mcl_core:emerald") +minetest.register_alias("mcl_nether:quartz_crystal", "mcl_nether:quartz") +minetest.register_alias("default:quartz_crystal_piece", "mcl_nether:quartz") +minetest.register_alias("default:diamond", "mcl_core:diamond") +minetest.register_alias("default:clay_brick", "mcl_core:brick") + +--====================== +--bonemeal +--====================== +minetest.register_alias("bonemeal:bonemeal", "mcl_dye:white") +minetest.register_alias("bonemeal:bone", "mcl_mobitems:bone") + +--====================== +--armor +--====================== +minetest.register_alias("3d_armor:helmet_wood", "3d_armor:helmet_leather") +minetest.register_alias("3d_armor:chestplate_wood", "3d_armor:chestplate_leather") +minetest.register_alias("3d_armor:leggings_wood", "3d_armor:leggings_leather") +minetest.register_alias("3d_armor:boots_wood", "3d_armor:boots_leather") + +minetest.register_alias("3d_armor:helmet_bronze", "3d_armor:helmet_gold") +minetest.register_alias("3d_armor:chestplate_bronze", "3d_armor:chestplate_gold") +minetest.register_alias("3d_armor:leggings_bronze", "3d_armor:leggings_gold") +minetest.register_alias("3d_armor:boots_bronze", "3d_armor:boots_gold") + +--====================== +--Cake +--====================== +minetest.register_alias("cake:cake", "mcl_cake:cake") + +--====================== +--carts +--====================== +minetest.register_alias("carts:cart", "mcl_minecarts:minecart") + +--====================== +--clock and compass +--====================== +minetest.register_alias("clock:clock", "mcl_clock:clock") +minetest.register_alias("compass:compass", "mcl_compass:compass") + +--clocks compass +minetest.register_alias("clock:1", "mcl_clock:clock_1") +minetest.register_alias("clock:2", "mcl_clock:clock_2") +minetest.register_alias("clock:3", "mcl_clock:clock_3") +minetest.register_alias("clock:4", "mcl_clock:clock_4") +minetest.register_alias("clock:5", "mcl_clock:clock_5") +minetest.register_alias("clock:6", "mcl_clock:clock_6") +minetest.register_alias("clock:7", "mcl_clock:clock_7") +minetest.register_alias("clock:8", "mcl_clock:clock_8") +minetest.register_alias("clock:9", "mcl_clock:clock_9") +minetest.register_alias("clock:10", "mcl_clock:clock_10") +minetest.register_alias("clock:11", "mcl_clock:clock_11") +minetest.register_alias("clock:12", "mcl_clock:clock_12") +minetest.register_alias("clock:13", "mcl_clock:clock_13") +minetest.register_alias("clock:14", "mcl_clock:clock_14") +minetest.register_alias("clock:15", "mcl_clock:clock_15") +minetest.register_alias("clock:16", "mcl_clock:clock_16") +minetest.register_alias("clock:17", "mcl_clock:clock_17") +minetest.register_alias("clock:18", "mcl_clock:clock_18") +minetest.register_alias("clock:19", "mcl_clock:clock_19") +minetest.register_alias("clock:20", "mcl_clock:clock_20") +minetest.register_alias("clock:21", "mcl_clock:clock_21") +minetest.register_alias("clock:22", "mcl_clock:clock_22") +minetest.register_alias("clock:23", "mcl_clock:clock_23") +minetest.register_alias("clock:24", "mcl_clock:clock_24") +minetest.register_alias("clock:25", "mcl_clock:clock_25") +minetest.register_alias("clock:26", "mcl_clock:clock_26") +minetest.register_alias("clock:27", "mcl_clock:clock_27") +minetest.register_alias("clock:28", "mcl_clock:clock_28") +minetest.register_alias("clock:29", "mcl_clock:clock_29") +minetest.register_alias("clock:30", "mcl_clock:clock_30") +minetest.register_alias("clock:31", "mcl_clock:clock_31") +minetest.register_alias("clock:32", "mcl_clock:clock_32") +minetest.register_alias("clock:33", "mcl_clock:clock_33") +minetest.register_alias("mcl_clock:33", "mcl_clock:clock_33") +minetest.register_alias("clock:34", "mcl_clock:clock_34") +minetest.register_alias("clock:35", "mcl_clock:clock_35") +minetest.register_alias("clock:36", "mcl_clock:clock_36") +minetest.register_alias("clock:37", "mcl_clock:clock_37") +minetest.register_alias("clock:38", "mcl_clock:clock_38") +minetest.register_alias("clock:39", "mcl_clock:clock_39") +minetest.register_alias("clock:40", "mcl_clock:clock_40") + +--this is template +--minetest.register_alias("clock:57", "mcl_clock:clock_57") +-- +--minetest.register_alias("compass:0", "mcl_compass:0") +-- + + +minetest.register_alias("compass:compass", "mcl_compass:compass") +minetest.register_alias("compass:0", "mcl_compass:0") +minetest.register_alias("compass:1", "mcl_compass:1") +minetest.register_alias("compass:2", "mcl_compass:2") +minetest.register_alias("compass:3", "mcl_compass:3") +minetest.register_alias("compass:4", "mcl_compass:4") +minetest.register_alias("compass:5", "mcl_compass:5") +minetest.register_alias("compass:6", "mcl_compass:6") +minetest.register_alias("compass:7", "mcl_compass:7") +minetest.register_alias("compass:8", "mcl_compass:8") +minetest.register_alias("compass:9", "mcl_compass:9") +minetest.register_alias("compass:10", "mcl_compass:10") +minetest.register_alias("compass:11", "mcl_compass:11") +minetest.register_alias("compass:12", "mcl_compass:12") +minetest.register_alias("compass:13", "mcl_compass:13") +minetest.register_alias("compass:14", "mcl_compass:14") +minetest.register_alias("compass:15", "mcl_compass:15") +minetest.register_alias("compass:16", "mcl_compass:16") +minetest.register_alias("compass:17", "mcl_compass:17") +minetest.register_alias("compass:18", "mcl_compass:18") +minetest.register_alias("compass:19", "mcl_compass:19") +minetest.register_alias("compass:20", "mcl_compass:20") +minetest.register_alias("compass:21", "mcl_compass:17") +minetest.register_alias("compass:22", "mcl_compass:17") +minetest.register_alias("compass:23", "mcl_compass:17") +minetest.register_alias("compass:24", "mcl_compass:17") +minetest.register_alias("compass:25", "mcl_compass:17") +minetest.register_alias("compass:26", "mcl_compass:17") +minetest.register_alias("compass:27", "mcl_compass:17") +minetest.register_alias("compass:28", "mcl_compass:17") +minetest.register_alias("compass:29", "mcl_compass:29") +minetest.register_alias("compass:30", "mcl_compass:30") +minetest.register_alias("compass:31", "mcl_compass:31") +minetest.register_alias("compass:32", "mcl_compass:32") +minetest.register_alias("compass:33", "mcl_compass:33") + + +--====================== +--dye +--====================== +minetest.register_alias("dye:white", "mcl_dye:white") +minetest.register_alias("dye:brown", "mcl_dye:brown") +minetest.register_alias("dye:dark_grey", "mcl_dye:dark_grey") +minetest.register_alias("dye:lightblue", "mcl_dye:lightblue") +minetest.register_alias("dye:grey", "mcl_dye:grey") +minetest.register_alias("dye:green", "mcl_dye:green") +minetest.register_alias("dye:magenta", "mcl_dye:magenta") +minetest.register_alias("dye:pink", "mcl_dye:pink") +minetest.register_alias("dye:cyan", "mcl_dye:cyan") +minetest.register_alias("dye:violet", "mcl_dye:violet") +minetest.register_alias("dye:orange", "mcl_dye:orange") +minetest.register_alias("dye:yellow", "mcl_dye:yellow") +minetest.register_alias("dye:red", "mcl_dye:red") +minetest.register_alias("dye:black", "mcl_dye:black") +minetest.register_alias("dye:blue", "mcl_dye:blue") +minetest.register_alias("dye:dark_green", "mcl_dye:dark_green") + +--====================== +--farorb +--====================== +minetest.register_alias("farorb:farorb", "mcl_end:ender_eye") + +--====================== +--flintsteel +--====================== +minetest.register_alias("default:flint_and_steel", "mcl_fire:flint_and_steel") +minetest.register_alias("default:flint", "mcl_fire:flint") +minetest.register_alias("mcl_fire:flint", "mcl_core:flint") + +--====================== +--fishing +--====================== +minetest.register_alias("fishing:fish_raw", "mcl_fishing:fish_raw") +minetest.register_alias("fishing:fish_cooked", "mcl_fishing:fish_raw") +minetest.register_alias("fishing:sushi", "mcl_fishing:fish_raw") +minetest.register_alias("fishing:salmon_raw", "mcl_fishing:salmon_raw") +minetest.register_alias("fishing:salmon_cooked", "mcl_fishing:salmon_cooked") +minetest.register_alias("fishing:clownfish_raw", "mcl_fishing:clownfish_raw") +minetest.register_alias("fishing:bluewhite_raw", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:exoticfish_raw", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:carp_raw", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:perch_raw", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:carp_raw", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:catfish_raw", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:shark_raw", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:pike_raw", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:pike_cooked", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:shark_cooked", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:shark_raw", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:shark_raw", "mcl_fishing:pufferfish_raw") +minetest.register_alias("fishing:pole_wood", "mcl_fishing:fishing_rod") +minetest.register_alias("fishing:pole_perfect", "mcl_fishing:fishing_rod") +minetest.register_alias("fishing:bait_worm", "mcl_fishing:fishing_rod") +minetest.register_alias("fishing:bait_corn", "mcl_fishing:fishing_rod") +minetest.register_alias("fishing:bait_bread", "mcl_fishing:fishing_rod") +minetest.register_alias("fishing:baitball", "mcl_fishing:fishing_rod") +minetest.register_alias("fishing:baitball_shark", "mcl_fishing:fishing_rod") + +--====================== +--GoldenApple +--====================== +minetest.register_alias("golden_apple:golden_apple", "mcl_core:apple_gold") +minetest.register_alias("default:golden_apple", "mcl_core:apple_gold") + +--====================== +--MC2 jukebox +--====================== +minetest.register_alias("jdukebox:box", "mcl_jukebox:jukebox") +minetest.register_alias("jdukebox:disc_1", "mcl_jukebox:record_1") +minetest.register_alias("jdukebox:disc_2", "mcl_jukebox:record_2") +minetest.register_alias("jdukebox:disc_3", "mcl_jukebox:record_3") +minetest.register_alias("jdukebox:disc_4", "mcl_jukebox:record_4") +minetest.register_alias("jdukebox:disc_5", "mcl_jukebox:record_5") +minetest.register_alias("jdukebox:disc_6", "mcl_jukebox:record_6") +minetest.register_alias("jdukebox:disc_7", "mcl_jukebox:record_7") +minetest.register_alias("jdukebox:disc_8", "mcl_jukebox:record_8") + + + +--====================== +--hoppers +--====================== +minetest.register_alias("hoppers:hopper", "mcl_hoppers:hopper") +minetest.register_alias("hoppers:hopper_side", "mcl_hoppers:hopper_side") + +--====================== +--MC2 boats +--====================== +minetest.register_alias("boats:boat", "mcl_boats:boat_spruce") +minetest.register_alias("boats:boat_oak", "mcl_boats:boat_oak") +minetest.register_alias("boats:boat_spruce", "mcl_boats:boat_spruce") +minetest.register_alias("boats:boat_birch", "mcl_boats:boat_birch") +minetest.register_alias("boats:boat_jungle", "mcl_boats:boat_jungle") +minetest.register_alias("boats:boat_acacia", "mcl_boats:boat_acacia") +minetest.register_alias("boats:boat_dark_oak", "mcl_boats:boat_dark_oak") + +--====================== +--screwdriver +--====================== +minetest.register_alias("screwdriver:screwdriver", "mcl_core:bowl") + + +--====================== +--tnt +--====================== +minetest.register_alias("tnt:tnt", "mcl_tnt:tnt") +minetest.register_alias("tnt:gunpowder", "mcl_tnt:tnt") + +--====================== +--vessels +--====================== +minetest.register_alias("vessels:shelf", "mcl_core:bowl") +minetest.register_alias("vessels:glass_bottle", "bucket:bucket_empty") +minetest.register_alias("vessels:drinking_glass", "bucket:bucket_empty") +minetest.register_alias("vessels:steel_bottle", "bucket:bucket_empty") +minetest.register_alias("vessels:glass_fragments", "bucket:bucket_empty") + +--====================== +--xdecor +--====================== +minetest.register_alias("xdecor:hammer", "bucket:bucket_empty") + diff --git a/mods/MISC/gt2mc2/depends.txt b/mods/MISC/gt2mc2/depends.txt new file mode 100644 index 000000000..c7458965e --- /dev/null +++ b/mods/MISC/gt2mc2/depends.txt @@ -0,0 +1,2 @@ +mobs? + diff --git a/mods/MISC/gt2mc2/enchanted.lua b/mods/MISC/gt2mc2/enchanted.lua new file mode 100644 index 000000000..c6e232d90 --- /dev/null +++ b/mods/MISC/gt2mc2/enchanted.lua @@ -0,0 +1,55 @@ + + +minetest.register_alias("xdecor:enchantment_table", "mcl_enchanting:enchantment_table") +minetest.register_alias("xdecor:book_open", "mcl_enchanting:book_open") +mobs:alias_mob("xdecor:book_open", "mcl_enchanting:book_open") + + + + +-- mods/gt2mc/init.lua + +-- axe = {enchants = "durable, fast"}, +-- pick = {enchants = "durable, fast"}, +-- shovel = {enchants = "durable, fast"}, +-- sword = {enchants = "sharp"} + + +minetest.register_alias("default:pick_stone", "mcl_tools:pick_stone") +minetest.register_alias("default:pick_steel", "mcl_tools:pick_iron") +minetest.register_alias("default:pick_gold", "mcl_tools:pick_gold") +minetest.register_alias("default:pick_mese", "mcl_tools:pick_gold") + + + +minetest.register_alias("default:enchanted_pick_diamond_durable", "mcl_tools:enchanted_pick_diamond_durable") +minetest.register_alias("default:enchanted_pick_diamond_fast", "mcl_tools:enchanted_pick_diamond_fast") + +minetest.register_alias("default:shovel_stone", "mcl_tools:shovel_stone") +minetest.register_alias("default:shovel_steel", "mcl_tools:shovel_iron") +minetest.register_alias("default:shovel_gold", "mcl_tools:shovel_gold") +minetest.register_alias("default:shovel_mese", "mcl_tools:shovel_gold") + + + +minetest.register_alias("default:enchanted_shovel_diamond_durable", "mcl_tools:enchanted_shovel_diamond_durable") +minetest.register_alias("default:enchanted_shovel_diamond_fast", "mcl_tools:enchanted_shovel_diamond_fast") + +minetest.register_alias("default:axe_stone", "mcl_tools:axe_stone") +minetest.register_alias("default:axe_steel", "mcl_tools:axe_iron") +minetest.register_alias("default:axe_gold", "mcl_tools:axe_gold") + + + +minetest.register_alias("default:enchanted_axe_diamond_durable", "mcl_tools:enchanted_axe_diamond_durable") +minetest.register_alias("default:enchanted_axe_diamond_fast", "mcl_tools:enchanted_axe_diamond_fast") + +minetest.register_alias("default:sword_stone", "mcl_tools:sword_stone") +minetest.register_alias("default:sword_steel", "mcl_tools:sword_iron") +minetest.register_alias("default:sword_gold", "mcl_tools:sword_gold") +minetest.register_alias("default:sword_mese", "mcl_tools:sword_gold") + + + +minetest.register_alias("default:enchanted_sword_diamond_sharp", "mcl_tools:enchanted_sword_diamond_sharp") + diff --git a/mods/MISC/gt2mc2/init.lua b/mods/MISC/gt2mc2/init.lua new file mode 100644 index 000000000..c120277e0 --- /dev/null +++ b/mods/MISC/gt2mc2/init.lua @@ -0,0 +1,792 @@ +-- mods/gt2mc/init.lua + +dofile(minetest.get_modpath("gt2mc2").."/craftitems.lua") +dofile(minetest.get_modpath("gt2mc2").."/enchanted.lua") +dofile(minetest.get_modpath("gt2mc2").."/mob_items.lua") + +--====================== +--MC2 beds +--====================== +minetest.register_alias("beds:fancy_bed", "beds:bed") +minetest.register_alias("beds:simple_bed", "beds:bed") + +--====================== +--MC2 colorblocks +--====================== +minetest.register_alias("hardenedclay:hardened_clay_red", "mcl_colorblocks:hardened_clay_red") +minetest.register_alias("hardenedclay:hardened_clay_yellow", "mcl_colorblocks:hardened_clay_yellow") +minetest.register_alias("hardenedclay:hardened_clay_orange", "mcl_colorblocks:hardened_clay_orange") +minetest.register_alias("hardenedclay:hardened_clay_brown", "mcl_colorblocks:hardened_clay_brown") +minetest.register_alias("hardenedclay:hardened_clay_blue", "mcl_colorblocks:hardened_clay_blue") +minetest.register_alias("hardenedclay:hardened_clay_light_blue", "mcl_colorblocks:hardened_clay_light_blue") +minetest.register_alias("hardenedclay:hardened_clay_cyan", "mcl_colorblocks:hardened_clay_cyan") +minetest.register_alias("hardenedclay:hardened_clay_pink", "mcl_colorblocks:hardened_clay_pink") +minetest.register_alias("hardenedclay:hardened_clay_magenta", "mcl_colorblocks:hardened_clay_magenta") +minetest.register_alias("hardenedclay:hardened_clay_purple", "mcl_colorblocks:hardened_clay_purple") +minetest.register_alias("hardenedclay:hardened_clay_green", "mcl_colorblocks:hardened_clay_green") +minetest.register_alias("hardenedclay:hardened_clay_dark_green", "mcl_colorblocks:hardened_clay_dark_green") +minetest.register_alias("hardenedclay:hardened_clay_white", "mcl_colorblocks:hardened_clay_white") +minetest.register_alias("hardenedclay:hardened_clay_gray", "mcl_colorblocks:hardened_clay_grey") +minetest.register_alias("hardenedclay:hardened_clay_light_gray", "mcl_colorblocks:hardened_clay_grey") +minetest.register_alias("hardenedclay:hardened_clay_dark_gray", "mcl_colorblocks:hardened_clay_dark_grey") +minetest.register_alias("hardenedclay:hardened_clay_black", "mcl_colorblocks:hardened_clay_black") + +--====================== +--carpet3d +--====================== +minetest.register_alias("carpet3d:white", "mcl_wool:white_carpet") +minetest.register_alias("carpet3d:grey", "mcl_wool:grey_carpet") +minetest.register_alias("carpet3d:silver", "mcl_wool:silver_carpet") +minetest.register_alias("carpet3d:black", "mcl_wool:black_carpet") +minetest.register_alias("carpet3d:red", "mcl_wool:red_carpet") +minetest.register_alias("carpet3d:yellow", "mcl_wool:yellow_carpet") +minetest.register_alias("carpet3d:green", "mcl_wool:green_carpet") +minetest.register_alias("carpet3d:cyan", "mcl_wool:cyan_carpet") +minetest.register_alias("carpet3d:blue", "mcl_wool:blue_carpet") +minetest.register_alias("carpet3d:magenta", "mcl_wool:magenta_carpet") +minetest.register_alias("carpet3d:orange", "mcl_wool:orange_carpet") +minetest.register_alias("carpet3d:purple", "mcl_wool:purple_carpet") +minetest.register_alias("carpet3d:brown", "mcl_wool:brown_carpet") +minetest.register_alias("carpet3d:pink", "mcl_wool:pink_carpet") +minetest.register_alias("carpet3d:lime", "mcl_wool:lime_carpet") +minetest.register_alias("carpet3d:light_blue", "mcl_wool:light_blue_carpet") +minetest.register_alias("carpet3d:dark_grey", "mcl_wool:dark_grey_carpet") +minetest.register_alias("carpet3d:dark_green", "mcl_wool:dark_green_carpet") + +--====================== +--carts +--====================== +minetest.register_alias("carts:rail", "mcl_minecarts:rail") +minetest.register_alias("carts:powerrail", "mcl_minecarts:golden_rail") +minetest.register_alias("carts:brakerail", "mcl_minecarts:rail") + +--====================== +--default to mcl_core +--====================== +minetest.register_alias("default:stone", "mcl_core:stone") +minetest.register_alias("default:savannastone", "mcl_core:stone") +minetest.register_alias("default:desert_stone", "mcl_core:redsandstone") +minetest.register_alias("default:granite", "mcl_core:granite") +minetest.register_alias("default:granite_smooth", "mcl_core:granite_smooth") +minetest.register_alias("default:diorite", "mcl_core:diorite") +minetest.register_alias("default:diorite_smooth", "mcl_core:diorite_smooth") +minetest.register_alias("default:andesite", "mcl_core:andesite") +minetest.register_alias("default:andesite_smooth", "mcl_core:andesite_smooth") + + +minetest.register_alias("default:stone_with_coal", "mcl_core:stone_with_coal") +minetest.register_alias("default:desert_stone_with_coal", "mcl_core:stone_with_coal") +minetest.register_alias("default:stone_with_iron", "mcl_core:stone_with_iron") +minetest.register_alias("default:desert_stone_with_iron", "mcl_core:stone_with_iron") +minetest.register_alias("default:stone_with_gold", "mcl_core:stone_with_gold") +minetest.register_alias("default:desert_stone_with_gold", "mcl_core:stone_with_gold") +minetest.register_alias("default:stone_with_diamond", "mcl_core:stone_with_diamond") +minetest.register_alias("default:stone_with_emerald", "mcl_core:stone_with_emerald") +minetest.register_alias("default:sand_with_diamond", "mcl_core:stone_with_diamond") +minetest.register_alias("default:rack_with_diamond", "mcl_core:stone_with_diamond") +minetest.register_alias("default:stone_with_mese", "mcl_core:stone_with_redstone") +minetest.register_alias("mcl_core:stone_with_mese", "mcl_core:stone_with_redstone") + + +minetest.register_alias("default:dirt_with_grass", "mcl_core:dirt_with_grass") +minetest.register_alias("default:dirt_with_dry_grass", "mcl_core:coarse_dirt") +minetest.register_alias("default:grass_path", "mcl_core:grass_path") +minetest.register_alias("default:dirt_with_snow", "mcl_core:dirt_with_grass_snow") +minetest.register_alias("default:dirt_with_grass_footsteps", "mcl_core:dirt_with_grass_footsteps") +minetest.register_alias("default:podzol", "mcl_core:podzol") +minetest.register_alias("default:dirt_with_rainforest_litter", "mcl_core:podzol") +minetest.register_alias("default:mycelium", "mcl_core:mycelium") +minetest.register_alias("default:mycelium_snow", "mcl_core:mycelium_snow") +minetest.register_alias("default:dirt", "mcl_core:dirt") +minetest.register_alias("default:coarse_dirt", "mcl_core:coarse_dirt") + +minetest.register_alias("default:sand", "mcl_core:sand") +minetest.register_alias("default:sandstone", "mcl_core:sandstone") +minetest.register_alias("default:sandstone_block", "mcl_core:sandstonesmooth") +minetest.register_alias("default:sandstonebrick", "mcl_core:sandstonecarved") +minetest.register_alias("default:desert_sand", "mcl_core:redsand") +minetest.register_alias("default:desertsandstone", "mcl_core:redsandstone") +minetest.register_alias("default:desert_stone_block", "mcl_core:redsandstonesmooth") +minetest.register_alias("default:desert_stonebrick", "mcl_core:redsandstonecarved") + +minetest.register_alias("default:gravel", "mcl_core:gravel") +minetest.register_alias("default:clay", "mcl_core:clay") +minetest.register_alias("default:brick", "mcl_core:brick_block") +minetest.register_alias("default:fossil", "mcl_core:bone_block") +minetest.register_alias("default:coalblock", "mcl_core:coalblock") + +minetest.register_alias("default:stonebrick", "mcl_core:stonebrick") +minetest.register_alias("default:stone_block", "mcl_core:stonebrickcarved") +minetest.register_alias("default:stonebrickcarved", "mcl_core:stonebrickcarved") +minetest.register_alias("default:stonebrickcracked", "mcl_core:stonebrickcracked") + + +minetest.register_alias("default:obsidian", "mcl_core:obsidian") +minetest.register_alias("default:obsidianbrick", "mcl_nether:nether_brick") +minetest.register_alias("default:obsidianblock", "mcl_nether:nether_brick") + +minetest.register_alias("default:bush_leaves", "mcl_core:leaves") +minetest.register_alias("default:bush_stem", "mcl_core:tree") +minetest.register_alias("default:bush_sapling", "mcl_core:sapling") +minetest.register_alias("default:bush_acacia_leaves", "mcl_core:acacialeaves") +minetest.register_alias("default:acacia_bush_leaves", "mcl_core:acacialeaves") +minetest.register_alias("default:bush_acacia_stem", "mcl_core:acaciatree") +minetest.register_alias("default:acacia_bush_stem", "mcl_core:acaciatree") +minetest.register_alias("default:bush_acacia_sapling", "mcl_core:acaciasapling") + +minetest.register_alias("default:tree", "mcl_core:tree") +minetest.register_alias("default:jungletree", "mcl_core:jungletree") +minetest.register_alias("default:aspen_tree", "mcl_core:birchtree") +--minetest.register_alias("default:acacia_tree", "mcl_core:acaciatree") +minetest.register_alias("default:pine_tree", "mcl_core:sprucetree") + +minetest.register_alias("default:wood", "mcl_core:wood") +minetest.register_alias("default:junglewood", "mcl_core:junglewood") +minetest.register_alias("default:aspen_wood", "mcl_core:birchwood") +minetest.register_alias("default:acacia_wood", "mcl_core:acaciawood") +minetest.register_alias("default:pine_wood", "mcl_core:sprucewood") + +minetest.register_alias("default:leaves", "mcl_core:leaves") +minetest.register_alias("default:jungleleaves", "mcl_core:jungleleaves") +minetest.register_alias("default:aspen_leaves", "mcl_core:birchleaves") +--minetest.register_alias("default:acacia_leaves", "mcl_core:acacialeaves") +minetest.register_alias("default:pine_needles", "mcl_core:spruceleaves") + +minetest.register_alias("default:sapling", "mcl_core:sapling") +minetest.register_alias("default:junglesapling", "mcl_core:junglesapling") +minetest.register_alias("default:aspen_sapling", "mcl_core:birchsapling") +minetest.register_alias("default:acacia_sapling", "mcl_core:acaciasapling") +minetest.register_alias("default:pine_sapling", "mcl_core:sprucesapling") + +minetest.register_alias("default:junglegrass", "mcl_flowers:fern") +minetest.register_alias("default:grass", "mcl_flowers:tallgrass") +minetest.register_alias("default:grass_1", "mcl_flowers:tallgrass") +minetest.register_alias("default:grass_2", "mcl_flowers:tallgrass") +minetest.register_alias("default:grass_3", "mcl_flowers:tallgrass") +minetest.register_alias("default:grass_4", "mcl_flowers:tallgrass") +minetest.register_alias("default:grass_5", "mcl_flowers:tallgrass") +minetest.register_alias("default:dry_grass", "mcl_flowers:tallgrass") +minetest.register_alias("default:dry_grass_1", "mcl_flowers:tallgrass") +minetest.register_alias("default:dry_grass_2", "mcl_flowers:tallgrass") +minetest.register_alias("default:dry_grass_3", "mcl_flowers:tallgrass") +minetest.register_alias("default:dry_grass_4", "mcl_flowers:tallgrass") +minetest.register_alias("default:dry_grass_5", "mcl_flowers:tallgrass") + + +minetest.register_alias("default:cactus", "mcl_core:cactus") +minetest.register_alias("default:dry_shrub", "mcl_core:deadbush") +minetest.register_alias("default:papyrus", "mcl_core:reeds") + +minetest.register_alias("default:bookshelf", "mcl_books:bookshelf") +minetest.register_alias("default:glass", "mcl_core:glass") +minetest.register_alias("default:obsidian_glass", "mcl_core:glass") + +minetest.register_alias("default:ladder_wood", "mcl_core:ladder") +minetest.register_alias("default:ladder", "mcl_core:ladder") +minetest.register_alias("default:wood", "mcl_core:wood") +minetest.register_alias("default:mese", "mcl_core:redstone_block") +minetest.register_alias("default:cloud", "mcl_core:cloud") +minetest.register_alias("default:void", "mcl_core:void") +minetest.register_alias("default:dummy", "mcl_core:void") +minetest.register_alias("default:bedrock", "mcl_core:bedrock") +minetest.register_alias("default:water_flowing", "mcl_core:water_flowing") +minetest.register_alias("default:water_source", "mcl_core:water_source") +minetest.register_alias("default:river_water_flowing", "mcl_core:water_flowing") +minetest.register_alias("default:river_water_source", "mcl_core:water_source") +minetest.register_alias("default:lava_flowing", "mcl_core:lava_flowing") +minetest.register_alias("default:lava_source", "mcl_core:lava_source") +minetest.register_alias("default:torch", "mcl_core:torch") +minetest.register_alias("default:sign_wall", "mcl_signs:wall_sign") +minetest.register_alias("default:sign_wall_wood", "mcl_signs:wall_sign") + +minetest.register_alias("default:furnace", "mcl_core:furnace") +minetest.register_alias("bones:bones", "mcl_chests:chest") +minetest.register_alias("default:chest", "mcl_chests:chest") +minetest.register_alias("default:locked_chest", "mcl_chests:chest") +minetest.register_alias("default:cobble", "mcl_core:cobble") +minetest.register_alias("default:mossycobble", "mcl_core:mossycobble") +minetest.register_alias("default:stonebrickmossy", "mcl_core:stonebrickmossy") +minetest.register_alias("default:desert_cobble", "mcl_core:mossycobble") + +minetest.register_alias("default:steelblock", "mcl_core:ironblock") +minetest.register_alias("default:goldblock", "mcl_core:goldblock") +minetest.register_alias("default:diamondblock", "mcl_core:diamondblock") +minetest.register_alias("default:emeraldblock", "mcl_core:emeraldblock") +minetest.register_alias("default:meselamp", "mcl_nether:glowstone") +minetest.register_alias("default:meselamp", "mcl_nether:glowstone") +minetest.register_alias("default:mese", "mesecons_torch:redstoneblock") + +minetest.register_alias("default:coral_brown", "mcl_core:coalblock") +minetest.register_alias("default:coral_orange", "mcl_core:coalblock") +minetest.register_alias("default:coral_skeleton", "mcl_core:coalblock") + + + +minetest.register_alias("default:nyancat", "mcl_core:nyancat") +minetest.register_alias("default:nyancat_rainbow", "mcl_core:nyancat_rainbow") +minetest.register_alias("default:apple", "mcl_flowers:tallgrass") --did this to fix map + + + + +minetest.register_alias("default:torch", "mcl_torches:torch") +minetest.register_alias("torches:torch", "mcl_torches:torch") +minetest.register_alias("default:torch_wall", "mcl_torches:torch_wall") +minetest.register_alias("torches:wall", "mcl_torches:torch") +minetest.register_alias("default:torch_floor", "mcl_torches:torch_floor") +minetest.register_alias("torches:floor", "mcl_torches:torch") +minetest.register_alias("default:torch_ceiling", "mcl_torches:torch") +minetest.register_alias("torches:ceiling", "mcl_torches:torch") + + +minetest.register_alias("default:furnace", "mcl_furnaces:furnace") +minetest.register_alias("default:furnace_active", "mcl_furnaces:furnace_active") + + +minetest.register_alias("default:snow", "mcl_core:snow") +minetest.register_alias("default:snowblock", "mcl_core:snowblock") +minetest.register_alias("default:ice", "mcl_core:ice") + +-- Aliases for corrected pine node names +minetest.register_alias("default:pinetree", "mcl_core:sprucetree") +minetest.register_alias("default:pinewood", "mcl_core:sprucewood") + +minetest.register_alias("default:sign_wall", "mcl_core:sign_wall_wood") +minetest.register_alias("default:fence_wood", "mcl_fences:fence") +minetest.register_alias("default:fence_oak_wood", "mcl_fences:dark_oak_fence") +minetest.register_alias("default:fence_pine_wood", "mcl_fences:spruce_fence") +minetest.register_alias("default:fence_aspen_wood", "mcl_fences:birch_fence") +minetest.register_alias("default:fence_acacia_wood", "mcl_fences:acacia_fence") +minetest.register_alias("default:fence_junglewood", "mcl_fences:jungle_fence") + +--====================== +--door +--====================== +minetest.register_alias("doors:door_wood", "mcl_doors:dark_oak_door") +minetest.register_alias("doors:trapdoor_wood", "mcl_doors:dark_oak_door") +minetest.register_alias("doors:trapdoor_steel", "mcl_doors:dark_oak_door") +minetest.register_alias("doors:hidden", "air") +--minetest.register_alias("doors:hidden", "mcl_doors:dark_oak_door_t_1") +minetest.register_alias("doors:door_wood_a", "mcl_doors:dark_oak_door_b_1") +minetest.register_alias("doors:door_wood_a_2", "mcl_doors:dark_oak_door_b_1") +minetest.register_alias("doors:door_wood_b", "mcl_doors:dark_oak_door_b_2") + +--old style +minetest.register_alias("doors:door_wood_b_1", "mcl_doors:dark_oak_door_b_1") +minetest.register_alias("doors:door_wood_b_2", "mcl_doors:dark_oak_door_b_2") +minetest.register_alias("doors:door_wood_t_1", "mcl_doors:dark_oak_door_t_1") +minetest.register_alias("doors:door_wood_t_2", "mcl_doors:dark_oak_door_t_2") + +minetest.register_alias("doors:door_steel_b", "mcl_doors:iron_door_b_1") +minetest.register_alias("doors:door_steel_b_1", "mcl_doors:iron_door_b_1") +minetest.register_alias("doors:door_steel_b_2", "mcl_doors:iron_door_b_2") +minetest.register_alias("doors:door_steel_a", "mcl_doors:iron_door_t_1") +minetest.register_alias("doors:door_steel_t_1", "mcl_doors:iron_door_t_1") +minetest.register_alias("doors:door_steel_t_2", "mcl_doors:iron_door_t_2") + + +--====================== +--farming oh boy... +--====================== +--tomato +minetest.register_alias("farming:tomato", "farming:carrot") +minetest.register_alias("farming:tomato_1", "mcl_flowers:tallgrass") +minetest.register_alias("farming:tomato_2", "mcl_flowers:tallgrass") +minetest.register_alias("farming:tomato_3", "mcl_flowers:tallgrass") +minetest.register_alias("farming:tomato_4", "mcl_flowers:tallgrass") +minetest.register_alias("farming:tomato_5", "mcl_flowers:tallgrass") +minetest.register_alias("farming:tomato_6", "mcl_flowers:tallgrass") +minetest.register_alias("farming:tomato_7", "mcl_flowers:tallgrass") +minetest.register_alias("farming:tomato_8", "mcl_farming:melon") + +--cucumber +minetest.register_alias("farming:cucumber", "farming:carrot") +minetest.register_alias("farming:cucumber_1", "mcl_flowers:tallgrass") +minetest.register_alias("farming:cucumber_2", "mcl_flowers:tallgrass") +minetest.register_alias("farming:cucumber_3", "mcl_flowers:tallgrass") +minetest.register_alias("farming:cucumber_4", "mcl_flowers:tallgrass") + +--raspberry +minetest.register_alias("farming:raspberries", "farming:carrot") +minetest.register_alias("farming:smoothie_raspberry", "mcl_flowers:tallgrass") +minetest.register_alias("farming:raspberry_1", "mcl_flowers:tallgrass") +minetest.register_alias("farming:raspberry_2", "mcl_flowers:tallgrass") +minetest.register_alias("farming:raspberry_3", "mcl_flowers:tallgrass") +minetest.register_alias("farming:raspberry_4", "mcl_flowers:tallgrass") + +--blueberry +minetest.register_alias("farming:blueberries", "farming:carrot") +minetest.register_alias("farming:muffin_blueberry", "farming:bread") +minetest.register_alias("farming:blueberry_1", "mcl_flowers:tallgrass") +minetest.register_alias("farming:blueberry_2", "mcl_flowers:tallgrass") +minetest.register_alias("farming:blueberry_3", "mcl_flowers:tallgrass") +minetest.register_alias("farming:blueberry_4", "mcl_flowers:tallgrass") + +--rhubarb +minetest.register_alias("farming:rhubarb", "mcl_flowers:tallgrass") +minetest.register_alias("farming:rhubarb_pie", "mcl_flowers:tallgrass") +minetest.register_alias("farming:rhubarb_1", "mcl_flowers:tallgrass") +minetest.register_alias("farming:rhubarb_2", "mcl_flowers:tallgrass") +minetest.register_alias("farming:rhubarb_3", "mcl_flowers:tallgrass") + +--beans +minetest.register_alias("farming:beanpole", "mcl_flowers:tallgrass") +minetest.register_alias("farming:beans", "farming:carrot") +minetest.register_alias("farming:beanbush", "mcl_flowers:tallgrass") +minetest.register_alias("farming:beanpole_1", "mcl_flowers:tallgrass") +minetest.register_alias("farming:beanpole_2", "mcl_flowers:tallgrass") +minetest.register_alias("farming:beanpole_3", "mcl_flowers:tallgrass") +minetest.register_alias("farming:beanpole_4", "mcl_flowers:tallgrass") +minetest.register_alias("farming:beanpole_5", "mcl_flowers:tallgrass") + +--grapes +minetest.register_alias("farming:grapes", "mcl_farming:carrot") +minetest.register_alias("farming:trellis", "mcl_flowers:tallgrass") +minetest.register_alias("farming:grapebush", "mcl_flowers:tallgrass") +minetest.register_alias("farming:grapes_1", "mcl_flowers:tallgrass") +minetest.register_alias("farming:grapes_2", "mcl_flowers:tallgrass") +minetest.register_alias("farming:grapes_3", "mcl_flowers:tallgrass") +minetest.register_alias("farming:grapes_4", "mcl_flowers:tallgrass") +minetest.register_alias("farming:grapes_5", "mcl_flowers:tallgrass") +minetest.register_alias("farming:grapes_6", "mcl_flowers:tallgrass") +minetest.register_alias("farming:grapes_7", "mcl_flowers:tallgrass") +minetest.register_alias("farming:grapes_8", "mcl_flowers:tallgrass") + +--barley +minetest.register_alias("farming:barley", "mcl_flowers:tallgrass") +minetest.register_alias("farming:barley_1", "mcl_farming:hay_block") +minetest.register_alias("farming:barley_2", "mcl_farming:hay_block") +minetest.register_alias("farming:barley_3", "mcl_flowers:tallgrass") +minetest.register_alias("farming:barley_4", "mcl_flowers:tallgrass") +minetest.register_alias("farming:barley_5", "mcl_flowers:tallgrass") +minetest.register_alias("farming:barley_6", "mcl_flowers:tallgrass") +minetest.register_alias("farming:barley_7", "mcl_flowers:tallgrass") +minetest.register_alias("farming:seed_barley", "mcl_farming:hay_block") + +--coffee +minetest.register_alias("farming:coffee", "mcl_farming:carrot") +minetest.register_alias("farming:coffee_cup_hot", "mcl_farming:carrot") +minetest.register_alias("farming:coffee_cup", "mcl_farming:carrot") +minetest.register_alias("farming:drinking_cup", "mcl_farming:carrot") +minetest.register_alias("farming:coffee_beans", "mcl_farming:carrot") +minetest.register_alias("farming:coffee_1", "mcl_flowers:tallgrass") +minetest.register_alias("farming:coffee_2", "mcl_flowers:tallgrass") +minetest.register_alias("farming:coffee_3", "mcl_flowers:tallgrass") +minetest.register_alias("farming:coffee_4", "mcl_flowers:tallgrass") +minetest.register_alias("farming:coffee_5", "mcl_flowers:tallgrass") + +--FARMING EXISTING +minetest.register_alias("farming:soil", "mcl_farming:soil") +minetest.register_alias("farming:soil_wet", "mcl_farming:soil_wet") + + +minetest.register_alias("farming:pumpkin", "mcl_farming:pumpkin_7") +minetest.register_alias("farming:pumpkin_slice", "mcl_farming:melon_slice") +minetest.register_alias("farming:pumpkin_1", "mcl_farming:pumpkin_7") +minetest.register_alias("farming:pumpkin_2", "mcl_farming:pumpkin_7") +minetest.register_alias("farming:pumpkin_3", "mcl_farming:pumpkin_7") +minetest.register_alias("farming:pumpkin_4", "mcl_farming:pumpkin_7") +minetest.register_alias("farming:pumpkin_5", "mcl_farming:pumpkin_7") +minetest.register_alias("farming:pumpkin_6", "mcl_farming:pumpkin_7") +minetest.register_alias("farming:pumpkin_7", "mcl_farming:pumpkin_7") +minetest.register_alias("farming:pumpkin_8", "mcl_farming:pumpkin_7") + + +minetest.register_alias("farming:cocoa", "mcl_cocoas:cocoa") +minetest.register_alias("mcl_cocoas:cocoa", "mcl_dye:brown") +minetest.register_alias("farming:cocoa_beans", "mcl_dye:brown") +minetest.register_alias("farming:cocoa_1", "mcl_cocoas:cocoa_1") +minetest.register_alias("farming:cocoa_2", "mcl_cocoas:cocoa_2") +minetest.register_alias("farming:cocoa_3", "mcl_cocoas:cocoa_3") +minetest.register_alias("farming:cookie", "mcl_farming:carrot") + +minetest.register_alias("farming:melon", "mcl_farming:melon") +minetest.register_alias("farming:melon_slice", "mcl_farming:melon_slice") +minetest.register_alias("mcl_farming:melon_slice", "mcl_farming:melon") +minetest.register_alias("farming:melon_1", "mcl_farming:melontige_7") +minetest.register_alias("farming:melon_2", "mcl_farming:melontige_7") +minetest.register_alias("farming:melon_3", "mcl_farming:melontige_7") +minetest.register_alias("farming:melon_4", "mcl_farming:melontige_7") +minetest.register_alias("farming:melon_5", "mcl_farming:melontige_7") +minetest.register_alias("farming:melon_6", "mcl_farming:melontige_7") +minetest.register_alias("farming:melon_7", "mcl_farming:melontige_7") +minetest.register_alias("farming:melon_8", "mcl_farming:melontige_7") + +minetest.register_alias("farming:potato", "mcl_farming:potato") +minetest.register_alias("farming:potato_1", "mcl_farming:potato") +minetest.register_alias("farming:potato_2", "mcl_farming:potato") +minetest.register_alias("farming:potato_3", "mcl_farming:potato") +minetest.register_alias("farming:potato_4", "mcl_farming:potato") +minetest.register_alias("farming:potato_5", "mcl_farming:potato") +minetest.register_alias("farming:potato_6", "mcl_farming:potato") +minetest.register_alias("farming:potato_7", "mcl_farming:potato") +minetest.register_alias("farming:potato_8", "mcl_farming:potato") + + +minetest.register_alias("farming:carrot_gold", "mcl_farming:carrot_item_gold") +minetest.register_alias("farming:carrot", "mcl_farming:carrot") +minetest.register_alias("farming:carrot_1", "mcl_farming:carrot") +minetest.register_alias("farming:carrot_2", "mcl_farming:carrot") +minetest.register_alias("farming:carrot_3", "mcl_farming:carrot") +minetest.register_alias("farming:carrot_4", "mcl_farming:carrot") +minetest.register_alias("farming:carrot_5", "mcl_farming:carrot") +minetest.register_alias("farming:carrot_6", "mcl_farming:carrot") +minetest.register_alias("farming:carrot_7", "mcl_farming:carrot") +minetest.register_alias("farming:carrot_8", "mcl_farming:carrot") + +minetest.register_alias("farming:corn", "mcl_farming:carrot") +minetest.register_alias("farming:corn_1", "mcl_farming:carrot") +minetest.register_alias("farming:corn_2", "mcl_farming:carrot") +minetest.register_alias("farming:corn_3", "mcl_farming:carrot") +minetest.register_alias("farming:corn_4", "mcl_farming:carrot") +minetest.register_alias("farming:corn_5", "mcl_farming:carrot") +minetest.register_alias("farming:corn_6", "mcl_farming:carrot") +minetest.register_alias("farming:corn_7", "mcl_farming:carrot") +minetest.register_alias("farming:corn_8", "mcl_farming:carrot") + +minetest.register_alias("farming:wheat", "mcl_farming:wheat") +minetest.register_alias("farming:straw", "mcl_farming:wheat") +minetest.register_alias("farming:bread", "mcl_core:snow") +minetest.register_alias("farming:flour", "mcl_farming:bread") +minetest.register_alias("farming:seed_wheat", "mcl_farming:hay_block") +minetest.register_alias("mcl_farming:seed_wheat", "mcl_farming:hay_block") +minetest.register_alias("farming:wheat_1", "mcl_farming:wheat_5") +minetest.register_alias("farming:wheat_2", "mcl_farming:wheat_5") +minetest.register_alias("farming:wheat_3", "mcl_farming:wheat_5") +minetest.register_alias("farming:wheat_4", "mcl_farming:wheat_5") +minetest.register_alias("farming:wheat_5", "mcl_farming:wheat_5") +minetest.register_alias("farming:wheat_6", "mcl_farming:wheat_5") +minetest.register_alias("farming:wheat_7", "mcl_farming:wheat_5") +minetest.register_alias("farming:wheat_8", "mcl_farming:wheat_5") + +minetest.register_alias("farming:cotton", "mcl_farming:wheat") +minetest.register_alias("farming:seed_cotton", "mcl_farming:wheat") +minetest.register_alias("farming:cotton_1", "mcl_farming:wheat_5") +minetest.register_alias("farming:cotton_2", "mcl_farming:wheat_5") +minetest.register_alias("farming:cotton_3", "mcl_farming:wheat_5") +minetest.register_alias("farming:cotton_4", "mcl_farming:wheat_5") +minetest.register_alias("farming:cotton_5", "mcl_farming:wheat_5") +minetest.register_alias("farming:cotton_6", "mcl_farming:wheat_5") +minetest.register_alias("farming:cotton_7", "mcl_farming:wheat_5") +minetest.register_alias("farming:cotton_8", "mcl_farming:wheat_5") + + +--====================== +--Fire +--====================== +minetest.register_alias("default:underground_fire", "mcl_fire:eternal_fire") +minetest.register_alias("nether:permanent_flame", "mcl_fire:eternal_fire") +minetest.register_alias("default:permanent_flame", "mcl_fire:eternal_fire") +minetest.register_alias("fire:permanent_flame", "mcl_fire:eternal_fire") +minetest.register_alias("default:basic_flame", "mcl_fire:fire") +minetest.register_alias("fire:basic_flame", "mcl_fire:fire") + +--====================== +--flowers +--====================== +minetest.register_alias("flowers:rose", "mcl_flowers:poppy") +minetest.register_alias("flowers:tulip", "mcl_flowers:blue_orchid") +minetest.register_alias("flowers:dandelion_yellow", "mcl_flowers:dandelion") +minetest.register_alias("flowers:geranium", "mcl_flowers:tulip_orange") +minetest.register_alias("flowers:viola", "mcl_flowers:tulip_pink") +minetest.register_alias("flowers:dandelion_white", "mcl_flowers:oxeye_daisy") +minetest.register_alias("flowers:waterlily", "mcl_flowers:waterlily") +minetest.register_alias("flowers:mushroom_brown", "mcl_mushrooms:mushroom_brown") +minetest.register_alias("flowers:mushroom_red", "mcl_mushrooms:mushroom_red") + +--====================== +--hoppers +--====================== +minetest.register_alias("hopper:hopper_item", "mcl_hoppers:hopper") +minetest.register_alias("hopper:hopper", "mcl_hoppers:hopper") +minetest.register_alias("hopper:hopper_side", "mcl_hoppers:hopper_side") + +--====================== +--mesecons +--====================== +minetest.register_alias("dispenser:dispenser", "mcl_dispensers:dispenser") +minetest.register_alias("dropper:dropper", "mcl_droppers:dropper") +minetest.register_alias("dropper:dropper", "mcl_droppers:dropper") +minetest.register_alias("mesecons_button:button_off", "mesecons_button:button_stone_off") +minetest.register_alias("mesecons_button:button_on", "mesecons_button:button_stone_on") +minetest.register_alias("mesecons_luacontroller:luacontroller0000", "mesecons_delayer:delayer_off_1") +minetest.register_alias("mesecons_random:ghoststone", "mesecons_delayer:delayer_off_1") + + +--====================== +--MC2 Andisite,granite,diorite +--====================== +minetest.register_alias("default:marble", "mcl_core:andesite") +minetest.register_alias("default:marble_bricks", "mcl_core:andesite_smooth") +minetest.register_alias("default:granite_bricks", "mcl_core:granite_smooth") + +--====================== +--Enderchest +--====================== +minetest.register_alias("enderchest:enderchest", "mcl_chests:ender_chest") +minetest.register_alias("mcl_core:enderchest", "mcl_chests:ender_chest") + +--====================== +--End +--====================== +minetest.register_alias("default:end_stone", "mcl_end:end_stone") +minetest.register_alias("default:end_bricks", "mcl_end:end_bricks") +minetest.register_alias("default:purpur_block", "mcl_end:purpur_block") +minetest.register_alias("default:purpur_pillar", "mcl_end:purpur_pillar") +minetest.register_alias("default:chorus_flower_dead", "mcl_end:chorus_flower_dead") +minetest.register_alias("default:chorus_plant", "mcl_end:chorus_plant") +minetest.register_alias("default:chorus_fruit", "mcl_end:chorus_fruit") +minetest.register_alias("default:chorus_fruit_popped", "mcl_end:chorus_fruit_popped") + +--====================== +--MC2 chests +--====================== +minetest.register_alias("mcl_core:chest", "mcl_chests:chest") +minetest.register_alias("default:chest", "mcl_chests:chest") +minetest.register_alias("default:chest_locked", "mcl_chests:chest") + +--====================== +--nssm +--====================== +minetest.register_alias("nssm:ant_dirt", "mcl_core:coarse_dirt") + +--====================== +--Nyancat +--====================== +minetest.register_alias("nyancat:nyancat", "mcl_core:diamondblock") +minetest.register_alias("nyancat:rainbow", "mcl_core:emeraldblock") +minetest.register_alias("nyancat:nyancat_rainbow", "mcl_core:emeraldblock") + + +--====================== +--alias to remove old quartz from maps +--====================== +--minetest.register_alias("default:quartz_crystal", "mcl_nether:quartz") +minetest.register_alias("default:quartz_ore", "mcl_nether:quartz_ore") +minetest.register_alias("default:block", "mcl_nether:quartz_block") +minetest.register_alias("default:chiseled", "mcl_nether:quartz_chiseled") +minetest.register_alias("default:pillar", "mcl_nether:quartz_pillar") +minetest.register_alias("default:pillar_horizontal", "mcl_nether:quartz_pillar_horizontal") + +--====================== +--alias to merge default-nether to mcl_core +--====================== +minetest.register_alias("default:rack", "mcl_nether:netherrack") +minetest.register_alias("default:quartz_ore", "mcl_nether:quartz_ore") +minetest.register_alias("default:quartz_crystal", "mcl_nether:quartz_crystal") +minetest.register_alias("default:nitherbrick", "mcl_nether:nether_brick") +minetest.register_alias("default:obsidiannitherbrick", "mcl_nether:nether_brick") +minetest.register_alias("default:glowstone", "mcl_nether:glowstone") +minetest.register_alias("default:glowstone_dust", "mcl_nether:glowstone_dust") +minetest.register_alias("default:rack_with_diamond", "mcl_core:stone_with_diamond") +minetest.register_alias("default:slowsand", "mcl_nether:soul_sand") +minetest.register_alias("default:fence_nither", "mcl_fences:nether_brick_fence") + +--====================== +--alias to merge nether to mcl_core +--====================== +minetest.register_alias("nether:rack", "mcl_nether:netherrack") +minetest.register_alias("nether:quartz_ore", "mcl_nether:quartz_ore") +minetest.register_alias("nether:quartz_crystal", "mcl_nether:quartz_crystal") +minetest.register_alias("nether:nitherbrick", "mcl_nether:nether_brick") +minetest.register_alias("nether:obsidiannitherbrick", "mcl_nether:nether_brick") +minetest.register_alias("nether:glowstone", "mcl_nether:glowstone") +minetest.register_alias("nether:glowstone_dust", "mcl_nether:glowstone_dust") +minetest.register_alias("nether:rack_with_diamond", "mcl_core:stone_with_diamond") +minetest.register_alias("nether:sand", "mcl_nether:soul_sand") +minetest.register_alias("nether:portal", "mcl_portals:portal") +minetest.register_alias("nether:fence_nither", "mcl_fences:nether_brick_fence") + + +--====================== +--stairs +--====================== +minetest.register_alias("stairs:slab_marble", "mcl_stairs:slab_stone") +minetest.register_alias("stairs:stair_marble", "mcl_stairs:stair_stone") +minetest.register_alias("stairs:slab_marble_bricks", "mcl_stairs:slab_stone") +minetest.register_alias("stairs:stair_marble_bricks", "mcl_stairs:stair_stone") +minetest.register_alias("stairs:slab_granite", "mcl_stairs:slab_sandstone") +minetest.register_alias("stairs:stair_granite", "mcl_stairs:stair_sandstone") +minetest.register_alias("stairs:slab_granite_bricks", "mcl_stairs:slab_stone") +minetest.register_alias("stairs:stair_granite_bricks", "mcl_stairs:stair_stone") + +minetest.register_alias("stairs:stair_andesite", "mcl_stairs:stair_sandstone") +minetest.register_alias("stairs:slab_andesite", "mcl_stairs:slab_stone") +minetest.register_alias("stairs:stair_diorite", "mcl_stairs:stair_sandstone") +minetest.register_alias("stairs:slab_diorite", "mcl_stairs:slab_stone") + +minetest.register_alias("stairs:stair_mossycobble", "mcl_stairs:stair_cobble") +minetest.register_alias("stairs:slab_mossycobble", "mcl_stairs:slab_cobble") +minetest.register_alias("stairs:stair_desert_cobble", "mcl_stairs:stair_sandstone") +minetest.register_alias("stairs:slab_desert_cobble", "mcl_stairs:slab_sandstone") +minetest.register_alias("stairs:stair_desert_stone", "mcl_stairs:stair_redsandstone") +minetest.register_alias("stairs:slab_desert_stone", "mcl_stairs:slab_redsandstone") +minetest.register_alias("stairs:stair_desert_stonebrick", "mcl_stairs:stair_redsandstone") +minetest.register_alias("stairs:slab_desert_stonebrick", "mcl_stairs:slab_redsandstone") + +minetest.register_alias("stairs:stair_stone", "mcl_stairs:stair_stonebrick") + +minetest.register_alias("stairs:stair_obsidianbrick", "mcl_stairs:stair_cobble") +minetest.register_alias("stairs:slab_obsidianbrick", "mcl_stairs:slab_stone") +minetest.register_alias("stairs:stair_obsidian", "mcl_stairs:stair_cobble") +minetest.register_alias("stairs:slab_obsidian", "mcl_stairs:slab_stone") + +minetest.register_alias("stairs:stair_sandstonebrick", "mcl_stairs:stair_sandstone") +minetest.register_alias("stairs:slab_sandstonebrick", "mcl_stairs:slab_sandstone") + +minetest.register_alias("stairs:stair_nitherbrick", "mcl_stairs:stair_nether_brick") +minetest.register_alias("stairs:slab_nitherbrick", "mcl_stairs:slab_nether_brick") +minetest.register_alias("stairs:stair_netherbrick", "mcl_stairs:stair_nether_brick") +minetest.register_alias("stairs:slab_netherbrick", "mcl_stairs:slab_nether_brick") + +minetest.register_alias("stairs:stair_brick", "mcl_stairs:slab_brick_block") +minetest.register_alias("stairs:slab_brick", "mcl_stairs:slab_brick_block") + +minetest.register_alias("stairs:stair_steelblock", "mcl_stairs:stair_cobble") +minetest.register_alias("stairs:slab_steelblock", "mcl_stairs:slab_cobble") +minetest.register_alias("stairs:stair_goldblock", "mcl_stairs:stair_cobble") +minetest.register_alias("stairs:slab_goldblock", "mcl_stairs:slab_cobble") + +minetest.register_alias("stairs:stair_pine_wood", "mcl_stairs:stair_sprucewood") +minetest.register_alias("stairs:slab_pine_wood", "mcl_stairs:slab_sprucewood") +minetest.register_alias("stairs:stair_acacia_wood", "mcl_stairs:stair_acaciawood") +minetest.register_alias("stairs:slab_acacia_wood", "mcl_stairs:slab_acaciawood") +minetest.register_alias("stairs:stair_aspen_wood", "mcl_stairs:stair_birchwood") +minetest.register_alias("stairs:slab_aspen_wood", "mcl_stairs:slab_birchwood") + +--corners +minetest.register_alias("default:cobble_innerstair", "mcl_stairs:slab_cobble") +minetest.register_alias("default:cobble_outerstair", "mcl_stairs:slab_cobble") + + +--====================== +--alias for es stuff and misc +--====================== +minetest.register_alias("esmobs:bones", "mcl_core:chest") +minetest.register_alias("es:emerald_crystal", "mcl_core:emerald_crystal") +minetest.register_alias("vines:rope_block", "mcl_tools:pick_gold") +minetest.register_alias("vines:shears", "mcl_tools:pick_gold") +minetest.register_alias("vines:vine", "mcl_core:vine") +minetest.register_alias("vines:vine_middle", "mcl_core:vine") +minetest.register_alias("vines:vine_end", "mcl_core:vine") +minetest.register_alias("vines:root", "mcl_core:vine") +minetest.register_alias("vines:root_middle", "mcl_core:vine") +minetest.register_alias("vines:root_end", "mcl_core:vine") +minetest.register_alias("vines:side", "mcl_core:vine") +minetest.register_alias("vines:side_middle", "mcl_core:vine") +minetest.register_alias("vines:side_end", "mcl_core:vine") +minetest.register_alias("vines:jungle", "mcl_core:vine") +minetest.register_alias("vines:jungle_middle", "mcl_core:vine") +minetest.register_alias("vines:jungle_end", "mcl_core:vine") + +--====================== +--woodsoils +--====================== +minetest.register_alias("woodsoils:dirt_with_leaves_1", "mcl_core:podzol") +minetest.register_alias("woodsoils:dirt_with_leaves_2", "mcl_core:podzol") +minetest.register_alias("woodsoils:grass_with_leaves_1", "mcl_core:podzol") +minetest.register_alias("woodsoils:grass_with_leaves_2", "mcl_core:podzol") + +--====================== +--walls +--====================== +minetest.register_alias("walls:cobble", "mcl_walls:cobble") +minetest.register_alias("walls:desertcobble", "mcl_walls:cobble") +minetest.register_alias("walls:mossycobble", "mcl_walls:cobble") + +--====================== +--wool +--====================== +minetest.register_alias("wool:white", "mcl_wool:white") +minetest.register_alias("wool:grey", "mcl_wool:grey") +minetest.register_alias("wool:black", "mcl_wool:black") +minetest.register_alias("wool:red", "mcl_wool:red") +minetest.register_alias("wool:yellow", "mcl_wool:yellow") +minetest.register_alias("wool:green", "mcl_wool:green") +minetest.register_alias("wool:cyan", "mcl_wool:cyan") +minetest.register_alias("wool:blue", "mcl_wool:blue") +minetest.register_alias("wool:magenta", "mcl_wool:magenta") +minetest.register_alias("wool:orange", "mcl_wool:orange") +minetest.register_alias("wool:violet", "mcl_wool:purple") +minetest.register_alias("mcl_wool:violet", "mcl_wool:purple") +minetest.register_alias("wool:brown", "mcl_wool:brown") +minetest.register_alias("wool:pink", "mcl_wool:pink") +minetest.register_alias("wool:dark_grey", "mcl_wool:dark_grey") +minetest.register_alias("wool:dark_green", "mcl_wool:dark_green") + +--====================== +--willages +--====================== +minetest.register_alias("mg_villages:plotmarker", "mcl_stairs:slab_stone") +minetest.register_alias("mg_villages:road", "mcl_stairs:slab_stone") +minetest.register_alias("mg_villages:road", "mcl_stairs:slab_stone") +minetest.register_alias("mg_villages:soil", "mcl_farming:soil") +minetest.register_alias("handle_schematics:support", "mcl_farming:soil") + +--====================== +--xdecor itemframes etc +--====================== +minetest.register_alias("xdecor:itemframe", "itemframes:frame") +minetest.register_alias("xdecor:f_item", "itemframes:item") +minetest.register_alias("xdecor:workbench", "mcl_anvils:anvil") +--minetest.register_alias("xdecor:enchantment_table", "mcl_crafting_table:crafting_table") +minetest.register_alias("xdecor:hammer", "mcl_anvils:anvil") +--[[ +-- Nodeboxes definitions. +workbench.defs = { + -- Name Yield X Y Z W H L + {"nanoslab", 16, { 0, 0, 0, 8, 1, 8 }}, + {"micropanel", 16, { 0, 0, 0, 16, 1, 8 }}, + {"microslab", 8, { 0, 0, 0, 16, 1, 16 }}, + {"thinstair", 8, { 0, 7, 0, 16, 1, 8 }, + { 0, 15, 8, 16, 1, 8 }}, + {"cube", 4, { 0, 0, 0, 8, 8, 8 }}, + {"panel", 4, { 0, 0, 0, 16, 8, 8 }}, + {"slab", 2, nil }, + {"doublepanel", 2, { 0, 0, 0, 16, 8, 8 }, + { 0, 8, 8, 16, 8, 8 }}, + {"halfstair", 2, { 0, 0, 0, 8, 8, 16 }, + { 0, 8, 8, 8, 8, 8 }}, + {"outerstair", 1, { 0, 0, 0, 16, 8, 16 }, + { 0, 8, 8, 8, 8, 8 }}, + {"stair", 1, nil }, + {"innerstair", 1, { 0, 0, 0, 16, 8, 16 }, + { 0, 8, 8, 16, 8, 8 }, + { 0, 8, 0, 8, 8, 8 }} +}]] +--micropanels +minetest.register_alias("default:wood_micropanel", "mcl_fences:fence") +minetest.register_alias("default:wood_nanoslab", "mcl_fences:fence") + +--====================== +--xpanes +--====================== +minetest.register_alias("xpanes:pane_flat", "xpanes:pane_natural_flat") +minetest.register_alias("xpanes:pane", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_0", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_1", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_2", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_3", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_4", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_5", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_6", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_7", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_8", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_9", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_10", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_11", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_12", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_13", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_14", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_15", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_16", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_17", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_18", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_19", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_20", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_21", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_22", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_23", "xpanes:pane_natural") +minetest.register_alias("xpanes:pane_24", "xpanes:pane_natural") + + diff --git a/mods/MISC/gt2mc2/mob_items.lua b/mods/MISC/gt2mc2/mob_items.lua new file mode 100644 index 000000000..259f011e3 --- /dev/null +++ b/mods/MISC/gt2mc2/mob_items.lua @@ -0,0 +1,161 @@ +--====================== +--mob items and end items +--====================== +minetest.register_alias("default:end_rod", "mcl_end:end_rod") +minetest.register_alias("default:dragon_egg", "mcl_end:dragon_egg") +minetest.register_alias("mobs_mc:dragon_egg", "mcl_end:dragon_egg") +minetest.register_alias("mobs_mc:ender_eye", "mcl_end:ender_eye") +minetest.register_alias("mobs_mc:rotten_flesh", "mcl_mobitems:rotten_flesh") +minetest.register_alias("mobs_mc:mutton", "mcl_mobitems:mutton") +minetest.register_alias("mobs_mc:mutton_raw", "mcl_mobitems:mutton") +minetest.register_alias("mobs_mc:cooked_mutton", "mcl_mobitems:cooked_mutton") +minetest.register_alias("mobs_mc:beef", "mcl_mobitems:beef") +minetest.register_alias("mobs_mc:beef_raw", "mcl_mobitems:beef") +minetest.register_alias("mobs_mc:cooked_beef", "mcl_mobitems:cooked_beef") +minetest.register_alias("mobs_mc:chicken", "mcl_mobitems:chicken") +minetest.register_alias("mobs_mc:chicken_raw", "mcl_mobitems:chicken") +minetest.register_alias("mobs_mc:cooked_chicken", "mcl_mobitems:cooked_chicken") +--minetest.register_alias("mobs_mc:egg", "mcl_mobitems:egg") +--minetest.register_alias("mcl_mobitems:egg", "mobs_mc:egg") +minetest.register_alias("mcl_mobitems:egg", "mobs_mc:chicken") +minetest.register_alias("mobs_mc:porkchop", "mcl_mobitems:porkchop") +minetest.register_alias("mobs_mc:porkchop_raw", "mcl_mobitems:porkchop") +minetest.register_alias("mobs_mc:cooked_porkchop", "mcl_mobitems:cooked_porkchop") +minetest.register_alias("mobs_mc:rabbit", "mcl_mobitems:rabbit") +minetest.register_alias("mcl_mobitems:rabbit_raw", "mcl_mobitems:rabbit") +minetest.register_alias("mobs_mc:rabbit_raw", "mcl_mobitems:rabbit") +minetest.register_alias("mobs_mc:milk_bucket", "mcl_mobitems:milk_bucket") +minetest.register_alias("mobs_mc:spider_eye", "mcl_mobitems:spider_eye") +minetest.register_alias("farming:string", "mcl_mobitems:string") +minetest.register_alias("mobs_mc:bow_wood", "mcl_throwing:bow") +minetest.register_alias("mobs_mc:blaze_powder", "mcl_mobitems:blaze_powder") +minetest.register_alias("mobs_mc:magma_cream", "mcl_mobitems:magma_cream") +minetest.register_alias("mobs_mc:ghast_tear", "mcl_mobitems:ghast_tear") +minetest.register_alias("mobs_mc:horsepegh1", "mobs_mc:horse") +minetest.register_alias("mobs_mc:nether_star", "mcl_mobitems:nether_star") +minetest.register_alias("mobs_mc:leather", "mcl_mobitems:leather") +minetest.register_alias("mobs_mc:feather", "mcl_mobitems:feather") +minetest.register_alias("mobs_mc:rabbit_hide", "mcl_mobitems:rabbit_hide") +minetest.register_alias("mobs_mc:rabbit_foot", "mcl_mobitems:rabbit_foot") +minetest.register_alias("mobs_mc:rabbit_stew", "mcl_mobitems:rabbit_stew") +minetest.register_alias("mobs_mc:saddle", "mcl_mobitems:saddle") +minetest.register_alias("mobs_mc:shulker_shell", "mcl_mobitems:shulker_shell") +minetest.register_alias("mobs_mc:slimeball", "mcl_mobitems:slimeball") +minetest.register_alias("mobs_mc:carrot_on_a_stick", "mcl_mobitems:carrot_on_a_stick") + +--heads +minetest.register_alias("mobs_mc:zombie_head", "mcl_heads:zombie") +minetest.register_alias("mobs_mc:creeper_head", "mcl_heads:creeper") +minetest.register_alias("mobs_mc:enderman_head", "mcl_heads:steve") +minetest.register_alias("mobs_mc:ghast_head", "mcl_heads:steve") +minetest.register_alias("mobs_mc:skeleton_head", "mcl_heads:skeleton") +minetest.register_alias("mobs_mc:skeleton2_head", "mcl_heads:wither_skeleton") +minetest.register_alias("mobs_mc:spider_head", "mcl_heads:steve") +minetest.register_alias("mobs_mc:zombiepig_head", "mcl_heads:zombie_head") + +--Mobs Redo +minetest.register_alias("default:end_rod", "mcl_end:end_rod") +minetest.register_alias("default:dragon_egg", "mcl_end:dragon_egg") +minetest.register_alias("mobs:dragon_egg", "mcl_end:dragon_egg") +minetest.register_alias("mobs:ender_eye", "mcl_end:ender_eye") +minetest.register_alias("mobs:rotten_flesh", "mcl_mobitems:rotten_flesh") +minetest.register_alias("mobs:mutton", "mcl_mobitems:mutton") +minetest.register_alias("mobs:mutton_raw", "mcl_mobitems:mutton") +minetest.register_alias("mobs:cooked_mutton", "mcl_mobitems:cooked_mutton") +minetest.register_alias("mobs:mutton_cooked", "mcl_mobitems:cooked_mutton") +minetest.register_alias("mobs:beef", "mcl_mobitems:cooked_beef") +minetest.register_alias("mobs:beef_raw", "mcl_mobitems:cooked_beef") +minetest.register_alias("mobs:meat_raw", "mcl_mobitems:cooked_beef") +minetest.register_alias("mobs:meat", "mcl_mobitems:cooked_beef") +minetest.register_alias("mobs:cooked_beef", "mcl_mobitems:cooked_beef") +minetest.register_alias("mobs:beef_cooked", "mcl_mobitems:cooked_beef") +minetest.register_alias("mobs:chicken", "mcl_mobitems:chicken") +minetest.register_alias("mobs_animal:chicken", "mobs_mc:chicken") +minetest.register_alias("mobs:chicken_egg_fried", "mcl_mobitems:chicken") +minetest.register_alias("mobs:chicken_raw", "mcl_mobitems:chicken") +minetest.register_alias("mobs:cooked_chicken", "mcl_mobitems:cooked_chicken") +minetest.register_alias("mobs:pork_cooked", "mcl_mobitems:porkchop") +minetest.register_alias("mobs:porkchop", "mcl_mobitems:porkchop") +minetest.register_alias("mobs:pork_raw", "mcl_mobitems:porkchop") +minetest.register_alias("mobs:cooked_porkchop", "mcl_mobitems:cooked_porkchop") +minetest.register_alias("mobs:rabbit", "mcl_mobitems:rabbit") +minetest.register_alias("mobs:milk_bucket", "mcl_mobitems:milk_bucket") +minetest.register_alias("mobs:spider_eye", "mcl_mobitems:spider_eye") +minetest.register_alias("mobs:bone", "mcl_mobitems:bone") +minetest.register_alias("mobs:bow_wood", "mcl_throwing:bow") +minetest.register_alias("mobs:string", "mcl_mobitems:string") +minetest.register_alias("mobs:blaze_powder", "mcl_mobitems:blaze_powder") +minetest.register_alias("mobs:magma_cream", "mcl_mobitems:magma_cream") +minetest.register_alias("mobs:ghast_tear", "mcl_mobitems:ghast_tear") +minetest.register_alias("mobs:nether_star", "mcl_mobitems:nether_star") +minetest.register_alias("mobs:leather", "mcl_mobitems:leather") +minetest.register_alias("mobs:feather", "mcl_mobitems:feather") +minetest.register_alias("mobs:rabbit_hide", "mcl_mobitems:rabbit_hide") +minetest.register_alias("mobs:rabbit_foot", "mcl_mobitems:rabbit_foot") +minetest.register_alias("mobs:rabbit_stew", "mcl_mobitems:rabbit_stew") +minetest.register_alias("mobs_animal:rat", "mcl_mobitems:rabbit_stew") +minetest.register_alias("mobs:saddle", "mcl_mobitems:saddle") +minetest.register_alias("mobs:shulker_shell", "mcl_mobitems:shulker_shell") +minetest.register_alias("mobs:slimeball", "mcl_mobitems:slimeball") +minetest.register_alias("mobs:carrot_on_a_stick", "mcl_mobitems:carrot_on_a_stick") +minetest.register_alias("mobs:arrow", "mcl_throwing:arrow") +minetest.register_alias("mobs:magic_lasso", "mcl_throwing:arrow") +minetest.register_alias("mobs:net", "mcl_throwing:arrow") +minetest.register_alias("mobs:egg", "mcl_throwing:egg") +minetest.register_alias("mobs:cobweb", "mcl_core:cobweb") --funky +--minetest.register_alias("mcl_mobitems:egg", "mcl_mobitems:egg") +minetest.register_alias("mobs:protector", "mcl_throwing:arrow") + + +--esmobs +minetest.register_alias("esmobs:end_rod", "mcl_end:end_rod") +minetest.register_alias("esmobs:dragon_egg", "mcl_end:dragon_egg") +minetest.register_alias("esmobs:dragon_egg", "mcl_end:dragon_egg") +minetest.register_alias("esmobs:ender_eye", "mcl_end:ender_eye") +minetest.register_alias("esmobs:rotten_flesh", "mcl_mobitems:rotten_flesh") +minetest.register_alias("esmobs:mutton", "mcl_mobitems:mutton") +minetest.register_alias("esmobs:mutton_raw", "mcl_mobitems:mutton") +minetest.register_alias("esmobs:cooked_mutton", "mcl_mobitems:cooked_mutton") +minetest.register_alias("esmobs:mutton_cooked", "mcl_mobitems:cooked_mutton") +minetest.register_alias("esmobs:beef", "mcl_mobitems:cooked_beef") +minetest.register_alias("esmobs:beef_raw", "mcl_mobitems:cooked_beef") +minetest.register_alias("esmobs:meat_raw", "mcl_mobitems:cooked_beef") +minetest.register_alias("esmobs:meat", "mcl_mobitems:cooked_beef") +minetest.register_alias("esmobs:cooked_beef", "mcl_mobitems:cooked_beef") +minetest.register_alias("esmobs:beef_cooked", "mcl_mobitems:cooked_beef") +minetest.register_alias("esmobs:chicken", "mcl_mobitems:chicken") +minetest.register_alias("esmobs:chicken_egg_fried", "mcl_mobitems:chicken") +minetest.register_alias("esmobs:chicken_raw", "mcl_mobitems:chicken") +minetest.register_alias("esmobs:cooked_chicken", "mcl_mobitems:cooked_chicken") +minetest.register_alias("esmobs:pork_cooked", "mcl_mobitems:porkchop") +minetest.register_alias("esmobs:porkchop", "mcl_mobitems:porkchop") +minetest.register_alias("esmobs:pork_raw", "mcl_mobitems:porkchop") +minetest.register_alias("esmobs:cooked_porkchop", "mcl_mobitems:cooked_porkchop") +minetest.register_alias("esmobs:rabbit", "mcl_mobitems:rabbit") +minetest.register_alias("esmobs:milk_bucket", "mcl_mobitems:milk_bucket") +minetest.register_alias("esmobs:spider_eye", "mcl_mobitems:spider_eye") +minetest.register_alias("esmobs:bone", "mcl_mobitems:bone") +minetest.register_alias("esmobs:bow_wood", "mcl_throwing:bow") +minetest.register_alias("esmobs:string", "mcl_mobitems:string") +minetest.register_alias("esmobs:blaze_powder", "mcl_mobitems:blaze_powder") +minetest.register_alias("esmobs:magma_cream", "mcl_mobitems:magma_cream") +minetest.register_alias("esmobs:ghast_tear", "mcl_mobitems:ghast_tear") +minetest.register_alias("esmobs:nether_star", "mcl_mobitems:nether_star") +minetest.register_alias("esmobs:leather", "mcl_mobitems:leather") +minetest.register_alias("esmobs:feather", "mcl_mobitems:feather") +minetest.register_alias("esmobs:rabbit_hide", "mcl_mobitems:rabbit_hide") +minetest.register_alias("esmobs:rabbit_foot", "mcl_mobitems:rabbit_foot") +minetest.register_alias("esmobs:rabbit_stew", "mcl_mobitems:rabbit_stew") +minetest.register_alias("esmobs:rat", "mcl_mobitems:rabbit_stew") +minetest.register_alias("esmobs:saddle", "mcl_mobitems:saddle") +minetest.register_alias("esmobs:shulker_shell", "mcl_mobitems:shulker_shell") +minetest.register_alias("esmobs:slimeball", "mcl_mobitems:slimeball") +minetest.register_alias("esmobs:carrot_on_a_stick", "mcl_mobitems:carrot_on_a_stick") +minetest.register_alias("esmobs:arrow", "mcl_throwing:arrow") +minetest.register_alias("esmobs:magic_lasso", "mcl_throwing:arrow") +minetest.register_alias("esmobs:net", "mcl_throwing:arrow") +minetest.register_alias("esmobs:egg", "mcl_throwing:egg") +minetest.register_alias("esmobs:cobweb", "mcl_core:cobweb") --funky +minetest.register_alias("esmobs:protector", "mcl_throwing:arrow") +minetest.register_alias("esmobs:bones", "mcl_chests:chest") + From a26aef704290e809b38ebdea999407ba9b7cac8e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 15 Aug 2017 20:08:41 +0200 Subject: [PATCH 02/75] Generate vines and cocoas in non-v6 mapgens --- mods/MAPGEN/mcl_mapgen_core/init.lua | 229 ++++++++++++++------------- 1 file changed, 119 insertions(+), 110 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 612dc32a5..f3e928e68 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1057,117 +1057,9 @@ local GEN_MAX = mcl_vars.mg_lava_overworld_max or BEDROCK_MAX -- Buffer for LuaVoxelManip local lvm_buffer = {} --- Below the bedrock, generate air/void -minetest.register_on_generated(function(minp, maxp) - local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") - local data = vm:get_data(lvm_buffer) - local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) - local lvm_used = false - -- Generate bedrock and lava layers - if minp.y <= GEN_MAX then - local c_bedrock = minetest.get_content_id("mcl_core:bedrock") - local c_void = minetest.get_content_id("mcl_core:void") - local c_lava = minetest.get_content_id("mcl_core:lava_source") - local c_air = minetest.get_content_id("air") - - local max_y = math.min(maxp.y, GEN_MAX) - - for y = minp.y, max_y do - for x = minp.x, maxp.x do - for z = minp.z, maxp.z do - local p_pos = area:index(x, y, z) - local setdata = nil - if mcl_vars.mg_bedrock_is_rough then - -- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer - -- This code assumes a bedrock height of 5 layers. - if y == BEDROCK_MAX then - -- 50% bedrock chance - if math.random(1,2) == 1 then setdata = c_bedrock end - elseif y == BEDROCK_MAX -1 then - -- 66.666...% - if math.random(1,3) <= 2 then setdata = c_bedrock end - elseif y == BEDROCK_MAX -2 then - -- 75% - if math.random(1,4) <= 3 then setdata = c_bedrock end - elseif y == BEDROCK_MAX -3 then - -- 90% - if math.random(1,10) <= 9 then setdata = c_bedrock end - elseif y == BEDROCK_MAX -4 then - -- 100% - setdata = c_bedrock - elseif y < BEDROCK_MIN then - setdata = c_void - end - else - -- Perfectly flat bedrock layer(s) - if y >= BEDROCK_MIN and y <= BEDROCK_MAX then - setdata = c_bedrock - elseif y < BEDROCK_MIN then - setdata = c_void - end - end - - if setdata then - data[p_pos] = setdata - lvm_used = true - elseif mcl_vars.mg_lava and y <= mcl_vars.mg_lava_overworld_max then - if data[p_pos] == c_air then - data[p_pos] = c_lava - end - lvm_used = true - end - end - end - end - end - - -- Put top snow on grassy snow blocks created by the v6 mapgen - -- This is because the snowy grass block must only be used when it is below snow or top snow - if mg_name == "v6" then - local c_top_snow = minetest.get_content_id("mcl_core:snow") - local snowdirt = minetest.find_nodes_in_area_under_air(minp, maxp, "mcl_core:dirt_with_grass_snow") - for n = 1, #snowdirt do - -- CHECKME: What happens at chunk borders? - local p_pos = area:index(snowdirt[n].x, snowdirt[n].y + 1, snowdirt[n].z) - if p_pos then - data[p_pos] = c_top_snow - end - end - if #snowdirt > 1 then - lvm_used = true - end - end - - if lvm_used then - vm:set_data(data) - vm:calc_lighting() - vm:update_liquids() - vm:write_to_map() - end - - -- Generate rare underground mushrooms - -- TODO: Make them appear in groups, use Perlin noise - if minp.y > 0 or maxp.y < -32 then - return - end - - local bpos - local stone = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_core:stone", "mcl_core:dirt", "mcl_core:mycelium", "mcl_core:podzol", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:stone_with_iron", "mcl_core:stone_with_gold"}) - - for n = 1, #stone do - bpos = {x = stone[n].x, y = stone[n].y + 1, z = stone[n].z } - - if math.random(1,1000) < 4 and minetest.get_node_light(bpos, 0.5) <= 12 then - if math.random(1,2) == 1 then - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) - else - minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) - end - end - end - - -- Generate cocoas and vines at jungle trees (v6 only) +-- Generate cocoas and vines at jungle trees within the bounding box +local function generate_jungle_tree_decorations(minp, maxp) if minetest.get_mapgen_setting("mg_name") == "v6" then if maxp.y < 0 then @@ -1286,7 +1178,124 @@ minetest.register_on_generated(function(minp, maxp) end end end +end +-- Generate mushrooms in caves +local generate_underground_mushrooms = function(minp, maxp) + -- Generate rare underground mushrooms + -- TODO: Make them appear in groups, use Perlin noise + if minp.y > 0 or maxp.y < -32 then + return + end + + local bpos + local stone = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_core:stone", "mcl_core:dirt", "mcl_core:mycelium", "mcl_core:podzol", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite", "mcl_core:stone_with_coal", "mcl_core:stone_with_iron", "mcl_core:stone_with_gold"}) + + for n = 1, #stone do + bpos = {x = stone[n].x, y = stone[n].y + 1, z = stone[n].z } + + if math.random(1,1000) < 4 and minetest.get_node_light(bpos, 0.5) <= 12 then + if math.random(1,2) == 1 then + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_brown"}) + else + minetest.set_node(bpos, {name = "mcl_mushrooms:mushroom_red"}) + end + end + end +end + + +-- Below the bedrock, generate air/void +minetest.register_on_generated(function(minp, maxp) + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local data = vm:get_data(lvm_buffer) + local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) + local lvm_used = false + + -- Generate bedrock and lava layers + if minp.y <= GEN_MAX then + local c_bedrock = minetest.get_content_id("mcl_core:bedrock") + local c_void = minetest.get_content_id("mcl_core:void") + local c_lava = minetest.get_content_id("mcl_core:lava_source") + local c_air = minetest.get_content_id("air") + + local max_y = math.min(maxp.y, GEN_MAX) + + for y = minp.y, max_y do + for x = minp.x, maxp.x do + for z = minp.z, maxp.z do + local p_pos = area:index(x, y, z) + local setdata = nil + if mcl_vars.mg_bedrock_is_rough then + -- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer + -- This code assumes a bedrock height of 5 layers. + if y == BEDROCK_MAX then + -- 50% bedrock chance + if math.random(1,2) == 1 then setdata = c_bedrock end + elseif y == BEDROCK_MAX -1 then + -- 66.666...% + if math.random(1,3) <= 2 then setdata = c_bedrock end + elseif y == BEDROCK_MAX -2 then + -- 75% + if math.random(1,4) <= 3 then setdata = c_bedrock end + elseif y == BEDROCK_MAX -3 then + -- 90% + if math.random(1,10) <= 9 then setdata = c_bedrock end + elseif y == BEDROCK_MAX -4 then + -- 100% + setdata = c_bedrock + elseif y < BEDROCK_MIN then + setdata = c_void + end + else + -- Perfectly flat bedrock layer(s) + if y >= BEDROCK_MIN and y <= BEDROCK_MAX then + setdata = c_bedrock + elseif y < BEDROCK_MIN then + setdata = c_void + end + end + + if setdata then + data[p_pos] = setdata + lvm_used = true + elseif mcl_vars.mg_lava and y <= mcl_vars.mg_lava_overworld_max then + if data[p_pos] == c_air then + data[p_pos] = c_lava + end + lvm_used = true + end + end + end + end + end + + -- Put top snow on grassy snow blocks created by the v6 mapgen + -- This is because the snowy grass block must only be used when it is below snow or top snow + if mg_name == "v6" then + local c_top_snow = minetest.get_content_id("mcl_core:snow") + local snowdirt = minetest.find_nodes_in_area_under_air(minp, maxp, "mcl_core:dirt_with_grass_snow") + for n = 1, #snowdirt do + -- CHECKME: What happens at chunk borders? + local p_pos = area:index(snowdirt[n].x, snowdirt[n].y + 1, snowdirt[n].z) + if p_pos then + data[p_pos] = c_top_snow + end + end + if #snowdirt > 1 then + lvm_used = true + end + end + + if lvm_used then + vm:set_data(data) + vm:calc_lighting() + vm:update_liquids() + vm:write_to_map() + end + + generate_underground_mushrooms(minp, maxp) + generate_jungle_tree_decorations(minp, maxp) end) From f7f6a89d642be8e97ac6446a986cb0ffc89bf75a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 15 Aug 2017 20:10:25 +0200 Subject: [PATCH 03/75] Spawn fake moss stone boulder in taiga only --- mods/MAPGEN/mcl_biomes/init.lua | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index f195bcab1..a1861582a 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -660,19 +660,20 @@ local function register_biomelike_ores() ore_type = "blob", ore = "mcl_core:mossycobble", wherein = "mcl_core:podzol", - clust_scarcity = 16 * 16 * 16, - clust_size = 3, - y_min = 25, - y_max = 31000, - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.2, - spread = {x = 3, y = 3, z = 3}, - seed = 17676, - octaves = 1, - persist = 0.0 - }, + biomes = {"taiga"}, + clust_scarcity = 16 * 16 * 16, + clust_size = 3, + y_min = 25, + y_max = 31000, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = {x = 3, y = 3, z = 3}, + seed = 17676, + octaves = 1, + persist = 0.0 + }, }) --mcl_core STRATA From 91b92a2cfdfae2fe30cb77584a3ad9ac190a3ca5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Aug 2017 14:06:01 +0200 Subject: [PATCH 04/75] Fix some realm bugs --- mods/MAPGEN/mcl_biomes/init.lua | 12 +++++------- mods/MAPGEN/mcl_mapgen_core/init.lua | 8 +++++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index a1861582a..a84ad616d 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1078,7 +1078,6 @@ local function register_biomelike_ores() }, }) - end @@ -1487,7 +1486,7 @@ local function register_decorations() deco_type = "simple", place_on = {"mcl_nether:netherrack"}, sidelen = 80, - fill_ratio = 0.4, + fill_ratio = 0.01, biomes = {"nether"}, y_min = -6000, y_max = 31000, @@ -1498,20 +1497,19 @@ local function register_decorations() deco_type = "simple", place_on = {"mcl_nether:netherrack"}, sidelen = 80, - fill_ratio = 0.3, + fill_ratio = 0.01, biomes = {"nether"}, y_min = -6000, y_max = 31000, decoration = "mcl_mushrooms:mushroom_brown", }) - -- FIXME: Does the placement of eternal fire and nether wart actually work? - --Fire + --Eternal Fire minetest.register_decoration({ deco_type = "simple", place_on = {"mcl_nether:netherrack"}, - sidelen = 8, - fill_ratio = 0.9, + sidelen = 16, + fill_ratio = 0.2, biomes = {"nether"}, y_min = -6000, y_max = 31000, diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index f3e928e68..4fc9b3293 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1244,14 +1244,16 @@ minetest.register_on_generated(function(minp, maxp) elseif y == BEDROCK_MAX -4 then -- 100% setdata = c_bedrock - elseif y < BEDROCK_MIN then + elseif y < BEDROCK_MIN and y > -1000 then setdata = c_void + elseif y > 1000 and y < 2000 then + setdata = c_stone end else -- Perfectly flat bedrock layer(s) if y >= BEDROCK_MIN and y <= BEDROCK_MAX then setdata = c_bedrock - elseif y < BEDROCK_MIN then + elseif y < BEDROCK_MIN and y > -1000 then setdata = c_void end end @@ -1259,7 +1261,7 @@ minetest.register_on_generated(function(minp, maxp) if setdata then data[p_pos] = setdata lvm_used = true - elseif mcl_vars.mg_lava and y <= mcl_vars.mg_lava_overworld_max then + elseif mcl_vars.mg_lava and y <= mcl_vars.mg_lava_overworld_max and y >= mcl_vars.mg_overworld_min then if data[p_pos] == c_air then data[p_pos] = c_lava end From 860155e5c1a8c35584d57cc9d19844b27136feb2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Aug 2017 15:29:05 +0200 Subject: [PATCH 05/75] Set proper realm boundaries --- mods/CORE/mcl_init/init.lua | 33 ++++++++++++++-- mods/CORE/mcl_util/init.lua | 37 ++++++++++++++---- mods/MAPGEN/mcl_mapgen_core/init.lua | 58 ++++++++++++++++++---------- 3 files changed, 96 insertions(+), 32 deletions(-) diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index 59945973f..28da089ad 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -12,15 +12,25 @@ mcl_vars.inventory_header = mcl_vars.gui_slots .. mcl_vars.gui_bg local mg_name = minetest.get_mapgen_setting("mg_name") local minecraft_height_limit = 256 if mg_name ~= "flat" then - mcl_vars.mg_overworld_min = -62 - mcl_vars.mg_overworld_max = mcl_vars.mg_overworld_min + minecraft_height_limit + --[[ Realm stacking (h is for height) + - Overworld (h>=256) + - Void (h>=1000) + - Realm Barrier (h=11), to allow escaping the End + - End (h>=256) + - Void (h>=1000) + - Nether (h=128) + - Void (h>=1000) + ]] - -- 1 flat bedrock layer with 4 rough layers above + -- Overworld + mcl_vars.mg_overworld_min = -62 + mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_bedrock_overworld_min + 4 mcl_vars.mg_lava_overworld_max = mcl_vars.mg_overworld_min + 10 mcl_vars.mg_lava = true mcl_vars.mg_bedrock_is_rough = true + else local ground = minetest.get_mapgen_setting("mgflat_ground_level") ground = tonumber(ground) @@ -33,13 +43,28 @@ else else mcl_vars.mg_overworld_min = ground - 3 end - mcl_vars.mg_overworld_max = mcl_vars.mg_overworld_min + minecraft_height_limit + mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min mcl_vars.mg_bedrock_overworld_max = mcl_vars.mg_bedrock_overworld_min mcl_vars.mg_lava = false mcl_vars.mg_bedrock_is_rough = false end +mcl_vars.mg_overworld_max = math.huge + +-- The Nether +mcl_vars.mg_nether_min = -29000 +mcl_vars.mg_nether_max = mcl_vars.mg_nether_min + 128 +mcl_vars.mg_bedrock_nether_bottom_min = mcl_vars.mg_nether_min +mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min + 4 +mcl_vars.mg_bedrock_nether_top_max = mcl_vars.mg_nether_max +mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max - 4 + +-- The End +mcl_vars.mg_end_min = mcl_vars.mg_nether_max + 2000 +mcl_vars.mg_end_max_official = mcl_vars.mg_end_min + minecraft_height_limit +mcl_vars.mg_end_max = mcl_vars.mg_overworld_min - 2000 + -- Set default stack sizes minetest.nodedef_default.stack_max = 64 minetest.craftitemdef_default.stack_max = 64 diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 2da93dd7d..95b9f7f6c 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -335,9 +335,23 @@ end -- 1st return value: true if pos is in void -- 2nd return value: true if it is in the deadly part of the void function mcl_util.is_in_void(pos) - local void, void_deadly - void = pos.y < mcl_vars.mg_overworld_min - void_deadly = pos.y < mcl_vars.mg_overworld_min - 64 + local void = + not ((pos.y < mcl_vars.mg_overworld_max and pos.y > mcl_vars.mg_overworld_min) or + (pos.y < mcl_vars.mg_nether_max and pos.y > mcl_vars.mg_nether_min) or + (pos.y < mcl_vars.mg_end_max and pos.y > mcl_vars.mg_end_min)) + + local void_deadly = false + local deadly_tolerance = 64 -- the player must be this many nodes “deep” into the void to be damaged + if void then + -- Overworld → Void → End → Void → Nether → Void + if pos.y < mcl_vars.mg_overworld_min and pos.y > mcl_vars.mg_end_max then + void_deadly = pos.y < mcl_vars.mg_overworld_min - deadly_tolerance + elseif pos.y < mcl_vars.mg_end_min and pos.y > mcl_vars.mg_nether_max then + void_deadly = pos.y < mcl_vars.mg_end_min - deadly_tolerance + elseif pos.y < mcl_vars.mg_nether_min then + void_deadly = pos.y < mcl_vars.mg_nether_min - deadly_tolerance + end + end return void, void_deadly end @@ -351,6 +365,10 @@ end function mcl_util.y_to_layer(y) if y >= mcl_vars.mg_overworld_min then return y - mcl_vars.mg_overworld_min, "overworld" + elseif y >= mcl_vars.mg_nether_min and y <= mcl_vars.mg_nether_max then + return y - mcl_vars.mg_nether_min, "nether" + elseif y >= mcl_vars.mg_end_min and y <= mcl_vars.mg_end_max then + return y - mcl_vars.mg_end_min, "end" else return nil, "void" end @@ -359,10 +377,15 @@ end -- Takes a Minecraft layer and a “dimension” name -- and returns the corresponding Y coordinate for -- MineClone 2. --- minecraft_dimension parameter is ignored at the moment --- TODO: Implement dimensions -function mcl_util.layer_to_y(layer, minecraft_dimension) - return layer + mcl_vars.mg_overworld_min +-- mc_dimension is one of "overworld", "nether", "end" (default: "overworld"). +function mcl_util.layer_to_y(layer, mc_dimension) + if mc_dimension == "overworld" or mc_dimension == nil then + return layer + mcl_vars.mg_overworld_min + elseif mc_dimension == "nether" then + return layer + mcl_vars.mg_nether_min + elseif mc_dimension == "end" then + return layer + mcl_vars.mg_end_min + end end -- Returns a on_place function for plants diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 4fc9b3293..159176c71 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1227,33 +1227,49 @@ minetest.register_on_generated(function(minp, maxp) local p_pos = area:index(x, y, z) local setdata = nil if mcl_vars.mg_bedrock_is_rough then - -- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer - -- This code assumes a bedrock height of 5 layers. - if y == BEDROCK_MAX then - -- 50% bedrock chance - if math.random(1,2) == 1 then setdata = c_bedrock end - elseif y == BEDROCK_MAX -1 then - -- 66.666...% - if math.random(1,3) <= 2 then setdata = c_bedrock end - elseif y == BEDROCK_MAX -2 then - -- 75% - if math.random(1,4) <= 3 then setdata = c_bedrock end - elseif y == BEDROCK_MAX -3 then - -- 90% - if math.random(1,10) <= 9 then setdata = c_bedrock end - elseif y == BEDROCK_MAX -4 then - -- 100% + local is_bedrock = function(y) + -- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer + -- This code assumes a bedrock height of 5 layers. + + local diff = mcl_vars.mg_bedrock_overworld_max - y -- Overworld bedrock + local ndiff1 = mcl_vars.mg_bedrock_nether_bottom_max - y -- Nether bedrock, bottom + local ndiff2 = mcl_vars.mg_bedrock_nether_top_max - y -- Nether bedrock, ceiling + + local top + if diff == 0 or ndiff1 == 0 or ndiff2 == 4 then + -- 50% bedrock chance + top = 2 + elseif diff == 1 or ndiff1 == 1 or ndiff2 == 3 then + -- 66.666...% + top = 3 + elseif diff == 2 or ndiff1 == 2 or ndiff2 == 2 then + -- 75% + top = 4 + elseif diff == 3 or ndiff1 == 3 or ndiff2 == 1 then + -- 90% + top = 10 + elseif diff == 4 or ndiff1 == 4 or ndiff2 == 0 then + -- 100% + return true + else + -- Not in bedrock layer + return false + end + + return math.random(1, top) <= top-1 + end + if is_bedrock(y) then setdata = c_bedrock - elseif y < BEDROCK_MIN and y > -1000 then + elseif mcl_util.is_in_void({x=x,y=y,z=z}) then setdata = c_void - elseif y > 1000 and y < 2000 then - setdata = c_stone end else -- Perfectly flat bedrock layer(s) - if y >= BEDROCK_MIN and y <= BEDROCK_MAX then + if (y >= mcl_vars.mg_bedrock_overworld_min and y <= mcl_vars.mg_bedrock_overworld_max) or + (y >= mcl_vars.mg_bedrock_nether_bottom_min or y <= mcl_vars.mg_bedrock_bottom_max) or + (y >= mcl_vars.mg_bedrock_nether_top_min or y <= mcl_vars.mg_bedrock_top_max) then setdata = c_bedrock - elseif y < BEDROCK_MIN and y > -1000 then + elseif mcl_util.is_in_void({x=x,y=y,z=z}) then setdata = c_void end end From 41f45d8c38191861e6c671931d0839c57efeb70a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Aug 2017 15:40:12 +0200 Subject: [PATCH 06/75] Update sky blackening when player's in void --- mods/PLAYER/mcl_playerplus/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 88cae8319..6517158a2 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -152,14 +152,14 @@ minetest.register_globalstep(function(dtime) end -- Apply black sky in the Void and deal Void damage - if pos.y < mcl_vars.mg_bedrock_overworld_max then + local void, void_deadly = mcl_util.is_in_void(pos) + if void then -- Player reached the void, set black sky box player:set_sky("#000000", "plain", nil, false) -- FIXME: Sky handling in MCL2 is held together with lots of duct tape. -- This only works beause weather_pack currently does not touch the sky for players below the height used for this check. -- There should be a real skybox API. end - local void, void_deadly = mcl_util.is_in_void(pos) if void_deadly then -- Player is deep into the void, deal void damage if player:get_hp() > 0 then From b7c12e82e4baf63e103d9e36dc255cf86ff9282c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Aug 2017 16:22:28 +0200 Subject: [PATCH 07/75] Fix basic Nether generation --- mods/MAPGEN/mcl_biomes/init.lua | 281 +++++++++++---------------- mods/MAPGEN/mcl_mapgen_core/init.lua | 4 +- 2 files changed, 113 insertions(+), 172 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index a84ad616d..c0b8cf3de 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -13,8 +13,8 @@ local function register_classic_superflat_biome() node_filler = "mcl_core:dirt", depth_filler = 3, node_stone = "mcl_core:dirt", - y_min = -512, - y_max = 512, + y_min = mcl_vars.mg_overworld_min - 512, + y_max = mcl_vars.mg_overworld_max, heat_point = 50, humidity_point = 50, }) @@ -23,6 +23,7 @@ end -- All mapgens except mgv6, flat and singlenode local function register_biomes() + local upper_limit = mcl_vars.mg_overworld_max --[[ OVERWORLD ]] -- Icesheet @@ -54,7 +55,7 @@ local function register_biomes() depth_filler = 3, node_water_top = "mcl_core:ice", depth_water_top = 10, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = -9, heat_point = 0, humidity_point = 73, @@ -95,7 +96,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:gravel", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = -4, heat_point = 0, humidity_point = 40, @@ -124,7 +125,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:stone", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = 1, heat_point = 26, humidity_point = 72, @@ -155,7 +156,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:stone", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = 4, heat_point = 13, humidity_point = 79, @@ -200,7 +201,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:stone", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = 0, heat_point = 26, humidity_point = 45, @@ -244,7 +245,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:stone", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = 0, heat_point = 47, humidity_point = 73, --was 70 @@ -289,7 +290,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:stone", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = -2, heat_point = 33, humidity_point = 44, --was 68 @@ -321,7 +322,7 @@ local function register_biomes() node_stone = "mcl_core:stone", node_riverbed = "mcl_core:stone", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = 0, heat_point = 64, humidity_point = 37, --was 16 @@ -353,7 +354,7 @@ local function register_biomes() node_stone = "mcl_core:stone", node_riverbed = "mcl_core:stone", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = 4, heat_point = 57, humidity_point = 0, --was 0 @@ -384,7 +385,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:stone", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = 4, heat_point = 26, humidity_point = 0, --was 0 @@ -399,7 +400,7 @@ local function register_biomes() depth_filler = 1, node_stone = "mcl_colorblocks:hardened_clay_orange", y_min = -35, - y_max = 31000, + y_max = upper_limit, heat_point = 88, humidity_point = 20, --was 40 }) @@ -442,7 +443,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:stone", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = -2, heat_point = 50, humidity_point = 46, --was 42 @@ -486,7 +487,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:sand", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = -2, heat_point = 90, humidity_point = 91, @@ -515,7 +516,7 @@ local function register_biomes() depth_filler = 3, node_riverbed = "mcl_core:coarse_dirt", depth_riverbed = 2, - y_min = -112, + y_min = mcl_vars.mg_overworld_min, y_max = 0, heat_point = 99, humidity_point = 99, @@ -533,7 +534,7 @@ local function register_biomes() node_riverbed = "mcl_core:stone", depth_riverbed = 2, y_min = 56, - y_max = 900, + y_max = upper_limit, heat_point = -13, humidity_point = 30, }) @@ -543,8 +544,8 @@ local function register_biomes() -- Underground in Overworld minetest.register_biome({ name = "underground", - y_min = -31000, - y_max = -10000, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_util.y_to_layer(61), heat_point = 50, humidity_point = 50, }) @@ -553,98 +554,42 @@ local function register_biomes() --[[ REALMS ]] -- TODO: Make these work in v6, too. - -- Separation void 1 - minetest.register_biome({ - name = "void_1", - node_stone = "mcl_core:void", - y_min = -2989, - y_max = -82, - heat_point = 50, - humidity_point = 50, - }) - --[[ THE NETHER ]] - minetest.register_biome({ - name = "nether_roof", - node_stone = "mcl_core:bedrock", - y_min = -3000, - y_max = -2990, - heat_point = 50, - humidity_point = 50, - }) minetest.register_biome({ name = "nether", node_filler = "mcl_nether:netherrack", - node_stone = "mcl_nether:netherrack", - y_min = -3369, - y_max = -3001, + node_stone = "mcl_nether:netherrack", + y_min = mcl_vars.mg_nether_min, + -- FIXME: For some reason the Nether stops generating early if this constant is not added. + -- Figure out why. + y_max = mcl_vars.mg_nether_max + 80, heat_point = 50, humidity_point = 50, }) - -- TODO: Different lava algorithm - minetest.register_biome({ - name = "nether_lava", - node_filler = "mcl_nether:nether_lava_source", - node_stone = "mcl_nether:nether_lava_source", - y_min = -3399, - y_max = -3370, - heat_point = 50, - humidity_point = 50, - }) - - minetest.register_biome({ - name = "nether_floor", - node_filler = "mcl_core:bedrock", - node_stone = "mcl_core:bedrock", - y_min = -3430, - y_max = -3400, - heat_point = 50, - humidity_point = 50, - }) - - -- Separation void 2 - minetest.register_biome({ - name = "void_2", - node_stone = "mcl_core:void", - y_min = -4900, - y_max = -3431, - heat_point = 50, - humidity_point = 50, - }) - - + -- TODO: Giant Nether lava seas --[[ The End ]] minetest.register_biome({ name = "end", node_filler = "mcl_end:end_stone", - node_stone = "air", - y_min = -6200, - y_max = -6000, + node_stone = "mcl_end:end_stone", + y_min = mcl_vars.mg_end_min, + y_max = mcl_vars.mg_end_max, heat_point = 50, humidity_point = 50, }) - -- Separation void 3 - minetest.register_biome({ - name = "void_3", - node_stone = "mcl_core:void", - y_min = -6700, - y_max = -6201, - heat_point = 50, - humidity_point = 50, - }) - - -- Realm barrier to separate the top of the End realm with the separation void + -- Realm barrier to separate the top of the End realm from the void below the Overworld + -- TODO: Implement differently minetest.register_biome({ name = "end_barrier", node_filler = "mcl_core:realm_barrier", node_stone = "mcl_core:realm_barrier", - y_min = -6800, - y_max = -6701, + y_min = mcl_vars.mg_end_max + 1, + y_max = mcl_vars.mg_end_max + 12, heat_point = 50, humidity_point = 50, }) @@ -899,26 +844,23 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:quartz_ore", - --wherein = "mcl_nether:rack", - wherein = {"mcl_nether:netherrack","mcl_core:stone"}, + wherein = {"mcl_nether:netherrack"}, clust_scarcity = 10*10*10, clust_num_ores = 6, clust_size = 5, - y_min = -3390, - y_max = -3000, - --y_max = NETHER_DEPTH, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, }) -- Soul sand minetest.register_ore({ ore_type = "sheet", ore = "mcl_nether:soul_sand", - wherein = {"mcl_nether:netherrack", "mcl_core:lava_source", - "mcl_core:redsandstone"}, + wherein = {"mcl_nether:netherrack"}, clust_scarcity = 13 * 13 * 13, clust_size = 5, - y_min = -3390, - y_max = -3000, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -934,12 +876,11 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "sheet", ore = "mcl_nether:magma", - wherein = {"mcl_nether:netherrack", "mcl_core:lava_source", - "mcl_core:redsandstone"}, + wherein = {"mcl_nether:netherrack", "mcl_core:lava_source"}, clust_scarcity = 13 * 13 * 13, clust_size = 5, - y_min = -3390, - y_max = -3000, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -957,11 +898,11 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "blob", ore = "mcl_nether:glowstone", - wherein = {"mcl_nether:netherrack", "mcl_portals:nether_air"}, + wherein = {"mcl_nether:netherrack"}, clust_scarcity = 26 * 26 * 26, clust_size = 5, - y_min = -3390, - y_max = -3000, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -981,8 +922,8 @@ local function register_biomelike_ores() wherein = {"mcl_nether:netherrack"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = -3390, - y_max = -3000, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -999,12 +940,12 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:nether_lava_source", - wherein = "mcl_nether:netherrack", - clust_scarcity =12 *12 * 12, + wherein = {"mcl_nether:netherrack", "air"}, + clust_scarcity = 12 *12 * 12, clust_num_ores = 2, clust_size = 2, - y_min = -3390, - y_max = -3000, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_min + 15, }) @@ -1016,20 +957,21 @@ local function register_biomelike_ores() clust_scarcity =12 *22 * 12, clust_num_ores = 5, clust_size = 5, - y_min = -3390, - y_max = -3000, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, }) -- Generate holes in Nether + -- TODO: Is this a good idea? minetest.register_ore({ ore_type = "sheet", ore = "air", - wherein ={"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack"}, clust_scarcity = 1, clust_num_ores = 32, clust_size = 10, - y_min = -3390, - y_max = -3000, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, noise_threshold = 0.2, noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} }) @@ -1043,11 +985,11 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "blob", ore = "mcl_end:end_stone", - wherein = {"mcl_core:void", "air"}, + wherein = {"air", "mcl_core:stone"}, clust_scarcity = 30 * 30 * 30, clust_size = 17, - y_min = -5750, - y_max = -5701, + y_min = mcl_vars.mg_end_min, + y_max = mcl_vars.mg_end_max, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -1062,11 +1004,11 @@ local function register_biomelike_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_end:end_stone", - wherein = {"mcl_core:void", "air"}, + wherein = {"air", "mcl_core:stone"}, clust_scarcity = 30 * 30 * 30, clust_size = 34, - y_min = -5780, - y_max = -5711, + y_min = mcl_vars.mg_end_min, + y_max = mcl_vars.mg_end_max, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -1479,54 +1421,6 @@ local function register_decorations() y_max = 31000, decoration = "mcl_core:mossycobble", }) - - --Nether Decorations - --Red Mushroom - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_nether:netherrack"}, - sidelen = 80, - fill_ratio = 0.01, - biomes = {"nether"}, - y_min = -6000, - y_max = 31000, - decoration = "mcl_mushrooms:mushroom_red", - }) - --Brown Mushroom - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_nether:netherrack"}, - sidelen = 80, - fill_ratio = 0.01, - biomes = {"nether"}, - y_min = -6000, - y_max = 31000, - decoration = "mcl_mushrooms:mushroom_brown", - }) - - --Eternal Fire - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_nether:netherrack"}, - sidelen = 16, - fill_ratio = 0.2, - biomes = {"nether"}, - y_min = -6000, - y_max = 31000, - decoration = "mcl_fire:eternal_fire", - }) - -- Nether Wart - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_nether:soul_sand"}, - sidelen = 80, - fill_ratio = 0.1, - biomes = {"nether"}, - y_min = -6000, - y_max = 31000, - decoration = "mcl_nether:nether_wart", - }) - -- Cactus minetest.register_decoration({ @@ -1605,6 +1499,55 @@ local function register_decorations() height = 1, }) + + --[[ NETHER decorations ]] + + -- Red Mushroom + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack"}, + sidelen = 80, + fill_ratio = 0.01, + biomes = {"nether"}, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + decoration = "mcl_mushrooms:mushroom_red", + }) + -- Brown Mushroom + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack"}, + sidelen = 80, + fill_ratio = 0.01, + biomes = {"nether"}, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + decoration = "mcl_mushrooms:mushroom_brown", + }) + + -- Eternal Fire + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:netherrack"}, + sidelen = 16, + fill_ratio = 0.2, + biomes = {"nether"}, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + decoration = "mcl_fire:eternal_fire", + }) + -- Nether Wart + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_nether:soul_sand"}, + sidelen = 80, + fill_ratio = 0.1, + biomes = {"nether"}, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + decoration = "mcl_nether:nether_wart", + }) + end diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 159176c71..3f9699079 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1050,9 +1050,7 @@ end) -- Generate bedrock layer or layers -local BEDROCK_MIN = mcl_vars.mg_bedrock_overworld_min -local BEDROCK_MAX = mcl_vars.mg_bedrock_overworld_max -local GEN_MAX = mcl_vars.mg_lava_overworld_max or BEDROCK_MAX +local GEN_MAX = mcl_vars.mg_lava_overworld_max or mcl_vars.mg_bedrock_overworld_max -- Buffer for LuaVoxelManip local lvm_buffer = {} From d90b59c9188d7c6d9a4a220ff14b34a3c2a8da5f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Aug 2017 17:01:16 +0200 Subject: [PATCH 08/75] Tweak Nether ore and lava generation --- mods/CORE/mcl_init/init.lua | 1 + mods/MAPGEN/mcl_biomes/init.lua | 98 ++++++++++++---------------- mods/MAPGEN/mcl_mapgen_core/init.lua | 10 ++- 3 files changed, 51 insertions(+), 58 deletions(-) diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index 28da089ad..87918932a 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -59,6 +59,7 @@ mcl_vars.mg_bedrock_nether_bottom_min = mcl_vars.mg_nether_min mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min + 4 mcl_vars.mg_bedrock_nether_top_max = mcl_vars.mg_nether_max mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max - 4 +mcl_vars.mg_lava_nether_max = mcl_vars.mg_nether_min + 31 -- The End mcl_vars.mg_end_min = mcl_vars.mg_nether_max + 2000 diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index c0b8cf3de..1bc21ab55 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -554,7 +554,6 @@ local function register_biomes() --[[ REALMS ]] -- TODO: Make these work in v6, too. - --[[ THE NETHER ]] minetest.register_biome({ @@ -565,34 +564,24 @@ local function register_biomes() -- FIXME: For some reason the Nether stops generating early if this constant is not added. -- Figure out why. y_max = mcl_vars.mg_nether_max + 80, - heat_point = 50, - humidity_point = 50, + heat_point = 100, + humidity_point = 0, }) - -- TODO: Giant Nether lava seas - --[[ The End ]] + --[[ THE END ]] minetest.register_biome({ name = "end", node_filler = "mcl_end:end_stone", node_stone = "mcl_end:end_stone", y_min = mcl_vars.mg_end_min, - y_max = mcl_vars.mg_end_max, + -- FIXME: For some reason the Nether stops generating early if this constant is not added. + -- Figure out why. + y_max = mcl_vars.mg_end_max + 80, heat_point = 50, humidity_point = 50, }) - -- Realm barrier to separate the top of the End realm from the void below the Overworld - -- TODO: Implement differently - minetest.register_biome({ - name = "end_barrier", - node_filler = "mcl_core:realm_barrier", - node_stone = "mcl_core:realm_barrier", - y_min = mcl_vars.mg_end_max + 1, - y_max = mcl_vars.mg_end_max + 12, - heat_point = 50, - humidity_point = 50, - }) end @@ -841,17 +830,6 @@ local function register_biomelike_ores() --[[ NETHER GENERATION ]] - minetest.register_ore({ - ore_type = "scatter", - ore = "mcl_nether:quartz_ore", - wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 10*10*10, - clust_num_ores = 6, - clust_size = 5, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - }) - -- Soul sand minetest.register_ore({ ore_type = "sheet", @@ -860,7 +838,7 @@ local function register_biomelike_ores() clust_scarcity = 13 * 13 * 13, clust_size = 5, y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, + y_max = mcl_util.layer_to_y(64, "nether"), noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -874,34 +852,24 @@ local function register_biomelike_ores() -- Magma blocks minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_nether:magma", - wherein = {"mcl_nether:netherrack", "mcl_core:lava_source"}, - clust_scarcity = 13 * 13 * 13, - clust_size = 5, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.1, - spread = {x = 5, y = 5, z = 5}, - seed = 2316, - octaves = 1, - persist = 0.0 - }, + ore_type = "blob", + ore = "mcl_nether:magma", + wherein = {"mcl_nether:netherrack"}, + clust_scarcity = 15*15*15, + clust_num_ores = 33, + clust_size = 5, + y_min = mcl_util.layer_to_y(23, "nether"), + y_max = mcl_util.layer_to_y(37, "nether"), }) - -- Glowstone - minetest.register_ore({ ore_type = "blob", ore = "mcl_nether:glowstone", wherein = {"mcl_nether:netherrack"}, clust_scarcity = 26 * 26 * 26, clust_size = 5, - y_min = mcl_vars.mg_nether_min, + y_min = mcl_vars.mg_lava_nether_max + 10, y_max = mcl_vars.mg_nether_max, noise_threshold = 0.0, noise_params = { @@ -914,21 +882,42 @@ local function register_biomelike_ores() }, }) - -- Gravel + -- Nether quartz + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_nether:quartz_ore", + wherein = {"mcl_nether:netherrack"}, + clust_scarcity = 850, + clust_num_ores = 4, -- MC cluster amount: 4-10 + clust_size = 3, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + }) + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_nether:quartz_ore", + wherein = {"mcl_nether:netherrack"}, + clust_scarcity = 1650, + clust_num_ores = 8, -- MC cluster amount: 4-10 + clust_size = 4, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + }) + -- Gravel (Nether) minetest.register_ore({ ore_type = "sheet", ore = "mcl_core:gravel", wherein = {"mcl_nether:netherrack"}, clust_scarcity = 16 * 16 * 16, clust_size = 5, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, + y_min = mcl_util.layer_to_y(63, "nether"), + y_max = mcl_util.layer_to_y(65, "nether"), noise_threshold = 0.0, noise_params = { offset = 0.5, scale = 0.2, - spread = {x = 5, y = 5, z = 5}, + spread = {x = 5, y = 1, z = 5}, seed = 766, octaves = 1, persist = 0.0 @@ -936,11 +925,10 @@ local function register_biomelike_ores() }) -- Lava in the Nether - minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack", "air"}, + wherein = {"mcl_nether:netherrack"}, clust_scarcity = 12 *12 * 12, clust_num_ores = 2, clust_size = 2, @@ -949,7 +937,7 @@ local function register_biomelike_ores() }) - --Fire in the Nether + -- Fire in the Nether minetest.register_ore({ ore_type = "scatter", ore = "mcl_fire:eternal_fire", diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 3f9699079..6e2dda738 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1215,6 +1215,7 @@ minetest.register_on_generated(function(minp, maxp) local c_bedrock = minetest.get_content_id("mcl_core:bedrock") local c_void = minetest.get_content_id("mcl_core:void") local c_lava = minetest.get_content_id("mcl_core:lava_source") + local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") local c_air = minetest.get_content_id("air") local max_y = math.min(maxp.y, GEN_MAX) @@ -1275,11 +1276,14 @@ minetest.register_on_generated(function(minp, maxp) if setdata then data[p_pos] = setdata lvm_used = true - elseif mcl_vars.mg_lava and y <= mcl_vars.mg_lava_overworld_max and y >= mcl_vars.mg_overworld_min then - if data[p_pos] == c_air then + elseif mcl_vars.mg_lava and data[p_pos] == c_air then + if y <= mcl_vars.mg_lava_overworld_max and y >= mcl_vars.mg_overworld_min then data[p_pos] = c_lava + lvm_used = true + elseif y <= mcl_vars.mg_lava_nether_max and y >= mcl_vars.mg_nether_min then + data[p_pos] = c_nether_lava + lvm_used = true end - lvm_used = true end end end From ffef7535677670b35279d2a598ea867b3784d9ef Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Aug 2017 17:08:33 +0200 Subject: [PATCH 09/75] Add lava springs into the Nether --- mods/MAPGEN/mcl_biomes/init.lua | 41 +++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 1bc21ab55..dbaf05b61 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -924,18 +924,49 @@ local function register_biomelike_ores() }, }) - -- Lava in the Nether + -- Lava springs in the Nether minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:nether_lava_source", wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 12 *12 * 12, - clust_num_ores = 2, - clust_size = 2, + clust_scarcity = 500, + clust_num_ores = 1, + clust_size = 1, y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_min + 15, + y_max = mcl_vars.mg_lava_nether_max + 1, }) + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_nether:nether_lava_source", + wherein = {"mcl_nether:netherrack"}, + clust_scarcity = 1000, + clust_num_ores = 1, + clust_size = 1, + y_min = mcl_vars.mg_lava_nether_max + 2, + y_max = mcl_vars.mg_lava_nether_max + 12, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_nether:nether_lava_source", + wherein = {"mcl_nether:netherrack"}, + clust_scarcity = 2000, + clust_num_ores = 1, + clust_size = 1, + y_min = mcl_vars.mg_lava_nether_max + 13, + y_max = mcl_vars.mg_lava_nether_max + 48, + }) + minetest.register_ore({ + ore_type = "scatter", + ore = "mcl_nether:nether_lava_source", + wherein = {"mcl_nether:netherrack"}, + clust_scarcity = 3500, + clust_num_ores = 1, + clust_size = 1, + y_min = mcl_vars.mg_lava_nether_max + 49, + y_max = mcl_vars.mg_nether_max, + }) -- Fire in the Nether minetest.register_ore({ From c429d1af83286e58585d4c474265f272f5bdd996 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Aug 2017 17:31:28 +0200 Subject: [PATCH 10/75] Improve gravel generation in Nether --- mods/MAPGEN/mcl_biomes/init.lua | 68 ++++++++++++++++----------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index dbaf05b61..4dc6e25c1 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -829,6 +829,18 @@ local function register_biomelike_ores() --[[ NETHER GENERATION ]] + -- Generate holes in Nether + -- TODO: Is this a good idea? + minetest.register_ore({ + ore_type = "puff", + ore = "air", + wherein = {"mcl_nether:netherrack"}, + clust_scarcity = 666, + clust_size = 4, + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.60} + }) -- Soul sand minetest.register_ore({ @@ -882,6 +894,26 @@ local function register_biomelike_ores() }, }) + -- Gravel (Nether) + minetest.register_ore({ + ore_type = "sheet", + ore = "mcl_core:gravel", + wherein = {"mcl_nether:netherrack"}, + column_height_min = 1, + column_height_max = 1, + y_min = mcl_util.layer_to_y(63, "nether"), + y_max = mcl_util.layer_to_y(65, "nether"), + noise_threshold = 0.0, + noise_params = { + offset = 0.0, + scale = 0.2, + spread = {x = 50, y = 50, z = 50}, + seed = 766, + octaves = 1, + persist = 0.6, + }, + }) + -- Nether quartz minetest.register_ore({ ore_type = "scatter", @@ -904,26 +936,6 @@ local function register_biomelike_ores() y_max = mcl_vars.mg_nether_max, }) - -- Gravel (Nether) - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:gravel", - wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 16 * 16 * 16, - clust_size = 5, - y_min = mcl_util.layer_to_y(63, "nether"), - y_max = mcl_util.layer_to_y(65, "nether"), - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.2, - spread = {x = 5, y = 1, z = 5}, - seed = 766, - octaves = 1, - persist = 0.0 - }, - }) - -- Lava springs in the Nether minetest.register_ore({ ore_type = "scatter", @@ -980,22 +992,6 @@ local function register_biomelike_ores() y_max = mcl_vars.mg_nether_max, }) - -- Generate holes in Nether - -- TODO: Is this a good idea? - minetest.register_ore({ - ore_type = "sheet", - ore = "air", - wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 1, - clust_num_ores = 32, - clust_size = 10, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - noise_threshold = 0.2, - noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70} - }) - - --[[ THE END ]] -- Generate fake End From f9e880e21093c4e4db0abf8ab0a58d9616222c16 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Aug 2017 18:49:46 +0200 Subject: [PATCH 11/75] Make buckets work correctly in the Nether * Water bucket can't place water in Nether * Empty bucket can take Nether lava * Lava bucket places Nether lava in Nether --- mods/ITEMS/mcl_buckets/init.lua | 115 +++++++++++++++++++------------- 1 file changed, 68 insertions(+), 47 deletions(-) diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index fe3ee332d..3d00f3dcb 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -1,8 +1,6 @@ -- Minetest 0.4 mod: bucket -- See README.txt for licensing and other information. -local LIQUID_MAX = 8 --The number of water levels when liquid_finite is enabled - minetest.register_alias("bucket:bucket_empty", "mcl_buckets:bucket_empty") minetest.register_alias("bucket:bucket_water", "mcl_buckets:bucket_water") minetest.register_alias("bucket:bucket_lava", "mcl_buckets:bucket_lava") @@ -39,18 +37,29 @@ local sound_take = function(itemname, pos) end -- Register a new liquid --- source = name of the source node --- flowing = name of the flowing node --- itemname = name of the new bucket item (or nil if liquid is not takeable) +-- source_place = a string or function. +-- * string: name of the node to place +-- * function(pos): will returns name of the node to place with pos being the placement position +-- source_take = table of liquid source node names to take +-- itemname = itemstring of the new bucket item (or nil if liquid is not takeable) -- inventory_image = texture of the new bucket item (ignored if itemname == nil) --- This function can be called from any mod (that depends on bucket). -function mcl_buckets.register_liquid(source, flowing, itemname, inventory_image, name, longdesc, usagehelp) - mcl_buckets.liquids[source] = { - source = source, - flowing = flowing, - itemname = itemname, - } - mcl_buckets.liquids[flowing] = mcl_buckets.liquids[source] +-- name = user-visible bucket description +-- longdesc = long explanatory description (for help) +-- usagehelp = short usage explanation (for help) +-- extra_check = optional function(pos) which can returns false to avoid placing the liquid +-- +-- This function can be called from any mod (which depends on this one) +function mcl_buckets.register_liquid(source_place, source_take, itemname, inventory_image, name, longdesc, usagehelp, extra_check) + for i=1, #source_take do + mcl_buckets.liquids[source_take[i]] = { + source_place = source_place, + source_take = source_take[i], + itemname = itemname, + } + if type(source_place) == "string" then + mcl_buckets.liquids[source_place] = mcl_buckets.liquids[source_take[i]] + end + end if itemname ~= nil then minetest.register_craftitem(itemname, { @@ -67,43 +76,38 @@ function mcl_buckets.register_liquid(source, flowing, itemname, inventory_image, end local node = minetest.get_node(pointed_thing.under) + local place_pos = pointed_thing.under local nn = node.name -- Call on_rightclick if the pointed node defines it if user and not user:get_player_control().sneak then if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].on_rightclick then - return minetest.registered_nodes[nn].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack + return minetest.registered_nodes[nn].on_rightclick(place_pos, node, user, itemstack) or itemstack end end - local place_liquid = function(pos, node, source, flowing, fullness) - sound_place(source, pos) - if math.floor(fullness/128) == 1 or (not minetest.settings:get_bool("liquid_finite")) then - minetest.add_node(pos, {name=source, param2=fullness}) - return - elseif node.name == flowing then - fullness = fullness + node.param2 - elseif node.name == source then - fullness = LIQUID_MAX - end - - if fullness >= LIQUID_MAX then - minetest.add_node(pos, {name=source, param2=LIQUID_MAX}) - else - minetest.add_node(pos, {name=flowing, param2=fullness}) - end + local place_liquid = function(pos, itemstring) + local fullness = minetest.registered_nodes[itemstring].liquid_range + sound_place(itemstring, pos) + minetest.add_node(pos, {name=itemstring, param2=fullness}) end + local node_place + if type(source_place) == "function" then + node_place = source_place(place_pos) + else + node_place = source_place + end -- Check if pointing to a buildable node - local fullness = tonumber(itemstack:get_metadata()) - if not fullness then fullness = LIQUID_MAX end local item = itemstack:get_name() - if item == "mcl_buckets:bucket_water" and + if extra_check and extra_check(place_pos) == false then + -- Fail placement of liquid + elseif item == "mcl_buckets:bucket_water" and (nn == "mcl_cauldrons:cauldron" or nn == "mcl_cauldrons:cauldron_1" or nn == "mcl_cauldrons:cauldron_2") then -- Put water into cauldron - minetest.set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron_3"}) + minetest.set_node(place_pos, {name="mcl_cauldrons:cauldron_3"}) sound_place("mcl_core:water_source", pos) elseif item == "mcl_buckets:bucket_water" and nn == "mcl_cauldrons:cauldron_3" then @@ -111,12 +115,12 @@ function mcl_buckets.register_liquid(source, flowing, itemname, inventory_image, elseif minetest.registered_nodes[nn] and minetest.registered_nodes[nn].buildable_to then -- buildable; replace the node local pns = user:get_player_name() - if minetest.is_protected(pointed_thing.under, pns) then + if minetest.is_protected(place_pos, pns) then return itemstack end - place_liquid(pointed_thing.under, node, source, flowing, fullness) - if mod_doc and doc.entry_exists("nodes", source) then - doc.mark_entry_as_revealed(user:get_player_name(), "nodes", source) + place_liquid(place_pos, node_place) + if mod_doc and doc.entry_exists("nodes", node_place) then + doc.mark_entry_as_revealed(user:get_player_name(), "nodes", node_place) end else -- not buildable to; place the liquid above @@ -127,9 +131,9 @@ function mcl_buckets.register_liquid(source, flowing, itemname, inventory_image, if minetest.is_protected(pointed_thing.above, pn) then return itemstack end - place_liquid(pointed_thing.above, node, source, flowing, fullness) - if mod_doc and doc.entry_exists("nodes", source) then - doc.mark_entry_as_revealed(user:get_player_name(), "nodes", source) + place_liquid(pointed_thing.above, node_place) + if mod_doc and doc.entry_exists("nodes", node_place) then + doc.mark_entry_as_revealed(user:get_player_name(), "nodes", node_place) end else -- do not remove the bucket with the liquid @@ -188,8 +192,7 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { -- Check if pointing to a liquid source liquiddef = mcl_buckets.liquids[nn] local new_bucket - if liquiddef ~= nil and liquiddef.itemname ~= nil and (nn == liquiddef.source or - (nn == liquiddef.flowing and minetest.settings:get_bool("liquid_finite"))) then + if liquiddef ~= nil and liquiddef.itemname ~= nil and (nn == liquiddef.source_take) then -- Fill bucket, but not in Creative Mode if not minetest.settings:get_bool("creative_mode") then @@ -234,19 +237,37 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { }) if mod_mcl_core then + -- Water bucket mcl_buckets.register_liquid( "mcl_core:water_source", - "mcl_core:water_flowing", + {"mcl_core:water_source"}, "mcl_buckets:bucket_water", "bucket_water.png", "Water Bucket", "A bucket can be used to collect and release liquids. This one is filled with water.", - "Right-click on any block to empty the bucket and put a water source on this spot." + "Right-click on any block to empty the bucket and put a water source on this spot.", + function(pos) + local _, dim = mcl_util.y_to_layer(pos.y) + if dim == "nether" then + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}) + return false + else + return true + end + end ) + -- Lava bucket mcl_buckets.register_liquid( - "mcl_core:lava_source", - "mcl_core:lava_flowing", + function(pos) + local _, dim = mcl_util.y_to_layer(pos.y) + if dim == "nether" then + return "mcl_nether:nether_lava_source" + else + return "mcl_core:lava_source" + end + end, + {"mcl_core:lava_source", "mcl_nether:nether_lava_source"}, "mcl_buckets:bucket_lava", "bucket_lava.png", "Lava Bucket", From 6e93424f032144c9a98886d38692391bf3ac8286 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Aug 2017 18:56:39 +0200 Subject: [PATCH 12/75] Fix broken Overworld --- mods/CORE/mcl_init/init.lua | 2 +- mods/MAPGEN/mcl_biomes/init.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index 87918932a..ebf106e19 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -50,7 +50,7 @@ else mcl_vars.mg_bedrock_is_rough = false end -mcl_vars.mg_overworld_max = math.huge +mcl_vars.mg_overworld_max = 31000 -- The Nether mcl_vars.mg_nether_min = -29000 diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 4dc6e25c1..90cd3e15a 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -545,7 +545,7 @@ local function register_biomes() minetest.register_biome({ name = "underground", y_min = mcl_vars.mg_overworld_min, - y_max = mcl_util.y_to_layer(61), + y_max = mcl_util.layer_to_y(61), heat_point = 50, humidity_point = 50, }) From 895fc7d757f7c341d9e78812fba2d544eaf03447 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 16 Aug 2017 22:08:17 +0200 Subject: [PATCH 13/75] Update mobs_mc and update gameconfig This updates and fixes mob spawn height for new realms. Also: Small zombie pigman size fixed. --- mods/ENTITIES/mobs_mc/0_gameconfig.lua | 23 +++++++++++++++++-- mods/ENTITIES/mobs_mc/bat.lua | 2 +- mods/ENTITIES/mobs_mc/blaze.lua | 4 ++-- mods/ENTITIES/mobs_mc/chicken.lua | 2 +- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 5 ++-- mods/ENTITIES/mobs_mc/creeper.lua | 2 +- mods/ENTITIES/mobs_mc/enderman.lua | 11 +++++---- mods/ENTITIES/mobs_mc/ghast.lua | 4 ++-- mods/ENTITIES/mobs_mc/guardian.lua | 2 +- mods/ENTITIES/mobs_mc/guardian_elder.lua | 2 +- mods/ENTITIES/mobs_mc/horse.lua | 5 ++-- mods/ENTITIES/mobs_mc/llama.lua | 2 +- mods/ENTITIES/mobs_mc/ocelot.lua | 5 ++-- mods/ENTITIES/mobs_mc/parrot.lua | 2 +- mods/ENTITIES/mobs_mc/pig.lua | 2 +- mods/ENTITIES/mobs_mc/polar_bear.lua | 6 +---- mods/ENTITIES/mobs_mc/rabbit.lua | 3 +++ mods/ENTITIES/mobs_mc/sheep.lua | 2 +- mods/ENTITIES/mobs_mc/shulker.lua | 7 +----- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 11 ++++++--- mods/ENTITIES/mobs_mc/skeleton_wither.lua | 3 ++- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 24 ++++++++++++-------- mods/ENTITIES/mobs_mc/spider.lua | 3 +-- mods/ENTITIES/mobs_mc/squid.lua | 2 +- mods/ENTITIES/mobs_mc/villager.lua | 3 +-- mods/ENTITIES/mobs_mc/villager_zombie.lua | 5 +--- mods/ENTITIES/mobs_mc/witch.lua | 2 +- mods/ENTITIES/mobs_mc/wolf.lua | 2 +- mods/ENTITIES/mobs_mc/zombie.lua | 9 ++++---- mods/ENTITIES/mobs_mc/zombiepig.lua | 12 +++++----- mods/ENTITIES/mobs_mc_gameconfig/depends.txt | 1 + mods/ENTITIES/mobs_mc_gameconfig/init.lua | 20 ++++++++++++++++ 32 files changed, 113 insertions(+), 75 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc_gameconfig/depends.txt diff --git a/mods/ENTITIES/mobs_mc/0_gameconfig.lua b/mods/ENTITIES/mobs_mc/0_gameconfig.lua index 692f6245d..410719f67 100644 --- a/mods/ENTITIES/mobs_mc/0_gameconfig.lua +++ b/mods/ENTITIES/mobs_mc/0_gameconfig.lua @@ -249,8 +249,9 @@ mobs_mc.spawn = { desert = { "default:desert_sand", "group:sand" }, jungle = { "default:dirt_with_rainforest_litter", "default:jungleleaves", "default:junglewood", "mcl_core:jungleleaves", "mcl_core:junglewood" }, snow = { "default:snow", "default:snowblock", "default:dirt_with_snow" }, - end_city = { "default:cobble", "mcl_end:purpur_block", "mcl_end:end_stone", "mcl_portals:void"}, + end_city = { "default:sandstonebrick", "mcl_end:purpur_block", "mcl_end:end_stone" }, wolf = { mobs_mc.items.grass_block, "default:dirt_with_rainforest_litter", "default:dirt", "default:dirt_with_snow", "default:snow", "default:snowblock" }, + village = { "mg_villages:road" }, -- These probably don't need overrides mushroom_island = { mobs_mc.items.mycelium, "mcl_core:mycelium" }, @@ -260,13 +261,31 @@ mobs_mc.spawn = { water = { mobs_mc.items.water_source, "mcl_core:water_source", "default:water_source" }, } +-- This table contains important spawn height references for the mob spawn height. +-- Please base your mob spawn height on these numbers to keep things clean. +mobs_mc.spawn_height = { + water = tonumber(minetest.setting_get("water_level")) or 0, -- Water level in the Overworld + + -- Overworld boundaries (inclusive) + overworld_min = -2999, + overworld_max = 31000, + + -- Nether boundaries (inclusive) + nether_min = -3369, + nether_max = -3000, + + -- End boundaries (inclusive) + end_min = -6200, + end_max = -6000, +} + mobs_mc.misc = { shears_wear = 276, -- Wear to add per shears usage (238 uses) } -- Item name overrides from mobs_mc_gameconfig (if present) if minetest.get_modpath("mobs_mc_gameconfig") and mobs_mc.override then - local tables = {"items", "follow", "replace", "spawn", "misc"} + local tables = {"items", "follow", "replace", "spawn", "spawn_height", "misc"} for t=1, #tables do local tbl = tables[t] if mobs_mc.override[tbl] then diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index 5de504f84..5e6b9aa97 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -54,7 +54,7 @@ else end -- Spawn on solid blocks at or below Sea level and the selected light level -mobs:spawn_specific("mobs_mc:bat", mobs_mc.spawn.solid,{"air"},0, maxlight, 20, 5000, 2, -500, 0) +mobs:spawn_specific("mobs_mc:bat", mobs_mc.spawn.solid, {"air"}, 0, maxlight, 20, 5000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water-1) -- spawn eggs diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 767d5760f..3af101055 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -71,8 +71,8 @@ mobs:register_mob("mobs_mc:blaze", { blood_amount = 0, }) -mobs:register_spawn("mobs_mc:blaze", mobs_mc.spawn.nether_fortress, minetest.LIGHT_MAX+1, 0, 5000, 1, -1000, true) - +mobs:spawn_specific("mobs_mc:blaze", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 5000, 3, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) + -- Blaze fireball mobs:register_arrow("mobs_mc:blaze_fireball", { visual = "sprite", diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index 09f6ee26f..cd8a22b2b 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -95,7 +95,7 @@ mobs:register_mob("mobs_mc:chicken", { }) --spawn -mobs:register_spawn("mobs_mc:chicken", mobs_mc.spawn.grassland, minetest.LIGHT_MAX+1, 9, 17000, 3, 31000) +mobs:spawn_specific("mobs_mc:chicken", mobs_mc.spawn.grassland, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 17000, 3, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- spawn eggs mobs:register_egg("mobs_mc:chicken", S("Chicken"), "mobs_mc_spawn_icon_chicken.png", 0) diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 83bfd8539..f7f2d47be 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -134,9 +134,8 @@ mobs:register_mob("mobs_mc:mooshroom", mooshroom_def) -- Spawning -mobs:register_spawn("mobs_mc:cow", mobs_mc.spawn.grassland, minetest.LIGHT_MAX+1, 9, 17000, 20, 31000) -mobs:register_spawn("mobs_mc:mooshroom", mobs_mc.spawn.mushroom_island, minetest.LIGHT_MAX+1, 9, 17000, 10, 31000) - +mobs:spawn_specific("mobs_mc:cow", mobs_mc.spawn.grassland, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 17000, 20, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) +mobs:spawn_specific("mobs_mc:mooshroom", mobs_mc.spawn.mushroom_island, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 17000, 10, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- compatibility mobs:alias_mob("mobs_animal:cow", "mobs_mc:cow") diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 6f481b402..b8ba9e2cd 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -122,7 +122,7 @@ mobs:register_mob("mobs_mc:creeper", { }) -mobs:spawn_specific("mobs_mc:creeper", mobs_mc.spawn.solid, {"air"},0, 7, 20, 16500, 1, -310, 31000) +mobs:spawn_specific("mobs_mc:creeper", mobs_mc.spawn.solid, {"air"}, 0, 7, 20, 16500, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- compatibility mobs:alias_mob("mobs:creeper", "mobs_mc:creeper") diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 5b0d236be..1161cb002 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -146,12 +146,13 @@ mobs:register_mob("mobs_mc:enderman", { }) +-- End spawn +mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 3000, 4, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) +-- Overworld spawn +mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 9000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) +-- Nether spawn (rare) +mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 27500, 4, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) ---spawn on solid blocks -mobs:register_spawn("mobs_mc:enderman", mobs_mc.spawn.desert, 7, 0, 9000, -31000, 31000) ---mobs:register_spawn("mobs_mc:enderman", mobs_mc.end_city, minetest.LIGHT_MAX+1, 0, 9000, -31000, -5000) -mobs:spawn_specific("mobs_mc:enderman", "mcl_end:end_stone", {"air"}, 0, minetest.LIGHT_MAX+1, 5, 20, 2, -31000, -5000) -mobs:spawn_specific("mobs_mc:enderman", "mcl_end:end_stone", {"mcl_portals:void"}, 0, minetest.LIGHT_MAX+1, 5, 20, 2, -31000, -5000) -- spawn eggs mobs:register_egg("mobs_mc:enderman", S("Enderman"), "mobs_mc_spawn_icon_enderman.png", 0) diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 3b71a1b06..f12006476 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -77,8 +77,8 @@ mobs:register_mob("mobs_mc:ghast", { }) ---mobs:register_spawn("mobs_mc:ghast", {"default:flowing_lava", "nether:rack","air"}, 17, -1, 5000, 1, -2000) -mobs:spawn_specific("mobs_mc:ghast", mobs_mc.spawn.nether, {"air"},0, minetest.LIGHT_MAX+1, 0, 18000, 2, -3610, -2100) +mobs:spawn_specific("mobs_mc:ghast", mobs_mc.spawn.nether, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 18000, 2, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) + -- fireball (weapon) mobs:register_arrow(":mobs_monster:fireball", { visual = "sprite", diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua index 73063129f..de9cac1dd 100644 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ b/mods/ENTITIES/mobs_mc/guardian.lua @@ -81,7 +81,7 @@ mobs:register_mob("mobs_mc:guardian", { blood_amount = 0, }) -mobs:register_spawn("mobs_mc:guardian", mobs_mc.spawn.water, minetest.LIGHT_MAX+1, 0, 5000, 2, -1000, true) +mobs:spawn_specific("mobs_mc:guardian", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water - 10) -- spawn eggs mobs:register_egg("mobs_mc:guardian", S("Guardian"), "mobs_mc_spawn_icon_guardian.png", 0) diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua index 9b74aca07..27e21c450 100644 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua @@ -86,7 +86,7 @@ mobs:register_mob("mobs_mc:guardian_elder", { blood_amount = 0, }) -mobs:register_spawn("mobs_mc:guardian_elder", mobs_mc.spawn.water, minetest.LIGHT_MAX+1, 0, 5000, 2, -1000, true) +mobs:spawn_specific("mobs_mc:guardian_elder", mobs_mc.spawn.water, mobs_mc.spawn_water, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.water-18) -- spawn eggs mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "mobs_mc_spawn_icon_guardian_elder.png", 0) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 34c29ede5..7672eb66e 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -330,9 +330,8 @@ mobs:register_mob("mobs_mc:mule", mule) --=========================== --Spawn Function -mobs:register_spawn("mobs_mc:horse", mobs_mc.spawn.grassland_savanna, minetest.LIGHT_MAX+1, 0, 15000, 12, 31000) -mobs:register_spawn("mobs_mc:donkey", mobs_mc.spawn.grassland_savanna, minetest.LIGHT_MAX+1, 0, 15000, 12, 31000) - +mobs:spawn_specific("mobs_mc:horse", mobs_mc.spawn.grassland_savanna, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 12, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) +mobs:spawn_specific("mobs_mc:donkey", mobs_mc.spawn.grassland_savanna, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 12, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) -- compatibility mobs:alias_mob("mobs:horse", "mobs_mc:horse") diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index 82c251195..d689993d4 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -139,7 +139,7 @@ mobs:register_mob("mobs_mc:llama", { }) --spawn -mobs:register_spawn("mobs_mc:llama", mobs_mc.spawn.savanna, minetest.LIGHT_MAX+1, 0, 15000, 1, 40) +mobs:spawn_specific("mobs_mc:llama", mobs_mc.spawn.savanna, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 5, mobs_mc.spawn_height.water+15, mobs_mc.spawn_height.overworld_max) -- spawn eggs mobs:register_egg("mobs_mc:llama", S("Llama"), "mobs_mc_spawn_icon_llama.png", 0) diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index cd9e2e3a6..e1c11e8cd 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -140,12 +140,13 @@ local base_spawn_chance = 5000 mobs:spawn({ name = "mobs_mc:ocelot", nodes = mobs_mc.spawn.jungle, + neighbors = {"air"}, light_max = minetest.LIGHT_MAX+1, light_min = 0, chance = math.ceil(base_spawn_chance * 1.5), -- emulates 1/3 spawn failure rate active_object_count = 12, - min_height = 1, -- Right above ocean level - max_height = 31000, + min_height = mobs_mc.spawn_height.water+1, -- Right above ocean level + max_height = mobs_mc.spawn_height.overworld_max, on_spawn = function(self, pos) --[[ Note: Minecraft has a 1/3 spawn failure rate. In this mod it is emulated by reducing the spawn rate accordingly (see above). ]] diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index 21e1b965c..e030d16fb 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -89,7 +89,7 @@ mobs:register_mob("mobs_mc:parrot", { --spawn -- TODO: Increase spawn chance if polished -mobs:spawn_specific("mobs_mc:parrot", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX+1, 20, 20000, 2, 15, 20) +--mobs:spawn_specific("mobs_mc:parrot", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 30000, 1, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) -- spawn eggs mobs:register_egg("mobs_mc:parrot", S("Parrot"), "mobs_mc_spawn_icon_parrot.png", 0) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index aa4944f9b..05481544b 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -168,7 +168,7 @@ mobs:register_mob("mobs_mc:pig", { end, }) -mobs:register_spawn("mobs_mc:pig", mobs_mc.spawn.grassland, minetest.LIGHT_MAX+1, 9, 15000, 30, 31000) +mobs:spawn_specific("mobs_mc:pig", mobs_mc.spawn.grassland, {"air"}, 9, minetest.LIGHT_MAX+1, 30, 15000, 30, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- compatibility mobs:alias_mob("mobs:pig", "mobs_mc:pig") diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua index 24858bcb9..8028655a3 100644 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ b/mods/ENTITIES/mobs_mc/polar_bear.lua @@ -69,13 +69,9 @@ mobs:register_mob("mobs_mc:polar_bear", { mobs:alias_mob("mobs_mc:polarbear", "mobs_mc:polar_bear") -mobs:register_spawn("mobs_mc:polar_bear", mobs_mc.spawn.snow, minetest.LIGHT_MAX+1, 0, 7000, 3, 31000) - +mobs:spawn_specific("mobs_mc:polar_bear", mobs_mc.spawn.snow, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 7000, 3, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- spawn egg - - - mobs:register_egg("mobs_mc:polar_bear", S("Polar Bear"), "mobs_mc_spawn_icon_polarbear.png", 0) diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index c937d86cd..5e1b2b526 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -104,10 +104,13 @@ mobs:register_mob("mobs_mc:killer_bunny", killer_bunny) local spawn = { name = "mobs_mc:rabbit", + neighbors = {"air"}, chance = 15000, active_object_count = 99, min_light = 0, max_light = minetest.LIGHT_MAX+1, + min_height = mobs_mc.spawn_height.overworld_min, + max_height = mobs_mc.spawn_height.overworld_max, } local spawn_desert = table.copy(spawn) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 48176e721..bfc8ac0f4 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -202,7 +202,7 @@ mobs:register_mob("mobs_mc:sheep", { if mobs:capture_mob(self, clicker, 0, 5, 70, false, nil) then return end end, }) -mobs:register_spawn("mobs_mc:sheep", mobs_mc.spawn.grassland, minetest.LIGHT_MAX+1, 0, 15000, 3, 31000) +mobs:spawn_specific("mobs_mc:sheep", mobs_mc.spawn.grassland, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 3, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- compatibility mobs:alias_mob("mobs_animal:sheep", "mobs_mc:sheep") diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index f91739957..8c7792930 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -83,12 +83,7 @@ mobs:register_arrow("mobs_mc:shulkerbullet", { mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0) ---mobs:spawn_specific("mobs_mc:shulker", mobs_mc.spawn.end_city, 0, minetest.LIGHT_MAX+1, 5, 3, 1, -31000, -5000) -mobs:spawn_specific("mobs_mc:shulker", "mcl_end:purpur_block", {"air"}, 0, minetest.LIGHT_MAX+1, 5, 20, 2, -31000, -5000) -mobs:spawn_specific("mobs_mc:shulker", "mcl_end:purpur_block", {"mcl_portals:void"}, 0, minetest.LIGHT_MAX+1, 5, 20, 2, -31000, -5000) - - - +mobs:spawn_specific("mobs_mc:shulker", "mcl_end:purpur_block", {"air"}, 0, minetest.LIGHT_MAX+1, 30, 5000, 2, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) if minetest.settings:get_bool("log_mods") then minetest.log("action", "MC Shulkers loaded") diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 183c95687..7632adcd7 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -122,10 +122,15 @@ mobs:register_mob("mobs_mc:stray", stray) -- compatibility mobs:alias_mob("mobs:skeleton", "mobs_mc:skeleton") ---spawn -mobs:spawn_specific("mobs_mc:skeleton", mobs_mc.spawn.solid,{"air"}, 0, 7, 20, 17000, 2, -110, 31000) +-- Overworld spawn +mobs:spawn_specific("mobs_mc:skeleton", mobs_mc.spawn.solid, {"air"}, 0, 7, 20, 17000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) +-- Nether spawn +mobs:spawn_specific("mobs_mc:skeleton", mobs_mc.spawn.nether_fortress, {"air"}, 0, 7, 30, 10000, 3, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) + +-- Stray spawn -- TODO: Spawn directly under the sky -mobs:spawn_specific("mobs_mc:stray", mobs_mc.spawn.snow, {"air"}, 0, 7, 20, 19000, 2, -110, 31000) +mobs:spawn_specific("mobs_mc:stray", mobs_mc.spawn.snow, {"air"}, 0, 7, 20, 19000, 2, mobs_mc.spawn_height.water, mobs_mc.spawn_height.overworld_max) + -- spawn eggs mobs:register_egg("mobs_mc:skeleton", S("Skeleton"), "mobs_mc_spawn_icon_skeleton.png", 0) diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index fbf94ba85..400fa5094 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -94,7 +94,8 @@ mobs:register_mob("mobs_mc:witherskeleton", { }) --spawn -mobs:register_spawn("mobs_mc:witherskeleton", mobs_mc.spawn.nether_fortress, 7, 0, 5000, 3, -3000, true) +mobs:spawn_specific("mobs_mc:witherskeleton", mobs_mc.spawn.nether_fortress, {"air"}, 0, 7, 30, 5000, 5, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) + -- spawn eggs mobs:register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "mobs_mc_spawn_icon_witherskeleton.png", 0) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index ecd4e64aa..e0c9d58a9 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -118,11 +118,12 @@ slime_tiny.on_die = nil mobs:register_mob("mobs_mc:slime_tiny", slime_tiny) +local smin = mobs_mc.spawn_height.overworld_min +local smax = mobs_mc.spawn_height.water - 23 -mobs:register_spawn("mobs_mc:slime_tiny", mobs_mc.spawn.solid, minetest.LIGHT_MAX+1, 0, 35000, 4, -12) -mobs:register_spawn("mobs_mc:slime_small", mobs_mc.spawn.solid, minetest.LIGHT_MAX+1, 0, 35000, 4, -12) -mobs:register_spawn("mobs_mc:slime_big", mobs_mc.spawn.solid, minetest.LIGHT_MAX+1, 0, 35000, 4, -12) - +mobs:spawn_specific("mobs_mc:slime_tiny", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 12000, 4, smin, smax) +mobs:spawn_specific("mobs_mc:slime_small", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 8500, 4, smin, smax) +mobs:spawn_specific("mobs_mc:slime_big", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 10000, 4, smin, smax) -- Magma cube local magma_cube_big = { @@ -240,14 +241,17 @@ magma_cube_tiny.on_die = nil mobs:register_mob("mobs_mc:magma_cube_tiny", magma_cube_tiny) +local mmin = mobs_mc.spawn_height.nether_min +local mmax = mobs_mc.spawn_height.nether_max -mobs:register_spawn("mobs_mc:magma_cube_tiny", mobs_mc.spawn.nether, minetest.LIGHT_MAX+1, 0, 15000, 4, -1000) -mobs:register_spawn("mobs_mc:magma_cube_small", mobs_mc.spawn.nether, minetest.LIGHT_MAX+1, 0, 15500, 4, -1000) -mobs:register_spawn("mobs_mc:magma_cube_big", mobs_mc.spawn.nether, minetest.LIGHT_MAX+1, 0, 16000, 4, -1000) +mobs:spawn_specific("mobs_mc:magma_cube_tiny", mobs_mc.spawn.nether, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 4, mmin, mmax) +mobs:spawn_specific("mobs_mc:magma_cube_small", mobs_mc.spawn.nether, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15500, 4, mmin, mmax) +mobs:spawn_specific("mobs_mc:magma_cube_big", mobs_mc.spawn.nether, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 16000, 4, mmin, mmax) + +mobs:spawn_specific("mobs_mc:magma_cube_tiny", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11000, 4, mmin, mmax) +mobs:spawn_specific("mobs_mc:magma_cube_small", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11100, 4, mmin, mmax) +mobs:spawn_specific("mobs_mc:magma_cube_big", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11200, 4, mmin, mmax) -mobs:register_spawn("mobs_mc:magma_cube_tiny", mobs_mc.spawn.nether_fortress, minetest.LIGHT_MAX+1, 0, 11000, 4, -1000) -mobs:register_spawn("mobs_mc:magma_cube_small", mobs_mc.spawn.nether_fortress, minetest.LIGHT_MAX+1, 0, 11100, 4, -1000) -mobs:register_spawn("mobs_mc:magma_cube_big", mobs_mc.spawn.nether_fortress, minetest.LIGHT_MAX+1, 0, 11200, 4, -1000) -- Compability mobs:alias_mob("mobs_mc:greensmall", "mobs_mc:slime_tiny") diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index bb2f2db70..73f37cc66 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -77,8 +77,7 @@ cave_spider.walk_velocity = 4.1 mobs:register_mob("mobs_mc:cave_spider", cave_spider) -mobs:register_spawn("mobs_mc:spider", mobs_mc.spawn.solid, 7, 0, 19500, 2, 3000) - +mobs:spawn_specific("mobs_mc:spider", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 17000, 2, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- compatibility mobs:alias_mob("mobs:spider", "mobs_mc:spider") diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index c1b291eb9..2ab401d1b 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -60,7 +60,7 @@ mobs:register_mob("mobs_mc:squid", { -- Spawn near the water surface -local water = tonumber(minetest.settings:get("water_level")) or 0 +local water = mobs_mc.spawn_height.water --name, nodes, neighbours, minlight, maxlight, interval, chance, active_object_count, min_height, max_height mobs:spawn_specific("mobs_mc:squid", mobs_mc.spawn.water, {mobs_mc.items.water_source}, 0, minetest.LIGHT_MAX+1, 30, 5500, 3, water-16, water) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 246011444..76a728e2f 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -168,8 +168,7 @@ mobs:register_mob("mobs_mc:villager", { ]] }) ---mobs:register_spawn("mobs_mc:villager", {"default:gravel"}, 7, -1, 4090, 4, 31000) -mobs:register_spawn("mobs_mc:villager", {"mg_villages:road"}, minetest.LIGHT_MAX+1, -1,8000, 4, 31000) +mobs:spawn_specific("mobs_mc:villager", mobs_mc.spawn.village, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 8000, 4, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) -- compatibility mobs:alias_mob("mobs:villager", "mobs_mc:villager") diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index e5094f2ee..b5c079c87 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -83,11 +83,8 @@ mobs:register_mob("mobs_mc:villager_zombie", { fear_height = 5, }) ---mobs:register_spawn("mobs_mc:villager", {"default:gravel"}, 7, -1, 4090, 4, 31000) -mobs:register_spawn("mobs_mc:villager_zombie", {"mg_villages:road"}, 7, -1, 4090, 4, 31000) - - +mobs:spawn_specific("mobs_mc:villager_zombie", mobs_mc.spawn.village, {"air"}, 0, 7, 30, 4090, 4, mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) -- spawn eggs mobs:register_egg("mobs_mc:villager_zombie", S("Zombie Villager"), "mobs_mc_spawn_icon_zombie_villager.png", 0) diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua index 99ec2eb0c..85abbdc2e 100644 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ b/mods/ENTITIES/mobs_mc/witch.lua @@ -110,7 +110,7 @@ mobs:register_arrow(":mobs:potion_arrow", { }) -- TODO: Spawn when witch works properly ---mobs:spawn_specific("mobs_mc:witch", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX-6, 12, 20000, 2, 1, 30) +--mobs:spawn_specific("mobs_mc:witch", mobs_mc.spawn.jungle, {"air"}, 0, minetest.LIGHT_MAX-6, 12, 20000, 2, mobs_mc.spawn_height.water-6, mobs_mc.spawn_height.overworld_max) -- spawn eggs mobs:register_egg("mobs_mc:witch", S("Witch"), "mobs_mc_spawn_icon_witch.png", 0) diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index cf17b3b59..7f22ce907 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -207,7 +207,7 @@ end mobs:register_mob("mobs_mc:dog", dog) -- Spawn -mobs:register_spawn("mobs_mc:wolf", mobs_mc.spawn.wolf, minetest.LIGHT_MAX+1, 0, 9000, 20, 31000) +mobs:spawn_specific("mobs_mc:wolf", mobs_mc.spawn.wolf, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 9000, 20, mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) -- Compatibility mobs:alias_mob("mobs:wolf", "mobs_mc:wolf") diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 8d2dda473..4408a7beb 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -122,12 +122,11 @@ mobs:register_mob("mobs_mc:baby_husk", baby_husk) -- Spawning -mobs:register_spawn("mobs_mc:zombie", mobs_mc.spawn.solid, 7, 0, 6000, 4, 31000) +mobs:spawn_specific("mobs_mc:zombie", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 6000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- Baby zombie is 20 times less likely than regular zombies -mobs:register_spawn("mobs_mc:baby_zombie", mobs_mc.spawn.solid, 7, 0, 60000, 4, 31000) -mobs:register_spawn("mobs_mc:husk", mobs_mc.spawn.desert, 7, 0, 6500, 4, 31000) -mobs:register_spawn("mobs_mc:baby_husk", mobs_mc.spawn.desert, 7, 0, 65000, 4, 31000) - +mobs:spawn_specific("mobs_mc:baby_zombie", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 60000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) +mobs:spawn_specific("mobs_mc:husk", mobs_mc.spawn.desert, {"air"}, 0, 7, 30, 6500, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) +mobs:spawn_specific("mobs_mc:baby_husk", mobs_mc.spawn.desert, {"air"}, 0, 7, 30, 65000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- Compatibility mobs:alias_mob("mobs:zombie", "mobs_mc:zombie") diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index 6b2ad65e4..3661ec47f 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -80,7 +80,7 @@ mobs:register_mob("mobs_mc:pigman", pigman) local baby_pigman = table.copy(pigman) baby_pigman.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} -baby_pigman.visual_size = {x=0.5, y=0.5} +baby_pigman.visual_size = {x=pigman.visual_size.x/2, y=pigman.visual_size.y/2} baby_pigman.textures = {{"mobs_mc_zombie_pigman.png"}} baby_pigman.walk_velocity = 1.2 baby_pigman.run_velocity = 2.4 @@ -88,13 +88,13 @@ baby_pigman.light_damage = 0 mobs:register_mob("mobs_mc:baby_pigman", baby_pigman) +-- Regular spawning in the Nether +mobs:spawn_specific("mobs_mc:pigman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 6000, 3, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) -- Baby zombie is 20 times less likely than regular zombies -mobs:register_spawn("mobs_mc:baby_pigman", mobs_mc.spawn.nether, minetest.LIGHT_MAX+1, 0, 100000, 4, 31000) +mobs:spawn_specific("mobs_mc:baby_pigman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 100000, 4, mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) ---mobs:register_spawn("mobs_mc:pigman", {"nether:rack"}, 17, -1, 5000, 3, -2000) -mobs:register_spawn("mobs_mc:pigman", mobs_mc.spawn.nether, minetest.LIGHT_MAX+1, 0, 6000, 3, -2000) -mobs:register_spawn("mobs_mc:pigman", mobs_mc.spawn.nether_portal, minetest.LIGHT_MAX+1, 0, 500, 4, 31000) -mobs:spawn_specific("mobs_mc:pigman", mobs_mc.spawn.nether_portal, {"air", "mcl_portals:nether_air"},0, minetest.LIGHT_MAX+1, 7, 9000, 2, -31000, 31000) +-- Spawning in Nether portals in the Overworld +mobs:spawn_specific("mobs_mc:pigman", mobs_mc.spawn.nether_portal, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 500, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- compatibility mobs:alias_mob("mobs:pigman", "mobs_mc:pigman") diff --git a/mods/ENTITIES/mobs_mc_gameconfig/depends.txt b/mods/ENTITIES/mobs_mc_gameconfig/depends.txt new file mode 100644 index 000000000..3b355984e --- /dev/null +++ b/mods/ENTITIES/mobs_mc_gameconfig/depends.txt @@ -0,0 +1 @@ +mcl_init diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mobs_mc_gameconfig/init.lua index e598d3fd8..a8f403f17 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua +++ b/mods/ENTITIES/mobs_mc_gameconfig/init.lua @@ -179,6 +179,26 @@ mobs_mc.override.spawn = { jungle = { "mcl_core:podzol", "mcl_core:jungletree", "mcl_core:jungleleaves", "mcl_flowers:fern" }, snow = { "mcl_core:snow", "mcl_core:snowblock", "mcl_core:dirt_with_grass_snow" }, end_city = { "mcl_end:purpur_block" }, + nether = { "mcl_nether:netherrack", "mcl_nether:quartz_ore" }, + -- Netherrack added because there are no Nether fortresses yet. TODO: Remove netherrac from list as soon they're available + nether_fortress = { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, wolf = { mobs_mc.override.items.grass_block, "mcl_core:dirt", "mcl_core:dirt_with_grass_snow", "mcl_core:snow", "mcl_core:snowblock", "mcl_core:podzol" }, } +-- This table contains important spawn height references for the mob spawn height. +mobs_mc.override.spawn_height = { + water = tonumber(minetest.setting_get("water_level")) or 0, -- Water level in the Overworld + + -- Overworld boundaries (inclusive) + overworld_min = mcl_vars.mg_overworld_min, + overworld_max = mcl_vars.mg_overworld_max, + + -- Nether boundaries (inclusive) + nether_min = mcl_vars.mg_nether_min, + nether_max = mcl_vars.mg_nether_max, + + -- End boundaries (inclusive) + end_min = mcl_vars.mg_end_min, + end_max = mcl_vars.mg_end_max, +} + From 657851125f57467dee1d8f86af0db8d748691d9b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 00:16:29 +0200 Subject: [PATCH 14/75] Add nether and end portal (WIP) New mod: mcl_portals, based on maikerumine's work --- mods/MAPGEN/mcl_portals/LICENSE | 7 + mods/MAPGEN/mcl_portals/README.md | 9 + mods/MAPGEN/mcl_portals/depends.txt | 7 + mods/MAPGEN/mcl_portals/description.txt | 1 + mods/MAPGEN/mcl_portals/init.lua | 10 + mods/MAPGEN/mcl_portals/mod.conf | 1 + mods/MAPGEN/mcl_portals/portal_end.lua | 385 ++++++++++++++++ mods/MAPGEN/mcl_portals/portal_nether.lua | 416 ++++++++++++++++++ .../textures/mcl_portals_end_portal.png | Bin 0 -> 8925 bytes .../textures/mcl_portals_particle.png | Bin 0 -> 226 bytes .../textures/mcl_portals_portal.png | Bin 0 -> 8960 bytes 11 files changed, 836 insertions(+) create mode 100644 mods/MAPGEN/mcl_portals/LICENSE create mode 100644 mods/MAPGEN/mcl_portals/README.md create mode 100644 mods/MAPGEN/mcl_portals/depends.txt create mode 100644 mods/MAPGEN/mcl_portals/description.txt create mode 100644 mods/MAPGEN/mcl_portals/init.lua create mode 100644 mods/MAPGEN/mcl_portals/mod.conf create mode 100644 mods/MAPGEN/mcl_portals/portal_end.lua create mode 100644 mods/MAPGEN/mcl_portals/portal_nether.lua create mode 100644 mods/MAPGEN/mcl_portals/textures/mcl_portals_end_portal.png create mode 100644 mods/MAPGEN/mcl_portals/textures/mcl_portals_particle.png create mode 100644 mods/MAPGEN/mcl_portals/textures/mcl_portals_portal.png diff --git a/mods/MAPGEN/mcl_portals/LICENSE b/mods/MAPGEN/mcl_portals/LICENSE new file mode 100644 index 000000000..ece42d0aa --- /dev/null +++ b/mods/MAPGEN/mcl_portals/LICENSE @@ -0,0 +1,7 @@ +The MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/mods/MAPGEN/mcl_portals/README.md b/mods/MAPGEN/mcl_portals/README.md new file mode 100644 index 000000000..09b4f3110 --- /dev/null +++ b/mods/MAPGEN/mcl_portals/README.md @@ -0,0 +1,9 @@ +# Portals mod for MineClone 2 +## How to create portals + +Nether portal: Build an upright frame of obsidian, 4 blocks wide and 5 blocks high, and use a flint and steel inside it. +End portal: Build an upright frame of red nether brick blocks, 4 blocks wide and 5 blocks high, and use an eye of ender inside it. + +## Credits +Created by maikerumine and Wuzzy. +License: MIT License (see `LICENSE`). diff --git a/mods/MAPGEN/mcl_portals/depends.txt b/mods/MAPGEN/mcl_portals/depends.txt new file mode 100644 index 000000000..fbb8a6e2d --- /dev/null +++ b/mods/MAPGEN/mcl_portals/depends.txt @@ -0,0 +1,7 @@ +mcl_init +mcl_util +mcl_core +mcl_fire +mcl_nether +mcl_end +doc? diff --git a/mods/MAPGEN/mcl_portals/description.txt b/mods/MAPGEN/mcl_portals/description.txt new file mode 100644 index 000000000..fe84531f3 --- /dev/null +++ b/mods/MAPGEN/mcl_portals/description.txt @@ -0,0 +1 @@ +Adds buildable portals to the Nether and End dimensions. diff --git a/mods/MAPGEN/mcl_portals/init.lua b/mods/MAPGEN/mcl_portals/init.lua new file mode 100644 index 000000000..cf4716c40 --- /dev/null +++ b/mods/MAPGEN/mcl_portals/init.lua @@ -0,0 +1,10 @@ +-- Load files + +-- Nether portal: +-- Obsidian frame, activated by flint and steel +dofile(minetest.get_modpath("mcl_portals").."/portal_nether.lua") + +-- End portal (W.I.P): +-- Red nether brick block frame, activated by an eye of ender +dofile(minetest.get_modpath("mcl_portals").."/portal_end.lua") + diff --git a/mods/MAPGEN/mcl_portals/mod.conf b/mods/MAPGEN/mcl_portals/mod.conf new file mode 100644 index 000000000..e82fbe6c1 --- /dev/null +++ b/mods/MAPGEN/mcl_portals/mod.conf @@ -0,0 +1 @@ +name = mcl_portals diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua new file mode 100644 index 000000000..2de6174f3 --- /dev/null +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -0,0 +1,385 @@ +-- Parameters + +local END_DEPTH = mcl_vars.mg_end_min +local TCAVE = 0.6 +local nobj_cave = nil +-- 3D noise + +local np_cave = { + offset = 0, + scale = 1, + spread = {x = 384, y = 128, z = 384}, -- squashed 3:1 + seed = 59033, + octaves = 5, + persist = 0.7 +} + +-- Nodes +minetest.register_node("mcl_portals:portal_end", { + description = "End Portal", + tiles = { + "blank.png", + "blank.png", + "blank.png", + "blank.png", + { + name = "mcl_portals_end_portal.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + { + name = "mcl_portals_end_portal.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + use_texture_alpha = true, + walkable = false, + diggable = false, + pointable = false, + buildable_to = false, + is_ground_content = false, + drop = "", + -- This is 15 in MC. + light_source = 14, + post_effect_color = {a = 192, r = 0, g = 0, b = 0}, + alpha = 192, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1, 0.5, 0.5, 0.1}, + }, + }, + groups = {not_in_creative_inventory = 1} +}) + +local function build_end_portal(pos, target3) + local p = {x = pos.x - 1, y = pos.y - 1, z = pos.z} + local p1 = {x = pos.x - 1, y = pos.y - 1, z = pos.z} + local p2 = {x = p1.x + 3, y = p1.y + 4, z = p1.z} + + for i = 1, 4 do + minetest.set_node(p, {name = "mcl_nether:red_nether_brick"}) + p.y = p.y + 1 + end + for i = 1, 3 do + minetest.set_node(p, {name = "mcl_nether:red_nether_brick"}) + p.x = p.x + 1 + end + for i = 1, 4 do + minetest.set_node(p, {name = "mcl_nether:red_nether_brick"}) + p.y = p.y - 1 + end + for i = 1, 3 do + minetest.set_node(p, {name = "mcl_nether:red_nether_brick"}) + p.x = p.x - 1 + end + + for x = p1.x, p2.x do + for y = p1.y, p2.y do + p = {x = x, y = y, z = p1.z} + if not (x == p1.x or x == p2.x or y == p1.y or y == p2.y) then + minetest.set_node(p, {name = "mcl_portals:portal_end", param2 = 0}) + end + local meta = minetest.get_meta(p) + meta:set_string("p1", minetest.pos_to_string(p1)) + meta:set_string("p2", minetest.pos_to_string(p2)) + meta:set_string("target3", minetest.pos_to_string(target3)) + + if y ~= p1.y then + for z = -2, 2 do + if z ~= 0 then + p.z = p.z + z + if minetest.registered_nodes[ + minetest.get_node(p).name].is_ground_content then + minetest.remove_node(p) + end + p.z = p.z - z + end + end + end + end + end +end + +local function find_end_target3_y2(target3_x, target3_z) + local start_y = END_DEPTH + math.random(20, 120) -- Search start + local nobj_cave_point = minetest.get_perlin(np_cave) + local air = 0 -- Consecutive air nodes found + + for y = start_y, start_y - 120, -1 do + local nval_cave = nobj_cave_point:get3d({x = target3_x, y = y, z = target3_z}) + + if nval_cave > TCAVE then -- Cavern + air = air + 1 + else -- Not cavern, check if 4 nodes of space above + if air >= 4 then + return y + 2 + else -- Not enough space, reset air to zero + air = 0 + end + end + end + + return start_y -- Fallback +end + +local function move_check2(p1, max, dir) + local p = {x = p1.x, y = p1.y, z = p1.z} + local d = math.abs(max - p1[dir]) / (max - p1[dir]) + + while p[dir] ~= max do + p[dir] = p[dir] + d + if minetest.get_node(p).name ~= "mcl_nether:red_nether_brick" then + return false + end + end + + return true +end + +local function check_end_portal(p1, p2) + if p1.x ~= p2.x then + if not move_check2(p1, p2.x, "x") then + return false + end + if not move_check2(p2, p1.x, "x") then + return false + end + elseif p1.z ~= p2.z then + if not move_check2(p1, p2.z, "z") then + return false + end + if not move_check2(p2, p1.z, "z") then + return false + end + else + return false + end + + if not move_check2(p1, p2.y, "y") then + return false + end + if not move_check2(p2, p1.y, "y") then + return false + end + + return true +end + +local function is_end_portal(pos) + for d = -3, 3 do + for y = -4, 4 do + local px = {x = pos.x + d, y = pos.y + y, z = pos.z} + local pz = {x = pos.x, y = pos.y + y, z = pos.z + d} + + if check_end_portal(px, {x = px.x + 3, y = px.y + 4, z = px.z}) then + return px, {x = px.x + 3, y = px.y + 4, z = px.z} + end + if check_end_portal(pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3}) then + return pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3} + end + end + end +end + +local function make_end_portal(pos) + local p1, p2 = is_end_portal(pos) + if not p1 or not p2 then + return false + end + + for d = 1, 2 do + for y = p1.y + 1, p2.y - 1 do + local p + if p1.z == p2.z then + p = {x = p1.x + d, y = y, z = p1.z} + else + p = {x = p1.x, y = y, z = p1.z + d} + end + if minetest.get_node(p).name ~= "air" then + return false + end + end + end + + local param2 + if p1.z == p2.z then + param2 = 0 + else + param2 = 1 + end + + local target3 = {x = p1.x, y = p1.y, z = p1.z} + target3.x = target3.x + 1 + if target3.y < END_DEPTH then + target3.y = math.random(-52, 100) + else + target3.y = find_end_target3_y2(target3.x, target3.z) + end + + for d = 0, 3 do + for y = p1.y, p2.y do + local p = {} + if param2 == 0 then + p = {x = p1.x + d, y = y, z = p1.z} + else + p = {x = p1.x, y = y, z = p1.z + d} + end + if minetest.get_node(p).name == "air" then + minetest.set_node(p, {name = "mcl_portals:portal_end", param2 = param2}) + end + local meta = minetest.get_meta(p) + meta:set_string("p1", minetest.pos_to_string(p1)) + meta:set_string("p2", minetest.pos_to_string(p2)) + meta:set_string("target3", minetest.pos_to_string(target3)) + end + end + + return true +end + +minetest.register_abm({ + label = "End portal teleportation", + nodenames = {"mcl_portals:portal_end"}, + interval = 1, + chance = 2, + action = function(pos, node) + for _,obj in ipairs(minetest.get_objects_inside_radius(pos,1)) do --maikerumine added for objects to travel + local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel + if obj:is_player() or lua_entity then + local meta = minetest.get_meta(pos) + local target3 = minetest.string_to_pos(meta:get_string("target3")) + if target3 then + -- force emerge of target3 area + minetest.get_voxel_manip():read_from_map(target3, target3) + if not minetest.get_node_or_nil(target3) then + minetest.emerge_area( + vector.subtract(target3, 4), vector.add(target3, 4)) + end + -- teleport the player + minetest.after(3, function(obj, pos, target3) + local objpos = obj:getpos() + if objpos == nil then return end --maikerumine added for objects to travel + objpos.y = objpos.y + 0.1 -- Fix some glitches at -8000. FIXME: WTF? + if minetest.get_node(objpos).name ~= "mcl_portals:portal_end" then + return + end + + obj:setpos(target3) + minetest.sound_play("tng_transporter1", {pos=target3,gain=0.5,max_hear_distance = 8,}) -- maikerumine added sound when travel + + local function check_and_build_end_portal(pos, target3) + local n = minetest.get_node_or_nil(target3) + if n and n.name ~= "mcl_portals:portal_end" then + build_end_portal(target3, pos) + minetest.after(2, check_and_build_end_portal, pos, target3) + minetest.after(4, check_and_build_end_portal, pos, target3) + elseif not n then + minetest.after(1, check_and_build_end_portal, pos, target3) + end + end + + minetest.after(1, check_and_build_end_portal, pos, target3) + + end, obj, pos, target3) + end + end + end + end, +}) + + +--[[ ITEM OVERRIDES ]] + +-- Frame material +minetest.override_item("mcl_nether:red_nether_brick", { + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + local p1 = minetest.string_to_pos(meta:get_string("p1")) + local p2 = minetest.string_to_pos(meta:get_string("p2")) + local target3 = minetest.string_to_pos(meta:get_string("target3")) + if not p1 or not p2 then + return + end + + for x = p1.x, p2.x do + for y = p1.y, p2.y do + for z = p1.z, p2.z do + local nn = minetest.get_node({x = x, y = y, z = z}).name + if nn == "mcl_nether:red_nether_brick" or nn == "mcl_portals:portal_end" then + if nn == "mcl_portals:portal_end" then + minetest.remove_node({x = x, y = y, z = z}) + end + local m = minetest.get_meta({x = x, y = y, z = z}) + m:set_string("p1", "") + m:set_string("p2", "") + m:set_string("target3", "") + end + end + end + end + + meta = minetest.get_meta(target3) + if not meta then + return + end + p1 = minetest.string_to_pos(meta:get_string("p1")) + p2 = minetest.string_to_pos(meta:get_string("p2")) + if not p1 or not p2 then + return + end + + for x = p1.x, p2.x do + for y = p1.y, p2.y do + for z = p1.z, p2.z do + local nn = minetest.get_node({x = x, y = y, z = z}).name + if nn == "mcl_nether:red_nether_brick" or nn == "mcl_portals:portal_end" then + if nn == "mcl_portals:portal_end" then + minetest.remove_node({x = x, y = y, z = z}) + end + local m = minetest.get_meta({x = x, y = y, z = z}) + m:set_string("p1", "") + m:set_string("p2", "") + m:set_string("target3", "") + end + end + end + end + end, +}) + +-- Portal opener +minetest.override_item("mcl_end:ender_eye", { + _doc_items_longdesc = "An eye of ander can be used to open a portal to the End.", + _doc_items_usagehelp = "To open an End portal, place an upright frame of red nether brick blocks with a length of 4 and a height of 5 blocks, leaving only air in the center. After placing this frame, use the nether quartz on the frame.", + on_place = function(itemstack, user, pointed_thing) + local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] --new + + minetest.sound_play( + "fire_flint_and_steel", + {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 8} + ) + if pointed_thing.under and minetest.get_node(pointed_thing.under).name == "mcl_nether:red_nether_brick" then + make_end_portal(pointed_thing.under) + end + + if not minetest.setting_getbool("creative_mode") and used == true then + itemstack:take_item() -- 1 use + end + return itemstack + end, +}) + diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/MAPGEN/mcl_portals/portal_nether.lua new file mode 100644 index 000000000..94ed0986c --- /dev/null +++ b/mods/MAPGEN/mcl_portals/portal_nether.lua @@ -0,0 +1,416 @@ +-- Parameters + +local NETHER_DEPTH = mcl_vars.mg_nether_min +local TCAVE = 0.6 +local nobj_cave = nil + +-- 3D noise +local np_cave = { + offset = 0, + scale = 1, + spread = {x = 384, y = 128, z = 384}, + seed = 59033, + octaves = 5, + persist = 0.7 +} + +minetest.register_node("mcl_portals:portal", { + description = "Nether Portal", + tiles = { + "blank.png", + "blank.png", + "blank.png", + "blank.png", + { + name = "mcl_portals_portal.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + { + name = "mcl_portals_portal.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + }, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + use_texture_alpha = true, + walkable = false, + diggable = false, + pointable = false, + buildable_to = false, + is_ground_content = false, + drop = "", + light_source = 11, + post_effect_color = {a = 180, r = 128, g = 23, b = 23}, + alpha = 192, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1, 0.5, 0.5, 0.1}, + }, + }, + groups = {not_in_creative_inventory = 1} +}) + + + +-- Functions +--Build arrival portal +local function build_portal(pos, target) + local p = {x = pos.x - 1, y = pos.y - 1, z = pos.z} + local p1 = {x = pos.x - 1, y = pos.y - 1, z = pos.z} + local p2 = {x = p1.x + 3, y = p1.y + 4, z = p1.z} + + for i = 1, 4 do + minetest.set_node(p, {name = "mcl_core:obsidian"}) + p.y = p.y + 1 + end + for i = 1, 3 do + minetest.set_node(p, {name = "mcl_core:obsidian"}) + p.x = p.x + 1 + end + for i = 1, 4 do + minetest.set_node(p, {name = "mcl_core:obsidian"}) + p.y = p.y - 1 + end + for i = 1, 3 do + minetest.set_node(p, {name = "mcl_core:obsidian"}) + p.x = p.x - 1 + end + + for x = p1.x, p2.x do + for y = p1.y, p2.y do + p = {x = x, y = y, z = p1.z} + if not (x == p1.x or x == p2.x or y == p1.y or y == p2.y) then + minetest.set_node(p, {name = "mcl_portals:portal", param2 = 0}) + end + local meta = minetest.get_meta(p) + meta:set_string("p1", minetest.pos_to_string(p1)) + meta:set_string("p2", minetest.pos_to_string(p2)) + meta:set_string("target", minetest.pos_to_string(target)) + + if y ~= p1.y then + for z = -2, 2 do + if z ~= 0 then + p.z = p.z + z + if minetest.registered_nodes[ + minetest.get_node(p).name].is_ground_content then + minetest.remove_node(p) + end + p.z = p.z - z + end + end + end + end + end +end + +local function find_nether_target_y(target_x, target_z) + local start_y = NETHER_DEPTH + math.random(38, 117) -- Search start + local nobj_cave_point = minetest.get_perlin(np_cave) + local air = 4 + + for y = start_y, start_y -117, -1 do + local nval_cave = nobj_cave_point:get3d({x = target_x, y = y, z = target_z}) + + if nval_cave > TCAVE then -- Cavern + air = air + 1 + else -- Not cavern, check if 4 nodes of space above + if air >= 4 then + return y + 2 + else -- Not enough space, reset air to zero + air = 0 + end + end + end + + return start_y -- Fallback +end + +local function move_check(p1, max, dir) + local p = {x = p1.x, y = p1.y, z = p1.z} + local d = math.abs(max - p1[dir]) / (max - p1[dir]) + + while p[dir] ~= max do + p[dir] = p[dir] + d + if minetest.get_node(p).name ~= "mcl_core:obsidian" then + return false + end + end + + return true +end + +local function check_portal(p1, p2) + if p1.x ~= p2.x then + if not move_check(p1, p2.x, "x") then + return false + end + if not move_check(p2, p1.x, "x") then + return false + end + elseif p1.z ~= p2.z then + if not move_check(p1, p2.z, "z") then + return false + end + if not move_check(p2, p1.z, "z") then + return false + end + else + return false + end + + if not move_check(p1, p2.y, "y") then + return false + end + if not move_check(p2, p1.y, "y") then + return false + end + + return true +end + +local function is_portal(pos) + for d = -3, 3 do + for y = -4, 4 do + local px = {x = pos.x + d, y = pos.y + y, z = pos.z} + local pz = {x = pos.x, y = pos.y + y, z = pos.z + d} + + if check_portal(px, {x = px.x + 3, y = px.y + 4, z = px.z}) then + return px, {x = px.x + 3, y = px.y + 4, z = px.z} + end + if check_portal(pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3}) then + return pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3} + end + end + end +end + +local function make_portal(pos) + local p1, p2 = is_portal(pos) + if not p1 or not p2 then + return false + end + + for d = 1, 2 do + for y = p1.y + 1, p2.y - 1 do + local p + if p1.z == p2.z then + p = {x = p1.x + d, y = y, z = p1.z} + else + p = {x = p1.x, y = y, z = p1.z + d} + end + if minetest.get_node(p).name ~= "air" then + return false + end + end + end + + local param2 + if p1.z == p2.z then + param2 = 0 + else + param2 = 1 + end + + local target = {x = p1.x, y = p1.y, z = p1.z} + target.x = target.x + 1 + if target.y < NETHER_DEPTH then + target.y = math.random(-52, 100) + else + target.y = find_nether_target_y(target.x, target.z) + end + + for d = 0, 3 do + for y = p1.y, p2.y do + local p = {} + if param2 == 0 then + p = {x = p1.x + d, y = y, z = p1.z} + else + p = {x = p1.x, y = y, z = p1.z + d} + end + if minetest.get_node(p).name == "air" + then + minetest.set_node(p, {name = "mcl_portals:portal", param2 = param2}) + end + local meta = minetest.get_meta(p) + meta:set_string("p1", minetest.pos_to_string(p1)) + meta:set_string("p2", minetest.pos_to_string(p2)) + meta:set_string("target", minetest.pos_to_string(target)) + end + end + + return true +end + + +minetest.register_abm({ + label = "Nether portal teleportation and particles", + nodenames = {"mcl_portals:portal"}, + interval = 1, + chance = 2, + action = function(pos, node) + minetest.add_particlespawner( + 32, --amount + 4, --time + {x = pos.x - 0.25, y = pos.y - 0.25, z = pos.z - 0.25}, --minpos + {x = pos.x + 0.25, y = pos.y + 0.25, z = pos.z + 0.25}, --maxpos + {x = -0.8, y = -0.8, z = -0.8}, --minvel + {x = 0.8, y = 0.8, z = 0.8}, --maxvel + {x = 0, y = 0, z = 0}, --minacc + {x = 0, y = 0, z = 0}, --maxacc + 0.5, --minexptime + 1, --maxexptime + 1, --minsize + 2, --maxsize + false, --collisiondetection + "mcl_portals_particle.png" --texture + ) + for _,obj in ipairs(minetest.get_objects_inside_radius(pos,1)) do --maikerumine added for objects to travel + local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel + if obj:is_player() or lua_entity then + local meta = minetest.get_meta(pos) + local target = minetest.string_to_pos(meta:get_string("target")) + if target then + -- force emerge of target area + minetest.get_voxel_manip():read_from_map(target, target) + if not minetest.get_node_or_nil(target) then + minetest.emerge_area( + vector.subtract(target, 4), vector.add(target, 4)) + end + -- teleport the player + minetest.after(3, function(obj, pos, target) + local objpos = obj:getpos() if objpos == nil then return end --maikerumine added for objects to travel + objpos.y = objpos.y + 0.1 -- Fix some glitches at -8000 + if minetest.get_node(objpos).name ~= "mcl_portals:portal" then + return + end + + obj:setpos(target) + minetest.sound_play("tng_transporter1", {pos=target,gain=0.5,max_hear_distance = 8,}) --maikerumine added sound when travel + local function check_and_build_portal(pos, target) + local n = minetest.get_node_or_nil(target) + if n and n.name ~= "mcl_portals:portal" then + build_portal(target, pos) + minetest.after(2, check_and_build_portal, pos, target) + minetest.after(4, check_and_build_portal, pos, target) + elseif not n then + minetest.after(1, check_and_build_portal, pos, target) + end + end + + minetest.after(1, check_and_build_portal, pos, target) + + end, obj, pos, target) + end + end + end + end, +}) + + +--[[ ITEM OVERRIDES ]] + +-- Frame material +minetest.override_item("mcl_core:obsidian", { + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + local p1 = minetest.string_to_pos(meta:get_string("p1")) + local p2 = minetest.string_to_pos(meta:get_string("p2")) + local target = minetest.string_to_pos(meta:get_string("target")) + if not p1 or not p2 then + return + end + + for x = p1.x, p2.x do + for y = p1.y, p2.y do + for z = p1.z, p2.z do + local nn = minetest.get_node({x = x, y = y, z = z}).name + if nn == "mcl_core:obsidian" or nn == "mcl_portals:portal" then + if nn == "mcl_portals:portal" then + minetest.remove_node({x = x, y = y, z = z}) + end + local m = minetest.get_meta({x = x, y = y, z = z}) + m:set_string("p1", "") + m:set_string("p2", "") + m:set_string("target", "") + end + end + end + end + + meta = minetest.get_meta(target) + if not meta then + return + end + p1 = minetest.string_to_pos(meta:get_string("p1")) + p2 = minetest.string_to_pos(meta:get_string("p2")) + if not p1 or not p2 then + return + end + + for x = p1.x, p2.x do + for y = p1.y, p2.y do + for z = p1.z, p2.z do + local nn = minetest.get_node({x = x, y = y, z = z}).name + if nn == "mcl_core:obsidian" or nn == "mcl_portals:portal" then + if nn == "mcl_portals:portal" then + minetest.remove_node({x = x, y = y, z = z}) + end + local m = minetest.get_meta({x = x, y = y, z = z}) + m:set_string("p1", "") + m:set_string("p2", "") + m:set_string("target", "") + end + end + end + end + end, +}) + +-- Portal opener +minetest.override_item("mcl_fire:flint_and_steel", { + _doc_items_longdesc = "Flint and steel is a tool to start fires, ignite blocks and open portals.", + _doc_items_usagehelp = "Rightclick the surface of a block to attempt to light a fire in front of it. On netherrack it will start an eternal fire. Using it on TNT will ignite it. To open a Nether portal, place an upright frame of obsidian with a length of 4 and a height of 5 blocks, leaving only air in the center. After placing this frame, use the flint and steel on inside of the frame.", + on_place = function(itemstack, user, pointed_thing) + local idef = itemstack:get_definition() + minetest.sound_play( + "fire_flint_and_steel", + {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 8} + ) + local used = false + + if pointed_thing.under and minetest.get_node(pointed_thing.under).name == "mcl_core:obsidian" then + done = make_portal(pointed_thing.under) + else + if pointed_thing.type == "node" then + local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] + if nodedef._on_ignite then + nodedef._on_ignite(pointed_thing.under, user) + else + mcl_fire.set_fire(pointed_thing) + end + used = true + end + end + if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then + minetest.sound_play(idef.sound.breaks, {pos=user:getpos(), gain=0.5}) + end + if not minetest.setting_getbool("creative_mode") and used == true then + itemstack:add_wear(65535/65) -- 65 uses + end + return itemstack + end, +}) + diff --git a/mods/MAPGEN/mcl_portals/textures/mcl_portals_end_portal.png b/mods/MAPGEN/mcl_portals/textures/mcl_portals_end_portal.png new file mode 100644 index 0000000000000000000000000000000000000000..975be7f7de9b688a3c2701e0f41c36883568a00a GIT binary patch literal 8925 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 literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_portals/textures/mcl_portals_particle.png b/mods/MAPGEN/mcl_portals/textures/mcl_portals_particle.png new file mode 100644 index 0000000000000000000000000000000000000000..56a5b78c42392a3cac53daffe6ace26f490de837 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP)3ooCr(J_l>AwVIH64!_l=ltB<)VvagZ)c|M2Z}{| zx;TbNT%Ou@kh8&ohvj(Kf7fTR=CFr7`+v*A;^6Z29xRS`!Vl$?G0S@u3f?*# zlh@qrv-w;QBlD^NNvDRx=}vpvOv;`KugL2XeWq|ZCv|p3b-;@U{dy-gW&YPKTapO0 OhQZU-&t;ucLK6V^F-wyG literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_portals/textures/mcl_portals_portal.png b/mods/MAPGEN/mcl_portals/textures/mcl_portals_portal.png new file mode 100644 index 0000000000000000000000000000000000000000..4fad43cbd7f9d3e3389484355dcea0d68816f72d GIT binary patch literal 8960 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 a^Zg$;^U2=YvD>-;0000 Date: Thu, 17 Aug 2017 01:01:09 +0200 Subject: [PATCH 15/75] Add portal teleportation sound --- mods/MAPGEN/mcl_portals/README.md | 8 +++++++- mods/MAPGEN/mcl_portals/portal_end.lua | 8 +++++--- mods/MAPGEN/mcl_portals/portal_nether.lua | 8 ++++++-- .../sounds/mcl_portals_teleport.ogg | Bin 0 -> 111849 bytes 4 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 mods/MAPGEN/mcl_portals/sounds/mcl_portals_teleport.ogg diff --git a/mods/MAPGEN/mcl_portals/README.md b/mods/MAPGEN/mcl_portals/README.md index 09b4f3110..77c5c0efa 100644 --- a/mods/MAPGEN/mcl_portals/README.md +++ b/mods/MAPGEN/mcl_portals/README.md @@ -6,4 +6,10 @@ End portal: Build an upright frame of red nether brick blocks, 4 blocks wide and ## Credits Created by maikerumine and Wuzzy. -License: MIT License (see `LICENSE`). +Code license: MIT License (see `LICENSE`). + +Texture license: See main MineClone 2 directory. + +License of sound: [CC BY 3.0](http://creativecommons.org/licenses/by/3.0/) +Authors: [FreqMan](https://freesound.org/people/FreqMan/) and Wuzzy +Source: diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index 2de6174f3..c5d4d5b25 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -278,9 +278,7 @@ minetest.register_abm({ return end - obj:setpos(target3) - minetest.sound_play("tng_transporter1", {pos=target3,gain=0.5,max_hear_distance = 8,}) -- maikerumine added sound when travel - + -- Build destination local function check_and_build_end_portal(pos, target3) local n = minetest.get_node_or_nil(target3) if n and n.name ~= "mcl_portals:portal_end" then @@ -294,6 +292,10 @@ minetest.register_abm({ minetest.after(1, check_and_build_end_portal, pos, target3) + -- Teleport + obj:setpos(target3) + minetest.sound_play("mcl_portals_teleport", {pos=target3, gain=0.5, max_hear_distance = 16}) + end, obj, pos, target3) end end diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/MAPGEN/mcl_portals/portal_nether.lua index 94ed0986c..7070f2492 100644 --- a/mods/MAPGEN/mcl_portals/portal_nether.lua +++ b/mods/MAPGEN/mcl_portals/portal_nether.lua @@ -297,8 +297,7 @@ minetest.register_abm({ return end - obj:setpos(target) - minetest.sound_play("tng_transporter1", {pos=target,gain=0.5,max_hear_distance = 8,}) --maikerumine added sound when travel + -- Build target portal local function check_and_build_portal(pos, target) local n = minetest.get_node_or_nil(target) if n and n.name ~= "mcl_portals:portal" then @@ -312,6 +311,11 @@ minetest.register_abm({ minetest.after(1, check_and_build_portal, pos, target) + -- Teleport + obj:setpos(target) + minetest.sound_play("mcl_portals_teleport", {pos=target, gain=0.5, max_hear_distance = 16}) + + end, obj, pos, target) end end diff --git a/mods/MAPGEN/mcl_portals/sounds/mcl_portals_teleport.ogg b/mods/MAPGEN/mcl_portals/sounds/mcl_portals_teleport.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b943a83257712856cef64dfb16cc689428188c0b GIT binary patch literal 111849 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
  • S1VnFE?|haG`)q#WFA|w}0Ja_*Ph}ffl~%db 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 Date: Thu, 17 Aug 2017 01:09:32 +0200 Subject: [PATCH 16/75] Save portal noise --- mods/MAPGEN/mcl_portals/portal_end.lua | 6 ++++-- mods/MAPGEN/mcl_portals/portal_nether.lua | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index c5d4d5b25..0a8c5c8c9 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -116,11 +116,13 @@ end local function find_end_target3_y2(target3_x, target3_z) local start_y = END_DEPTH + math.random(20, 120) -- Search start - local nobj_cave_point = minetest.get_perlin(np_cave) + if not nobj_cave then + nobj_cave = minetest.get_perlin(np_cave) + end local air = 0 -- Consecutive air nodes found for y = start_y, start_y - 120, -1 do - local nval_cave = nobj_cave_point:get3d({x = target3_x, y = y, z = target3_z}) + local nval_cave = nobj_cave:get3d({x = target3_x, y = y, z = target3_z}) if nval_cave > TCAVE then -- Cavern air = air + 1 diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/MAPGEN/mcl_portals/portal_nether.lua index 7070f2492..9705e2895 100644 --- a/mods/MAPGEN/mcl_portals/portal_nether.lua +++ b/mods/MAPGEN/mcl_portals/portal_nether.lua @@ -118,11 +118,13 @@ end local function find_nether_target_y(target_x, target_z) local start_y = NETHER_DEPTH + math.random(38, 117) -- Search start - local nobj_cave_point = minetest.get_perlin(np_cave) + if not nobj_cave then + nobj_cave = minetest.get_perlin(np_cave) + end local air = 4 for y = start_y, start_y -117, -1 do - local nval_cave = nobj_cave_point:get3d({x = target_x, y = y, z = target_z}) + local nval_cave = nobj_cave:get3d({x = target_x, y = y, z = target_z}) if nval_cave > TCAVE then -- Cavern air = air + 1 From 05657fae9e0d240c1f48791298f326130f42439a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 01:10:00 +0200 Subject: [PATCH 17/75] Don't play ignite sound for ender eye fail --- mods/MAPGEN/mcl_portals/portal_end.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index 0a8c5c8c9..a1c6906f0 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -372,12 +372,12 @@ minetest.override_item("mcl_end:ender_eye", { on_place = function(itemstack, user, pointed_thing) local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] --new - minetest.sound_play( - "fire_flint_and_steel", - {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 8} - ) if pointed_thing.under and minetest.get_node(pointed_thing.under).name == "mcl_nether:red_nether_brick" then make_end_portal(pointed_thing.under) + minetest.sound_play( + "fire_flint_and_steel", + {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 8} + ) end if not minetest.setting_getbool("creative_mode") and used == true then From 1f840e4cfc6994b3d975cbdd0ebad6baa45fad75 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 01:11:06 +0200 Subject: [PATCH 18/75] More portal opener fixes --- mods/MAPGEN/mcl_portals/portal_end.lua | 7 ++++--- mods/MAPGEN/mcl_portals/portal_nether.lua | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index a1c6906f0..cc2dc8b96 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -372,17 +372,18 @@ minetest.override_item("mcl_end:ender_eye", { on_place = function(itemstack, user, pointed_thing) local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] --new + -- If used on frame, open portal if pointed_thing.under and minetest.get_node(pointed_thing.under).name == "mcl_nether:red_nether_brick" then make_end_portal(pointed_thing.under) minetest.sound_play( "fire_flint_and_steel", {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 8} ) + if not minetest.setting_getbool("creative_mode") and used == true then + itemstack:take_item() -- 1 use + end end - if not minetest.setting_getbool("creative_mode") and used == true then - itemstack:take_item() -- 1 use - end return itemstack end, }) diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/MAPGEN/mcl_portals/portal_nether.lua index 9705e2895..c8c875eb0 100644 --- a/mods/MAPGEN/mcl_portals/portal_nether.lua +++ b/mods/MAPGEN/mcl_portals/portal_nether.lua @@ -398,7 +398,7 @@ minetest.override_item("mcl_fire:flint_and_steel", { local used = false if pointed_thing.under and minetest.get_node(pointed_thing.under).name == "mcl_core:obsidian" then - done = make_portal(pointed_thing.under) + make_portal(pointed_thing.under) else if pointed_thing.type == "node" then local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] From ec0219c66e93640069d85c38f8ecd404d92cab4c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 01:19:47 +0200 Subject: [PATCH 19/75] Use frame of quartz block for End portal instead --- mods/MAPGEN/mcl_portals/portal_end.lua | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index cc2dc8b96..1119814c8 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -14,6 +14,9 @@ local np_cave = { persist = 0.7 } +-- Portal frame material +local portal_frame = "mcl_nether:quartz_block" + -- Nodes minetest.register_node("mcl_portals:portal_end", { description = "End Portal", @@ -71,19 +74,19 @@ local function build_end_portal(pos, target3) local p2 = {x = p1.x + 3, y = p1.y + 4, z = p1.z} for i = 1, 4 do - minetest.set_node(p, {name = "mcl_nether:red_nether_brick"}) + minetest.set_node(p, {name = portal_frame}) p.y = p.y + 1 end for i = 1, 3 do - minetest.set_node(p, {name = "mcl_nether:red_nether_brick"}) + minetest.set_node(p, {name = portal_frame}) p.x = p.x + 1 end for i = 1, 4 do - minetest.set_node(p, {name = "mcl_nether:red_nether_brick"}) + minetest.set_node(p, {name = portal_frame}) p.y = p.y - 1 end for i = 1, 3 do - minetest.set_node(p, {name = "mcl_nether:red_nether_brick"}) + minetest.set_node(p, {name = portal_frame}) p.x = p.x - 1 end @@ -144,7 +147,7 @@ local function move_check2(p1, max, dir) while p[dir] ~= max do p[dir] = p[dir] + d - if minetest.get_node(p).name ~= "mcl_nether:red_nether_brick" then + if minetest.get_node(p).name ~= portal_frame then return false end end @@ -309,7 +312,7 @@ minetest.register_abm({ --[[ ITEM OVERRIDES ]] -- Frame material -minetest.override_item("mcl_nether:red_nether_brick", { +minetest.override_item(portal_frame, { on_destruct = function(pos) local meta = minetest.get_meta(pos) local p1 = minetest.string_to_pos(meta:get_string("p1")) @@ -323,7 +326,7 @@ minetest.override_item("mcl_nether:red_nether_brick", { for y = p1.y, p2.y do for z = p1.z, p2.z do local nn = minetest.get_node({x = x, y = y, z = z}).name - if nn == "mcl_nether:red_nether_brick" or nn == "mcl_portals:portal_end" then + if nn == portal_frame or nn == "mcl_portals:portal_end" then if nn == "mcl_portals:portal_end" then minetest.remove_node({x = x, y = y, z = z}) end @@ -350,7 +353,7 @@ minetest.override_item("mcl_nether:red_nether_brick", { for y = p1.y, p2.y do for z = p1.z, p2.z do local nn = minetest.get_node({x = x, y = y, z = z}).name - if nn == "mcl_nether:red_nether_brick" or nn == "mcl_portals:portal_end" then + if nn == portal_frame or nn == "mcl_portals:portal_end" then if nn == "mcl_portals:portal_end" then minetest.remove_node({x = x, y = y, z = z}) end @@ -368,12 +371,12 @@ minetest.override_item("mcl_nether:red_nether_brick", { -- Portal opener minetest.override_item("mcl_end:ender_eye", { _doc_items_longdesc = "An eye of ander can be used to open a portal to the End.", - _doc_items_usagehelp = "To open an End portal, place an upright frame of red nether brick blocks with a length of 4 and a height of 5 blocks, leaving only air in the center. After placing this frame, use the nether quartz on the frame.", + _doc_items_usagehelp = "To open an End portal, place an upright frame of quartz blocks with a length of 4 and a height of 5 blocks, leaving only air in the center. After placing this frame, use the eye of ender on the frame.", on_place = function(itemstack, user, pointed_thing) local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] --new -- If used on frame, open portal - if pointed_thing.under and minetest.get_node(pointed_thing.under).name == "mcl_nether:red_nether_brick" then + if pointed_thing.under and minetest.get_node(pointed_thing.under).name == portal_frame then make_end_portal(pointed_thing.under) minetest.sound_play( "fire_flint_and_steel", From 54dc6e8ffbcefa99c22dc1faf68e39d83365f3aa Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 01:33:36 +0200 Subject: [PATCH 20/75] Remove some portal hackery --- mods/MAPGEN/mcl_portals/portal_end.lua | 5 ++--- mods/MAPGEN/mcl_portals/portal_nether.lua | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index 1119814c8..d9cc1b64d 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -274,11 +274,11 @@ minetest.register_abm({ minetest.emerge_area( vector.subtract(target3, 4), vector.add(target3, 4)) end + -- teleport the player minetest.after(3, function(obj, pos, target3) local objpos = obj:getpos() if objpos == nil then return end --maikerumine added for objects to travel - objpos.y = objpos.y + 0.1 -- Fix some glitches at -8000. FIXME: WTF? if minetest.get_node(objpos).name ~= "mcl_portals:portal_end" then return end @@ -289,13 +289,12 @@ minetest.register_abm({ if n and n.name ~= "mcl_portals:portal_end" then build_end_portal(target3, pos) minetest.after(2, check_and_build_end_portal, pos, target3) - minetest.after(4, check_and_build_end_portal, pos, target3) elseif not n then minetest.after(1, check_and_build_end_portal, pos, target3) end end - minetest.after(1, check_and_build_end_portal, pos, target3) + check_and_build_end_portal(pos, target3) -- Teleport obj:setpos(target3) diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/MAPGEN/mcl_portals/portal_nether.lua index c8c875eb0..21526e2e0 100644 --- a/mods/MAPGEN/mcl_portals/portal_nether.lua +++ b/mods/MAPGEN/mcl_portals/portal_nether.lua @@ -294,7 +294,6 @@ minetest.register_abm({ -- teleport the player minetest.after(3, function(obj, pos, target) local objpos = obj:getpos() if objpos == nil then return end --maikerumine added for objects to travel - objpos.y = objpos.y + 0.1 -- Fix some glitches at -8000 if minetest.get_node(objpos).name ~= "mcl_portals:portal" then return end @@ -305,13 +304,12 @@ minetest.register_abm({ if n and n.name ~= "mcl_portals:portal" then build_portal(target, pos) minetest.after(2, check_and_build_portal, pos, target) - minetest.after(4, check_and_build_portal, pos, target) elseif not n then minetest.after(1, check_and_build_portal, pos, target) end end - minetest.after(1, check_and_build_portal, pos, target) + check_and_build_portal(pos, target) -- Teleport obj:setpos(target) From acad50ae5ff147db0b1c511dd44ebd043be9afaf Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 01:58:17 +0200 Subject: [PATCH 21/75] Allow to teleport back to overworld --- mods/MAPGEN/mcl_portals/portal_end.lua | 7 +++---- mods/MAPGEN/mcl_portals/portal_nether.lua | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index d9cc1b64d..c476890b2 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -1,6 +1,5 @@ -- Parameters -local END_DEPTH = mcl_vars.mg_end_min local TCAVE = 0.6 local nobj_cave = nil -- 3D noise @@ -118,7 +117,7 @@ local function build_end_portal(pos, target3) end local function find_end_target3_y2(target3_x, target3_z) - local start_y = END_DEPTH + math.random(20, 120) -- Search start + local start_y = mcl_vars.mg_end_min + math.random(20, 120) -- Search start if not nobj_cave then nobj_cave = minetest.get_perlin(np_cave) end @@ -229,8 +228,8 @@ local function make_end_portal(pos) local target3 = {x = p1.x, y = p1.y, z = p1.z} target3.x = target3.x + 1 - if target3.y < END_DEPTH then - target3.y = math.random(-52, 100) + if target3.y < mcl_vars.mg_end_max and target3.y > mcl_vars.mg_end_min then + target3.y = math.random(mcl_vars.mg_overworld_min + 40, mcl_vars.mg_overworld_min + 96) else target3.y = find_end_target3_y2(target3.x, target3.z) end diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/MAPGEN/mcl_portals/portal_nether.lua index 21526e2e0..bf96af874 100644 --- a/mods/MAPGEN/mcl_portals/portal_nether.lua +++ b/mods/MAPGEN/mcl_portals/portal_nether.lua @@ -1,6 +1,5 @@ -- Parameters -local NETHER_DEPTH = mcl_vars.mg_nether_min local TCAVE = 0.6 local nobj_cave = nil @@ -117,7 +116,7 @@ local function build_portal(pos, target) end local function find_nether_target_y(target_x, target_z) - local start_y = NETHER_DEPTH + math.random(38, 117) -- Search start + local start_y = mcl_vars.mg_nether_min + math.random(38, 117) -- Search start if not nobj_cave then nobj_cave = minetest.get_perlin(np_cave) end @@ -228,8 +227,8 @@ local function make_portal(pos) local target = {x = p1.x, y = p1.y, z = p1.z} target.x = target.x + 1 - if target.y < NETHER_DEPTH then - target.y = math.random(-52, 100) + if target.y < mcl_vars.mg_nether_max and target.y > mcl_vars.mg_nether_min then + target.y = math.random(mcl_vars.mg_overworld_min + 40, mcl_vars.mg_overworld_min + 96) else target.y = find_nether_target_y(target.x, target.z) end From 272c456499207a655e5e0ab9406478e52f1a5f6a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 02:17:45 +0200 Subject: [PATCH 22/75] Portals are piston stoppers --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 8c1718e04..89d51b035 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -203,3 +203,5 @@ mesecon:register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_off") mesecon:register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_on") mesecon:register_mvps_stopper("mesecons_noteblock:noteblock") mesecon:register_mvps_stopper("3d_armor_stand:armor_stand") +mesecon:register_mvps_stopper("mcl_portals:portal") +mesecon:register_mvps_stopper("mcl_portals:portal_end") From 6018f0c7cdd2bba93219f330350e456e75d1848b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 03:27:31 +0200 Subject: [PATCH 23/75] Proper portal behaviour WRT explosions --- mods/MAPGEN/mcl_portals/portal_end.lua | 109 ++++++++++----------- mods/MAPGEN/mcl_portals/portal_nether.lua | 111 +++++++++++----------- 2 files changed, 110 insertions(+), 110 deletions(-) diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index c476890b2..c97ecd0a8 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -16,6 +16,52 @@ local np_cave = { -- Portal frame material local portal_frame = "mcl_nether:quartz_block" +-- Destroy portal if pos (portal frame or portal node) got destroyed +local destroy_portal = function(pos) + -- Deactivate Nether portal + local meta = minetest.get_meta(pos) + local p1 = minetest.string_to_pos(meta:get_string("p1")) + local p2 = minetest.string_to_pos(meta:get_string("p2")) + if not p1 or not p2 then + return + end + + local first = true + + -- p1 metadata of first node + local mp1 + for x = p1.x, p2.x do + for y = p1.y, p2.y do + for z = p1.z, p2.z do + local p = vector.new(x, y, z) + local m = minetest.get_meta(p) + if first then + --[[ Only proceed if the first node still has metadata. + If it doesn't have metadata, another node propably triggred the delection + routine earlier, so we bail out earlier to avoid an infinite cascade + of on_destroy events. ]] + mp1 = minetest.string_to_pos(m:get_string("p1")) + if not mp1 then + return + end + end + local nn = minetest.get_node(p).name + if nn == portal_frame or nn == "mcl_portals:portal_end" then + -- Remove portal nodes, but not myself + if nn == "mcl_portals:portal_end" and not vector.equals(p, pos) then + minetest.remove_node(p) + end + -- Clear metadata of portal nodes and the frame + m:set_string("p1", "") + m:set_string("p2", "") + m:set_string("target", "") + end + first = false + end + end + end +end + -- Nodes minetest.register_node("mcl_portals:portal_end", { description = "End Portal", @@ -64,7 +110,11 @@ minetest.register_node("mcl_portals:portal_end", { {-0.5, -0.5, -0.1, 0.5, 0.5, 0.1}, }, }, - groups = {not_in_creative_inventory = 1} + groups = {not_in_creative_inventory = 1}, + on_destruct = destroy_portal, + + _mcl_hardness = -1, + _mcl_blast_resistance = 18000000, }) local function build_end_portal(pos, target3) @@ -311,59 +361,7 @@ minetest.register_abm({ -- Frame material minetest.override_item(portal_frame, { - on_destruct = function(pos) - local meta = minetest.get_meta(pos) - local p1 = minetest.string_to_pos(meta:get_string("p1")) - local p2 = minetest.string_to_pos(meta:get_string("p2")) - local target3 = minetest.string_to_pos(meta:get_string("target3")) - if not p1 or not p2 then - return - end - - for x = p1.x, p2.x do - for y = p1.y, p2.y do - for z = p1.z, p2.z do - local nn = minetest.get_node({x = x, y = y, z = z}).name - if nn == portal_frame or nn == "mcl_portals:portal_end" then - if nn == "mcl_portals:portal_end" then - minetest.remove_node({x = x, y = y, z = z}) - end - local m = minetest.get_meta({x = x, y = y, z = z}) - m:set_string("p1", "") - m:set_string("p2", "") - m:set_string("target3", "") - end - end - end - end - - meta = minetest.get_meta(target3) - if not meta then - return - end - p1 = minetest.string_to_pos(meta:get_string("p1")) - p2 = minetest.string_to_pos(meta:get_string("p2")) - if not p1 or not p2 then - return - end - - for x = p1.x, p2.x do - for y = p1.y, p2.y do - for z = p1.z, p2.z do - local nn = minetest.get_node({x = x, y = y, z = z}).name - if nn == portal_frame or nn == "mcl_portals:portal_end" then - if nn == "mcl_portals:portal_end" then - minetest.remove_node({x = x, y = y, z = z}) - end - local m = minetest.get_meta({x = x, y = y, z = z}) - m:set_string("p1", "") - m:set_string("p2", "") - m:set_string("target3", "") - end - end - end - end - end, + on_destruct = destroy_portal, }) -- Portal opener @@ -376,6 +374,9 @@ minetest.override_item("mcl_end:ender_eye", { -- If used on frame, open portal if pointed_thing.under and minetest.get_node(pointed_thing.under).name == portal_frame then make_end_portal(pointed_thing.under) + if minetest.get_modpath("doc") then + doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal_end") + end minetest.sound_play( "fire_flint_and_steel", {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 8} diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/MAPGEN/mcl_portals/portal_nether.lua index bf96af874..0ce368273 100644 --- a/mods/MAPGEN/mcl_portals/portal_nether.lua +++ b/mods/MAPGEN/mcl_portals/portal_nether.lua @@ -13,6 +13,52 @@ local np_cave = { persist = 0.7 } +-- Destroy portal if pos (portal frame or portal node) got destroyed +local destroy_portal = function(pos) + -- Deactivate Nether portal + local meta = minetest.get_meta(pos) + local p1 = minetest.string_to_pos(meta:get_string("p1")) + local p2 = minetest.string_to_pos(meta:get_string("p2")) + if not p1 or not p2 then + return + end + + local first = true + + -- p1 metadata of first node + local mp1 + for x = p1.x, p2.x do + for y = p1.y, p2.y do + for z = p1.z, p2.z do + local p = vector.new(x, y, z) + local m = minetest.get_meta(p) + if first then + --[[ Only proceed if the first node still has metadata. + If it doesn't have metadata, another node propably triggred the delection + routine earlier, so we bail out earlier to avoid an infinite cascade + of on_destroy events. ]] + mp1 = minetest.string_to_pos(m:get_string("p1")) + if not mp1 then + return + end + end + local nn = minetest.get_node(p).name + if nn == "mcl_core:obsidian" or nn == "mcl_portals:portal" then + -- Remove portal nodes, but not myself + if nn == "mcl_portals:portal" and not vector.equals(p, pos) then + minetest.remove_node(p) + end + -- Clear metadata of portal nodes and the frame + m:set_string("p1", "") + m:set_string("p2", "") + m:set_string("target", "") + end + first = false + end + end + end +end + minetest.register_node("mcl_portals:portal", { description = "Nether Portal", tiles = { @@ -59,11 +105,13 @@ minetest.register_node("mcl_portals:portal", { {-0.5, -0.5, -0.1, 0.5, 0.5, 0.1}, }, }, - groups = {not_in_creative_inventory = 1} + groups = {not_in_creative_inventory = 1}, + on_destruct = destroy_portal, + + _mcl_hardness = -1, + _mcl_blast_resistance = 0, }) - - -- Functions --Build arrival portal local function build_portal(pos, target) @@ -327,59 +375,7 @@ minetest.register_abm({ -- Frame material minetest.override_item("mcl_core:obsidian", { - on_destruct = function(pos) - local meta = minetest.get_meta(pos) - local p1 = minetest.string_to_pos(meta:get_string("p1")) - local p2 = minetest.string_to_pos(meta:get_string("p2")) - local target = minetest.string_to_pos(meta:get_string("target")) - if not p1 or not p2 then - return - end - - for x = p1.x, p2.x do - for y = p1.y, p2.y do - for z = p1.z, p2.z do - local nn = minetest.get_node({x = x, y = y, z = z}).name - if nn == "mcl_core:obsidian" or nn == "mcl_portals:portal" then - if nn == "mcl_portals:portal" then - minetest.remove_node({x = x, y = y, z = z}) - end - local m = minetest.get_meta({x = x, y = y, z = z}) - m:set_string("p1", "") - m:set_string("p2", "") - m:set_string("target", "") - end - end - end - end - - meta = minetest.get_meta(target) - if not meta then - return - end - p1 = minetest.string_to_pos(meta:get_string("p1")) - p2 = minetest.string_to_pos(meta:get_string("p2")) - if not p1 or not p2 then - return - end - - for x = p1.x, p2.x do - for y = p1.y, p2.y do - for z = p1.z, p2.z do - local nn = minetest.get_node({x = x, y = y, z = z}).name - if nn == "mcl_core:obsidian" or nn == "mcl_portals:portal" then - if nn == "mcl_portals:portal" then - minetest.remove_node({x = x, y = y, z = z}) - end - local m = minetest.get_meta({x = x, y = y, z = z}) - m:set_string("p1", "") - m:set_string("p2", "") - m:set_string("target", "") - end - end - end - end - end, + on_destruct = destroy_portal, }) -- Portal opener @@ -396,6 +392,9 @@ minetest.override_item("mcl_fire:flint_and_steel", { if pointed_thing.under and minetest.get_node(pointed_thing.under).name == "mcl_core:obsidian" then make_portal(pointed_thing.under) + if minetest.get_modpath("doc") then + doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal") + end else if pointed_thing.type == "node" then local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] From 29873b96c1f980c0e6a80da71d6b13810aeae152 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 03:43:26 +0200 Subject: [PATCH 24/75] Rename portal node metadata --- mods/MAPGEN/mcl_portals/portal_end.lua | 30 +++++++++++++---------- mods/MAPGEN/mcl_portals/portal_nether.lua | 30 +++++++++++++---------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index c97ecd0a8..3fa1de6b3 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -20,8 +20,8 @@ local portal_frame = "mcl_nether:quartz_block" local destroy_portal = function(pos) -- Deactivate Nether portal local meta = minetest.get_meta(pos) - local p1 = minetest.string_to_pos(meta:get_string("p1")) - local p2 = minetest.string_to_pos(meta:get_string("p2")) + local p1 = minetest.string_to_pos(meta:get_string("portal_frame1")) + local p2 = minetest.string_to_pos(meta:get_string("portal_frame2")) if not p1 or not p2 then return end @@ -40,7 +40,7 @@ local destroy_portal = function(pos) If it doesn't have metadata, another node propably triggred the delection routine earlier, so we bail out earlier to avoid an infinite cascade of on_destroy events. ]] - mp1 = minetest.string_to_pos(m:get_string("p1")) + mp1 = minetest.string_to_pos(m:get_string("portal_frame1")) if not mp1 then return end @@ -52,9 +52,9 @@ local destroy_portal = function(pos) minetest.remove_node(p) end -- Clear metadata of portal nodes and the frame - m:set_string("p1", "") - m:set_string("p2", "") - m:set_string("target", "") + m:set_string("portal_frame1", "") + m:set_string("portal_frame2", "") + m:set_string("portal_target", "") end first = false end @@ -146,9 +146,9 @@ local function build_end_portal(pos, target3) minetest.set_node(p, {name = "mcl_portals:portal_end", param2 = 0}) end local meta = minetest.get_meta(p) - meta:set_string("p1", minetest.pos_to_string(p1)) - meta:set_string("p2", minetest.pos_to_string(p2)) - meta:set_string("target3", minetest.pos_to_string(target3)) + meta:set_string("portal_frame1", minetest.pos_to_string(p1)) + meta:set_string("portal_frame2", minetest.pos_to_string(p2)) + meta:set_string("portal_target", minetest.pos_to_string(target3)) if y ~= p1.y then for z = -2, 2 do @@ -296,9 +296,13 @@ local function make_end_portal(pos) minetest.set_node(p, {name = "mcl_portals:portal_end", param2 = param2}) end local meta = minetest.get_meta(p) - meta:set_string("p1", minetest.pos_to_string(p1)) - meta:set_string("p2", minetest.pos_to_string(p2)) - meta:set_string("target3", minetest.pos_to_string(target3)) + + -- Portal frame corners + meta:set_string("portal_frame1", minetest.pos_to_string(p1)) + meta:set_string("portal_frame2", minetest.pos_to_string(p2)) + + -- Portal target coordinates + meta:set_string("portal_target", minetest.pos_to_string(target3)) end end @@ -315,7 +319,7 @@ minetest.register_abm({ local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel if obj:is_player() or lua_entity then local meta = minetest.get_meta(pos) - local target3 = minetest.string_to_pos(meta:get_string("target3")) + local target3 = minetest.string_to_pos(meta:get_string("portal_target")) if target3 then -- force emerge of target3 area minetest.get_voxel_manip():read_from_map(target3, target3) diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/MAPGEN/mcl_portals/portal_nether.lua index 0ce368273..974565398 100644 --- a/mods/MAPGEN/mcl_portals/portal_nether.lua +++ b/mods/MAPGEN/mcl_portals/portal_nether.lua @@ -17,8 +17,8 @@ local np_cave = { local destroy_portal = function(pos) -- Deactivate Nether portal local meta = minetest.get_meta(pos) - local p1 = minetest.string_to_pos(meta:get_string("p1")) - local p2 = minetest.string_to_pos(meta:get_string("p2")) + local p1 = minetest.string_to_pos(meta:get_string("portal_frame1")) + local p2 = minetest.string_to_pos(meta:get_string("portal_frame2")) if not p1 or not p2 then return end @@ -37,7 +37,7 @@ local destroy_portal = function(pos) If it doesn't have metadata, another node propably triggred the delection routine earlier, so we bail out earlier to avoid an infinite cascade of on_destroy events. ]] - mp1 = minetest.string_to_pos(m:get_string("p1")) + mp1 = minetest.string_to_pos(m:get_string("portal_frame1")) if not mp1 then return end @@ -49,9 +49,9 @@ local destroy_portal = function(pos) minetest.remove_node(p) end -- Clear metadata of portal nodes and the frame - m:set_string("p1", "") - m:set_string("p2", "") - m:set_string("target", "") + m:set_string("portal_frame1", "") + m:set_string("portal_frame2", "") + m:set_string("portal_target", "") end first = false end @@ -143,9 +143,9 @@ local function build_portal(pos, target) minetest.set_node(p, {name = "mcl_portals:portal", param2 = 0}) end local meta = minetest.get_meta(p) - meta:set_string("p1", minetest.pos_to_string(p1)) - meta:set_string("p2", minetest.pos_to_string(p2)) - meta:set_string("target", minetest.pos_to_string(target)) + meta:set_string("portal_frame1", minetest.pos_to_string(p1)) + meta:set_string("portal_frame2", minetest.pos_to_string(p2)) + meta:set_string("portal_target", minetest.pos_to_string(target)) if y ~= p1.y then for z = -2, 2 do @@ -294,9 +294,13 @@ local function make_portal(pos) minetest.set_node(p, {name = "mcl_portals:portal", param2 = param2}) end local meta = minetest.get_meta(p) - meta:set_string("p1", minetest.pos_to_string(p1)) - meta:set_string("p2", minetest.pos_to_string(p2)) - meta:set_string("target", minetest.pos_to_string(target)) + + -- Portal frame corners + meta:set_string("portal_frame1", minetest.pos_to_string(p1)) + meta:set_string("portal_frame2", minetest.pos_to_string(p2)) + + -- Portal target coordinates + meta:set_string("portal_target", minetest.pos_to_string(target)) end end @@ -330,7 +334,7 @@ minetest.register_abm({ local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel if obj:is_player() or lua_entity then local meta = minetest.get_meta(pos) - local target = minetest.string_to_pos(meta:get_string("target")) + local target = minetest.string_to_pos(meta:get_string("portal_target")) if target then -- force emerge of target area minetest.get_voxel_manip():read_from_map(target, target) From 817c52f92f053359d8d56ca77d3e9be607558609 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 04:12:34 +0200 Subject: [PATCH 25/75] Fix bugs in flint and ssteel and ender eye --- mods/ITEMS/mcl_fire/flint_and_steel.lua | 6 ++-- mods/ITEMS/mcl_fire/init.lua | 3 +- mods/ITEMS/mcl_tnt/init.lua | 4 +-- mods/MAPGEN/mcl_portals/portal_end.lua | 33 +++++++++++------- mods/MAPGEN/mcl_portals/portal_nether.lua | 42 +++++------------------ 5 files changed, 35 insertions(+), 53 deletions(-) diff --git a/mods/ITEMS/mcl_fire/flint_and_steel.lua b/mods/ITEMS/mcl_fire/flint_and_steel.lua index 8902c1604..91e46861b 100644 --- a/mods/ITEMS/mcl_fire/flint_and_steel.lua +++ b/mods/ITEMS/mcl_fire/flint_and_steel.lua @@ -1,8 +1,8 @@ -- Flint and Steel minetest.register_tool("mcl_fire:flint_and_steel", { description = "Flint and Steel", - _doc_items_longdesc = "Flint and steel is a tool to start fires and ignite blocks.", - _doc_items_usagehelp = "Rightclick the surface of a block to attempt to light a fire in front of it. On netherrack and magma blocks it will start an eternal fire. Using it on TNT will ignite it.", + _doc_items_longdesc = "Flint and steel is a tool to start fires, ignite blocks and open portals.", + _doc_items_usagehelp = "Rightclick the surface of a block to attempt to light a fire in front of it. On netherrack it will start an eternal fire. Using it on TNT will ignite it. To open a Nether portal, place an upright frame of obsidian with a length of 4 and a height of 5 blocks, leaving only air in the center. After placing this frame, use the flint and steel on inside of the frame.", inventory_image = "mcl_fire_flint_and_steel.png", liquids_pointable = false, stack_max = 1, @@ -25,7 +25,7 @@ minetest.register_tool("mcl_fire:flint_and_steel", { if pointed_thing.type == "node" then local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] if nodedef and nodedef._on_ignite then - nodedef._on_ignite(pointed_thing.under, user) + nodedef._on_ignite(user, pointed_thing) else mcl_fire.set_fire(pointed_thing) end diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 7c542c73e..0f0313a9d 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -376,7 +376,8 @@ local eternal_override = { minetest.remove_node(pos) end end, - _on_ignite = function(pos, player) + _on_ignite = function(player, pointed_thing) + local pos = pointed_thing.under local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} if minetest.get_node(flame_pos).name == "air" then minetest.set_node(flame_pos, {name = "mcl_fire:eternal_fire"}) diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index 4d0f59961..3e9a3c01f 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -71,8 +71,8 @@ minetest.register_node("mcl_tnt:tnt", { mesecons = {effector = { action_on = tnt.ignite }}, - _on_ignite = function(pos, player) - tnt.ignite(pos) + _on_ignite = function(player, pointed_thing) + tnt.ignite(pointed_thing.under) end, sounds = sounds, }) diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index 3fa1de6b3..81c2aad6f 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -373,20 +373,27 @@ minetest.override_item("mcl_end:ender_eye", { _doc_items_longdesc = "An eye of ander can be used to open a portal to the End.", _doc_items_usagehelp = "To open an End portal, place an upright frame of quartz blocks with a length of 4 and a height of 5 blocks, leaving only air in the center. After placing this frame, use the eye of ender on the frame.", on_place = function(itemstack, user, pointed_thing) - local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] --new - - -- If used on frame, open portal - if pointed_thing.under and minetest.get_node(pointed_thing.under).name == portal_frame then - make_end_portal(pointed_thing.under) - if minetest.get_modpath("doc") then - doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal_end") + -- Use pointed node's on_rightclick function first, if present + local node = minetest.get_node(pointed_thing.under) + if user and not user:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack end - minetest.sound_play( - "fire_flint_and_steel", - {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 8} - ) - if not minetest.setting_getbool("creative_mode") and used == true then - itemstack:take_item() -- 1 use + end + + -- If used on portal frame, open a portal + if pointed_thing.under and node.name == portal_frame then + local opened = make_end_portal(pointed_thing.under) + if opened then + if minetest.get_modpath("doc") then + doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal_end") + end + minetest.sound_play( + "fire_flint_and_steel", + {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 16}) + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() -- 1 use + end end end diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/MAPGEN/mcl_portals/portal_nether.lua index 974565398..09ac74c42 100644 --- a/mods/MAPGEN/mcl_portals/portal_nether.lua +++ b/mods/MAPGEN/mcl_portals/portal_nether.lua @@ -380,43 +380,17 @@ minetest.register_abm({ -- Frame material minetest.override_item("mcl_core:obsidian", { on_destruct = destroy_portal, -}) - --- Portal opener -minetest.override_item("mcl_fire:flint_and_steel", { - _doc_items_longdesc = "Flint and steel is a tool to start fires, ignite blocks and open portals.", - _doc_items_usagehelp = "Rightclick the surface of a block to attempt to light a fire in front of it. On netherrack it will start an eternal fire. Using it on TNT will ignite it. To open a Nether portal, place an upright frame of obsidian with a length of 4 and a height of 5 blocks, leaving only air in the center. After placing this frame, use the flint and steel on inside of the frame.", - on_place = function(itemstack, user, pointed_thing) - local idef = itemstack:get_definition() - minetest.sound_play( - "fire_flint_and_steel", - {pos = pointed_thing.above, gain = 0.5, max_hear_distance = 8} - ) - local used = false - - if pointed_thing.under and minetest.get_node(pointed_thing.under).name == "mcl_core:obsidian" then - make_portal(pointed_thing.under) - if minetest.get_modpath("doc") then - doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal") - end + _on_ignite = function(user, pointed_thing) + local pos = pointed_thing.under + local portal_placed = make_portal(pos) + if portal_placed and minetest.get_modpath("doc") then + doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal") else - if pointed_thing.type == "node" then - local nodedef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] - if nodedef._on_ignite then - nodedef._on_ignite(pointed_thing.under, user) - else - mcl_fire.set_fire(pointed_thing) - end - used = true + local node = minetest.get_node(pointed_thing.above) + if node.name ~= "mcl_portals:portal" then + mcl_fire.set_fire(pointed_thing) end end - if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then - minetest.sound_play(idef.sound.breaks, {pos=user:getpos(), gain=0.5}) - end - if not minetest.setting_getbool("creative_mode") and used == true then - itemstack:add_wear(65535/65) -- 65 uses - end - return itemstack end, }) From 3e3e9f39314e1b852c136436f912bf90b4aa0e63 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 04:21:59 +0200 Subject: [PATCH 26/75] Fix player pos detection in portals --- mods/MAPGEN/mcl_portals/portal_end.lua | 3 +++ mods/MAPGEN/mcl_portals/portal_nether.lua | 9 ++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index 81c2aad6f..75ef9415f 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -331,6 +331,9 @@ minetest.register_abm({ -- teleport the player minetest.after(3, function(obj, pos, target3) local objpos = obj:getpos() + -- If player stands, player is at ca. something+0.5 + -- which might cause precision problems, so we used ceil. + objpos.y = math.ceil(objpos.y) if objpos == nil then return end --maikerumine added for objects to travel if minetest.get_node(objpos).name ~= "mcl_portals:portal_end" then return diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/MAPGEN/mcl_portals/portal_nether.lua index 09ac74c42..e99cace5f 100644 --- a/mods/MAPGEN/mcl_portals/portal_nether.lua +++ b/mods/MAPGEN/mcl_portals/portal_nether.lua @@ -344,7 +344,14 @@ minetest.register_abm({ end -- teleport the player minetest.after(3, function(obj, pos, target) - local objpos = obj:getpos() if objpos == nil then return end --maikerumine added for objects to travel + local objpos = obj:getpos() + if objpos == nil then + return + end + -- If player stands, player is at ca. something+0.5 + -- which might cause precision problems, so we used ceil. + objpos.y = math.ceil(objpos.y) + if minetest.get_node(objpos).name ~= "mcl_portals:portal" then return end From 5c5c2ea1095a82a2ba9beef08b0b53c383cb45b3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 04:36:08 +0200 Subject: [PATCH 27/75] Fix portal corner metadata being able to be killed This was possible by re-using the same frame for multiple portals. --- mods/MAPGEN/mcl_portals/portal_end.lua | 8 ++++++++ mods/MAPGEN/mcl_portals/portal_nether.lua | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/MAPGEN/mcl_portals/portal_end.lua index 75ef9415f..126e7ae32 100644 --- a/mods/MAPGEN/mcl_portals/portal_end.lua +++ b/mods/MAPGEN/mcl_portals/portal_end.lua @@ -199,6 +199,14 @@ local function move_check2(p1, max, dir) if minetest.get_node(p).name ~= portal_frame then return false end + -- Abort if any of the portal frame blocks already has metadata. + -- This mod does not yet portals which neighbor each other directly. + -- TODO: Reorganize the way how portal frame coordinates are stored. + local meta = minetest.get_meta(p) + local p1 = meta:get_string("portal_frame1") + if minetest.string_to_pos(p1) ~= nil then + return false + end end return true diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/MAPGEN/mcl_portals/portal_nether.lua index e99cace5f..3e6b28021 100644 --- a/mods/MAPGEN/mcl_portals/portal_nether.lua +++ b/mods/MAPGEN/mcl_portals/portal_nether.lua @@ -196,6 +196,14 @@ local function move_check(p1, max, dir) if minetest.get_node(p).name ~= "mcl_core:obsidian" then return false end + -- Abort if any of the portal frame blocks already has metadata. + -- This mod does not yet portals which neighbor each other directly. + -- TODO: Reorganize the way how portal frame coordinates are stored. + local meta = minetest.get_meta(p) + local p1 = meta:get_string("portal_frame1") + if minetest.string_to_pos(p1) ~= nil then + return false + end end return true From 02f46da152fdfb466ba5fdfd8ea7f9b0d6555c0a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 04:56:14 +0200 Subject: [PATCH 28/75] Fix some bugs WRT eternal fire spawning --- mods/ITEMS/mcl_fire/init.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 0f0313a9d..45eb44972 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -379,8 +379,11 @@ local eternal_override = { _on_ignite = function(player, pointed_thing) local pos = pointed_thing.under local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} - if minetest.get_node(flame_pos).name == "air" then + local fn = minetest.get_node(flame_pos) + if fn.name == "air" and not minetest.is_protected(flame_pos, "fire") and pointed_thing.under.y < pointed_thing.above.y then minetest.set_node(flame_pos, {name = "mcl_fire:eternal_fire"}) + else + mcl_fire.set_fire(pointed_thing) end end, } @@ -393,7 +396,7 @@ end -- Set pointed_thing on (normal) fire mcl_fire.set_fire = function(pointed_thing) local n = minetest.get_node(pointed_thing.above) - if n.name ~= "" and n.name == "air" and not minetest.is_protected(pointed_thing.above, "fire") then + if n.name == "air" and not minetest.is_protected(pointed_thing.above, "fire") then minetest.add_node(pointed_thing.above, {name="mcl_fire:fire"}) end end From 073b55365a95aded022569437c0b71bf3a78623c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 05:28:02 +0200 Subject: [PATCH 29/75] Remove buggy Nether holes --- mods/MAPGEN/mcl_biomes/init.lua | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 90cd3e15a..601498587 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -829,18 +829,6 @@ local function register_biomelike_ores() --[[ NETHER GENERATION ]] - -- Generate holes in Nether - -- TODO: Is this a good idea? - minetest.register_ore({ - ore_type = "puff", - ore = "air", - wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 666, - clust_size = 4, - y_min = mcl_vars.mg_nether_min, - y_max = mcl_vars.mg_nether_max, - noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.60} - }) -- Soul sand minetest.register_ore({ From 4ac023a6aea18fcfa7ea6c51ba9edaf207319010 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 05:35:06 +0200 Subject: [PATCH 30/75] Make magma blocks more common --- mods/MAPGEN/mcl_biomes/init.lua | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 601498587..4dfadfee1 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -855,8 +855,18 @@ local function register_biomelike_ores() ore_type = "blob", ore = "mcl_nether:magma", wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 15*15*15, - clust_num_ores = 33, + clust_scarcity = 14*14*14, + clust_num_ores = 35, + clust_size = 4, + y_min = mcl_util.layer_to_y(23, "nether"), + y_max = mcl_util.layer_to_y(37, "nether"), + }) + minetest.register_ore({ + ore_type = "blob", + ore = "mcl_nether:magma", + wherein = {"mcl_nether:netherrack"}, + clust_scarcity = 9*9*9, + clust_num_ores = 50, clust_size = 5, y_min = mcl_util.layer_to_y(23, "nether"), y_max = mcl_util.layer_to_y(37, "nether"), From 04ec0929a8e644c5880c3a653120c2851afa2088 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 13:39:25 +0200 Subject: [PATCH 31/75] Move mcl_portals to ITEMS --- mods/{MAPGEN => ITEMS}/mcl_portals/LICENSE | 0 mods/{MAPGEN => ITEMS}/mcl_portals/README.md | 0 mods/{MAPGEN => ITEMS}/mcl_portals/depends.txt | 0 mods/{MAPGEN => ITEMS}/mcl_portals/description.txt | 0 mods/{MAPGEN => ITEMS}/mcl_portals/init.lua | 0 mods/{MAPGEN => ITEMS}/mcl_portals/mod.conf | 0 mods/{MAPGEN => ITEMS}/mcl_portals/portal_end.lua | 0 .../{MAPGEN => ITEMS}/mcl_portals/portal_nether.lua | 0 .../mcl_portals/sounds/mcl_portals_teleport.ogg | Bin .../mcl_portals/textures/mcl_portals_end_portal.png | Bin .../mcl_portals/textures/mcl_portals_particle.png | Bin .../mcl_portals/textures/mcl_portals_portal.png | Bin 12 files changed, 0 insertions(+), 0 deletions(-) rename mods/{MAPGEN => ITEMS}/mcl_portals/LICENSE (100%) rename mods/{MAPGEN => ITEMS}/mcl_portals/README.md (100%) rename mods/{MAPGEN => ITEMS}/mcl_portals/depends.txt (100%) rename mods/{MAPGEN => ITEMS}/mcl_portals/description.txt (100%) rename mods/{MAPGEN => ITEMS}/mcl_portals/init.lua (100%) rename mods/{MAPGEN => ITEMS}/mcl_portals/mod.conf (100%) rename mods/{MAPGEN => ITEMS}/mcl_portals/portal_end.lua (100%) rename mods/{MAPGEN => ITEMS}/mcl_portals/portal_nether.lua (100%) rename mods/{MAPGEN => ITEMS}/mcl_portals/sounds/mcl_portals_teleport.ogg (100%) rename mods/{MAPGEN => ITEMS}/mcl_portals/textures/mcl_portals_end_portal.png (100%) rename mods/{MAPGEN => ITEMS}/mcl_portals/textures/mcl_portals_particle.png (100%) rename mods/{MAPGEN => ITEMS}/mcl_portals/textures/mcl_portals_portal.png (100%) diff --git a/mods/MAPGEN/mcl_portals/LICENSE b/mods/ITEMS/mcl_portals/LICENSE similarity index 100% rename from mods/MAPGEN/mcl_portals/LICENSE rename to mods/ITEMS/mcl_portals/LICENSE diff --git a/mods/MAPGEN/mcl_portals/README.md b/mods/ITEMS/mcl_portals/README.md similarity index 100% rename from mods/MAPGEN/mcl_portals/README.md rename to mods/ITEMS/mcl_portals/README.md diff --git a/mods/MAPGEN/mcl_portals/depends.txt b/mods/ITEMS/mcl_portals/depends.txt similarity index 100% rename from mods/MAPGEN/mcl_portals/depends.txt rename to mods/ITEMS/mcl_portals/depends.txt diff --git a/mods/MAPGEN/mcl_portals/description.txt b/mods/ITEMS/mcl_portals/description.txt similarity index 100% rename from mods/MAPGEN/mcl_portals/description.txt rename to mods/ITEMS/mcl_portals/description.txt diff --git a/mods/MAPGEN/mcl_portals/init.lua b/mods/ITEMS/mcl_portals/init.lua similarity index 100% rename from mods/MAPGEN/mcl_portals/init.lua rename to mods/ITEMS/mcl_portals/init.lua diff --git a/mods/MAPGEN/mcl_portals/mod.conf b/mods/ITEMS/mcl_portals/mod.conf similarity index 100% rename from mods/MAPGEN/mcl_portals/mod.conf rename to mods/ITEMS/mcl_portals/mod.conf diff --git a/mods/MAPGEN/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua similarity index 100% rename from mods/MAPGEN/mcl_portals/portal_end.lua rename to mods/ITEMS/mcl_portals/portal_end.lua diff --git a/mods/MAPGEN/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua similarity index 100% rename from mods/MAPGEN/mcl_portals/portal_nether.lua rename to mods/ITEMS/mcl_portals/portal_nether.lua diff --git a/mods/MAPGEN/mcl_portals/sounds/mcl_portals_teleport.ogg b/mods/ITEMS/mcl_portals/sounds/mcl_portals_teleport.ogg similarity index 100% rename from mods/MAPGEN/mcl_portals/sounds/mcl_portals_teleport.ogg rename to mods/ITEMS/mcl_portals/sounds/mcl_portals_teleport.ogg diff --git a/mods/MAPGEN/mcl_portals/textures/mcl_portals_end_portal.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_end_portal.png similarity index 100% rename from mods/MAPGEN/mcl_portals/textures/mcl_portals_end_portal.png rename to mods/ITEMS/mcl_portals/textures/mcl_portals_end_portal.png diff --git a/mods/MAPGEN/mcl_portals/textures/mcl_portals_particle.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_particle.png similarity index 100% rename from mods/MAPGEN/mcl_portals/textures/mcl_portals_particle.png rename to mods/ITEMS/mcl_portals/textures/mcl_portals_particle.png diff --git a/mods/MAPGEN/mcl_portals/textures/mcl_portals_portal.png b/mods/ITEMS/mcl_portals/textures/mcl_portals_portal.png similarity index 100% rename from mods/MAPGEN/mcl_portals/textures/mcl_portals_portal.png rename to mods/ITEMS/mcl_portals/textures/mcl_portals_portal.png From 556370c4039c37f242d94f48fd1f316ba84eb07c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 13:40:39 +0200 Subject: [PATCH 32/75] Add portal textures to conversion list --- tools/Texture_Conversion_Table.csv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/Texture_Conversion_Table.csv b/tools/Texture_Conversion_Table.csv index a938e79bc..836004a0f 100644 --- a/tools/Texture_Conversion_Table.csv +++ b/tools/Texture_Conversion_Table.csv @@ -843,3 +843,5 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt /assets/minecraft/textures/entity/banner,base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_base.png,,,,,, /assets/minecraft/textures/items,banner_base.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_item_base.png,,,,,, /assets/minecraft/textures/items,banner_overlay.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_item_overlay.png,,,,,, +/assets/minecraft/textures/blocks,portal.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_portal.png,,,,,, +/assets/minecraft/textures/entity,end_portal.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_end_portal.png,,,,,, From f2bee2286f364c8acb1f37b52a617d2d23c9216c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 13:53:54 +0200 Subject: [PATCH 33/75] Make fire charge a normal igniter, too --- mods/ITEMS/mcl_fire/fire_charge.lua | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_fire/fire_charge.lua b/mods/ITEMS/mcl_fire/fire_charge.lua index dc3af8dd0..83612b870 100644 --- a/mods/ITEMS/mcl_fire/fire_charge.lua +++ b/mods/ITEMS/mcl_fire/fire_charge.lua @@ -15,17 +15,16 @@ minetest.register_craftitem("mcl_fire:fire_charge", { end end + -- Ignite/light fire if pointed_thing.type == "node" then - if minetest.get_node(pointed_thing.under).name == "mcl_tnt:tnt" then - tnt.ignite(pointed_thing.under) - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() - end + local nodedef = minetest.registered_nodes[node.name] + if nodedef and nodedef._on_ignite then + nodedef._on_ignite(user, pointed_thing) else mcl_fire.set_fire(pointed_thing) - if not minetest.settings:get_bool("creative_mode") then - itemstack:take_item() - end + end + if not minetest.settings:get_bool("creative_mode") then + itemstack:take_item() end end return itemstack From 130f05b9cd39c30f9606b690234d7173d6918278 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 15:08:07 +0200 Subject: [PATCH 34/75] Nether portals now work without corners, too --- mods/ITEMS/mcl_portals/portal_nether.lua | 57 ++++++++++++++---------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 3e6b28021..1378bc015 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -23,17 +23,17 @@ local destroy_portal = function(pos) return end - local first = true + local counter = 1 - -- p1 metadata of first node local mp1 for x = p1.x, p2.x do for y = p1.y, p2.y do for z = p1.z, p2.z do local p = vector.new(x, y, z) local m = minetest.get_meta(p) - if first then - --[[ Only proceed if the first node still has metadata. + if counter == 2 then + --[[ Only proceed if the second node still has metadata. + (first node is a corner and not needed for the portal) If it doesn't have metadata, another node propably triggred the delection routine earlier, so we bail out earlier to avoid an infinite cascade of on_destroy events. ]] @@ -53,7 +53,7 @@ local destroy_portal = function(pos) m:set_string("portal_frame2", "") m:set_string("portal_target", "") end - first = false + counter = counter + 1 end end end @@ -139,13 +139,15 @@ local function build_portal(pos, target) for x = p1.x, p2.x do for y = p1.y, p2.y do p = {x = x, y = y, z = p1.z} - if not (x == p1.x or x == p2.x or y == p1.y or y == p2.y) then - minetest.set_node(p, {name = "mcl_portals:portal", param2 = 0}) + if not ((x == p1.x or x == p2.x) and (y == p1.y or y == p2.y)) then + if not (x == p1.x or x == p2.x or y == p1.y or y == p2.y) then + minetest.set_node(p, {name = "mcl_portals:portal", param2 = 0}) + end + local meta = minetest.get_meta(p) + meta:set_string("portal_frame1", minetest.pos_to_string(p1)) + meta:set_string("portal_frame2", minetest.pos_to_string(p2)) + meta:set_string("portal_target", minetest.pos_to_string(target)) end - local meta = minetest.get_meta(p) - meta:set_string("portal_frame1", minetest.pos_to_string(p1)) - meta:set_string("portal_frame2", minetest.pos_to_string(p2)) - meta:set_string("portal_target", minetest.pos_to_string(target)) if y ~= p1.y then for z = -2, 2 do @@ -189,20 +191,25 @@ end local function move_check(p1, max, dir) local p = {x = p1.x, y = p1.y, z = p1.z} - local d = math.abs(max - p1[dir]) / (max - p1[dir]) + local d = math.sign(max - p1[dir]) + local min = p[dir] - while p[dir] ~= max do - p[dir] = p[dir] + d - if minetest.get_node(p).name ~= "mcl_core:obsidian" then + for k = min, max, d do + p[dir] = k + local node = minetest.get_node(p) + -- Check for obsidian (except at corners) + if k ~= min and k ~= max and node.name ~= "mcl_core:obsidian" then return false end -- Abort if any of the portal frame blocks already has metadata. -- This mod does not yet portals which neighbor each other directly. -- TODO: Reorganize the way how portal frame coordinates are stored. - local meta = minetest.get_meta(p) - local p1 = meta:get_string("portal_frame1") - if minetest.string_to_pos(p1) ~= nil then - return false + if node.name == "mcl_core:obsidian" then + local meta = minetest.get_meta(p) + local pframe1 = meta:get_string("portal_frame1") + if minetest.string_to_pos(pframe1) ~= nil then + return false + end end end @@ -289,16 +296,17 @@ local function make_portal(pos) target.y = find_nether_target_y(target.x, target.z) end - for d = 0, 3 do - for y = p1.y, p2.y do - local p = {} + local dmin, dmax, ymin, ymax = 0, 3, p1.y, p2.y + for d = dmin, dmax do + for y = ymin, ymax do + if not ((d == dmin or d == dmax) and (y == ymin or y == ymax)) then + local p if param2 == 0 then p = {x = p1.x + d, y = y, z = p1.z} else p = {x = p1.x, y = y, z = p1.z + d} end - if minetest.get_node(p).name == "air" - then + if minetest.get_node(p).name == "air" then minetest.set_node(p, {name = "mcl_portals:portal", param2 = param2}) end local meta = minetest.get_meta(p) @@ -311,6 +319,7 @@ local function make_portal(pos) meta:set_string("portal_target", minetest.pos_to_string(target)) end end + end return true end From 3318c2f5f3de3183d49037d52f2ccfc8b02bfd53 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 15:20:10 +0200 Subject: [PATCH 35/75] Move Nether portal frame size into vars --- mods/ITEMS/mcl_portals/portal_nether.lua | 29 +++++++++++++++--------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 1378bc015..221af24ac 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -3,6 +3,12 @@ local TCAVE = 0.6 local nobj_cave = nil +-- Portal frame sizes +local FRAME_SIZE_X_MIN = 4 +local FRAME_SIZE_Y_MIN = 5 +local FRAME_SIZE_X_MAX = 23 +local FRAME_SIZE_Y_MAX = 23 + -- 3D noise local np_cave = { offset = 0, @@ -119,19 +125,19 @@ local function build_portal(pos, target) local p1 = {x = pos.x - 1, y = pos.y - 1, z = pos.z} local p2 = {x = p1.x + 3, y = p1.y + 4, z = p1.z} - for i = 1, 4 do + for i = 1, FRAME_SIZE_Y_MIN - 1 do minetest.set_node(p, {name = "mcl_core:obsidian"}) p.y = p.y + 1 end - for i = 1, 3 do + for i = 1, FRAME_SIZE_X_MIN - 1 do minetest.set_node(p, {name = "mcl_core:obsidian"}) p.x = p.x + 1 end - for i = 1, 4 do + for i = 1, FRAME_SIZE_Y_MIN - 1 do minetest.set_node(p, {name = "mcl_core:obsidian"}) p.y = p.y - 1 end - for i = 1, 3 do + for i = 1, FRAME_SIZE_X_MIN - 1 do minetest.set_node(p, {name = "mcl_core:obsidian"}) p.x = p.x - 1 end @@ -246,16 +252,17 @@ local function check_portal(p1, p2) end local function is_portal(pos) - for d = -3, 3 do - for y = -4, 4 do + local xsize, ysize = FRAME_SIZE_X_MIN-1, FRAME_SIZE_Y_MIN-1 + for d = -xsize, xsize do + for y = -ysize, ysize do local px = {x = pos.x + d, y = pos.y + y, z = pos.z} local pz = {x = pos.x, y = pos.y + y, z = pos.z + d} - if check_portal(px, {x = px.x + 3, y = px.y + 4, z = px.z}) then - return px, {x = px.x + 3, y = px.y + 4, z = px.z} + if check_portal(px, {x = px.x + xsize, y = px.y + ysize, z = px.z}) then + return px, {x = px.x + xsize, y = px.y + ysize, z = px.z} end - if check_portal(pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3}) then - return pz, {x = pz.x, y = pz.y + 4, z = pz.z + 3} + if check_portal(pz, {x = pz.x, y = pz.y + ysize, z = pz.z + xsize}) then + return pz, {x = pz.x, y = pz.y + ysize, z = pz.z + xsize} end end end @@ -296,7 +303,7 @@ local function make_portal(pos) target.y = find_nether_target_y(target.x, target.z) end - local dmin, dmax, ymin, ymax = 0, 3, p1.y, p2.y + local dmin, dmax, ymin, ymax = 0, FRAME_SIZE_X_MIN - 1, p1.y, p2.y for d = dmin, dmax do for y = ymin, ymax do if not ((d == dmin or d == dmax) and (y == ymin or y == ymax)) then From 6dbd120397b30457de3e998e4422145eb5cef331 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 16:03:26 +0200 Subject: [PATCH 36/75] Fix End portal crash --- mods/ITEMS/mcl_portals/portal_end.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 126e7ae32..44f0e1436 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -339,10 +339,12 @@ minetest.register_abm({ -- teleport the player minetest.after(3, function(obj, pos, target3) local objpos = obj:getpos() + if objpos == nil then + return + end -- If player stands, player is at ca. something+0.5 -- which might cause precision problems, so we used ceil. objpos.y = math.ceil(objpos.y) - if objpos == nil then return end --maikerumine added for objects to travel if minetest.get_node(objpos).name ~= "mcl_portals:portal_end" then return end From 14678af2ed71c844f60eb8aba179a32992aba50e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 18:14:49 +0200 Subject: [PATCH 37/75] Portals: Fix rapid back-and-forth teleportation --- mods/ITEMS/mcl_portals/portal_end.lua | 22 ++++++++++++++++++++-- mods/ITEMS/mcl_portals/portal_nether.lua | 20 +++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 44f0e1436..d21c3ac9b 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -12,10 +12,14 @@ local np_cave = { octaves = 5, persist = 0.7 } - -- Portal frame material local portal_frame = "mcl_nether:quartz_block" +-- Table of objects (including players) which recently teleported by a +-- End portal. Those objects have a brief cooloff period before they +-- can teleport again. This prevents annoying back-and-forth teleportation. +local portal_cooloff = {} + -- Destroy portal if pos (portal frame or portal node) got destroyed local destroy_portal = function(pos) -- Deactivate Nether portal @@ -326,6 +330,10 @@ minetest.register_abm({ for _,obj in ipairs(minetest.get_objects_inside_radius(pos,1)) do --maikerumine added for objects to travel local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel if obj:is_player() or lua_entity then + -- No rapid back-and-forth teleportatio + if portal_cooloff[obj] then + return + end local meta = minetest.get_meta(pos) local target3 = minetest.string_to_pos(meta:get_string("portal_target")) if target3 then @@ -336,8 +344,12 @@ minetest.register_abm({ vector.subtract(target3, 4), vector.add(target3, 4)) end - -- teleport the player + -- teleport the object minetest.after(3, function(obj, pos, target3) + -- No rapid back-and-forth teleportatio + if portal_cooloff[obj] then + return + end local objpos = obj:getpos() if objpos == nil then return @@ -366,6 +378,12 @@ minetest.register_abm({ obj:setpos(target3) minetest.sound_play("mcl_portals_teleport", {pos=target3, gain=0.5, max_hear_distance = 16}) + -- Enable teleportation cooloff to prevent frequent back-and-forth teleportation + portal_cooloff[obj] = true + minetest.after(3, function(o) + portal_cooloff[o] = false + end, obj) + end, obj, pos, target3) end end diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 221af24ac..02430b231 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -19,6 +19,11 @@ local np_cave = { persist = 0.7 } +-- Table of objects (including players) which recently teleported by a +-- Nether portal. Those objects have a brief cooloff period before they +-- can teleport again. This prevents annoying back-and-forth teleportation. +local portal_cooloff = {} + -- Destroy portal if pos (portal frame or portal node) got destroyed local destroy_portal = function(pos) -- Deactivate Nether portal @@ -357,6 +362,10 @@ minetest.register_abm({ for _,obj in ipairs(minetest.get_objects_inside_radius(pos,1)) do --maikerumine added for objects to travel local lua_entity = obj:get_luaentity() --maikerumine added for objects to travel if obj:is_player() or lua_entity then + -- Prevent quick back-and-forth teleportation + if portal_cooloff[obj] then + return + end local meta = minetest.get_meta(pos) local target = minetest.string_to_pos(meta:get_string("portal_target")) if target then @@ -366,8 +375,12 @@ minetest.register_abm({ minetest.emerge_area( vector.subtract(target, 4), vector.add(target, 4)) end - -- teleport the player + -- teleport the object minetest.after(3, function(obj, pos, target) + -- Prevent quick back-and-forth teleportation + if portal_cooloff[obj] then + return + end local objpos = obj:getpos() if objpos == nil then return @@ -397,6 +410,11 @@ minetest.register_abm({ obj:setpos(target) minetest.sound_play("mcl_portals_teleport", {pos=target, gain=0.5, max_hear_distance = 16}) + -- Enable teleportation cooloff for 4 seconds, to prevent back-and-forth teleportation + portal_cooloff[obj] = true + minetest.after(4, function(o) + portal_cooloff[o] = false + end, obj) end, obj, pos, target) end From c178a60a6b7170592ecf18bf066d1e6fc11303d8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 18:41:58 +0200 Subject: [PATCH 38/75] Add portal help texts --- mods/ITEMS/mcl_portals/portal_end.lua | 2 ++ mods/ITEMS/mcl_portals/portal_nether.lua | 3 +++ 2 files changed, 5 insertions(+) diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index d21c3ac9b..990bba30d 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -69,6 +69,8 @@ end -- Nodes minetest.register_node("mcl_portals:portal_end", { description = "End Portal", + _doc_items_longdesc = "An End portal teleports creatures and objects to the mysterious End dimension (and back!).", + _doc_items_usagehelp = "Stand in the portal for a moment to activate the teleportation. Entering such a portal for the first time will create a new portal in your destination. End portal which were built in the End will lead back to the Overworld. An End portal is destroyed if any of its surrounding frame blocks is destroyed.", tiles = { "blank.png", "blank.png", diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 02430b231..93e53c9da 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -72,6 +72,9 @@ end minetest.register_node("mcl_portals:portal", { description = "Nether Portal", + _doc_items_longdesc = "A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!", + _doc_items_usagehelp = "Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.", + tiles = { "blank.png", "blank.png", From 987ad8eaf470a104565b7cb811f7ca7ae114dda5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 19:05:13 +0200 Subject: [PATCH 39/75] Add portal help texts, rewrite help of other items --- mods/ITEMS/mcl_fire/flint_and_steel.lua | 4 ++-- mods/ITEMS/mcl_portals/portal_end.lua | 8 ++++++-- mods/ITEMS/mcl_portals/portal_nether.lua | 7 ++++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_fire/flint_and_steel.lua b/mods/ITEMS/mcl_fire/flint_and_steel.lua index 91e46861b..9737c3adf 100644 --- a/mods/ITEMS/mcl_fire/flint_and_steel.lua +++ b/mods/ITEMS/mcl_fire/flint_and_steel.lua @@ -1,8 +1,8 @@ -- Flint and Steel minetest.register_tool("mcl_fire:flint_and_steel", { description = "Flint and Steel", - _doc_items_longdesc = "Flint and steel is a tool to start fires, ignite blocks and open portals.", - _doc_items_usagehelp = "Rightclick the surface of a block to attempt to light a fire in front of it. On netherrack it will start an eternal fire. Using it on TNT will ignite it. To open a Nether portal, place an upright frame of obsidian with a length of 4 and a height of 5 blocks, leaving only air in the center. After placing this frame, use the flint and steel on inside of the frame.", + _doc_items_longdesc = "Flint and steel is a tool to start fires and ignite blocks.", + _doc_items_usagehelp = "Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.", inventory_image = "mcl_fire_flint_and_steel.png", liquids_pointable = false, stack_max = 1, diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 990bba30d..21f6be544 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -396,15 +396,19 @@ minetest.register_abm({ --[[ ITEM OVERRIDES ]] +local portal_open_help = "To open an End portal, place an upright frame of quartz blocks with a length of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, use an eye of ender on the frame. The eye of ender is destroyed in the process." + -- Frame material minetest.override_item(portal_frame, { + _doc_items_longdesc = "A block of quartz can be used to create End portals.", + _doc_items_usagehelp = portal_open_help, on_destruct = destroy_portal, }) -- Portal opener minetest.override_item("mcl_end:ender_eye", { - _doc_items_longdesc = "An eye of ander can be used to open a portal to the End.", - _doc_items_usagehelp = "To open an End portal, place an upright frame of quartz blocks with a length of 4 and a height of 5 blocks, leaving only air in the center. After placing this frame, use the eye of ender on the frame.", + _doc_items_longdesc = "An eye of ender can be used to open End portals.", + _doc_items_usagehelp = portal_open_help, on_place = function(itemstack, user, pointed_thing) -- Use pointed node's on_rightclick function first, if present local node = minetest.get_node(pointed_thing.under) diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 93e53c9da..7789de420 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -429,8 +429,13 @@ minetest.register_abm({ --[[ ITEM OVERRIDES ]] --- Frame material +local longdesc = minetest.registered_nodes["mcl_core:obsidian"]._doc_items_longdesc +longdesc = longdesc .. "\n" .. "Obsidian is also used as the frame of Nether portals." +local usagehelp = "To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, ignite the obsidian with an appropriate tool, such as flint of steel." + minetest.override_item("mcl_core:obsidian", { + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, on_destruct = destroy_portal, _on_ignite = function(user, pointed_thing) local pos = pointed_thing.under From b2171b7f2589684dafdbedffd68912bac13bda7b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 19:17:42 +0200 Subject: [PATCH 40/75] Remove some temp. recipes and lift some WIP items --- mods/MISC/mcl_temp_helper_recipes/depends.txt | 4 +- mods/MISC/mcl_temp_helper_recipes/init.lua | 62 ++----------------- mods/MISC/mcl_wip/init.lua | 2 - 3 files changed, 9 insertions(+), 59 deletions(-) diff --git a/mods/MISC/mcl_temp_helper_recipes/depends.txt b/mods/MISC/mcl_temp_helper_recipes/depends.txt index 7e0cdd5dd..a1ce09984 100644 --- a/mods/MISC/mcl_temp_helper_recipes/depends.txt +++ b/mods/MISC/mcl_temp_helper_recipes/depends.txt @@ -1,4 +1,6 @@ mcl_core mcl_mobitems -mcl_dye mcl_end +mcl_nether +mcl_ocean +xpanes diff --git a/mods/MISC/mcl_temp_helper_recipes/init.lua b/mods/MISC/mcl_temp_helper_recipes/init.lua index 87388b24d..0209f1761 100644 --- a/mods/MISC/mcl_temp_helper_recipes/init.lua +++ b/mods/MISC/mcl_temp_helper_recipes/init.lua @@ -18,12 +18,12 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "mcl_core:redsand 8", - recipe = { - { "mcl_core:sand", "mcl_core:sand", "mcl_core:sand" }, - { "mcl_core:sand", "mcl_dye:red", "mcl_core:sand" }, - { "mcl_core:sand", "mcl_core:sand", "mcl_core:sand" }, - } + output = "mcl_end:end_stone", + recipe = { + { "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" }, + { "mcl_core:stone", "mcl_core:sandstone", "mcl_core:stone" }, + { "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" }, + }, }) minetest.register_craft({ @@ -48,23 +48,6 @@ minetest.register_craft({ }, }) -minetest.register_craft({ - output = "mcl_end:end_stone", - recipe = { - { "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" }, - { "mcl_core:stone", "mcl_core:sandstone", "mcl_core:stone" }, - { "mcl_core:sandstone", "mcl_core:stone", "mcl_core:sandstone" }, - }, -}) - -minetest.register_craft({ - output = "mcl_mobitems:blaze_rod", - recipe = { - { "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel"}, - { "mcl_fire:flint_and_steel", "mcl_core:stick", "mcl_fire:flint_and_steel" }, - { "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel", "mcl_fire:flint_and_steel"}, - } -}) minetest.register_craft({ output = "mcl_mobitems:shulker_shell", recipe = { @@ -74,15 +57,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "mcl_nether:quartz", - recipe = { - {"group:sand", "group:sand", "group:sand"}, - {"group:sand", "group:sand", "group:sand"}, - {"group:sand", "group:sand", "group:sand"}, - } -}) - minetest.register_craft({ output = "mcl_nether:nether_wart_item", recipe = { @@ -92,30 +66,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - type = "shapeless", - output = "mcl_nether:netherrack", - recipe = {"mcl_core:stone", "group:redsandstone"}, -}) - -minetest.register_craft({ - output = "mcl_nether:glowstone_dust", - recipe = { - {"mcl_torches:torch", "mcl_torches:torch", "mcl_torches:torch",}, - {"mcl_torches:torch", "mcl_core:coalblock", "mcl_torches:torch",}, - {"mcl_torches:torch", "mcl_torches:torch", "mcl_torches:torch",}, - }, -}) - -minetest.register_craft({ - output = "mcl_nether:soul_sand", - recipe = { - {"mcl_core:redsand","mcl_nether:netherrack","mcl_core:redsand"}, - {"mcl_nether:netherrack","mcl_core:redsand","mcl_nether:netherrack"}, - {"mcl_core:redsand","mcl_nether:netherrack","mcl_core:redsand"}, - }, -}) - minetest.register_craft({ output = "3d_armor:helmet_chain", recipe = { diff --git a/mods/MISC/mcl_wip/init.lua b/mods/MISC/mcl_wip/init.lua index bb29c9a65..8ed0d9579 100644 --- a/mods/MISC/mcl_wip/init.lua +++ b/mods/MISC/mcl_wip/init.lua @@ -4,7 +4,6 @@ local wip_items = { "mcl_anvils:anvil_damage_2", "mcl_core:darksapling", "mcl_core:apple_gold", - "mcl_end:ender_eye", "mcl_end:chorus_fruit", "mcl_end:chorus_flower", "mcl_end:chorus_flower_dead", @@ -15,7 +14,6 @@ local wip_items = { "gemalde:node_1", "mcl_observers:observer", "mcl_chests:trapped_chest", - "mobs_mc:llama", "mobs_mc:totem", "mcl_paintings:painting", } From 3fefbf5fc4ba597247c99aa9de6263a3595cc6c9 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 19:59:43 +0200 Subject: [PATCH 41/75] Add realm barrier between End and Overworld void --- mods/CORE/mcl_init/init.lua | 3 +++ mods/ITEMS/mcl_core/nodes_misc.lua | 2 ++ mods/MAPGEN/mcl_mapgen_core/init.lua | 6 ++++++ 3 files changed, 11 insertions(+) diff --git a/mods/CORE/mcl_init/init.lua b/mods/CORE/mcl_init/init.lua index ebf106e19..091d9cb1c 100644 --- a/mods/CORE/mcl_init/init.lua +++ b/mods/CORE/mcl_init/init.lua @@ -65,6 +65,9 @@ mcl_vars.mg_lava_nether_max = mcl_vars.mg_nether_min + 31 mcl_vars.mg_end_min = mcl_vars.mg_nether_max + 2000 mcl_vars.mg_end_max_official = mcl_vars.mg_end_min + minecraft_height_limit mcl_vars.mg_end_max = mcl_vars.mg_overworld_min - 2000 +-- Realm barrier used to safely separate the End from the void below the Overworld +mcl_vars.mg_realm_barrier_overworld_end_max = mcl_vars.mg_end_max +mcl_vars.mg_realm_barrier_overworld_end_min = mcl_vars.mg_end_max - 11 -- Set default stack sizes minetest.nodedef_default.stack_max = 64 diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua index 81274a49a..3c1c51f3a 100644 --- a/mods/ITEMS/mcl_core/nodes_misc.lua +++ b/mods/ITEMS/mcl_core/nodes_misc.lua @@ -153,6 +153,8 @@ minetest.register_node("mcl_core:realm_barrier", { wield_image = "mcl_core_barrier.png^[colorize:#FF00FF:127^[transformFX", tiles = { "blank.png" }, stack_max = 64, + -- To avoid players getting stuck forever between realms + damage_per_second = 8, sunlight_propagates = true, is_ground_content = false, pointable = false, diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 6e2dda738..0b8999cf0 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1215,6 +1215,7 @@ minetest.register_on_generated(function(minp, maxp) local c_bedrock = minetest.get_content_id("mcl_core:bedrock") local c_void = minetest.get_content_id("mcl_core:void") local c_lava = minetest.get_content_id("mcl_core:lava_source") + local c_realm_barrier = minetest.get_content_id("mcl_core:realm_barrier") local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") local c_air = minetest.get_content_id("air") @@ -1276,6 +1277,7 @@ minetest.register_on_generated(function(minp, maxp) if setdata then data[p_pos] = setdata lvm_used = true + -- Big lava seas by replacing air below a certain height elseif mcl_vars.mg_lava and data[p_pos] == c_air then if y <= mcl_vars.mg_lava_overworld_max and y >= mcl_vars.mg_overworld_min then data[p_pos] = c_lava @@ -1284,6 +1286,10 @@ minetest.register_on_generated(function(minp, maxp) data[p_pos] = c_nether_lava lvm_used = true end + -- Realm barrier between the Overworld void and the End + elseif y >= mcl_vars.mg_realm_barrier_overworld_end_min and y <= mcl_vars.mg_realm_barrier_overworld_end_max then + data[p_pos] = c_realm_barrier + lvm_used = true end end end From c97a14e96900d4d1fba5fec1a50a20ac6e7d367a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 20:22:30 +0200 Subject: [PATCH 42/75] Explode bed when used in End or Nether --- mods/ITEMS/mcl_beds/depends.txt | 2 ++ mods/ITEMS/mcl_beds/functions.lua | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/mods/ITEMS/mcl_beds/depends.txt b/mods/ITEMS/mcl_beds/depends.txt index 53f5b7c50..93b5fc03e 100644 --- a/mods/ITEMS/mcl_beds/depends.txt +++ b/mods/ITEMS/mcl_beds/depends.txt @@ -1,3 +1,5 @@ mcl_sounds? +mcl_util? mcl_wool? mcl_dye? +mcl_tnt? diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index cbb2c3c09..5f8e4daf0 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -136,6 +136,17 @@ function mcl_beds.skip_night() end function mcl_beds.on_rightclick(pos, player) + if minetest.get_modpath("mcl_init") then + local _, dim = mcl_util.y_to_layer(pos.y) + if dim == "nether" or dim == "end" then + -- Bed goes BOOM in the Nether or End. + minetest.remove_node(pos) + if minetest.get_modpath("mcl_tnt") then + tnt.boom(pos, {radius = 4, damage_radius = 4}) + end + return + end + end local name = player:get_player_name() local ppos = player:getpos() local tod = minetest.get_timeofday() * 24000 From c7fc3845c193123db105f5fcb30bb3332842e956 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 20:40:55 +0200 Subject: [PATCH 43/75] Disable compass+clock updates in Nether, End, Void --- mods/ITEMS/mcl_clock/depends.txt | 3 ++- mods/ITEMS/mcl_clock/init.lua | 14 +++++++++----- mods/ITEMS/mcl_compass/depends.txt | 1 + mods/ITEMS/mcl_compass/init.lua | 26 +++++++++++++++----------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/mods/ITEMS/mcl_clock/depends.txt b/mods/ITEMS/mcl_clock/depends.txt index 0430af2c8..bf2f4ce73 100644 --- a/mods/ITEMS/mcl_clock/depends.txt +++ b/mods/ITEMS/mcl_clock/depends.txt @@ -1,3 +1,4 @@ -mcl_core +mcl_init +mcl_util mesecons doc? diff --git a/mods/ITEMS/mcl_clock/init.lua b/mods/ITEMS/mcl_clock/init.lua index c011b1ee2..6a40630ce 100644 --- a/mods/ITEMS/mcl_clock/init.lua +++ b/mods/ITEMS/mcl_clock/init.lua @@ -76,11 +76,15 @@ minetest.register_globalstep(function(dtime) local players = minetest.get_connected_players() for p, player in ipairs(players) do for s, stack in ipairs(player:get_inventory():get_list("main")) do - local count = stack:get_count() - if stack:get_name() == mcl_clock.stereotype then - player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count) - elseif string.sub(stack:get_name(), 1, 16) == "mcl_clock:clock_" then - player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count) + local _, dim = mcl_util.y_to_layer(player:getpos().y) + -- Clocks do not work in the End, Nether or the Void + if dim ~= "end" and dim ~= "nether" and dim ~= "void" then + local count = stack:get_count() + if stack:get_name() == mcl_clock.stereotype then + player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count) + elseif string.sub(stack:get_name(), 1, 16) == "mcl_clock:clock_" then + player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count) + end end end end diff --git a/mods/ITEMS/mcl_compass/depends.txt b/mods/ITEMS/mcl_compass/depends.txt index 0430af2c8..53ee1117a 100644 --- a/mods/ITEMS/mcl_compass/depends.txt +++ b/mods/ITEMS/mcl_compass/depends.txt @@ -1,3 +1,4 @@ mcl_core +mcl_util mesecons doc? diff --git a/mods/ITEMS/mcl_compass/init.lua b/mods/ITEMS/mcl_compass/init.lua index b033c2b47..8c230b223 100644 --- a/mods/ITEMS/mcl_compass/init.lua +++ b/mods/ITEMS/mcl_compass/init.lua @@ -26,18 +26,22 @@ minetest.register_globalstep(function(dtime) end end local pos = player:getpos() - local dir = player:get_look_horizontal() - local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z)) - if angle_north < 0 then angle_north = angle_north + 360 end - local angle_dir = -math.deg(dir) - local angle_relative = (angle_north - angle_dir + 180) % 360 - local compass_image = math.floor((angle_relative/11.25) + 0.5)%32 + local _, dim = mcl_util.y_to_layer(pos.y) + -- Compasses do not work in the End, Nether or the Void + if dim ~= "end" and dim ~= "nether" and dim ~= "void" then + local dir = player:get_look_horizontal() + local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z)) + if angle_north < 0 then angle_north = angle_north + 360 end + local angle_dir = -math.deg(dir) + local angle_relative = (angle_north - angle_dir + 180) % 360 + local compass_image = math.floor((angle_relative/11.25) + 0.5)%32 - for j,stack in ipairs(player:get_inventory():get_list("main")) do - if minetest.get_item_group(stack:get_name(), "compass") ~= 0 and - minetest.get_item_group(stack:get_name(), "compass")-1 ~= compass_image then - local count = stack:get_count() - player:get_inventory():set_stack("main", j, ItemStack("mcl_compass:"..compass_image.." "..count)) + for j,stack in ipairs(player:get_inventory():get_list("main")) do + if minetest.get_item_group(stack:get_name(), "compass") ~= 0 and + minetest.get_item_group(stack:get_name(), "compass")-1 ~= compass_image then + local count = stack:get_count() + player:get_inventory():set_stack("main", j, ItemStack("mcl_compass:"..compass_image.." "..count)) + end end end end From 39f4573294d68f4307daca8c46cb9b47324734e3 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 21:26:09 +0200 Subject: [PATCH 44/75] Randomly spin compass and clock in VoidNetherEnd --- mods/ITEMS/mcl_clock/init.lua | 43 +++++++++++++++++-------- mods/ITEMS/mcl_compass/init.lua | 57 +++++++++++++++++++++------------ 2 files changed, 67 insertions(+), 33 deletions(-) diff --git a/mods/ITEMS/mcl_clock/init.lua b/mods/ITEMS/mcl_clock/init.lua index 6a40630ce..48bced175 100644 --- a/mods/ITEMS/mcl_clock/init.lua +++ b/mods/ITEMS/mcl_clock/init.lua @@ -12,10 +12,17 @@ mcl_clock.stereotype = "mcl_clock:clock" local watch = {} watch.old_time = -1 --- Image of all 64 possible faces +local clock_frames = 64 + +-- Timer for random clock spinning +local random_timer = 0.0 +local random_timer_trigger = 1.0 -- random clock spinning tick in seconds. Increase if there are performance problems +local random_frame = math.random(0, clock_frames-1) + +-- Image of all possible faces watch.images = {} -for frame=0,63 do - table.insert(watch.images, "mcl_clock_clock.png^[verticalframe:64:"..frame) +for frame=0, clock_frames-1 do + table.insert(watch.images, "mcl_clock_clock.png^[verticalframe:"..clock_frames..":"..frame) end local function round(num) @@ -23,9 +30,9 @@ local function round(num) end function watch.get_clock_frame() - local t = 64 * minetest.get_timeofday() + local t = clock_frames * minetest.get_timeofday() t = round(t) - if t == 64 then t = 0 end + if t == clock_frames then t = 0 end return tostring(t) end @@ -65,6 +72,12 @@ local force_clock_update_timer = 0 minetest.register_globalstep(function(dtime) local now = watch.get_clock_frame() force_clock_update_timer = force_clock_update_timer + dtime + random_timer = random_timer + dtime + -- This causes the random spinning of the clock + if random_timer >= random_timer_trigger then + random_frame = (random_frame + math.random(-4, 4)) % clock_frames + random_timer = 0 + end if watch.old_time == now and force_clock_update_timer < 60 then return @@ -77,14 +90,18 @@ minetest.register_globalstep(function(dtime) for p, player in ipairs(players) do for s, stack in ipairs(player:get_inventory():get_list("main")) do local _, dim = mcl_util.y_to_layer(player:getpos().y) + local frame -- Clocks do not work in the End, Nether or the Void - if dim ~= "end" and dim ~= "nether" and dim ~= "void" then - local count = stack:get_count() - if stack:get_name() == mcl_clock.stereotype then - player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count) - elseif string.sub(stack:get_name(), 1, 16) == "mcl_clock:clock_" then - player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..now.." "..count) - end + if dim == "end" or dim == "nether" or dim == "void" then + frame = random_frame + else + frame = now + end + local count = stack:get_count() + if stack:get_name() == mcl_clock.stereotype then + player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..frame.." "..count) + elseif minetest.get_item_group(stack:get_name(), "clock") ~= 0 then + player:get_inventory():set_stack("main", s, "mcl_clock:clock_"..frame.." "..count) end end end @@ -111,7 +128,7 @@ minetest.register_craft({ watch.register_item(mcl_clock.stereotype, watch.images[1], true, 1) -- Faces -for a=0,63,1 do +for a=0,clock_frames-1,1 do local b = a if b > 31 then b = b - 32 diff --git a/mods/ITEMS/mcl_compass/init.lua b/mods/ITEMS/mcl_compass/init.lua index 8c230b223..ff9db2aeb 100644 --- a/mods/ITEMS/mcl_compass/init.lua +++ b/mods/ITEMS/mcl_compass/init.lua @@ -1,9 +1,23 @@ mcl_compass = {} +local compass_frames = 32 + local default_spawn_settings = minetest.settings:get("static_spawnpoint") +-- Timer for random compass spinning +local random_timer = 0 +local random_timer_trigger = 0.5 -- random compass spinning tick in seconds. Increase if there are performance problems + +local random_frame = math.random(0, compass_frames-1) + minetest.register_globalstep(function(dtime) + random_timer = random_timer + dtime local players = minetest.get_connected_players() + + if random_timer >= random_timer_trigger then + random_frame = (random_frame + math.random(-1, 1)) % compass_frames + random_timer = 0 + end for i,player in ipairs(players) do local function has_compass(player) for _,stack in ipairs(player:get_inventory():get_list("main")) do @@ -14,34 +28,37 @@ minetest.register_globalstep(function(dtime) return false end if has_compass(player) then - local spawn = {x=0,y=0,z=0} - local s = minetest.settings:get("static_spawnpoint") - if s then - local numbers = string.split(s, ",") - spawn.x = tonumber(numbers[1]) - spawn.y = tonumber(numbers[2]) - spawn.z = tonumber(numbers[3]) - if type(spawn.x) ~= "number" and type(spawn.y) ~= "number" and type(spawn.z) ~= "number" then - spawn = {x=0,y=0,z=0} - end - end local pos = player:getpos() local _, dim = mcl_util.y_to_layer(pos.y) + local compass_image -- Compasses do not work in the End, Nether or the Void - if dim ~= "end" and dim ~= "nether" and dim ~= "void" then + if dim == "end" or dim == "nether" or dim == "void" then + compass_image = random_frame + else + local spawn = {x=0,y=0,z=0} + local s = minetest.settings:get("static_spawnpoint") + if s then + local numbers = string.split(s, ",") + spawn.x = tonumber(numbers[1]) + spawn.y = tonumber(numbers[2]) + spawn.z = tonumber(numbers[3]) + if type(spawn.x) ~= "number" and type(spawn.y) ~= "number" and type(spawn.z) ~= "number" then + spawn = {x=0,y=0,z=0} + end + end local dir = player:get_look_horizontal() local angle_north = math.deg(math.atan2(spawn.x - pos.x, spawn.z - pos.z)) if angle_north < 0 then angle_north = angle_north + 360 end local angle_dir = -math.deg(dir) local angle_relative = (angle_north - angle_dir + 180) % 360 - local compass_image = math.floor((angle_relative/11.25) + 0.5)%32 + compass_image = math.floor((angle_relative/11.25) + 0.5) % compass_frames + end - for j,stack in ipairs(player:get_inventory():get_list("main")) do - if minetest.get_item_group(stack:get_name(), "compass") ~= 0 and - minetest.get_item_group(stack:get_name(), "compass")-1 ~= compass_image then - local count = stack:get_count() - player:get_inventory():set_stack("main", j, ItemStack("mcl_compass:"..compass_image.." "..count)) - end + for j,stack in ipairs(player:get_inventory():get_list("main")) do + if minetest.get_item_group(stack:get_name(), "compass") ~= 0 and + minetest.get_item_group(stack:get_name(), "compass")-1 ~= compass_image then + local count = stack:get_count() + player:get_inventory():set_stack("main", j, ItemStack("mcl_compass:"..compass_image.." "..count)) end end end @@ -49,7 +66,7 @@ minetest.register_globalstep(function(dtime) end) local images = {} -for frame=0,31 do +for frame = 0, compass_frames-1 do local s = string.format("%02d", frame) table.insert(images, "mcl_compass_compass_"..s..".png") end From 974db128672f20b4eaf331d784659cbf447f8e2d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 23:14:02 +0200 Subject: [PATCH 45/75] Register dimension stuff independent of mapgen --- mods/MAPGEN/mcl_biomes/init.lua | 32 +++++++++++++++++----------- mods/MAPGEN/mcl_mapgen_core/init.lua | 4 ++-- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 4dfadfee1..c3af70d65 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1,7 +1,6 @@ -- --- Register biomes for mapgens other than v6 --- EXPERIMENTAL! +-- Register biomes -- local function register_classic_superflat_biome() @@ -549,13 +548,13 @@ local function register_biomes() heat_point = 50, humidity_point = 50, }) +end - +-- Register biomes of non-Overworld biomes +local function register_dimension_biomes() --[[ REALMS ]] - -- TODO: Make these work in v6, too. --[[ THE NETHER ]] - minetest.register_biome({ name = "nether", node_filler = "mcl_nether:netherrack", @@ -569,20 +568,18 @@ local function register_biomes() }) --[[ THE END ]] - minetest.register_biome({ name = "end", node_filler = "mcl_end:end_stone", node_stone = "mcl_end:end_stone", - y_min = mcl_vars.mg_end_min, - -- FIXME: For some reason the Nether stops generating early if this constant is not added. + -- FIXME: For some reason the End stops generating early if this constant is not added. -- Figure out why. + y_min = mcl_vars.mg_end_min, y_max = mcl_vars.mg_end_max + 80, heat_point = 50, humidity_point = 50, }) - end -- Register “fake” ores directly related to the biomes @@ -826,7 +823,10 @@ local function register_biomelike_ores() noise_threshold = 0.0, noise_params = {offset=0, scale=1, spread= {x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , }) +end +-- Non-Overworld ores +local function register_dimension_ores() --[[ NETHER GENERATION ]] @@ -1513,6 +1513,10 @@ local function register_decorations() }) +end + +-- Decorations in non-Overworld dimensions +local function register_dimension_decorations() --[[ NETHER decorations ]] -- Red Mushroom @@ -1560,10 +1564,8 @@ local function register_decorations() y_max = mcl_vars.mg_nether_max, decoration = "mcl_nether:nether_wart", }) - end - -- -- Detect mapgen to select functions -- @@ -1582,4 +1584,10 @@ elseif mg_name == "flat" then minetest.clear_registered_schematics() register_classic_superflat_biome() end --- v6 decorations are handled in mcl_mapgen_core + +-- Non-overworld stuff is registered independently +register_dimension_biomes() +register_dimension_ores() +register_dimension_decorations() + +-- Overworld decorations for v6 are handled in mcl_mapgen_core diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 0b8999cf0..07ffa36cb 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1266,8 +1266,8 @@ minetest.register_on_generated(function(minp, maxp) else -- Perfectly flat bedrock layer(s) if (y >= mcl_vars.mg_bedrock_overworld_min and y <= mcl_vars.mg_bedrock_overworld_max) or - (y >= mcl_vars.mg_bedrock_nether_bottom_min or y <= mcl_vars.mg_bedrock_bottom_max) or - (y >= mcl_vars.mg_bedrock_nether_top_min or y <= mcl_vars.mg_bedrock_top_max) then + (y >= mcl_vars.mg_bedrock_nether_bottom_min and y <= mcl_vars.mg_bedrock_nether_bottom_max) or + (y >= mcl_vars.mg_bedrock_nether_top_min and y <= mcl_vars.mg_bedrock_nether_top_max) then setdata = c_bedrock elseif mcl_util.is_in_void({x=x,y=y,z=z}) then setdata = c_void From dc1cb9b65983cb7083bfe647ebca0210544e99f5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 17 Aug 2017 23:58:35 +0200 Subject: [PATCH 46/75] The Nether is now supported in v6, too --- mods/MAPGEN/mcl_biomes/init.lua | 27 +++++++++++++----------- mods/MAPGEN/mcl_mapgen_core/init.lua | 31 +++++++++++++++++++++------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index c3af70d65..7f03f2b43 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -834,7 +834,9 @@ local function register_dimension_ores() minetest.register_ore({ ore_type = "sheet", ore = "mcl_nether:soul_sand", - wherein = {"mcl_nether:netherrack"}, + -- Note: Stone is included only for v6 mapgen support. Netherrack is not generated naturally + -- in v6, but instead set with the on_generated function in mcl_mapgen_core. + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 13 * 13 * 13, clust_size = 5, y_min = mcl_vars.mg_nether_min, @@ -854,7 +856,7 @@ local function register_dimension_ores() minetest.register_ore({ ore_type = "blob", ore = "mcl_nether:magma", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 14*14*14, clust_num_ores = 35, clust_size = 4, @@ -876,7 +878,7 @@ local function register_dimension_ores() minetest.register_ore({ ore_type = "blob", ore = "mcl_nether:glowstone", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 26 * 26 * 26, clust_size = 5, y_min = mcl_vars.mg_lava_nether_max + 10, @@ -896,7 +898,7 @@ local function register_dimension_ores() minetest.register_ore({ ore_type = "sheet", ore = "mcl_core:gravel", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, column_height_min = 1, column_height_max = 1, y_min = mcl_util.layer_to_y(63, "nether"), @@ -916,7 +918,7 @@ local function register_dimension_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:quartz_ore", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 850, clust_num_ores = 4, -- MC cluster amount: 4-10 clust_size = 3, @@ -926,7 +928,7 @@ local function register_dimension_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:quartz_ore", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 1650, clust_num_ores = 8, -- MC cluster amount: 4-10 clust_size = 4, @@ -938,7 +940,7 @@ local function register_dimension_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 500, clust_num_ores = 1, clust_size = 1, @@ -949,7 +951,7 @@ local function register_dimension_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 1000, clust_num_ores = 1, clust_size = 1, @@ -960,7 +962,7 @@ local function register_dimension_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 2000, clust_num_ores = 1, clust_size = 1, @@ -970,7 +972,7 @@ local function register_dimension_ores() minetest.register_ore({ ore_type = "scatter", ore = "mcl_nether:nether_lava_source", - wherein = {"mcl_nether:netherrack"}, + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity = 3500, clust_num_ores = 1, clust_size = 1, @@ -978,11 +980,12 @@ local function register_dimension_ores() y_max = mcl_vars.mg_nether_max, }) - -- Fire in the Nether + -- Fire in the Nether (hacky) + -- FIXME: Remove this when fire as decoration is available minetest.register_ore({ ore_type = "scatter", ore = "mcl_fire:eternal_fire", - wherein = "mcl_nether:netherrack", + wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, clust_scarcity =12 *22 * 12, clust_num_ores = 5, clust_size = 5, diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 07ffa36cb..777fc3e75 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -594,8 +594,8 @@ minetest.register_ore({ clust_scarcity = monster_egg_scarcity, clust_num_ores = 3, clust_size = 2, - y_min = -31000, - y_max = 31000, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, -- TODO: Limit by biome }) @@ -1058,7 +1058,7 @@ local lvm_buffer = {} -- Generate cocoas and vines at jungle trees within the bounding box local function generate_jungle_tree_decorations(minp, maxp) - if minetest.get_mapgen_setting("mg_name") == "v6" then + if mg_name == "v6" then if maxp.y < 0 then return @@ -1213,10 +1213,16 @@ minetest.register_on_generated(function(minp, maxp) -- Generate bedrock and lava layers if minp.y <= GEN_MAX then local c_bedrock = minetest.get_content_id("mcl_core:bedrock") + local c_stone = minetest.get_content_id("mcl_core:stone") + local c_dirt = minetest.get_content_id("mcl_core:dirt") + local c_sand = minetest.get_content_id("mcl_core:sand") local c_void = minetest.get_content_id("mcl_core:void") local c_lava = minetest.get_content_id("mcl_core:lava_source") - local c_realm_barrier = minetest.get_content_id("mcl_core:realm_barrier") + local c_soul_sand = minetest.get_content_id("mcl_nether:soul_sand") + local c_netherrack = minetest.get_content_id("mcl_nether:netherrack") local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") + local c_end_stone = minetest.get_content_id("mcl_end:end_stone") + local c_realm_barrier = minetest.get_content_id("mcl_core:realm_barrier") local c_air = minetest.get_content_id("air") local max_y = math.min(maxp.y, GEN_MAX) @@ -1260,8 +1266,6 @@ minetest.register_on_generated(function(minp, maxp) end if is_bedrock(y) then setdata = c_bedrock - elseif mcl_util.is_in_void({x=x,y=y,z=z}) then - setdata = c_void end else -- Perfectly flat bedrock layer(s) @@ -1269,14 +1273,14 @@ minetest.register_on_generated(function(minp, maxp) (y >= mcl_vars.mg_bedrock_nether_bottom_min and y <= mcl_vars.mg_bedrock_nether_bottom_max) or (y >= mcl_vars.mg_bedrock_nether_top_min and y <= mcl_vars.mg_bedrock_nether_top_max) then setdata = c_bedrock - elseif mcl_util.is_in_void({x=x,y=y,z=z}) then - setdata = c_void end end if setdata then data[p_pos] = setdata lvm_used = true + elseif mcl_util.is_in_void({x=x,y=y,z=z}) then + setdata = c_void -- Big lava seas by replacing air below a certain height elseif mcl_vars.mg_lava and data[p_pos] == c_air then if y <= mcl_vars.mg_lava_overworld_max and y >= mcl_vars.mg_overworld_min then @@ -1290,6 +1294,17 @@ minetest.register_on_generated(function(minp, maxp) elseif y >= mcl_vars.mg_realm_barrier_overworld_end_min and y <= mcl_vars.mg_realm_barrier_overworld_end_max then data[p_pos] = c_realm_barrier lvm_used = true + -- Nether and End support for v6 because v6 does not support the biomes API + elseif mg_name == "v6" then + if y <= mcl_vars.mg_nether_max and y >= mcl_vars.mg_nether_min then + if data[p_pos] == c_stone then + data[p_pos] = c_netherrack + elseif data[p_pos] == c_sand or data[p_pos] == c_dirt then + data[p_pos] = c_soul_sand + end + elseif y <= mcl_vars.mg_end_max and y >= mcl_vars.mg_end_min and (data[p_pos] == c_stone or data[p_pos] == c_dirt or data[p_pos] == c_sand) then + data[p_pos] = c_end_stone + end end end end From c01c3c5871adb353cddcfe815fda1e1d8de3700f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 00:36:31 +0200 Subject: [PATCH 47/75] Replace water with lava in the Nether --- mods/MAPGEN/mcl_mapgen_core/init.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 777fc3e75..a737405ae 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1218,6 +1218,7 @@ minetest.register_on_generated(function(minp, maxp) local c_sand = minetest.get_content_id("mcl_core:sand") local c_void = minetest.get_content_id("mcl_core:void") local c_lava = minetest.get_content_id("mcl_core:lava_source") + local c_water = minetest.get_content_id("mcl_core:water_source") local c_soul_sand = minetest.get_content_id("mcl_nether:soul_sand") local c_netherrack = minetest.get_content_id("mcl_nether:netherrack") local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") @@ -1290,6 +1291,9 @@ minetest.register_on_generated(function(minp, maxp) data[p_pos] = c_nether_lava lvm_used = true end + -- Water in the Nether? No way! + elseif data[p_pos] == c_water and y <= mcl_vars.mg_nether_max and y >= mcl_vars.mg_nether_min then + data[p_pos] = c_nether_lava -- Realm barrier between the Overworld void and the End elseif y >= mcl_vars.mg_realm_barrier_overworld_end_min and y <= mcl_vars.mg_realm_barrier_overworld_end_max then data[p_pos] = c_realm_barrier From f13aa521f64e7c35e9949a617537805903f9f22c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 00:53:07 +0200 Subject: [PATCH 48/75] Make magma blocks much more common --- mods/MAPGEN/mcl_biomes/init.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 7f03f2b43..6fa287792 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -857,9 +857,9 @@ local function register_dimension_ores() ore_type = "blob", ore = "mcl_nether:magma", wherein = {"mcl_nether:netherrack", "mcl_core:stone"}, - clust_scarcity = 14*14*14, - clust_num_ores = 35, - clust_size = 4, + clust_scarcity = 8*8*8, + clust_num_ores = 45, + clust_size = 6, y_min = mcl_util.layer_to_y(23, "nether"), y_max = mcl_util.layer_to_y(37, "nether"), }) @@ -867,9 +867,9 @@ local function register_dimension_ores() ore_type = "blob", ore = "mcl_nether:magma", wherein = {"mcl_nether:netherrack"}, - clust_scarcity = 9*9*9, - clust_num_ores = 50, - clust_size = 5, + clust_scarcity = 10*10*10, + clust_num_ores = 65, + clust_size = 8, y_min = mcl_util.layer_to_y(23, "nether"), y_max = mcl_util.layer_to_y(37, "nether"), }) From 28a085ae9828716844bc6ca36b78913aa5b1d353 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 00:53:23 +0200 Subject: [PATCH 49/75] Fix broken mapgen overrides in mcl_mapgen_core --- mods/MAPGEN/mcl_mapgen_core/init.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index a737405ae..5b82d1b85 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1282,6 +1282,7 @@ minetest.register_on_generated(function(minp, maxp) lvm_used = true elseif mcl_util.is_in_void({x=x,y=y,z=z}) then setdata = c_void + lvm_used = true -- Big lava seas by replacing air below a certain height elseif mcl_vars.mg_lava and data[p_pos] == c_air then if y <= mcl_vars.mg_lava_overworld_max and y >= mcl_vars.mg_overworld_min then @@ -1294,6 +1295,7 @@ minetest.register_on_generated(function(minp, maxp) -- Water in the Nether? No way! elseif data[p_pos] == c_water and y <= mcl_vars.mg_nether_max and y >= mcl_vars.mg_nether_min then data[p_pos] = c_nether_lava + lvm_used = true -- Realm barrier between the Overworld void and the End elseif y >= mcl_vars.mg_realm_barrier_overworld_end_min and y <= mcl_vars.mg_realm_barrier_overworld_end_max then data[p_pos] = c_realm_barrier @@ -1303,11 +1305,14 @@ minetest.register_on_generated(function(minp, maxp) if y <= mcl_vars.mg_nether_max and y >= mcl_vars.mg_nether_min then if data[p_pos] == c_stone then data[p_pos] = c_netherrack + lvm_used = true elseif data[p_pos] == c_sand or data[p_pos] == c_dirt then data[p_pos] = c_soul_sand + lvm_used = true end elseif y <= mcl_vars.mg_end_max and y >= mcl_vars.mg_end_min and (data[p_pos] == c_stone or data[p_pos] == c_dirt or data[p_pos] == c_sand) then data[p_pos] = c_end_stone + lvm_used = true end end end From 29119d2e2ce6f3bcd6d157360612cd2ee1a480f4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 02:42:26 +0200 Subject: [PATCH 50/75] Generate floating islands in the End --- mods/ITEMS/mcl_portals/portal_end.lua | 8 +++- mods/MAPGEN/mcl_biomes/init.lua | 68 ++++++++++++++------------- mods/MAPGEN/mcl_mapgen_core/init.lua | 9 ++-- 3 files changed, 47 insertions(+), 38 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 21f6be544..0be9e68bb 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -2,6 +2,10 @@ local TCAVE = 0.6 local nobj_cave = nil + +local SPAWN_MIN = mcl_vars.mg_end_min+70 +local SPAWN_MAX = mcl_vars.mg_end_min+98 + -- 3D noise local np_cave = { @@ -173,13 +177,13 @@ local function build_end_portal(pos, target3) end local function find_end_target3_y2(target3_x, target3_z) - local start_y = mcl_vars.mg_end_min + math.random(20, 120) -- Search start + local start_y = math.random(SPAWN_MIN, SPAWN_MAX) -- Search start if not nobj_cave then nobj_cave = minetest.get_perlin(np_cave) end local air = 0 -- Consecutive air nodes found - for y = start_y, start_y - 120, -1 do + for y = start_y, SPAWN_MIN, -1 do local nval_cave = nobj_cave:get3d({x = target3_x, y = y, z = target3_z}) if nval_cave > TCAVE then -- Cavern diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 6fa287792..291d759a7 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -570,12 +570,14 @@ local function register_dimension_biomes() --[[ THE END ]] minetest.register_biome({ name = "end", + node_stone = "air", node_filler = "mcl_end:end_stone", - node_stone = "mcl_end:end_stone", + node_water = "mcl_end:end_stone", + node_river_water = "air", -- FIXME: For some reason the End stops generating early if this constant is not added. -- Figure out why. y_min = mcl_vars.mg_end_min, - y_max = mcl_vars.mg_end_max + 80, + y_max = mcl_vars.mg_end_max, heat_point = 50, humidity_point = 50, }) @@ -609,7 +611,7 @@ local function register_biomelike_ores() --mcl_core STRATA minetest.register_ore({ - ore_type = "sheet", + ore_type = "blob", ore = "mcl_core:stone", wherein = {"mcl_colorblocks:hardened_clay_orange"}, clust_scarcity = 1, @@ -996,44 +998,46 @@ local function register_dimension_ores() --[[ THE END ]] -- Generate fake End - -- TODO: Remove both "ores" when there's a better End + -- TODO: Remove both "ores" when there's a better End generator minetest.register_ore({ - ore_type = "blob", + ore_type = "sheet", ore = "mcl_end:end_stone", - wherein = {"air", "mcl_core:stone"}, - clust_scarcity = 30 * 30 * 30, - clust_size = 17, - y_min = mcl_vars.mg_end_min, - y_max = mcl_vars.mg_end_max, - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.1, - spread = {x = 5, y = 5, z = 5}, - seed = 16, - octaves = 1, - persist = 0.0 + wherein = {"air"}, + y_min = mcl_vars.mg_end_min+64, + y_max = mcl_vars.mg_end_min+94, + column_height_min = 6, + column_height_max = 7, + column_midpoint_factor = 0.0, + noise_params = { + offset = -2, + scale = 8, + spread = {x=100, y=100, z=100}, + seed = 2999, + octaves = 5, + persist = 0.55, }, + noise_threshold = 0, }) minetest.register_ore({ - ore_type = "scatter", + ore_type = "sheet", ore = "mcl_end:end_stone", - wherein = {"air", "mcl_core:stone"}, - clust_scarcity = 30 * 30 * 30, - clust_size = 34, - y_min = mcl_vars.mg_end_min, - y_max = mcl_vars.mg_end_max, - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.1, - spread = {x = 70, y = 15, z = 70}, - seed = 16, - octaves = 1, - persist = 0.0 + wherein = {"air"}, + y_min = mcl_vars.mg_end_min+64, + y_max = mcl_vars.mg_end_min+94, + column_height_min = 4, + column_height_max = 4, + column_midpoint_factor = 0.0, + noise_params = { + offset = -4, + scale = 3, + spread = {x=200, y=200, z=200}, + seed = 5390, + octaves = 5, + persist = 0.6, }, + noise_threshold = 0, }) end diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 5b82d1b85..68687d971 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1300,7 +1300,11 @@ minetest.register_on_generated(function(minp, maxp) elseif y >= mcl_vars.mg_realm_barrier_overworld_end_min and y <= mcl_vars.mg_realm_barrier_overworld_end_max then data[p_pos] = c_realm_barrier lvm_used = true - -- Nether and End support for v6 because v6 does not support the biomes API + -- Clear the End + elseif y <= mcl_vars.mg_end_max and y >= mcl_vars.mg_end_min then + --data[p_pos] = c_air + --lvm_used = true + -- Nether support for v6 because v6 does not support the biomes API elseif mg_name == "v6" then if y <= mcl_vars.mg_nether_max and y >= mcl_vars.mg_nether_min then if data[p_pos] == c_stone then @@ -1310,9 +1314,6 @@ minetest.register_on_generated(function(minp, maxp) data[p_pos] = c_soul_sand lvm_used = true end - elseif y <= mcl_vars.mg_end_max and y >= mcl_vars.mg_end_min and (data[p_pos] == c_stone or data[p_pos] == c_dirt or data[p_pos] == c_sand) then - data[p_pos] = c_end_stone - lvm_used = true end end end From 0a0e66a3248c68262c770b761d0043765ed78489 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 02:57:57 +0200 Subject: [PATCH 51/75] Build obsidian platforms for end portal --- mods/ITEMS/mcl_portals/portal_end.lua | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 0be9e68bb..bc26faf90 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -160,15 +160,19 @@ local function build_end_portal(pos, target3) meta:set_string("portal_frame2", minetest.pos_to_string(p2)) meta:set_string("portal_target", minetest.pos_to_string(target3)) - if y ~= p1.y then - for z = -2, 2 do - if z ~= 0 then - p.z = p.z + z + for z = -2, 2 do + if z ~= 0 then + local newp = {x=p.x, y=p.y, z=p.z+z} + if y ~= p1.y then if minetest.registered_nodes[ - minetest.get_node(p).name].is_ground_content then - minetest.remove_node(p) + minetest.get_node(newp).name].is_ground_content then + minetest.remove_node(newp) end - p.z = p.z - z + else + if minetest.get_node(newp).name == "air" then + minetest.set_node(newp, {name="mcl_core:obsidian"}) + end + end end end From e30719a3bb02634ab9fe8f52b1b7994fa521ad67 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 13:28:20 +0200 Subject: [PATCH 52/75] Fix some mapgen bugs WRT The End --- mods/MAPGEN/mcl_biomes/init.lua | 4 ++-- mods/MAPGEN/mcl_mapgen_core/init.lua | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 291d759a7..dc2b63f34 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -571,8 +571,8 @@ local function register_dimension_biomes() minetest.register_biome({ name = "end", node_stone = "air", - node_filler = "mcl_end:end_stone", - node_water = "mcl_end:end_stone", + node_filler = "air", + node_water = "air", node_river_water = "air", -- FIXME: For some reason the End stops generating early if this constant is not added. -- Figure out why. diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 68687d971..a9ef2f97f 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1222,7 +1222,6 @@ minetest.register_on_generated(function(minp, maxp) local c_soul_sand = minetest.get_content_id("mcl_nether:soul_sand") local c_netherrack = minetest.get_content_id("mcl_nether:netherrack") local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") - local c_end_stone = minetest.get_content_id("mcl_end:end_stone") local c_realm_barrier = minetest.get_content_id("mcl_core:realm_barrier") local c_air = minetest.get_content_id("air") @@ -1281,7 +1280,7 @@ minetest.register_on_generated(function(minp, maxp) data[p_pos] = setdata lvm_used = true elseif mcl_util.is_in_void({x=x,y=y,z=z}) then - setdata = c_void + data[p_pos] = c_void lvm_used = true -- Big lava seas by replacing air below a certain height elseif mcl_vars.mg_lava and data[p_pos] == c_air then @@ -1300,11 +1299,7 @@ minetest.register_on_generated(function(minp, maxp) elseif y >= mcl_vars.mg_realm_barrier_overworld_end_min and y <= mcl_vars.mg_realm_barrier_overworld_end_max then data[p_pos] = c_realm_barrier lvm_used = true - -- Clear the End - elseif y <= mcl_vars.mg_end_max and y >= mcl_vars.mg_end_min then - --data[p_pos] = c_air - --lvm_used = true - -- Nether support for v6 because v6 does not support the biomes API + -- Nether and End support for v6 because v6 does not support the biomes API elseif mg_name == "v6" then if y <= mcl_vars.mg_nether_max and y >= mcl_vars.mg_nether_min then if data[p_pos] == c_stone then @@ -1314,6 +1309,11 @@ minetest.register_on_generated(function(minp, maxp) data[p_pos] = c_soul_sand lvm_used = true end + elseif y <= mcl_vars.mg_end_max and y >= mcl_vars.mg_end_min then + if data[p_pos] == c_stone or data[p_pos] == c_dirt or data[p_pos] == c_sand then + data[p_pos] = c_air + lvm_used = true + end end end end From b157c09a4e27aa89fab763842d0435f41f9511fb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 13:56:26 +0200 Subject: [PATCH 53/75] Replace water in the End --- mods/MAPGEN/mcl_mapgen_core/init.lua | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index a9ef2f97f..29f1ff1bf 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1291,10 +1291,18 @@ minetest.register_on_generated(function(minp, maxp) data[p_pos] = c_nether_lava lvm_used = true end - -- Water in the Nether? No way! - elseif data[p_pos] == c_water and y <= mcl_vars.mg_nether_max and y >= mcl_vars.mg_nether_min then - data[p_pos] = c_nether_lava - lvm_used = true + -- Water in the Nether or End? No way! + elseif data[p_pos] == c_water then + if y <= mcl_vars.mg_nether_max and y >= mcl_vars.mg_nether_min then + data[p_pos] = c_nether_lava + lvm_used = true + elseif y <= mcl_vars.mg_end_min + 104 and y >= mcl_vars.mg_end_min + 40 then + data[p_pos] = c_end_stone + lvm_used = true + elseif y <= mcl_vars.mg_end_max and y >= mcl_vars.mg_end_min then + data[p_pos] = c_air + lvm_used = true + end -- Realm barrier between the Overworld void and the End elseif y >= mcl_vars.mg_realm_barrier_overworld_end_min and y <= mcl_vars.mg_realm_barrier_overworld_end_max then data[p_pos] = c_realm_barrier @@ -1338,6 +1346,13 @@ minetest.register_on_generated(function(minp, maxp) end end + if minp.y >= mcl_vars.mg_end_min and maxp.y <= mcl_vars.mg_end_max then +-- local min, max = table.copy(minp), table.copy(maxp) +-- min.y = math.max(minp.y, mcl_vars.mg_end_min) +-- max.y = math.min(maxp.y, mcl_vars.mg_end_max) + vm:set_lighting({day=14, night=14}) + lvm_used = true + end if lvm_used then vm:set_data(data) vm:calc_lighting() From 12df4c98b47f3d16af3a69d2e999d30416bea9c0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 14:07:35 +0200 Subject: [PATCH 54/75] Minor mcl_biomes refactor --- mods/MAPGEN/mcl_biomes/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index dc2b63f34..898c082bf 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -559,6 +559,8 @@ local function register_dimension_biomes() name = "nether", node_filler = "mcl_nether:netherrack", node_stone = "mcl_nether:netherrack", + node_water = "air", + node_river_water = "air", y_min = mcl_vars.mg_nether_min, -- FIXME: For some reason the Nether stops generating early if this constant is not added. -- Figure out why. @@ -574,8 +576,6 @@ local function register_dimension_biomes() node_filler = "air", node_water = "air", node_river_water = "air", - -- FIXME: For some reason the End stops generating early if this constant is not added. - -- Figure out why. y_min = mcl_vars.mg_end_min, y_max = mcl_vars.mg_end_max, heat_point = 50, From cb1dbcb2db3c45a8cf0f3cf19fefd0b19eacf57e Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 14:10:49 +0200 Subject: [PATCH 55/75] Explain weird End lighting --- mods/MAPGEN/mcl_mapgen_core/init.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 29f1ff1bf..6bb4fac06 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1346,10 +1346,9 @@ minetest.register_on_generated(function(minp, maxp) end end + -- Set high light level in the End. This is very hacky and messes up the shadows below the End islands. + -- FIXME: Find a better way to do light. if minp.y >= mcl_vars.mg_end_min and maxp.y <= mcl_vars.mg_end_max then --- local min, max = table.copy(minp), table.copy(maxp) --- min.y = math.max(minp.y, mcl_vars.mg_end_min) --- max.y = math.min(maxp.y, mcl_vars.mg_end_max) vm:set_lighting({day=14, night=14}) lvm_used = true end From a1ed8380c01dae6adf666497b99acccc58282a54 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 14:19:43 +0200 Subject: [PATCH 56/75] Weather overwrites sky in Overworld only --- mods/ENVIRONMENT/weather_pack/skycolor.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mods/ENVIRONMENT/weather_pack/skycolor.lua b/mods/ENVIRONMENT/weather_pack/skycolor.lua index 6fe3870b1..0131c2383 100644 --- a/mods/ENVIRONMENT/weather_pack/skycolor.lua +++ b/mods/ENVIRONMENT/weather_pack/skycolor.lua @@ -74,7 +74,8 @@ skycolor = { players = skycolor.utils.get_players(players) for _, player in ipairs(players) do local pos = player:getpos() - if pos.y >= mcl_vars.mg_bedrock_overworld_max then + local _, dim = mcl_util.y_to_layer(pos.y) + if dim == "overworld" then player:set_sky(color, "plain", nil, true) end end @@ -112,7 +113,8 @@ skycolor = { local players = skycolor.utils.get_players(nil) for _, player in ipairs(players) do local pos = player:getpos() - if pos.y >= mcl_vars.mg_bedrock_overworld_max then + local _, dim = mcl_util.y_to_layer(pos.y) + if dim == "overworld" then player:set_sky(color, "plain", nil, true) end end @@ -125,7 +127,8 @@ skycolor = { local players = skycolor.utils.get_players(players) for _, player in ipairs(players) do local pos = player:getpos() - if pos.y >= mcl_vars.mg_bedrock_overworld_max then + local _, dim = mcl_util.y_to_layer(pos.y) + if dim == "overworld" then player:set_sky(nil, "regular", nil, true) end end From edfa125d3881b75cc84ea3979c5a28ad7b99de18 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 14:54:17 +0200 Subject: [PATCH 57/75] Set black sky in Nether and End --- mods/PLAYER/mcl_playerplus/init.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 6517158a2..3f6cc1818 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -153,12 +153,13 @@ minetest.register_globalstep(function(dtime) -- Apply black sky in the Void and deal Void damage local void, void_deadly = mcl_util.is_in_void(pos) - if void then - -- Player reached the void, set black sky box + local _, dim = mcl_util.y_to_layer(pos.y) + -- Set dimension skies. + -- FIXME: Sky handling in MCL2 is held together with lots of duct tape. + -- This only works beause weather_pack currently does not touch the sky for players below the height used for this check. + -- There should be a real skybox API. + if dim == "void" or dim == "nether" or dim == "end" then player:set_sky("#000000", "plain", nil, false) - -- FIXME: Sky handling in MCL2 is held together with lots of duct tape. - -- This only works beause weather_pack currently does not touch the sky for players below the height used for this check. - -- There should be a real skybox API. end if void_deadly then -- Player is deep into the void, deal void damage From 4927bcdc4ef729900580e8527c48144de45766e8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 15:11:43 +0200 Subject: [PATCH 58/75] Make Nether sky reddish --- mods/PLAYER/mcl_playerplus/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 3f6cc1818..c33e6edd3 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -158,8 +158,10 @@ minetest.register_globalstep(function(dtime) -- FIXME: Sky handling in MCL2 is held together with lots of duct tape. -- This only works beause weather_pack currently does not touch the sky for players below the height used for this check. -- There should be a real skybox API. - if dim == "void" or dim == "nether" or dim == "end" then + if dim == "void" or dim == "end" then player:set_sky("#000000", "plain", nil, false) + elseif dim == "nether" then + player:set_sky("#300810", "plain", nil, false) end if void_deadly then -- Player is deep into the void, deal void damage From 75d6806782309a8bdf7016a3b3b19562ea3ac6dc Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 15:32:08 +0200 Subject: [PATCH 59/75] Tweak spawning of shulkers and endermen --- mods/ENTITIES/mobs_mc/enderman.lua | 2 +- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- mods/ENTITIES/mobs_mc_gameconfig/init.lua | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 1161cb002..8f687b506 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -147,7 +147,7 @@ mobs:register_mob("mobs_mc:enderman", { -- End spawn -mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 3000, 4, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) +mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 3000, 18, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) -- Overworld spawn mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 9000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- Nether spawn (rare) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 8c7792930..aed2d2433 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -83,7 +83,7 @@ mobs:register_arrow("mobs_mc:shulkerbullet", { mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0) -mobs:spawn_specific("mobs_mc:shulker", "mcl_end:purpur_block", {"air"}, 0, minetest.LIGHT_MAX+1, 30, 5000, 2, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) +mobs:spawn_specific("mobs_mc:shulker", mobs_mc.spawn.end_city, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 15000, 2, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) if minetest.settings:get_bool("log_mods") then minetest.log("action", "MC Shulkers loaded") diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mobs_mc_gameconfig/init.lua index a8f403f17..124352db7 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua +++ b/mods/ENTITIES/mobs_mc_gameconfig/init.lua @@ -178,7 +178,8 @@ mobs_mc.override.spawn = { desert = { "group:sand" }, jungle = { "mcl_core:podzol", "mcl_core:jungletree", "mcl_core:jungleleaves", "mcl_flowers:fern" }, snow = { "mcl_core:snow", "mcl_core:snowblock", "mcl_core:dirt_with_grass_snow" }, - end_city = { "mcl_end:purpur_block" }, + -- End stone added for shulkers because End cities don't generate yet + end_city = { "mcl_end:end_stone", "mcl_end:purpur_block" }, nether = { "mcl_nether:netherrack", "mcl_nether:quartz_ore" }, -- Netherrack added because there are no Nether fortresses yet. TODO: Remove netherrac from list as soon they're available nether_fortress = { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, From 6b2da70ff7d9727108725977bf860fd6f368024f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 15:39:27 +0200 Subject: [PATCH 60/75] Add End sky texture --- mods/PLAYER/mcl_playerplus/init.lua | 5 ++++- .../textures/mcl_playerplus_end_sky.png | Bin 0 -> 98877 bytes tools/Texture_Conversion_Table.csv | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 mods/PLAYER/mcl_playerplus/textures/mcl_playerplus_end_sky.png diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index c33e6edd3..a4f7473d8 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -158,8 +158,11 @@ minetest.register_globalstep(function(dtime) -- FIXME: Sky handling in MCL2 is held together with lots of duct tape. -- This only works beause weather_pack currently does not touch the sky for players below the height used for this check. -- There should be a real skybox API. - if dim == "void" or dim == "end" then + if dim == "void" then player:set_sky("#000000", "plain", nil, false) + elseif dim == "end" then + local t = "mcl_playerplus_end_sky.png" + player:set_sky("#000000", "skybox", {t,t,t,t,t,t}, false) elseif dim == "nether" then player:set_sky("#300810", "plain", nil, false) end diff --git a/mods/PLAYER/mcl_playerplus/textures/mcl_playerplus_end_sky.png b/mods/PLAYER/mcl_playerplus/textures/mcl_playerplus_end_sky.png new file mode 100644 index 0000000000000000000000000000000000000000..e9671f3dc2007ce354a423bf65bfc4af80422eec GIT binary patch literal 98877 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%0DNRZT*QOmEs>uNUygtmutd_$FFLWWJe9 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%0Dx9u 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 H*YWv3{1*Sb literal 0 HcmV?d00001 diff --git a/tools/Texture_Conversion_Table.csv b/tools/Texture_Conversion_Table.csv index 836004a0f..29cb3ce66 100644 --- a/tools/Texture_Conversion_Table.csv +++ b/tools/Texture_Conversion_Table.csv @@ -845,3 +845,4 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt /assets/minecraft/textures/items,banner_overlay.png,/mods/ITEMS/mcl_banners/textures,mcl_banners_item_overlay.png,,,,,, /assets/minecraft/textures/blocks,portal.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_portal.png,,,,,, /assets/minecraft/textures/entity,end_portal.png,/mods/ITEMS/mcl_portals/textures,mcl_portals_end_portal.png,,,,,, +/assets/minecraft/textures/environment,end_sky.png,/mods/PLAYER/mcl_playerplus/textures,mcl_playerplus_end_sky.png,,,,,, From 95f62236f73c61a3d863eee1113dc6576109bd2a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 16:40:36 +0200 Subject: [PATCH 61/75] Fix Nether sky color --- mods/PLAYER/mcl_playerplus/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index a4f7473d8..02bd7b5cc 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -164,7 +164,7 @@ minetest.register_globalstep(function(dtime) local t = "mcl_playerplus_end_sky.png" player:set_sky("#000000", "skybox", {t,t,t,t,t,t}, false) elseif dim == "nether" then - player:set_sky("#300810", "plain", nil, false) + player:set_sky("#300808", "plain", nil, false) end if void_deadly then -- Player is deep into the void, deal void damage From 022682a75ed29633224a26c1399ecbbe8266a5c6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 21:25:29 +0200 Subject: [PATCH 62/75] Refactor: Drop legacy get_mapgen_params --- mods/ITEMS/mcl_core/functions.lua | 2 +- mods/MISC/mcl_commands/init.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index 5a181069b..ba27b4c15 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -642,7 +642,7 @@ end -local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_params().seed) +local grass_spread_randomizer = PseudoRandom(minetest.get_mapgen_setting("seed")) ------------------------------ -- Spread grass blocks and mycelium on neighbor dirt diff --git a/mods/MISC/mcl_commands/init.lua b/mods/MISC/mcl_commands/init.lua index 6c0b0b798..b3041ad06 100644 --- a/mods/MISC/mcl_commands/init.lua +++ b/mods/MISC/mcl_commands/init.lua @@ -138,7 +138,7 @@ minetest.register_chatcommand("seed", { params = "", privs = {}, func = function(name) - minetest.chat_send_player(name, string.format("%d", minetest.get_mapgen_params().seed)) + minetest.chat_send_player(name, string.format("%d", minetest.get_mapgen_setting("seed"))) end }) From cfd1456dab08ab2e0dbd39548c058a143144e197 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 18 Aug 2017 21:29:25 +0200 Subject: [PATCH 63/75] Mapgen: Call update_liquids less often --- mods/MAPGEN/mcl_mapgen_core/init.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 6bb4fac06..bc448cbf2 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -901,8 +901,7 @@ end -- Apply mapgen-specific mapgen code if mg_name == "v6" then register_mgv6_decorations() -end -if mg_name == "flat" then +elseif mg_name == "flat" then local classic = minetest.get_mapgen_setting("mcl_superflat_classic") if classic == nil then classic = minetest.settings:get_bool("mcl_superflat_classic") @@ -1209,6 +1208,7 @@ minetest.register_on_generated(function(minp, maxp) local data = vm:get_data(lvm_buffer) local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) local lvm_used = false + local liquids_used = false -- Generate bedrock and lava layers if minp.y <= GEN_MAX then @@ -1287,15 +1287,18 @@ minetest.register_on_generated(function(minp, maxp) if y <= mcl_vars.mg_lava_overworld_max and y >= mcl_vars.mg_overworld_min then data[p_pos] = c_lava lvm_used = true + liquids_used = true elseif y <= mcl_vars.mg_lava_nether_max and y >= mcl_vars.mg_nether_min then data[p_pos] = c_nether_lava lvm_used = true + liquids_used = true end -- Water in the Nether or End? No way! elseif data[p_pos] == c_water then if y <= mcl_vars.mg_nether_max and y >= mcl_vars.mg_nether_min then data[p_pos] = c_nether_lava lvm_used = true + liquids_used = true elseif y <= mcl_vars.mg_end_min + 104 and y >= mcl_vars.mg_end_min + 40 then data[p_pos] = c_end_stone lvm_used = true @@ -1355,7 +1358,9 @@ minetest.register_on_generated(function(minp, maxp) if lvm_used then vm:set_data(data) vm:calc_lighting() - vm:update_liquids() + if liquids_used then + vm:update_liquids() + end vm:write_to_map() end From c9f277f7e03ba8de5a4f1c0a9915ef44b64ea61d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 19 Aug 2017 11:17:38 +0200 Subject: [PATCH 64/75] Update sky color more often --- mods/PLAYER/mcl_playerplus/depends.txt | 1 + mods/PLAYER/mcl_playerplus/init.lua | 2 ++ 2 files changed, 3 insertions(+) diff --git a/mods/PLAYER/mcl_playerplus/depends.txt b/mods/PLAYER/mcl_playerplus/depends.txt index 45b93f966..467d9b138 100644 --- a/mods/PLAYER/mcl_playerplus/depends.txt +++ b/mods/PLAYER/mcl_playerplus/depends.txt @@ -6,3 +6,4 @@ mcl_hunger mcl_death_messages mcl_playerinfo 3d_armor? +weather_pack diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 02bd7b5cc..1d4debbf5 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -165,6 +165,8 @@ minetest.register_globalstep(function(dtime) player:set_sky("#000000", "skybox", {t,t,t,t,t,t}, false) elseif dim == "nether" then player:set_sky("#300808", "plain", nil, false) + else + skycolor.update_sky_color({player}) end if void_deadly then -- Player is deep into the void, deal void damage From dd5730a33da5086c1997c07cbeb53c28b3323047 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 20 Aug 2017 22:18:26 +0200 Subject: [PATCH 65/75] Fix water in the End --- mods/MAPGEN/mcl_mapgen_core/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index bc448cbf2..77b28decd 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1222,6 +1222,7 @@ minetest.register_on_generated(function(minp, maxp) local c_soul_sand = minetest.get_content_id("mcl_nether:soul_sand") local c_netherrack = minetest.get_content_id("mcl_nether:netherrack") local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") + local c_end_stone = minetest.get_content_id("mcl_end:end_stone") local c_realm_barrier = minetest.get_content_id("mcl_core:realm_barrier") local c_air = minetest.get_content_id("air") From b34c4ad4970f475a977113fd81dda21d84c2ca0f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 21 Aug 2017 02:25:22 +0200 Subject: [PATCH 66/75] Add important decorations for v7, v5, etc. --- mods/MAPGEN/mcl_biomes/depends.txt | 3 +- mods/MAPGEN/mcl_biomes/init.lua | 449 ++++++++++++++++++--------- mods/MAPGEN/mcl_mapgen_core/init.lua | 162 +--------- 3 files changed, 311 insertions(+), 303 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/depends.txt b/mods/MAPGEN/mcl_biomes/depends.txt index 442501faa..39cd4d88a 100644 --- a/mods/MAPGEN/mcl_biomes/depends.txt +++ b/mods/MAPGEN/mcl_biomes/depends.txt @@ -1,3 +1,4 @@ +mcl_init mcl_core mcl_farming -mcl_flowers +mcl_flowers \ No newline at end of file diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 898c082bf..055bf4e2c 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1,3 +1,4 @@ +local mg_name = minetest.get_mapgen_setting("mg_name") -- -- Register biomes @@ -48,7 +49,7 @@ local function register_biomes() minetest.register_biome({ name = "icesheet_ocean", node_dust = "mcl_core:snowblock", - node_top = "mcl_core:stone", + node_top = "mcl_core:dirt", depth_top = 1, node_filler = "mcl_core:stone", depth_filler = 3, @@ -89,11 +90,11 @@ local function register_biomes() minetest.register_biome({ name = "tundra_ocean", - node_top = "mcl_core:stone", + node_top = "mcl_core:dirt", depth_top = 1, node_filler = "mcl_core:stone", depth_filler = 3, - node_riverbed = "mcl_core:gravel", + node_riverbed = "mcl_core:dirt", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, y_max = -4, @@ -118,11 +119,11 @@ local function register_biomes() minetest.register_biome({ name = "taiga_ocean", - node_top = "mcl_core:stone", + node_top = "mcl_core:dirt", depth_top = 1, node_filler = "mcl_core:stone", depth_filler = 3, - node_riverbed = "mcl_core:stone", + node_riverbed = "mcl_core:dirt", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, y_max = 1, @@ -131,7 +132,6 @@ local function register_biomes() }) -- Snowy grassland - minetest.register_biome({ name = "snowy_grassland", node_dust = "mcl_core:snow", @@ -162,7 +162,6 @@ local function register_biomes() }) -- Grassland - minetest.register_biome({ name = "grassland", node_top = "mcl_core:dirt_with_grass", @@ -207,7 +206,6 @@ local function register_biomes() }) -- Coniferous forest - minetest.register_biome({ name = "coniferous_forest", node_top = "mcl_core:dirt_with_grass", @@ -251,8 +249,6 @@ local function register_biomes() }) -- Deciduous forest - - minetest.register_biome({ name = "deciduous_forest", node_top = "mcl_core:dirt_with_grass", @@ -296,7 +292,6 @@ local function register_biomes() }) -- Desert - minetest.register_biome({ name = "desert", node_top = "mcl_core:redsand", @@ -328,7 +323,6 @@ local function register_biomes() }) -- Sandstone desert - minetest.register_biome({ name = "sandstone_desert", node_top = "mcl_core:sand", @@ -360,7 +354,6 @@ local function register_biomes() }) -- Cold desert - minetest.register_biome({ name = "cold_desert", --node_dust = "", @@ -408,11 +401,11 @@ local function register_biomes() -- Savanna minetest.register_biome({ name = "savanna", - node_top = "mcl_core:dirt_with_grass", + node_top = "mcl_core:coarse_dirt", depth_top = 1, - node_filler = "mcl_core:dirt", + node_filler = "mcl_core:coarse_dirt", depth_filler = 1, - node_riverbed = "mcl_core:sand", + node_riverbed = "mcl_core:dirt", depth_riverbed = 2, y_min = 1, y_max = upper_limit, @@ -449,7 +442,6 @@ local function register_biomes() }) -- Rainforest - minetest.register_biome({ name = "rainforest", node_top = "mcl_core:podzol", @@ -597,7 +589,7 @@ local function register_biomelike_ores() clust_scarcity = 16 * 16 * 16, clust_size = 3, y_min = 25, - y_max = 31000, + y_max = mcl_vars.mg_overworld_max, noise_threshold = 0.0, noise_params = { offset = 0.5, @@ -814,17 +806,6 @@ local function register_biomelike_ores() noise_threshold = 0.0, noise_params = {offset=0, scale=1, spread={x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , }) - minetest.register_ore({ - ore_type = "sheet", - ore = "mcl_core:obsidian", - wherein = {"mcl_colorblocks:hardened_clay_orange"}, - - clust_size = 8, - y_min = 161, - y_max = 170, - noise_threshold = 0.0, - noise_params = {offset=0, scale=1, spread= {x=3100, y=3100, z=3100}, seed=23, octaves=3, persist=0.70} , - }) end -- Non-Overworld ores @@ -1046,23 +1027,182 @@ end -- All mapgens except mgv6 local function register_grass_decoration(offset, scale) + local noise_grass = { + offset = offset, + scale = scale, + spread = {x = 200, y = 200, z = 200}, + seed = 329, + octaves = 3, + persist = 0.6 + } minetest.register_decoration({ deco_type = "simple", - place_on = {"mcl_core:dirt_with_grass"}, + place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"}, + sidelen = 16, + noise_params = noise_grass, + biomes = {"grassland", "snowy_grassland", "coniferous_forest", "deciduous_forest", "savanna"}, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_flowers:tallgrass", + }) + + local noise_fern = table.copy(noise_grass) + noise_fern.seed = 923, + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow", "mcl_core:podzol", "mcl_core:podzol_snow"}, + sidelen = 16, + noise_params = noise_fern, + biomes = { "rainforest", "taiga", "cold_taiga", "mega_taiga" }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_flowers:fern", + }) +end + +-- Decorations which can be used by all mapgens, including v6, but not flat +local function register_shared_decorations() + + -- Doubletall grass + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=3, z=1 }, + data = { + { name = "air", prob = 0 }, + { name = "mcl_flowers:double_grass", param1=255, }, + { name = "mcl_flowers:double_grass_top", param1=255, }, + }, + }, + replacements = { + ["mcl_flowers:tallgrass"] = "mcl_flowers:double_grass" + }, + place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"}, sidelen = 16, noise_params = { - offset = offset, - scale = scale, - spread = {x = 200, y = 200, z = 200}, - seed = 329, + offset = 55,---0.01, + scale = 0.03, + spread = {x = 500, y = 500, z = 500}, + seed = 420, + octaves = 2, + persist = 0.6, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + flags = "", + biomes = {"grassland", "snowy_grassland", "coniferous_forest", "deciduous_forest", "savanna"}, + }) + + -- v6 hack: This makes sure large ferns only appear in jungles + local spawn_by, num_spawn_by + if mg_name == "v6" then + spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" } + num_spawn_by = 1 + end + -- Large ferns + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=3, z=1 }, + data = { + { name = "air", prob = 0 }, + { name = "mcl_flowers:double_fern", param1=255, }, + { name = "mcl_flowers:double_fern_top", param1=255, }, + }, + }, + replacements = { + ["mcl_flowers:fern"] = "mcl_flowers:double_fern" + }, + spawn_by = spawn_by, + num_spawn_by = num_spawn_by, + place_on = {"mcl_core:dirt_with_grass", "mcl_core:podzol"}, + + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.01, + spread = {x = 250, y = 250, z = 250}, + seed = 333, + octaves = 2, + persist = 0.66, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + flags = "", + biomes = { "rainforest", "taiga", "cold_taiga", "mega_taiga" }, + }) + + -- Cacti + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand"}, + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = {x = 100, y = 100, z = 100}, + seed = 257, octaves = 3, persist = 0.6 }, - biomes = {"grassland", "coniferous_forest", "deciduous_forest", "savanna"}, - y_min = 1, - y_max = 31000, - decoration = "mcl_flowers:tallgrass", + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_core:cactus", + biomes = {"desert","sandstone_desert","grassland_dunes", "coniferous_forest_dunes"}, + height = 1, + height_max = 3, }) + + -- Sugar canes + minetest.register_decoration({ + deco_type = "schematic", + place_on = {"mcl_core:dirt", "mcl_core:dirt_with_grass", "group:sand", "mcl_core:podzol"}, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x = 100, y = 100, z = 100}, + seed = 2, + octaves = 3, + persist = 0.7 + }, + biomes = {"grassland", "snowy_grassland", "beach", "desert", "sandstone_desert", "swamp"}, + y_min = 1, + y_max = 1, + decoration = "mcl_core:reeds", + height = 1, + height_max = 3, + spawn_by = { "mcl_core:water_source", "group:frosted_ice" }, + num_spawn_by = 1, + }) + + -- Pumpkin + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=2, z=1 }, + data = { + { name = "air", prob = 0 }, + { name = "mcl_farming:pumpkin_face", param1=255, }, + }, + }, + place_on = {"mcl_core:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.008, + scale = 0.00666, + spread = {x = 250, y = 250, z = 250}, + seed = 666, + octaves = 6, + persist = 0.666 + }, + biomes = {"grassland"}, + y_min = 3, + y_max = 29, + rotation = "random", + }) + end local function register_decorations() @@ -1349,58 +1489,6 @@ local function register_decorations() --TODO MAKE SCHEMATICS - - --Red Mushroom - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:mycelium"}, - sidelen = 80, - fill_ratio = 0.004, - biomes = {"mushroom"}, - y_min = -6000, - y_max = 31000, - decoration = "mcl_mushrooms:mushroom_red", - }) - --Brown Mushroom - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:mycelium"}, - sidelen = 80, - fill_ratio = 0.003, - biomes = {"mushroom"}, - y_min = -6000, - y_max = 31000, - decoration = "mcl_mushrooms:mushroom_brown", - }) - - --Red Mushroom - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:mycelium", "mcl_core:mycelium_snow"}, - sidelen = 80, - fill_ratio = 0.0002, - biomes = {"mushroom", "mushroom_cold"}, - y_min = -6000, - y_max = 31000, - decoration = "mcl_mushrooms:mushroom_red", - }) - - --Huge Mushroom - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:mycelium", "mcl_core:mycelium_snow"}, - sidelen = 80, - fill_ratio = 0.0004, - biomes = {"mushroom", "mushroom_cold"}, - y_min = -6000, - y_max = 31000, - schematic = minetest.get_modpath("mcl_mushrooms").."/schematics/mcl_mushrooms_huge_brown.mts", - flags = "place_center_x", - rotation = "random", - }) - - - --Huge Brown Mushroom minetest.register_decoration({ deco_type = "schematic", @@ -1429,6 +1517,60 @@ local function register_decorations() rotation = "random", }) + -- Large flowers + local register_large_flower = function(name, biomes, seed, offset) + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = { x=1, y=3, z=1 }, + data = { + { name = "air", prob = 0 }, + { name = "mcl_flowers:"..name, param1=255, }, + { name = "mcl_flowers:"..name.."_top", param1=255, }, + }, + }, + place_on = {"mcl_core:dirt_with_grass"}, + + sidelen = 16, + noise_params = { + offset = offset, + scale = 0.01, + spread = {x = 300, y = 300, z = 300}, + seed = seed, + octaves = 5, + persist = 0.62, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + flags = "", + biomes = biomes, + }) + end + + register_large_flower("rose_bush", {"deciduous_forest", "coniferous_forest", "flower_forest"}, 9350, -0.008) + register_large_flower("peony", {"deciduous_forest", "coniferous_forest", "flower_forest"}, 10450, -0.008) + register_large_flower("lilac", {"deciduous_forest", "coniferous_forest", "flower_forest"}, 10600, -0.007) + -- TODO: Make exclusive to sunflower plains + register_large_flower("sunflower", {"grassland", "sunflower_plains"}, 2940, -0.005) + + -- Melon + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:dirt_with_grass", "mcl_core:podzol"}, + sidelen = 16, + noise_params = { + offset = 0.003, + scale = 0.006, + spread = {x = 250, y = 250, z = 250}, + seed = 333, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_farming:melon", + biomes = { "rainforest" }, + }) -- Simple 1×1×1 moss stone minetest.register_decoration({ @@ -1441,52 +1583,8 @@ local function register_decorations() y_max = 31000, decoration = "mcl_core:mossycobble", }) - -- Cactus - - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:sand", "mcl_core:redsand"}, - sidelen = 16, - noise_params = { - offset = -0.0003, - scale = 0.0009, - spread = {x = 200, y = 200, z = 200}, - seed = 230, - octaves = 3, - persist = 0.6 - }, - biomes = {"desert"}, - y_min = 5, - y_max = 31000, - decoration = "mcl_core:cactus", - biomes = {"desert","sandstone_desert","grassland_dunes", "coniferous_forest_dunes"}, - height = 1, - height_max = 3, - }) - - -- Sugar canes - minetest.register_decoration({ - deco_type = "schematic", - place_on = {"mcl_core:dirt", "mcl_core:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = -0.3, - scale = 0.7, - spread = {x = 200, y = 200, z = 200}, - seed = 354, - octaves = 3, - persist = 0.7 - }, - biomes = {"grassland", "savanna", "beach", "desert", "savanna_swamp"}, - y_min = 0, - y_max = 0, - decoration = "mcl_core:reeds", - height = 1, - height_max = 3, - }) -- Grasses - register_grass_decoration(-0.03, 0.09) register_grass_decoration(-0.015, 0.075) register_grass_decoration(0, 0.06) @@ -1498,27 +1596,88 @@ local function register_decorations() register_grass_decoration(0.07, -0.01) register_grass_decoration(0.09, -0.03) - -- Dead bushes - + --Red Mushroom minetest.register_decoration({ deco_type = "simple", - place_on = {"mcl_core:sand", "mcl_core:redsand"}, + place_on = {"mcl_core:mycelium"}, + sidelen = 80, + fill_ratio = 0.003, + biomes = {"mushroom"}, + y_min = -6000, + y_max = 31000, + decoration = "mcl_mushrooms:mushroom_red", + }) + + --Brown Mushroom + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:mycelium"}, + sidelen = 80, + fill_ratio = 0.003, + biomes = {"mushroom"}, + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + decoration = "mcl_mushrooms:mushroom_brown", + }) + + -- Dead bushes + minetest.register_decoration({ + deco_type = "simple", + place_on = {"group:sand", "mcl_core:podzol", "mcl_core:podzol_snow", "mcl_core:dirt", "mcl_core:coarse_dirt", "group:hardened_clay"}, sidelen = 16, noise_params = { offset = 0, - scale = 0.02, - spread = {x = 200, y = 200, z = 200}, - seed = 329, + scale = 0.035, + spread = {x = 100, y = 100, z = 100}, + seed = 1972, octaves = 3, persist = 0.6 }, - biomes = {"desert"}, - y_min = 2, - y_max = 31000, + y_min = 4, + y_max = mcl_vars.mg_overworld_max, + biomes = {"desert", "sandstone_desert", "mesa", "taiga", "mega_taiga"}, decoration = "mcl_core:deadbush", height = 1, }) + local function register_flower(name, biomes, seed) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:dirt_with_grass", "mcl_core:podzol"}, + sidelen = 16, + noise_params = { + offset = 0.0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = seed, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + biomes = biomes, + decoration = "mcl_flowers:"..name, + }) + end + + local flower_biomes1 = {"grassland", "snowy_grassland", "sunflower_plains", "flower_forest", "deciduous_forest", "coniferous_forest", "taiga"} + + register_flower("dandelion", flower_biomes1, 8) + register_flower("poppy", flower_biomes1, 9439) + + local flower_biomes2 = {"grassland", "snowy_grassland", "sunflower_plains", "flower_forest"} + register_flower("tulip_red", flower_biomes2, 436) + register_flower("tulip_orange", flower_biomes2, 536) + register_flower("tulip_pink", flower_biomes2, 636) + register_flower("tulip_white", flower_biomes2, 736) + register_flower("azure_bluet", flower_biomes2, 800) + register_flower("oxeye_daisy", flower_biomes2, 3490) + + -- TODO: Make exclusive to flower forest + register_flower("allium", {"deciduous_forest", "flower_forest"}, 0) + -- TODO: Make exclusive to swamp + register_flower("blue_orchid", {"coniferous_forest", "swamp"}, 64500) + end @@ -1576,7 +1735,9 @@ end -- -- Detect mapgen to select functions -- -local mg_name = minetest.get_mapgen_setting("mg_name") +if mg_name ~= "flat" then + register_shared_decorations() +end if mg_name ~= "v6" and mg_name ~= "flat" then minetest.clear_registered_biomes() minetest.clear_registered_decorations() diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 77b28decd..c7e133140 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -602,112 +602,6 @@ minetest.register_ore({ local function register_mgv6_decorations() - -- Sugar canes - - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = -0.3, - scale = 0.7, - spread = {x = 100, y = 100, z = 100}, - seed = 2, - octaves = 3, - persist = 0.7 - }, - y_min = 1, - y_max = 1, - decoration = "mcl_core:reeds", - height = 2, - height_max = 4, - spawn_by = "mcl_core:water_source", - num_spawn_by = 1, - }) - - -- Cacti - - minetest.register_decoration({ - deco_type = "simple", - place_on = {"group:sand"}, - sidelen = 16, - noise_params = { - offset = -0.012, - scale = 0.024, - spread = {x = 100, y = 100, z = 100}, - seed = 257, - octaves = 3, - persist = 0.6 - }, - y_min = 4, - y_max = 30, - decoration = "mcl_core:cactus", - height = 1, - height_max = 3, - }) - - -- Doubletall grass - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_flowers:double_grass", param1=255, }, - { name = "mcl_flowers:double_grass_top", param1=255, }, - }, - }, - replacements = { - ["mcl_flowers:tallgrass"] = "mcl_flowers:double_grass" - }, - place_on = {"mcl_core:dirt_with_grass"}, - sidelen = 8, - noise_params = { - offset = -0.01, - scale = 0.03, - spread = {x = 500, y = 500, z = 500}, - seed = 420, - octaves = 2, - persist = 0.6, - }, - y_min = 1, - y_max = 40, - flags = "", - }) - - -- Large ferns - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=3, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_flowers:double_fern", param1=255, }, - { name = "mcl_flowers:double_fern_top", param1=255, }, - }, - }, - replacements = { - ["mcl_flowers:fern"] = "mcl_flowers:double_fern" - }, - -- This makes sure large ferns only appear in jungles - spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" }, - num_spawn_by = 1, - place_on = {"mcl_core:dirt_with_grass"}, - - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.01, - spread = {x = 250, y = 250, z = 250}, - seed = 333, - octaves = 2, - persist = 0.66, - }, - y_min = 1, - y_max = 30, - flags = "", - }) - -- Large flowers local register_large_flower = function(name, seed, offset) minetest.register_decoration({ @@ -796,10 +690,9 @@ local function register_mgv6_decorations() end -- Dead bushes - minetest.register_decoration({ deco_type = "simple", - place_on = {"group:sand", "mcl_core:podzol", "mcl_core:coarse_dirt", "mcl_colorblocks:hardened_clay"}, + place_on = {"group:sand", "mcl_core:podzol", "mcl_core:podzol_snow", "mcl_core:dirt", "mcl_core:coarse_dirt", "group:hardened_clay"}, sidelen = 16, noise_params = { offset = 0, @@ -849,53 +742,6 @@ local function register_mgv6_decorations() register_mgv6_flower("oxeye_daisy", 3490) register_mgv6_flower("poppy", 9439) - -- Pumpkin - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = { x=1, y=2, z=1 }, - data = { - { name = "air", prob = 0 }, - { name = "mcl_farming:pumpkin_face", param1=255, }, - }, - }, - place_on = {"mcl_core:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = -0.008, - scale = 0.00666, - spread = {x = 250, y = 250, z = 250}, - seed = 666, - octaves = 6, - persist = 0.666 - }, - y_min = 3, - y_max = 29, - rotation = "random", - }) - - -- Melon - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:dirt_with_grass"}, - sidelen = 16, - noise_params = { - offset = 0.003, - scale = 0.006, - spread = {x = 250, y = 250, z = 250}, - seed = 333, - octaves = 3, - persist = 0.6 - }, - -- Small trick to make sure melon spawn in jungles - spawn_by = { "mcl_core:jungletree", "mcl_flowers:fern" }, - num_spawn_by = 1, - y_min = 1, - y_max = 40, - decoration = "mcl_farming:melon", - }) - - end -- Apply mapgen-specific mapgen code @@ -952,7 +798,7 @@ minetest.register_on_generated(function(minp, maxp, seed) num_water_around = num_water_around + 1 end if num_water_around >= 2 then is_shallow = false - end + end if is_shallow then for x1=-divlen,divlen do for z1=-divlen,divlen do @@ -993,7 +839,7 @@ minetest.register_on_generated(function(minp, maxp, seed) break end end - + if ground_y then local p = {x=x,y=ground_y+1,z=z} local nn = minetest.get_node(p).name @@ -1040,7 +886,7 @@ minetest.register_on_generated(function(minp, maxp, seed) end end end - + end end end From 1f40c867547caaec9fc73c6b59f73a91c4b0b19f Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 21 Aug 2017 02:28:15 +0200 Subject: [PATCH 67/75] Generate vines and cocoas in v5, v7, etc., too --- mods/MAPGEN/mcl_mapgen_core/init.lua | 193 +++++++++++++-------------- 1 file changed, 95 insertions(+), 98 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index c7e133140..939769cff 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -903,121 +903,118 @@ local lvm_buffer = {} -- Generate cocoas and vines at jungle trees within the bounding box local function generate_jungle_tree_decorations(minp, maxp) - if mg_name == "v6" then + if maxp.y < 0 then + return + end + + local pos, treepos, dir + local jungletree = minetest.find_nodes_in_area(minp, maxp, "mcl_core:jungletree") + local jungleleaves = minetest.find_nodes_in_area(minp, maxp, "mcl_core:jungleleaves") + + -- Pass 1: Generate cocoas + for n = 1, #jungletree do + + pos = jungletree[n] + treepos = table.copy(pos) + + if minetest.find_node_near(pos, 1, {"mcl_core:jungleleaves"}) then + + dir = math.random(1, 40) + + if dir == 1 then + pos.z = pos.z + 1 + elseif dir == 2 then + pos.z = pos.z - 1 + elseif dir == 3 then + pos.x = pos.x + 1 + elseif dir == 4 then + pos.x = pos.x -1 + end + + local nn = minetest.get_node(pos).name + + if dir < 5 + and nn == "air" + and minetest.get_node_light(pos) > 12 then + minetest.swap_node(pos, { + name = "mcl_cocoas:cocoa_" .. tostring(math.random(1, 3)), + param2 = minetest.dir_to_facedir(vector.subtract(treepos, pos)) + }) + end - if maxp.y < 0 then - return end + end - local pos, treepos, dir - local jungletree = minetest.find_nodes_in_area(minp, maxp, "mcl_core:jungletree") - local jungleleaves = minetest.find_nodes_in_area(minp, maxp, "mcl_core:jungleleaves") + -- Pass 2: Generate vines at jungle wood and jungle leaves + perlin_vines = perlin_vines or minetest.get_perlin(555, 4, 0.6, 500) + perlin_vines_fine = perlin_vines_fine or minetest.get_perlin(43000, 3, 0.6, 1) + perlin_vines_length = perlin_vines_length or minetest.get_perlin(435, 4, 0.6, 75) + perlin_vines_upwards = perlin_vines_upwards or minetest.get_perlin(436, 3, 0.6, 10) + perlin_vines_density = perlin_vines_density or minetest.get_perlin(436, 3, 0.6, 500) + local junglething + for i=1, 2 do + if i==1 then junglething = jungletree + else junglething = jungleleaves end - -- Pass 1: Generate cocoas - for n = 1, #jungletree do + for n = 1, #junglething do + pos = junglething[n] - pos = jungletree[n] treepos = table.copy(pos) - if minetest.find_node_near(pos, 1, {"mcl_core:jungleleaves"}) then + local dirs = { + {x=1,y=0,z=0}, + {x=-1,y=0,z=0}, + {x=0,y=0,z=1}, + {x=0,y=0,z=-1}, + } - dir = math.random(1, 40) + for d = 1, #dirs do + local pos = vector.add(pos, dirs[d]) - if dir == 1 then - pos.z = pos.z + 1 - elseif dir == 2 then - pos.z = pos.z - 1 - elseif dir == 3 then - pos.x = pos.x + 1 - elseif dir == 4 then - pos.x = pos.x -1 - end + local nn = minetest.get_node(pos).name - local nn = minetest.get_node(pos).name + if perlin_vines:get2d(pos) > 0.1 and perlin_vines_fine:get3d(pos) > math.max(0.3333, perlin_vines_density:get2d(pos)) and nn == "air" then - if dir < 5 - and nn == "air" - and minetest.get_node_light(pos) > 12 then - minetest.swap_node(pos, { - name = "mcl_cocoas:cocoa_" .. tostring(math.random(1, 3)), - param2 = minetest.dir_to_facedir(vector.subtract(treepos, pos)) - }) - end - - end - end - - -- Pass 2: Generate vines at jungle wood and jungle leaves - perlin_vines = perlin_vines or minetest.get_perlin(555, 4, 0.6, 500) - perlin_vines_fine = perlin_vines_fine or minetest.get_perlin(43000, 3, 0.6, 1) - perlin_vines_length = perlin_vines_length or minetest.get_perlin(435, 4, 0.6, 75) - perlin_vines_upwards = perlin_vines_upwards or minetest.get_perlin(436, 3, 0.6, 10) - perlin_vines_density = perlin_vines_density or minetest.get_perlin(436, 3, 0.6, 500) - local junglething - for i=1, 2 do - if i==1 then junglething = jungletree - else junglething = jungleleaves end - - for n = 1, #junglething do - pos = junglething[n] - - treepos = table.copy(pos) - - local dirs = { - {x=1,y=0,z=0}, - {x=-1,y=0,z=0}, - {x=0,y=0,z=1}, - {x=0,y=0,z=-1}, + local newnode = { + name = "mcl_core:vine", + param2 = minetest.dir_to_wallmounted(vector.subtract(treepos, pos)) } - for d = 1, #dirs do - local pos = vector.add(pos, dirs[d]) - - local nn = minetest.get_node(pos).name - - if perlin_vines:get2d(pos) > 0.1 and perlin_vines_fine:get3d(pos) > math.max(0.3333, perlin_vines_density:get2d(pos)) and nn == "air" then - - local newnode = { - name = "mcl_core:vine", - param2 = minetest.dir_to_wallmounted(vector.subtract(treepos, pos)) - } - - -- Determine growth direction - local grow_upwards = false - -- Only possible on the wood, not on the leaves - if i == 1 then - grow_upwards = perlin_vines_upwards:get3d(pos) > 0.8 + -- Determine growth direction + local grow_upwards = false + -- Only possible on the wood, not on the leaves + if i == 1 then + grow_upwards = perlin_vines_upwards:get3d(pos) > 0.8 + end + if grow_upwards then + -- Grow vines up 1-4 nodes, even through jungleleaves. + -- This may give climbing access all the way to the top of the tree :-) + -- But this will be fairly rare. + local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * 4) + for l=0, length-1 do + local tnn = minetest.get_node(treepos).name + local nn = minetest.get_node(pos).name + if (nn == "air" or nn == "mcl_core:jungleleaves") and mcl_core.supports_vines(tnn) then + minetest.set_node(pos, newnode) + else + break + end + pos.y = pos.y + 1 + treepos.y = treepos.y + 1 end - if grow_upwards then - -- Grow vines up 1-4 nodes, even through jungleleaves. - -- This may give climbing access all the way to the top of the tree :-) - -- But this will be fairly rare. - local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * 4) - for l=0, length-1 do - local tnn = minetest.get_node(treepos).name - local nn = minetest.get_node(pos).name - if (nn == "air" or nn == "mcl_core:jungleleaves") and mcl_core.supports_vines(tnn) then - minetest.set_node(pos, newnode) - else - break - end - pos.y = pos.y + 1 - treepos.y = treepos.y + 1 - end - else - -- Grow vines down 1-7 nodes - local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * 7) - for l=0, length-1 do - if minetest.get_node(pos).name == "air" then - minetest.set_node(pos, newnode) - else - break - end - pos.y = pos.y - 1 + else + -- Grow vines down 1-7 nodes + local length = math.ceil(math.abs(perlin_vines_length:get3d(pos)) * 7) + for l=0, length-1 do + if minetest.get_node(pos).name == "air" then + minetest.set_node(pos, newnode) + else + break end + pos.y = pos.y - 1 end end - end + end end end end From a69ab5ec3491266a4e2acd5d1c28a4235ca0e885 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 21 Aug 2017 02:31:10 +0200 Subject: [PATCH 68/75] Remove fallen log schematics and mushrooms on logs --- mods/ITEMS/mcl_core/schematics/acacia_log.mts | Bin 65 -> 0 bytes mods/ITEMS/mcl_core/schematics/apple_log.mts | Bin 90 -> 0 bytes mods/ITEMS/mcl_core/schematics/aspen_log.mts | Bin 118 -> 0 bytes mods/ITEMS/mcl_core/schematics/jungle_log.mts | Bin 96 -> 0 bytes mods/ITEMS/mcl_core/schematics/pine_log.mts | Bin 93 -> 0 bytes mods/MAPGEN/mcl_biomes/init.lua | 10 +++++----- 6 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 mods/ITEMS/mcl_core/schematics/acacia_log.mts delete mode 100644 mods/ITEMS/mcl_core/schematics/apple_log.mts delete mode 100644 mods/ITEMS/mcl_core/schematics/aspen_log.mts delete mode 100644 mods/ITEMS/mcl_core/schematics/jungle_log.mts delete mode 100644 mods/ITEMS/mcl_core/schematics/pine_log.mts diff --git a/mods/ITEMS/mcl_core/schematics/acacia_log.mts b/mods/ITEMS/mcl_core/schematics/acacia_log.mts deleted file mode 100644 index 037bca8c32152f0927ff027811e918e713872b91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmeYb3HD`RVPIxpVqmPV2a?Q*nMDl3DXD3Rr8y;5iOGq{nThcwMX9M3bCMGnnB5Fg T5<1pzXP;zaW5d8XmC+Rd7>*KA diff --git a/mods/ITEMS/mcl_core/schematics/apple_log.mts b/mods/ITEMS/mcl_core/schematics/apple_log.mts deleted file mode 100644 index e7ee8f2b84ab06165c4537cd4607ec56e3066608..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmeYb3HD`RVPFPA#`^kt5F;_Oh=C_1H7&6;r^KqHC^eNqEG;L$JhiCUDz~&aqbNT= qH$JH-zdWyEPI3YRvztLmLITt0N3Y*XK5^uclao{6WDtsDOalOtHXH!} diff --git a/mods/ITEMS/mcl_core/schematics/aspen_log.mts b/mods/ITEMS/mcl_core/schematics/aspen_log.mts deleted file mode 100644 index 180e6fd1be8b31d1578f057edd7e3fb3f321c5ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmeYb3HD`RVPFPA#`^kt5Hm5eh(RbNH7&6;r^G6;xF9tzzN9EMl|dveC%-(ksMspE zv^b+EKR-9VC^dya3_~=jD8D?fVoq`b1GAe!N>T#b=U1=aK7H!QBPS=Pz{w!`m2m|C DeorWw diff --git a/mods/ITEMS/mcl_core/schematics/jungle_log.mts b/mods/ITEMS/mcl_core/schematics/jungle_log.mts deleted file mode 100644 index 54fa16d175a053f47c4ee55d678b33dbf507f314..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmeYb3HD`RVPFPA#`^kt5F;_Oh(RbNH7&6;r^G6&G%r0TwWKIDl|d{mC%-(ksMspE wv^b+EKR-7(KR3Q8HKk%sasmUhn?XuK0@LS5uir{OapaMclT+Yi5Q<|=0|4+Z9U=e# diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 055bf4e2c..74f7be235 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1252,7 +1252,7 @@ local function register_decorations() {name = "mcl_core:tree", param2 = 12}, {name = "mcl_core:tree", param2 = 12, prob = 127}, {name = "air", prob = 0}, - {name = "mcl_mushrooms:mushroom_brown", prob = 63}, + {name = "air", prob = 0}, {name = "air", prob = 0}, }, }, @@ -1293,7 +1293,7 @@ local function register_decorations() {name = "mcl_core:jungletree", param2 = 12}, {name = "mcl_core:jungletree", param2 = 12, prob = 127}, {name = "air", prob = 0}, - {name = "mcl_mushrooms:mushroom_brown", prob = 127}, + {name = "air", prob = 0}, {name = "air", prob = 0}, }, }, @@ -1347,7 +1347,7 @@ local function register_decorations() {name = "mcl_core:sprucetree", param2 = 12}, {name = "mcl_core:sprucetree", param2 = 12, prob = 127}, {name = "air", prob = 0}, - {name = "mcl_mushrooms:mushroom_red", prob = 63}, + {name = "air", prob = 0}, {name = "air", prob = 0}, }, }, @@ -1474,8 +1474,8 @@ local function register_decorations() {name = "mcl_core:birchtree", param2 = 12}, {name = "mcl_core:birchtree", param2 = 12}, {name = "mcl_core:birchtree", param2 = 12, prob = 127}, - {name = "mcl_mushrooms:mushroom_red", prob = 63}, - {name = "mcl_mushrooms:mushroom_brown", prob = 63}, + {name = "air", prob = 0}, + {name = "air", prob = 0}, {name = "air", prob = 0}, }, }, From d28e32c7e905ae1023b341060248577bbd4e8bf0 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 21 Aug 2017 02:35:31 +0200 Subject: [PATCH 69/75] Move mushroom gen to mcl_biomes --- mods/MAPGEN/mcl_biomes/init.lua | 24 ++++++++++++++++++++++++ mods/MAPGEN/mcl_mapgen_core/init.lua | 24 ------------------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 74f7be235..8759d2895 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1203,6 +1203,30 @@ local function register_shared_decorations() rotation = "random", }) + local mushrooms = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"} + local mseeds = { 7133, 8244 } + for m=1, #mushrooms do + -- Mushrooms next to trees + minetest.register_decoration({ + deco_type = "simple", + place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.04, + spread = {x = 100, y = 100, z = 100}, + seed = mseeds[m], + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + decoration = mushrooms[m], + spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree", "mcl_core:jungletree", "mcl_core:acaciatree" }, + num_spawn_by = 1, + }) + end + end local function register_decorations() diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 939769cff..2ef5654e2 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -665,30 +665,6 @@ local function register_mgv6_decorations() decoration = "mcl_flowers:tallgrass", }) - local mushrooms = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown"} - local mseeds = { 7133, 8244 } - for m=1, #mushrooms do - -- Mushrooms next to trees - minetest.register_decoration({ - deco_type = "simple", - place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt", "mcl_core:podzol", "mcl_core:mycelium", "mcl_core:stone", "mcl_core:andesite", "mcl_core:diorite", "mcl_core:granite"}, - sidelen = 16, - noise_params = { - offset = 0, - scale = 0.04, - spread = {x = 100, y = 100, z = 100}, - seed = mseeds[m], - octaves = 3, - persist = 0.6 - }, - y_min = 1, - y_max = 128, - decoration = mushrooms[m], - spawn_by = { "mcl_core:tree", "mcl_core:sprucetree", "mcl_core:darktree", "mcl_core:birchtree", "mcl_core:jungletree", "mcl_core:acaciatree" }, - num_spawn_by = 1, - }) - end - -- Dead bushes minetest.register_decoration({ deco_type = "simple", From 5f6bc471856e8d93a437b1164af00a2d7d62c84a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 21 Aug 2017 02:37:29 +0200 Subject: [PATCH 70/75] Fix savannah cover --- mods/MAPGEN/mcl_biomes/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 8759d2895..4c20fa473 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -401,11 +401,11 @@ local function register_biomes() -- Savanna minetest.register_biome({ name = "savanna", - node_top = "mcl_core:coarse_dirt", + node_top = "mcl_core:dirt_with_grass", depth_top = 1, node_filler = "mcl_core:coarse_dirt", - depth_filler = 1, - node_riverbed = "mcl_core:dirt", + depth_filler = 2, + node_riverbed = "mcl_core:coarse_dirt", depth_riverbed = 2, y_min = 1, y_max = upper_limit, From 4a66e390de8e0a157a5edb055440ef1ed038307a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 21 Aug 2017 02:52:38 +0200 Subject: [PATCH 71/75] Fix missing large plants in v7 etc. --- mods/MAPGEN/mcl_biomes/init.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 4c20fa473..58578396e 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1081,9 +1081,9 @@ local function register_shared_decorations() place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"}, sidelen = 16, noise_params = { - offset = 55,---0.01, + offset = -0.01, scale = 0.03, - spread = {x = 500, y = 500, z = 500}, + spread = {x = 300, y = 300, z = 300}, seed = 420, octaves = 2, persist = 0.6, @@ -1759,13 +1759,13 @@ end -- -- Detect mapgen to select functions -- +minetest.clear_registered_biomes() +minetest.clear_registered_decorations() +minetest.clear_registered_schematics() if mg_name ~= "flat" then register_shared_decorations() end if mg_name ~= "v6" and mg_name ~= "flat" then - minetest.clear_registered_biomes() - minetest.clear_registered_decorations() - minetest.clear_registered_schematics() register_biomes() register_biomelike_ores() register_decorations() From 0ac05ee84744bbddd48d9a24bdb4d86db05a03d2 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 21 Aug 2017 03:19:06 +0200 Subject: [PATCH 72/75] Fix fern/tallgrass confusion bugs --- mods/MAPGEN/mcl_biomes/init.lua | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 58578396e..996cfb567 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1047,7 +1047,7 @@ local function register_grass_decoration(offset, scale) }) local noise_fern = table.copy(noise_grass) - noise_fern.seed = 923, + noise_fern.seed = 923 minetest.register_decoration({ deco_type = "simple", @@ -1090,7 +1090,6 @@ local function register_shared_decorations() }, y_min = 1, y_max = mcl_vars.mg_overworld_max, - flags = "", biomes = {"grassland", "snowy_grassland", "coniferous_forest", "deciduous_forest", "savanna"}, }) @@ -1116,7 +1115,7 @@ local function register_shared_decorations() }, spawn_by = spawn_by, num_spawn_by = num_spawn_by, - place_on = {"mcl_core:dirt_with_grass", "mcl_core:podzol"}, + place_on = {"mcl_core:podzol", "mcl_core:podzol_snow"}, sidelen = 16, noise_params = { @@ -1127,10 +1126,9 @@ local function register_shared_decorations() octaves = 2, persist = 0.66, }, + biomes = { "rainforest", "taiga", "cold_taiga", "mega_taiga" }, y_min = 1, y_max = mcl_vars.mg_overworld_max, - flags = "", - biomes = { "rainforest", "taiga", "cold_taiga", "mega_taiga" }, }) -- Cacti From 0aebd9955a4ce08b5b8f0702cadc046640720dab Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 21 Aug 2017 03:23:59 +0200 Subject: [PATCH 73/75] Use dirt and sand for ocean floor --- mods/MAPGEN/mcl_biomes/init.lua | 69 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 996cfb567..7e725b5a4 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -51,7 +51,7 @@ local function register_biomes() node_dust = "mcl_core:snowblock", node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:dirt", depth_filler = 3, node_water_top = "mcl_core:ice", depth_water_top = 10, @@ -92,7 +92,7 @@ local function register_biomes() name = "tundra_ocean", node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:dirt", depth_filler = 3, node_riverbed = "mcl_core:dirt", depth_riverbed = 2, @@ -121,7 +121,7 @@ local function register_biomes() name = "taiga_ocean", node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:dirt", depth_filler = 3, node_riverbed = "mcl_core:dirt", depth_riverbed = 2, @@ -149,11 +149,11 @@ local function register_biomes() minetest.register_biome({ name = "snowy_grassland_ocean", - node_top = "mcl_core:stone", + node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:dirt", depth_filler = 3, - node_riverbed = "mcl_core:stone", + node_riverbed = "mcl_core:dirt", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, y_max = 4, @@ -193,11 +193,11 @@ local function register_biomes() minetest.register_biome({ name = "grassland_ocean", - node_top = "mcl_core:stone", + node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:dirt", depth_filler = 3, - node_riverbed = "mcl_core:stone", + node_riverbed = "mcl_core:dirt", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, y_max = 0, @@ -236,11 +236,11 @@ local function register_biomes() minetest.register_biome({ name = "coniferous_forest_ocean", - node_top = "mcl_core:stone", + node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:dirt", depth_filler = 3, - node_riverbed = "mcl_core:stone", + node_riverbed = "mcl_core:dirt", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, y_max = 0, @@ -279,11 +279,11 @@ local function register_biomes() minetest.register_biome({ name = "deciduous_forest_ocean", - node_top = "mcl_core:stone", + node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:dirt", depth_filler = 3, - node_riverbed = "mcl_core:stone", + node_riverbed = "mcl_core:dirt", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, y_max = -2, @@ -309,12 +309,11 @@ local function register_biomes() minetest.register_biome({ name = "desert_ocean", - node_top = "mcl_core:stone", + node_top = "mcl_core:redsand", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:redsand", depth_filler = 3, - node_stone = "mcl_core:stone", - node_riverbed = "mcl_core:stone", + node_riverbed = "mcl_core:redsand", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, y_max = 0, @@ -325,12 +324,11 @@ local function register_biomes() -- Sandstone desert minetest.register_biome({ name = "sandstone_desert", - node_top = "mcl_core:sand", + node_top = "mcl_core:redsand", depth_top = 1, - node_filler = "mcl_core:sand", + node_filler = "mcl_core:redsand", depth_filler = 1, - node_stone = "mcl_core:sandstone", - node_riverbed = "mcl_core:sand", + node_riverbed = "mcl_core:redsand", depth_riverbed = 2, y_min = 0, y_max = upper_limit, @@ -340,12 +338,11 @@ local function register_biomes() minetest.register_biome({ name = "sandstone_desert_ocean", - node_top = "mcl_core:stone", + node_top = "mcl_core:sand", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:sand", depth_filler = 3, - node_stone = "mcl_core:stone", - node_riverbed = "mcl_core:stone", + node_riverbed = "mcl_core:sand", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, y_max = 4, @@ -429,11 +426,11 @@ local function register_biomes() minetest.register_biome({ name = "savanna_ocean", - node_top = "mcl_core:stone", + node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:coarse_dirt", depth_filler = 3, - node_riverbed = "mcl_core:stone", + node_riverbed = "mcl_core:dirt", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, y_max = -2, @@ -472,11 +469,11 @@ local function register_biomes() minetest.register_biome({ name = "rainforest_ocean", - node_top = "mcl_core:sand", + node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:sand", + node_filler = "mcl_core:dirt", depth_filler = 3, - node_riverbed = "mcl_core:sand", + node_riverbed = "mcl_core:dirt", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, y_max = -2, @@ -501,11 +498,11 @@ local function register_biomes() minetest.register_biome({ name = "mushroom_ocean", - node_top = "mcl_core:stone", + node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:gravel", + node_filler = "mcl_core:dirt", depth_filler = 3, - node_riverbed = "mcl_core:coarse_dirt", + node_riverbed = "mcl_core:dirt", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, y_max = 0, From 584434cf87341f5a629b0f80fa575d38b797f86b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 21 Aug 2017 03:27:26 +0200 Subject: [PATCH 74/75] Change cold desert floor cover --- mods/MAPGEN/mcl_biomes/init.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 7e725b5a4..19fea240f 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -350,13 +350,14 @@ local function register_biomes() humidity_point = 0, --was 0 }) + -- TODO: Remove cold desert -- Cold desert minetest.register_biome({ name = "cold_desert", --node_dust = "", - node_top = "mcl_core:stone", + node_top = "mcl_core:coarse_dirt", depth_top = 1, - node_filler = "mcl_core:stone", + node_filler = "mcl_core:coarse_dirt", depth_filler = 1, node_riverbed = "mcl_core:stone", depth_riverbed = 2, @@ -368,10 +369,10 @@ local function register_biomes() minetest.register_biome({ name = "cold_desert_ocean", - node_top = "mcl_core:stone", + node_top = "mcl_core:dirt", depth_top = 1, - node_filler = "mcl_core:stone", - depth_filler = 3, + node_filler = "mcl_core:dirt", + depth_filler = 1, node_riverbed = "mcl_core:stone", depth_riverbed = 2, y_min = mcl_vars.mg_overworld_min, @@ -1654,7 +1655,8 @@ local function register_decorations() }, y_min = 4, y_max = mcl_vars.mg_overworld_max, - biomes = {"desert", "sandstone_desert", "mesa", "taiga", "mega_taiga"}, + -- TODO: Remove cold desert + biomes = {"desert", "sandstone_desert", "mesa", "taiga", "mega_taiga", "cold_desert"}, decoration = "mcl_core:deadbush", height = 1, }) From dfbc29810a03396861ad6e46e265004afdd23bcc Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 21 Aug 2017 03:35:46 +0200 Subject: [PATCH 75/75] Generate less plants in snowy grassland --- mods/MAPGEN/mcl_biomes/init.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 19fea240f..fc3fc07f0 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1038,7 +1038,7 @@ local function register_grass_decoration(offset, scale) place_on = {"mcl_core:dirt_with_grass", "mcl_core:dirt_with_grass_snow"}, sidelen = 16, noise_params = noise_grass, - biomes = {"grassland", "snowy_grassland", "coniferous_forest", "deciduous_forest", "savanna"}, + biomes = {"grassland", "coniferous_forest", "deciduous_forest", "savanna"}, y_min = 1, y_max = mcl_vars.mg_overworld_max, decoration = "mcl_flowers:tallgrass", @@ -1088,7 +1088,7 @@ local function register_shared_decorations() }, y_min = 1, y_max = mcl_vars.mg_overworld_max, - biomes = {"grassland", "snowy_grassland", "coniferous_forest", "deciduous_forest", "savanna"}, + biomes = {"grassland", "coniferous_forest", "deciduous_forest", "savanna"}, }) -- v6 hack: This makes sure large ferns only appear in jungles @@ -1163,7 +1163,7 @@ local function register_shared_decorations() octaves = 3, persist = 0.7 }, - biomes = {"grassland", "snowy_grassland", "beach", "desert", "sandstone_desert", "swamp"}, + biomes = {"grassland", "beach", "desert", "sandstone_desert", "swamp"}, y_min = 1, y_max = 1, decoration = "mcl_core:reeds", @@ -1681,12 +1681,12 @@ local function register_decorations() }) end - local flower_biomes1 = {"grassland", "snowy_grassland", "sunflower_plains", "flower_forest", "deciduous_forest", "coniferous_forest", "taiga"} + local flower_biomes1 = {"grassland", "sunflower_plains", "flower_forest", "deciduous_forest", "coniferous_forest", "taiga"} register_flower("dandelion", flower_biomes1, 8) register_flower("poppy", flower_biomes1, 9439) - local flower_biomes2 = {"grassland", "snowy_grassland", "sunflower_plains", "flower_forest"} + local flower_biomes2 = {"grassland", "sunflower_plains", "flower_forest"} register_flower("tulip_red", flower_biomes2, 436) register_flower("tulip_orange", flower_biomes2, 536) register_flower("tulip_pink", flower_biomes2, 636)