forked from nalc/nalc_game
		
	Add 'spawn' mod to spawn new players in suitable starting biomes (#2091)
Disabled in mgv6 and singlenode mapgens, by setting, or if 'static_spawnpoint' is set. Cleanup format of minetest.conf.example.
This commit is contained in:
		@@ -1,18 +1,21 @@
 | 
			
		||||
# This file contains settings of Minetest Game that can be changed in minetest.conf
 | 
			
		||||
# This file contains settings of Minetest Game that can be changed in
 | 
			
		||||
# minetest.conf.
 | 
			
		||||
# By default, all the settings are commented and not functional.
 | 
			
		||||
# Uncomment settings by removing the preceding #.
 | 
			
		||||
 | 
			
		||||
# Whether creative mode (fast digging of all blocks, unlimited resources) should be enabled
 | 
			
		||||
# Whether creative mode (fast digging of all blocks, unlimited resources) should
 | 
			
		||||
# be enabled.
 | 
			
		||||
#creative_mode = false
 | 
			
		||||
 | 
			
		||||
# Sets the behaviour of the inventory items when a player dies.
 | 
			
		||||
#  "bones": Store all items inside a bone node but drop items if inside protected area
 | 
			
		||||
#  "drop": Drop all items on the ground
 | 
			
		||||
#  "keep": Player keeps all items
 | 
			
		||||
#  "bones": Store items in a bone node but drop items if inside protected area.
 | 
			
		||||
#  "drop": Drop items on the ground.
 | 
			
		||||
#  "keep": Player keeps items.
 | 
			
		||||
#bones_mode = "bones"
 | 
			
		||||
 | 
			
		||||
# The time in seconds after which the bones of a dead player can be looted by everyone
 | 
			
		||||
# 0 to disable
 | 
			
		||||
# The time in seconds after which the bones of a dead player can be looted by
 | 
			
		||||
# everyone.
 | 
			
		||||
# 0 to disable.
 | 
			
		||||
#share_bones_time = 1200
 | 
			
		||||
 | 
			
		||||
# How much earlier the bones of a dead player can be looted by
 | 
			
		||||
@@ -20,8 +23,9 @@
 | 
			
		||||
# 0 to disable. By default it is "share_bones_time" divide by four.
 | 
			
		||||
#share_bones_time_early = 300
 | 
			
		||||
 | 
			
		||||
# Whether fire should be enabled. If disabled, 'basic flame' nodes will disappear.
 | 
			
		||||
# 'permanent flame' nodes will remain with either setting.
 | 
			
		||||
# Whether fire should be enabled. If disabled, 'basic_flame' nodes will
 | 
			
		||||
# disappear.
 | 
			
		||||
# 'permanent_flame' nodes will remain with either setting.
 | 
			
		||||
#enable_fire = true
 | 
			
		||||
 | 
			
		||||
# Enable flame sound.
 | 
			
		||||
@@ -30,24 +34,30 @@
 | 
			
		||||
# Whether lavacooling should be enabled.
 | 
			
		||||
#enable_lavacooling = true
 | 
			
		||||
 | 
			
		||||
# Whether the stuff in initial_stuff should be given to new players
 | 
			
		||||
# Whether the stuff in initial_stuff should be given to new players.
 | 
			
		||||
#give_initial_stuff = false
 | 
			
		||||
#initial_stuff = default:pick_steel,default:axe_steel,default:shovel_steel,default:torch 99,default:cobble 99
 | 
			
		||||
#initial_stuff = default:pick_steel,default:axe_steel,default:shovel_steel,
 | 
			
		||||
default:torch 99,default:cobble 99
 | 
			
		||||
 | 
			
		||||
# Whether the TNT mod should be enabled
 | 
			
		||||
# Whether the TNT mod should be enabled.
 | 
			
		||||
#enable_tnt = <true in singleplayer, false in multiplayer>
 | 
			
		||||
 | 
			
		||||
# The radius of a TNT explosion
 | 
			
		||||
# The radius of a TNT explosion.
 | 
			
		||||
#tnt_radius = 3
 | 
			
		||||
 | 
			
		||||
# Enable the stairs mod ABM that replaces the old 'upside down'
 | 
			
		||||
# stair and slab nodes in old maps with the new param2 versions.
 | 
			
		||||
#enable_stairs_replace_abm = false
 | 
			
		||||
 | 
			
		||||
# Whether you allow respawning in beds
 | 
			
		||||
# Default value is true
 | 
			
		||||
# Whether to allow respawning in beds.
 | 
			
		||||
# Default value is true.
 | 
			
		||||
#enable_bed_respawn = true
 | 
			
		||||
 | 
			
		||||
# Whether players can skip night by sleeping
 | 
			
		||||
# Default value is true
 | 
			
		||||
# Whether players can skip night by sleeping.
 | 
			
		||||
# Default value is true.
 | 
			
		||||
#enable_bed_night_skip = true
 | 
			
		||||
 | 
			
		||||
# Whether the engine's spawn search, which does not check for a suitable
 | 
			
		||||
# starting biome, is used.
 | 
			
		||||
# Default value is false.
 | 
			
		||||
#engine_spawn = false
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								mods/spawn/README.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								mods/spawn/README.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
Minetest Game mod: spawn
 | 
			
		||||
========================
 | 
			
		||||
See license.txt for license information.
 | 
			
		||||
 | 
			
		||||
Authors of source code
 | 
			
		||||
----------------------
 | 
			
		||||
paramat (MIT)
 | 
			
		||||
							
								
								
									
										1
									
								
								mods/spawn/depends.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								mods/spawn/depends.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
default
 | 
			
		||||
							
								
								
									
										124
									
								
								mods/spawn/init.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								mods/spawn/init.lua
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,124 @@
 | 
			
		||||
-- Disable by mapgen, setting or if 'static_spawnpoint' is set
 | 
			
		||||
--------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
local mg_name = minetest.get_mapgen_setting("mg_name")
 | 
			
		||||
if mg_name == "v6" or mg_name == "singlenode" or
 | 
			
		||||
		minetest.settings:get("static_spawnpoint") or
 | 
			
		||||
		minetest.settings:get_bool("engine_spawn") then
 | 
			
		||||
	return
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Parameters
 | 
			
		||||
-------------
 | 
			
		||||
 | 
			
		||||
-- Resolution of search grid in nodes.
 | 
			
		||||
local res = 64
 | 
			
		||||
-- Number of points checked in the square search grid (edge * edge).
 | 
			
		||||
local checks = 128 * 128
 | 
			
		||||
-- Starting point for biome checks. This also sets the y co-ordinate for all
 | 
			
		||||
-- points checked, so the suitable biomes must be active at this y.
 | 
			
		||||
local pos = {x = 0, y = 8, z = 0}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Table of suitable biomes
 | 
			
		||||
 | 
			
		||||
local biome_ids = {
 | 
			
		||||
	minetest.get_biome_id("taiga"),
 | 
			
		||||
	minetest.get_biome_id("coniferous_forest"),
 | 
			
		||||
	minetest.get_biome_id("deciduous_forest"),
 | 
			
		||||
	minetest.get_biome_id("grassland"),
 | 
			
		||||
	minetest.get_biome_id("savanna"),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
-- End of parameters
 | 
			
		||||
--------------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Direction table
 | 
			
		||||
 | 
			
		||||
local dirs = {
 | 
			
		||||
	{x = 0, y = 0, z = 1},
 | 
			
		||||
	{x = -1, y = 0, z = 0},
 | 
			
		||||
	{x = 0, y = 0, z = -1},
 | 
			
		||||
	{x = 1, y = 0, z = 0},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Initial variables
 | 
			
		||||
 | 
			
		||||
local edge_len = 1
 | 
			
		||||
local edge_dist = 0
 | 
			
		||||
local dir_step = 0
 | 
			
		||||
local dir_ind = 1
 | 
			
		||||
local searched = false
 | 
			
		||||
local success = false
 | 
			
		||||
local spawn_pos = {}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
--Functions
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
-- Get next position on square search spiral
 | 
			
		||||
 | 
			
		||||
local function next_pos()
 | 
			
		||||
	if edge_dist == edge_len then
 | 
			
		||||
		edge_dist = 0
 | 
			
		||||
		dir_ind = dir_ind + 1
 | 
			
		||||
		if dir_ind == 5 then
 | 
			
		||||
			dir_ind = 1
 | 
			
		||||
		end
 | 
			
		||||
		dir_step = dir_step + 1
 | 
			
		||||
		edge_len = math.floor(dir_step / 2) + 1
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local dir = dirs[dir_ind]
 | 
			
		||||
	local move = vector.multiply(dir, res)
 | 
			
		||||
 | 
			
		||||
	edge_dist = edge_dist + 1
 | 
			
		||||
 | 
			
		||||
	return vector.add(pos, move)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Spawn position search
 | 
			
		||||
 | 
			
		||||
local function search()
 | 
			
		||||
	for iter = 1, checks do
 | 
			
		||||
		local biome_data = minetest.get_biome_data(pos)
 | 
			
		||||
		-- Sometimes biome_data is nil
 | 
			
		||||
		local biome = biome_data and biome_data.biome
 | 
			
		||||
		for id_ind = 1, #biome_ids do
 | 
			
		||||
			local biome_id = biome_ids[id_ind]
 | 
			
		||||
			if biome == biome_id then
 | 
			
		||||
				local spawn_y = minetest.get_spawn_level(pos.x, pos.z)
 | 
			
		||||
				if spawn_y then
 | 
			
		||||
					spawn_pos = {x = pos.x, y = spawn_y, z = pos.z}
 | 
			
		||||
					return true
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		pos = next_pos()
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- On new player spawn
 | 
			
		||||
 | 
			
		||||
-- Search for new player spawn once per server session. If successful, store
 | 
			
		||||
-- position and reposition new players, otherwise leave them at engine spawn
 | 
			
		||||
-- position.
 | 
			
		||||
 | 
			
		||||
minetest.register_on_newplayer(function(player)
 | 
			
		||||
	if not searched then
 | 
			
		||||
		success = search()
 | 
			
		||||
		searched = true
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	if success then
 | 
			
		||||
		player:setpos(spawn_pos)
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
							
								
								
									
										24
									
								
								mods/spawn/license.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								mods/spawn/license.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
License of source code
 | 
			
		||||
----------------------
 | 
			
		||||
 | 
			
		||||
The MIT License (MIT)
 | 
			
		||||
Copyright (C) 2018 paramat
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
 | 
			
		||||
software and associated documentation files (the "Software"), to deal in the Software
 | 
			
		||||
without restriction, including without limitation the rights to use, copy, modify, merge,
 | 
			
		||||
publish, distribute, sublicense, and/or sell copies of the Software, and to permit
 | 
			
		||||
persons to whom the Software is furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in all copies or
 | 
			
		||||
substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 | 
			
		||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 | 
			
		||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
 | 
			
		||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 | 
			
		||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
			
		||||
DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 | 
			
		||||
For more details:
 | 
			
		||||
https://opensource.org/licenses/MIT
 | 
			
		||||
@@ -46,3 +46,7 @@ share_bones_time (Bone share time) int 1200 0
 | 
			
		||||
 | 
			
		||||
#    Replaces old stairs with new ones. Only required for older worlds.
 | 
			
		||||
enable_stairs_replace_abm (Replace old stairs) bool false
 | 
			
		||||
 | 
			
		||||
#    If enabled, use the engine's spawn search which does not check for a
 | 
			
		||||
#    suitable starting biome.
 | 
			
		||||
engine_spawn (Use engine spawn search) bool false
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user