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

Settings: Add get_flags API for mapgen flags (mg_flags, mgv6_spflags, ...) (#9284)

Unified flags handling in C++ and Lua Settings API
     -> Reading only, for now. Writing can be implemented later, if needed.
API function to read the currently active flags
     -> was impossible from Lua

Co-authored-by: Wuzzy <wuzzy2@mail.ru>
This commit is contained in:
SmallJoker 2020-01-25 16:56:54 +01:00 committed by GitHub
parent 9cb3219f34
commit cde2a7f6f2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 222 additions and 39 deletions

View file

@ -484,12 +484,33 @@ v3f Settings::getV3F(const std::string &name) const
u32 Settings::getFlagStr(const std::string &name, const FlagDesc *flagdesc,
u32 *flagmask) const
{
std::string val = get(name);
return std::isdigit(val[0])
? stoi(val)
: readFlagString(val, flagdesc, flagmask);
}
u32 flags = 0;
u32 mask_default = 0;
std::string value;
// Read default value (if there is any)
if (getDefaultNoEx(name, value)) {
flags = std::isdigit(value[0])
? stoi(value)
: readFlagString(value, flagdesc, &mask_default);
}
// Apply custom flags "on top"
value = get(name);
u32 flags_user;
u32 mask_user = U32_MAX;
flags_user = std::isdigit(value[0])
? stoi(value) // Override default
: readFlagString(value, flagdesc, &mask_user);
flags &= ~mask_user;
flags |= flags_user;
if (flagmask)
*flagmask = mask_default | mask_user;
return flags;
}
// N.B. if getStruct() is used to read a non-POD aggregate type,
// the behavior is undefined.
@ -736,19 +757,16 @@ bool Settings::getV3FNoEx(const std::string &name, v3f &val) const
}
// N.B. getFlagStrNoEx() does not set val, but merely modifies it. Thus,
// val must be initialized before using getFlagStrNoEx(). The intention of
// this is to simplify modifying a flags field from a default value.
bool Settings::getFlagStrNoEx(const std::string &name, u32 &val,
FlagDesc *flagdesc) const
const FlagDesc *flagdesc) const
{
if (!flagdesc) {
if (!(flagdesc = getFlagDescFallback(name)))
return false; // Not found
}
try {
u32 flags, flagmask;
flags = getFlagStr(name, flagdesc, &flagmask);
val &= ~flagmask;
val |= flags;
val = getFlagStr(name, flagdesc, nullptr);
return true;
} catch (SettingNotFoundException &e) {
@ -873,6 +891,11 @@ bool Settings::setV3F(const std::string &name, v3f value)
bool Settings::setFlagStr(const std::string &name, u32 flags,
const FlagDesc *flagdesc, u32 flagmask)
{
if (!flagdesc) {
if (!(flagdesc = getFlagDescFallback(name)))
return false; // Not found
}
return set(name, writeFlagString(flags, flagdesc, flagmask));
}
@ -1018,6 +1041,18 @@ void Settings::clearDefaultsNoLock()
m_defaults.clear();
}
void Settings::setDefault(const std::string &name, const FlagDesc *flagdesc,
u32 flags)
{
m_flags[name] = flagdesc;
setDefault(name, writeFlagString(flags, flagdesc, U32_MAX));
}
const FlagDesc *Settings::getFlagDescFallback(const std::string &name) const
{
auto it = m_flags.find(name);
return it == m_flags.end() ? nullptr : it->second;
}
void Settings::registerChangedCallback(const std::string &name,
SettingsChangedCallback cbf, void *userdata)