Skip to content

Commit

Permalink
Add initial 'weather' mod to vary cloud density, thickness, velocity
Browse files Browse the repository at this point in the history
  • Loading branch information
paramat committed Oct 14, 2019
1 parent ef7df32 commit 7c1fd9c
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 0 deletions.
4 changes: 4 additions & 0 deletions mods/weather/README.txt
@@ -0,0 +1,4 @@
Minetest Game mod: weather
==========================
See license.txt for license information.
Source code by paramat (MIT).
116 changes: 116 additions & 0 deletions mods/weather/init.lua
@@ -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 changes: 24 additions & 0 deletions mods/weather/license.txt
@@ -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 changes: 2 additions & 0 deletions mods/weather/mod.conf
@@ -0,0 +1,2 @@
name = weather
description = Minetest Game mod: weather
4 changes: 4 additions & 0 deletions settingtypes.txt
Expand Up @@ -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

0 comments on commit 7c1fd9c

Please sign in to comment.