New map
|
@ -1,14 +1,15 @@
|
|||
give_initial_stuff = true
|
||||
enable_pvp = true
|
||||
fixed_map_seed = 16790241579520694642
|
||||
mg_name = v6
|
||||
mgv6_spflags = nojungles, biomeblend, mudflow, nosnowbiomes, noflat
|
||||
fixed_map_seed = 13389864206935783704
|
||||
mg_name = v7
|
||||
mg_flags = nocaves,nodungeons,light,decorations
|
||||
map_generation_limit = 160
|
||||
vote.kick_vote = false
|
||||
barrier = 102
|
||||
barrier = 106
|
||||
regen_interval = 10
|
||||
regen_amount = 1
|
||||
random_messages_interval = 60
|
||||
water_level = 43
|
||||
|
||||
#
|
||||
# CTF_PVP_ENGINE
|
||||
|
@ -30,7 +31,7 @@ ctf.friendly_fire = false
|
|||
ctf.autoalloc_on_joinplayer = true
|
||||
|
||||
ctf.match = true
|
||||
ctf.match.teams = red, red, -64, 16, 85; blue, blue, 23, 14, -77
|
||||
ctf.match.teams = red, red, 7, 65, 93; blue, blue, -22, 66, -78
|
||||
ctf.match.build_time = 240
|
||||
ctf.match.clear_inv = true
|
||||
ctf.match.destroy_team = true
|
||||
|
|
693
mods/default/mapgen.lua
Normal file → Executable file
|
@ -2,7 +2,6 @@
|
|||
-- Aliases for map generator outputs
|
||||
--
|
||||
|
||||
|
||||
minetest.register_alias("mapgen_stone", "default:stone")
|
||||
minetest.register_alias("mapgen_dirt", "default:dirt")
|
||||
minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass")
|
||||
|
@ -19,15 +18,19 @@ minetest.register_alias("mapgen_snow", "default:snow")
|
|||
minetest.register_alias("mapgen_ice", "default:ice")
|
||||
minetest.register_alias("mapgen_sandstone", "default:sandstone")
|
||||
|
||||
-- Flora
|
||||
|
||||
minetest.register_alias("mapgen_tree", "default:tree")
|
||||
minetest.register_alias("mapgen_leaves", "default:leaves")
|
||||
minetest.register_alias("mapgen_apple", "default:apple")
|
||||
minetest.register_alias("mapgen_jungletree", "default:jungletree")
|
||||
minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves")
|
||||
minetest.register_alias("mapgen_junglegrass", "default:junglegrass")
|
||||
minetest.register_alias("mapgen_pinetree", "default:pinetree")
|
||||
minetest.register_alias("mapgen_pine_tree", "default:pine_tree")
|
||||
minetest.register_alias("mapgen_pine_needles", "default:pine_needles")
|
||||
|
||||
-- Dungeons
|
||||
|
||||
minetest.register_alias("mapgen_cobble", "default:cobble")
|
||||
minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble")
|
||||
minetest.register_alias("mapgen_mossycobble", "default:mossycobble")
|
||||
|
@ -39,67 +42,98 @@ minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebr
|
|||
-- Register ores
|
||||
--
|
||||
|
||||
|
||||
-- All mapgens except singlenode
|
||||
-- Blob ore first to avoid other ores inside blobs
|
||||
|
||||
function default.register_ores()
|
||||
|
||||
-- Clay
|
||||
|
||||
minetest.register_ore({
|
||||
ore_type = "blob",
|
||||
ore = "default:clay",
|
||||
wherein = {"default:sand"},
|
||||
clust_scarcity = 16 * 16 * 16,
|
||||
clust_size = 5,
|
||||
y_min = -15,
|
||||
y_max = 0,
|
||||
noise_threshold = 0.0,
|
||||
noise_params = {
|
||||
offset = 0.5,
|
||||
scale = 0.2,
|
||||
spread = {x = 5, y = 5, z = 5},
|
||||
seed = -316,
|
||||
octaves = 1,
|
||||
persist = 0.0
|
||||
},
|
||||
})
|
||||
|
||||
-- Sand
|
||||
|
||||
minetest.register_ore({
|
||||
ore_type = "blob",
|
||||
ore = "default:sand",
|
||||
wherein = {"default:stone"},
|
||||
clust_scarcity = 24 * 24 * 24,
|
||||
clust_size = 7,
|
||||
y_min = -63,
|
||||
wherein = {"default:stone", "default:sandstone",
|
||||
"default:desert_stone"},
|
||||
clust_scarcity = 16 * 16 * 16,
|
||||
clust_size = 5,
|
||||
y_min = -31,
|
||||
y_max = 4,
|
||||
noise_threshhold = 0,
|
||||
noise_threshold = 0.0,
|
||||
noise_params = {
|
||||
offset = 0.35,
|
||||
offset = 0.5,
|
||||
scale = 0.2,
|
||||
spread = {x = 5, y = 5, z = 5},
|
||||
seed = 2316,
|
||||
octaves = 1,
|
||||
persist = 0.5
|
||||
persist = 0.0
|
||||
},
|
||||
})
|
||||
|
||||
-- Dirt
|
||||
|
||||
minetest.register_ore({
|
||||
ore_type = "blob",
|
||||
ore = "default:dirt",
|
||||
wherein = {"default:stone"},
|
||||
clust_scarcity = 24 * 24 * 24,
|
||||
clust_size = 7,
|
||||
y_min = -63,
|
||||
wherein = {"default:stone", "default:sandstone"},
|
||||
clust_scarcity = 16 * 16 * 16,
|
||||
clust_size = 5,
|
||||
y_min = -31,
|
||||
y_max = 31000,
|
||||
noise_threshhold = 0,
|
||||
noise_threshold = 0.0,
|
||||
noise_params = {
|
||||
offset = 0.35,
|
||||
offset = 0.5,
|
||||
scale = 0.2,
|
||||
spread = {x = 5, y = 5, z = 5},
|
||||
seed = 17676,
|
||||
octaves = 1,
|
||||
persist = 0.5
|
||||
persist = 0.0
|
||||
},
|
||||
})
|
||||
|
||||
-- Gravel
|
||||
|
||||
minetest.register_ore({
|
||||
ore_type = "blob",
|
||||
ore = "default:gravel",
|
||||
wherein = {"default:stone"},
|
||||
clust_scarcity = 24 * 24 * 24,
|
||||
clust_size = 7,
|
||||
clust_scarcity = 16 * 16 * 16,
|
||||
clust_size = 5,
|
||||
y_min = -31000,
|
||||
y_max = 31000,
|
||||
noise_threshhold = 0,
|
||||
noise_threshold = 0.0,
|
||||
noise_params = {
|
||||
offset = 0.35,
|
||||
offset = 0.5,
|
||||
scale = 0.2,
|
||||
spread = {x = 5, y = 5, z = 5},
|
||||
seed = 766,
|
||||
octaves = 1,
|
||||
persist = 0.5
|
||||
persist = 0.0
|
||||
},
|
||||
})
|
||||
|
||||
-- Coal
|
||||
|
||||
minetest.register_ore({
|
||||
ore_type = "scatter",
|
||||
ore = "default:stone_with_coal",
|
||||
|
@ -122,6 +156,8 @@ function default.register_ores()
|
|||
y_max = 0,
|
||||
})
|
||||
|
||||
-- Iron
|
||||
|
||||
minetest.register_ore({
|
||||
ore_type = "scatter",
|
||||
ore = "default:stone_with_iron",
|
||||
|
@ -166,6 +202,8 @@ function default.register_ores()
|
|||
y_max = -64,
|
||||
})
|
||||
|
||||
--Mese
|
||||
|
||||
minetest.register_ore({
|
||||
ore_type = "scatter",
|
||||
ore = "default:stone_with_mese",
|
||||
|
@ -199,6 +237,8 @@ function default.register_ores()
|
|||
y_max = -1024,
|
||||
})
|
||||
|
||||
-- Gold
|
||||
|
||||
minetest.register_ore({
|
||||
ore_type = "scatter",
|
||||
ore = "default:stone_with_gold",
|
||||
|
@ -221,6 +261,8 @@ function default.register_ores()
|
|||
y_max = -256,
|
||||
})
|
||||
|
||||
-- Diamond
|
||||
|
||||
minetest.register_ore({
|
||||
ore_type = "scatter",
|
||||
ore = "default:stone_with_diamond",
|
||||
|
@ -243,6 +285,8 @@ function default.register_ores()
|
|||
y_max = -256,
|
||||
})
|
||||
|
||||
-- Copper
|
||||
|
||||
minetest.register_ore({
|
||||
ore_type = "scatter",
|
||||
ore = "default:stone_with_copper",
|
||||
|
@ -271,12 +315,15 @@ end
|
|||
-- Register biomes
|
||||
--
|
||||
|
||||
-- All mapgens except mgv6 and singlenode
|
||||
|
||||
function default.register_biomes()
|
||||
minetest.clear_registered_biomes()
|
||||
|
||||
-- Temperate
|
||||
|
||||
minetest.register_biome({
|
||||
name = "default:grassland",
|
||||
name = "stone_grassland",
|
||||
--node_dust = "",
|
||||
node_top = "default:dirt_with_grass",
|
||||
depth_top = 1,
|
||||
|
@ -286,25 +333,101 @@ function default.register_biomes()
|
|||
--node_water_top = "",
|
||||
--depth_water_top = ,
|
||||
--node_water = "",
|
||||
y_min = 5,
|
||||
--node_river_water = "",
|
||||
y_min = 50,
|
||||
y_max = 31000,
|
||||
heat_point = 50,
|
||||
humidity_point = 50,
|
||||
heat_point = 40,
|
||||
humidity_point = 35,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "default:grassland_ocean",
|
||||
name = "coniferous_forest",
|
||||
--node_dust = "",
|
||||
node_top = "default:sand",
|
||||
node_top = "default:dirt_with_grass",
|
||||
depth_top = 1,
|
||||
node_filler = "default:sand",
|
||||
depth_filler = 2,
|
||||
node_filler = "default:dirt",
|
||||
depth_filler = 3,
|
||||
--node_stone = "",
|
||||
--node_water_top = "",
|
||||
--depth_water_top = ,
|
||||
--node_water = "",
|
||||
--node_river_water = "",
|
||||
y_min = 44,
|
||||
y_max = 55,
|
||||
heat_point = 40,
|
||||
humidity_point = 65,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "coniferous_forest_ocean",
|
||||
--node_dust = "",
|
||||
node_top = "default:sand",
|
||||
depth_top = 1,
|
||||
node_filler = "default:sand",
|
||||
depth_filler = 3,
|
||||
--node_stone = "",
|
||||
--node_water_top = "",
|
||||
--depth_water_top = ,
|
||||
--node_water = "",
|
||||
--node_river_water = "",
|
||||
y_min = -112,
|
||||
y_max = 44,
|
||||
heat_point = 40,
|
||||
humidity_point = 65,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "deciduous_forest",
|
||||
--node_dust = "",
|
||||
node_top = "default:dirt_with_grass",
|
||||
depth_top = 1,
|
||||
node_filler = "default:dirt",
|
||||
depth_filler = 3,
|
||||
--node_stone = "",
|
||||
--node_water_top = "",
|
||||
--depth_water_top = ,
|
||||
--node_water = "",
|
||||
--node_river_water = "",
|
||||
y_min = 44,
|
||||
y_max = 55,
|
||||
heat_point = 60,
|
||||
humidity_point = 65,
|
||||
})
|
||||
|
||||
minetest.register_biome({
|
||||
name = "deciduous_forest_ocean",
|
||||
--node_dust = "",
|
||||
node_top = "default:sand",
|
||||
depth_top = 1,
|
||||
node_filler = "default:sand",
|
||||
depth_filler = 3,
|
||||
--node_stone = "",
|
||||
--node_water_top = "",
|
||||
--depth_water_top = ,
|
||||
--node_water = "",
|
||||
--node_river_water = "",
|
||||
y_min = -112,
|
||||
y_max = 43,
|
||||
heat_point = 60,
|
||||
humidity_point = 65,
|
||||
})
|
||||
|
||||
-- Underground
|
||||
|
||||
minetest.register_biome({
|
||||
name = "underground",
|
||||
--node_dust = "",
|
||||
--node_top = "",
|
||||
--depth_top = ,
|
||||
--node_filler = "",
|
||||
--depth_filler = ,
|
||||
--node_stone = "",
|
||||
--node_water_top = "",
|
||||
--depth_water_top = ,
|
||||
--node_water = "",
|
||||
--node_river_water = "",
|
||||
y_min = -31000,
|
||||
y_max = 4,
|
||||
y_max = -113,
|
||||
heat_point = 50,
|
||||
humidity_point = 50,
|
||||
})
|
||||
|
@ -312,11 +435,39 @@ end
|
|||
|
||||
|
||||
--
|
||||
-- Register mgv6 decorations
|
||||
-- Register decorations
|
||||
--
|
||||
|
||||
-- Mgv6
|
||||
|
||||
function default.register_mgv6_decorations()
|
||||
minetest.clear_registered_decorations()
|
||||
|
||||
-- Papyrus
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = {"default:dirt_with_grass"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = -0.3,
|
||||
scale = 0.7,
|
||||
spread = {x = 100, y = 100, z = 100},
|
||||
seed = 354,
|
||||
octaves = 3,
|
||||
persist = 0.7
|
||||
},
|
||||
y_min = 1,
|
||||
y_max = 1,
|
||||
decoration = "default:papyrus",
|
||||
height = 2,
|
||||
height_max = 4,
|
||||
spawn_by = "default:water_source",
|
||||
num_spawn_by = 1,
|
||||
})
|
||||
|
||||
-- Cacti
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = {"default:desert_sand"},
|
||||
|
@ -335,16 +486,485 @@ function default.register_mgv6_decorations()
|
|||
height = 3,
|
||||
height_max = 4,
|
||||
})
|
||||
|
||||
-- Long grasses
|
||||
|
||||
for length = 1, 5 do
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = {"default:dirt_with_grass"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = 0,
|
||||
scale = 0.007,
|
||||
spread = {x = 100, y = 100, z = 100},
|
||||
seed = 329,
|
||||
octaves = 3,
|
||||
persist = 0.6
|
||||
},
|
||||
y_min = 1,
|
||||
y_max = 30,
|
||||
decoration = "default:grass_"..length,
|
||||
})
|
||||
end
|
||||
|
||||
-- Dry shrubs
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = {"default:desert_sand", "default:dirt_with_snow"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = 0,
|
||||
scale = 0.035,
|
||||
spread = {x = 100, y = 100, z = 100},
|
||||
seed = 329,
|
||||
octaves = 3,
|
||||
persist = 0.6
|
||||
},
|
||||
y_min = 1,
|
||||
y_max = 30,
|
||||
decoration = "default:dry_shrub",
|
||||
})
|
||||
end
|
||||
|
||||
-- All mapgens except mgv6 and singlenode
|
||||
|
||||
local function register_grass_decoration(offset, scale, length)
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = {"default:dirt_with_grass", "default:sand"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = offset,
|
||||
scale = scale,
|
||||
spread = {x = 200, y = 200, z = 200},
|
||||
seed = 329,
|
||||
octaves = 3,
|
||||
persist = 0.6
|
||||
},
|
||||
biomes = {"stone_grassland", "sandstone_grassland",
|
||||
"deciduous_forest", "coniferous_forest",
|
||||
"stone_grassland_dunes", "sandstone_grassland_dunes",
|
||||
"coniferous_forest_dunes"},
|
||||
y_min = 1,
|
||||
y_max = 31000,
|
||||
decoration = "default:grass_"..length,
|
||||
})
|
||||
end
|
||||
|
||||
local MAX_TREE_H = 60
|
||||
local MAX_GRASS_H = 63
|
||||
|
||||
local function register_dry_grass_decoration(offset, scale, length)
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = {"default:dirt_with_dry_grass"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = offset,
|
||||
scale = scale,
|
||||
spread = {x = 200, y = 200, z = 200},
|
||||
seed = 329,
|
||||
octaves = 3,
|
||||
persist = 0.6
|
||||
},
|
||||
biomes = {"savanna"},
|
||||
y_min = 1,
|
||||
y_max = MAX_GRASS_H,
|
||||
decoration = "default:dry_grass_"..length,
|
||||
})
|
||||
end
|
||||
|
||||
function default.register_decorations()
|
||||
minetest.clear_registered_decorations()
|
||||
|
||||
-- Apple tree and log
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = {"default:dirt_with_grass"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = 0.04,
|
||||
scale = 0.02,
|
||||
spread = {x = 250, y = 250, z = 250},
|
||||
seed = 2,
|
||||
octaves = 3,
|
||||
persist = 0.66
|
||||
},
|
||||
biomes = {"deciduous_forest"},
|
||||
y_min = 1,
|
||||
y_max = MAX_TREE_H,
|
||||
schematic = minetest.get_modpath("default").."/schematics/apple_tree.mts",
|
||||
flags = "place_center_x, place_center_z",
|
||||
})
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = {"default:dirt_with_grass"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = 0.002,
|
||||
scale = 0.001,
|
||||
spread = {x = 250, y = 250, z = 250},
|
||||
seed = 2,
|
||||
octaves = 3,
|
||||
persist = 0.66
|
||||
},
|
||||
biomes = {"deciduous_forest"},
|
||||
y_min = 1,
|
||||
y_max = MAX_TREE_H,
|
||||
schematic = {
|
||||
size = { x = 3, y = 3, z = 1},
|
||||
data = {
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "default:tree", param2 = 12, prob = 191 },
|
||||
{ name = "default:tree", param2 = 12 },
|
||||
{ name = "default:tree", param2 = 12, prob = 127 },
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "flowers:mushroom_brown", prob = 63 },
|
||||
{ name = "air", prob = 0 },
|
||||
},
|
||||
},
|
||||
flags = "place_center_x",
|
||||
rotation = "random",
|
||||
})
|
||||
|
||||
-- Jungle tree and log
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = {"default:dirt_with_grass", "default:dirt"},
|
||||
sidelen = 40,
|
||||
fill_ratio = 0.035,
|
||||
biomes = {"rainforest", "rainforest_swamp"},
|
||||
y_min = 0,
|
||||
y_max = MAX_TREE_H,
|
||||
schematic = minetest.get_modpath("default").."/schematics/jungle_tree.mts",
|
||||
flags = "place_center_x, place_center_z",
|
||||
rotation = "random",
|
||||
})
|
||||
|
||||
-- Taiga and temperate coniferous forest pine tree and log
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = {"default:dirt_with_snow", "default:dirt_with_grass"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = 0.04,
|
||||
scale = 0.02,
|
||||
spread = {x = 250, y = 250, z = 250},
|
||||
seed = 2,
|
||||
octaves = 3,
|
||||
persist = 0.66
|
||||
},
|
||||
biomes = {"taiga", "coniferous_forest"},
|
||||
y_min = 2,
|
||||
y_max = MAX_TREE_H,
|
||||
schematic = minetest.get_modpath("default").."/schematics/pine_tree.mts",
|
||||
flags = "place_center_x, place_center_z",
|
||||
})
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = {"default:dirt_with_snow", "default:dirt_with_grass"},
|
||||
sidelen = 80,
|
||||
fill_ratio = 0.003,
|
||||
biomes = {"taiga", "coniferous_forest"},
|
||||
y_min = 1,
|
||||
y_max = MAX_TREE_H,
|
||||
schematic = {
|
||||
size = { x = 3, y = 3, z = 1},
|
||||
data = {
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "default:pine_tree", param2 = 12, prob = 191 },
|
||||
{ name = "default:pine_tree", param2 = 12 },
|
||||
{ name = "default:pine_tree", param2 = 12, prob = 127 },
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "flowers:mushroom_red", prob = 63 },
|
||||
{ name = "air", prob = 0 },
|
||||
},
|
||||
},
|
||||
flags = "place_center_x",
|
||||
rotation = "random",
|
||||
})
|
||||
|
||||
-- Acacia tree and log
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = {"default:dirt_with_dry_grass"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = 0,
|
||||
scale = 0.002,
|
||||
spread = {x = 250, y = 250, z = 250},
|
||||
seed = 2,
|
||||
octaves = 3,
|
||||
persist = 0.66
|
||||
},
|
||||
biomes = {"savanna"},
|
||||
y_min = 1,
|
||||
y_max = MAX_TREE_H,
|
||||
schematic = minetest.get_modpath("default").."/schematics/acacia_tree.mts",
|
||||
flags = "place_center_x, place_center_z",
|
||||
rotation = "random",
|
||||
})
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = {"default:dirt_with_dry_grass"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = 0,
|
||||
scale = 0.001,
|
||||
spread = {x = 250, y = 250, z = 250},
|
||||
seed = 2,
|
||||
octaves = 3,
|
||||
persist = 0.66
|
||||
},
|
||||
biomes = {"savanna"},
|
||||
y_min = 1,
|
||||
y_max = MAX_TREE_H,
|
||||
schematic = {
|
||||
size = { x = 3, y = 2, z = 1},
|
||||
data = {
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "default:acacia_tree", param2 = 12, prob = 191 },
|
||||
{ name = "default:acacia_tree", param2 = 12 },
|
||||
{ name = "default:acacia_tree", param2 = 12, prob = 127 },
|
||||
},
|
||||
},
|
||||
flags = "place_center_x",
|
||||
rotation = "random",
|
||||
})
|
||||
|
||||
-- Aspen tree and log
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = {"default:dirt_with_grass"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = 0.0,
|
||||
scale = -0.03,
|
||||
spread = {x = 250, y = 250, z = 250},
|
||||
seed = 2,
|
||||
octaves = 3,
|
||||
persist = 0.66
|
||||
},
|
||||
biomes = {"deciduous_forest"},
|
||||
y_min = 1,
|
||||
y_max = MAX_TREE_H,
|
||||
schematic = minetest.get_modpath("default").."/schematics/aspen_tree.mts",
|
||||
flags = "place_center_x, place_center_z",
|
||||
rotation = "random",
|
||||
})
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = {"default:dirt_with_grass"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = 0.0,
|
||||
scale = -0.0015,
|
||||
spread = {x = 250, y = 250, z = 250},
|
||||
seed = 2,
|
||||
octaves = 3,
|
||||
persist = 0.66
|
||||
},
|
||||
biomes = {"deciduous_forest"},
|
||||
y_min = 1,
|
||||
y_max = MAX_TREE_H,
|
||||
schematic = {
|
||||
size = { x = 3, y = 3, z = 1},
|
||||
data = {
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "air", prob = 0 },
|
||||
{ name = "default:aspen_tree", param2 = 12 },
|
||||
{ name = "default:aspen_tree", param2 = 12 },
|
||||
{ name = "default:aspen_tree", param2 = 12, prob = 127 },
|
||||
{ name = "flowers:mushroom_red", prob = 63 },
|
||||
{ name = "flowers:mushroom_brown", prob = 63 },
|
||||
{ name = "air", prob = 0 },
|
||||
},
|
||||
},
|
||||
flags = "place_center_x",
|
||||
rotation = "random",
|
||||
})
|
||||
-- Large cactus
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = {"default:desert_sand"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = -0.0003,
|
||||
scale = 0.0009,
|
||||
spread = {x = 200, y = 200, z = 200},
|
||||
seed = 230,
|
||||
octaves = 3,
|
||||
persist = 0.6
|
||||
},
|
||||
biomes = {"desert"},
|
||||
y_min = 5,
|
||||
y_max = MAX_TREE_H,
|
||||
schematic = minetest.get_modpath("default").."/schematics/large_cactus.mts",
|
||||
flags = "place_center_x",
|
||||
rotation = "random",
|
||||
})
|
||||
|
||||
-- Cactus
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = {"default:desert_sand"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = -0.0003,
|
||||
scale = 0.0009,
|
||||
spread = {x = 200, y = 200, z = 200},
|
||||
seed = 230,
|
||||
octaves = 3,
|
||||
persist = 0.6
|
||||
},
|
||||
biomes = {"desert"},
|
||||
y_min = 5,
|
||||
y_max = MAX_TREE_H,
|
||||
decoration = "default:cactus",
|
||||
height = 2,
|
||||
height_max = 5,
|
||||
})
|
||||
|
||||
-- Papyrus
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = {"default:dirt"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = -0.3,
|
||||
scale = 0.7,
|
||||
spread = {x = 200, y = 200, z = 200},
|
||||
seed = 354,
|
||||
octaves = 3,
|
||||
persist = 0.7
|
||||
},
|
||||
biomes = {"savanna_swamp"},
|
||||
y_min = 0,
|
||||
y_max = 0,
|
||||
schematic = minetest.get_modpath("default").."/schematics/papyrus.mts",
|
||||
})
|
||||
|
||||
-- Grasses
|
||||
|
||||
register_grass_decoration(-0.03, 0.09, 5)
|
||||
register_grass_decoration(-0.015, 0.075, 4)
|
||||
register_grass_decoration(0, 0.06, 3)
|
||||
register_grass_decoration(0.015, 0.045, 2)
|
||||
register_grass_decoration(0.03, 0.03, 1)
|
||||
|
||||
-- Dry grasses
|
||||
|
||||
register_dry_grass_decoration(0.01, 0.05, 5)
|
||||
register_dry_grass_decoration(0.03, 0.03, 4)
|
||||
register_dry_grass_decoration(0.05, 0.01, 3)
|
||||
register_dry_grass_decoration(0.07, -0.01, 2)
|
||||
register_dry_grass_decoration(0.09, -0.03, 1)
|
||||
|
||||
-- Junglegrass
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = {"default:dirt_with_grass"},
|
||||
sidelen = 80,
|
||||
fill_ratio = 0.1,
|
||||
biomes = {"rainforest"},
|
||||
y_min = 1,
|
||||
y_max = MAX_GRASS_H,
|
||||
decoration = "default:junglegrass",
|
||||
})
|
||||
|
||||
-- Dry shrub
|
||||
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = {"default:desert_sand", "default:dirt_with_snow"},
|
||||
sidelen = 16,
|
||||
noise_params = {
|
||||
offset = 0,
|
||||
scale = 0.02,
|
||||
spread = {x = 200, y = 200, z = 200},
|
||||
seed = 329,
|
||||
octaves = 3,
|
||||
persist = 0.6
|
||||
},
|
||||
biomes = {"desert", "tundra"},
|
||||
y_min = 2,
|
||||
y_max = MAX_GRASS_H,
|
||||
decoration = "default:dry_shrub",
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- Register decorations
|
||||
-- Generate nyan cats
|
||||
--
|
||||
|
||||
-- All mapgens except singlenode
|
||||
|
||||
function default.register_decorations()
|
||||
function default.make_nyancat(pos, facedir, length)
|
||||
local tailvec = {x = 0, y = 0, z = 0}
|
||||
if facedir == 0 then
|
||||
tailvec.z = 1
|
||||
elseif facedir == 1 then
|
||||
tailvec.x = 1
|
||||
elseif facedir == 2 then
|
||||
tailvec.z = -1
|
||||
elseif facedir == 3 then
|
||||
tailvec.x = -1
|
||||
else
|
||||
facedir = 0
|
||||
tailvec.z = 1
|
||||
end
|
||||
local p = {x = pos.x, y = pos.y, z = pos.z}
|
||||
minetest.set_node(p, {name = "default:nyancat", param2 = facedir})
|
||||
for i = 1, length do
|
||||
p.x = p.x + tailvec.x
|
||||
p.z = p.z + tailvec.z
|
||||
minetest.set_node(p, {name = "default:nyancat_rainbow", param2 = facedir})
|
||||
end
|
||||
end
|
||||
|
||||
function default.generate_nyancats(minp, maxp, seed)
|
||||
local height_min = -31000
|
||||
local height_max = -32
|
||||
if maxp.y < height_min or minp.y > height_max then
|
||||
return
|
||||
end
|
||||
local y_min = math.max(minp.y, height_min)
|
||||
local y_max = math.min(maxp.y, height_max)
|
||||
local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
|
||||
local pr = PseudoRandom(seed + 9324342)
|
||||
local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
|
||||
for i = 1, max_num_nyancats do
|
||||
if pr:next(0, 1000) == 0 then
|
||||
local x0 = pr:next(minp.x, maxp.x)
|
||||
local y0 = pr:next(minp.y, maxp.y)
|
||||
local z0 = pr:next(minp.z, maxp.z)
|
||||
local p0 = {x = x0, y = y0, z = z0}
|
||||
default.make_nyancat(p0, pr:next(0, 3), pr:next(3, 15))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
@ -352,7 +972,6 @@ end
|
|||
-- Detect mapgen to select functions
|
||||
--
|
||||
|
||||
|
||||
-- Mods using singlenode mapgen can call these functions to enable
|
||||
-- the use of minetest.generate_ores or minetest.generate_decorations
|
||||
|
||||
|
@ -360,8 +979,10 @@ local mg_params = minetest.get_mapgen_params()
|
|||
if mg_params.mgname == "v6" then
|
||||
default.register_ores()
|
||||
default.register_mgv6_decorations()
|
||||
minetest.register_on_generated(default.generate_nyancats)
|
||||
elseif mg_params.mgname ~= "singlenode" then
|
||||
default.register_ores()
|
||||
default.register_biomes()
|
||||
default.register_ores()
|
||||
default.register_decorations()
|
||||
minetest.register_on_generated(default.generate_nyancats)
|
||||
end
|
||||
|
|
BIN
mods/default/schematics/acacia_tree.mts
Executable file
BIN
mods/default/schematics/acacia_tree_from_sapling.mts
Executable file
BIN
mods/default/schematics/apple_tree.mts
Executable file
BIN
mods/default/schematics/apple_tree_from_sapling.mts
Executable file
BIN
mods/default/schematics/aspen_tree.mts
Executable file
BIN
mods/default/schematics/aspen_tree_from_sapling.mts
Executable file
BIN
mods/default/schematics/jungle_tree.mts
Executable file
BIN
mods/default/schematics/jungle_tree_from_sapling.mts
Executable file
BIN
mods/default/schematics/large_cactus.mts
Executable file
BIN
mods/default/schematics/papyrus.mts
Executable file
BIN
mods/default/schematics/pine_tree.mts
Executable file
BIN
mods/default/schematics/pine_tree_from_sapling.mts
Executable file
BIN
mods/default/textures/character.png
Executable file
After Width: | Height: | Size: 2.7 KiB |
BIN
mods/default/textures/default_acacia_leaves.png
Executable file
After Width: | Height: | Size: 444 B |
BIN
mods/default/textures/default_acacia_sapling.png
Executable file
After Width: | Height: | Size: 359 B |
BIN
mods/default/textures/default_acacia_tree.png
Executable file
After Width: | Height: | Size: 682 B |
BIN
mods/default/textures/default_acacia_tree_top.png
Executable file
After Width: | Height: | Size: 731 B |
BIN
mods/default/textures/default_acacia_wood.png
Executable file
After Width: | Height: | Size: 261 B |
BIN
mods/default/textures/default_aspen_leaves.png
Executable file
After Width: | Height: | Size: 761 B |
BIN
mods/default/textures/default_aspen_sapling.png
Executable file
After Width: | Height: | Size: 320 B |
BIN
mods/default/textures/default_aspen_tree.png
Executable file
After Width: | Height: | Size: 695 B |
BIN
mods/default/textures/default_aspen_tree_top.png
Executable file
After Width: | Height: | Size: 656 B |
BIN
mods/default/textures/default_aspen_wood.png
Executable file
After Width: | Height: | Size: 373 B |
BIN
mods/default/textures/default_book_written.png
Executable file
After Width: | Height: | Size: 228 B |
BIN
mods/default/textures/default_chest_front.png
Executable file
After Width: | Height: | Size: 423 B |
BIN
mods/default/textures/default_chest_lock.png
Executable file
After Width: | Height: | Size: 469 B |
BIN
mods/default/textures/default_chest_side.png
Executable file
After Width: | Height: | Size: 375 B |
BIN
mods/default/textures/default_chest_top.png
Executable file
After Width: | Height: | Size: 422 B |
BIN
mods/default/textures/default_dry_grass.png
Executable file
After Width: | Height: | Size: 303 B |
BIN
mods/default/textures/default_dry_grass_1.png
Executable file
After Width: | Height: | Size: 219 B |
BIN
mods/default/textures/default_dry_grass_2.png
Executable file
After Width: | Height: | Size: 265 B |
BIN
mods/default/textures/default_dry_grass_3.png
Executable file
After Width: | Height: | Size: 295 B |
BIN
mods/default/textures/default_dry_grass_4.png
Executable file
After Width: | Height: | Size: 316 B |
BIN
mods/default/textures/default_dry_grass_5.png
Executable file
After Width: | Height: | Size: 339 B |
BIN
mods/default/textures/default_dry_grass_side.png
Executable file
After Width: | Height: | Size: 285 B |
BIN
mods/default/textures/default_dry_shrub.png
Executable file
After Width: | Height: | Size: 148 B |
BIN
mods/default/textures/default_footprint.png
Executable file
After Width: | Height: | Size: 466 B |
BIN
mods/default/textures/default_grass_1.png
Executable file
After Width: | Height: | Size: 2.9 KiB |
BIN
mods/default/textures/default_grass_2.png
Executable file
After Width: | Height: | Size: 2.9 KiB |
BIN
mods/default/textures/default_grass_3.png
Executable file
After Width: | Height: | Size: 3 KiB |
BIN
mods/default/textures/default_grass_4.png
Executable file
After Width: | Height: | Size: 3.1 KiB |
BIN
mods/default/textures/default_grass_5.png
Executable file
After Width: | Height: | Size: 3.2 KiB |
BIN
mods/default/textures/default_junglegrass.png
Executable file
After Width: | Height: | Size: 197 B |
BIN
mods/default/textures/default_jungleleaves_simple.png
Executable file
After Width: | Height: | Size: 430 B |
BIN
mods/default/textures/default_leaves_simple.png
Executable file
After Width: | Height: | Size: 817 B |
BIN
mods/default/textures/default_obsidian_glass_detail.png
Executable file
After Width: | Height: | Size: 1.1 KiB |
BIN
mods/default/textures/default_pine_tree.png
Executable file
After Width: | Height: | Size: 280 B |
BIN
mods/default/textures/default_pine_tree_top.png
Executable file
After Width: | Height: | Size: 574 B |
BIN
mods/default/textures/default_pine_wood.png
Executable file
After Width: | Height: | Size: 223 B |
161
mods/tsm_chests/init.lua
Normal file → Executable file
|
@ -78,42 +78,21 @@ minetest.register_node("tsm_chests:chest", {
|
|||
|
||||
--[[ here are some configuration variables ]]
|
||||
|
||||
local chests_per_chunk = 5 -- number of chests per chunk. 15 is a bit high, an actual mod might have a lower number
|
||||
local chests_per_chunk = 6 -- number of chests per chunk. 15 is a bit high, an actual mod might have a lower number
|
||||
local h_min = -1 -- minimum chest spawning height, relative to water_level
|
||||
local h_max = 15 -- maximum chest spawning height, relative to water_level
|
||||
local h_max = 64-43 -- maximum chest spawning height, relative to water_level
|
||||
local t_min = 3 -- minimum amount of treasures found in a chest
|
||||
local t_max = 6 -- maximum amount of treasures found in a chest
|
||||
|
||||
--[[ here comes the generation code
|
||||
the interesting part which involes treasurer comes way below
|
||||
]]
|
||||
minetest.register_on_generated(function(minp, maxp, seed)
|
||||
-- get the water level and convert it to a number
|
||||
local water_level = minetest.setting_get("water_level")
|
||||
if water_level == nil or type(water_level) ~= "number" then
|
||||
water_level = 1
|
||||
else
|
||||
water_level = tonumber(water_level)
|
||||
end
|
||||
local r_max = tonumber(minetest.setting_get("barrier"))
|
||||
local water_level = tonumber(minetest.setting_get("water_level"))
|
||||
local get_node = minetest.get_node
|
||||
local env = minetest.env
|
||||
|
||||
-- chests minimum and maximum spawn height
|
||||
local height_min = water_level + h_min
|
||||
local height_max = water_level + h_max
|
||||
|
||||
if(maxp.y < height_min or minp.y > height_max) then
|
||||
return
|
||||
end
|
||||
local y_min = math.max(minp.y, height_min)
|
||||
local y_max = math.min(maxp.y, height_max)
|
||||
local get_node = minetest.get_node
|
||||
local env = minetest.env
|
||||
for i=1, chests_per_chunk do
|
||||
local pos = {x=math.random(minp.x,maxp.x),z=math.random(minp.z,maxp.z), y=minp.y}
|
||||
|
||||
-- Find ground level
|
||||
local function findGroundLevel(pos, y_min, y_max)
|
||||
local ground = nil
|
||||
local top = y_max
|
||||
for y=y_max,y_min,-1 do
|
||||
for y = y_max, y_min, -1 do
|
||||
local p = {x=pos.x,y=y,z=pos.z}
|
||||
local name = get_node(p).name
|
||||
if name == "air" or name == "default:water_source" or name == "default:lava_source" then
|
||||
|
@ -129,79 +108,125 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||
break
|
||||
end
|
||||
end
|
||||
return ground
|
||||
end
|
||||
|
||||
if ground~=nil then
|
||||
local chest_pos = {x=pos.x,y=ground+1, z=pos.z}
|
||||
if chest_pos.z == 0 then
|
||||
chest_pos.z = -1
|
||||
end
|
||||
local nn = minetest.get_node(chest_pos).name -- chest node name (before it becomes a chest)
|
||||
if nn == "air" or nn == "default:water_source" then
|
||||
-->>>> chest spawning starts here <<<<--
|
||||
|
||||
-- first: spawn the chest
|
||||
local chest = {name = "tsm_chests:chest"}
|
||||
|
||||
local function getFacedirs(pos, ground)
|
||||
-- secondly: rotate the chest
|
||||
-- find possible faces
|
||||
local xp, xm, zp, zm
|
||||
xp = minetest.get_node({x=pos.x+1,y=ground+1, z=pos.z})
|
||||
xm = minetest.get_node({x=pos.x-1,y=ground+1, z=pos.z})
|
||||
zp = minetest.get_node({x=pos.x,y=ground+1, z=pos.z+1})
|
||||
zm = minetest.get_node({x=pos.x,y=ground+1, z=pos.z-1})
|
||||
xp = minetest.get_node({x=pos.x+1, y=ground+1, z=pos.z})
|
||||
xm = minetest.get_node({x=pos.x-1, y=ground+1, z=pos.z})
|
||||
zp = minetest.get_node({x=pos.x, y=ground+1, z=pos.z+1})
|
||||
zm = minetest.get_node({x=pos.x, y=ground+1, z=pos.z-1})
|
||||
|
||||
-- Set Facedirs
|
||||
local facedirs = {}
|
||||
if(xp.name=="air" or xp.name=="default:water_source") then
|
||||
if xp.name=="air" or xp.name=="default:water_source" then
|
||||
table.insert(facedirs, minetest.dir_to_facedir({x=-1,y=0,z=0}))
|
||||
end
|
||||
if(xm.name=="air" or xm.name=="default:water_source") then
|
||||
|
||||
if xm.name=="air" or xm.name=="default:water_source" then
|
||||
table.insert(facedirs, minetest.dir_to_facedir({x=1,y=0,z=0}))
|
||||
end
|
||||
if(zp.name=="air" or zp.name=="default:water_source") then
|
||||
if zp.name=="air" or zp.name=="default:water_source" then
|
||||
table.insert(facedirs, minetest.dir_to_facedir({x=0,y=0,z=-1}))
|
||||
end
|
||||
if(zm.name=="air" or zm.name=="default:water_source") then
|
||||
if zm.name=="air" or zm.name=="default:water_source" then
|
||||
table.insert(facedirs, minetest.dir_to_facedir({x=0,y=0,z=1}))
|
||||
end
|
||||
|
||||
return facedirs
|
||||
end
|
||||
|
||||
local function placeChest(pos, chest_pos, ground, nn)
|
||||
local chest = {name = "tsm_chests:chest"}
|
||||
local facedirs = getFacedirs(pos, ground)
|
||||
|
||||
-- choose a random face (if possible)
|
||||
if(#facedirs == 0) then
|
||||
minetest.set_node({x=pos.x,y=ground+1, z=pos.z+1},{name=nn})
|
||||
if #facedirs == 0 then
|
||||
minetest.set_node({x=pos.x,y=ground+1, z=pos.z+1}, {name=nn})
|
||||
chest.param2 = minetest.dir_to_facedir({x=0,y=0,z=1})
|
||||
else
|
||||
chest.param2 = facedirs[math.floor(math.random(#facedirs))]
|
||||
end
|
||||
|
||||
-- Lastly: place the chest
|
||||
minetest.set_node(chest_pos,chest)
|
||||
--minetest.chat_send_all("Placed chest! " .. dump(chest_pos))
|
||||
minetest.set_node(chest_pos, chest)
|
||||
|
||||
--->>>>>>>>>> At this point we are finally going to involve Treasurer. <<<<<<<<<<<<<<--
|
||||
-- determine a random amount of treasures
|
||||
-- Get treasure
|
||||
local treasure_amount = math.ceil(math.random(t_min, t_max))
|
||||
|
||||
-- calculate preciousness of treasures based on height. higher = more precious
|
||||
local height = math.abs(h_min) - math.abs(h_max)
|
||||
local y_norm = (ground+1) - h_min
|
||||
local scale = 1 - (y_norm/height)
|
||||
local minp = 0 --scale*4 -- minimal preciousness: 0..4
|
||||
local maxp = 10 --scale*4+2.1 -- maximum preciousness: 2.1..6.1
|
||||
local treasures = treasurer.select_random_treasures(treasure_amount, minp, maxp)
|
||||
|
||||
-- now use these values to finally request the treasure(s)
|
||||
local treasures = treasurer.select_random_treasures(treasure_amount,minp,maxp)
|
||||
-- That’s it!
|
||||
|
||||
-- Get the inventory of the chest to place the treasures in
|
||||
-- Add Treasure to Chst
|
||||
local meta = minetest.get_meta(chest_pos)
|
||||
local inv = meta:get_inventory()
|
||||
for i=1, #treasures do
|
||||
inv:set_stack("main", i, treasures[i])
|
||||
end
|
||||
end
|
||||
|
||||
--[[ Now that we got both our treasures and the chest’s inventory,
|
||||
let’s place the treasures one for one into it. ]]
|
||||
for i=1,#treasures do
|
||||
inv:set_stack("main",i,treasures[i])
|
||||
end
|
||||
--[[ here comes the generation code
|
||||
the interesting part which involes treasurer comes way below
|
||||
]]
|
||||
minetest.register_on_generated(function(minp, maxp, seed)
|
||||
minp = {x=minp.x, y=minp.y, z=minp.z}
|
||||
maxp = {x=maxp.x, y=maxp.y, z=maxp.z}
|
||||
|
||||
if minp.x <= -r_max then
|
||||
minp.x = -r_max + 1
|
||||
end
|
||||
if minp.z <= -r_max then
|
||||
minp.z = -r_max + 1
|
||||
end
|
||||
if minp.x >= r_max then
|
||||
minp.x = r_max - 1
|
||||
end
|
||||
if minp.z >= r_max then
|
||||
minp.z = r_max - 1
|
||||
end
|
||||
|
||||
-- chests minimum and maximum spawn height
|
||||
local height_min = water_level + h_min
|
||||
local height_max = water_level + h_max
|
||||
|
||||
if(maxp.y < height_min or minp.y > height_max) then
|
||||
return
|
||||
end
|
||||
local y_min = math.max(minp.y, height_min)
|
||||
local y_max = math.min(maxp.y, height_max)
|
||||
local attempts = 0
|
||||
local chests_placed = 0
|
||||
while chests_placed < chests_per_chunk and attempts < chests_per_chunk + 6 do
|
||||
attempts = attempts + 1
|
||||
local pos = {
|
||||
x = math.random(minp.x, maxp.x),
|
||||
y = minp.y,
|
||||
z = math.random(minp.z, maxp.z)
|
||||
}
|
||||
|
||||
-- Find ground level
|
||||
local ground = findGroundLevel(pos, y_min, y_max)
|
||||
if ground ~= nil then
|
||||
local chest_pos = {x = pos.x, y = ground + 1, z = pos.z}
|
||||
|
||||
-- Don't spawn at barrier
|
||||
if chest_pos.z == 0 then
|
||||
chest_pos.z = -1
|
||||
end
|
||||
|
||||
local nn = minetest.get_node(chest_pos).name -- chest node name (before it becomes a chest)
|
||||
if nn == "air" or nn == "default:water_source" then
|
||||
placeChest(pos, chest_pos, ground, nn)
|
||||
|
||||
chests_placed = chests_placed + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
print("Spawned " .. chests_placed .. " chests after " .. attempts .. " attempts!")
|
||||
end)
|
||||
|
|