Mods hinzugefügt und geändert. Höhlen, Himmelsinseln und Asteroiden.
|
@ -17,8 +17,8 @@ minetest.register_decoration({
|
|||
place_on = "default:stone",
|
||||
fill_ratio = 10,
|
||||
biomes = asuna.features.cave.moss,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
decoration = moss_cave_surface,
|
||||
flags = "all_floors,force_placement",
|
||||
|
@ -32,8 +32,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.moss,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "emerald_stalagmite.mts",
|
||||
flags = "all_floors,place_center_x,place_center_z",
|
||||
|
@ -47,8 +47,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.moss,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "emerald_stalactite.mts",
|
||||
flags = "all_ceilings,place_center_x,place_center_z",
|
||||
|
@ -62,8 +62,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.moss,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "sapphire_stalagmite.mts",
|
||||
flags = "all_floors,place_center_x,place_center_z",
|
||||
|
@ -77,8 +77,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.moss,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "sapphire_stalactite.mts",
|
||||
flags = "all_ceilings,place_center_x,place_center_z",
|
||||
|
@ -90,8 +90,8 @@ minetest.register_decoration({
|
|||
place_on = moss_cave_surface,
|
||||
fill_ratio = 0.00625,
|
||||
biomes = asuna.features.cave.moss,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
decoration = "caverealms:glow_gem",
|
||||
flags = "all_floors",
|
||||
})
|
||||
|
@ -102,8 +102,8 @@ minetest.register_decoration({
|
|||
place_on = "default:stone",
|
||||
fill_ratio = 0.0175,
|
||||
biomes = asuna.features.cave.moss,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
height = 2,
|
||||
height_max = 4,
|
||||
decoration = "caverealms:glow_worm",
|
||||
|
@ -122,8 +122,8 @@ minetest.register_decoration({
|
|||
place_on = "default:stone",
|
||||
fill_ratio = 10,
|
||||
biomes = asuna.features.cave.fungal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
decoration = fungal_cave_surface,
|
||||
flags = "all_floors,force_placement",
|
||||
|
@ -137,8 +137,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.fungal,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "emerald_stalagmite.mts",
|
||||
flags = "all_floors,place_center_x,place_center_z",
|
||||
|
@ -152,8 +152,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.fungal,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "emerald_stalactite.mts",
|
||||
flags = "all_ceilings,place_center_x,place_center_z",
|
||||
|
@ -167,8 +167,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.fungal,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "amethyst_stalagmite.mts",
|
||||
flags = "all_floors,place_center_x,place_center_z",
|
||||
|
@ -182,8 +182,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.fungal,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "amethyst_stalactite.mts",
|
||||
flags = "all_ceilings,place_center_x,place_center_z",
|
||||
|
@ -195,8 +195,8 @@ minetest.register_decoration({
|
|||
place_on = fungal_cave_surface,
|
||||
fill_ratio = 0.0005,
|
||||
biomes = asuna.features.cave.fungal,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
schematic = spath .. "shroom.mts",
|
||||
flags = "all_floors,place_center_x,place_center_z",
|
||||
})
|
||||
|
@ -207,8 +207,8 @@ minetest.register_decoration({
|
|||
place_on = fungal_cave_surface,
|
||||
fill_ratio = 0.025,
|
||||
biomes = asuna.features.cave.fungal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
decoration = "caverealms:fungus",
|
||||
flags = "all_floors",
|
||||
})
|
||||
|
@ -219,8 +219,8 @@ minetest.register_decoration({
|
|||
place_on = fungal_cave_surface,
|
||||
fill_ratio = 0.025,
|
||||
biomes = asuna.features.cave.fungal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
decoration = "caverealms:mycena",
|
||||
flags = "all_floors",
|
||||
})
|
||||
|
@ -231,8 +231,8 @@ minetest.register_decoration({
|
|||
place_on = "default:stone",
|
||||
fill_ratio = 0.0175,
|
||||
biomes = asuna.features.cave.fungal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
height = 2,
|
||||
height_max = 4,
|
||||
decoration = "caverealms:glow_worm_green",
|
||||
|
@ -253,8 +253,8 @@ minetest.register_decoration({
|
|||
lacunarity = 0.69,
|
||||
},
|
||||
biomes = asuna.features.cave.fungal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
height_max = 2,
|
||||
decoration = "ethereal:mushroom",
|
||||
|
@ -267,8 +267,8 @@ minetest.register_decoration({
|
|||
place_on = fungal_cave_surface,
|
||||
fill_ratio = 0.00095,
|
||||
biomes = asuna.features.cave.fungal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
decoration = {
|
||||
"flowers:mushroom_red",
|
||||
"flowers:mushroom_brown",
|
||||
|
@ -294,8 +294,8 @@ minetest.register_decoration({
|
|||
place_on = "default:stone",
|
||||
fill_ratio = 10,
|
||||
biomes = asuna.features.cave.coal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
decoration = desert_cave_surface,
|
||||
flags = "all_floors,force_placement",
|
||||
|
@ -307,8 +307,8 @@ minetest.register_decoration({
|
|||
place_on = desert_cave_surface,
|
||||
fill_ratio = 10,
|
||||
biomes = asuna.features.cave.coal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -2,
|
||||
decoration = "default:stone",
|
||||
flags = "all_floors,force_placement",
|
||||
|
@ -326,8 +326,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.coal,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "ruby_stalagmite.mts",
|
||||
flags = "all_floors,place_center_x,place_center_z",
|
||||
|
@ -341,8 +341,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.coal,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "ruby_stalactite.mts",
|
||||
flags = "all_ceilings,place_center_x,place_center_z",
|
||||
|
@ -360,8 +360,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.coal,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "amethyst_stalagmite.mts",
|
||||
flags = "all_floors,place_center_x,place_center_z",
|
||||
|
@ -375,8 +375,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.coal,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "amethyst_stalactite.mts",
|
||||
flags = "all_ceilings,place_center_x,place_center_z",
|
||||
|
@ -388,8 +388,8 @@ minetest.register_decoration({
|
|||
place_on = desert_cave_surface,
|
||||
fill_ratio = 0.1,
|
||||
biomes = asuna.features.cave.coal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
decoration = "caverealms:coal_dust",
|
||||
flags = "all_floors,force_placement",
|
||||
|
@ -401,8 +401,8 @@ minetest.register_decoration({
|
|||
place_on = desert_cave_surface,
|
||||
fill_ratio = 0.005,
|
||||
biomes = asuna.features.cave.coal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
decoration = "default:coalblock",
|
||||
flags = "all_floors,force_placement",
|
||||
|
@ -414,8 +414,8 @@ minetest.register_decoration({
|
|||
place_on = desert_cave_surface,
|
||||
fill_ratio = 0.01,
|
||||
biomes = asuna.features.cave.coal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
decoration = "caverealms:constant_flame",
|
||||
flags = "all_floors",
|
||||
})
|
||||
|
@ -432,8 +432,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.001,
|
||||
biomes = asuna.features.cave.coal,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
decoration = "default:cactus",
|
||||
flags = "all_floors",
|
||||
})
|
||||
|
@ -446,8 +446,8 @@ minetest.register_decoration({
|
|||
place_on = "default:stone",
|
||||
fill_ratio = 10,
|
||||
biomes = asuna.features.cave.fire,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
decoration = "caverealms:hot_cobble",
|
||||
flags = "all_floors,force_placement",
|
||||
|
@ -467,8 +467,8 @@ minetest.register_decoration({
|
|||
lacunarity = 0.7,
|
||||
},
|
||||
biomes = asuna.features.cave.fire,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
decoration = "default:obsidian",
|
||||
flags = "all_floors,force_placement",
|
||||
|
@ -480,8 +480,8 @@ minetest.register_decoration({
|
|||
place_on = "default:stone",
|
||||
fill_ratio = 10,
|
||||
biomes = asuna.features.cave.fire,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
decoration = "caverealms:hot_cobble",
|
||||
flags = "all_ceilings,force_placement",
|
||||
|
@ -493,8 +493,8 @@ minetest.register_decoration({
|
|||
place_on = "caverealms:hot_cobble",
|
||||
fill_ratio = 0.085,
|
||||
biomes = asuna.features.cave.fire,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
decoration = "caverealms:constant_flame",
|
||||
flags = "all_floors",
|
||||
})
|
||||
|
@ -516,8 +516,8 @@ abdecor.register_advanced_decoration("caverealms_fire_cave_lava",{
|
|||
},
|
||||
sidelen = 80,
|
||||
fill_ratio = 0.065,
|
||||
y_max = -8,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
flags = "all_floors",
|
||||
},
|
||||
fn = function(mapgen)
|
||||
|
@ -567,8 +567,8 @@ minetest.register_decoration({
|
|||
place_on = "default:stone",
|
||||
fill_ratio = 10,
|
||||
biomes = asuna.features.cave.dry,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
decoration = dry_cave_surface,
|
||||
flags = "all_floors,force_placement",
|
||||
|
@ -582,8 +582,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.dry,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "ruby_stalagmite.mts",
|
||||
flags = "all_floors,place_center_x,place_center_z",
|
||||
|
@ -597,8 +597,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.dry,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "ruby_stalactite.mts",
|
||||
flags = "all_ceilings,place_center_x,place_center_z",
|
||||
|
@ -612,8 +612,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.dry,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "amethyst_stalagmite.mts",
|
||||
flags = "all_floors,place_center_x,place_center_z",
|
||||
|
@ -627,8 +627,8 @@ minetest.register_decoration({
|
|||
num_spawn_by = 8,
|
||||
fill_ratio = 0.000085,
|
||||
biomes = asuna.features.cave.dry,
|
||||
y_max = -16,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
place_offset_y = -1,
|
||||
schematic = spath .. "amethyst_stalactite.mts",
|
||||
flags = "all_ceilings,place_center_x,place_center_z",
|
||||
|
@ -640,8 +640,8 @@ minetest.register_decoration({
|
|||
place_on = dry_cave_surface,
|
||||
fill_ratio = 0.01,
|
||||
biomes = asuna.features.cave.dry,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
decoration = "caverealms:spike",
|
||||
flags = "all_floors",
|
||||
})
|
||||
|
@ -652,8 +652,8 @@ minetest.register_decoration({
|
|||
place_on = "default:stone",
|
||||
fill_ratio = 0.01,
|
||||
biomes = asuna.features.cave.dry,
|
||||
y_max = 0,
|
||||
y_min = -31000,
|
||||
y_max = -4096,
|
||||
y_min = -10000,
|
||||
height = 2,
|
||||
height_max = 3,
|
||||
decoration = "caverealms:fire_vine",
|
||||
|
|
|
@ -20,8 +20,8 @@ local function setting(stype, name, default)
|
|||
end
|
||||
|
||||
--generation settings
|
||||
setting("number", "ymin", -33000) --bottom realm limit
|
||||
setting("number", "ymax", -1500) --top realm limit
|
||||
setting("number", "ymin", -10000) --bottom realm limit
|
||||
setting("number", "ymax", -4096) --top realm limit
|
||||
setting("number", "tcave", 0.75) --cave threshold
|
||||
|
||||
--decoration chances
|
||||
|
@ -30,7 +30,7 @@ setting("number", "stalcha", 0.003) --chance of stalactites
|
|||
|
||||
setting("number", "h_lag", 8) --max height for stalagmites
|
||||
setting("number", "h_lac", 8) --...stalactites
|
||||
setting("number", "crystal", 0.0002) --chance of glow crystal formations
|
||||
setting("number", "crystal", 0.0002) --chance of glow crystal formations
|
||||
setting("number", "h_cry", 8) --max height of glow crystals
|
||||
setting("number", "h_clac", 8) --max height of glow crystal stalactites
|
||||
|
||||
|
@ -43,8 +43,8 @@ setting("number", "icicha", 0.035) --chance of icicles
|
|||
setting("number", "flacha", 0.04) --chance of constant flames
|
||||
|
||||
--realm limits for Dungeon Masters' Lair
|
||||
setting("number", "dm_top", -14000) --upper limit
|
||||
setting("number", "dm_bot", -16000) --lower limit
|
||||
setting("number", "dm_top", -8000) --upper limit
|
||||
setting("number", "dm_bot", -10000) --lower limit
|
||||
|
||||
--should DMs spawn in DM Lair?
|
||||
setting("bool", "dm_spawn", true)
|
||||
|
|
28
mods/cloudlands/.luacheckrc
Normal file
|
@ -0,0 +1,28 @@
|
|||
unused_args = false
|
||||
allow_defined_top = true
|
||||
|
||||
globals = {
|
||||
"cloudlands"
|
||||
}
|
||||
|
||||
read_globals = {
|
||||
"core",
|
||||
"default",
|
||||
"biomeinfo",
|
||||
"schemlib",
|
||||
"nether",
|
||||
"DIR_DELIM",
|
||||
"intllib",
|
||||
"ItemStack",
|
||||
"math.hypot",
|
||||
"minetest",
|
||||
"PcgRandom",
|
||||
"PseudoRandom",
|
||||
table = { fields = { "copy", "getn" } },
|
||||
"vector",
|
||||
"file_exists",
|
||||
"dump",
|
||||
"VoxelArea",
|
||||
"VoxelManip",
|
||||
}
|
||||
|
26
mods/cloudlands/LICENSE.txt
Normal file
|
@ -0,0 +1,26 @@
|
|||
Cloudlands mapgen
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Copyright © 2018 Treer <treer.git@gmail.com>
|
||||
|
||||
A more permissive license may be available by request.
|
||||
|
||||
For simplicity this Minetest mod is licensed with the same
|
||||
license as Minetest - "GNU LGPL" version 2.1 or later.
|
||||
|
||||
|
||||
GNU LGPL information
|
||||
--------------------
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You can receive a copy of the GNU Lesser General Public License from
|
||||
http://www.gnu.org/
|
56
mods/cloudlands/README.md
Normal file
|
@ -0,0 +1,56 @@
|
|||
<p align="center">
|
||||
<img src="https://i.imgur.com/uh8Ee9T.jpg"/>
|
||||
</p>
|
||||
|
||||
# Hallelujah Mountains for Minetest
|
||||
|
||||
<img src="https://raw.githubusercontent.com/wiki/treer/amidstest/screenshots/150px-Minetest-logo.png" align="right" />
|
||||
|
||||
[](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
|
||||
|
||||
AKA Cloudlands — giant rocks floating suspended in magnetic eddies. Now with giant trees
|
||||
|
||||
This can be run with or without a normal terrain mapgen, allowing pure skylands or an exotic addition to the landscape.
|
||||
|
||||
Many Configurable settings, including the altitude islands appear, and the ability to restrict the areas they spawn.
|
||||
|
||||
It's a single file with no hard dependencies for easy integration into modpacks or games, e.g. as an exotic biome.
|
||||
|
||||
Hallelujah Mountains [maps](https://i.imgur.com/2SkoAyB.png) can be generated by [Amidstest](https://forum.minetest.net/viewtopic.php?t=19869), provided you know the seed of the world. The islands are not homogenous — there will be areas without any, while smaller islands tend to follow eddy fields, often emanating out from much larger and rarer islands.
|
||||
|
||||
**Mod dependencies:** None.
|
||||
|
||||
**Minetest version:** v5.0+
|
||||
|
||||
**Recommended mods:**
|
||||
* [Vines](https://forum.minetest.net/viewtopic.php?t=2344), or something that contains vines, such as plantlife_modpack or MineClone2. These will grow off the sides of the islands, climate permitting, allowing you to climb, and looking picturesque!
|
||||
* [Nether](https://forum.minetest.net/viewtopic.php?t=5790) enables players to build portals to Hallelujah Mountains, allowing secret entrances into floating kingdoms, or the island altitude to be configured way up high while still having a means to get there. Stones to build these portals can only be found in the Nether.
|
||||
* Extra ways to explore
|
||||
* [Bridger](https://forum.minetest.net/viewtopic.php?t=18243) or [Bridges](https://forum.minetest.net/viewtopic.php?t=3488) if you want to build nice wooden bridges between islands
|
||||
* [Airboat](https://github.com/paramat/airboat) to sail the high clouds on a small airship
|
||||
* [Flying carpet](https://forum.minetest.net/viewtopic.php?t=12263)
|
||||
* [Jetpack, wings, etc.](https://forum.minetest.net/viewtopic.php?t=11257)
|
||||
* [Hang-glider / Elytra](https://forum.minetest.net/viewtopic.php?t=21425)
|
||||
* Teleporter mods, balloon mods, etc.
|
||||
|
||||
**Ores tip:** If you decide ores like iron and diamond should be obtainable from island stone, and are playing Minetest Game, you can go into Settings->Advanced Settings->Mods->cloudlands, set the "Altitude of Islands" to be 1300 (or higher), and Enable "Generate ores inside islands". This works because Minetest Game also generates the deep-underground ores in stone above 1025 to ensure they can be found in mgV7 Floatlands. Ores can be added in other games or at other altitudes by adding adjusted copies of the game's calls to minetest.register_ore().
|
||||
|
||||
**Video:** [Minetest Mod Review: Cloudlands](http://www.nathansalapat.com/minetest/cloudlands)
|
||||
|
||||
**Forum:** [link](https://forum.minetest.net/viewtopic.php?t=20257)
|
||||
|
||||
**Screenshots:**
|
||||
|
||||
[](http://panoramas.minetest.land/IslandMoonlight.html)
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
21
mods/cloudlands/bower.json
Normal file
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"name": "cloudlands",
|
||||
"description": "Hallelujah Mountains for Minetest (runs with or without a normal terrain mapgen)",
|
||||
"keywords": [
|
||||
"cloudlands", "Hallelujah Mountains", "floatlands", "skylands", "islands", "mapgen", "fantasy", "fly"
|
||||
],
|
||||
"homepage": "https://github.com/Treer/cloudlands",
|
||||
"forum": "https://forum.minetest.net/viewtopic.php?t=20257",
|
||||
"screenshots": [
|
||||
"https://i.imgur.com/A6vDDGc.jpg",
|
||||
"https://i.imgur.com/PUjjaIK.jpg",
|
||||
"https://i.imgur.com/Zty57dy.jpg",
|
||||
"https://i.imgur.com/wBLEFWn.jpg",
|
||||
"https://i.imgur.com/xn9UING.jpg",
|
||||
"https://i.imgur.com/rCtczAK.jpg"
|
||||
],
|
||||
"authors": [
|
||||
"Treer"
|
||||
],
|
||||
"license": "LGPL-2.1-or-later"
|
||||
}
|
2967
mods/cloudlands/cloudlands.lua
Normal file
BIN
mods/cloudlands/cloudlands_tree1.mts
Normal file
BIN
mods/cloudlands/cloudlands_tree2.mts
Normal file
426
mods/cloudlands/i18n.py
Normal file
|
@ -0,0 +1,426 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Script to generate the template file and update the translation files.
|
||||
# Copy the script into the mod or modpack root folder and run it there.
|
||||
#
|
||||
# Copyright (C) 2019 Joachim Stolberg, 2020 FaceDeer, 2020 Louis Royer
|
||||
# LGPLv2.1+
|
||||
#
|
||||
# See https://github.com/minetest-tools/update_translations for
|
||||
# potential future updates to this script.
|
||||
|
||||
from __future__ import print_function
|
||||
import os, fnmatch, re, shutil, errno
|
||||
from sys import argv as _argv
|
||||
|
||||
# Running params
|
||||
params = {"recursive": False,
|
||||
"help": False,
|
||||
"mods": False,
|
||||
"verbose": False,
|
||||
"folders": [],
|
||||
"no-old-file": False
|
||||
}
|
||||
# Available CLI options
|
||||
options = {"recursive": ['--recursive', '-r'],
|
||||
"help": ['--help', '-h'],
|
||||
"mods": ['--installed-mods'],
|
||||
"verbose": ['--verbose', '-v'],
|
||||
"no-old-file": ['--no-old-file']
|
||||
}
|
||||
|
||||
# Strings longer than this will have extra space added between
|
||||
# them in the translation files to make it easier to distinguish their
|
||||
# beginnings and endings at a glance
|
||||
doublespace_threshold = 60
|
||||
|
||||
def set_params_folders(tab: list):
|
||||
'''Initialize params["folders"] from CLI arguments.'''
|
||||
# Discarding argument 0 (tool name)
|
||||
for param in tab[1:]:
|
||||
stop_param = False
|
||||
for option in options:
|
||||
if param in options[option]:
|
||||
stop_param = True
|
||||
break
|
||||
if not stop_param:
|
||||
params["folders"].append(os.path.abspath(param))
|
||||
|
||||
def set_params(tab: list):
|
||||
'''Initialize params from CLI arguments.'''
|
||||
for option in options:
|
||||
for option_name in options[option]:
|
||||
if option_name in tab:
|
||||
params[option] = True
|
||||
break
|
||||
|
||||
def print_help(name):
|
||||
'''Prints some help message.'''
|
||||
print(f'''SYNOPSIS
|
||||
{name} [OPTIONS] [PATHS...]
|
||||
DESCRIPTION
|
||||
{', '.join(options["help"])}
|
||||
prints this help message
|
||||
{', '.join(options["recursive"])}
|
||||
run on all subfolders of paths given
|
||||
{', '.join(options["mods"])}
|
||||
run on locally installed modules
|
||||
{', '.join(options["no-old-file"])}
|
||||
do not create *.old files
|
||||
{', '.join(options["verbose"])}
|
||||
add output information
|
||||
''')
|
||||
|
||||
|
||||
def main():
|
||||
'''Main function'''
|
||||
set_params(_argv)
|
||||
set_params_folders(_argv)
|
||||
if params["help"]:
|
||||
print_help(_argv[0])
|
||||
elif params["recursive"] and params["mods"]:
|
||||
print("Option --installed-mods is incompatible with --recursive")
|
||||
else:
|
||||
# Add recursivity message
|
||||
print("Running ", end='')
|
||||
if params["recursive"]:
|
||||
print("recursively ", end='')
|
||||
# Running
|
||||
if params["mods"]:
|
||||
print(f"on all locally installed modules in {os.path.abspath('~/.minetest/mods/')}")
|
||||
run_all_subfolders("~/.minetest/mods")
|
||||
elif len(params["folders"]) >= 2:
|
||||
print("on folder list:", params["folders"])
|
||||
for f in params["folders"]:
|
||||
if params["recursive"]:
|
||||
run_all_subfolders(f)
|
||||
else:
|
||||
update_folder(f)
|
||||
elif len(params["folders"]) == 1:
|
||||
print("on folder", params["folders"][0])
|
||||
if params["recursive"]:
|
||||
run_all_subfolders(params["folders"][0])
|
||||
else:
|
||||
update_folder(params["folders"][0])
|
||||
else:
|
||||
print("on folder", os.path.abspath("./"))
|
||||
if params["recursive"]:
|
||||
run_all_subfolders(os.path.abspath("./"))
|
||||
else:
|
||||
update_folder(os.path.abspath("./"))
|
||||
|
||||
#group 2 will be the string, groups 1 and 3 will be the delimiters (" or ')
|
||||
#See https://stackoverflow.com/questions/46967465/regex-match-text-in-either-single-or-double-quote
|
||||
pattern_lua = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL)
|
||||
pattern_lua_bracketed = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*\[\[(.*?)\]\][\s,\)]', re.DOTALL)
|
||||
|
||||
# Handles "concatenation" .. " of strings"
|
||||
pattern_concat = re.compile(r'["\'][\s]*\.\.[\s]*["\']', re.DOTALL)
|
||||
|
||||
pattern_tr = re.compile(r'(.+?[^@])=(.*)')
|
||||
pattern_name = re.compile(r'^name[ ]*=[ ]*([^ \n]*)')
|
||||
pattern_tr_filename = re.compile(r'\.tr$')
|
||||
pattern_po_language_code = re.compile(r'(.*)\.po$')
|
||||
|
||||
#attempt to read the mod's name from the mod.conf file. Returns None on failure
|
||||
def get_modname(folder):
|
||||
try:
|
||||
with open(os.path.join(folder, "mod.conf"), "r", encoding='utf-8') as mod_conf:
|
||||
for line in mod_conf:
|
||||
match = pattern_name.match(line)
|
||||
if match:
|
||||
return match.group(1)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
return None
|
||||
|
||||
#If there are already .tr files in /locale, returns a list of their names
|
||||
def get_existing_tr_files(folder):
|
||||
out = []
|
||||
for root, dirs, files in os.walk(os.path.join(folder, 'locale/')):
|
||||
for name in files:
|
||||
if pattern_tr_filename.search(name):
|
||||
out.append(name)
|
||||
return out
|
||||
|
||||
# A series of search and replaces that massage a .po file's contents into
|
||||
# a .tr file's equivalent
|
||||
def process_po_file(text):
|
||||
# The first three items are for unused matches
|
||||
text = re.sub(r'#~ msgid "', "", text)
|
||||
text = re.sub(r'"\n#~ msgstr ""\n"', "=", text)
|
||||
text = re.sub(r'"\n#~ msgstr "', "=", text)
|
||||
# comment lines
|
||||
text = re.sub(r'#.*\n', "", text)
|
||||
# converting msg pairs into "=" pairs
|
||||
text = re.sub(r'msgid "', "", text)
|
||||
text = re.sub(r'"\nmsgstr ""\n"', "=", text)
|
||||
text = re.sub(r'"\nmsgstr "', "=", text)
|
||||
# various line breaks and escape codes
|
||||
text = re.sub(r'"\n"', "", text)
|
||||
text = re.sub(r'"\n', "\n", text)
|
||||
text = re.sub(r'\\"', '"', text)
|
||||
text = re.sub(r'\\n', '@n', text)
|
||||
# remove header text
|
||||
text = re.sub(r'=Project-Id-Version:.*\n', "", text)
|
||||
# remove double-spaced lines
|
||||
text = re.sub(r'\n\n', '\n', text)
|
||||
return text
|
||||
|
||||
# Go through existing .po files and, if a .tr file for that language
|
||||
# *doesn't* exist, convert it and create it.
|
||||
# The .tr file that results will subsequently be reprocessed so
|
||||
# any "no longer used" strings will be preserved.
|
||||
# Note that "fuzzy" tags will be lost in this process.
|
||||
def process_po_files(folder, modname):
|
||||
for root, dirs, files in os.walk(os.path.join(folder, 'locale/')):
|
||||
for name in files:
|
||||
code_match = pattern_po_language_code.match(name)
|
||||
if code_match == None:
|
||||
continue
|
||||
language_code = code_match.group(1)
|
||||
tr_name = modname + "." + language_code + ".tr"
|
||||
tr_file = os.path.join(root, tr_name)
|
||||
if os.path.exists(tr_file):
|
||||
if params["verbose"]:
|
||||
print(f"{tr_name} already exists, ignoring {name}")
|
||||
continue
|
||||
fname = os.path.join(root, name)
|
||||
with open(fname, "r", encoding='utf-8') as po_file:
|
||||
if params["verbose"]:
|
||||
print(f"Importing translations from {name}")
|
||||
text = process_po_file(po_file.read())
|
||||
with open(tr_file, "wt", encoding='utf-8') as tr_out:
|
||||
tr_out.write(text)
|
||||
|
||||
# from https://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python/600612#600612
|
||||
# Creates a directory if it doesn't exist, silently does
|
||||
# nothing if it already exists
|
||||
def mkdir_p(path):
|
||||
try:
|
||||
os.makedirs(path)
|
||||
except OSError as exc: # Python >2.5
|
||||
if exc.errno == errno.EEXIST and os.path.isdir(path):
|
||||
pass
|
||||
else: raise
|
||||
|
||||
# Converts the template dictionary to a text to be written as a file
|
||||
# dKeyStrings is a dictionary of localized string to source file sets
|
||||
# dOld is a dictionary of existing translations and comments from
|
||||
# the previous version of this text
|
||||
def strings_to_text(dkeyStrings, dOld, mod_name):
|
||||
lOut = [f"# textdomain: {mod_name}\n"]
|
||||
|
||||
dGroupedBySource = {}
|
||||
|
||||
for key in dkeyStrings:
|
||||
sourceList = list(dkeyStrings[key])
|
||||
sourceList.sort()
|
||||
sourceString = "\n".join(sourceList)
|
||||
listForSource = dGroupedBySource.get(sourceString, [])
|
||||
listForSource.append(key)
|
||||
dGroupedBySource[sourceString] = listForSource
|
||||
|
||||
lSourceKeys = list(dGroupedBySource.keys())
|
||||
lSourceKeys.sort()
|
||||
for source in lSourceKeys:
|
||||
localizedStrings = dGroupedBySource[source]
|
||||
localizedStrings.sort()
|
||||
lOut.append("")
|
||||
lOut.append(source)
|
||||
lOut.append("")
|
||||
for localizedString in localizedStrings:
|
||||
val = dOld.get(localizedString, {})
|
||||
translation = val.get("translation", "")
|
||||
comment = val.get("comment")
|
||||
if len(localizedString) > doublespace_threshold and not lOut[-1] == "":
|
||||
lOut.append("")
|
||||
if comment != None:
|
||||
lOut.append(comment)
|
||||
lOut.append(f"{localizedString}={translation}")
|
||||
if len(localizedString) > doublespace_threshold:
|
||||
lOut.append("")
|
||||
|
||||
|
||||
unusedExist = False
|
||||
for key in dOld:
|
||||
if key not in dkeyStrings:
|
||||
val = dOld[key]
|
||||
translation = val.get("translation")
|
||||
comment = val.get("comment")
|
||||
# only keep an unused translation if there was translated
|
||||
# text or a comment associated with it
|
||||
if translation != None and (translation != "" or comment):
|
||||
if not unusedExist:
|
||||
unusedExist = True
|
||||
lOut.append("\n\n##### not used anymore #####\n")
|
||||
if len(key) > doublespace_threshold and not lOut[-1] == "":
|
||||
lOut.append("")
|
||||
if comment != None:
|
||||
lOut.append(comment)
|
||||
lOut.append(f"{key}={translation}")
|
||||
if len(key) > doublespace_threshold:
|
||||
lOut.append("")
|
||||
return "\n".join(lOut) + '\n'
|
||||
|
||||
# Writes a template.txt file
|
||||
# dkeyStrings is the dictionary returned by generate_template
|
||||
def write_template(templ_file, dkeyStrings, mod_name):
|
||||
# read existing template file to preserve comments
|
||||
existing_template = import_tr_file(templ_file)
|
||||
|
||||
text = strings_to_text(dkeyStrings, existing_template[0], mod_name)
|
||||
mkdir_p(os.path.dirname(templ_file))
|
||||
with open(templ_file, "wt", encoding='utf-8') as template_file:
|
||||
template_file.write(text)
|
||||
|
||||
|
||||
# Gets all translatable strings from a lua file
|
||||
def read_lua_file_strings(lua_file):
|
||||
lOut = []
|
||||
with open(lua_file, encoding='utf-8') as text_file:
|
||||
text = text_file.read()
|
||||
#TODO remove comments here
|
||||
|
||||
text = re.sub(pattern_concat, "", text)
|
||||
|
||||
strings = []
|
||||
for s in pattern_lua.findall(text):
|
||||
strings.append(s[1])
|
||||
for s in pattern_lua_bracketed.findall(text):
|
||||
strings.append(s)
|
||||
|
||||
for s in strings:
|
||||
s = re.sub(r'"\.\.\s+"', "", s)
|
||||
s = re.sub("@[^@=0-9]", "@@", s)
|
||||
s = s.replace('\\"', '"')
|
||||
s = s.replace("\\'", "'")
|
||||
s = s.replace("\n", "@n")
|
||||
s = s.replace("\\n", "@n")
|
||||
s = s.replace("=", "@=")
|
||||
lOut.append(s)
|
||||
return lOut
|
||||
|
||||
# Gets strings from an existing translation file
|
||||
# returns both a dictionary of translations
|
||||
# and the full original source text so that the new text
|
||||
# can be compared to it for changes.
|
||||
def import_tr_file(tr_file):
|
||||
dOut = {}
|
||||
text = None
|
||||
if os.path.exists(tr_file):
|
||||
with open(tr_file, "r", encoding='utf-8') as existing_file :
|
||||
# save the full text to allow for comparison
|
||||
# of the old version with the new output
|
||||
text = existing_file.read()
|
||||
existing_file.seek(0)
|
||||
# a running record of the current comment block
|
||||
# we're inside, to allow preceeding multi-line comments
|
||||
# to be retained for a translation line
|
||||
latest_comment_block = None
|
||||
for line in existing_file.readlines():
|
||||
line = line.rstrip('\n')
|
||||
if line[:3] == "###":
|
||||
# Reset comment block if we hit a header
|
||||
latest_comment_block = None
|
||||
continue
|
||||
if line[:1] == "#":
|
||||
# Save the comment we're inside
|
||||
if not latest_comment_block:
|
||||
latest_comment_block = line
|
||||
else:
|
||||
latest_comment_block = latest_comment_block + "\n" + line
|
||||
continue
|
||||
match = pattern_tr.match(line)
|
||||
if match:
|
||||
# this line is a translated line
|
||||
outval = {}
|
||||
outval["translation"] = match.group(2)
|
||||
if latest_comment_block:
|
||||
# if there was a comment, record that.
|
||||
outval["comment"] = latest_comment_block
|
||||
latest_comment_block = None
|
||||
dOut[match.group(1)] = outval
|
||||
return (dOut, text)
|
||||
|
||||
# Walks all lua files in the mod folder, collects translatable strings,
|
||||
# and writes it to a template.txt file
|
||||
# Returns a dictionary of localized strings to source file sets
|
||||
# that can be used with the strings_to_text function.
|
||||
def generate_template(folder, mod_name):
|
||||
dOut = {}
|
||||
for root, dirs, files in os.walk(folder):
|
||||
for name in files:
|
||||
if fnmatch.fnmatch(name, "*.lua"):
|
||||
fname = os.path.join(root, name)
|
||||
found = read_lua_file_strings(fname)
|
||||
if params["verbose"]:
|
||||
print(f"{fname}: {str(len(found))} translatable strings")
|
||||
|
||||
for s in found:
|
||||
sources = dOut.get(s, set())
|
||||
sources.add(f"### {os.path.basename(fname)} ###")
|
||||
dOut[s] = sources
|
||||
|
||||
if len(dOut) == 0:
|
||||
return None
|
||||
templ_file = os.path.join(folder, "locale/template.txt")
|
||||
write_template(templ_file, dOut, mod_name)
|
||||
return dOut
|
||||
|
||||
# Updates an existing .tr file, copying the old one to a ".old" file
|
||||
# if any changes have happened
|
||||
# dNew is the data used to generate the template, it has all the
|
||||
# currently-existing localized strings
|
||||
def update_tr_file(dNew, mod_name, tr_file):
|
||||
if params["verbose"]:
|
||||
print(f"updating {tr_file}")
|
||||
|
||||
tr_import = import_tr_file(tr_file)
|
||||
dOld = tr_import[0]
|
||||
textOld = tr_import[1]
|
||||
|
||||
textNew = strings_to_text(dNew, dOld, mod_name)
|
||||
|
||||
if textOld and textOld != textNew:
|
||||
print(f"{tr_file} has changed.")
|
||||
if not params["no-old-file"]:
|
||||
shutil.copyfile(tr_file, f"{tr_file}.old")
|
||||
|
||||
with open(tr_file, "w", encoding='utf-8') as new_tr_file:
|
||||
new_tr_file.write(textNew)
|
||||
|
||||
# Updates translation files for the mod in the given folder
|
||||
def update_mod(folder):
|
||||
modname = get_modname(folder)
|
||||
if modname is not None:
|
||||
process_po_files(folder, modname)
|
||||
print(f"Updating translations for {modname}")
|
||||
data = generate_template(folder, modname)
|
||||
if data == None:
|
||||
print(f"No translatable strings found in {modname}")
|
||||
else:
|
||||
for tr_file in get_existing_tr_files(folder):
|
||||
update_tr_file(data, modname, os.path.join(folder, "locale/", tr_file))
|
||||
else:
|
||||
print("Unable to find modname in folder " + folder)
|
||||
|
||||
# Determines if the folder being pointed to is a mod or a mod pack
|
||||
# and then runs update_mod accordingly
|
||||
def update_folder(folder):
|
||||
is_modpack = os.path.exists(os.path.join(folder, "modpack.txt")) or os.path.exists(os.path.join(folder, "modpack.conf"))
|
||||
if is_modpack:
|
||||
subfolders = [f.path for f in os.scandir(folder) if f.is_dir()]
|
||||
for subfolder in subfolders:
|
||||
update_mod(subfolder + "/")
|
||||
else:
|
||||
update_mod(folder)
|
||||
print("Done.")
|
||||
|
||||
def run_all_subfolders(folder):
|
||||
for modfolder in [f.path for f in os.scandir(folder) if f.is_dir()]:
|
||||
update_folder(modfolder + "/")
|
||||
|
||||
|
||||
main()
|
3
mods/cloudlands/init.lua
Normal file
|
@ -0,0 +1,3 @@
|
|||
local path = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
dofile(path.."/cloudlands.lua")
|
33
mods/cloudlands/locale/template.txt
Normal file
|
@ -0,0 +1,33 @@
|
|||
# textdomain: cloudlands
|
||||
|
||||
|
||||
### cloudlands.lua ###
|
||||
|
||||
Ancient Portalstone=
|
||||
Bark of @1=
|
||||
Bert Shackleton=
|
||||
Blossom=
|
||||
Cobweb=
|
||||
|
||||
Construction requires 14 blocks of ancient portalstone. We have no knowledge of how portalstones were created, the means to craft them are likely lost to time, so our only source has been to scavenge the Nether for the remnants of ancient broken portals. A finished frame is four blocks wide, five blocks high, and stands vertically, like a doorway.=
|
||||
|
||||
Dead bleached wood=
|
||||
Diary of Bert Shackleton=
|
||||
Fossil Display=
|
||||
Fossilized Egg=
|
||||
Giant Ziricote=
|
||||
Giant tree=
|
||||
Glowing @1=
|
||||
Hallelujah Mountains Portal=
|
||||
Heart of the Tree=
|
||||
Leaves of a giant tree=
|
||||
Sakura blossom=
|
||||
|
||||
The aerostat is lost.@n@nHowever, salvage attempts throughout the night managed to@nsave most provisions before it finally broke apart and fell.@n@n ---@=@=@=@=---@n@nThis island is highly exposed and the weather did not treat@nthe tents well. We have enlarged a sheltered crag in the @1,@nbut it is laborous work and the condition of some of the party@nis becoming cause for concern.@n@nQuite a journey is now required, we cannot stay - nobody will@nlook for us here. McNish is attempting to strengthen the gliders.@n@n ---@=@=@=@=---=
|
||||
|
||||
The only portal we managed to scavenge enough portalstone to build took us to a land of floating islands. There were hills and forests and even water up there, but the edges are a perilous drop — a depth of which we cannot even begin to plumb.=
|
||||
|
||||
Weddell Outpost, November 21=
|
||||
Wisteria blossom=
|
||||
ice=
|
||||
rock=
|
16
mods/cloudlands/mod.conf
Normal file
|
@ -0,0 +1,16 @@
|
|||
name = cloudlands
|
||||
optional_depends = nether, vines, biomeinfo, schemlib, default, mcl_core, xpanes, ethereal, main
|
||||
min_minetest_version = 5.0
|
||||
description = """
|
||||
Hallelujah Mountains for Minetest
|
||||
|
||||
Giant rocks floating suspended in magnetic eddies.
|
||||
|
||||
This can be run with or without a normal terrain mapgen, allowing pure skylands or an exotic addition to the landscape.
|
||||
|
||||
Configurable settings include the altitude islands appear, and the ability to restrict the area they spawn. If you only ever see snow-covered islands then enable the "Use lowland biomes" option.
|
||||
"""
|
||||
|
||||
release = 18355
|
||||
author = DrFrankenstone
|
||||
title = Hallelujah Mountains (AKA Cloudlands)
|
BIN
mods/cloudlands/screenshot.png
Normal file
After Width: | Height: | Size: 370 KiB |
70
mods/cloudlands/settingtypes.txt
Normal file
|
@ -0,0 +1,70 @@
|
|||
# If true then islands will use biomes from altitude 10 - higher than beaches
|
||||
# and lower than mountains. This avoids a problem with some mods which have
|
||||
# alpine biomes, causing all islands to be alpine/snowy due to their altitude,
|
||||
# however plant-life may still reflect the actual altitude of the islands.
|
||||
#
|
||||
# Turn this off to have each island's altitude affect its biome.
|
||||
cloudlands_use_lowland_biomes (Use lowland biomes) bool false
|
||||
|
||||
# The average altitude islands are found at
|
||||
#
|
||||
# In Minetest game, ores like iron and diamond will be generated if the
|
||||
# altitude of islands is set above 1200 and "Generate ores inside islands"
|
||||
# is Enabled.
|
||||
cloudlands_altitude (Altitude of islands) int 1500
|
||||
|
||||
# The rough variance of altitude in islands (plus or minus this value)
|
||||
cloudlands_altitude_amplitude (Altitude variance) int 1200
|
||||
|
||||
# Generates patches of sand and dirt inside island stone cores.
|
||||
cloudlands_generate_ores (Generate ores inside islands - patches of dirt, sand etc.) bool true
|
||||
|
||||
# Set this to 0 to disable vines.
|
||||
#
|
||||
# A percentage value between 0 and 100 which controls the likelyhood of each
|
||||
# node on an island edge having a vine growing down it.
|
||||
# This option is ignored unless played with a game or mod which provides vines,
|
||||
# such as plantlife_modpack, vines, or MineClone2.
|
||||
# This setting does not alter the temperature or humidity determining whether
|
||||
# vines will be present on an island.
|
||||
cloudlands_vine_coverage (Vine coverage %) int 30 0 100
|
||||
|
||||
# If you wish to have large areas of the map without islands then specify
|
||||
# here the area where islands may spawn.
|
||||
#
|
||||
# The format is:
|
||||
# minimum_x minimum_z maximum_x maximum_z
|
||||
cloudlands_limit_rect (Limit island locations within rectange) string -32000 -32000 32000 32000
|
||||
|
||||
# Leave blank to allow islands to appear in any biome
|
||||
# Otherwise list biomes by name, with a space between each one.
|
||||
#
|
||||
# Example:
|
||||
# cold_desert sandstone_desert
|
||||
cloudlands_limit_biome (Limit island locations within listed biomes) string
|
||||
|
||||
# Only used when "Limit island locations within listed biomes" is set.
|
||||
# This specifies the altitude of biomes which determine whether islands can
|
||||
# spawn, allowing islands to have their own biome system at island altitude
|
||||
# while still having locations limited by the biomes at ground level.
|
||||
#
|
||||
# Set to about 10 to use ground level biomes (10 is higher than beaches)
|
||||
# Leave blank to use the islands' altitudes.
|
||||
cloudlands_limit_biome_altitude (Altitude for listed biomes) string
|
||||
|
||||
# Set this to 0 to disable giant trees.
|
||||
#
|
||||
# A percentage value between 0 and 100 which controls the spread of the
|
||||
# rare and gigantic trees which can sometimes be found growing on islands.
|
||||
cloudlands_giant_tree_rarety (Giant tree rarety %) int 8 0 100
|
||||
|
||||
# Set true to allow glowing rarer variants of the rare and gigantic trees
|
||||
# which can sometimes be found growing on islands.
|
||||
#
|
||||
# This option is ignored if tree rarety is set to 0
|
||||
cloudlands_bioluminescence (Allow glowing trees) bool true
|
||||
|
||||
# Set true to allow players to build portals to islands.
|
||||
#
|
||||
# Portals require the Nether mod.
|
||||
cloudlands_enable_portals (Enable portals to the islands) bool true
|
|
@ -55,7 +55,7 @@ register_biome(1, {
|
|||
name = "grassland_under",
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"},
|
||||
heat_point = old and 45 or 50, humidity_point = old and 65 or 35,
|
||||
y_min = -31000, y_max = -256})
|
||||
y_min = -2048, y_max = -256})
|
||||
|
||||
-- desert
|
||||
|
||||
|
@ -84,7 +84,7 @@ register_biome(ethereal.desert, {
|
|||
register_biome(ethereal.desert, {
|
||||
name = "desert_under",
|
||||
heat_point = old and 35 or 92, humidity_point = old and 20 or 16,
|
||||
y_min = -31000, y_max = -256,
|
||||
y_min = -2048, y_max = -256,
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"}})
|
||||
|
||||
-- bamboo
|
||||
|
@ -172,7 +172,7 @@ register_biome(ethereal.snowy, {
|
|||
register_biome(ethereal.snowy, {
|
||||
name = "coniferous_forest_under",
|
||||
heat_point = old and 10 or 45, humidity_point = old and 40 or 70,
|
||||
y_min = -31000, y_max = -256,
|
||||
y_min = -2048, y_max = -256,
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"}})
|
||||
|
||||
-- taiga
|
||||
|
@ -197,7 +197,7 @@ register_biome(ethereal.alpine, {
|
|||
register_biome(ethereal.alpine, {
|
||||
name = "taiga_under",
|
||||
heat_point = old and 10 or 25, humidity_point = old and 40 or 70,
|
||||
y_min = -31000, y_max = -256,
|
||||
y_min = -2048, y_max = -256,
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"}})
|
||||
|
||||
-- frost
|
||||
|
@ -235,14 +235,14 @@ register_biome(ethereal.grassy, {
|
|||
register_biome(ethereal.grassy, {
|
||||
name = "deciduous_forest_ocean",
|
||||
heat_point = old and 13 or 60, humidity_point = old and 40 or 68,
|
||||
y_min = -31000, y_max = 3,
|
||||
y_min = -2048, y_max = 3,
|
||||
node_top = "default:sand", depth_top = 2,
|
||||
node_filler = "default:gravel", depth_filler = 1})
|
||||
|
||||
register_biome(ethereal.grassy, {
|
||||
name = "deciduous_forest_under",
|
||||
heat_point = old and 13 or 60, humidity_point = old and 40 or 68,
|
||||
y_min = -31000, y_max = -256,
|
||||
y_min = -2048, y_max = -256,
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"}})
|
||||
|
||||
-- caves
|
||||
|
@ -280,7 +280,7 @@ register_biome(ethereal.grayness, {
|
|||
register_biome(ethereal.grayness, {
|
||||
name = "grayness_under",
|
||||
heat_point = 15, humidity_point = old and 25 or 30,
|
||||
y_min = -31000, y_max = -23,
|
||||
y_min = -2048, y_max = -23,
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"}})
|
||||
|
||||
-- grassy two
|
||||
|
@ -350,7 +350,7 @@ register_biome(ethereal.junglee, {
|
|||
register_biome(ethereal.junglee, {
|
||||
name = "rainforest_under",
|
||||
heat_point = old and 30 or 86, humidity_point = old and 60 or 65,
|
||||
y_min = -31000, y_max = -256,
|
||||
y_min = -2048, y_max = -256,
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"}})
|
||||
|
||||
-- swamp
|
||||
|
@ -444,7 +444,7 @@ register_biome(ethereal.sandstone, {
|
|||
register_biome(ethereal.sandstone, {
|
||||
name = "sandstone_desert_under",
|
||||
heat_point = old and 50 or 60, humidity_point = old and 20 or 0,
|
||||
y_min = -31000, y_max = -256,
|
||||
y_min = -2048, y_max = -256,
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"}})
|
||||
|
||||
-- plains
|
||||
|
@ -485,7 +485,7 @@ register_biome(ethereal.savanna, {
|
|||
register_biome(ethereal.savanna, {
|
||||
name = "savanna_under",
|
||||
heat_point = old and 55 or 89, humidity_point = old and 25 or 42,
|
||||
y_min = -31000, y_max = -256,
|
||||
y_min = -2048, y_max = -256,
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"}})
|
||||
|
||||
-- fiery
|
||||
|
@ -514,7 +514,7 @@ register_biome(ethereal.fiery, {
|
|||
register_biome(ethereal.fiery, {
|
||||
name = "fiery_under",
|
||||
heat_point = old and 75 or 80, humidity_point = 10,
|
||||
y_min = -31000, y_max = -256,
|
||||
y_min = -2048, y_max = -256,
|
||||
node_cave_liquid = {"default:lava_source"}})
|
||||
|
||||
-- glacier
|
||||
|
@ -545,7 +545,7 @@ register_biome(ethereal.glacier, {
|
|||
register_biome(ethereal.glacier, {
|
||||
name = "glacier_under",
|
||||
heat_point = 0, humidity_point = old and 50 or 73,
|
||||
y_max = -256, y_min = -31000,
|
||||
y_max = -256, y_min = -2048,
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"},
|
||||
node_dungeon = "default:cobble",
|
||||
node_dungeon_alt = "default:mossycobble",
|
||||
|
@ -585,7 +585,7 @@ register_biome(ethereal.tundra, {
|
|||
|
||||
register_biome(ethereal.tundra, {
|
||||
name = "tundra_under",
|
||||
heat_point = 0, humidity_point = 40, y_max = -256, y_min = -31000,
|
||||
heat_point = 0, humidity_point = 40, y_max = -256, y_min = -2048,
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"}})
|
||||
|
||||
-- only register when using new mapgen
|
||||
|
@ -612,7 +612,7 @@ if not old then
|
|||
register_biome(ethereal.cold_desert, {
|
||||
name = "cold_desert_under",
|
||||
node_cave_liquid = {"default:water_source", "default:lava_source"},
|
||||
heat_point = 20, humidity_point = 85, y_min = -31000, y_max = -256})
|
||||
heat_point = 20, humidity_point = 85, y_min = -2048, y_max = -256})
|
||||
|
||||
-- snowy grassland (inbetween frost and taiga/jumble)
|
||||
|
||||
|
|
|
@ -582,9 +582,9 @@ local function add_illumishroom(low, high, nodename)
|
|||
decoration = nodename})
|
||||
end
|
||||
|
||||
add_illumishroom(-1000, -50, "ethereal:illumishroom")
|
||||
add_illumishroom(-2000, -1000, "ethereal:illumishroom2")
|
||||
add_illumishroom(-3000, -2000, "ethereal:illumishroom3")
|
||||
add_illumishroom(-2000, -50, "ethereal:illumishroom")
|
||||
add_illumishroom(-4000, -2000, "ethereal:illumishroom2")
|
||||
add_illumishroom(-6000, -4000, "ethereal:illumishroom3")
|
||||
|
||||
--= Register Biome Decoration Using Plants Mega Pack Lite if Xanadu found
|
||||
|
||||
|
|
|
@ -82,7 +82,7 @@ Everness = {
|
|||
everness_coral_forest_under = {
|
||||
enabled = minetest.settings:get_bool('everness_coral_forest_under', true),
|
||||
y_max = tonumber(minetest.settings:get('everness_coral_forest_under_y_max')) or 0,
|
||||
y_min = tonumber(minetest.settings:get('everness_coral_forest_under_y_min')) or -31000,
|
||||
y_min = tonumber(minetest.settings:get('everness_coral_forest_under_y_min')) or -2048,
|
||||
},
|
||||
everness_frosted_icesheet = {
|
||||
enabled = minetest.settings:get_bool('everness_frosted_icesheet', true),
|
||||
|
@ -97,7 +97,7 @@ Everness = {
|
|||
everness_frosted_icesheet_under = {
|
||||
enabled = minetest.settings:get_bool('everness_frosted_icesheet_under', true),
|
||||
y_max = tonumber(minetest.settings:get('everness_frosted_icesheet_under_y_max')) or 0,
|
||||
y_min = tonumber(minetest.settings:get('everness_frosted_icesheet_under_y_min')) or -31000,
|
||||
y_min = tonumber(minetest.settings:get('everness_frosted_icesheet_under_y_min')) or -2048,
|
||||
},
|
||||
everness_cursed_lands = {
|
||||
enabled = minetest.settings:get_bool('everness_cursed_lands', true),
|
||||
|
@ -127,7 +127,7 @@ Everness = {
|
|||
everness_cursed_lands_under = {
|
||||
enabled = minetest.settings:get_bool('everness_cursed_lands_under', true),
|
||||
y_max = tonumber(minetest.settings:get('everness_cursed_lands_under_y_max')) or 0,
|
||||
y_min = tonumber(minetest.settings:get('everness_cursed_lands_under_y_min')) or -31000,
|
||||
y_min = tonumber(minetest.settings:get('everness_cursed_lands_under_y_min')) or -2048,
|
||||
},
|
||||
everness_crystal_forest = {
|
||||
enabled = minetest.settings:get_bool('everness_crystal_forest', true),
|
||||
|
@ -157,7 +157,7 @@ Everness = {
|
|||
everness_crystal_forest_under = {
|
||||
enabled = minetest.settings:get_bool('everness_crystal_forest_under', true),
|
||||
y_max = tonumber(minetest.settings:get('everness_crystal_forest_under_y_max')) or 0,
|
||||
y_min = tonumber(minetest.settings:get('everness_crystal_forest_under_y_min')) or -31000,
|
||||
y_min = tonumber(minetest.settings:get('everness_crystal_forest_under_y_min')) or -2048,
|
||||
},
|
||||
everness_bamboo_forest = {
|
||||
enabled = minetest.settings:get_bool('everness_bamboo_forest', true),
|
||||
|
@ -167,7 +167,7 @@ Everness = {
|
|||
everness_bamboo_forest_under = {
|
||||
enabled = minetest.settings:get_bool('everness_bamboo_forest_under', true),
|
||||
y_max = tonumber(minetest.settings:get('everness_bamboo_forest_under_y_max')) or 0,
|
||||
y_min = tonumber(minetest.settings:get('everness_bamboo_forest_under_y_min')) or -31000,
|
||||
y_min = tonumber(minetest.settings:get('everness_bamboo_forest_under_y_min')) or -2048,
|
||||
},
|
||||
everness_forsaken_desert = {
|
||||
enabled = minetest.settings:get_bool('everness_forsaken_desert', true),
|
||||
|
@ -182,7 +182,7 @@ Everness = {
|
|||
everness_forsaken_desert_under = {
|
||||
enabled = minetest.settings:get_bool('everness_forsaken_desert_under', true),
|
||||
y_max = tonumber(minetest.settings:get('everness_forsaken_desert_under_y_max')) or 0,
|
||||
y_min = tonumber(minetest.settings:get('everness_forsaken_desert_under_y_min')) or -31000,
|
||||
y_min = tonumber(minetest.settings:get('everness_forsaken_desert_under_y_min')) or -2048,
|
||||
},
|
||||
everness_baobab_savanna = {
|
||||
enabled = minetest.settings:get_bool('everness_baobab_savanna', false),
|
||||
|
@ -207,7 +207,7 @@ Everness = {
|
|||
everness_forsaken_tundra_under = {
|
||||
enabled = minetest.settings:get_bool('everness_forsaken_tundra_under', true),
|
||||
y_max = tonumber(minetest.settings:get('everness_forsaken_tundra_under_y_max')) or 0,
|
||||
y_min = tonumber(minetest.settings:get('everness_forsaken_tundra_under_y_min')) or -31000,
|
||||
y_min = tonumber(minetest.settings:get('everness_forsaken_tundra_under_y_min')) or -2048,
|
||||
},
|
||||
everness_mineral_waters = {
|
||||
enabled = minetest.settings:get_bool('everness_mineral_waters', true),
|
||||
|
@ -217,7 +217,7 @@ Everness = {
|
|||
everness_mineral_waters_under = {
|
||||
enabled = minetest.settings:get_bool('everness_mineral_waters_under', true),
|
||||
y_max = tonumber(minetest.settings:get('everness_mineral_waters_under_y_max')) or 0,
|
||||
y_min = tonumber(minetest.settings:get('everness_mineral_waters_under_y_min')) or -31000,
|
||||
y_min = tonumber(minetest.settings:get('everness_mineral_waters_under_y_min')) or -2048,
|
||||
},
|
||||
},
|
||||
features = {
|
||||
|
|
|
@ -58,7 +58,7 @@ everness_coral_forest_under (Coral Forest Under) bool true
|
|||
everness_coral_forest_under_y_max (y max) int -256
|
||||
|
||||
# Lower limit for biome.
|
||||
everness_coral_forest_under_y_min (y min) int -31000
|
||||
everness_coral_forest_under_y_min (y min) int -2048
|
||||
|
||||
[*Frosted Icesheet]
|
||||
|
||||
|
@ -94,7 +94,7 @@ everness_frosted_icesheet_under (Frosted Icesheet Under) bool true
|
|||
everness_frosted_icesheet_under_y_max (y max) int -256
|
||||
|
||||
# Lower limit for biome.
|
||||
everness_frosted_icesheet_under_y_min (y min) int -31000
|
||||
everness_frosted_icesheet_under_y_min (y min) int -2048
|
||||
|
||||
[*Cursed Lands]
|
||||
|
||||
|
@ -166,7 +166,7 @@ everness_cursed_lands_under (Cursed Lands Under) bool true
|
|||
everness_cursed_lands_under_y_max (y max) int -256
|
||||
|
||||
# Lower limit for biome.
|
||||
everness_cursed_lands_under_y_min (y min) int -31000
|
||||
everness_cursed_lands_under_y_min (y min) int -2048
|
||||
|
||||
[*Crystal Forest]
|
||||
|
||||
|
@ -238,7 +238,7 @@ everness_crystal_forest_under (Crystal Forest Under) bool true
|
|||
everness_crystal_forest_under_y_max (y max) int -256
|
||||
|
||||
# Lower limit for biome.
|
||||
everness_crystal_forest_under_y_min (y min) int -31000
|
||||
everness_crystal_forest_under_y_min (y min) int -2048
|
||||
|
||||
[*Bamboo Forest]
|
||||
|
||||
|
@ -262,7 +262,7 @@ everness_bamboo_forest_under (Bamboo Forest Under) bool true
|
|||
everness_bamboo_forest_under_y_max (y max) int -256
|
||||
|
||||
# Lower limit for biome.
|
||||
everness_bamboo_forest_under_y_min (y min) int -31000
|
||||
everness_bamboo_forest_under_y_min (y min) int -2048
|
||||
|
||||
[*Forsaken Desert]
|
||||
|
||||
|
@ -298,7 +298,7 @@ everness_forsaken_desert_under (Forsaken Desert Under) bool true
|
|||
everness_forsaken_desert_under_y_max (y max) int -256
|
||||
|
||||
# Lower limit for biome.
|
||||
everness_forsaken_desert_under_y_min (y min) int -31000
|
||||
everness_forsaken_desert_under_y_min (y min) int -2048
|
||||
|
||||
[*Baobab Savanna]
|
||||
|
||||
|
@ -358,7 +358,7 @@ everness_forsaken_tundra_under (Forsaken Tundra Under) bool true
|
|||
everness_forsaken_tundra_under_y_max (y max) int -256
|
||||
|
||||
# Lower limit for biome.
|
||||
everness_forsaken_tundra_under_y_min (y min) int -31000
|
||||
everness_forsaken_tundra_under_y_min (y min) int -2048
|
||||
|
||||
[*Mineral Waters]
|
||||
|
||||
|
@ -382,7 +382,7 @@ everness_mineral_waters_under (Mineral Waters) bool false
|
|||
everness_mineral_waters_under_y_max (y max) int -256
|
||||
|
||||
# Lower limit for biome.
|
||||
everness_mineral_waters_under_y_min (y min) int -31000
|
||||
everness_mineral_waters_under_y_min (y min) int -2048
|
||||
|
||||
[Features]
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ end
|
|||
--== EDITABLE OPTIONS ==--
|
||||
|
||||
-- Depth of the nether
|
||||
local nether_middle = -20000
|
||||
local nether_middle = -30000
|
||||
|
||||
-- forest bottom perlin multiplication
|
||||
local f_bottom_scale = 4
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
local default_settings = {
|
||||
trap_players = true,
|
||||
trap_players = false,
|
||||
log_to_chat = false,
|
||||
log_level = 2,
|
||||
overworld_help = true,
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
# hellish effort to go back to their home in the overworld.
|
||||
# It is recommended to disable this setting in creative mode or if damage is
|
||||
# disabled.
|
||||
nether.trap_players (Trap players) bool true
|
||||
nether.trap_players (Trap players) bool false
|
||||
|
||||
# If enabled, show log messages in the chat and not only in debug.txt
|
||||
nether.log_to_chat (Log messages to chat) bool false
|
||||
|
|
34
mods/other_worlds/README.md
Normal file
|
@ -0,0 +1,34 @@
|
|||
Other Worlds
|
||||
===
|
||||
|
||||
Minetest mod which adds asteroid layers.
|
||||
|
||||
Each layer contains:
|
||||
|
||||
1. Asteroids composed of unique materials.
|
||||
2. Decoration (or lack of) for the asteroid surfaces, including plants and glowing crystals.
|
||||
3. A skybox for the layer.
|
||||
|
||||
Default layers are Space and Red Sky, but anyone familiar with editing mods should be able to easily adjust these or create different/ additional layers.
|
||||
|
||||
|
||||
Settings
|
||||
--------
|
||||
|
||||
Settings for this mod can be adjusted in Minetests Settings tab -> All Settings
|
||||
|
||||
See the comments in this file for how to adjust:
|
||||
|
||||
1. The minimum and maximum height of each layer.
|
||||
2. Whether map-generation is currently active for individual layers.
|
||||
3. Whether player gravity changes for each layer (off by default).
|
||||
4. Whether crafting recipes are enabled.
|
||||
5. Set the chance of finding ores in asteroids (default is 27 [0 to 100]).
|
||||
|
||||
Note: It is advised to turn off map-generation after you have generated the required number of asteroids.
|
||||
|
||||
|
||||
Licenses and Attribution
|
||||
-----------------------
|
||||
|
||||
Components of this mod use multiple licenses and were the work of several individuals. Please see license.txt for the full list.
|
311
mods/other_worlds/asteroid_layer_helpers.lua
Normal file
|
@ -0,0 +1,311 @@
|
|||
|
||||
-- submodule
|
||||
|
||||
otherworlds.asteroids = {}
|
||||
|
||||
-- Approximate realm limits
|
||||
|
||||
local XMIN = -33000
|
||||
local XMAX = 33000
|
||||
local ZMIN = -33000
|
||||
local ZMAX = 33000
|
||||
|
||||
local ASCOT = 1.0 -- Large asteroid / comet nucleus noise threshold
|
||||
local SASCOT = 1.0 -- Small asteroid / comet nucleus noise threshold
|
||||
local STOT = 0.125 -- Asteroid stone threshold
|
||||
local COBT = 0.05 -- Asteroid cobble threshold
|
||||
local GRAT = 0.02 -- Asteroid gravel threshold
|
||||
local ICET = 0.05 -- Comet ice threshold
|
||||
local ATMOT = -0.2 -- Comet atmosphere threshold
|
||||
local FISTS = 0.01 -- Fissure noise threshold at surface. Controls size of fissures and amount / size of fissure entrances
|
||||
local FISEXP = 0.3 -- Fissure expansion rate under surface
|
||||
local ORECHA = otherworlds.settings.ore_chance.value -- Ore 1/x chance per stone node
|
||||
local CPCHU = 0 -- Maximum craters per chunk
|
||||
local CRMIN = 5 -- Crater radius minimum, radius includes dust and obsidian layers
|
||||
local CRRAN = 8 -- Crater radius range
|
||||
|
||||
local random = math.random
|
||||
local floor = math.floor
|
||||
local abs = math.abs
|
||||
|
||||
|
||||
-- Note: for fewer large objects: increase the 'spread' numbers in 'np_large' noise parameters. For fewer small objects do the same in 'np_small'. Then tune size with 'ASCOT'
|
||||
|
||||
local np_large = { -- 3D Perlin noise 1 for large structures
|
||||
offset = 0,
|
||||
scale = 1,
|
||||
spread = {x = 256, y = 128, z = 256},
|
||||
seed = -83928935,
|
||||
octaves = 5,
|
||||
persist = 0.6}
|
||||
|
||||
local np_fissure = { -- 3D Perlin noise 3 for fissures
|
||||
offset = 0,
|
||||
scale = 1,
|
||||
spread = {x = 64, y = 64, z = 64},
|
||||
seed = -188881,
|
||||
octaves = 4,
|
||||
persist = 0.5}
|
||||
|
||||
local np_small = { -- 3D Perlin noise 4 for small structures
|
||||
offset = 0,
|
||||
scale = 1,
|
||||
spread = {x = 128, y = 64, z = 128},
|
||||
seed = 1000760700090,
|
||||
octaves = 4,
|
||||
persist = 0.6}
|
||||
|
||||
local np_ores = { -- 3D Perlin noise 5 for ore selection
|
||||
offset = 0,
|
||||
scale = 1,
|
||||
spread = {x = 128, y = 128, z = 128},
|
||||
seed = -70242,
|
||||
octaves = 1,
|
||||
persist = 0.5}
|
||||
|
||||
local np_latmos = { -- 3D Perlin noise 6 for comet atmosphere
|
||||
offset = 0,
|
||||
scale = 1,
|
||||
spread = {x = 256, y = 128, z = 256},
|
||||
seed = -83928935,
|
||||
octaves = 3,
|
||||
persist = 0.6}
|
||||
|
||||
local np_satmos = { -- 3D Perlin noise 7 for small comet atmosphere
|
||||
offset = 0,
|
||||
scale = 1,
|
||||
spread = {x = 128, y = 64, z = 128},
|
||||
seed = 1000760700090,
|
||||
octaves = 2,
|
||||
persist = 0.6}
|
||||
|
||||
-- On dignode function. Atmosphere flows into a dug hole.
|
||||
|
||||
core.register_on_dignode(function(pos, oldnode, digger)
|
||||
|
||||
if core.find_node_near(pos, 1, {"asteroid:atmos"})
|
||||
and core.get_node(pos).name == "air" then
|
||||
core.set_node(pos, {name = "asteroid:atmos"})
|
||||
end
|
||||
end)
|
||||
|
||||
-- Generate on_generated function based on parameters
|
||||
|
||||
function otherworlds.asteroids.create_on_generated(YMIN, YMAX, content_ids)
|
||||
|
||||
local c_air = content_ids.c_air
|
||||
local c_stone = content_ids.c_stone
|
||||
local c_cobble = content_ids.c_cobble
|
||||
local c_gravel = content_ids.c_gravel
|
||||
local c_dust = content_ids.c_dust
|
||||
local c_ironore = content_ids.c_ironore
|
||||
local c_copperore = content_ids.c_copperore
|
||||
local c_goldore = content_ids.c_goldore
|
||||
local c_diamondore = content_ids.c_diamondore
|
||||
local c_meseore = content_ids.c_meseore
|
||||
local c_waterice = content_ids.c_waterice
|
||||
local c_atmos = content_ids.c_atmos
|
||||
local c_snowblock = content_ids.c_snowblock
|
||||
local c_obsidian = content_ids.c_obsidian
|
||||
|
||||
-- return the function closed over the upvalues we want
|
||||
return function(minp, maxp, seed)
|
||||
|
||||
if minp.x < XMIN or maxp.x > XMAX
|
||||
or minp.y < YMIN or maxp.y > YMAX
|
||||
or minp.z < ZMIN or maxp.z > ZMAX then
|
||||
return
|
||||
end
|
||||
|
||||
local x0, y0, z0 = minp.x, minp.y, minp.z
|
||||
local x1, y1, z1 = maxp.x, maxp.y, maxp.z
|
||||
|
||||
-- local t1 = os.clock()
|
||||
--print ("[asteroid] chunk ("..x0.." "..y0.." "..z0..")")
|
||||
|
||||
local sidelen = x1 - x0 + 1 -- chunk side length
|
||||
local chulens = {x = sidelen, y = sidelen, z = sidelen}
|
||||
local minpos = {x = x0, y = y0, z = z0}
|
||||
|
||||
local vm, emin, emax = core.get_mapgen_object("voxelmanip")
|
||||
local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax}
|
||||
local data = vm:get_data()
|
||||
|
||||
local nvals1 = core.get_perlin_map(np_large, chulens):get_3d_map_flat(minpos)
|
||||
local nvals3 = core.get_perlin_map(np_fissure, chulens):get_3d_map_flat(minpos)
|
||||
local nvals4 = core.get_perlin_map(np_small, chulens):get_3d_map_flat(minpos)
|
||||
local nvals5 = core.get_perlin_map(np_ores, chulens):get_3d_map_flat(minpos)
|
||||
local nvals6 = core.get_perlin_map(np_latmos, chulens):get_3d_map_flat(minpos)
|
||||
local nvals7 = core.get_perlin_map(np_satmos, chulens):get_3d_map_flat(minpos)
|
||||
|
||||
local ni = 1
|
||||
local noise1abs, noise4abs, comet, noise1dep, noise4dep, vi
|
||||
|
||||
for z = z0, z1 do -- for each vertical plane do
|
||||
for y = y0, y1 do -- for each horizontal row do
|
||||
|
||||
vi = area:index(x0, y, z) -- LVM index for first node in x row
|
||||
|
||||
for x = x0, x1 do -- for each node do
|
||||
|
||||
noise1abs = abs(nvals1[ni])
|
||||
noise4abs = abs(nvals4[ni])
|
||||
comet = false
|
||||
|
||||
-- comet biome
|
||||
if nvals6[ni] < -(ASCOT + ATMOT)
|
||||
or (nvals7[ni] < -(SASCOT + ATMOT) and nvals1[ni] < ASCOT) then
|
||||
comet = true
|
||||
end
|
||||
|
||||
-- if below surface
|
||||
if noise1abs > ASCOT or noise4abs > SASCOT then
|
||||
|
||||
-- noise1dep zero at surface, positive beneath
|
||||
noise1dep = noise1abs - ASCOT
|
||||
|
||||
-- if no fissure
|
||||
if abs(nvals3[ni]) > FISTS + noise1dep * FISEXP then
|
||||
|
||||
-- noise4dep zero at surface, positive beneath
|
||||
noise4dep = noise4abs - SASCOT
|
||||
|
||||
if not comet
|
||||
or (comet and (noise1dep > random() + ICET
|
||||
or noise4dep > random() + ICET)) then
|
||||
|
||||
-- asteroid or asteroid materials in comet
|
||||
if noise1dep >= STOT or noise4dep >= STOT then
|
||||
|
||||
-- stone/ores
|
||||
if random(ORECHA) == 1 then
|
||||
|
||||
if nvals5[ni] > 0.6 then
|
||||
data[vi] = c_goldore
|
||||
elseif nvals5[ni] < -0.6 then
|
||||
data[vi] = c_diamondore
|
||||
elseif nvals5[ni] > 0.2 then
|
||||
data[vi] = c_meseore
|
||||
elseif nvals5[ni] < -0.2 then
|
||||
data[vi] = c_copperore
|
||||
else
|
||||
data[vi] = c_ironore
|
||||
end
|
||||
else
|
||||
data[vi] = c_stone
|
||||
end
|
||||
|
||||
elseif noise1dep >= COBT or noise4dep >= COBT then
|
||||
data[vi] = c_cobble
|
||||
elseif noise1dep >= GRAT or noise4dep >= GRAT then
|
||||
data[vi] = c_gravel
|
||||
else
|
||||
data[vi] = c_dust
|
||||
end
|
||||
else -- comet materials
|
||||
if noise1dep >= ICET or noise4dep >= ICET then
|
||||
data[vi] = c_waterice
|
||||
else
|
||||
data[vi] = c_snowblock
|
||||
end
|
||||
end
|
||||
|
||||
elseif comet then -- fissures, if comet then add atmosphere
|
||||
data[vi] = c_atmos
|
||||
end
|
||||
|
||||
elseif comet then -- if comet atmosphere then
|
||||
data[vi] = c_atmos
|
||||
end
|
||||
|
||||
ni = ni + 1
|
||||
vi = vi + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local cr, cx, cz, comet, surfy, vi, nr, nodeid
|
||||
|
||||
-- craters
|
||||
for ci = 1, CPCHU do -- iterate
|
||||
|
||||
-- exponential radius
|
||||
cr = CRMIN + floor(random() ^ 2 * CRRAN)
|
||||
cx = random(minp.x + cr, maxp.x - cr) -- centre x
|
||||
cz = random(minp.z + cr, maxp.z - cr) -- centre z
|
||||
comet = false
|
||||
surfy = false
|
||||
|
||||
for y = y1, y0 + cr, -1 do
|
||||
|
||||
vi = area:index(cx, y, cz) -- LVM index for node
|
||||
nodeid = data[vi]
|
||||
|
||||
if nodeid == c_dust or nodeid == c_gravel or nodeid == c_cobble then
|
||||
surfy = y
|
||||
break
|
||||
|
||||
elseif nodename == c_snowblock or nodename == c_waterice then
|
||||
comet = true
|
||||
surfy = y
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
-- if surface found and 8 node space above impact node then
|
||||
if surfy and y1 - surfy > 8 then
|
||||
|
||||
for x = cx - cr, cx + cr do -- for each plane do
|
||||
for z = cz - cr, cz + cr do -- for each column do
|
||||
for y = surfy - cr, surfy + cr do -- for each node do
|
||||
|
||||
-- LVM index for node
|
||||
vi = area:index(x, y, z)
|
||||
nr = ((x - cx) ^ 2 + (y - surfy) ^ 2 + (z - cz) ^ 2) ^ 0.5
|
||||
|
||||
if nr <= cr - 2 then
|
||||
|
||||
if comet then
|
||||
data[vi] = c_atmos
|
||||
else
|
||||
data[vi] = c_air
|
||||
end
|
||||
|
||||
elseif nr <= cr - 1 then
|
||||
|
||||
nodeid = data[vi]
|
||||
|
||||
if nodeid == c_gravel or nodeid == c_cobble
|
||||
or nodeid == c_stone or nodeid == c_diamondore
|
||||
or nodeid == c_goldore or nodeid == c_meseore
|
||||
or nodeid == c_copperore or nodeid == c_ironore then
|
||||
data[vi] = c_dust
|
||||
end
|
||||
|
||||
elseif nr <= cr then
|
||||
|
||||
nodeid = data[vi]
|
||||
|
||||
if nodeid == c_cobble or nodeid == c_stone then
|
||||
data[vi] = c_obsidian -- obsidian buried under dust
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
vm:set_data(data)
|
||||
vm:set_lighting({day = 0, night = 0})
|
||||
vm:calc_lighting()
|
||||
vm:write_to_map(data)
|
||||
|
||||
data = nil ; collectgarbage("collect") -- clear mem
|
||||
--[[
|
||||
local chugent = math.ceil((os.clock() - t1) * 1000)
|
||||
print ("[asteroid] time "..chugent.." ms / used mem:"
|
||||
.. collectgarbage("count") / 1024 .. " MiB")
|
||||
]]--
|
||||
end
|
||||
end
|
47
mods/other_worlds/crafting.lua
Normal file
|
@ -0,0 +1,47 @@
|
|||
|
||||
-- register craft recipes when enabled
|
||||
|
||||
if otherworlds.settings.crafting.enable then
|
||||
|
||||
core.register_craft({
|
||||
output = "asteroid:cobble",
|
||||
recipe = {{"asteroid:stone"}}
|
||||
})
|
||||
|
||||
core.register_craft({
|
||||
output = "asteroid:gravel",
|
||||
recipe = {{"asteroid:cobble"}}
|
||||
})
|
||||
|
||||
core.register_craft({
|
||||
output = "asteroid:dust",
|
||||
recipe = {{"asteroid:gravel"}}
|
||||
})
|
||||
|
||||
core.register_craft({
|
||||
type = "cooking",
|
||||
output = "asteroid:stone",
|
||||
recipe = "asteroid:cobble"
|
||||
})
|
||||
|
||||
core.register_craft({
|
||||
output = "asteroid:redcobble",
|
||||
recipe = {{"asteroid:redstone"}}
|
||||
})
|
||||
|
||||
core.register_craft({
|
||||
output = "asteroid:redgravel",
|
||||
recipe = {{"asteroid:redcobble"}}
|
||||
})
|
||||
|
||||
core.register_craft({
|
||||
output = "asteroid:reddust",
|
||||
recipe = {{"asteroid:redgravel"}}
|
||||
})
|
||||
|
||||
core.register_craft({
|
||||
type = "cooking",
|
||||
output = "asteroid:redstone",
|
||||
recipe = "asteroid:redcobble"
|
||||
})
|
||||
end
|
26
mods/other_worlds/init.lua
Normal file
|
@ -0,0 +1,26 @@
|
|||
|
||||
-- global, mod path and load mod sections
|
||||
|
||||
otherworlds = {}
|
||||
|
||||
local modpath = core.get_modpath("other_worlds") .. "/"
|
||||
|
||||
dofile(modpath .. "settings.lua")
|
||||
dofile(modpath .. "nodes.lua")
|
||||
dofile(modpath .. "crafting.lua")
|
||||
dofile(modpath .. "skybox.lua")
|
||||
|
||||
-- required helpers for mapgen options below
|
||||
|
||||
dofile(modpath .. "asteroid_layer_helpers.lua")
|
||||
|
||||
if otherworlds.settings.space_asteroids.enable then
|
||||
dofile(modpath .. "space_asteroids.lua")
|
||||
end
|
||||
|
||||
if otherworlds.settings.redsky_asteroids.enable then
|
||||
dofile(modpath .. "redsky_asteroids.lua")
|
||||
end
|
||||
|
||||
|
||||
print("[MOD] Other Worlds loaded")
|
38
mods/other_worlds/license.txt
Normal file
|
@ -0,0 +1,38 @@
|
|||
|
||||
|
||||
Original asteroids code:
|
||||
License: MIT (https://opensource.org/licenses/MIT)
|
||||
By paramat (available from https://github.com/paramat/asteroid)
|
||||
|
||||
Original asteroid_ textures:
|
||||
License: CC BY-SA 3.0 (https://creativecommons.org/licenses/by/3.0/)
|
||||
Attribution: paramat
|
||||
|
||||
Crystal models:
|
||||
License: MIT (https://opensource.org/licenses/MIT)
|
||||
By Electra Gizen
|
||||
|
||||
Skybox texture:
|
||||
License: CC BY-SA 3.0 (https://creativecommons.org/licenses/by/3.0/)
|
||||
Attribution: Ulukai (available from http://opengameart.org/content/ulukais-space-skyboxes)
|
||||
|
||||
---
|
||||
|
||||
Recoloured textures from various mods:
|
||||
Grass textures based on default mod in minetest_game (WTFPL).
|
||||
Redgrass texture based on junglegrass texture in default mod in minetest_game (assumed to be CC BY-SA 3.0).
|
||||
Red versions of asteroid textures (CC BY-SA 3.0).
|
||||
|
||||
---
|
||||
|
||||
Textures created for this mod:
|
||||
CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0/)
|
||||
Attribution: Shara RedCat
|
||||
|
||||
All original code and edits to code for this mod:
|
||||
License: MIT (https://opensource.org/licenses/MIT)
|
||||
By Shara RedCat, tenplus1 and Mewmon
|
||||
|
||||
---
|
||||
|
||||
Thanks also to DonBatman for help with the initial idea, and to the players of Red Cat Creative who gave ideas and helped in testing.
|
8
mods/other_worlds/mod.conf
Normal file
|
@ -0,0 +1,8 @@
|
|||
name = other_worlds
|
||||
description = Adds asteroid layers and height-based skybox switches to create space environments.
|
||||
depends = default
|
||||
optional_depends = pova, nether
|
||||
min_minetest_version = 5.0
|
||||
release = 30955
|
||||
author = TenPlus1
|
||||
title = Other Worlds
|
228
mods/other_worlds/models/crystal_shape01.obj
Normal file
|
@ -0,0 +1,228 @@
|
|||
# Blender v2.77 (sub 0) OBJ File: ''
|
||||
# www.blender.org
|
||||
mtllib crystal_shape01.mtl
|
||||
o Crystal_Taya1.001
|
||||
v 0.019427 0.022291 -0.013603
|
||||
v 0.012823 0.031159 -0.009449
|
||||
v 0.013985 0.030045 -0.009115
|
||||
v 0.008443 0.038346 -0.005912
|
||||
v 0.000000 0.050687 0.000000
|
||||
v -0.015208 0.018939 -0.021719
|
||||
v 0.020909 0.009672 -0.020909
|
||||
v 0.021719 0.018939 -0.015208
|
||||
v -0.016684 -0.038612 -0.014735
|
||||
v -0.017468 -0.029657 -0.017468
|
||||
v -0.015357 -0.037747 -0.016760
|
||||
v -0.015748 -0.040752 -0.016497
|
||||
v -0.015913 -0.047431 -0.015913
|
||||
v -0.017109 -0.033753 0.015516
|
||||
v -0.018018 -0.023370 0.018018
|
||||
v -0.018512 -0.017718 0.018512
|
||||
v -0.016177 -0.044411 0.016177
|
||||
v -0.015748 -0.049313 0.015748
|
||||
v -0.015748 -0.049313 -0.015748
|
||||
v -0.019675 -0.004427 0.016381
|
||||
v -0.020909 0.009672 -0.020909
|
||||
v -0.020741 0.007752 0.020741
|
||||
v -0.021719 0.018939 0.015208
|
||||
v -0.020909 0.009672 0.020909
|
||||
v -0.018512 -0.003302 0.019773
|
||||
v 0.020560 0.005685 0.020560
|
||||
v 0.015208 0.018939 0.021719
|
||||
v 0.017174 -0.008451 0.019323
|
||||
v 0.018163 -0.021714 0.018163
|
||||
v -0.016177 -0.030600 0.017385
|
||||
v 0.015748 -0.049313 0.015748
|
||||
v 0.020909 0.009672 0.020909
|
||||
v 0.019672 -0.004460 0.017730
|
||||
v 0.020488 0.004867 -0.020488
|
||||
v 0.019075 -0.011285 -0.016746
|
||||
v 0.016094 -0.045364 -0.016094
|
||||
v 0.015748 -0.049313 -0.015748
|
||||
v 0.017187 -0.010187 -0.019171
|
||||
vt 0.0000 0.0000
|
||||
vt -0.0148 0.1172
|
||||
vt -0.0221 0.1025
|
||||
vt 0.0000 0.0000
|
||||
vt -0.0100 0.0907
|
||||
vt -0.0085 -0.0141
|
||||
vt -0.0000 0.0000
|
||||
vt -0.0729 -0.1433
|
||||
vt 0.1875 -0.3687
|
||||
vt -0.1099 -0.2268
|
||||
vt -0.1696 -0.4763
|
||||
vt -0.1677 -0.3298
|
||||
vt -0.1875 -0.3687
|
||||
vt 0.0165 -0.0925
|
||||
vt -0.0000 0.0000
|
||||
vt -0.0076 -0.0836
|
||||
vt -0.0199 -0.0214
|
||||
vt -0.0000 0.0000
|
||||
vt -0.0242 0.0087
|
||||
vt -0.0140 -0.0882
|
||||
vt -0.0200 -0.0214
|
||||
vt -0.3048 0.1074
|
||||
vt -0.0023 0.1562
|
||||
vt -0.3322 0.1973
|
||||
vt 0.0227 0.2604
|
||||
vt 0.0276 0.3172
|
||||
vt 0.0043 0.0492
|
||||
vt -0.3166 0.0189
|
||||
vt 0.0000 0.0000
|
||||
vt -0.3150 0.0000
|
||||
vt 0.0063 0.4506
|
||||
vt -0.3666 0.5921
|
||||
vt 0.0499 0.5728
|
||||
vt -0.0054 0.6851
|
||||
vt 0.0516 0.5921
|
||||
vt -0.0003 -0.1132
|
||||
vt -0.0000 0.0000
|
||||
vt -0.0360 -0.1247
|
||||
vt -0.0119 -0.1442
|
||||
vt -0.0000 0.0000
|
||||
vt -0.0359 -0.0113
|
||||
vt -0.3426 0.4619
|
||||
vt 0.0481 0.5521
|
||||
vt -0.3649 0.5728
|
||||
vt -0.0054 0.6851
|
||||
vt -0.3666 0.5921
|
||||
vt 0.0143 0.4102
|
||||
vt -0.3426 0.3172
|
||||
vt 0.0241 0.2770
|
||||
vt -0.3377 0.2604
|
||||
vt -0.3192 0.1878
|
||||
vt 0.0000 0.0000
|
||||
vt -0.3192 0.0492
|
||||
vt -0.3150 0.0000
|
||||
vt 0.0516 0.5921
|
||||
vt 0.0093 -0.0743
|
||||
vt -0.0000 0.0000
|
||||
vt -0.0102 -0.1067
|
||||
vt -0.0104 -0.1382
|
||||
vt -0.0000 0.0000
|
||||
vt -0.0208 -0.0316
|
||||
vt 0.0000 0.0000
|
||||
vt 0.0149 0.1726
|
||||
vt -0.0147 0.1327
|
||||
vt 0.0000 0.0000
|
||||
vt -0.0166 0.1044
|
||||
vt -0.0280 -0.0411
|
||||
vt -0.3348 0.4502
|
||||
vt 0.0474 0.5439
|
||||
vt -0.3631 0.5521
|
||||
vt -0.0054 0.6851
|
||||
vt -0.3666 0.5921
|
||||
vt 0.0100 0.3817
|
||||
vt -0.3391 0.2770
|
||||
vt 0.0035 0.0396
|
||||
vt -0.3150 0.0000
|
||||
vt 0.0000 0.0000
|
||||
vt 0.0516 0.5921
|
||||
vt 0.0000 0.0000
|
||||
vt 0.0168 0.3529
|
||||
vt -0.0139 0.3419
|
||||
vt 0.0000 0.0000
|
||||
vt -0.0126 0.1542
|
||||
vt -0.0306 -0.0113
|
||||
vt 0.0000 0.0859
|
||||
vt -0.0039 0.1161
|
||||
vt -0.3184 0.0396
|
||||
vt 0.0172 0.1973
|
||||
vt -0.3293 0.3928
|
||||
vt 0.0516 0.5921
|
||||
vt -0.3624 0.5439
|
||||
vt -0.0054 0.6851
|
||||
vt -0.3666 0.5921
|
||||
vt 0.0016 0.0189
|
||||
vt -0.3150 0.0000
|
||||
vt 0.0000 0.0000
|
||||
vt -0.1696 -0.4763
|
||||
vt 0.1875 -0.3687
|
||||
vt -0.1875 -0.3687
|
||||
vt -0.1696 -0.4763
|
||||
vt 0.1875 -0.3687
|
||||
vt -0.1875 -0.3687
|
||||
vt 0.0729 -0.1433
|
||||
vt -0.1875 -0.3687
|
||||
vt 0.1141 -0.2397
|
||||
vt -0.1696 -0.4763
|
||||
vt 0.1677 -0.3298
|
||||
vt 0.1875 -0.3687
|
||||
vt 0.1575 0.1575
|
||||
vt -0.1575 0.1575
|
||||
vt 0.1575 -0.1575
|
||||
vt -0.1575 -0.1575
|
||||
usemtl wire_191191191.001
|
||||
s 1
|
||||
f 1/1 2/2 3/3
|
||||
f 2/4 4/5 3/6
|
||||
f 5/7 4/8 6/9
|
||||
f 6/9 4/8 2/10
|
||||
f 6/9 2/10 7/11
|
||||
f 7/11 2/10 1/12
|
||||
f 7/11 1/12 8/13
|
||||
f 9/14 10/15 11/16
|
||||
f 12/17 9/18 11/19
|
||||
f 13/20 9/18 12/21
|
||||
f 9/22 14/23 10/24
|
||||
f 10/24 14/23 15/25
|
||||
f 10/24 15/25 16/26
|
||||
f 14/23 9/22 17/27
|
||||
f 17/27 9/22 13/28
|
||||
f 17/27 13/28 18/29
|
||||
f 18/29 13/28 19/30
|
||||
f 16/26 20/31 10/24
|
||||
f 10/24 20/31 21/32
|
||||
f 21/32 20/31 22/33
|
||||
f 21/32 22/33 23/34
|
||||
f 23/34 22/33 24/35
|
||||
f 25/36 22/37 20/38
|
||||
f 16/39 25/40 20/41
|
||||
f 25/42 26/43 22/44
|
||||
f 22/44 26/43 27/45
|
||||
f 22/44 27/45 24/46
|
||||
f 26/43 25/42 28/47
|
||||
f 28/47 25/42 16/48
|
||||
f 28/47 16/48 29/49
|
||||
f 29/49 16/48 15/50
|
||||
f 29/49 15/50 30/51
|
||||
f 29/49 30/51 31/52
|
||||
f 31/52 30/51 17/53
|
||||
f 31/52 17/53 18/54
|
||||
f 26/43 32/55 27/45
|
||||
f 30/56 15/57 14/58
|
||||
f 17/59 30/60 14/61
|
||||
f 29/62 33/63 28/64
|
||||
f 33/65 26/66 28/67
|
||||
f 33/68 34/69 26/70
|
||||
f 26/70 34/69 8/71
|
||||
f 26/70 8/71 32/72
|
||||
f 34/69 33/68 35/73
|
||||
f 35/73 33/68 29/74
|
||||
f 35/73 29/74 36/75
|
||||
f 36/75 29/74 31/76
|
||||
f 36/75 31/76 37/77
|
||||
f 34/69 7/78 8/71
|
||||
f 36/79 38/80 35/81
|
||||
f 38/82 34/83 35/84
|
||||
f 12/85 11/86 36/87
|
||||
f 36/87 11/86 10/88
|
||||
f 36/87 10/88 38/89
|
||||
f 38/89 10/88 21/90
|
||||
f 38/89 21/90 34/91
|
||||
f 34/91 21/90 6/92
|
||||
f 34/91 6/92 7/93
|
||||
f 12/85 36/87 13/94
|
||||
f 13/94 36/87 37/95
|
||||
f 13/94 37/95 19/96
|
||||
f 21/97 23/98 6/99
|
||||
f 6/99 23/98 5/7
|
||||
f 24/100 27/101 23/102
|
||||
f 23/102 27/101 5/7
|
||||
f 4/103 27/104 3/105
|
||||
f 3/105 27/104 32/106
|
||||
f 3/105 32/106 1/107
|
||||
f 1/107 32/106 8/108
|
||||
f 4/103 5/7 27/104
|
||||
f 31/109 18/110 37/111
|
||||
f 37/111 18/110 19/112
|
198
mods/other_worlds/models/crystal_shape02.obj
Normal file
|
@ -0,0 +1,198 @@
|
|||
# Blender v2.77 (sub 0) OBJ File: ''
|
||||
# www.blender.org
|
||||
mtllib crystal_shape02.mtl
|
||||
o Crystal_Taya2.000
|
||||
v 0.006739 0.025244 0.012075
|
||||
v 0.001956 0.043504 0.004196
|
||||
v 0.004129 0.024144 0.013098
|
||||
v 0.011672 0.002214 0.025031
|
||||
v 0.000000 0.051819 0.000000
|
||||
v 0.026389 -0.000477 -0.012306
|
||||
v 0.023148 -0.023541 0.023148
|
||||
v 0.012306 -0.000477 0.026389
|
||||
v 0.023266 -0.013100 -0.018731
|
||||
v 0.024664 -0.012754 -0.016476
|
||||
v 0.023359 -0.022037 -0.022441
|
||||
v -0.006315 0.024980 -0.013543
|
||||
v -0.008197 0.010863 -0.020143
|
||||
v 0.023148 -0.023541 -0.023148
|
||||
v -0.011933 0.001106 -0.025590
|
||||
v -0.012306 -0.000477 -0.026389
|
||||
v -0.010407 0.010810 -0.018614
|
||||
v -0.018415 0.015325 0.008587
|
||||
v -0.009799 0.031187 0.003172
|
||||
v -0.001187 0.049467 0.000554
|
||||
v -0.023148 -0.023541 -0.023148
|
||||
v -0.026389 -0.000477 0.012306
|
||||
v -0.009284 0.030199 0.005679
|
||||
v -0.023148 -0.023541 0.023148
|
||||
v -0.019685 -0.048181 -0.019685
|
||||
v 0.019685 -0.048181 -0.019685
|
||||
v 0.019685 -0.048181 0.019685
|
||||
v -0.019685 -0.048181 0.019685
|
||||
vt 0.0323 -0.2020
|
||||
vt -0.0000 0.0000
|
||||
vt 0.0048 -0.2141
|
||||
vt 0.0306 -0.2671
|
||||
vt -0.0000 0.0000
|
||||
vt -0.0273 -0.0128
|
||||
vt 0.0000 0.0000
|
||||
vt -0.0327 -0.0894
|
||||
vt 0.2059 -0.5620
|
||||
vt -0.0904 -0.2856
|
||||
vt -0.1383 -0.8099
|
||||
vt -0.1953 -0.5331
|
||||
vt -0.2059 -0.5620
|
||||
vt 0.0710 -0.1265
|
||||
vt -0.0000 0.0000
|
||||
vt 0.0445 -0.1230
|
||||
vt 0.0304 -0.0919
|
||||
vt -0.0000 0.0000
|
||||
vt -0.0265 0.0036
|
||||
vt -0.2059 -0.5620
|
||||
vt 0.1057 -0.2884
|
||||
vt -0.1546 -0.6977
|
||||
vt 0.1459 -0.4402
|
||||
vt -0.1383 -0.8099
|
||||
vt 0.1997 -0.5450
|
||||
vt 0.2059 -0.5620
|
||||
vt -0.1428 -0.7937
|
||||
vt 0.0000 0.0000
|
||||
vt 0.0280 0.1172
|
||||
vt 0.0012 0.1178
|
||||
vt 0.0000 0.0000
|
||||
vt -0.0042 0.1559
|
||||
vt -0.0269 0.0006
|
||||
vt -0.1393 -0.4407
|
||||
vt 0.1437 -0.3922
|
||||
vt -0.1057 -0.2884
|
||||
vt 0.0633 -0.2217
|
||||
vt 0.0093 -0.0253
|
||||
vt -0.1383 -0.8099
|
||||
vt -0.1997 -0.5450
|
||||
vt -0.2059 -0.5620
|
||||
vt 0.2059 -0.5620
|
||||
vt 0.0000 0.0000
|
||||
vt 0.0137 0.1764
|
||||
vt -0.0111 0.1881
|
||||
vt 0.0000 0.0000
|
||||
vt -0.0163 0.2146
|
||||
vt -0.0251 0.0110
|
||||
vt 0.0327 -0.0894
|
||||
vt -0.0678 -0.2324
|
||||
vt 0.0836 -0.2974
|
||||
vt -0.1437 -0.3922
|
||||
vt -0.1383 -0.8099
|
||||
vt -0.2059 -0.5620
|
||||
vt -0.0093 -0.0253
|
||||
vt 0.2059 -0.5620
|
||||
vt 0.1953 -0.5331
|
||||
vt -0.0738 0.4817
|
||||
vt -0.4283 0.2488
|
||||
vt 0.0346 0.2488
|
||||
vt 0.0000 0.0000
|
||||
vt -0.3937 0.0000
|
||||
vt -0.0738 0.4817
|
||||
vt -0.4283 0.2488
|
||||
vt -0.0321 0.3577
|
||||
vt 0.0276 0.2640
|
||||
vt 0.0346 0.2488
|
||||
vt 0.0000 0.0000
|
||||
vt -0.3937 0.0000
|
||||
vt -0.0738 0.4817
|
||||
vt -0.4283 0.2488
|
||||
vt 0.0346 0.2488
|
||||
vt 0.0000 0.0000
|
||||
vt -0.3937 0.0000
|
||||
vt -0.0738 0.4817
|
||||
vt -0.4283 0.2488
|
||||
vt 0.0346 0.2488
|
||||
vt 0.0000 0.0000
|
||||
vt -0.3937 0.0000
|
||||
vt 0.1969 0.1969
|
||||
vt -0.1969 0.1969
|
||||
vt 0.1969 -0.1969
|
||||
vt -0.1969 -0.1969
|
||||
vn 0.1681 0.4273 0.8883
|
||||
vn 0.1213 0.5063 0.8538
|
||||
vn 0.8744 0.3663 0.3183
|
||||
vn 0.8744 0.3663 0.3182
|
||||
vn 0.8745 0.3664 0.3178
|
||||
vn 0.8439 0.0624 -0.5328
|
||||
vn 0.8105 0.2318 -0.5380
|
||||
vn 0.3182 0.3663 -0.8744
|
||||
vn 0.3183 0.3663 -0.8744
|
||||
vn 0.3181 0.3663 -0.8744
|
||||
vn -0.4802 0.5605 -0.6747
|
||||
vn -0.5239 0.4171 -0.7427
|
||||
vn -0.8744 0.3663 -0.3182
|
||||
vn -0.8744 0.3663 -0.3183
|
||||
vn -0.8744 0.3663 -0.3181
|
||||
vn -0.7587 0.5377 0.3678
|
||||
vn -0.8295 0.4401 0.3438
|
||||
vn -0.3182 0.3663 0.8744
|
||||
vn -0.3183 0.3663 0.8744
|
||||
vn -0.3181 0.3663 0.8744
|
||||
vn -0.3180 0.3664 0.8744
|
||||
vn -0.3181 0.3664 0.8744
|
||||
vn 0.0000 -0.1392 -0.9903
|
||||
vn 0.9903 -0.1391 0.0000
|
||||
vn 0.9903 -0.1392 0.0000
|
||||
vn 0.9903 -0.1390 -0.0000
|
||||
vn 0.0000 -0.1392 0.9903
|
||||
vn -0.9903 -0.1392 -0.0000
|
||||
vn 0.0000 -1.0000 -0.0000
|
||||
usemtl wire_191191191.000
|
||||
s 1
|
||||
f 1/1/1 2/2/1 3/3/1
|
||||
f 4/4/2 1/5/2 3/6/2
|
||||
f 5/7/3 2/8/3 6/9/4
|
||||
f 6/9/4 2/8/3 1/10/4
|
||||
f 6/9/4 1/10/4 7/11/4
|
||||
f 7/11/4 1/10/4 4/12/4
|
||||
f 7/11/4 4/12/4 8/13/5
|
||||
f 9/14/6 6/15/6 10/16/6
|
||||
f 11/17/7 9/18/7 10/19/7
|
||||
f 5/7/8 6/20/8 12/21/8
|
||||
f 12/21/8 6/20/8 9/22/8
|
||||
f 12/21/8 9/22/8 13/23/8
|
||||
f 13/23/8 9/22/8 14/24/9
|
||||
f 13/23/8 14/24/9 15/25/8
|
||||
f 15/25/8 14/24/9 16/26/8
|
||||
f 9/22/8 11/27/10 14/24/9
|
||||
f 15/28/11 17/29/11 13/30/11
|
||||
f 17/31/12 12/32/12 13/33/12
|
||||
f 17/34/13 18/35/13 12/36/14
|
||||
f 12/36/14 18/35/13 19/37/14
|
||||
f 12/36/14 19/37/14 20/38/13
|
||||
f 18/35/13 17/34/13 21/39/13
|
||||
f 21/39/13 17/34/13 15/40/13
|
||||
f 21/39/13 15/40/13 16/41/15
|
||||
f 21/39/13 22/42/13 18/35/13
|
||||
f 20/38/13 5/7/13 12/36/14
|
||||
f 18/43/16 23/44/16 19/45/16
|
||||
f 23/46/17 20/47/17 19/48/17
|
||||
f 2/49/18 23/50/19 3/51/19
|
||||
f 3/51/19 23/50/19 18/52/18
|
||||
f 3/51/19 18/52/18 24/53/18
|
||||
f 24/53/18 18/52/18 22/54/20
|
||||
f 5/7/21 20/55/22 2/49/18
|
||||
f 2/49/18 20/55/22 23/50/19
|
||||
f 8/56/18 4/57/18 24/53/18
|
||||
f 24/53/18 4/57/18 3/51/19
|
||||
f 16/58/23 14/59/23 21/60/23
|
||||
f 21/60/23 14/59/23 25/61/23
|
||||
f 25/61/23 14/59/23 26/62/23
|
||||
f 6/63/24 7/64/25 10/65/25
|
||||
f 10/65/25 7/64/25 11/66/26
|
||||
f 11/66/26 7/64/25 14/67/24
|
||||
f 14/67/24 7/64/25 26/68/25
|
||||
f 26/68/25 7/64/25 27/69/25
|
||||
f 8/70/27 24/71/27 7/72/27
|
||||
f 7/72/27 24/71/27 27/73/27
|
||||
f 27/73/27 24/71/27 28/74/27
|
||||
f 22/75/28 21/76/28 24/77/28
|
||||
f 24/77/28 21/76/28 28/78/28
|
||||
f 28/78/28 21/76/28 25/79/28
|
||||
f 27/80/29 28/81/29 26/82/29
|
||||
f 26/82/29 28/81/29 25/83/29
|
311
mods/other_worlds/nodes.lua
Normal file
|
@ -0,0 +1,311 @@
|
|||
|
||||
-- Asteroid nodes
|
||||
|
||||
core.register_node(":asteroid:stone", {
|
||||
description = "Asteroid Stone",
|
||||
tiles = {"default_stone.png"},
|
||||
is_ground_content = false,
|
||||
drop = 'asteroid:cobble',
|
||||
groups = {cracky = 3, stone = 1, not_in_creative_inventory = 1},
|
||||
sounds = default.node_sound_stone_defaults()
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:redstone", {
|
||||
description = "Asteroid Stone",
|
||||
tiles = {"asteroid_redstone.png"},
|
||||
is_ground_content = false,
|
||||
drop = 'asteroid:redcobble',
|
||||
groups = {cracky = 3, stone = 1},
|
||||
sounds = default.node_sound_stone_defaults()
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:cobble", {
|
||||
description = "Asteroid Cobble",
|
||||
tiles = {"asteroid_cobble.png"},
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3, stone = 2},
|
||||
sounds = default.node_sound_stone_defaults()
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:redcobble", {
|
||||
description = "Asteroid Cobble",
|
||||
tiles = {"asteroid_redcobble.png"},
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3, stone = 2},
|
||||
sounds = default.node_sound_stone_defaults()
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:gravel", {
|
||||
description = "Asteroid Gravel",
|
||||
tiles = {"asteroid_gravel.png"},
|
||||
is_ground_content = false,
|
||||
groups = {crumbly = 2},
|
||||
sounds = default.node_sound_dirt_defaults({
|
||||
footstep = {name = "default_gravel_footstep", gain = 0.2}
|
||||
})
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:redgravel", {
|
||||
description = "Asteroid Gravel",
|
||||
tiles = {"asteroid_redgravel.png"},
|
||||
is_ground_content = false,
|
||||
groups = {crumbly = 2},
|
||||
sounds = default.node_sound_dirt_defaults({
|
||||
footstep = {name = "default_gravel_footstep", gain = 0.2}
|
||||
})
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:dust", {
|
||||
description = "Asteroid Dust",
|
||||
tiles = {"asteroid_dust.png"},
|
||||
is_ground_content = false,
|
||||
groups = {crumbly = 3},
|
||||
sounds = default.node_sound_dirt_defaults({
|
||||
footstep = {name = "default_gravel_footstep", gain = 0.1}
|
||||
})
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:reddust", {
|
||||
description = "Asteroid Dust",
|
||||
tiles = {"asteroid_reddust.png"},
|
||||
is_ground_content = false,
|
||||
groups = {crumbly = 3},
|
||||
sounds = default.node_sound_dirt_defaults({
|
||||
footstep = {name = "default_gravel_footstep", gain = 0.1}
|
||||
})
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:ironore", {
|
||||
description = "Asteroid Iron Ore",
|
||||
tiles = {"asteroid_redstone.png^default_mineral_iron.png"},
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 2},
|
||||
drop = "default:iron_lump",
|
||||
sounds = default.node_sound_stone_defaults()
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:copperore", {
|
||||
description = "Asteroid Copper Ore",
|
||||
tiles = {"asteroid_redstone.png^default_mineral_copper.png"},
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 2},
|
||||
drop = "default:copper_lump",
|
||||
sounds = default.node_sound_stone_defaults()
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:goldore", {
|
||||
description = "Asteroid Gold Ore",
|
||||
tiles = {"asteroid_redstone.png^default_mineral_gold.png"},
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 2},
|
||||
drop = "default:gold_lump",
|
||||
sounds = default.node_sound_stone_defaults()
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:diamondore", {
|
||||
description = "Asteroid Diamond Ore",
|
||||
tiles = {"asteroid_redstone.png^default_mineral_diamond.png"},
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 1},
|
||||
drop = "default:diamond",
|
||||
sounds = default.node_sound_stone_defaults()
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:meseore", {
|
||||
description = "Asteroid Mese Ore",
|
||||
tiles = {"asteroid_redstone.png^default_mineral_mese.png"},
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 1},
|
||||
drop = "default:mese_crystal",
|
||||
sounds = default.node_sound_stone_defaults()
|
||||
})
|
||||
|
||||
core.register_node(":asteroid:atmos", {
|
||||
description = "Comet Atmosphere",
|
||||
drawtype = "glasslike",
|
||||
tiles = {"asteroid_atmos.png"},
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
pointable = false,
|
||||
diggable = false,
|
||||
buildable_to = true,
|
||||
is_ground_content = false,
|
||||
use_texture_alpha = "blend",
|
||||
post_effect_color = {a = 31, r = 241, g = 248, b = 255},
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
drop = {}
|
||||
})
|
||||
|
||||
-- Redsky plant nodes
|
||||
|
||||
core.register_node(":mars:redgrass", {
|
||||
description = "Red Grass",
|
||||
drawtype = "plantlike",
|
||||
waving = 1,
|
||||
visual_scale = 1.3,
|
||||
tiles = {"mars_redgrass.png"},
|
||||
inventory_image = "mars_redgrass.png",
|
||||
wield_image = "mars_redgrass.png",
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
buildable_to = true,
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}
|
||||
}
|
||||
})
|
||||
|
||||
core.register_node(":mars:redweed", {
|
||||
description = "Red Weed",
|
||||
drawtype = "plantlike",
|
||||
waving = 1,
|
||||
visual_scale = 1.3,
|
||||
tiles = {"mars_redweed.png"},
|
||||
inventory_image = "mars_redweed.png",
|
||||
wield_image = "mars_redweed.png",
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
buildable_to = true,
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}
|
||||
}
|
||||
})
|
||||
|
||||
core.register_node(":mars:moss", {
|
||||
description = "Martian Moss",
|
||||
drawtype = "nodebox",
|
||||
tiles = {"mars_moss.png"},
|
||||
inventory_image = "mars_moss.png",
|
||||
wield_image = "mars_moss.png",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
use_texture_alpha = "clip",
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {-1/2, -1/2, -1/2, 1/2, -15/32, 1/2},
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-1/2, -1/2, -1/2, 1/2, -15/32, 1/2},
|
||||
},
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1},
|
||||
sounds = default.node_sound_leaves_defaults()
|
||||
})
|
||||
|
||||
-- mars grass
|
||||
|
||||
core.register_node(":mars:grass_1", {
|
||||
description = "Martian Grass",
|
||||
drawtype = "plantlike",
|
||||
waving = 1,
|
||||
tiles = {"mars_grass_1.png"},
|
||||
inventory_image = "mars_grass_3.png",
|
||||
wield_image = "mars_grass_3.png",
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
buildable_to = true,
|
||||
groups = {snappy = 3, flora = 1, attached_node = 1},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}
|
||||
},
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
|
||||
-- place a random grass node
|
||||
local stack = ItemStack("mars:grass_" .. math.random(5))
|
||||
local ret = core.item_place(stack, placer, pointed_thing)
|
||||
|
||||
return ItemStack("mars:grass_1 "
|
||||
.. itemstack:get_count() - (1 - ret:get_count()))
|
||||
end
|
||||
})
|
||||
|
||||
for i = 2, 5 do
|
||||
|
||||
core.register_node(":mars:grass_" .. i, {
|
||||
description = "Martian Grass",
|
||||
drawtype = "plantlike",
|
||||
waving = 1,
|
||||
tiles = {"mars_grass_" .. i .. ".png"},
|
||||
inventory_image = "mars_grass_" .. i .. ".png",
|
||||
wield_image = "mars_grass_" .. i .. ".png",
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
walkable = false,
|
||||
buildable_to = true,
|
||||
drop = "mars:grass_1",
|
||||
groups = {
|
||||
snappy = 3, flora = 1, attached_node = 1,
|
||||
not_in_creative_inventory = 1
|
||||
},
|
||||
sounds = default.node_sound_leaves_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
-- Crystals
|
||||
|
||||
local sbox = {
|
||||
type = "fixed",
|
||||
fixed = {-5/16, -8/16, -6/16, 5/16, -1/32, 5/16}}
|
||||
|
||||
local crystal_list = {
|
||||
{"ghost_crystal", "ghost_crystal.png"},
|
||||
{"red_crystal", "red_crystal.png"},
|
||||
{"rose_quartz", "rose_quartz.png"}}
|
||||
|
||||
for i = 1, #crystal_list do -- in ipairs(crystal_list) do
|
||||
|
||||
local name = crystal_list[i][1]
|
||||
local texture = crystal_list[i][2]
|
||||
|
||||
core.register_node(":crystals:" .. name .. "_1", {
|
||||
description = "Glowing Crystal",
|
||||
drawtype = "mesh",
|
||||
mesh = "crystal_shape01.obj",
|
||||
tiles = {"crystals_" .. texture},
|
||||
wield_scale = {x = 7, y = 7, z = 7},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
selection_box = sbox,
|
||||
walkable = false,
|
||||
light_source = 10,
|
||||
use_texture_alpha = "blend",
|
||||
visual_scale = 10,
|
||||
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3},
|
||||
sounds = default.node_sound_glass_defaults()
|
||||
})
|
||||
|
||||
core.register_node(":crystals:" .. name .. "_2", {
|
||||
description = "Glowing Crystal",
|
||||
drawtype = "mesh",
|
||||
mesh = "crystal_shape02.obj",
|
||||
tiles = {"crystals_" .. texture},
|
||||
wield_scale = {x = 7, y = 7, z = 7},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
selection_box = sbox,
|
||||
walkable = false,
|
||||
light_source = 10,
|
||||
use_texture_alpha = "blend",
|
||||
visual_scale = 10,
|
||||
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3},
|
||||
sounds = default.node_sound_glass_defaults()
|
||||
})
|
||||
end
|
72
mods/other_worlds/redsky_asteroids.lua
Normal file
|
@ -0,0 +1,72 @@
|
|||
|
||||
-- Approximate realm limits
|
||||
|
||||
local YMIN = otherworlds.settings.redsky_asteroids.YMIN or 6000
|
||||
local YMAX = otherworlds.settings.redsky_asteroids.YMAX or 7000
|
||||
|
||||
-- Register on_generated function for this layer
|
||||
|
||||
core.register_on_generated(
|
||||
otherworlds.asteroids.create_on_generated(YMIN, YMAX, {
|
||||
|
||||
c_air = core.get_content_id("air"),
|
||||
c_obsidian = core.get_content_id("default:obsidian"),
|
||||
c_stone = core.get_content_id("asteroid:redstone"),
|
||||
c_cobble = core.get_content_id("air"),
|
||||
c_gravel = core.get_content_id("asteroid:redgravel"),
|
||||
c_dust = core.get_content_id("asteroid:reddust"),
|
||||
c_ironore = core.get_content_id("asteroid:ironore"),
|
||||
c_copperore = core.get_content_id("asteroid:copperore"),
|
||||
c_goldore = core.get_content_id("asteroid:goldore"),
|
||||
c_diamondore = core.get_content_id("asteroid:diamondore"),
|
||||
c_meseore = core.get_content_id("asteroid:meseore"),
|
||||
c_waterice = core.get_content_id("default:ice"),
|
||||
c_atmos = core.get_content_id("asteroid:atmos"),
|
||||
c_snowblock = core.get_content_id("default:snowblock")
|
||||
}))
|
||||
|
||||
-- Deco code for grass and crystal
|
||||
|
||||
local TOPDECO = 500 -- how often deco appears on top of asteroid cobble
|
||||
|
||||
local grass = {
|
||||
"mars:grass_1", "mars:grass_2", "mars:grass_3", "mars:grass_4", "mars:grass_5"}
|
||||
|
||||
local flower = {"mars:moss", "mars:redweed", "mars:redgrass"}
|
||||
|
||||
local crystal = {
|
||||
"crystals:ghost_crystal_1", "crystals:ghost_crystal_2",
|
||||
"crystals:red_crystal_1", "crystals:red_crystal_2",
|
||||
"crystals:rose_quartz_1", "crystals:rose_quartz_2"}
|
||||
|
||||
local random = math.random
|
||||
|
||||
-- Add surface decoration
|
||||
|
||||
core.register_on_generated(function(minp, maxp)
|
||||
|
||||
if minp.y < YMIN or maxp.y > YMAX then return end
|
||||
|
||||
local bpos, ran
|
||||
local coal = core.find_nodes_in_area_under_air(minp, maxp, {"asteroid:redgravel"})
|
||||
|
||||
for n = 1, #coal do
|
||||
|
||||
bpos = {x = coal[n].x, y = coal[n].y + 1, z = coal[n].z}
|
||||
|
||||
ran = random(TOPDECO)
|
||||
|
||||
if ran < 100 then -- grass
|
||||
|
||||
core.swap_node(bpos, {name = grass[random(#grass)]})
|
||||
|
||||
elseif ran >= 180 and ran <= 200 then -- other plants
|
||||
|
||||
core.swap_node(bpos, {name = flower[random(#flower)]})
|
||||
|
||||
elseif ran == TOPDECO then -- crystals
|
||||
|
||||
core.swap_node(bpos, {name = crystal[random(#crystal)]})
|
||||
end
|
||||
end
|
||||
end)
|
BIN
mods/other_worlds/screenshot.png
Normal file
After Width: | Height: | Size: 89 KiB |
45
mods/other_worlds/settings.lua
Normal file
|
@ -0,0 +1,45 @@
|
|||
|
||||
otherworlds.settings = {}
|
||||
|
||||
-- general
|
||||
|
||||
otherworlds.settings.crafting = {
|
||||
-- set to false to remove crafting recipes
|
||||
enable = core.settings:get_bool("otherworlds.crafting", true)
|
||||
}
|
||||
|
||||
-- space_asteroids
|
||||
|
||||
otherworlds.settings.space_asteroids = {
|
||||
-- set to false to prevent space mapgen
|
||||
enable = core.settings:get_bool("otherworlds.space", true),
|
||||
-- minimum height of space layer
|
||||
YMIN = tonumber(core.settings:get("otherworlds.space.ymin") or 20000),
|
||||
-- maximum height for space layer
|
||||
YMAX = tonumber(core.settings:get("otherworlds.space.ymax") or 25000)
|
||||
}
|
||||
|
||||
-- redsky_asteroids
|
||||
|
||||
otherworlds.settings.redsky_asteroids = {
|
||||
-- set to false to prevent redsky mapgen
|
||||
enable = core.settings:get_bool("otherworlds.redsky", true),
|
||||
-- minimum height of redsky layer
|
||||
YMIN = tonumber(core.settings:get("otherworlds.redsky.ymin") or 25000),
|
||||
-- maximum height for redsky layer
|
||||
YMAX = tonumber(core.settings:get("otherworlds.redsky.ymax") or 30000)
|
||||
}
|
||||
|
||||
-- gravity
|
||||
|
||||
otherworlds.settings.gravity = {
|
||||
-- set to true to enable gravity
|
||||
enable = core.settings:get_bool("otherworlds.gravity", false)
|
||||
}
|
||||
|
||||
-- increase or decrease change of ores appearing in asteroids
|
||||
|
||||
otherworlds.settings.ore_chance = {
|
||||
-- default ore chance is multiplied by following value
|
||||
value = tonumber(core.settings:get("otherworlds.ore_chance") or 27)
|
||||
}
|
13
mods/other_worlds/settingtypes.txt
Normal file
|
@ -0,0 +1,13 @@
|
|||
otherworlds.crafting (Enable crafting recipes) bool true
|
||||
|
||||
otherworlds.space (Enable Space asteroids) bool true
|
||||
otherworlds.space.ymin (Space asteroid min height) int 20000
|
||||
otherworlds.space.ymax (Space asteroid max height) int 25000
|
||||
|
||||
otherworlds.redsky (Enable Redsky asteroids) bool true
|
||||
otherworlds.redsky.ymin (Redsky asteroid min height) int 25000
|
||||
otherworlds.redsky.ymax (Redsky asteroid max height) int 31000
|
||||
|
||||
otherworlds.gravity (Enable gravity) bool false
|
||||
|
||||
otherworlds.ore_chance (Chance of finding ores) int 27
|
220
mods/other_worlds/skybox.lua
Normal file
|
@ -0,0 +1,220 @@
|
|||
|
||||
-- Heights for skyboxes
|
||||
|
||||
local underground_low = -31000
|
||||
local underground_high = -50
|
||||
local space_low = 5000
|
||||
local space_high = 5999
|
||||
local redsky_low = 6000
|
||||
local redsky_high = 6999
|
||||
local nether_low = -32000
|
||||
local nether_high = -31000
|
||||
|
||||
-- Nether check
|
||||
|
||||
local mod_nether = core.get_modpath("nether")
|
||||
|
||||
if mod_nether then
|
||||
|
||||
nether_low = nether.DEPTH_FLOOR or -32000
|
||||
nether_high = nether.DEPTH_CEILING or -31000
|
||||
underground_low = nether_high
|
||||
|
||||
if core.get_modpath("climate_api") then
|
||||
mod_nether = nil -- remove nether skybox for climate_api version
|
||||
end
|
||||
end
|
||||
|
||||
-- Holds name of skybox showing for each player
|
||||
|
||||
local player_list = {}
|
||||
|
||||
-- Outerspace skybox
|
||||
|
||||
local spaceskybox = {
|
||||
"sky_pos_z.png",
|
||||
"sky_neg_z.png^[transformR180",
|
||||
"sky_neg_y.png^[transformR270",
|
||||
"sky_pos_y.png^[transformR270",
|
||||
"sky_pos_x.png^[transformR270",
|
||||
"sky_neg_x.png^[transformR90"}
|
||||
|
||||
-- Redsky skybox
|
||||
|
||||
local redskybox = {
|
||||
"sky_pos_z.png^[colorize:#99000050",
|
||||
"sky_neg_z.png^[transformR180^[colorize:#99000050",
|
||||
"sky_neg_y.png^[transformR270^[colorize:#99000050",
|
||||
"sky_pos_y.png^[transformR270^[colorize:#99000050",
|
||||
"sky_pos_x.png^[transformR270^[colorize:#99000050",
|
||||
"sky_neg_x.png^[transformR90^[colorize:#99000050"}
|
||||
|
||||
-- Darkest space skybox
|
||||
|
||||
local darkskybox = {
|
||||
"sky_pos_z.png^[colorize:#00005070",
|
||||
"sky_neg_z.png^[transformR180^[colorize:#00005070",
|
||||
"sky_neg_y.png^[transformR270^[colorize:#00005070",
|
||||
"sky_pos_y.png^[transformR270^[colorize:#00005070",
|
||||
"sky_pos_x.png^[transformR270^[colorize:#00005070",
|
||||
"sky_neg_x.png^[transformR90^[colorize:#00005070"}
|
||||
|
||||
-- check for active pova mod
|
||||
|
||||
local mod_pova = core.get_modpath("pova")
|
||||
|
||||
-- gravity helper function
|
||||
|
||||
local function set_gravity(player, grav)
|
||||
|
||||
if mod_pova then
|
||||
pova.add_override(player:get_player_name(), "default", {gravity = grav})
|
||||
else
|
||||
player:set_physics_override({gravity = grav})
|
||||
end
|
||||
end
|
||||
|
||||
-- globalstep function runs every 2 seconds to show appropriate skybox
|
||||
|
||||
local timer, timer2 = 0, 0
|
||||
|
||||
core.register_globalstep(function(dtime)
|
||||
|
||||
timer = timer + dtime ; if timer < 2 then return end ; timer = 0
|
||||
timer2 = timer2 + 2
|
||||
|
||||
local name, pos, current
|
||||
|
||||
for _, player in pairs(core.get_connected_players()) do
|
||||
|
||||
name = player:get_player_name()
|
||||
pos = player:get_pos()
|
||||
current = player_list[name] or ""
|
||||
|
||||
-- this just adds nether background outwith climate_api mod
|
||||
|
||||
if mod_nether and pos.y >= nether_low and pos.y <= nether_high
|
||||
and (current ~= "nether" or (current == "nether" and timer2 > 6)) then
|
||||
|
||||
timer2 = 0 -- reset nether layer timer (every 10 seconds)
|
||||
|
||||
local base_col = current ~= "nether" and "#1D0504"
|
||||
local ps, cn = core.find_nodes_in_area(
|
||||
{x = pos.x - 6, y = pos.y - 6, z = pos.z - 6},
|
||||
{x = pos.x + 6, y = pos.y + 6, z = pos.z + 6},
|
||||
{"nether:rack", "nether:rack_deep", "nether:geode", "nether:geodelite"})
|
||||
|
||||
-- easy find nether layer via quick node count
|
||||
|
||||
if (cn["nether:rack"] or 0) > 100 then
|
||||
base_col = "#1D0504"
|
||||
elseif (cn["nether:rack_deep"] or 0) > 100 then
|
||||
base_col = "#070916"
|
||||
elseif (cn["nether:geode"] or 0) + (cn["nether:geodelite"] or 0)> 100 then
|
||||
base_col = "#300530"
|
||||
end
|
||||
|
||||
if base_col then
|
||||
player:set_sky({type = "plain", base_color = base_col, clouds = false})
|
||||
end
|
||||
|
||||
player:set_moon({visible = false})
|
||||
player:set_stars({visible = false})
|
||||
player:set_sun({visible = false, sunrise_visible = false})
|
||||
|
||||
player_list[name] = "nether"
|
||||
|
||||
if otherworlds.settings.gravity.enable then
|
||||
set_gravity(player, 1.05)
|
||||
end
|
||||
|
||||
-- Underground (above Nether limit)
|
||||
|
||||
elseif pos.y >= underground_low and pos.y <= underground_high
|
||||
and current ~= "underground" then
|
||||
|
||||
player:set_sky({type = "plain", clouds = false, base_color = "#101010"})
|
||||
player:set_moon({visible = false})
|
||||
player:set_stars({visible = false})
|
||||
player:set_sun({visible = false, sunrise_visible = false})
|
||||
|
||||
player_list[name] = "underground"
|
||||
|
||||
if otherworlds.settings.gravity.enable then
|
||||
set_gravity(player, 1.0)
|
||||
end
|
||||
|
||||
-- Earth
|
||||
|
||||
elseif pos.y > underground_high and pos.y < space_low
|
||||
and current ~= "earth" then
|
||||
|
||||
player:set_sky({type = "regular", clouds = true})
|
||||
player:set_moon({visible = true})
|
||||
player:set_stars({visible = true})
|
||||
player:set_sun({visible = true, scale = 1.0, sunrise_visible = true})
|
||||
|
||||
player_list[name] = "earth"
|
||||
|
||||
if otherworlds.settings.gravity.enable then
|
||||
set_gravity(player, 1.0)
|
||||
end
|
||||
|
||||
-- Outerspace
|
||||
|
||||
elseif pos.y >= space_low and pos.y <= space_high
|
||||
and current ~= "space" then
|
||||
|
||||
player:set_sky({type = "skybox", textures = spaceskybox, clouds = false,
|
||||
base_color = "#000000"})
|
||||
player:set_moon({visible = false})
|
||||
player:set_stars({visible = false})
|
||||
player:set_sun({visible = true, scale = 1.0, sunrise_visible = false})
|
||||
|
||||
player_list[name] = "space"
|
||||
|
||||
if otherworlds.settings.gravity.enable then
|
||||
set_gravity(player, 0.4)
|
||||
end
|
||||
|
||||
-- Redsky
|
||||
|
||||
elseif pos.y >= redsky_low and pos.y <= redsky_high
|
||||
and current ~= "redsky" then
|
||||
|
||||
player:set_sky({type = "skybox", textures = redskybox, clouds = false,
|
||||
base_color = "#000000"})
|
||||
player:set_moon({visible = false})
|
||||
player:set_stars({visible = false})
|
||||
player:set_sun({visible = true, scale = 0.5, sunrise_visible = false})
|
||||
|
||||
player_list[name] = "redsky"
|
||||
|
||||
if otherworlds.settings.gravity.enable then
|
||||
set_gravity(player, 0.2)
|
||||
end
|
||||
|
||||
-- Everything else above (the blackness)
|
||||
|
||||
elseif pos.y > redsky_high and current ~= "blackness" then
|
||||
|
||||
player:set_sky({type = "skybox", textures = darkskybox, clouds = false,
|
||||
base_color = "#000000"})
|
||||
player:set_moon({visible = false})
|
||||
player:set_stars({visible = true})
|
||||
player:set_sun({visible = true, scale = 0.1, sunrise_visible = false})
|
||||
|
||||
player_list[name] = "blackness"
|
||||
|
||||
if otherworlds.settings.gravity.enable then
|
||||
set_gravity(player, 0.1)
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- remove player from list when they leave
|
||||
|
||||
core.register_on_leaveplayer(function(player)
|
||||
player_list[player:get_player_name()] = nil
|
||||
end)
|
26
mods/other_worlds/space_asteroids.lua
Normal file
|
@ -0,0 +1,26 @@
|
|||
|
||||
-- Approximate realm limits
|
||||
|
||||
local YMIN = otherworlds.settings.space_asteroids.YMIN or 5000
|
||||
local YMAX = otherworlds.settings.space_asteroids.YMAX or 6000
|
||||
|
||||
-- Register on_generated function for this layer
|
||||
|
||||
core.register_on_generated(
|
||||
otherworlds.asteroids.create_on_generated(YMIN, YMAX, {
|
||||
|
||||
c_air = core.get_content_id("air"),
|
||||
c_obsidian = core.get_content_id("default:obsidian"),
|
||||
c_stone = core.get_content_id("asteroid:stone"),
|
||||
c_cobble = core.get_content_id("asteroid:cobble"),
|
||||
c_gravel = core.get_content_id("asteroid:gravel"),
|
||||
c_dust = core.get_content_id("asteroid:dust"),
|
||||
c_ironore = core.get_content_id("default:stone_with_iron"),
|
||||
c_copperore = core.get_content_id("default:stone_with_copper"),
|
||||
c_goldore = core.get_content_id("default:stone_with_gold"),
|
||||
c_diamondore = core.get_content_id("default:stone_with_diamond"),
|
||||
c_meseore = core.get_content_id("default:stone_with_mese"),
|
||||
c_waterice = core.get_content_id("default:ice"),
|
||||
c_atmos = core.get_content_id("asteroid:atmos"),
|
||||
c_snowblock = core.get_content_id("default:snowblock")
|
||||
}))
|
BIN
mods/other_worlds/textures/asteroid_atmos.png
Normal file
After Width: | Height: | Size: 96 B |
BIN
mods/other_worlds/textures/asteroid_cobble.png
Normal file
After Width: | Height: | Size: 272 B |
BIN
mods/other_worlds/textures/asteroid_dust.png
Normal file
After Width: | Height: | Size: 245 B |
BIN
mods/other_worlds/textures/asteroid_gravel.png
Normal file
After Width: | Height: | Size: 172 B |
BIN
mods/other_worlds/textures/asteroid_redcobble.png
Normal file
After Width: | Height: | Size: 424 B |
BIN
mods/other_worlds/textures/asteroid_reddust.png
Normal file
After Width: | Height: | Size: 332 B |
BIN
mods/other_worlds/textures/asteroid_redgravel.png
Normal file
After Width: | Height: | Size: 172 B |
BIN
mods/other_worlds/textures/asteroid_redstone.png
Normal file
After Width: | Height: | Size: 329 B |
BIN
mods/other_worlds/textures/crystals_ghost_crystal.png
Normal file
After Width: | Height: | Size: 987 B |
BIN
mods/other_worlds/textures/crystals_red_crystal.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
mods/other_worlds/textures/crystals_rose_quartz.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
mods/other_worlds/textures/mars_grass_1.png
Normal file
After Width: | Height: | Size: 167 B |
BIN
mods/other_worlds/textures/mars_grass_2.png
Normal file
After Width: | Height: | Size: 174 B |
BIN
mods/other_worlds/textures/mars_grass_3.png
Normal file
After Width: | Height: | Size: 232 B |
BIN
mods/other_worlds/textures/mars_grass_4.png
Normal file
After Width: | Height: | Size: 259 B |
BIN
mods/other_worlds/textures/mars_grass_5.png
Normal file
After Width: | Height: | Size: 315 B |
BIN
mods/other_worlds/textures/mars_moss.png
Normal file
After Width: | Height: | Size: 216 B |
BIN
mods/other_worlds/textures/mars_redgrass.png
Normal file
After Width: | Height: | Size: 197 B |
BIN
mods/other_worlds/textures/mars_redweed.png
Normal file
After Width: | Height: | Size: 173 B |
BIN
mods/other_worlds/textures/sky_neg_x.png
Normal file
After Width: | Height: | Size: 97 KiB |
BIN
mods/other_worlds/textures/sky_neg_y.png
Normal file
After Width: | Height: | Size: 107 KiB |
BIN
mods/other_worlds/textures/sky_neg_z.png
Normal file
After Width: | Height: | Size: 121 KiB |
BIN
mods/other_worlds/textures/sky_pos_x.png
Normal file
After Width: | Height: | Size: 110 KiB |
BIN
mods/other_worlds/textures/sky_pos_y.png
Normal file
After Width: | Height: | Size: 127 KiB |
BIN
mods/other_worlds/textures/sky_pos_z.png
Normal file
After Width: | Height: | Size: 92 KiB |