forked from luanti-org/minetest_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