mirror of
https://github.com/luanti-org/minetest_game.git
synced 2025-05-20 06:13:17 -04:00
Refactor to use playerset directly
This commit is contained in:
parent
143792eb9a
commit
fa34f60799
1 changed files with 37 additions and 32 deletions
|
@ -4,7 +4,7 @@ local mod_enabled = minetest.settings:get_bool("enable_weather", true)
|
||||||
local randomize_clouds = mod_enabled and mg_name ~= "v6" and mg_name ~= "singlenode"
|
local randomize_clouds = mod_enabled and mg_name ~= "v6" and mg_name ~= "singlenode"
|
||||||
|
|
||||||
weather = {}
|
weather = {}
|
||||||
local playerlist = {}
|
local playerset = {}
|
||||||
|
|
||||||
-- Parameters
|
-- Parameters
|
||||||
local TSCALE = 600 -- Time scale of noise variation in seconds
|
local TSCALE = 600 -- Time scale of noise variation in seconds
|
||||||
|
@ -68,7 +68,22 @@ end
|
||||||
local os_time_0 = os.time()
|
local os_time_0 = os.time()
|
||||||
local t_offset = math.random(0, 300000)
|
local t_offset = math.random(0, 300000)
|
||||||
|
|
||||||
local function update_clouds(players)
|
-- set a default shadow intensity for mgv6 and singlenode
|
||||||
|
local function set_default_lighting(playerset)
|
||||||
|
for playername, _ in pairs(playerset) do
|
||||||
|
local player = minetest.get_player_by_name(playername)
|
||||||
|
player:set_lighting({
|
||||||
|
shadows = { intensity = 0.33 }
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update_weather(playerset)
|
||||||
|
-- skip cloud randomization if worldgen not supported
|
||||||
|
if not randomize_clouds then
|
||||||
|
set_default_lighting(playerset)
|
||||||
|
return
|
||||||
|
end
|
||||||
-- Time in seconds.
|
-- Time in seconds.
|
||||||
-- Add random time offset to avoid identical behaviour each server session.
|
-- Add random time offset to avoid identical behaviour each server session.
|
||||||
local time = os.difftime(os.time(), os_time_0) - t_offset
|
local time = os.difftime(os.time(), os_time_0) - t_offset
|
||||||
|
@ -83,7 +98,8 @@ local function update_clouds(players)
|
||||||
local n_speedx = nobj_speedx:get_2d({x = time, y = 0}) -- -1 to 1
|
local n_speedx = nobj_speedx:get_2d({x = time, y = 0}) -- -1 to 1
|
||||||
local n_speedz = nobj_speedz:get_2d({x = time, y = 0}) -- -1 to 1
|
local n_speedz = nobj_speedz:get_2d({x = time, y = 0}) -- -1 to 1
|
||||||
|
|
||||||
for _, player in ipairs(players) do
|
for playername, _ in pairs(playerset) do
|
||||||
|
local player = minetest.get_player_by_name(playername)
|
||||||
-- Fallback to mid-value 50 for very old worlds
|
-- Fallback to mid-value 50 for very old worlds
|
||||||
local humid = minetest.get_humidity(player:get_pos()) or 50
|
local humid = minetest.get_humidity(player:get_pos()) or 50
|
||||||
-- Default and classic density value is 0.4, make this happen
|
-- Default and classic density value is 0.4, make this happen
|
||||||
|
@ -110,7 +126,7 @@ local function update_clouds(players)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function purge_effects(player)
|
local function purge_effects(player)
|
||||||
-- reset potentially touched values to their defaults
|
-- only reset potentially touched table values
|
||||||
if randomize_clouds then
|
if randomize_clouds then
|
||||||
player:set_clouds({
|
player:set_clouds({
|
||||||
density = 0.4,
|
density = 0.4,
|
||||||
|
@ -131,19 +147,23 @@ weather.enable_on_join = true
|
||||||
-- returns bool for whether weather is active
|
-- returns bool for whether weather is active
|
||||||
-- returns nil if player is offline or weather is disabled
|
-- returns nil if player is offline or weather is disabled
|
||||||
weather.get_enabled = function(player)
|
weather.get_enabled = function(player)
|
||||||
return playerlist[player]
|
if not mod_enabled or not player then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local playername = player:get_player_name()
|
||||||
|
return playerset[playername] or false
|
||||||
end
|
end
|
||||||
|
|
||||||
-- override weather generation for individual player
|
-- override weather generation for individual player
|
||||||
weather.set_enabled = function(player, enable)
|
weather.set_enabled = function(player, enable)
|
||||||
if enable == playerlist[player] then
|
local playername = player:get_player_name()
|
||||||
|
enable = enable or nil
|
||||||
|
if not mod_enabled or enable == playerset[playername] then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
playerlist[player] = enable
|
playerset[playername] = enable
|
||||||
if enable then
|
if enable then
|
||||||
if randomize_clouds then
|
update_weather({ [playername] = true })
|
||||||
update_clouds({player})
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
purge_effects(player)
|
purge_effects(player)
|
||||||
end
|
end
|
||||||
|
@ -156,15 +176,9 @@ if not mod_enabled then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if update_clouds then
|
if randomize_clouds then
|
||||||
local function cyclic_update()
|
local function cyclic_update()
|
||||||
local players = {}
|
update_weather(playerset)
|
||||||
for player, state in pairs(playerlist) do
|
|
||||||
if state then
|
|
||||||
table.insert(players, player)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
update_clouds(players)
|
|
||||||
minetest.after(CYCLE, cyclic_update)
|
minetest.after(CYCLE, cyclic_update)
|
||||||
end
|
end
|
||||||
minetest.after(0, cyclic_update)
|
minetest.after(0, cyclic_update)
|
||||||
|
@ -174,22 +188,13 @@ end
|
||||||
|
|
||||||
minetest.register_on_joinplayer(function(player)
|
minetest.register_on_joinplayer(function(player)
|
||||||
if weather.enable_on_join then
|
if weather.enable_on_join then
|
||||||
playerlist[player] = true
|
local playername = player:get_player_name()
|
||||||
if randomize_clouds then
|
playerset[playername] = true
|
||||||
update_clouds({player})
|
update_weather({ [playername] = true })
|
||||||
else
|
|
||||||
-- set a default shadow intensity for mgv6 and singlenode
|
|
||||||
player:set_lighting({
|
|
||||||
shadows = {
|
|
||||||
intensity = 0.33
|
|
||||||
}
|
|
||||||
})
|
|
||||||
end
|
|
||||||
else
|
|
||||||
playerlist[player] = false
|
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
minetest.register_on_leaveplayer(function(player)
|
minetest.register_on_leaveplayer(function(player)
|
||||||
playerlist[player] = nil
|
local playername = player:get_player_name()
|
||||||
|
playerset[playername] = nil
|
||||||
end)
|
end)
|
||||||
|
|
Loading…
Add table
Reference in a new issue