forked from VoxeLibre/VoxeLibre
Start refactor
This commit is contained in:
parent
d0e8b4141d
commit
161dd7d379
|
@ -1,10 +1,11 @@
|
||||||
local mods_loaded = false
|
-- Constants
|
||||||
local NIGHT_VISION_RATIO = 0.45
|
local NIGHT_VISION_RATIO = 0.45
|
||||||
|
|
||||||
local MINIMUM_LIGHT_LEVEL = 0.2
|
local MINIMUM_LIGHT_LEVEL = 0.2
|
||||||
|
local DEFAULT_WATER_COLOR = "#3F76E4"
|
||||||
|
|
||||||
local water_color = "#3F76E4"
|
-- Module state
|
||||||
|
local mods_loaded = false
|
||||||
|
local water_color = DEFAULT_WATER_COLOR
|
||||||
local mg_name = minetest.get_mapgen_setting("mg_name")
|
local mg_name = minetest.get_mapgen_setting("mg_name")
|
||||||
|
|
||||||
function mcl_weather.set_sky_box_clear(player, sky, fog)
|
function mcl_weather.set_sky_box_clear(player, sky, fog)
|
||||||
|
@ -65,7 +66,7 @@ local function get_light_modifier(time)
|
||||||
return light_multiplier
|
return light_multiplier
|
||||||
end
|
end
|
||||||
|
|
||||||
mcl_weather.skycolor = {
|
local skycolor = {
|
||||||
-- Should be activated before do any effect.
|
-- Should be activated before do any effect.
|
||||||
active = true,
|
active = true,
|
||||||
|
|
||||||
|
@ -88,25 +89,30 @@ mcl_weather.skycolor = {
|
||||||
-- Table for tracking layer order
|
-- Table for tracking layer order
|
||||||
layer_names = {},
|
layer_names = {},
|
||||||
|
|
||||||
|
utils = {},
|
||||||
|
}
|
||||||
|
mcl_weather.skycolor = skycolor
|
||||||
|
local skycolor_utils = skycolor.utils
|
||||||
|
|
||||||
-- To layer to colors table
|
-- To layer to colors table
|
||||||
add_layer = function(layer_name, layer_color, instant_update)
|
function skycolor.add_layer(layer_name, layer_color, instant_update)
|
||||||
mcl_weather.skycolor.colors[layer_name] = layer_color
|
mcl_weather.skycolor.colors[layer_name] = layer_color
|
||||||
table.insert(mcl_weather.skycolor.layer_names, layer_name)
|
table.insert(mcl_weather.skycolor.layer_names, layer_name)
|
||||||
mcl_weather.skycolor.force_update = true
|
mcl_weather.skycolor.force_update = true
|
||||||
end,
|
end
|
||||||
|
|
||||||
current_layer_name = function()
|
function skycolor.current_layer_name()
|
||||||
return mcl_weather.skycolor.layer_names[#mcl_weather.skycolor.layer_names]
|
return mcl_weather.skycolor.layer_names[#mcl_weather.skycolor.layer_names]
|
||||||
end,
|
end
|
||||||
|
|
||||||
-- Retrieve layer from colors table
|
-- Retrieve layer from colors table
|
||||||
retrieve_layer = function()
|
function skycolor.retrieve_layer()
|
||||||
local last_layer = mcl_weather.skycolor.current_layer_name()
|
local last_layer = mcl_weather.skycolor.current_layer_name()
|
||||||
return mcl_weather.skycolor.colors[last_layer]
|
return mcl_weather.skycolor.colors[last_layer]
|
||||||
end,
|
end
|
||||||
|
|
||||||
-- Remove layer from colors table
|
-- Remove layer from colors table
|
||||||
remove_layer = function(layer_name)
|
function skycolor.remove_layer(layer_name)
|
||||||
for k, name in pairs(mcl_weather.skycolor.layer_names) do
|
for k, name in pairs(mcl_weather.skycolor.layer_names) do
|
||||||
if name == layer_name then
|
if name == layer_name then
|
||||||
table.remove(mcl_weather.skycolor.layer_names, k)
|
table.remove(mcl_weather.skycolor.layer_names, k)
|
||||||
|
@ -114,10 +120,10 @@ mcl_weather.skycolor = {
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end,
|
end
|
||||||
|
|
||||||
-- Wrapper for updating day/night ratio that respects night vision
|
-- Wrapper for updating day/night ratio that respects night vision
|
||||||
override_day_night_ratio = function(player, ratio)
|
function skycolor.override_day_night_ratio(player, ratio)
|
||||||
local meta = player:get_meta()
|
local meta = player:get_meta()
|
||||||
local has_night_vision = meta:get_int("night_vision") == 1
|
local has_night_vision = meta:get_int("night_vision") == 1
|
||||||
local has_darkness = meta:get_int("darkness") == 1
|
local has_darkness = meta:get_int("darkness") == 1
|
||||||
|
@ -142,25 +148,25 @@ mcl_weather.skycolor = {
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
player:override_day_night_ratio(arg)
|
player:override_day_night_ratio(arg)
|
||||||
end,
|
end
|
||||||
|
|
||||||
-- Update sky color. If players not specified update sky for all players.
|
function water_sky(player)
|
||||||
update_sky_color = function(players)
|
|
||||||
-- Override day/night ratio as well
|
|
||||||
players = mcl_weather.skycolor.utils.get_players(players)
|
|
||||||
for _, player in ipairs(players) do
|
|
||||||
local pos = player:get_pos()
|
local pos = player:get_pos()
|
||||||
local dim = mcl_worlds.pos_to_dimension(pos)
|
local water_color = DEFAULT_WATER_COLOR
|
||||||
local has_weather = (mcl_worlds.has_weather(pos) and (mcl_weather.state == "snow" or mcl_weather.state =="rain" or mcl_weather.state == "thunder") and mcl_weather.has_snow(pos)) or ((mcl_weather.state =="rain" or mcl_weather.state == "thunder") and mcl_weather.has_rain(pos))
|
|
||||||
local checkname = minetest.get_node(vector.new(pos.x,pos.y+1.5,pos.z)).name
|
local checkname = minetest.get_node(vector.new(pos.x,pos.y+1.5,pos.z)).name
|
||||||
if minetest.get_item_group(checkname, "water") ~= 0 then
|
if minetest.get_item_group(checkname, "water") == 0 then return end
|
||||||
|
|
||||||
local biome_index = minetest.get_biome_data(player:get_pos()).biome
|
local biome_index = minetest.get_biome_data(player:get_pos()).biome
|
||||||
local biome_name = minetest.get_biome_name(biome_index)
|
local biome_name = minetest.get_biome_name(biome_index)
|
||||||
local biome = minetest.registered_biomes[biome_name]
|
local biome = minetest.registered_biomes[biome_name]
|
||||||
if biome then water_color = biome._mcl_waterfogcolor end
|
if biome then water_color = biome._mcl_waterfogcolor end
|
||||||
if not biome then water_color = "#3F76E4" end
|
if not biome then water_color = "#3F76E4" end
|
||||||
|
|
||||||
if checkname == "mclx_core:river_water_source" or checkname == "mclx_core:river_water_flowing" then water_color = "#0084FF" end
|
if checkname == "mclx_core:river_water_source" or checkname == "mclx_core:river_water_flowing" then water_color = "#0084FF" end
|
||||||
player:set_sky({ type = "regular",
|
|
||||||
|
return {
|
||||||
|
sky = { type = "regular",
|
||||||
sky_color = {
|
sky_color = {
|
||||||
day_sky = water_color,
|
day_sky = water_color,
|
||||||
day_horizon = water_color,
|
day_horizon = water_color,
|
||||||
|
@ -174,8 +180,25 @@ mcl_weather.skycolor = {
|
||||||
fog_tint_type = "custom"
|
fog_tint_type = "custom"
|
||||||
},
|
},
|
||||||
clouds = false,
|
clouds = false,
|
||||||
})
|
}
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Update sky color. If players not specified update sky for all players.
|
||||||
|
function skycolor.update_sky_color(players)
|
||||||
|
-- Override day/night ratio as well
|
||||||
|
players = mcl_weather.skycolor.utils.get_players(players)
|
||||||
|
for _, player in ipairs(players) do
|
||||||
|
|
||||||
|
local pos = player:get_pos()
|
||||||
|
local dim = mcl_worlds.pos_to_dimension(pos)
|
||||||
|
local has_weather = (mcl_worlds.has_weather(pos) and (mcl_weather.state == "snow" or mcl_weather.state =="rain" or mcl_weather.state == "thunder") and mcl_weather.has_snow(pos)) or ((mcl_weather.state =="rain" or mcl_weather.state == "thunder") and mcl_weather.has_rain(pos))
|
||||||
|
|
||||||
|
local res = water_sky(player)
|
||||||
|
if res and res.sky then
|
||||||
|
player:set_sky(res.sky)
|
||||||
|
end
|
||||||
|
|
||||||
if dim == "overworld" then
|
if dim == "overworld" then
|
||||||
local biomesky
|
local biomesky
|
||||||
local biomefog
|
local biomefog
|
||||||
|
@ -320,10 +343,10 @@ mcl_weather.skycolor = {
|
||||||
player:set_stars({visible = false})
|
player:set_stars({visible = false})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end,
|
end -- END function skycolor.update_sky_color(players)
|
||||||
|
|
||||||
-- Returns current layer color in {r, g, b} format
|
-- Returns current layer color in {r, g, b} format
|
||||||
get_sky_layer_color = function(timeofday)
|
function skycolor.get_sky_layer_color(timeofday)
|
||||||
if #mcl_weather.skycolor.layer_names == 0 then
|
if #mcl_weather.skycolor.layer_names == 0 then
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
@ -332,10 +355,9 @@ mcl_weather.skycolor = {
|
||||||
local rounded_time = math.floor(timeofday * mcl_weather.skycolor.max_val)
|
local rounded_time = math.floor(timeofday * mcl_weather.skycolor.max_val)
|
||||||
local color = mcl_weather.skycolor.utils.convert_to_rgb(mcl_weather.skycolor.min_val, mcl_weather.skycolor.max_val, rounded_time, mcl_weather.skycolor.retrieve_layer())
|
local color = mcl_weather.skycolor.utils.convert_to_rgb(mcl_weather.skycolor.min_val, mcl_weather.skycolor.max_val, rounded_time, mcl_weather.skycolor.retrieve_layer())
|
||||||
return color
|
return color
|
||||||
end,
|
end
|
||||||
|
|
||||||
utils = {
|
function skycolor_utils.convert_to_rgb(minval, maxval, current_val, colors)
|
||||||
convert_to_rgb = function(minval, maxval, current_val, colors)
|
|
||||||
local max_index = #colors - 1
|
local max_index = #colors - 1
|
||||||
local val = (current_val-minval) / (maxval-minval) * max_index + 1.0
|
local val = (current_val-minval) / (maxval-minval) * max_index + 1.0
|
||||||
local index1 = math.floor(val)
|
local index1 = math.floor(val)
|
||||||
|
@ -344,10 +366,10 @@ mcl_weather.skycolor = {
|
||||||
local c1 = colors[index1]
|
local c1 = colors[index1]
|
||||||
local c2 = colors[index2]
|
local c2 = colors[index2]
|
||||||
return {r=math.floor(c1.r + f*(c2.r - c1.r)), g=math.floor(c1.g + f*(c2.g-c1.g)), b=math.floor(c1.b + f*(c2.b - c1.b))}
|
return {r=math.floor(c1.r + f*(c2.r - c1.r)), g=math.floor(c1.g + f*(c2.g-c1.g)), b=math.floor(c1.b + f*(c2.b - c1.b))}
|
||||||
end,
|
end
|
||||||
|
|
||||||
-- Simply getter. Ether returns user given players list or get all connected players if none provided
|
-- Simply getter. Ether returns user given players list or get all connected players if none provided
|
||||||
get_players = function(players)
|
function skycolor_utils.get_players(players)
|
||||||
if players == nil or #players == 0 then
|
if players == nil or #players == 0 then
|
||||||
if mods_loaded then
|
if mods_loaded then
|
||||||
players = minetest.get_connected_players()
|
players = minetest.get_connected_players()
|
||||||
|
@ -356,19 +378,16 @@ mcl_weather.skycolor = {
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return players
|
return players
|
||||||
end,
|
end
|
||||||
|
|
||||||
-- Returns first player sky color. I assume that all players are in same color layout.
|
-- Returns first player sky color. I assume that all players are in same color layout.
|
||||||
get_current_bg_color = function()
|
function skycolor_utils.get_current_bg_color()
|
||||||
local players = mcl_weather.skycolor.utils.get_players(nil)
|
local players = mcl_weather.skycolor.utils.get_players(nil)
|
||||||
if players[1] then
|
if players[1] then
|
||||||
return players[1]:get_sky(true).sky_color
|
return players[1]:get_sky(true).sky_color
|
||||||
end
|
end
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
},
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
local timer = 0
|
local timer = 0
|
||||||
minetest.register_globalstep(function(dtime)
|
minetest.register_globalstep(function(dtime)
|
||||||
|
|
Loading…
Reference in New Issue