mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Strip leading colon from LBM names
This commit is contained in:
parent
71cd25a798
commit
3dca2cd26a
2 changed files with 36 additions and 25 deletions
|
@ -129,7 +129,11 @@ void LBMManager::addLBMDef(LoadingBlockModifierDef *lbm_def)
|
||||||
FATAL_ERROR_IF(m_query_mode,
|
FATAL_ERROR_IF(m_query_mode,
|
||||||
"attempted to modify LBMManager in query mode");
|
"attempted to modify LBMManager in query mode");
|
||||||
|
|
||||||
if (!string_allowed(lbm_def->name, LBM_NAME_ALLOWED_CHARS)) {
|
if (str_starts_with(lbm_def->name, ":"))
|
||||||
|
lbm_def->name.erase(0, 1);
|
||||||
|
|
||||||
|
if (lbm_def->name.empty() ||
|
||||||
|
!string_allowed(lbm_def->name, LBM_NAME_ALLOWED_CHARS)) {
|
||||||
throw ModError("Error adding LBM \"" + lbm_def->name +
|
throw ModError("Error adding LBM \"" + lbm_def->name +
|
||||||
"\": Does not follow naming conventions: "
|
"\": Does not follow naming conventions: "
|
||||||
"Only characters [a-z0-9_:] are allowed.");
|
"Only characters [a-z0-9_:] are allowed.");
|
||||||
|
@ -143,30 +147,7 @@ void LBMManager::loadIntroductionTimes(const std::string ×,
|
||||||
{
|
{
|
||||||
m_query_mode = true;
|
m_query_mode = true;
|
||||||
|
|
||||||
// name -> time map.
|
auto introduction_times = parseIntroductionTimesString(times);
|
||||||
// Storing it in a map first instead of
|
|
||||||
// handling the stuff directly in the loop
|
|
||||||
// removes all duplicate entries.
|
|
||||||
std::unordered_map<std::string, u32> introduction_times;
|
|
||||||
|
|
||||||
/*
|
|
||||||
The introduction times string consists of name~time entries,
|
|
||||||
with each entry terminated by a semicolon. The time is decimal.
|
|
||||||
*/
|
|
||||||
|
|
||||||
size_t idx = 0;
|
|
||||||
size_t idx_new;
|
|
||||||
while ((idx_new = times.find(';', idx)) != std::string::npos) {
|
|
||||||
std::string entry = times.substr(idx, idx_new - idx);
|
|
||||||
std::vector<std::string> components = str_split(entry, '~');
|
|
||||||
if (components.size() != 2)
|
|
||||||
throw SerializationError("Introduction times entry \""
|
|
||||||
+ entry + "\" requires exactly one '~'!");
|
|
||||||
const std::string &name = components[0];
|
|
||||||
u32 time = from_string<u32>(components[1]);
|
|
||||||
introduction_times[name] = time;
|
|
||||||
idx = idx_new + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Put stuff from introduction_times into m_lbm_lookup
|
// Put stuff from introduction_times into m_lbm_lookup
|
||||||
for (auto &it : introduction_times) {
|
for (auto &it : introduction_times) {
|
||||||
|
@ -237,6 +218,33 @@ std::string LBMManager::createIntroductionTimesString()
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unordered_map<std::string, u32>
|
||||||
|
LBMManager::parseIntroductionTimesString(const std::string ×)
|
||||||
|
{
|
||||||
|
std::unordered_map<std::string, u32> ret;
|
||||||
|
|
||||||
|
size_t idx = 0;
|
||||||
|
size_t idx_new;
|
||||||
|
while ((idx_new = times.find(';', idx)) != std::string::npos) {
|
||||||
|
std::string entry = times.substr(idx, idx_new - idx);
|
||||||
|
idx = idx_new + 1;
|
||||||
|
|
||||||
|
std::vector<std::string> components = str_split(entry, '~');
|
||||||
|
if (components.size() != 2)
|
||||||
|
throw SerializationError("Introduction times entry \""
|
||||||
|
+ entry + "\" requires exactly one '~'!");
|
||||||
|
if (components[0].empty())
|
||||||
|
throw SerializationError("LBM name is empty");
|
||||||
|
std::string name = std::move(components[0]);
|
||||||
|
if (name.front() == ':') // old versions didn't strip this
|
||||||
|
name.erase(0, 1);
|
||||||
|
u32 time = from_string<u32>(components[1]);
|
||||||
|
ret[std::move(name)] = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
struct LBMToRun {
|
struct LBMToRun {
|
||||||
std::unordered_set<v3s16> p; // node positions
|
std::unordered_set<v3s16> p; // node positions
|
||||||
|
|
|
@ -149,6 +149,9 @@ private:
|
||||||
// The key of the map is the LBM def's first introduction time.
|
// The key of the map is the LBM def's first introduction time.
|
||||||
lbm_lookup_map m_lbm_lookup;
|
lbm_lookup_map m_lbm_lookup;
|
||||||
|
|
||||||
|
static std::unordered_map<std::string, u32>
|
||||||
|
parseIntroductionTimesString(const std::string ×);
|
||||||
|
|
||||||
// Returns an iterator to the LBMs that were introduced
|
// Returns an iterator to the LBMs that were introduced
|
||||||
// after the given time. This is guaranteed to return
|
// after the given time. This is guaranteed to return
|
||||||
// valid values for everything
|
// valid values for everything
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue