mirror of
https://github.com/minetest/minetest_game.git
synced 2024-12-22 22:22:25 +01:00
Add initial 'weather' mod to vary cloud density, thickness, velocity
This commit is contained in:
parent
ef7df329d2
commit
7c1fd9c24e
4
mods/weather/README.txt
Normal file
4
mods/weather/README.txt
Normal file
@ -0,0 +1,4 @@
|
||||
Minetest Game mod: weather
|
||||
==========================
|
||||
See license.txt for license information.
|
||||
Source code by paramat (MIT).
|
116
mods/weather/init.lua
Normal file
116
mods/weather/init.lua
Normal file
@ -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)
|
24
mods/weather/license.txt
Normal file
24
mods/weather/license.txt
Normal file
@ -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
|
2
mods/weather/mod.conf
Normal file
2
mods/weather/mod.conf
Normal file
@ -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
Block a user