public ServerWorldState(ServerWorldDataContext serverWorldDataContext) : base() { dataContext = serverWorldDataContext; //new WorldWebDataContext(string.Format(@"http://{0}:{1}/", LegendServer.Properties.Settings.Default.DataServerAddress, LegendServer.Properties.Settings.Default.DataServerPort)); int expectedMaxPlayers = 1000; //server.Statistics.PlayerPeak; int mapZones = 1; //maps.Count; characters = new Dictionary <int, Character>(expectedMaxPlayers); maptoCharacterRelations = new List <int> [mapZones]; mapToGroundItems = new List <int> [mapZones]; for (int i = 0; i < mapZones; i++) { maptoCharacterRelations[i] = new List <int>(expectedMaxPlayers); mapToGroundItems[i] = new List <int>(expectedMaxPlayers); } }
public void Start() { //this.Status = ServerStatus.Starting; Assembly assembly = Assembly.GetEntryAssembly(); Version ver = assembly.GetName().Version; ConsoleGameServer.WriteLine("LegendServer Version {0}.{1}, Build {2}.{3}", ver.Major, ver.Minor, ver.Build, ver.Revision); ConsoleGameServer.WriteLine("Running on .NET Framework Version {0}.{1}.{2}", Environment.Version.Major, Environment.Version.Minor, Environment.Version.Build); try { ConsoleGameServer.WriteLine("Starting Data Connection..."); worldDataContext = new ServerWorldDataContext(string.Format(@"http://{0}:{1}/", LegendServer.Properties.Settings.Default.DataServerAddress, LegendServer.Properties.Settings.Default.DataServerPort)); if (!worldDataContext.AuthServer(LegendServer.Properties.Settings.Default.DataServerUsername, LegendServer.Properties.Settings.Default.DataServerPassword)) { throw new Exception("Failed to auth with data server."); } } catch (Exception e) { ConsoleGameServer.WriteLine("Starting Data Connection failed, general Exception occured:"); ConsoleGameServer.WriteLine(e.ToString()); this.WaitOnKeyPress(); return; } finally { ConsoleGameServer.WriteLine("Data Connection Successfull."); } try { ConsoleGameServer.WriteLine("Starting WorldServer..."); worldState = new ServerWorldState(worldDataContext); worldPump = new WorldPump(); worldPump.State = worldState; worldServerTask = Task.Factory.StartNew(() => worldPump.Start()); } catch (Exception se) { ConsoleGameServer.WriteLine("Starting WorldServer failed:"); ConsoleGameServer.WriteLine(se.ToString()); this.WaitOnKeyPress(); return; } finally { ConsoleGameServer.WriteLine("WorldServer running."); //this.Status = ServerStatus.Running; } try { ConsoleGameServer.WriteLine("Starting SocketServer..."); socketServer = new SocketServer(this); //socketServer.Activity += SocketServer_Activity; socketServer.ProcessPacket += SocketServer_ProcessPacket; socketServerTask = Task.Factory.StartNew(() => socketServer.Start()); } catch (SocketException se) { ConsoleGameServer.WriteLine("Starting SocketServer failed:"); ConsoleGameServer.WriteLine(se.ToString()); this.WaitOnKeyPress(); return; } finally { ConsoleGameServer.WriteLine("SocketServer running on port {0}.", SocketServer.Port); //this.Status = ServerStatus.Running; } var returnval = Task.WaitAny(worldServerTask, socketServerTask); worldPump.IsRunning = socketServer.IsRunning = false; //worldPump.State.SaveAndClose(); //Sould be located in DataContex. Game state should not be datalayer aware. socketServer.Close(); //this.Status = ServerStatus.Halting; }