/// <summary> /// Primary game loop. /// </summary> public void GameLoop() { while (Running) { _resetEvent.WaitOne(1); FCounter.Update(); try { if (WorldLoaded && GameTime != null) { Users.Frame(); if (GameTime.Update()) // every second { if (GameTime.TickIncrease) // update when enough seconds pass to increase tick. { Logger.Log("Updating world. Tick: {0}", GameTime.Tick.ToString()); Users.TickUpdate(); Structures.TickUpdate(); _taskQueue.Update(); Save(); SockServ.Broadcast("tick", GameTime.Tick.ToString()); } } } //Net.Update(); _taskQueue.Update(); // run items queued during frame. Logger.Update(); // print items sent to log during frame. } catch (Exception e) { Logger.LogError("{0}: {1}\n{2}", e.GetType(), e.Message, e.StackTrace); } } }
/// <summary> /// Save and exit server. /// </summary> public void Exit() { WorldLoaded = false; SockServ.Stop("stopping server..."); TaskQueue.Close(); Running = false; autoSaver.Stop(); _tickThread.Abort(); }