Add initial 'weather' mod to vary cloud density, thickness, velocity
This commit is contained in:
		
							parent
							
								
									ef7df329d2
								
							
						
					
					
						commit
						7c1fd9c24e
					
				| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
Minetest Game mod: weather
 | 
			
		||||
==========================
 | 
			
		||||
See license.txt for license information.
 | 
			
		||||
Source code by paramat (MIT).
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,116 @@
 | 
			
		|||
-- Disable by mapgen or setting
 | 
			
		||||
 | 
			
		||||
local mg_name = minetest.get_mapgen_setting("mg_name")
 | 
			
		||||
if mg_name == "v6" or mg_name == "singlenode" or
 | 
			
		||||
		minetest.settings:get_bool("enable_weather") == false then
 | 
			
		||||
	return
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Parameters
 | 
			
		||||
 | 
			
		||||
local TSCALE = 600 -- Time scale of noise variation in seconds
 | 
			
		||||
local CYCLE = 8 -- Time period of cyclic clouds update in seconds
 | 
			
		||||
 | 
			
		||||
local np_density = {
 | 
			
		||||
	offset = 0.5,
 | 
			
		||||
	scale = 0.5,
 | 
			
		||||
	spread = {x = TSCALE, y = TSCALE, z = TSCALE},
 | 
			
		||||
	seed = 813,
 | 
			
		||||
	octaves = 1,
 | 
			
		||||
	persist = 0,
 | 
			
		||||
	lacunarity = 2,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local np_thickness = {
 | 
			
		||||
	offset = 0.5,
 | 
			
		||||
	scale = 0.5,
 | 
			
		||||
	spread = {x = TSCALE, y = TSCALE, z = TSCALE},
 | 
			
		||||
	seed = 96,
 | 
			
		||||
	octaves = 1,
 | 
			
		||||
	persist = 0,
 | 
			
		||||
	lacunarity = 2,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local np_speedx = {
 | 
			
		||||
	offset = 0,
 | 
			
		||||
	scale = 1,
 | 
			
		||||
	spread = {x = TSCALE, y = TSCALE, z = TSCALE},
 | 
			
		||||
	seed = 911923,
 | 
			
		||||
	octaves = 1,
 | 
			
		||||
	persist = 0,
 | 
			
		||||
	lacunarity = 2,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local np_speedz = {
 | 
			
		||||
	offset = 0,
 | 
			
		||||
	scale = 1,
 | 
			
		||||
	spread = {x = TSCALE, y = TSCALE, z = TSCALE},
 | 
			
		||||
	seed = 5728,
 | 
			
		||||
	octaves = 1,
 | 
			
		||||
	persist = 0,
 | 
			
		||||
	lacunarity = 2,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
-- End parameters
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Initialise noise objects to nil
 | 
			
		||||
 | 
			
		||||
local nobj_density = nil
 | 
			
		||||
local nobj_thickness = nil
 | 
			
		||||
local nobj_speedx = nil
 | 
			
		||||
local nobj_speedz = nil
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Update clouds function
 | 
			
		||||
 | 
			
		||||
local function rangelim(value, lower, upper)
 | 
			
		||||
	return math.min(math.max(value, lower), upper)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local os_time_0 = os.time()
 | 
			
		||||
local t_offset = math.random(0, 300000)
 | 
			
		||||
 | 
			
		||||
local function update_clouds()
 | 
			
		||||
	-- Time in seconds.
 | 
			
		||||
	-- Add random time offset to avoid identical behaviour each server session.
 | 
			
		||||
	local time = os.difftime(os.time(), os_time_0) - t_offset
 | 
			
		||||
 | 
			
		||||
	nobj_density = nobj_density or minetest.get_perlin(np_density)
 | 
			
		||||
	nobj_thickness = nobj_thickness or minetest.get_perlin(np_thickness)
 | 
			
		||||
	nobj_speedx = nobj_speedx or minetest.get_perlin(np_speedx)
 | 
			
		||||
	nobj_speedz = nobj_speedz or minetest.get_perlin(np_speedz)
 | 
			
		||||
 | 
			
		||||
	local n_density = nobj_density:get2d({x = time, y = 0})
 | 
			
		||||
	local n_thickness = nobj_thickness:get2d({x = time, y = 0})
 | 
			
		||||
	local n_speedx = nobj_speedx:get2d({x = time, y = 0})
 | 
			
		||||
	local n_speedz = nobj_speedz:get2d({x = time, y = 0})
 | 
			
		||||
 | 
			
		||||
	for _, player in ipairs(minetest.get_connected_players()) do
 | 
			
		||||
		local humid = minetest.get_humidity(player:get_pos())
 | 
			
		||||
		player:set_clouds({
 | 
			
		||||
			density = rangelim(humid / 100, 0.25, 1.0) * n_density,
 | 
			
		||||
			thickness = math.max(math.floor(
 | 
			
		||||
				rangelim(32 * humid / 100, 8, 32) * n_thickness
 | 
			
		||||
				), 1),
 | 
			
		||||
			speed = {x = n_speedx * 4, z = n_speedz * 4},
 | 
			
		||||
		})
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
local function cyclic_update()
 | 
			
		||||
	update_clouds()
 | 
			
		||||
	minetest.after(CYCLE, cyclic_update)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
minetest.after(0, cyclic_update)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Update on player join to instantly alter clouds from the default
 | 
			
		||||
 | 
			
		||||
minetest.register_on_joinplayer(function(player)
 | 
			
		||||
	update_clouds()
 | 
			
		||||
end)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,24 @@
 | 
			
		|||
License of source code
 | 
			
		||||
----------------------
 | 
			
		||||
 | 
			
		||||
The MIT License (MIT)
 | 
			
		||||
Copyright (C) 2019 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
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
name = weather
 | 
			
		||||
description = Minetest Game mod: weather
 | 
			
		||||
| 
						 | 
				
			
			@ -71,3 +71,7 @@ engine_spawn (Use engine spawn search) bool false
 | 
			
		|||
#    Whether river water source nodes create flowing sounds.
 | 
			
		||||
#    Helps rivers create more sound, especially on level sections.
 | 
			
		||||
river_source_sounds (River source node sounds) bool false
 | 
			
		||||
 | 
			
		||||
#    Enable cloud variation.
 | 
			
		||||
#    Non-functional in V6 or Singlenode mapgens.
 | 
			
		||||
enable_weather (Enable weather) bool true
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue