Added support for new minetest sky api features (sky_colors, sun, moon, etc)

master
struggzard 2020-03-22 16:34:41 +02:00
parent 569305ff12
commit cadefd3fd5
9 changed files with 632 additions and 187 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/.idea/

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2016 Artūras Norkus
Copyright (c) 2016 rautars
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

236
README.md
View File

@ -1,11 +1,189 @@
# Skylayer
Minetest utility mod to help manage sky transitions. Mod includes smooth transition between users given base sky colors (for plain sky type). Tracks multiple sky definitions and display latest one. Each player have own list of sky layers.
Minetest utility mod to help manage sky transitions.
Mod includes the smooth transition between users given base sky colors (for plain sky type).
Tracks multiple sky definitions and display the latest one. Each player has own list of sky layers.
## Data Structures
Skylayer mod related data structures explained.
`ColorSpec` - a table of color value (0..255) in format `{r, g, b}`, e.g.:
```
{r=68, g=34, b=153}
```
`GradientSpec` - an array of `ColorSpec` that defines gradient points, e.g.:
```
{{r=68, g=34, b=153}, {r=68, g=68, b=221}}
```
`GradientSky` - a table with parameter names matching original minetest lua api `sky_color` table parameters.
Main difference is that values are `GradientSpec` type:
```
gradient_sky = {
day_sky = GradientSpec,
day_horizon = GradientSpec,
dawn_sky = GradientSpec,
dawn_horizon = GradientSpec,
night_sky = GradientSpec,
night_horizon = GradientSpec,
indoors = GradientSpec,
fog_sun_tint = GradientSpec,
fog_moon_tint = GradientSpec,
}
```
`SkyData` - a table with properties used for directly for `set_sky` with additional `skylayer` mod
properties for gradient support.
```
sky_data = {
-- same properties as set_sky api:
base_color = ..,
type = ..,
textures = ..,
clouds = ..,
sky_color = ..,
-- skylayer-specific properties, if set some of above properties will be overiden:
-- overrides base_color property with gradient support.
gradient_colors = GradientSpec
-- overrides sky_color properties with gradient support.
gradient_sky = {
day_sky = GradientSpec,
day_horizon = GradientSpec,
dawn_sky = GradientSpec,
dawn_horizon = GradientSpec,
night_sky = GradientSpec,
night_horizon = GradientSpec,
indoors = GradientSpec,
fog_sun_tint = GradientSpec,
fog_moon_tint = GradientSpec,
}
}
```
`SunData` a table which matches minetest `set_sun` parameters, no `skylayer` specifics.
`MoonData` a table which matches minetest `set_moon` parameters, no `skylayer` specifics.
`StarsData` a table with properties used for directly for `set_stars` with additional `skylayer` mod properties for gradient support.
```
stars_data = {
-- same set of properties as set_stars api:
visible = ..,
count = ..,
star_color = ..,
scale = ..,
-- skylayer-specific properties, if set some of above properties will be overiden:
gradient_star_colors = GradientSpec
}
```
`CloundsData` a table with properties used for directly for `set_clouds` with additional `skylayer` mod properties for gradient support.
```
clouds_data = {
-- same set of properties as set_clouds api:
density = ..,
color = ..,
ambient = ..,
height = ..,
height = ..,
thickness = ..,
speed = ..,
-- skylayer-specific properties, if set some of above properties will be overiden:
gradient_colors = GradientSpec
gradient_ambient_colors = GradientSpec
}
```
## Usage samples
Expected to be configured by other mods. See demo.lua for detailed examples with chat commands. Demo by default is disabled and can be enabled by uncommenting file include inside init.lua.
The Skylayer mod designed to be configured by other mods. See demo.lua for examples and pre-builds commands for quick tests.
Demo by default is disabled and can be enabled by uncommenting file include inside init.lua.
### Gradient plain color with clouds
### Sample with commented parameters
```
local sl = {}
sl.name = "gradient_plain_with_clouds_sky"
sl.sky_data = {
gradient_colors = {
{ r = 68, g = 34, b = 153 },
{ r = 59, g = 12, b = 189 },
{ r = 51, g = 17, b = 187 },
{ r = 68, g = 68, b = 221 },
{ r = 17, g = 170, b = 187 },
{ r = 18, g = 189, b = 185 },
{ r = 34, g = 204, b = 170 },
{ r = 105, g = 208, b = 37 },
{ r = 170, g = 204, b = 34 },
{ r = 208, g = 195, b = 16 },
{ r = 204, g = 187, b = 51 },
{ r = 254, g = 174, b = 45 },
{ r = 255, g = 153, b = 51 },
{ r = 255, g = 102, b = 68 },
{ r = 255, g = 68, b = 34 },
{ r = 255, g = 51, b = 17 },
{ r = 248, g = 12, b = 18 },
{ r = 255, g = 51, b = 17 },
{ r = 255, g = 68, b = 34 },
{ r = 255, g = 102, b = 68 },
{ r = 255, g = 153, b = 51 },
{ r = 254, g = 174, b = 45 },
{ r = 204, g = 187, b = 51 },
{ r = 208, g = 195, b = 16 },
{ r = 170, g = 204, b = 34 },
{ r = 105, g = 208, b = 37 },
{ r = 34, g = 204, b = 170 },
{ r = 18, g = 189, b = 185 },
{ r = 17, g = 170, b = 187 },
{ r = 68, g = 68, b = 221 },
{ r = 51, g = 17, b = 187 },
{ r = 59, g = 12, b = 189 }
}
}
sl.clouds_data = {
gradient_colors = {
{ r = 34, g = 204, b = 170 },
{ r = 105, g = 208, b = 37 },
{ r = 170, g = 204, b = 34 },
{ r = 208, g = 195, b = 16 },
{ r = 204, g = 187, b = 51 },
{ r = 254, g = 174, b = 45 },
{ r = 255, g = 68, b = 34 },
{ r = 255, g = 102, b = 68 },
{ r = 255, g = 153, b = 51 },
{ r = 254, g = 174, b = 45 },
{ r = 59, g = 12, b = 189 }
},
speed = { x = 110, z = -400 }
}
sl.sun_data = {
visible = false
}
sl.moon_data = {
visible = false
}
skylayer.add_layer(player_name, sl)
```
```
-- Datatype:
-- GradientSpec - a table in format {ColorSpec, ColorSpec}, (e.g. {{r=68, g=34, b=153}, {r=68, g=68, b=221}}) could be many gradient points.
local sl = {}
sl.name = "sample_sky_with_clouds"
sl.sky_data = {
@ -15,11 +193,58 @@ sl.sky_data = {
type = "plain", -- string, available types: regular, skybox, plain.
textures = nil, -- table, textures for skybox type.
clouds = true, -- boolean, flag if clouds should appear in front of "skybox" or "plain" types.
sky_color = nil, -- table, a location and envinronment focused sky colors.
-- These optional parameter are skylayer specific,
-- if set they may override parameters above.
gradient_colors = {{r=68, g=34, b=153}, {r=68, g=68, b=221}} -- table, color points used to create gradient based on world time, if set bgcolor will be overrided by color generated from gradient
gradient_colors = GradientSpec -- table, color points used to create gradient based on world time, if set bgcolor will be overrided by color generated from gradient
gradient_sky = {
day_sky = GradientSpec,
day_horizon = GradientSpec,
dawn_sky = GradientSpec,
dawn_horizon = GradientSpec,
night_sky = GradientSpec,
night_horizon = GradientSpec,
indoors = GradientSpec,
fog_sun_tint = GradientSpec,
fog_moon_tint = GradientSpec,
} -- supports similar set of parameters as minetest api but in gradient type instead, in case some parameter is not set then default value will be used as documented for sky_colors.
}
sl.sun_data = {
-- These optional parameters used for minetest set_sun api,
-- please refer MT lua_api docs for paramater details.
visible: Boolean for whether the sun is visible. (default: true)
texture: A regular texture for the sun. Setting to "" will re-enable the mesh sun. (default: "sun.png")
tonemap: A 512x1 texture containing the tonemap for the sun (default: "sun_tonemap.png")
sunrise: A regular texture for the sunrise texture. (default: "sunrisebg.png")
sunrise_visible: Boolean for whether the sunrise texture is visible. (default: true)
scale: Float controlling the overall size of the sun. (default: 1)
}
sl.moon_data = {
-- These optional parameters used for minetest set_moon api,
-- please refer MT lua_api docs for paramater details.
parameters is a table with the following optional fields:
visible: Boolean for whether the moon is visible. (default: true)
texture: A regular texture for the moon. Setting to "" will re-enable the mesh moon. (default: "moon.png")
tonemap: A 512x1 texture containing the tonemap for the moon (default: "moon_tonemap.png")
scale: Float controlling the overall size of the moon (default: 1)
}
sl.stars_data = {
-- These optional parameters used for minetest set_moon api,
-- please refer MT lua_api docs for paramater details.
visible: Boolean for whether the stars are visible. (default: true)
count: Integer number to set the number of stars in the skybox. Only applies to "skybox" and "regular" skyboxes. (default: 1000)
star_color: ColorSpec, sets the colors of the stars, alpha channel is used to set overall star brightness. (default: #ebebff69)
scale: Float controlling the overall size of the stars (default: 1)
-- These optional parameter are skylayer specific,
-- if set they may override parameters above.
gradient_colors = GradientSpec -- table, same as sky gradient color, if set star_color will be overrided by color generated from gradient
}
sl.clouds_data = {
-- These optional parameters used for minetest set_clouds api,
-- please refer MT lua_api docs for paramater details.
@ -32,8 +257,9 @@ sl.clouds_data = {
-- These optional parameter are skylayer specific,
-- if set they may override parameters above.
gradient_colors = {{r=68, g=34, b=153}, {r=68, g=68, b=221}} -- table, same as sky gradient color, if set color will be overrided by color generated from gradient
gradient_colors = GradientSpec -- table, same as sky gradient color, if set color will be overrided by color generated from gradient
}
skylayer.add_layer(player_name, sl)
```

