public bool Start(string mapName, string startSpot = null, ServerStartFlags flags = ServerStartFlags.None) { //TODO: start transitioning clients _logger.Information($"Loading map \"{mapName}\""); //TODO: print server vars //TODO: set hostname if (startSpot != null) { _logger.Debug($"Spawn Server {mapName}: [{startSpot}]\n"); } else { _logger.Debug($"Spawn Server {mapName}\n"); } ++_spawnCount; //TODO: clear custom data if size exceeds maximum //TODO: allocate client memory EventSystem.DispatchEvent(EngineEvents.ServerMapDataStartLoad); if (!TryMapLoadBegin(mapName, flags)) { Stop(); return(false); } return(true); }
public void InitializeMap(ServerStartFlags flags) { _game.MapLoadContinue((flags & ServerStartFlags.LoadGame) != 0); //Engine can handle map load stuff here if needed _game.MapLoadFinished(); }
/// <summary> /// Start a new map, loading entities from the map entity data string /// </summary> /// <param name="command"></param> private void StartNewMap(ICommandArgs command) { if (command.Count == 0) { Logger.Information("map <levelname> : changes server to specified map"); return; } Client?.Disconnect(false); ClearMemory(); var mapName = command[0]; //Remove BSP extension if (mapName.EndsWith(FileExtensionUtils.AsExtension(Framework.Extension.BSP))) { mapName = Path.GetFileNameWithoutExtension(mapName); } EventSystem.DispatchEvent(EngineEvents.EngineNewMapRequest); if (!World.IsMapValid(mapName)) { Logger.Error($"map change failed: '{mapName}' not found on server."); return; } Server.Stop(); EventSystem.DispatchEvent(EngineEvents.EngineStartingServer); //Reset time //TODO: define constant for initial time _engineTime.ElapsedTime = 1; _engineTime.FrameTime = 0; const ServerStartFlags flags = ServerStartFlags.None; if (!Server.Start(mapName, null, flags)) { return; } Server.Activate(); //Listen server hosts need to connect to their own server if (Client != null) { //Client.CommandContext.QueueCommands($"connect {NetAddresses.Local}"); //TODO: set up client Client.LocalConnect(); } }
private bool TryMapLoadBegin(string mapName, ServerStartFlags flags) { //Reset timers _gameTime.ElapsedTime = _engine.EngineTime.ElapsedTime; _gameTime.FrameTime = 0; _engine.EventSystem.DispatchEvent(EngineEvents.MapStartedLoading, new MapStartedLoading( mapName, _engine.World.MapInfo?.Name, (flags & ServerStartFlags.ChangeLevel) != 0, (flags & ServerStartFlags.LoadGame) != 0)); if (!_engine.World.TryLoadMap(mapName, _engine.EngineTime, CommandContext)) { return(false); } _engine.World.InitializeMap((flags & ServerStartFlags.LoadGame) != 0); //TODO: initialize sky return(true); }
public bool TryMapLoadBegin(string mapName, ServerStartFlags flags) { //Reset timers _gameTime.ElapsedTime = _engine.EngineTime.ElapsedTime; _gameTime.FrameTime = 0; _engine.EventSystem.DispatchEvent(new MapStartedLoading( mapName, MapInfo?.Name, (flags & ServerStartFlags.ChangeLevel) != 0, (flags & ServerStartFlags.LoadGame) != 0)); var mapFileName = GameBridge.ModelUtils.FormatMapFileName(mapName); IModel worldModel; try { worldModel = _engineModels.LoadModel(mapFileName); } catch (Exception e) { //TODO: needs a rework if (e is InvalidOperationException || e is InvalidBSPVersionException || e is IOException) { worldModel = null; } else { throw; } } if (worldModel == null) { _logger.Information($"Couldn't spawn server {mapFileName}"); return(false); } _engine.EventSystem.DispatchEvent(EngineEvents.ServerMapDataFinishLoad); if (!(worldModel is BSPModel bspWorldModel)) { _logger.Information($"Model {mapFileName} is not a map"); return(false); } _engine.EventSystem.DispatchEvent(EngineEvents.ServerMapCRCComputed); MapInfo = new MapInfo(mapName, MapInfo?.Name, bspWorldModel); //Load world sub models foreach (var i in Enumerable.Range(1, bspWorldModel.BSPFile.Models.Count - 1)) { _engineModels.LoadModel($"{Framework.BSPModelNamePrefix}{i}"); } //Load the fallback model now to ensure that BSP indices are matched up _engineModels.LoadFallbackModel(); //TODO: initialize sky return(true); }