Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        public void InitializeMap(ServerStartFlags flags)
        {
            _game.MapLoadContinue((flags & ServerStartFlags.LoadGame) != 0);

            //Engine can handle map load stuff here if needed

            _game.MapLoadFinished();
        }
Exemplo n.º 3
0
        /// <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();
            }
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }