1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Allow resetting celestial vault elements by leaving its arguments empty (#11922)

This commit is contained in:
Zughy 2022-01-22 12:42:49 +01:00 committed by GitHub
parent f66ed2c27f
commit 37d80784dd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 124 additions and 120 deletions

View file

@ -1732,9 +1732,11 @@ int ObjectRef::l_set_sky(lua_State *L)
return 0;
SkyboxParams sky_params = player->getSkyParams();
bool is_colorspec = is_color_table(L, 2);
if (lua_istable(L, 2) && !is_colorspec) {
// reset if empty
if (lua_isnoneornil(L, 2) && lua_isnone(L, 3)) {
sky_params = SkyboxDefaults::getSkyDefaults();
} else if (lua_istable(L, 2) && !is_color_table(L, 2)) {
lua_getfield(L, 2, "base_color");
if (!lua_isnil(L, -1))
read_color(L, -1, &sky_params.bgcolor);
@ -1758,17 +1760,11 @@ int ObjectRef::l_set_sky(lua_State *L)
}
lua_pop(L, 1);
/*
We want to avoid crashes, so we're checking even if we're not using them.
However, we want to ensure that the skybox can be set to nil when
using "regular" or "plain" skybox modes as textures aren't needed.
*/
if (sky_params.textures.size() != 6 && sky_params.textures.size() > 0)
// Validate that we either have six or zero textures
if (sky_params.textures.size() != 6 && !sky_params.textures.empty())
throw LuaError("Skybox expects 6 textures!");
sky_params.clouds = getboolfield_default(L, 2,
"clouds", sky_params.clouds);
sky_params.clouds = getboolfield_default(L, 2, "clouds", sky_params.clouds);
lua_getfield(L, 2, "sky_color");
if (lua_istable(L, -1)) {
@ -1816,7 +1812,7 @@ int ObjectRef::l_set_sky(lua_State *L)
sky_params.fog_tint_type = luaL_checkstring(L, -1);
lua_pop(L, 1);
// Because we need to leave the "sky_color" table.
// pop "sky_color" table
lua_pop(L, 1);
}
} else {
@ -1852,11 +1848,8 @@ int ObjectRef::l_set_sky(lua_State *L)
if (lua_istable(L, 4)) {
lua_pushnil(L);
while (lua_next(L, 4) != 0) {
// Key at index -2, and value at index -1
if (lua_isstring(L, -1))
sky_params.textures.emplace_back(readParam<std::string>(L, -1));
else
sky_params.textures.emplace_back("");
// Key at index -2, and value at index -1
sky_params.textures.emplace_back(readParam<std::string>(L, -1));
// Remove the value, keep the key for the next iteration
lua_pop(L, 1);
}
@ -1872,6 +1865,7 @@ int ObjectRef::l_set_sky(lua_State *L)
getServer(L)->setMoon(player, moon_params);
getServer(L)->setStars(player, star_params);
}
getServer(L)->setSky(player, sky_params);
lua_pushboolean(L, true);
return 1;
@ -1947,21 +1941,20 @@ int ObjectRef::l_set_sun(lua_State *L)
if (player == nullptr)
return 0;
luaL_checktype(L, 2, LUA_TTABLE);
SunParams sun_params = player->getSunParams();
sun_params.visible = getboolfield_default(L, 2,
"visible", sun_params.visible);
sun_params.texture = getstringfield_default(L, 2,
"texture", sun_params.texture);
sun_params.tonemap = getstringfield_default(L, 2,
"tonemap", sun_params.tonemap);
sun_params.sunrise = getstringfield_default(L, 2,
"sunrise", sun_params.sunrise);
sun_params.sunrise_visible = getboolfield_default(L, 2,
"sunrise_visible", sun_params.sunrise_visible);
sun_params.scale = getfloatfield_default(L, 2,
"scale", sun_params.scale);
// reset if empty
if (lua_isnoneornil(L, 2)) {
sun_params = SkyboxDefaults::getSunDefaults();
} else {
luaL_checktype(L, 2, LUA_TTABLE);
sun_params.visible = getboolfield_default(L, 2, "visible", sun_params.visible);
sun_params.texture = getstringfield_default(L, 2, "texture", sun_params.texture);
sun_params.tonemap = getstringfield_default(L, 2, "tonemap", sun_params.tonemap);
sun_params.sunrise = getstringfield_default(L, 2, "sunrise", sun_params.sunrise);
sun_params.sunrise_visible = getboolfield_default(L, 2, "sunrise_visible", sun_params.sunrise_visible);
sun_params.scale = getfloatfield_default(L, 2, "scale", sun_params.scale);
}
getServer(L)->setSun(player, sun_params);
lua_pushboolean(L, true);
@ -2004,17 +1997,18 @@ int ObjectRef::l_set_moon(lua_State *L)
if (player == nullptr)
return 0;
luaL_checktype(L, 2, LUA_TTABLE);
MoonParams moon_params = player->getMoonParams();
moon_params.visible = getboolfield_default(L, 2,
"visible", moon_params.visible);
moon_params.texture = getstringfield_default(L, 2,
"texture", moon_params.texture);
moon_params.tonemap = getstringfield_default(L, 2,
"tonemap", moon_params.tonemap);
moon_params.scale = getfloatfield_default(L, 2,
"scale", moon_params.scale);
// reset if empty
if (lua_isnoneornil(L, 2)) {
moon_params = SkyboxDefaults::getMoonDefaults();
} else {
luaL_checktype(L, 2, LUA_TTABLE);
moon_params.visible = getboolfield_default(L, 2, "visible", moon_params.visible);
moon_params.texture = getstringfield_default(L, 2, "texture", moon_params.texture);
moon_params.tonemap = getstringfield_default(L, 2, "tonemap", moon_params.tonemap);
moon_params.scale = getfloatfield_default(L, 2, "scale", moon_params.scale);
}
getServer(L)->setMoon(player, moon_params);
lua_pushboolean(L, true);
@ -2053,21 +2047,24 @@ int ObjectRef::l_set_stars(lua_State *L)
if (player == nullptr)
return 0;
luaL_checktype(L, 2, LUA_TTABLE);
StarParams star_params = player->getStarParams();
star_params.visible = getboolfield_default(L, 2,
"visible", star_params.visible);
star_params.count = getintfield_default(L, 2,
"count", star_params.count);
// reset if empty
if (lua_isnoneornil(L, 2)) {
star_params = SkyboxDefaults::getStarDefaults();
} else {
luaL_checktype(L, 2, LUA_TTABLE);
star_params.visible = getboolfield_default(L, 2, "visible", star_params.visible);
star_params.count = getintfield_default(L, 2, "count", star_params.count);
lua_getfield(L, 2, "star_color");
if (!lua_isnil(L, -1))
read_color(L, -1, &star_params.starcolor);
lua_pop(L, 1);
lua_getfield(L, 2, "star_color");
if (!lua_isnil(L, -1))
read_color(L, -1, &star_params.starcolor);
lua_pop(L, 1);
star_params.scale = getfloatfield_default(L, 2,
"scale", star_params.scale);
star_params.scale = getfloatfield_default(L, 2,
"scale", star_params.scale);
}
getServer(L)->setStars(player, star_params);
lua_pushboolean(L, true);
@ -2106,31 +2103,36 @@ int ObjectRef::l_set_clouds(lua_State *L)
if (player == nullptr)
return 0;
luaL_checktype(L, 2, LUA_TTABLE);
CloudParams cloud_params = player->getCloudParams();
cloud_params.density = getfloatfield_default(L, 2, "density", cloud_params.density);
// reset if empty
if (lua_isnoneornil(L, 2)) {
cloud_params = SkyboxDefaults::getCloudDefaults();
} else {
luaL_checktype(L, 2, LUA_TTABLE);
cloud_params.density = getfloatfield_default(L, 2, "density", cloud_params.density);
lua_getfield(L, 2, "color");
if (!lua_isnil(L, -1))
read_color(L, -1, &cloud_params.color_bright);
lua_pop(L, 1);
lua_getfield(L, 2, "ambient");
if (!lua_isnil(L, -1))
read_color(L, -1, &cloud_params.color_ambient);
lua_pop(L, 1);
lua_getfield(L, 2, "color");
if (!lua_isnil(L, -1))
read_color(L, -1, &cloud_params.color_bright);
lua_pop(L, 1);
lua_getfield(L, 2, "ambient");
if (!lua_isnil(L, -1))
read_color(L, -1, &cloud_params.color_ambient);
lua_pop(L, 1);
cloud_params.height = getfloatfield_default(L, 2, "height", cloud_params.height );
cloud_params.thickness = getfloatfield_default(L, 2, "thickness", cloud_params.thickness);
cloud_params.height = getfloatfield_default(L, 2, "height", cloud_params.height);
cloud_params.thickness = getfloatfield_default(L, 2, "thickness", cloud_params.thickness);
lua_getfield(L, 2, "speed");
if (lua_istable(L, -1)) {
v2f new_speed;
new_speed.X = getfloatfield_default(L, -1, "x", 0);
new_speed.Y = getfloatfield_default(L, -1, "z", 0);
cloud_params.speed = new_speed;
lua_getfield(L, 2, "speed");
if (lua_istable(L, -1)) {
v2f new_speed;
new_speed.X = getfloatfield_default(L, -1, "x", 0);
new_speed.Y = getfloatfield_default(L, -1, "z", 0);
cloud_params.speed = new_speed;
}
lua_pop(L, 1);
}
lua_pop(L, 1);
getServer(L)->setClouds(player, cloud_params);
lua_pushboolean(L, true);