static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; logger.Info("Utopia Realms game server v{1} Protocol: v{0}", ServerConnection.ProtocolVersion, Assembly.GetExecutingAssembly().GetName().Version); DllLoadHelper.LoadUmnanagedLibrary("sqlite3.dll"); var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "main.realm"); if (!File.Exists(path)) { if (args.Length == 0) { logger.Fatal("Could not find the realm file. Specify realm configuration file path."); return; } path = args[0]; if (!File.Exists(path)) { logger.Fatal("Could not find the realm file at " + path); return; } } _serverFactory = new EntityFactory(); EntityFactory.InitializeProtobufInheritanceHierarchy(); WorldConfiguration conf; try { conf = WorldConfiguration.LoadFromFile(path); _serverFactory.Config = conf; logger.Info("Realm file {0} loaded", path); } catch (Exception ex) { logger.Fatal("Exception when trying to load configuration:\n" + ex.Message); return; } System.Net.ServicePointManager.Expect100Continue = false; var configFileName = "server.config"; var port = 0; string desc = null; for (int i = 0; i < args.Length; i++) { var argument = args[i]; if (argument == "-conf" && args.Length > i + 1) { configFileName = args[i + 1]; } if (argument == "-port" && args.Length > i + 1) { port = int.Parse(args[i + 1]); } if (argument == "-desc" && args.Length > i + 1) { desc = args[i + 1]; } } _settingsManager = new XmlSettingsManager <ServerSettings>(@"Server\" + configFileName); _settingsManager.Load(); if (port != 0 && _settingsManager.Settings.ServerPort != port) { _settingsManager.Settings.ServerPort = port; _settingsManager.Save(); } if (string.IsNullOrEmpty(_settingsManager.Settings.Seed)) { Console.WriteLine(); Console.WriteLine("Please enter the seed:"); Console.Write("> "); _settingsManager.Settings.Seed = Console.ReadLine(); _settingsManager.Save(); } if (string.IsNullOrEmpty(_settingsManager.Settings.ServerName) || _settingsManager.Settings.ServerName == "unnamed server") { Console.WriteLine(); Console.WriteLine("Please enter the name of the server:"); Console.Write("> "); _settingsManager.Settings.ServerName = Console.ReadLine(); _settingsManager.Save(); } if (string.IsNullOrEmpty(_settingsManager.Settings.ServerDescription)) { if (desc != null) { _settingsManager.Settings.ServerDescription = desc; } else { Console.WriteLine(); Console.WriteLine("Please enter the server description:"); Console.Write("> "); _settingsManager.Settings.ServerDescription = Console.ReadLine(); _settingsManager.Save(); } } var wp = new WorldParameters { WorldName = "Utopia", SeedName = _settingsManager.Settings.Seed, Configuration = conf }; IocBind(wp); _serverWebApi = new ServerWebApi(); _server = new ServerCore( _settingsManager, _worldGenerator, new ServerUsersStorage(_sqLiteStorageManager, _serverWebApi), _sqLiteStorageManager, _sqLiteStorageManager, _sqLiteStorageManager, _serverFactory, wp ); _serverFactory.LandscapeManager = _server.LandscapeManager; _serverFactory.DynamicEntityManager = _server.AreaManager; _serverFactory.GlobalStateManager = _server.GlobalStateManager; _serverFactory.ScheduleManager = _server.Scheduler; _serverFactory.ServerSide = true; _gameplay = new ServerGameplayProvider(_server, conf); _server.ConnectionManager.Listen(); _server.LoginManager.PlayerEntityNeeded += LoginManagerPlayerEntityNeeded; _server.LoginManager.PlayerLogged += LoginManager_PlayerLogged; _server.UsersStorage.DefaultRole = _server.CustomStorage.GetVariable("DefaultRole", UserRole.Guest); // send alive message each 5 minutes _reportAliveTimer = new Timer(CommitServerInfo, null, 0, 1000 * 60 * 5); _server.EntityManager.LoadNpcs(); while (Console.ReadLine() != "exit") { Console.WriteLine("Type 'exit' to quit"); } _server.Dispose(); }
/// <summary> /// Create new instance of the Server class /// </summary> public ServerCore( XmlSettingsManager <ServerSettings> settingsManager, WorldGenerator worldGenerator, IUsersStorage usersStorage, IChunksStorage chunksStorage, IEntityStorage entityStorage, ICustomStorage customStorage, EntityFactory entityFactory, WorldParameters wp ) { // dependency injection SettingsManager = settingsManager; UsersStorage = usersStorage; EntityStorage = entityStorage; CustomStorage = customStorage; EntityFactory = entityFactory; WorldParameters = wp; if (SettingsManager.Settings == null) { SettingsManager.Load(); } var settings = SettingsManager.Settings; ConnectionManager = new ConnectionManager(SettingsManager.Settings.ServerPort); Scheduler = new ScheduleManager(); UtopiaTime startTime = CustomStorage.GetVariable <UtopiaTime>("GameTimeElapsed"); Clock = new Clock(this, startTime, TimeSpan.FromMinutes(20)); LandscapeManager = new ServerLandscapeManager( this, chunksStorage, worldGenerator, EntityFactory, settings.ChunkLiveTimeMinutes, settings.CleanUpInterval, settings.SaveInterval, settings.ChunksCountLimit, wp); EntityManager = new EntityManager(this); AreaManager = new AreaManager(this); DynamicIdHelper.SetMaxExistsId(EntityStorage.GetMaximumId()); Services = new ServiceManager(this); PerformanceManager = new PerformanceManager(AreaManager); CommandsManager = new CommandsManager(this); ChatManager = new ChatManager(this); GlobalStateManager = new GlobalStateManager(this); LoginManager = new LoginManager(this, EntityFactory); EntitySpawningManager = new EntitySpawningManager(this, worldGenerator.EntitySpawningControler); EntityGrowingManager = new Managers.EntityGrowingManager(this); }
public void InitSinglePlayerServer(WorldParameters worldParam) { if (Server != null) { throw new InvalidOperationException("Already initialized"); } _worldParam = worldParam; _serverFactory = new EntityFactory(); _serverFactory.Config = _worldParam.Configuration; var dbPath = Path.Combine(_vars.ApplicationDataPath, "Server", "Singleplayer", worldParam.WorldName, "ServerWorld.db"); logger.Info("Local world db path is {0}", dbPath); _serverSqliteStorageSinglePlayer = new SqliteStorageManager(dbPath, _serverFactory, worldParam); _serverSqliteStorageSinglePlayer.Register("local", "qwe123".GetSHA1Hash(), UserRole.Administrator); var settings = new XmlSettingsManager <ServerSettings>(@"Server\localServer.config"); settings.Load(); settings.Save(); //Utopia New Landscape Test IWorldProcessor processor = null; IEntitySpawningControler entitySpawningControler = null; switch (worldParam.Configuration.WorldProcessor) { case WorldConfiguration.WorldProcessors.Flat: processor = new FlatWorldProcessor(); break; case WorldConfiguration.WorldProcessors.Utopia: processor = new UtopiaProcessor(worldParam, _serverFactory, _landscapeEntityManager); entitySpawningControler = new UtopiaEntitySpawningControler((UtopiaWorldConfiguration)worldParam.Configuration); break; default: break; } var worldGenerator = new WorldGenerator(worldParam, processor); worldGenerator.EntitySpawningControler = entitySpawningControler; //Old s33m3 landscape //IWorldProcessor processor1 = new s33m3WorldProcessor(worldParam); //IWorldProcessor processor2 = new LandscapeLayersProcessor(worldParam, _serverFactory); //var worldGenerator = new WorldGenerator(worldParam, processor1, processor2); //Vlad Generator //var planProcessor = new PlanWorldProcessor(wp, _serverFactory); //var worldGenerator = new WorldGenerator(wp, planProcessor); settings.Settings.ChunksCountLimit = 1024 * 3; // better use viewRange * viewRange * 3 var port = 4815; while (!TcpConnectionListener.IsPortFree(port)) { port++; } settings.Settings.ServerPort = port; _server = new ServerCore(settings, worldGenerator, _serverSqliteStorageSinglePlayer, _serverSqliteStorageSinglePlayer, _serverSqliteStorageSinglePlayer, _serverSqliteStorageSinglePlayer, _serverFactory, worldParam); _serverFactory.LandscapeManager = Server.LandscapeManager; _serverFactory.DynamicEntityManager = Server.AreaManager; _serverFactory.GlobalStateManager = Server.GlobalStateManager; _serverFactory.ScheduleManager = Server.Scheduler; _serverFactory.ServerSide = true; _server.Initialize(); Server.ConnectionManager.LocalMode = true; Server.ConnectionManager.Listen(); Server.LoginManager.PlayerEntityNeeded += LoginManagerPlayerEntityNeeded; Server.LoginManager.GenerationParameters = default(Utopia.Shared.World.PlanGenerator.GenerationParameters); // planProcessor.WorldPlan.Parameters; Server.Clock.SetCurrentTimeOfDay(UtopiaTimeSpan.FromHours(12)); }