From 0ba832776c7cf77cbcd7a77c10725e688e425085 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 6 Dec 2021 16:04:50 +0100 Subject: [PATCH] Add command to spawn small ruined portal --- mods/MAPGEN/mcl_structures/init.lua | 309 +++++++++++++++++- mods/MAPGEN/mcl_structures/mod.conf | 2 +- .../mcl_structures_ruined_portal_small_1.mts | Bin 0 -> 515 bytes .../mcl_structures_ruined_portal_small_2.mts | Bin 0 -> 670 bytes .../mcl_structures_ruined_portal_small_3.mts | Bin 0 -> 575 bytes .../mcl_structures_ruined_portal_small_4.mts | Bin 0 -> 592 bytes .../mcl_structures_ruined_portal_small_5.mts | Bin 0 -> 636 bytes 7 files changed, 309 insertions(+), 2 deletions(-) create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ruined_portal_small_1.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ruined_portal_small_2.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ruined_portal_small_3.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ruined_portal_small_4.mts create mode 100644 mods/MAPGEN/mcl_structures/schematics/mcl_structures_ruined_portal_small_5.mts diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index 2423e704..5aa26a57 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -89,6 +89,8 @@ mcl_structures.call_struct = function(pos, struct_style, rotation, pr) return mcl_structures.generate_end_exit_portal(pos, rotation) elseif struct_style == "end_portal_shrine" then return mcl_structures.generate_end_portal_shrine(pos, rotation, pr) + elseif struct_style == "ruined_portal_small" then + return mcl_structures.generate_ruined_portal_small(pos, rotation, pr) end end @@ -404,6 +406,309 @@ mcl_structures.generate_end_portal_shrine = function(pos, rotation, pr) mcl_structures.place_schematic(newpos, path, "0", nil, true, nil, shrine_placement_callback, pr) end +local function ruined_portal_small_callback(p1, p2, size, rotation, pr) + local biome_data = minetest.get_biome_data(p1) + local biome_is_cold = (biome_data.heat < 15) or false + local biome_name = minetest.get_biome_name(biome_data.biome) + local biome_is_ocean = string.find(biome_name, "ocean") and true or false + local nodes = minetest.find_nodes_in_area(p1, p2, { + "mcl_core:goldblock", + "mcl_stairs:slab_goldblock", + "mcl_stairs:slab_goldblock_double", + "mcl_stairs:slab_goldblock_top", + "mcl_stairs:stair_goldblock", + "mcl_stairs:stair_goldblock_inner", + "mcl_stairs:stair_goldblock_outer", + "mcl_core:obsidian", + "mcl_nether:netherrack", + "mcl_core:lava_source", + "mcl_core:stonebrick", + "mcl_core:stonebrickcarved", + "mcl_stairs:slab_stonebrick", + "mcl_stairs:slab_stonebrick_top", + "mcl_stairs:slab_stonebrick_double", + "mcl_stairs:slab_stone", + "mcl_stairs:slab_stone_top", + "mcl_stairs:slab_stone_double", + "mcl_stairs:stair_stonebrick", + "mcl_stairs:stair_stonebrick_outer", + "mcl_stairs:stair_stonebrick_inner", + "mcl_walls:stonebrick", + "mcl_walls:stonebrick_0", + "mcl_walls:stonebrick_1", + "mcl_walls:stonebrick_10", + "mcl_walls:stonebrick_11", + "mcl_walls:stonebrick_12", + "mcl_walls:stonebrick_13", + "mcl_walls:stonebrick_14", + "mcl_walls:stonebrick_15", + "mcl_walls:stonebrick_16", + "mcl_walls:stonebrick_2", + "mcl_walls:stonebrick_21", + "mcl_walls:stonebrick_3", + "mcl_walls:stonebrick_4", + "mcl_walls:stonebrick_5", + "mcl_walls:stonebrick_6", + "mcl_walls:stonebrick_7", + "mcl_walls:stonebrick_8", + "mcl_walls:stonebrick_9" + }) + for n=1, #nodes do + local node = minetest.get_node(nodes[n]) + -- Rotate walls (needs to be done first) + if rotation == "90" or rotation == "270" then + if "mcl_walls:stonebrick_5" == node.name then + node.name = "mcl_walls:stonebrick_10" + elseif "mcl_walls:stonebrick_10" == node.name then + node.name = "mcl_walls:stonebrick_5" + end + if "mcl_walls:stonebrick_16" == node.name then + node.name = "mcl_walls:stonebrick_21" + elseif "mcl_walls:stonebrick_21" == node.name then + node.name = "mcl_walls:stonebrick_16" + end + end + if (p1.y > mcl_vars.mg_overworld_min) and (p1.y < mcl_vars.mg_overworld_max) then + local r_bricktype = pr:next(1, 100) + -- Replace stone brick with mossy variants (30%) + if r_bricktype <= 30 then -- 30% + if "mcl_core:stonebrick" == node.name then + node.name = "mcl_core:stonebrickmossy" + elseif "mcl_stairs:slab_stonebrick" == node.name then + node.name = "mcl_stairs:slab_stonebrickmossy" + elseif "mcl_stairs:slab_stonebrick_top" == node.name then + node.name = "mcl_stairs:slab_stonebrickmossy_top" + elseif "mcl_stairs:slab_stonebrick_double" == node.name then + node.name = "mcl_stairs:slab_stonebrickmossy_double" + elseif "mcl_stairs:stair_stonebrick" == node.name then + node.name = "mcl_stairs:stair_stonebrickmossy" + elseif "mcl_stairs:stair_stonebrick_outer" == node.name then + node.name = "mcl_stairs:stair_stonebrickmossy_outer" + elseif "mcl_stairs:stair_stonebrick_inner" == node.name then + node.name = "mcl_stairs:stair_stonebrickmossy_inner" + elseif "mcl_walls:stonebrick" == node.name then + node.name = "mcl_walls:stonebrickmossy" + elseif "mcl_walls:stonebrick_0" == node.name then + node.name = "mcl_walls:stonebrickmossy_0" + elseif "mcl_walls:stonebrick_1" == node.name then + node.name = "mcl_walls:stonebrickmossy_1" + elseif "mcl_walls:stonebrick_10" == node.name then + node.name = "mcl_walls:stonebrickmossy_10" + elseif "mcl_walls:stonebrick_11" == node.name then + node.name = "mcl_walls:stonebrickmossy_11" + elseif "mcl_walls:stonebrick_12" == node.name then + node.name = "mcl_walls:stonebrickmossy_12" + elseif "mcl_walls:stonebrick_13" == node.name then + node.name = "mcl_walls:stonebrickmossy_13" + elseif "mcl_walls:stonebrick_14" == node.name then + node.name = "mcl_walls:stonebrickmossy_14" + elseif "mcl_walls:stonebrick_15" == node.name then + node.name = "mcl_walls:stonebrickmossy_15" + elseif "mcl_walls:stonebrick_16" == node.name then + node.name = "mcl_walls:stonebrickmossy_16" + elseif "mcl_walls:stonebrick_2" == node.name then + node.name = "mcl_walls:stonebrickmossy_2" + elseif "mcl_walls:stonebrick_21" == node.name then + node.name = "mcl_walls:stonebrickmossy_21" + elseif "mcl_walls:stonebrick_3" == node.name then + node.name = "mcl_walls:stonebrickmossy_3" + elseif "mcl_walls:stonebrick_4" == node.name then + node.name = "mcl_walls:stonebrickmossy_4" + elseif "mcl_walls:stonebrick_5" == node.name then + node.name = "mcl_walls:stonebrickmossy_5" + elseif "mcl_walls:stonebrick_6" == node.name then + node.name = "mcl_walls:stonebrickmossy_6" + elseif "mcl_walls:stonebrick_7" == node.name then + node.name = "mcl_walls:stonebrickmossy_7" + elseif "mcl_walls:stonebrick_8" == node.name then + node.name = "mcl_walls:stonebrickmossy_8" + elseif "mcl_walls:stonebrick_9" == node.name then + node.name = "mcl_walls:stonebrickmossy_9" + end + -- Replace stone brick with cracked variants (20%) + elseif r_bricktype <= 50 then -- 20% + if "mcl_core:stonebrick" == node.name then + node.name = "mcl_core:stonebrickcracked" + elseif "mcl_stairs:slab_stonebrick" == node.name then + node.name = "mcl_stairs:slab_stonebrickcracked" + elseif "mcl_stairs:slab_stonebrick_top" == node.name then + node.name = "mcl_stairs:slab_stonebrickcracked_top" + elseif "mcl_stairs:slab_stonebrick_double" == node.name then + node.name = "mcl_stairs:slab_stonebrickcracked_double" + elseif "mcl_stairs:stair_stonebrick" == node.name then + node.name = "mcl_stairs:stair_stonebrickcracked" + elseif "mcl_stairs:stair_stonebrick_outer" == node.name then + node.name = "mcl_stairs:stair_stonebrickcracked_outer" + elseif "mcl_stairs:stair_stonebrick_inner" == node.name then + node.name = "mcl_stairs:stair_stonebrickcracked_inner" + end + end + end + -- Replace gold with air (30%) + if ( + "mcl_core:goldblock" == node.name or + "mcl_stairs:slab_goldblock" == node.name or + "mcl_stairs:slab_goldblock_double" == node.name or + "mcl_stairs:slab_goldblock_top" == node.name or + "mcl_stairs:stair_goldblock" == node.name or + "mcl_stairs:stair_goldblock_inner" == node.name or + "mcl_stairs:stair_goldblock_outer" == node.name + ) then + local r_air = pr:next(1,100) + if r_air <= 30 then + node.name = "air" + end + -- Replace obsidian with crying obsidian (20%) + elseif "mcl_core:obsidian" == node.name then + local r_crying = pr:next(1,100) + if r_crying <= 30 then + node.name = "mcl_nether:crying_obsidian" + end + -- Replace Nether rack with magma (7% if not cold) + elseif "mcl_nether:netherrack" == node.name then + if not biome_is_cold then + local r_magma = pr:next(1,100) + if r_magma <= 7 then + node.name = "mcl_nether:magma" + end + end + -- Replace lava (underwater: 100% magma / cold: 100% Nether rack / else: 20% magma) + elseif "mcl_core:lava_source" == node.name then + if biome_is_ocean and nodes[n].y < 0 then -- do not replace at surface + node.name = "mcl_nether:magma" + elseif biome_is_cold then + node.name = "mcl_nether:netherrack" + else + local r_magma = pr:next(1,100) + if r_magma <= 20 then + node.name = "mcl_nether:magma" + end + end + end + -- Replace stone brick variants with (red) Nether brick in the Nether + -- TODO: Replace stone brick variants with blackstone when we have it + if (p1.y > mcl_vars.mg_nether_min) and (p1.y < mcl_vars.mg_nether_max) then + if "mcl_core:stonebrick" == node.name then + node.name = "mcl_nether:nether_brick" + elseif "mcl_core:stonebrickcarved" == node.name then + node.name = "mcl_nether:nether_brick_carved" + elseif "mcl_stairs:slab_stonebrick" == node.name then + node.name = "mcl_stairs:slab_nether_brick" + elseif "mcl_stairs:slab_stonebrick_top" == node.name then + node.name = "mcl_stairs:slab_nether_brick_top" + elseif "mcl_stairs:slab_stonebrick_double" == node.name then + node.name = "mcl_stairs:slab_nether_brick_double" + elseif "mcl_stairs:slab_stone" == node.name then + node.name = "mcl_stairs:slab_red_nether_brick" + elseif "mcl_stairs:slab_stone_top" == node.name then + node.name = "mcl_stairs:slab_red_nether_brick_top" + elseif "mcl_stairs:slab_stone_double" == node.name then + node.name = "mcl_stairs:slab_red_nether_brick_double" + elseif "mcl_stairs:stair_stonebrick" == node.name then + node.name = "mcl_stairs:stair_nether_brick" + elseif "mcl_stairs:stair_stonebrick_outer" == node.name then + node.name = "mcl_stairs:stair_nether_brick_outer" + elseif "mcl_stairs:stair_stonebrick_inner" == node.name then + node.name = "mcl_stairs:stair_nether_brick_inner" + elseif "mcl_walls:stonebrick" == node.name then + node.name = "mcl_walls:netherbrick" + elseif "mcl_walls:stonebrick_0" == node.name then + node.name = "mcl_walls:netherbrick_0" + elseif "mcl_walls:stonebrick_1" == node.name then + node.name = "mcl_walls:netherbrick_1" + elseif "mcl_walls:stonebrick_10" == node.name then + node.name = "mcl_walls:netherbrick_10" + elseif "mcl_walls:stonebrick_11" == node.name then + node.name = "mcl_walls:netherbrick_11" + elseif "mcl_walls:stonebrick_12" == node.name then + node.name = "mcl_walls:netherbrick_12" + elseif "mcl_walls:stonebrick_13" == node.name then + node.name = "mcl_walls:netherbrick_13" + elseif "mcl_walls:stonebrick_14" == node.name then + node.name = "mcl_walls:netherbrick_14" + elseif "mcl_walls:stonebrick_15" == node.name then + node.name = "mcl_walls:netherbrick_15" + elseif "mcl_walls:stonebrick_16" == node.name then + node.name = "mcl_walls:netherbrick_16" + elseif "mcl_walls:stonebrick_2" == node.name then + node.name = "mcl_walls:netherbrick_2" + elseif "mcl_walls:stonebrick_21" == node.name then + node.name = "mcl_walls:netherbrick_21" + elseif "mcl_walls:stonebrick_3" == node.name then + node.name = "mcl_walls:netherbrick_3" + elseif "mcl_walls:stonebrick_4" == node.name then + node.name = "mcl_walls:netherbrick_4" + elseif "mcl_walls:stonebrick_5" == node.name then + node.name = "mcl_walls:netherbrick_5" + elseif "mcl_walls:stonebrick_6" == node.name then + node.name = "mcl_walls:netherbrick_6" + elseif "mcl_walls:stonebrick_7" == node.name then + node.name = "mcl_walls:netherbrick_7" + elseif "mcl_walls:stonebrick_8" == node.name then + node.name = "mcl_walls:netherbrick_8" + elseif "mcl_walls:stonebrick_9" == node.name then + node.name = "mcl_walls:netherbrick_9" + -- Replace lava with Nether lava + elseif "mcl_core:lava_source" == node.name then + node.name = "mcl_nether:nether_lava_source" + end + end + minetest.set_node(nodes[n], node) + end + -- Add loot into chests. + local chests = minetest.find_nodes_in_area(p1, p2, "mcl_chests:chest_small") + for c=1, #chests do + local lootitems = mcl_loot.get_multi_loot({ + { + stacks_min = 4, + stacks_max = 8, + items = { + { itemstring = "mcl_core:iron_nugget", weight = 46, amount_min = 9, amount_max = 18 }, + { itemstring = "mcl_core:flint", weight = 46, amount_min = 1, amount_max = 4 }, + { itemstring = "mcl_core:obsidian", weight = 46, amount_min = 1, amount_max = 2 }, + { itemstring = "mcl_fire:fire_charge", weight = 46, }, + { itemstring = "mcl_fire:flint_and_steel", weight = 46, }, + { itemstring = "mcl_core:gold_nugget", weight = 21, amount_min = 4, amount_max = 24 }, + { itemstring = "mcl_core:apple_gold", weight = 21 }, + -- TODO: enchanted golden axe / hoe / pickaxe / shovel / sword / helmet / chestplate / leggings / boots + { itemstring = "mcl_potions:speckled_melon", weight = 7, amount_min = 4, amount_max = 12 }, + { itemstring = "mcl_farming:carrot_item_gold", weight = 7, amount_min = 4, amount_max = 12 }, + { itemstring = "mcl_core:gold_ingot", weight = 7, amount_min = 2, amount_max = 6 }, + { itemstring = "mcl_clock:clock", weight = 7, }, + { itemstring = "mobs_mc:gold_horse_armor", weight = 7, }, + { itemstring = "mcl_core:goldblock", weight = 2, amount_min = 1, amount_max = 2 }, + { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, + } + } + }, pr) + + local meta = minetest.get_meta(chests[c]) + init_node_construct(chests[c]) + local meta = minetest.get_meta(chests[c]) + local inv = meta:get_inventory() + mcl_loot.fill_inventory(inv, "main", lootitems, pr) + end +end + +mcl_structures.generate_ruined_portal_small = function(pos, orientation, pr) + -- Generates one out of 5 possible small ruined nether portals + local newpos = { + x = pos.x, + y = pos.y - 4, + z = pos.z + } + local portals = { + "mcl_structures_ruined_portal_small_1.mts", + "mcl_structures_ruined_portal_small_2.mts", + "mcl_structures_ruined_portal_small_3.mts", + "mcl_structures_ruined_portal_small_4.mts", + "mcl_structures_ruined_portal_small_5.mts" + } + local r = pr:next(1, #portals) + local path = minetest.get_modpath("mcl_structures") .. "/schematics/" .. portals[r] + return mcl_structures.place_schematic(newpos, path, orientation, nil, true, nil, ruined_portal_small_callback, pr) +end + local function temple_placement_callback(p1, p2, size, rotation, pr) -- Delete cacti leftovers: @@ -534,7 +839,7 @@ end -- Debug command minetest.register_chatcommand("spawnstruct", { - params = "desert_temple | desert_well | igloo | witch_hut | boulder | ice_spike_small | ice_spike_large | fossil | end_exit_portal | end_portal_shrine", + params = "desert_temple | desert_well | igloo | witch_hut | boulder | ice_spike_small | ice_spike_large | fossil | end_exit_portal | end_portal_shrine | ruined_portal_small", description = S("Generate a pre-defined structure near your position."), privs = {debug = true}, func = function(name, param) @@ -568,6 +873,8 @@ minetest.register_chatcommand("spawnstruct", { mcl_structures.generate_end_exit_portal(pos, rot, pr) elseif param == "end_portal_shrine" then mcl_structures.generate_end_portal_shrine(pos, rot, pr) + elseif param == "ruined_portal_small" then + mcl_structures.generate_ruined_portal_small(pos, rot, pr) elseif param == "" then message = S("Error: No structure type given. Please use “/spawnstruct ”.") errord = true diff --git a/mods/MAPGEN/mcl_structures/mod.conf b/mods/MAPGEN/mcl_structures/mod.conf index 09b7c5b9..4424356a 100644 --- a/mods/MAPGEN/mcl_structures/mod.conf +++ b/mods/MAPGEN/mcl_structures/mod.conf @@ -1,2 +1,2 @@ name = mcl_structures -depends = mcl_loot +depends = mcl_init, mcl_loot diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ruined_portal_small_1.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ruined_portal_small_1.mts new file mode 100644 index 0000000000000000000000000000000000000000..87f9d7ea3832c11e7ba8426785f17614b8928365 GIT binary patch literal 515 zcmeYb3HD`RVc=rmVc@Js0u0;?%!!#r45GQoIq`X^B^jwjRuHNvF*%z-7$lsWUzBQ9 zT#}!cnpBht6jTHW7MB3E6pb3_ z-uU3_|D@fI?y#488$Y$R_vcs1&rCgkJ!<;5J8xIygeUjD2`_WIs>k`Op5M8{?q1=M zGsX|}lem(rWRKiB@u@M^{4nq0!-c7ba{9hs{qFEu+-U#HsA)U2r|f^;7|4CM@|&#c z_F3!ZN&f87_fcGT{OG;?>-kNtEnYMIL{idf>CXnC(Yn{4W|iF)EqT0T?YsA7TbE?l qcB#hx?wdYOIs5sfyu}M2a5~(do%g$T)zZ&bA_ERjGkq>6M>86B$g${7w4B2C8sh7!bS6wiZfF(6Z05^;X=hF`FW{HMVUa|(jdX& z5}=*MR$vOqflDePOXegdA<4z3-?K?(IDE?F z(3U;Ed9ADaq&^qVxpupPZOJYVzmhfk%=fN$+`d2XzQCiaORJ<8T|2k`bxi-Rr4Y?v+&@xDz>Fr`@mvPCnYH-KRLT%&fD;tLd^<1EL9g?&;R{;ZG>s($rh%AWw)L> zZfjQM+kS6r$higYCE_oLD|h{N{H|?1`LEu)non+bgU(Jo>zcAd`|#6u z(zl|vO5Xowsc~2N)3eXkugf#euf1PXP<#43Yi(b$m~wgjK0}%3%H=xI?*#5-s=WO6 zKO)_0*dzH**fB@nwX6%>8g_VB$XUJJUGHKtSKrPLQH^~ax#s1q^q463Yv)Yw c+Pl;|UVEBn|Lh+BT@|+)chxW$Z&`5<02X5Q*8l(j literal 0 HcmV?d00001 diff --git a/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ruined_portal_small_4.mts b/mods/MAPGEN/mcl_structures/schematics/mcl_structures_ruined_portal_small_4.mts new file mode 100644 index 0000000000000000000000000000000000000000..d1263810537feb3f142e5fb10fd8262a7d6897f0 GIT binary patch literal 592 zcmeYb3HD`RVc=rmVc@Js0t~zi%!!#r45GQoIq`X^B^jwjRuHNvF*%z-8YEm?0#s3K z1*U+U{JhkpqD-KqA|A>3{L+%tA_ifQlH~lNRG@CSK1nQs$%#c}sVVr4%*@LJ8i`_S zPGS<0i{exAOOtX^83f@LRulY&5NqrvH2Yp;L3s?2mW zRnqMG(u*%|cYkS+?Rzjk$fqR8J!PhMbC*Q?@^6QeC!W7)B<^GV`daAnbDl|St4agI zKh)2?tYEt+@Hg+ej4PX#dWC%6W3|F;if7-}yc*_$9g4~ev&2sR{kz&c$B+uW#Ou z-Lk3sk6e3u;+Nm=g_-Zv9&+D(axU*^dDfJ#x#p`???2MY+d3~fIQxFlC%1j|Hf!e> mT+sh3r}1^-*Qrmf=Re=`^TEx3kIo*I*!*97nfQ;nDc1B;zyl@=}W!r12viOwz(xjYJ21&Rsgi*4B|`j3m|4CXQURF6kCC*_~Klk$rW>+hINZID{w5$ zS^e$Dv$|RfSKs0-!8>xM2XhwfigguEP@Z+*T*uCJYDUdw8)i*7cQYn@&9yIE7A)Aj zOe<(kSf4M^&A-m)9`@eaT{pAjS<-P_nSU)uNS#*3!bBS QZSl9q1_!v;)!nH808*?J$p8QV literal 0 HcmV?d00001