public SimulationManager(ISettings settings, UpdateHub updateHub) { mainLock = new object(); this.settings = settings; //TODO: Where are the settings? extensionLoader = new ExtensionLoader(settings); extensionLoader.LoadExtensions(); definitionManager = new DefinitionManager(extensionLoader); var persistenceManager = new DiskPersistenceManager(extensionLoader, definitionManager, settings); ResourceManager = new ResourceManager(extensionLoader, definitionManager, settings, persistenceManager); ResourceManager.InsertUpdateHub(updateHub); chunkSubscription = updateHub.Subscribe(ResourceManager.GlobalChunkCache, DefaultChannels.Chunk); ResourceManager.GlobalChunkCache.InsertUpdateHub(updateHub); Service = new GameService(ResourceManager); simulation = new Simulation(ResourceManager, extensionLoader, Service) { IsServerSide = true }; backgroundThread = new Thread(SimulationLoop) { Name = "Simulation Loop", IsBackground = true }; }
public void CreateManager(IExtensionResolver extensionResolver, IDefinitionManager definitionManager, ISettings settings, bool multiplayer) { IPersistenceManager persistenceManager; if (resourceManager != null) { if (resourceManager.CurrentUniverse != null) { resourceManager.UnloadUniverse(); } resourceManager = null; } if (multiplayer) { var rawIpAddress = settings.Get <string>("server").Trim(); string host; IPAddress iPAddress; int port = -1; if (rawIpAddress[0] == '[' || !IPAddress.TryParse(rawIpAddress, out iPAddress)) //IPV4 || IPV6 without port { string stringIpAddress; if (rawIpAddress[0] == '[') // IPV6 with Port { port = int.Parse(rawIpAddress.Split(':').Last()); stringIpAddress = rawIpAddress.Substring(1, rawIpAddress.IndexOf(']') - 1); } else if (rawIpAddress.Contains(':') && IPAddress.TryParse(rawIpAddress.Substring(0, rawIpAddress.IndexOf(':')), out iPAddress)) //IPV4 with Port { port = int.Parse(rawIpAddress.Split(':').Last()); stringIpAddress = iPAddress.ToString(); } else if (rawIpAddress.Contains(':')) //Domain with Port { port = int.Parse(rawIpAddress.Split(':').Last()); stringIpAddress = rawIpAddress.Split(':').First(); } else //Domain without Port { stringIpAddress = rawIpAddress; } host = stringIpAddress; } else { host = rawIpAddress; } var client = new Network.Client(); client.Connect(host, port > 0 ? (ushort)port : (ushort)8888); persistenceManager = new NetworkPersistenceManager(client, definitionManager); networkUpdateManager = new NetworkUpdateManager(client, UpdateHub, definitionManager); } else { persistenceManager = new DiskPersistenceManager(extensionResolver, definitionManager, settings); } resourceManager = new ResourceManager(extensionResolver, definitionManager, settings, persistenceManager); resourceManager.InsertUpdateHub(UpdateHub as UpdateHub); chunkSubscription = UpdateHub.Subscribe(GlobalChunkCache, DefaultChannels.Chunk); GlobalChunkCache.InsertUpdateHub(UpdateHub); IsMultiplayer = multiplayer; if (multiplayer) { resourceManager.GlobalChunkCache.ChunkColumnChanged += (s, c) => { var networkPersistence = (NetworkPersistenceManager)persistenceManager; networkPersistence.SendChangedChunkColumn(c); }; } }