diff options
Diffstat (limited to 'src/World.cpp')
-rw-r--r-- | src/World.cpp | 54 |
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 |