public static void UpdateLoop()
        {
#if CATCHERROR_UPDATELOOP
            try
            {
#endif
            if (Terraria_Server.Main.rand == null)
            {
                Terraria_Server.Main.rand = new Random((int)DateTime.Now.Ticks);
            }

            bool hibernate = properties.StopUpdatesWhenEmpty, backup = false;
            int collect = 0, backupInterval = properties.BackupInterval;
            DateTime backupDate = DateTime.Now;

            if (backupInterval > 0)
            {
                backup = properties.AllowBackups;
            }

            if (properties.SimpleLoop)
            {
                Stopwatch s = new Stopwatch();
                s.Start();

                double updateTime = 16.66666666666667;
                double nextUpdate = s.ElapsedMilliseconds + updateTime;
                while (!NetPlay.disconnect)
                {
                    double now  = s.ElapsedMilliseconds;
                    double left = nextUpdate - now;

                    if (left >= 0)
                    {
                        while (left > 1)
                        {
                            Thread.Sleep((int)left);
                            left = nextUpdate - s.ElapsedMilliseconds;
                        }
                        nextUpdate += updateTime;
                    }
                    else
                    {
                        nextUpdate = now + updateTime;
                    }

                    if (NetPlay.anyClients || (hibernate == false))
                    {
                        var start = s.Elapsed;
                        Terraria_Server.Main.Update(s);
                        LastUpdateTime = s.Elapsed - start;
                    }

                    if (collect++ >= 1000)                     //Every 1000 loops should be less intensive.
                    {
                        if (properties.CollectGarbage)
                        {
                            GC.Collect();
                        }

                        collect = 0;
                    }

                    /* Check tolled tasks */
                    Tasks.CheckTasks();

                    if ((DateTime.Now - backupDate).TotalMinutes >= backupInterval && backup)
                    {
                        backupDate = DateTime.Now;

                        try
                        {
                            BackupManager.AutoPurge();
                            BackupManager.PerformBackup();
                        }
                        catch (Exception e)
                        {
                            ProgramLog.Error.Log(
                                String.Format("Error during the backup process.\n{0}", e)
                                );
                        }
                    }
                }

                return;
            }

            double serverProcessAverage = 16.666666666666668;
            double leftOver             = 0.0;

            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            while (!NetPlay.disconnect)
            {
                double elapsed = (double)stopwatch.ElapsedMilliseconds;
                if (elapsed + leftOver >= serverProcessAverage)
                {
                    leftOver += elapsed - serverProcessAverage;
                    stopwatch.Reset();
                    stopwatch.Start();

                    if (leftOver > 1000.0)
                    {
                        leftOver = 1000.0;
                    }

                    if (NetPlay.anyClients || (hibernate == false))
                    {
                        Terraria_Server.Main.Update(stopwatch);
                    }

                    double num9 = (double)stopwatch.ElapsedMilliseconds + leftOver;
                    if (num9 < serverProcessAverage)
                    {
                        int num10 = (int)(serverProcessAverage - num9) - 1;
                        if (num10 > 1)
                        {
                            Thread.Sleep(num10);
                            if (hibernate && !NetPlay.anyClients)
                            {
                                leftOver = 0.0;
                                Thread.Sleep(10);
                            }
                        }
                    }

                    /* Check tolled tasks */
                    Tasks.CheckTasks();

                    if (collect++ >= 1000)                     //Every 1000 loops should be less intensive.
                    {
                        if (properties.CollectGarbage)
                        {
                            GC.Collect();
                        }

                        collect = 0;
                    }

                    if ((DateTime.Now - backupDate).TotalMinutes >= backupInterval && backup)
                    {
                        backupDate = DateTime.Now;

                        ProgramLog.Log("Performing backup...");
                        BackupManager.PerformBackup();
                    }
                }
                Thread.Sleep(0);
            }

#if CATCHERROR_UPDATELOOP
        }

        catch (Exception e)
        {
            ProgramLog.Log(e, "World update thread crashed");
        }
#endif
        }