From f1f11cd546b51dfaf3494bbb8136a809e547a598 Mon Sep 17 00:00:00 2001 From: Mat Date: Fri, 25 Jul 2014 23:02:09 +0100 Subject: [PATCH] Function to spawn players at surface and scattered --- README.txt | 2 +- functions.lua | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++ init.lua | 18 +++---- 3 files changed, 150 insertions(+), 13 deletions(-) diff --git a/README.txt b/README.txt index 65d98d6..772d645 100644 --- a/README.txt +++ b/README.txt @@ -1,4 +1,4 @@ -riverdev 0.4.5 by paramat +riverdev 0.4.6 by paramat For latest stable Minetest back to 0.4.8 Depends default Licenses: code WTFPL diff --git a/functions.lua b/functions.lua index ea68c39..1da6aa3 100644 --- a/functions.lua +++ b/functions.lua @@ -158,3 +158,146 @@ minetest.register_abm({ end, }) +-- Set mapgen parameters + +minetest.register_on_mapgen_init(function(mgparams) + minetest.set_mapgen_params({mgname="singlenode"}) +end) + +-- Spawn player. Only works with chunksize = 5 mapblocks + +function spawnplayer(player) + local PSCA = 16 -- Player scatter. Maximum distance in chunks (80 nodes) of player spawn from (0, 0, 0) + local YWATER = 1 + local YTER = -64 -- Deepest seabed y + local TERSCA = 512 -- Terrain vertical scale in nodes + local BASAMP = 0.3 -- Base amplitude relative to 3D noise amplitude. Ridge network structure + local MIDAMP = 0.05 -- Mid amplitude relative to 3D noise amplitude. River valley structure + + local np_terrain = { + offset = 0, + scale = 1, + spread = {x=192, y=192, z=192}, + seed = 5900033, + octaves = 4, + persist = 0.67 + } + local np_mid = { + offset = 0, + scale = 1, + spread = {x=768, y=768, z=768}, + seed = 85546, + octaves = 5, + persist = 0.4 + } + local np_base = { + offset = 0, + scale = 1, + spread = {x=3072, y=3072, z=3072}, + seed = -990054, + octaves = 2, + persist = 0.4 + } + local np_patha = { + offset = 0, + scale = 1, + spread = {x=768, y=768, z=768}, + seed = 7000023, + octaves = 4, + persist = 0.4 + } + local np_pathb = { + offset = 0, + scale = 1, + spread = {x=768, y=768, z=768}, + seed = 23, + octaves = 4, + persist = 0.4 + } + + local xsp + local ysp + local zsp + for chunk = 1, 128 do + print ("[riverdev] searching for spawn "..chunk) + local x0 = 80 * math.random(-PSCA, PSCA) - 32 + local z0 = 80 * math.random(-PSCA, PSCA) - 32 + local y0 = 80 * math.floor((YWATER + 32) / 80) - 32 + local x1 = x0 + 79 + local z1 = z0 + 79 + local y1 = y0 + 79 + + local sidelen = 80 + local chulensxyz = {x=sidelen, y=sidelen, z=sidelen} + local minposxyz = {x=x0, y=y0, z=z0} + local chulensxz = {x=sidelen, y=sidelen, z=sidelen} + local minposxz = {x=x0, y=z0} + + local nvals_terrain = minetest.get_perlin_map(np_terrain, chulensxyz):get3dMap_flat(minposxyz) + + local nvals_mid = minetest.get_perlin_map(np_mid, chulensxz):get2dMap_flat(minposxz) + local nvals_base = minetest.get_perlin_map(np_base, chulensxz):get2dMap_flat(minposxz) + local nvals_patha = minetest.get_perlin_map(np_patha, chulensxz):get2dMap_flat(minposxz) + local nvals_pathb = minetest.get_perlin_map(np_pathb, chulensxz):get2dMap_flat(minposxz) + + local nixyz = 1 + local nixz = 1 + for z = z0, z1 do + for y = y0, y1 do + for x = x0, x1 do + local n_patha = nvals_patha[nixz] + local n_abspatha = math.abs(n_patha) + local n_pathb = nvals_pathb[nixz] + local n_abspathb = math.abs(n_pathb) + + local n_terrain = (nvals_terrain[nixyz] + 2) / 2 + local n_absmid = (math.abs(nvals_mid[nixz])) ^ 0.8 + local n_absbase = (math.abs(nvals_base[nixz])) ^ 0.8 + + local n_invbase = (1 - n_absbase) + local grad = (YTER - y) / TERSCA + local densitybase = n_invbase * BASAMP + grad + local densitymid = n_absmid * MIDAMP + densitybase + local density = n_terrain * n_invbase * n_absmid * n_abspatha ^ 1.5 * n_abspathb ^ 1.5 + densitymid + + if y >= YWATER and density > -0.01 and density < 0 then + ysp = y + 1 + xsp = x + zsp = z + break + end + nixz = nixz + 1 + nixyz = nixyz + 1 + end + if ysp then + break + end + nixz = nixz - 80 + end + if ysp then + break + end + nixz = nixz + 80 + end + if ysp then + break + end + end + if ysp then + print ("[riverdev] spawn player ("..xsp.." "..ysp.." "..zsp..")") + player:setpos({x=xsp, y=ysp, z=zsp}) + else + print ("[riverdev] no suitable spawn found") + player:setpos({x=0, y=0, z=0}) + end +end + +minetest.register_on_newplayer(function(player) + spawnplayer(player) +end) + +minetest.register_on_respawnplayer(function(player) + spawnplayer(player) + return true +end) + diff --git a/init.lua b/init.lua index fa2ff0a..9dce9dd 100644 --- a/init.lua +++ b/init.lua @@ -1,12 +1,9 @@ --- riverdev 0.4.5 by paramat +-- riverdev 0.4.6 by paramat -- For latest stable Minetest and back to 0.4.8 -- Depends default -- License: code WTFPL --- overlen variable --- remove autumn trees --- remove freshwater bucket --- remove unused schem folder +-- spawnplayer function -- Parameters @@ -137,10 +134,6 @@ riverdev = {} dofile(minetest.get_modpath("riverdev").."/functions.lua") dofile(minetest.get_modpath("riverdev").."/nodes.lua") -minetest.register_on_mapgen_init(function(mgparams) - minetest.set_mapgen_params({mgname="singlenode"}) -end) - -- On generated function minetest.register_on_generated(function(minp, maxp, seed) @@ -184,9 +177,10 @@ minetest.register_on_generated(function(minp, maxp, seed) local c_freshwaterflow = minetest.get_content_id("riverdev:freshwaterflow") local c_mixwaterflow = minetest.get_content_id("riverdev:mixwaterflow") - local sidelen = x1 - x0 + 1 -- chunk sidelen - local overlen = sidelen + 1 -- overgeneration sidelen - local emerlen = sidelen + 32 -- voxelmanip emerged area sidelen + local sidelen = x1 - x0 + 1 -- mapgen chunk side length + local overlen = sidelen + 1 -- perlinmap overgeneration horizontal side length + local emerlen = sidelen + 32 -- voxelmanip emerged volume edge length + --local emerarea = emerlen ^ 2 -- voxelmanip emerged volume face area local chulensxyz = {x=overlen, y=sidelen+2, z=overlen} local minposxyz = {x=x0-1, y=y0-1, z=z0-1} local chulensxz = {x=overlen, y=overlen, z=sidelen} -- different because here x=x, y=z