mirror of
https://github.com/minetest/minetest_game.git
synced 2024-11-08 16:53:53 +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.
|
# Whether river water source nodes create flowing sounds.
|
||||||
# Helps rivers create more sound, especially on level sections.
|
# Helps rivers create more sound, especially on level sections.
|
||||||
river_source_sounds (River source node sounds) bool false
|
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