123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592 |
- --[[
- Register decorations for Nether mapgen
- Copyright (C) 2020 Treer
- Permission to use, copy, modify, and/or distribute this software for
- any purpose with or without fee is hereby granted, provided that the
- above copyright notice and this permission notice appear in all copies.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
- BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
- OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
- WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
- ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- SOFTWARE.
- ]]--
- -- Lava is unreliable in the old Nether mapgen because it removes lava
- -- from the overdraw areas, so any decorations involving lava will often
- -- have the lava missing depending on whether nearby chunks were already
- -- emerged or not before the decoration was placed.
- local allow_lava_decorations = nether.useBiomes
- -- Keep compatibility with mapgen_nobiomes.lua, so hardcoding 128
- -- instead of using nether.mapgen.BLEND
- local decoration_ceiling = nether.DEPTH_CEILING - 128
- local decoration_floor = nether.DEPTH_FLOOR + 128
- local _ = {name = "air", prob = 0}
- local A = {name = "air", prob = 255, force_place = true}
- local G = {name = "nether:glowstone", prob = 255, force_place = true}
- local N = {name = "nether:rack", prob = 255}
- local D = {name = "nether:rack_deep", prob = 255}
- local S = {name = "nether:sand", prob = 255, force_place = true}
- local L = {name = "default:lava_source", prob = 255, force_place = true}
- local F = {name = "nether:fumarole", prob = 255, force_place = true}
- local FS = {name = "nether:fumarole_slab", prob = 255, force_place = true}
- local F1 = {name = "nether:fumarole_corner", prob = 255, force_place = true, param2 = 0}
- local F2 = {name = "nether:fumarole_corner", prob = 255, force_place = true, param2 = 1}
- local F3 = {name = "nether:fumarole_corner", prob = 255, force_place = true, param2 = 2}
- local F4 = {name = "nether:fumarole_corner", prob = 255, force_place = true, param2 = 3}
- local S1 = {name = "stairs:stair_netherrack", prob = 255, force_place = true, param2 = 5}
- local S2 = {name = "stairs:stair_netherrack", prob = 255, force_place = true, param2 = 7}
- local S3 = {name = "stairs:stair_netherrack", prob = 255, force_place = true, param2 = 12}
- local S4 = {name = "stairs:stair_netherrack", prob = 255, force_place = true, param2 = 16}
- -- =================
- -- Stalactites
- -- =================
- local schematic_GlowstoneStalactite = {
- size = {x = 5, y = 10, z = 5},
- data = { -- note that data is upside down
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, N, G, N, _,
- _, N, N, N, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, G, _, _,
- _, _, G, _, _,
- _, G, G, G, _,
- N, G, G, G, N,
- N, N, G, N, N,
- _, _, N, _, _, -- ypos 0, prob 25% (64/256)
- _, _, G, _, _, -- ypos 1, prob 37% (96/256)
- _, _, G, _, _, -- ypos 2, prob 100%
- _, _, G, _, _, -- ypos 3, prob 100%
- _, _, G, G, _, -- ypos 4, prob 50% (128/256) to make half of stalactites asymmetric
- _, G, G, G, _, -- ypos 5, prob 75% (192/256)
- _, G, G, G, _, -- ypos 6, prob 75% (192/256)
- _, G, G, G, _, -- ypos 7, prob 100%
- G, G, G, G, G, -- ypos 8, prob 100%
- N, G, G, G, N, -- ypos 9, prob 75% (192/256)
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, G, _, _,
- _, _, G, _, _,
- _, _, G, _, _,
- _, G, G, G, _,
- N, G, G, G, N,
- N, N, G, N, N,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, _, _, _, _,
- _, N, G, N, _,
- _, N, N, N, _
- },
- -- Y-slice probabilities do not function correctly for ceiling schematic
- -- decorations because they are inverted, so ypos numbers have been inverted
- -- to match, and a larger offset in place_offset_y should be used (e.g. -3).
- yslice_prob = {
- {ypos = 9, prob = 192},
- {ypos = 6, prob = 192},
- {ypos = 5, prob = 192},
- {ypos = 4, prob = 128},
- {ypos = 1, prob = 96},
- {ypos = 0, prob = 64}
- }
- }
- minetest.register_decoration({
- name = "Glowstone stalactite",
- deco_type = "schematic",
- place_on = "nether:rack",
- sidelen = 80,
- fill_ratio = 0.0003,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = schematic_GlowstoneStalactite,
- flags = "place_center_x,place_center_z,force_placement,all_ceilings",
- place_offset_y=-3
- })
- minetest.register_decoration({
- name = "Netherrack stalactite",
- deco_type = "schematic",
- place_on = "nether:rack",
- sidelen = 80,
- fill_ratio = 0.0008,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = schematic_GlowstoneStalactite,
- replacements = {["nether:glowstone"] = "nether:rack"},
- flags = "place_center_x,place_center_z,all_ceilings",
- place_offset_y=-3
- })
- local schematic_GreaterStalactite = {
- size = {x = 3, y = 23, z = 3},
- data = { -- note that data is upside down
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, D, _,
- _, D, _,
- _, D, _,
- _, D, _,
- D, D, D,
- D, D, D,
- D, D, D,
- _, D, _,
- _, _, _,
- _, _, _,
- _, D, _, -- ypos 0, prob 85% (218/255)
- _, D, _, -- ypos 1, prob 85% (218/255)
- _, D, _, -- ypos 2, prob 85% (218/255)
- _, D, _, -- ypos 3, prob 85% (218/255)
- _, D, _, -- ypos 4, prob 85% (218/255)
- _, D, _, -- ypos 5, prob 85% (218/255)
- _, D, _, -- ypos 6, prob 85% (218/255)
- _, D, _, -- ypos 7, prob 85% (218/255)
- _, D, _, -- ypos 8, prob 85% (218/255)
- _, D, D, -- ypos 9, prob 50% (128/256) to make half of stalactites asymmetric
- _, D, D, -- ypos 10, prob 50% (128/256) to make half of stalactites asymmetric
- _, D, D, -- ypos 11, prob 50% (128/256) to make half of stalactites asymmetric
- _, D, D, -- ypos 12, prob 50% (128/256) to make half of stalactites asymmetric
- D, D, D, -- ypos 13, prob 75% (192/256)
- D, D, D, -- ypos 14, prob 75% (192/256)
- D, D, D, -- ypos 15, prob 100%
- D, D, D, -- ypos 16, prob 100%
- D, D, D, -- ypos 17, prob 100%
- D, D, D, -- ypos 18, prob 100%
- D, D, D, -- ypos 19, prob 75% (192/256)
- D, D, D, -- ypos 20, prob 85% (218/255)
- _, D, D, -- ypos 21, prob 50% (128/256) to make half of stalactites asymmetric
- _, D, _, -- ypos 22, prob 100%
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, _, _,
- _, D, _,
- _, D, _,
- _, D, _,
- _, D, _,
- _, D, _,
- D, D, D,
- D, D, D,
- D, D, D,
- _, D, _,
- _, D, _,
- _, _, _,
- },
- -- Y-slice probabilities do not function correctly for ceiling schematic
- -- decorations because they are inverted, so ypos numbers have been inverted
- -- to match, and a larger offset in place_offset_y should be used (e.g. -3).
- yslice_prob = {
- {ypos = 21, prob = 128},
- {ypos = 20, prob = 218},
- {ypos = 19, prob = 192},
- {ypos = 14, prob = 192},
- {ypos = 13, prob = 192},
- {ypos = 12, prob = 128},
- {ypos = 11, prob = 128},
- {ypos = 10, prob = 128},
- {ypos = 9, prob = 128},
- {ypos = 8, prob = 218},
- {ypos = 7, prob = 218},
- {ypos = 6, prob = 218},
- {ypos = 5, prob = 218},
- {ypos = 4, prob = 218},
- {ypos = 3, prob = 218},
- {ypos = 2, prob = 218},
- {ypos = 1, prob = 218},
- {ypos = 0, prob = 218}
- }
- }
- -- A stalagmite is an upsidedown stalactite, so
- -- use the GreaterStalactite to create a ToweringStalagmite schematic
- local schematic_ToweringStalagmite = {
- size = schematic_GreaterStalactite.size,
- data = {},
- yslice_prob = {}
- }
- local array_length = #schematic_GreaterStalactite.data + 1
- for i, node in ipairs(schematic_GreaterStalactite.data) do
- schematic_ToweringStalagmite.data[array_length - i] = node
- end
- y_size = schematic_GreaterStalactite.size.y
- for i, node in ipairs(schematic_GreaterStalactite.yslice_prob) do
- schematic_ToweringStalagmite.yslice_prob[i] = {
- -- we can safely lower the prob. to gain more variance because floor based schematics
- -- don't have the bug where missing lines moves them away from the surface
- prob = schematic_GreaterStalactite.yslice_prob[i].prob - 20,
- ypos = y_size - 1 - schematic_GreaterStalactite.yslice_prob[i].ypos
- }
- end
- minetest.register_decoration({
- name = "Deep-glowstone stalactite",
- deco_type = "schematic",
- place_on = "nether:rack_deep",
- sidelen = 80,
- fill_ratio = 0.0003,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = schematic_GlowstoneStalactite,
- replacements = {["nether:rack"] = "nether:rack_deep", ["nether:glowstone"] = "nether:glowstone_deep"},
- flags = "place_center_x,place_center_z,force_placement,all_ceilings",
- place_offset_y=-3
- })
- minetest.register_decoration({
- name = "Deep-glowstone stalactite outgrowth",
- deco_type = "schematic",
- place_on = "nether:glowstone_deep",
- sidelen = 40,
- fill_ratio = 0.15,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = {
- size = {x = 1, y = 4, z = 1},
- data = { G, G, G, G }
- },
- replacements = {["nether:glowstone"] = "nether:glowstone_deep"},
- flags = "place_center_x,place_center_z,all_ceilings",
- })
- minetest.register_decoration({
- name = "Deep-netherrack stalactite",
- deco_type = "schematic",
- place_on = "nether:rack_deep",
- sidelen = 80,
- fill_ratio = 0.0003,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = schematic_GlowstoneStalactite,
- replacements = {["nether:rack"] = "nether:rack_deep", ["nether:glowstone"] = "nether:rack_deep"},
- flags = "place_center_x,place_center_z,force_placement,all_ceilings",
- place_offset_y=-3
- })
- minetest.register_decoration({
- name = "Deep-netherrack towering stalagmite",
- deco_type = "schematic",
- place_on = "nether:rack_deep",
- sidelen = 80,
- fill_ratio = 0.001,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = schematic_ToweringStalagmite,
- replacements = {["nether:basalt"] = "nether:rack_deep"},
- flags = "place_center_x,place_center_z,force_placement,all_floors",
- place_offset_y=-2
- })
- -- =======================================
- -- Concealed crevice / Lava sinkhole
- -- =======================================
- -- if player places a torch/block on this sand or digs it while standing on it, it sinks into lava
- if allow_lava_decorations then
- minetest.register_decoration({
- name = "Weak trap",
- deco_type = "schematic",
- place_on = "nether:rack",
- sidelen = 80,
- fill_ratio = 0.002,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = {
- size = {x = 4, y = 7, z = 4},
- data = { -- note that data is upside down
- _, _, _, _,
- _, _, _, _,
- _, N, _, _,
- _, N, N, _,
- _, N, N, _,
- _, N, N, _,
- _, _, _, _,
- _, N, _, _, -- make it look like a stalactite if it protrudes out the bottom of a landform
- _, N, _, _,
- N, L, N, _,
- N, L, L, N,
- N, L, L, N,
- N, A, A, N,
- _, S, S, _,
- _, _, _, _,
- _, _, _, _,
- _, N, N, _,
- N, L, L, N,
- N, L, L, N,
- N, A, A, N,
- _, S, S, _,
- _, _, _, _,
- _, _, _, _,
- _, _, _, _,
- _, N, N, _,
- _, N, N, _,
- _, N, N, _,
- _, _, _, _,
- }
- },
- replacements = {["nether:glowstone"] = "nether:rack"},
- flags = "place_center_x,place_center_z,force_placement, all_floors",
- place_offset_y=-6,
- rotation = "random"
- })
- end
- -- ==========================
- -- Fumaroles (Chimneys)
- -- ==========================
- local replacements_slab = {}
- local replacements_full = {["nether:fumarole_slab"] = "nether:fumarole"}
- if allow_lava_decorations then
- -- Minetest engine limitations mean any mesh or nodebox node (like nether:fumarole)
- -- will light up if it has lava below it, so replace the air node over the lava with
- -- a node that prevents light propagation.
- -- (Unfortunately this also means if a player digs down to get the lava block it'll
- -- look like the lighting wasn't set in the block above the lava)
- replacements_slab["air"] = "nether:airlike_darkness"
- replacements_full["air"] = "nether:airlike_darkness"
- else
- -- Lava is frequently removed by the old mapgen, so put sand at the bottom
- -- of fumaroles.
- replacements_slab["default:lava_source"] = "nether:sand"
- replacements_full["default:lava_source"] = "nether:sand"
- end
- local schematic_fumarole = {
- size = {x = 3, y = 5, z = 3},
- data = { -- note that data is upside down
- _, _, _,
- _, N, _,
- _, N, _,
- _, _, _,
- _, _, _,
- _, N, _,
- N, L, N,
- N, A, N,
- _, F, _,
- _,FS, _,
- _, _, _,
- _, N, _,
- _, N, _,
- _, _, _,
- _, _, _,
- },
- }
- -- Common fumarole decoration that's flush with the floor and spawns everywhere
- minetest.register_decoration({
- name = "Sunken nether fumarole",
- deco_type = "schematic",
- place_on = {"nether:rack"},
- sidelen = 80,
- fill_ratio = 0.005,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = schematic_fumarole,
- replacements = replacements_full,
- flags = "place_center_x,place_center_z,all_floors",
- place_offset_y=-4
- })
- -- Rarer formations of raised fumaroles in clumps
- local fumarole_clump_noise_offset = -0.58
- local fumarole_clump_noise = {
- offset = fumarole_clump_noise_offset,
- scale = 0.5,
- spread = {x = 40, y = 40, z = 15},
- octaves = 4,
- persist = 0.65,
- lacunarity = 2.0,
- }
- fumarole_clump_noise.offset = fumarole_clump_noise_offset - 0.035
- minetest.register_decoration({
- name = "Raised Nether fumarole",
- deco_type = "schematic",
- place_on = {"nether:rack"},
- sidelen = 8,
- noise_params = fumarole_clump_noise,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = schematic_fumarole,
- replacements = replacements_full,
- flags = "place_center_x,place_center_z,all_floors",
- place_offset_y=-3
- })
- fumarole_clump_noise.offset = fumarole_clump_noise_offset
- minetest.register_decoration({
- name = "Half-raised Nether fumarole",
- deco_type = "schematic",
- place_on = {"nether:rack"},
- sidelen = 8,
- noise_params = fumarole_clump_noise,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = schematic_fumarole,
- replacements = replacements_slab,
- flags = "place_center_x,place_center_z,all_floors",
- place_offset_y=-3
- })
- fumarole_clump_noise.offset = fumarole_clump_noise_offset - 0.035
- minetest.register_decoration({
- name = "Nether fumarole mound",
- deco_type = "schematic",
- place_on = {"nether:rack"},
- sidelen = 8,
- noise_params = fumarole_clump_noise,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = {
- size = {x = 4, y = 4, z = 4},
- data = { -- note that data is upside down
- _, _, _, _,
- _, N, N, _,
- _, _, _, _,
- _, _, _, _,
- _, S, S, _,
- N, A, A, N,
- _, S2, S1, _,
- _, F2, F1, _,
- _, S, S, _,
- N, A, A, N,
- _, S3, S4, _,
- _, F3, F4, _,
- _, _, _, _,
- _, N, N, _,
- _, _, _, _,
- _, _, _, _
- },
- yslice_prob = {{ypos = 3, prob = 192}} -- occasionally leave the fumarole cap off
- },
- flags = "place_center_x,place_center_z,all_floors",
- place_offset_y = -2
- })
- fumarole_clump_noise.offset = fumarole_clump_noise_offset - 0.01
- minetest.register_decoration({
- name = "Double Nether fumarole",
- deco_type = "schematic",
- place_on = {"nether:rack"},
- sidelen = 8,
- noise_params = fumarole_clump_noise,
- biomes = {"nether_caverns"},
- y_max = decoration_ceiling,
- y_min = decoration_floor,
- schematic = {
- size = {x = 4, y = 5, z = 4},
- data = { -- note that data is upside down
- _, _, _, _,
- _, N, N, _,
- _, _, _, _,
- _, _, _, _,
- _, _, _, _,
- _, S, S, _,
- N, A, A, N,
- _, S2, S1, _,
- _, F2, F, _,
- _, _, FS, _,
- _, S, S, _,
- F, A, A, N, -- the F may add slight variance in landforms where it gets exposed
- _, S3, S4, _,
- _, F3, F4, _,
- _, _, _, _,
- _, _, _, _,
- _, N, N, _,
- _, _, _, _,
- _, _, _, _,
- _, _, _, _
- }
- },
- flags = "place_center_x,place_center_z,all_floors",
- place_offset_y = -2,
- rotation = "random"
- })
|