summaryrefslogtreecommitdiffstats
path: root/src/World.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/World.cpp')
-rw-r--r--src/World.cpp54
1 files changed, 23 insertions, 31 deletions
diff --git a/src/World.cpp b/src/World.cpp
index 8ef4dc0f3..bed5d6701 100644
--- a/src/World.cpp
+++ b/src/World.cpp
@@ -197,20 +197,21 @@ void cWorld::cTickThread::Execute(void)
{
cTimer Timer;
- long long msPerTick = 50;
- long long LastTime = Timer.GetNowTime();
+ const Int64 msPerTick = 50;
+ Int64 LastTime = Timer.GetNowTime();
+ Int64 TickDuration = 50;
while (!m_ShouldTerminate)
{
- long long NowTime = Timer.GetNowTime();
+ Int64 NowTime = Timer.GetNowTime();
float DeltaTime = (float)(NowTime - LastTime);
- m_World.Tick(DeltaTime);
- long long TickTime = Timer.GetNowTime() - NowTime;
+ m_World.Tick(DeltaTime, (int)TickDuration);
+ TickDuration = Timer.GetNowTime() - NowTime;
- if (TickTime < msPerTick)
+ if (TickDuration < msPerTick)
{
// Stretch tick time until it's at least msPerTick
- cSleep::MilliSleep((unsigned int)(msPerTick - TickTime));
+ cSleep::MilliSleep((unsigned int)(msPerTick - TickDuration));
}
LastTime = NowTime;
@@ -485,30 +486,21 @@ void cWorld::Start(void)
}
} // switch (m_Dimension)
- // Try to find the "SpawnPosition" key in the world configuration
- // Set a boolean value if so
+ // Try to find the "SpawnPosition" key and coord values in the world configuration, set the flag if found
int KeyNum = IniFile.FindKey("SpawnPosition");
- unsigned int NumSpawnPositionKeys = ((KeyNum != -1) ? (IniFile.GetNumValues(KeyNum)) : 0);
-
- if (NumSpawnPositionKeys > 0)
- {
- for (unsigned int i = 0; i < NumSpawnPositionKeys; i++)
- {
- AString ValueName = IniFile.GetValueName(KeyNum, i);
- if (
- (ValueName.compare("X") == 0) ||
- (ValueName.compare("Y") == 0) ||
- (ValueName.compare("Z") == 0)
- )
- {
- m_bSpawnExplicitlySet = true;
- LOGD("Spawnpoint explicitly set!");
- }
- }
- }
+ m_bSpawnExplicitlySet =
+ (
+ (KeyNum >= 0) &&
+ (
+ (IniFile.FindValue(KeyNum, "X") >= 0) ||
+ (IniFile.FindValue(KeyNum, "Y") >= 0) ||
+ (IniFile.FindValue(KeyNum, "Z") >= 0)
+ )
+ );
if (m_bSpawnExplicitlySet)
{
+ LOGD("Spawnpoint explicitly set!");
m_SpawnX = IniFile.GetValueF("SpawnPosition", "X", m_SpawnX);
m_SpawnY = IniFile.GetValueF("SpawnPosition", "Y", m_SpawnY);
m_SpawnZ = IniFile.GetValueF("SpawnPosition", "Z", m_SpawnZ);
@@ -660,10 +652,10 @@ void cWorld::Stop(void)
-void cWorld::Tick(float a_Dt)
+void cWorld::Tick(float a_Dt, int a_LastTickDurationMSec)
{
// Call the plugins
- cPluginManager::Get()->CallHookWorldTick(*this, a_Dt);
+ cPluginManager::Get()->CallHookWorldTick(*this, a_Dt, a_LastTickDurationMSec);
// We need sub-tick precision here, that's why we store the time in seconds and calculate ticks off of it
m_WorldAgeSecs += (double)a_Dt / 1000.0;
@@ -2604,12 +2596,12 @@ void cWorld::TickQueuedBlocks(void)
for (std::vector<BlockTickQueueItem *>::iterator itr = m_BlockTickQueueCopy.begin(); itr != m_BlockTickQueueCopy.end(); itr++)
{
- BlockTickQueueItem *Block = (*itr);
+ BlockTickQueueItem * Block = (*itr);
Block->TicksToWait -= 1;
if (Block->TicksToWait <= 0)
{
// TODO: Handle the case when the chunk is already unloaded
- BlockHandler(GetBlock(Block->X, Block->Y, Block->Z))->OnUpdate(this, Block->X, Block->Y, Block->Z);
+ m_ChunkMap->TickBlock(Block->X, Block->Y, Block->Z);
delete Block; // We don't have to remove it from the vector, this will happen automatically on the next tick
}
else