diff --git a/doc/lua_api.md b/doc/lua_api.md index bf635b4dd..50dd5ee32 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -9039,6 +9039,7 @@ child will follow movement and rotation of that bone. alpha channel is used to set overall star brightness. (default: `#ebebff69`) * `scale`: Float controlling the overall size of the stars (default: `1`) + * `star_seed`: Integer number which decides how to generate the sky stars. If set to zero, client picks a random number. (default: `0`) * `get_stars()`: returns a table with the current stars parameters as in `set_stars`. * `set_clouds(cloud_parameters)`: set cloud parameters diff --git a/src/client/game.cpp b/src/client/game.cpp index 025442e78..7b4155728 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -2488,7 +2488,7 @@ void Game::handleClientEvent_SetSky(ClientEvent *event, CameraOrientation *cam) ); } else if (event->set_sky->type == "skybox" && event->set_sky->textures.size() == 6) { - // Disable the dyanmic mesh skybox: + // Disable the dynamic mesh skybox: sky->setVisible(false); // Set fog colors: sky->setFallbackBgColor(event->set_sky->bgcolor); @@ -2564,6 +2564,7 @@ void Game::handleClientEvent_SetStars(ClientEvent *event, CameraOrientation *cam sky->setStarColor(event->star_params->starcolor); sky->setStarScale(event->star_params->scale); sky->setStarDayOpacity(event->star_params->day_opacity); + sky->setStarSeed(event->star_params->star_seed); delete event->star_params; } diff --git a/src/client/sky.cpp b/src/client/sky.cpp index 5c059a43d..ff34a7550 100644 --- a/src/client/sky.cpp +++ b/src/client/sky.cpp @@ -807,6 +807,15 @@ void Sky::setStarCount(u16 star_count) } } +void Sky::setStarSeed(u64 star_seed) +{ + // Allow force updating star seed at game init. + if (m_star_params.star_seed != star_seed || m_first_update) { + m_star_params.star_seed = star_seed; + updateStars(); + } +} + void Sky::updateStars() { m_stars.reset(new scene::SMeshBuffer()); @@ -823,7 +832,8 @@ void Sky::updateStars() vertices.reserve(4 * m_star_params.count); indices.reserve(6 * m_star_params.count); - PcgRandom rgen(m_seed); + u64 star_seed = m_star_params.star_seed == 0 ? m_seed : m_star_params.star_seed; + PcgRandom rgen(star_seed); float d = (0.006 / 2) * m_star_params.scale; for (u16 i = 0; i < m_star_params.count; i++) { v3f r = v3f( diff --git a/src/client/sky.h b/src/client/sky.h index e1eb32be3..e78b7741b 100644 --- a/src/client/sky.h +++ b/src/client/sky.h @@ -77,6 +77,7 @@ public: void setStarColor(video::SColor star_color) { m_star_params.starcolor = star_color; } void setStarScale(f32 star_scale) { m_star_params.scale = star_scale; updateStars(); } void setStarDayOpacity(f32 day_opacity) { m_star_params.day_opacity = day_opacity; } + void setStarSeed(u64 star_seed); bool getCloudsVisible() const { return m_clouds_visible && m_clouds_enabled; } const video::SColorf &getCloudColor() const { return m_cloudcolor_f; } diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index d828123c7..4f3bc85c3 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -1445,6 +1445,7 @@ void Client::handleCommand_HudSetStars(NetworkPacket *pkt) >> stars.starcolor >> stars.scale; try { *pkt >> stars.day_opacity; + *pkt >> stars.star_seed; } catch (PacketError &e) {}; ClientEvent *event = new ClientEvent(); diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index e8cffb872..8a0b41979 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -2452,6 +2452,7 @@ int ObjectRef::l_set_stars(lua_State *L) "scale", star_params.scale); star_params.day_opacity = getfloatfield_default(L, 2, "day_opacity", star_params.day_opacity); + star_params.star_seed = getintfield_default(L, 2, "star_seed", star_params.star_seed); } getServer(L)->setStars(player, star_params); @@ -2480,6 +2481,8 @@ int ObjectRef::l_get_stars(lua_State *L) lua_setfield(L, -2, "scale"); lua_pushnumber(L, star_params.day_opacity); lua_setfield(L, -2, "day_opacity"); + lua_pushnumber(L, star_params.star_seed); + lua_setfield(L, -2, "star_seed"); return 1; } diff --git a/src/server.cpp b/src/server.cpp index 60ddb0672..fd866aa7f 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1959,7 +1959,7 @@ void Server::SendSetStars(session_t peer_id, const StarParams ¶ms) pkt << params.visible << params.count << params.starcolor << params.scale - << params.day_opacity; + << params.day_opacity << params.star_seed; Send(&pkt); } diff --git a/src/skyparams.h b/src/skyparams.h index 8c74e919c..8880c02df 100644 --- a/src/skyparams.h +++ b/src/skyparams.h @@ -64,6 +64,7 @@ struct StarParams video::SColor starcolor; f32 scale; f32 day_opacity; + u64 star_seed; }; struct CloudParams @@ -142,6 +143,7 @@ public: stars.starcolor = video::SColor(105, 235, 235, 255); stars.scale = 1; stars.day_opacity = 0; + stars.star_seed = 0; return stars; }