From fcb0537b32897a64624f28fdff54aef320ce58e0 Mon Sep 17 00:00:00 2001 From: paramat Date: Sat, 15 Apr 2017 23:24:14 +0100 Subject: [PATCH] Disable under a y limit set by parameter, usually set to a world's water level --- init.lua | 235 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 121 insertions(+), 114 deletions(-) diff --git a/init.lua b/init.lua index d75e84b..9f6f305 100644 --- a/init.lua +++ b/init.lua @@ -1,5 +1,7 @@ -- Parameters +local YLIMIT = 1 -- Set to world's water level or level of lowest open area, + -- calculations are disabled below this y. local PRECSPR = 6 -- Time scale for precipitation variation in minutes local PRECOFF = -0.4 -- Precipitation offset, higher = rains more often local GSCYCLE = 0.5 -- Globalstep cycle (seconds) @@ -75,137 +77,142 @@ minetest.register_globalstep(function(dtime) for _, player in ipairs(minetest.get_connected_players()) do local player_name = player:get_player_name() - local ppos = player:getpos() - local pposx = math.floor(ppos.x) local pposy = math.floor(ppos.y) + 2 -- Precipitation when swimming - local pposz = math.floor(ppos.z) - local ppos = {x = pposx, y = pposy, z = pposz} + if pposy >= YLIMIT then + local pposx = math.floor(ppos.x) + local pposz = math.floor(ppos.z) + local ppos = {x = pposx, y = pposy, z = pposz} - local nobj_temp = nobj_temp or minetest.get_perlin(np_temp) - local nobj_humid = nobj_humid or minetest.get_perlin(np_humid) - local nobj_prec = nobj_prec or minetest.get_perlin(np_prec) + local nobj_temp = nobj_temp or minetest.get_perlin(np_temp) + local nobj_humid = nobj_humid or minetest.get_perlin(np_humid) + local nobj_prec = nobj_prec or minetest.get_perlin(np_prec) - local nval_temp = nobj_temp:get2d({x = pposx, y = pposz}) - local nval_humid = nobj_humid:get2d({x = pposx, y = pposz}) - local nval_prec = nobj_prec:get2d({x = os.clock() / 60, y = 0}) + local nval_temp = nobj_temp:get2d({x = pposx, y = pposz}) + local nval_humid = nobj_humid:get2d({x = pposx, y = pposz}) + local nval_prec = nobj_prec:get2d({x = os.clock() / 60, y = 0}) - -- Biome system: Frozen biomes below heat 35, - -- deserts below line 14 * t - 95 * h = -1496 - -- h = (14 * t + 1496) / 95 - -- h = 14/95 * t + 1496/95 - -- where 14/95 is gradient and 1496/95 is y intersection - -- h - 14/95 t = 1496/95 y intersection - -- so area above line is - -- h - 14/95 t > 1496/95 - local freeze = nval_temp < 35 - local precip = nval_prec < (nval_humid - 50) / 50 + PRECOFF and - nval_humid - grad * nval_temp > yint + -- Biome system: Frozen biomes below heat 35, + -- deserts below line 14 * t - 95 * h = -1496 + -- h = (14 * t + 1496) / 95 + -- h = 14/95 * t + 1496/95 + -- where 14/95 is gradient and 1496/95 is y intersection + -- h - 14/95 t = 1496/95 y intersection + -- so area above line is + -- h - 14/95 t > 1496/95 + local freeze = nval_temp < 35 + local precip = nval_prec < (nval_humid - 50) / 50 + PRECOFF and + nval_humid - grad * nval_temp > yint - -- Check if player is outside - local outside = minetest.get_node_light(ppos, 0.5) == 15 + -- Check if player is outside + local outside = minetest.get_node_light(ppos, 0.5) == 15 - -- Occasionally reset player sky - if math.random() < 0.1 then - if precip then - -- Set overcast sky - local sval - local time = minetest.get_timeofday() - if time >= 0.5 then - time = 1 - time - end - -- Sky brightness transitions: - -- First transition (24000 -) 4500, (1 -) 0.1875 - -- Last transition (24000 -) 5750, (1 -) 0.2396 - if time <= 0.1875 then - sval = NISVAL - elseif time >= 0.2396 then - sval = DASVAL + -- Occasionally reset player sky + if math.random() < 0.1 then + if precip then + -- Set overcast sky + local sval + local time = minetest.get_timeofday() + if time >= 0.5 then + time = 1 - time + end + -- Sky brightness transitions: + -- First transition (24000 -) 4500, (1 -) 0.1875 + -- Last transition (24000 -) 5750, (1 -) 0.2396 + if time <= 0.1875 then + sval = NISVAL + elseif time >= 0.2396 then + sval = DASVAL + else + sval = math.floor(NISVAL + ((time - 0.1875) / 0.0521) * difsval) + end + + player:set_sky({r = sval, g = sval, b = sval + 16, a = 255}, "plain", {}) else - sval = math.floor(NISVAL + ((time - 0.1875) / 0.0521) * difsval) + -- Reset sky to normal + player:set_sky({}, "regular", {}) end - - player:set_sky({r = sval, g = sval, b = sval + 16, a = 255}, "plain", {}) - else - -- Reset sky to normal - player:set_sky({}, "regular", {}) end - end - if not precip or not outside or freeze then - if handles[player_name] then - -- Stop sound if playing - minetest.sound_stop(handles[player_name]) - handles[player_name] = nil + if not precip or not outside or freeze then + if handles[player_name] then + -- Stop sound if playing + minetest.sound_stop(handles[player_name]) + handles[player_name] = nil + end end - end - if precip and outside then - -- Precipitation - if freeze then - -- Snowfall - for flake = 1, FLAKES do - minetest.add_particle({ - pos = { - x = pposx - 24 + math.random(0, 47), - y = pposy + 8 + math.random(0, 1), - z = pposz - 20 + math.random(0, 47) - }, - vel = { - x = 0.0, - y = -2.0, - z = -1.0 - }, - acc = {x = 0, y = 0, z = 0}, - expirationtime = 8.5, - size = 2.8, - collisiondetection = COLLIDE, - collision_removal = true, - vertical = false, - texture = "snowdrift_snowflake" .. math.random(1, 4) .. ".png", - playername = player:get_player_name() - }) - end - else - -- Rainfall - for flake = 1, DROPS do - minetest.add_particle({ - pos = { - x = pposx - 8 + math.random(0, 16), - y = pposy + 8 + math.random(0, 5), - z = pposz - 8 + math.random(0, 16) - }, - vel = { - x = 0.0, - y = -10.0, - z = 0.0 - }, - acc = {x = 0, y = 0, z = 0}, - expirationtime = 2.1, - size = 2.8, - collisiondetection = COLLIDE, - collision_removal = true, - vertical = true, - texture = "snowdrift_raindrop.png", - playername = player:get_player_name() - }) - end + if precip and outside then + -- Precipitation + if freeze then + -- Snowfall + for flake = 1, FLAKES do + minetest.add_particle({ + pos = { + x = pposx - 24 + math.random(0, 47), + y = pposy + 8 + math.random(0, 1), + z = pposz - 20 + math.random(0, 47) + }, + vel = { + x = 0.0, + y = -2.0, + z = -1.0 + }, + acc = {x = 0, y = 0, z = 0}, + expirationtime = 8.5, + size = 2.8, + collisiondetection = COLLIDE, + collision_removal = true, + vertical = false, + texture = "snowdrift_snowflake" .. math.random(1, 4) .. ".png", + playername = player:get_player_name() + }) + end + else + -- Rainfall + for flake = 1, DROPS do + minetest.add_particle({ + pos = { + x = pposx - 8 + math.random(0, 16), + y = pposy + 8 + math.random(0, 5), + z = pposz - 8 + math.random(0, 16) + }, + vel = { + x = 0.0, + y = -10.0, + z = 0.0 + }, + acc = {x = 0, y = 0, z = 0}, + expirationtime = 2.1, + size = 2.8, + collisiondetection = COLLIDE, + collision_removal = true, + vertical = true, + texture = "snowdrift_raindrop.png", + playername = player:get_player_name() + }) + end - if not handles[player_name] then - -- Start sound if not playing - local handle = minetest.sound_play( - "snowdrift_rain", - { - to_player = player_name, - gain = RAINGAIN, - loop = true, - } - ) - if handle then - handles[player_name] = handle + if not handles[player_name] then + -- Start sound if not playing + local handle = minetest.sound_play( + "snowdrift_rain", + { + to_player = player_name, + gain = RAINGAIN, + loop = true, + } + ) + if handle then + handles[player_name] = handle + end end end end + elseif handles[player_name] then + -- Stop sound when player goes under y limit + minetest.sound_stop(handles[player_name]) + handles[player_name] = nil end end end)