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

Add consistent monotonic day counter - get_day_count()

I've written several experimental bits of code that revolve around the
need for a consistent calendar, but implementing one is extremely hard
in mods due to time changes and mods overriding core.get_timeofday(),
which will conflict.

The second part of the problem is that doing this from a mod requires
constant maintenance of a settings file.

An implementation in core is trivial, however, and solves all of
these problems at virtually no cost: No extra branches in server
steps, and a single branch when minetest.set_time_of_day(), which is
entirely reasonable.

We store the day_count value in env_meta.txt.

The use case is obvious: This change allows mods to create an actual
virtual calendar, or properly account for seasonal changes, etc..

We add a "/days" chatcommand that displays the current day count. No
permissions are needed. It can only retrieve the day count, not
modify it.
This commit is contained in:
Auke Kok 2016-03-06 12:02:21 -08:00 committed by est31
parent 3ce6642a26
commit 4e59fcf5c1
6 changed files with 46 additions and 1 deletions

View file

@ -208,6 +208,8 @@ void Environment::setDayNightRatioOverride(bool enable, u32 value)
void Environment::setTimeOfDay(u32 time)
{
MutexAutoLock lock(this->m_time_lock);
if (m_time_of_day > time)
m_day_count++;
m_time_of_day = time;
m_time_of_day_f = (float)time / 24000.0;
}
@ -238,8 +240,10 @@ void Environment::stepTimeOfDay(float dtime)
bool sync_f = false;
if (units > 0) {
// Sync at overflow
if (m_time_of_day + units >= 24000)
if (m_time_of_day + units >= 24000) {
sync_f = true;
m_day_count++;
}
m_time_of_day = (m_time_of_day + units) % 24000;
if (sync_f)
m_time_of_day_f = (float)m_time_of_day / 24000.0;
@ -256,6 +260,13 @@ void Environment::stepTimeOfDay(float dtime)
}
}
u32 Environment::getDayCount()
{
// Atomic<u32> counter
return m_day_count;
}
/*
ABMWithState
*/
@ -727,6 +738,7 @@ void ServerEnvironment::saveMeta()
args.setU64("lbm_introduction_times_version", 1);
args.set("lbm_introduction_times",
m_lbm_mgr.createIntroductionTimesString());
args.setU64("day_count", m_day_count);
args.writeLines(ss);
ss<<"EnvArgsEnd\n";
@ -792,6 +804,12 @@ void ServerEnvironment::loadMeta()
}
m_lbm_mgr.loadIntroductionTimes(lbm_introduction_times, m_gamedef, m_game_time);
try {
m_day_count = args.getU64("day_count");
} catch (SettingNotFoundException &e) {
// If missing, start the day counter
m_day_count = 0;
}
}
void ServerEnvironment::loadDefaultMeta()