1 -- Disable by mapgen, setting or if 'static_spawnpoint' is set
2 --------------------------------------------------------------
4 local mg_name = minetest.get_mapgen_setting("mg_name")
5 if mg_name == "v6" or mg_name == "singlenode" or
6 minetest.settings:get("static_spawnpoint") or
7 minetest.settings:get_bool("engine_spawn") then
15 -- Resolution of search grid in nodes.
17 -- Number of points checked in the square search grid (edge * edge).
18 local checks = 128 * 128
19 -- Starting point for biome checks. This also sets the y co-ordinate for all
20 -- points checked, so the suitable biomes must be active at this y.
21 local pos = {x = 0, y = 8, z = 0}
24 -- Table of suitable biomes
27 minetest.get_biome_id("taiga"),
28 minetest.get_biome_id("coniferous_forest"),
29 minetest.get_biome_id("deciduous_forest"),
30 minetest.get_biome_id("grassland"),
31 minetest.get_biome_id("savanna"),
41 {x = 0, y = 0, z = 1},
42 {x = -1, y = 0, z = 0},
43 {x = 0, y = 0, z = -1},
44 {x = 1, y = 0, z = 0},
54 local searched = false
62 -- Get next position on square search spiral
64 local function next_pos()
65 if edge_dist == edge_len then
71 dir_step = dir_step + 1
72 edge_len = math.floor(dir_step / 2) + 1
75 local dir = dirs[dir_ind]
76 local move = vector.multiply(dir, res)
78 edge_dist = edge_dist + 1
80 return vector.add(pos, move)
84 -- Spawn position search
86 local function search()
87 for iter = 1, checks do
88 local biome_data = minetest.get_biome_data(pos)
89 -- Sometimes biome_data is nil
90 local biome = biome_data and biome_data.biome
91 for id_ind = 1, #biome_ids do
92 local biome_id = biome_ids[id_ind]
93 if biome == biome_id then
94 local spawn_y = minetest.get_spawn_level(pos.x, pos.z)
96 spawn_pos = {x = pos.x, y = spawn_y, z = pos.z}
109 -- On new player spawn and player respawn
111 -- Search for spawn position once per server session. If successful, store
112 -- position and reposition players, otherwise leave them at engine spawn
115 local function on_spawn(player)
121 player:set_pos(spawn_pos)
125 minetest.register_on_newplayer(function(player)
129 local enable_bed_respawn = minetest.settings:get_bool("enable_bed_respawn")
130 if enable_bed_respawn == nil then
131 enable_bed_respawn = true
134 minetest.register_on_respawnplayer(function(player)
135 -- Avoid respawn conflict with beds mod
136 if beds and enable_bed_respawn and
137 beds.spawn[player:get_player_name()] then