View File

@ -1,8 +1,9 @@
-------------------------
-- Sky Layers: API
-- Git: https://gitlab.com/rautars/skylayer
-- License: MIT
-- Credits: xeranas
-- Credits: rautars
-------------------------
-- include skylayer core functions
@ -33,6 +34,8 @@ skylayer.add_layer = function(player_name, layer)
end
layer.added_time = os.time()
layer.updated = false
layer.update_interval = layer.update_interval and layer.update_interval or core.settings.update_interval
table.insert(player_data.skylayers, layer)
end

290
core.lua
View File

@ -1,8 +1,9 @@
-------------------------
-- Sky Layers: Core
-- Git: https://gitlab.com/rautars/skylayer
-- License: MIT
-- Credits: xeranas
-- Credits: rautars
-- Thanks: Perkovec for colorise utils (github.com/Perkovec/colorise-lua)
-------------------------
@ -27,10 +28,25 @@ core.settings.update_interval = 4
core.timer = 0
core.default_clouds = nil
core.default_moon = nil
core.default_sun = nil
core.default_stars = nil
core.default_sky_color = nil
-- keeps player related data such as player itself and own sky layers
core.sky_players = {}
-- flag for minetest legacy version (< 5.1.1), value will be initialized lazily
core.legacy = nil
-- A helper function to imitate ternary operator for inline if/else checks
core.ternary = function(condition, trueVal, falseVal)
if condition then
return trueVal
end
return falseVal
end
-- adds player to sky layer affected players list
core.add_player = function(player)
local data = {}
@ -96,16 +112,22 @@ end
-- sets default / regular sky for player
core.reset_sky = function(player)
core.set_default_sky(player)
core.set_default_clouds(player)
end
core.set_default_sky = function(player)
player:set_sky(nil, "regular", nil)
end
core.set_default_clouds = function(player)
player:set_clouds(core.default_clouds)
if core.legacy then
player:set_sky(nil, "regular", nil)
else
player:set_sky({
base_color = nil,
type = "regular",
textures = nil,
clouds = true,
sky_color = core.default_sky_color
})
player:set_moon(core.default_moon)
player:set_sun(core.default_sun)
player:set_stars(core.default_stars)
end
end
-- resolves latest skylayer based on added layer time
@ -131,30 +153,31 @@ end
core.convert_to_rgb = function(minval, maxval, current_val, colors)
local max_index = #colors - 1
local val = (current_val-minval) / (maxval-minval) * max_index + 1.0
local index1 = math.floor(val)
local index2 = math.min(math.floor(val)+1, max_index + 1)
local index2 = math.min(math.floor(val) + 1, max_index + 1)
local f = val - index1
local c1 = colors[index1]
local c1 = colors[math.max(index1, 1)]
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))
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
-- Returns current gradient color in {r, g, b} format
core.calculate_current_gradient_color = function(gradient_colors, min_val, max_val)
if gradient_colors == nil then return nil end
local timeofday = minetest.get_timeofday()
if min_val == nil then
min_val = core.settings.gradient_default_min_value
end
if max_val == nil then
max_val = core.settings.gradient_default_max_value
end
local rounded_time = math.floor(timeofday * max_val)
local rounded_time = math.floor(minetest.get_timeofday() * max_val)
return core.convert_to_rgb(min_val, max_val, rounded_time, gradient_colors)
end
@ -164,67 +187,188 @@ core.get_current_layer_color = function(gradient_colors, min_val, max_val)
end
-- Returns current cloud color in hex format
core.get_current_cloud_color = function(gradient_colors, min_val, max_val)
core.calculate_color_hex_value = function(gradient_colors, min_val, max_val)
local rgb_color = core.calculate_current_gradient_color(gradient_colors, min_val, max_val)
if rgb_color == nil then return nil end
return colorise.rgb2hex({rgb_color.r, rgb_color.g, rgb_color.b})
end
core.resolve_sky_color = function(sky_data)
local sky_color = sky_data.sky_color
local gradient_sky = sky_data.gradient_sky
if sky_color == nil and gradient_sky == nil then
return core.default_sky_color
end
if sky_color == nil then
sky_color = {}
end
-- merge user set color values with worlds defaults
local merged_sky_color = {
day_sky = sky_color.day_sky and sky_color.day_sky or core.default_sky_color.day_sky,
day_horizon = sky_color.day_horizon and sky_color.day_horizon or core.default_sky_color.day_horizon,
dawn_sky = sky_color.dawn_sky and sky_color.dawn_sky or core.default_sky_color.dawn_sky,
dawn_horizon = sky_color.dawn_horizon and sky_color.dawn_horizon or core.default_sky_color.dawn_horizon,
night_sky = sky_color.night_sky and sky_color.night_sky or core.default_sky_color.night_sky,
night_horizon = sky_color.night_horizon and sky_color.night_horizon or core.default_sky_color.night_horizon,
indoors = sky_color.indoors and sky_color.indoors or core.default_sky_color.indoors,
fog_sun_tint = sky_color.fog_sun_tint and sky_color.fog_sun_tint or core.default_sky_color.fog_sun_tint,
fog_moon_tint = sky_color.fog_moon_tint and sky_color.fog_moon_tint or core.default_sky_color.fog_moon_tint,
fog_tint_type = sky_color.fog_tint_type and sky_color.fog_tint_type or core.default_sky_color.fog_tint_type
}
if gradient_sky == nil then
return merged_sky_color
end
local time_of_day = math.floor(minetest.get_timeofday() * 1000)
if gradient_sky.day_sky ~= nil and time_of_day > 190 and time_of_day < 800 then
merged_sky_color.day_sky = core.calculate_color_hex_value(gradient_sky.day_sky, 200, 750)
end
if gradient_sky.day_horizon ~= nil and time_of_day > 190 and time_of_day < 800 then
merged_sky_color.day_horizon = core.calculate_color_hex_value(gradient_sky.day_horizon, 200, 750)
end
if gradient_sky.dawn_sky ~= nil and time_of_day >= 750 and time_of_day <= 850 then
merged_sky_color.dawn_sky = core.calculate_color_hex_value(gradient_sky.dawn_sky, 750, 850)
end
if gradient_sky.dawn_horizon ~= nil and time_of_day >= 750 and time_of_day <= 850 then
merged_sky_color.dawn_horizon = core.calculate_color_hex_value(gradient_sky.dawn_horizon, 750, 850)
end
if time_of_day >= 800 or time_of_day <= 190 then
local night_sky_min = time_of_day >= 800 and 800 or 0
local night_sky_max = time_of_day >= 800 and 1000 or 200
if gradient_sky.night_sky ~= nil then
merged_sky_color.night_sky = core.calculate_color_hex_value(gradient_sky.night_sky, night_sky_min, night_sky_max)
end
if gradient_sky.night_horizon ~= nil then
merged_sky_color.night_horizon = core.calculate_color_hex_value(gradient_sky.night_horizon, night_sky_min, night_sky_max)
end
if gradient_sky.fog_moon_tint ~= nil then
merged_sky_color.fog_moon_tint = core.calculate_color_hex_value(gradient_sky.fog_moon_tint, night_sky_min, night_sky_max)
end
elseif gradient_sky.fog_sun_tint ~= nil then
merged_sky_color.fog_sun_tint = core.calculate_color_hex_value(gradient_sky.fog_sun_tint, 200, 750)
end
if gradient_sky.indoors ~= nil then
merged_sky_color.indoors = core.calculate_color_hex_value(gradient_sky.indoors)
end
return merged_sky_color
end
core.update_sky_details = function(player, sky_layer)
local sky_data = sky_layer.sky_data
if sky_data == nil then
if sky_layer.reset_defaults == true then
core.set_default_sky(player)
sky_layer.reset_defaults = false
end
if sky_data == nil then
return
end
local sky_color = core.get_current_layer_color(
sky_data.gradient_colors,
sky_data.gradient_min_value,
sky_data.gradient_max_value)
local bgcolor = sky_data.bgcolor
if sky_color ~= nil then
bgcolor = sky_color
local bg_color = sky_data.base_color and sky_data.base_color or sky_data.bgcolor -- fallback to bgcolor legacy parameter
if sky_data.gradient_colors ~= nil then
bg_color = core.get_current_layer_color(
sky_data.gradient_colors,
sky_data.gradient_min_value,
sky_data.gradient_max_value)
end
local sky_type = "plain" -- default
if sky_data.type ~= nil then
sky_type = sky_data.type
local sky_type = sky_data.type and sky_data.type or "plain"
if sky_data.type == nil and (sky_data.sky_color ~= nil or sky_data.gradient_sky ~= nil) then
sky_type = "regular"
end
local clouds = sky_layer.clouds_data ~= nil
if sky_data.clouds ~= nil then
clouds = sky_data.clouds
if core.legacy then
player:set_sky(
bg_color,
sky_type,
sky_data.textures,
core.ternary(sky_layer.clouds_data or sky_data.clouds ~= nil, sky_data.clouds == true, true)
)
else
player:set_sky({
base_color = bg_color,
type = sky_type,
textures = sky_data.textures,
clouds = core.ternary(sky_layer.clouds_data or sky_data.clouds ~= nil, sky_data.clouds == true, true),
sky_color = core.resolve_sky_color(sky_data)
})
end
player:set_sky(bgcolor, sky_type, sky_data.textures, clouds)
end
core.update_moon_details = function(player, sky_layer)
local moon_data = sky_layer.moon_data
if moon_data == nil then
return
end
player:set_moon(moon_data)
end
core.update_sun_details = function(player, sky_layer)
local sun_data = sky_layer.sun_data
if sun_data == nil then
return
end
player:set_sun(sun_data)
end
core.update_stars_details = function(player, sky_layer)
local stars_data = sky_layer.stars_data
if stars_data == nil then
return
end
local _stars_color = core.calculate_color_hex_value(
stars_data.gradient_star_colors,
stars_data.gradient_star_min_value,
stars_data.gradient_star_max_value)
local star_brightness = stars_data.brightness and stars_data.brightness or "69"
player:set_stars({
visible = core.ternary(stars_data.visible, stars_data.visible, core.default_stars.visible),
count = stars_data.count and stars_data.count or core.default_stars.count,
star_color = _stars_color and _stars_color .. star_brightness or core.default_stars.star_color,
scale = stars_data.scale and stars_data.scale or core.default_stars.scale
})
end
core.update_clouds_details = function(player, sky_layer)
local clouds_data = sky_layer.clouds_data
if clouds_data == nil then
if sky_layer.reset_defaults == true then
core.set_default_clouds(player)
sky_layer.reset_defaults = false
end
if clouds_data == nil then
return
end
local cloud_color = core.get_current_cloud_color(
local cloud_color = core.calculate_color_hex_value(
clouds_data.gradient_colors,
clouds_data.gradient_min_value,
clouds_data.gradient_max_value)
if cloud_color == nil then
cloud_color = clouds_data.color
end
local ambient_color = core.calculate_color_hex_value(
clouds_data.gradient_ambient_color,
clouds_data.gradient_ambient_min_value,
clouds_data.gradient_ambient_max_value)
player:set_clouds({
color = cloud_color,
density = clouds_data.density,
ambient = clouds_data.ambient,
height = clouds_data.height,
thickness = clouds_data.thickness,
speed = clouds_data.speed})
color = cloud_color and clouds_data.color or core.default_clouds.color,
density = clouds_data.density and clouds_data.density or core.default_clouds.density,
ambient = ambient_color and clouds_data.ambient or core.default_clouds.ambient,
height = clouds_data.height and clouds_data.height or core.default_clouds.height,
thickness = clouds_data.thickness and clouds_data.thickness or core.default_clouds.thickness,
speed = clouds_data.speed and clouds_data.speed or core.default_clouds.speed
})
end
core.post_update_processing = function(player, player_data, sky_layer)
if sky_layer.reset_defaults == true then
core.reset_sky(player)
sky_layer.reset_defaults = false
end
player_data.last_active_layer = sky_layer.name
if player_data.last_active_layer == nil or player_data.last_active_layer ~= sky_layer.name then
sky_layer.reset_defaults = true
end
end
core.update_sky = function(player, timer)
@ -232,23 +376,18 @@ core.update_sky = function(player, timer)
if player_data == nil then return end
local current_layer = core.get_latest_layer(player_data.skylayers)
if current_layer == nil then
return
end
if current_layer == nil then return end
if skylayer.update_interval == nil then
skylayer.update_interval = core.settings.update_interval
end
if player_data.last_active_layer == nil or player_data.last_active_layer ~= current_layer.name then
current_layer.reset_defaults = true
end
player_data.last_active_layer = current_layer.name
if current_layer.updated == false or core.timer >= skylayer.update_interval then
if current_layer.updated == false or core.timer >= current_layer.update_interval then
current_layer.updated = os.time()
core.update_sky_details(player, current_layer)
core.update_clouds_details(player, current_layer)
if core.legacy == false then
core.update_moon_details(player, current_layer)
core.update_sun_details(player, current_layer)
core.update_stars_details(player, current_layer)
end
core.post_update_processing(player, player_data, current_layer)
end
end
@ -256,6 +395,25 @@ minetest.register_on_joinplayer(function(player)
if core.default_clouds == nil then
core.default_clouds = player:get_clouds()
end
if core.legacy == nil then
core.legacy = player.get_moon == nil and true or false
end
if core.default_moon == nil then
core.default_moon = player.get_moon and player:get_moon() or {}
core.default_moon.texture = "" -- according set_moon api description, empty string used for setting default texture.
end
if core.default_sun == nil then
core.default_sun = player.get_sun and player:get_sun() or {}
core.default_sun.texture = ""
end
if core.default_stars == nil then
core.default_stars = player.get_stars and player:get_stars() or {}
end
if core.default_sky_color == nil then
core.default_sky_color = player.get_sky_color and player:get_sky_color() or {}
end
end)
minetest.register_globalstep(function(dtime)

282
demo.lua
View File

@ -1,85 +1,93 @@
-------------------------
-- Sky Layers: Demo
-- for testing skylayer api
-- Allows quickly test skylayer api
-- Demo disabled by default, see init.lua to enable it.
-- Git: https://gitlab.com/rautars/skylayer
-- License: MIT
-- Credits: xeranas
-- Credits: rautars
-------------------------
local add_rainbow_sky = function(player_name)
local gradient_plain_with_clouds_sky = function(player_name)
local sl = {}
sl.name = "rainbow_sky"
sl.name = "gradient_plain_with_clouds_sky"
sl.sky_data = {
gradient_colors = {
{r=68, g=34, b=153},
{r=59, g=12, b=189},
{r=51, g=17, b=187},
{r=68, g=68, b=221},
{r=17, g=170, b=187},
{r=18, g=189, b=185},
{r=34, g=204, b=170},
{r=105, g=208, b=37},
{r=170, g=204, b=34},
{r=208, g=195, b=16},
{r=204, g=187, b=51},
{r=254, g=174, b=45},
{r=255, g=153, b=51},
{r=255, g=102, b=68},
{r=255, g=68, b=34},
{r=255, g=51, b=17},
{r=248, g=12, b=18},
{r=255, g=51, b=17},
{r=255, g=68, b=34},
{r=255, g=102, b=68},
{r=255, g=153, b=51},
{r=254, g=174, b=45},
{r=204, g=187, b=51},
{r=208, g=195, b=16},
{r=170, g=204, b=34},
{r=105, g=208, b=37},
{r=34, g=204, b=170},
{r=18, g=189, b=185},
{r=17, g=170, b=187},
{r=68, g=68, b=221},
{r=51, g=17, b=187},
{r=59, g=12, b=189}
{ r = 68, g = 34, b = 153 },
{ r = 59, g = 12, b = 189 },
{ r = 51, g = 17, b = 187 },
{ r = 68, g = 68, b = 221 },
{ r = 17, g = 170, b = 187 },
{ r = 18, g = 189, b = 185 },
{ r = 34, g = 204, b = 170 },
{ r = 105, g = 208, b = 37 },
{ r = 170, g = 204, b = 34 },
{ r = 208, g = 195, b = 16 },
{ r = 204, g = 187, b = 51 },
{ r = 254, g = 174, b = 45 },
{ r = 255, g = 153, b = 51 },
{ r = 255, g = 102, b = 68 },
{ r = 255, g = 68, b = 34 },
{ r = 255, g = 51, b = 17 },
{ r = 248, g = 12, b = 18 },
{ r = 255, g = 51, b = 17 },
{ r = 255, g = 68, b = 34 },
{ r = 255, g = 102, b = 68 },
{ r = 255, g = 153, b = 51 },
{ r = 254, g = 174, b = 45 },
{ r = 204, g = 187, b = 51 },
{ r = 208, g = 195, b = 16 },
{ r = 170, g = 204, b = 34 },
{ r = 105, g = 208, b = 37 },
{ r = 34, g = 204, b = 170 },
{ r = 18, g = 189, b = 185 },
{ r = 17, g = 170, b = 187 },
{ r = 68, g = 68, b = 221 },
{ r = 51, g = 17, b = 187 },
{ r = 59, g = 12, b = 189 }
}
}
sl.clouds_data = {
gradient_colors = {
{r=34, g=204, b=170},
{r=105, g=208, b=37},
{r=170, g=204, b=34},
{r=208, g=195, b=16},
{r=204, g=187, b=51},
{r=254, g=174, b=45},
{r=255, g=68, b=34},
{r=255, g=102, b=68},
{r=255, g=153, b=51},
{r=254, g=174, b=45},
{r=59, g=12, b=189}
{ r = 34, g = 204, b = 170 },
{ r = 105, g = 208, b = 37 },
{ r = 170, g = 204, b = 34 },
{ r = 208, g = 195, b = 16 },
{ r = 204, g = 187, b = 51 },
{ r = 254, g = 174, b = 45 },
{ r = 255, g = 68, b = 34 },
{ r = 255, g = 102, b = 68 },
{ r = 255, g = 153, b = 51 },
{ r = 254, g = 174, b = 45 },
{ r = 59, g = 12, b = 189 }
},
speed = {x=110, z=-400}
speed = { x = 110, z = -400 }
}
sl.sun_data = {
visible = false
}
sl.moon_data = {
visible = false
}
skylayer.add_layer(player_name, sl)
end
local add_solid_black_sky = function(player_name)
local plain_without_clouds_sky = function(player_name)
local sl = {}
sl.name = "solid_black"
sl.name = "plain_without_clouds_sky"
sl.sky_data = {
bgcolor = {r=0, g=0, b=0}
base_color = { r = 0, g = 0, b = 0 },
clouds = false
}
skylayer.add_layer(player_name, sl)
end
local add_stars_sky = function(player_name)
local skybox_with_defaults_sky = function(player_name)
local sl = {}
sl.name = "stars_sky"
sl.name = "skybox_with_defaults_sky"
sl.sky_data = {
bgcolor = {r=0, g=0, b=0},
type = "skybox",
textures = {
"skylayer_demo_stars_sky.png",
@ -90,71 +98,119 @@ local add_stars_sky = function(player_name)
"skylayer_demo_stars_sky.png"
}
}
sl.stars_data = {
visible = false
}
skylayer.add_layer(player_name, sl)
end
minetest.register_chatcommand("sl_demo1_on", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)
if player_name == nil or player_name == "" then
player_name = name
end
add_rainbow_sky(player_name)
end
})
local custom_moon_with_gradient_stars_sky = function(player_name)
local sl = {}
sl.name = "custom_moon_with_gradient_stars_sky"
sl.moon_data = {
texture = "cold_moon.png",
}
sl.stars_data = {
scale = 2,
gradient_star_colors = {
{r=100, g=26, b=0},
{r=100, g=76, b=0},
{r=100, g=0, b=24},
}
}
skylayer.add_layer(player_name, sl)
end
minetest.register_chatcommand("sl_demo1_off", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)
if player_name == nil or player_name == "" then
player_name = name
end
skylayer.remove_layer(player_name, "rainbow_sky")
end
})
local custom_sun_with_default_sky = function(player_name)
local sl = {}
sl.name = "custom_sun_with_default_sky"
sl.sun_data = {
texture = "hot_sun.png",
scale = 3
}
skylayer.add_layer(player_name, sl)
end
minetest.register_chatcommand("sl_demo2_on", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)
if player_name == nil or player_name == "" then
player_name = name
end
add_solid_black_sky(player_name)
end
})
local plain_sky_colors_with_defaults_sky = function(player_name)
local sl = {}
sl.name = "plain_sky_colors_with_defaults_sky"
sl.sky_data = {
sky_color = {
day_sky = "#FBF704",
day_horizon = "#F704FB",
dawn_sky = "#EB1914",
dawn_horizon = "#49FF00",
night_sky = "#0F00FF",
night_horizon = "#FF5200",
indoors = "#D9EE11",
fog_sun_tint = "#E0901F",
fog_moon_tint = "#6E9A65"
}
}
skylayer.add_layer(player_name, sl)
end
minetest.register_chatcommand("sl_demo2_off", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)
if player_name == nil or player_name == "" then
player_name = name
end
skylayer.remove_layer(player_name, "solid_black")
end
})
local gradient_plain_sky_colors_with_defaults_sky = function(player_name)
local sl = {}
sl.name = "gradient_plain_sky_colors_with_defaults_sky"
sl.sky_data = {
gradient_sky = {
day_sky = {
{ r = 100, g = 0, b = 6},
{ r = 6, g = 100, b = 0},
{ r = 0, g = 6, b = 100}
},
day_horizon = {
{ r = 100, g = 56, b = 0},
{ r = 42, g = 100, b = 0},
{ r = 92, g = 100, b = 0}
},
night_sky = {
{ r = 0, g = 255, b = 87},
{ r = 250, g = 187, b = 100},
{ r = 255, g = 82, b = 0}
},
night_horizon = {
{ r = 87, g = 100, b = 0},
{ r = 0, g = 87, b = 100},
{ r = 100, g = 0, b = 87}
},
}
}
skylayer.add_layer(player_name, sl)
end
minetest.register_chatcommand("sl_demo3_on", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)
if player_name == nil or player_name == "" then
player_name = name
end
add_stars_sky(player_name)
end
})
local sky_definitions = {}
table.insert(sky_definitions, {name = "gradient_plain_with_clouds_sky", func = gradient_plain_with_clouds_sky})
table.insert(sky_definitions, {name = "plain_without_clouds_sky", func = plain_without_clouds_sky})
table.insert(sky_definitions, {name = "skybox_with_defaults_sky", func = skybox_with_defaults_sky})
table.insert(sky_definitions, {name = "custom_moon_with_gradient_stars_sky", func = custom_moon_with_gradient_stars_sky})
table.insert(sky_definitions, {name = "custom_sun_with_default_sky", func = custom_sun_with_default_sky})
table.insert(sky_definitions, {name = "plain_sky_colors_with_defaults_sky", func = plain_sky_colors_with_defaults_sky})
table.insert(sky_definitions, {name = "gradient_plain_sky_colors_with_defaults_sky", func = gradient_plain_sky_colors_with_defaults_sky})
minetest.register_chatcommand("sl_demo3_off", {
params = "<player_name>",
description = "Change sky for player",
func = function(name, player_name)
if player_name == nil or player_name == "" then
player_name = name
-- register commands for demo for sky definitions from sky_definitions array
local counter = 1
for key, definition in pairs(sky_definitions) do
minetest.register_chatcommand("sl_demo" .. counter .. "_on", {
params = "<player_name>",
description = "Sets sky ".. definition.name .." for a player",
func = function(name, player_name)
if player_name == nil or player_name == "" then
player_name = name
end
definition.func(player_name)
end
skylayer.remove_layer(player_name, "stars_sky")
end
})
})
minetest.register_chatcommand("sl_demo" .. counter .. "_off", {
params = "<player_name>",
description = "Turn off sky ".. definition.name .. " for a player",
func = function(name, player_name)
if player_name == nil or player_name == "" then
player_name = name
end
skylayer.remove_layer(player_name, definition.name)
end
})
counter = counter + 1
end

View File

@ -1,8 +1,9 @@
-------------------------------
-- Sky Layers: initialization
-- Git: https://gitlab.com/rautars/skylayer
-- License: MIT
-- Credits: xeranas
-- Credits: rautars
-------------------------------
local modpath = minetest.get_modpath("skylayer");

BIN
textures/cold_moon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 912 B

BIN
textures/hot_sun.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB