Exemple #1
0
        private async Task <GameLoadResult> _CreateGameAsync(string mapName, string gamemode)
        {
            DevConsole.SetVariable("game.mode", gamemode, true, true);

            State = GameLoaderState.ChangingMap;

            LoadingHint = "Loading map: " + mapName;

            if (ulong.TryParse(mapName, out ulong workshopId))
            {
                LoadingHint = "Downloading map from workshop";

                if (!SteamServer.IsValid &&
                    !SteamClient.IsValid)
                {
                    return(GameLoadResult.FailedToLoadMap);
                }

                var item = await Item.GetAsync(workshopId);

                if (!item.HasValue)
                {
                    return(GameLoadResult.FailedToLoadMap);
                }

                var download = await SteamUGC.DownloadAsync(workshopId);

                if (!download)
                {
                    return(GameLoadResult.FailedToLoadMap);
                }

                var provider = FileSystem.AddLocalProvider(item.Value.Directory);
                FileSystem.Build();
                foreach (var file in provider.Files)
                {
                    file.Value.WorkshopId = workshopId;
                }
            }

            if (MapLoader.Instance.CurrentMap == null || MapLoader.Instance.CurrentMap.Name != mapName)
            {
                var mapLoadResult = await MapLoader.Instance.LoadMapAsync2(mapName);

                if (mapLoadResult != MapLoadState.Loaded)
                {
                    return(GameLoadResult.FailedToLoadMap);
                }
            }

            if (_cancelled)
            {
                return(GameLoadResult.Cancelled);
            }

            PreGameLoaded?.Invoke();

            LoadingHint = "Loading gamemode: " + gamemode;

            var gamemodeLoaded = Game.GamemodeLoader.LoadGamemode(gamemode);

            if (!gamemodeLoaded)
            {
                return(GameLoadResult.FailedToLoadGamemode);
            }
            GameLoaded?.Invoke();

            State = GameLoaderState.Playing;

            LoadingHint = "Done, game is created.";

            return(GameLoadResult.Success);
        }
Exemple #2
0
        private async Task <GameLoadResult> _JoinGameAsync(string address, int port = 0, string password = null)
        {
            if (Game.IsHost)
            {
                return(GameLoadResult.None);
            }

            // 1. Connect
            LoadingHint = "Connecting to host";
            if (_cancelled)
            {
                return(GameLoadResult.Cancelled);
            }

            var connectionResult = await(Game.Network as ClientSocketManager).ConnectAsync(address, port, password);

            if (connectionResult != ClientSocketStatus.Connected)
            {
                return(GameLoadResult.FailedToConnect);
            }

            // 2. Sync files
            //LoadingHint = "Synchronizing files";
            //if (_cancelled) { return GameLoadResult.Cancelled; }

            //_cts?.Dispose();
            //_cts = new CancellationTokenSource();
            //var syncResult = await Game.GetFSComponent<FileDownloader>().SyncWithHostAsync(_cts);
            //_cts?.Dispose();
            //if (syncResult != FileDownloader.SyncState.Completed)
            //{
            //    return GameLoadResult.FailedToSync;
            //}

            // 3. Request ClientIndex and what map, gamemode to load
            LoadingHint = "Requesting game info";
            if (_cancelled)
            {
                return(GameLoadResult.Cancelled);
            }

            Game.Network.BroadcastPacket(PacketUtility.TakePacket <MapChange>());
            var mapChange = await(Game.Network as ClientSocketManager).WaitForPacketAsync <MapChange>(5000);

            if (mapChange == null)
            {
                return(GameLoadResult.MissingMapChange);
            }

            Game.ClientIndex = mapChange.ClientIndex;
            State            = GameLoaderState.ChangingMap;

            // 5. Load the map
            LoadingHint = "Loading the map: " + mapChange.MapName;
            if (_cancelled)
            {
                return(GameLoadResult.Cancelled);
            }

            // with a local server the map should already be loaded, so let's check first
            if (MapLoader.Instance.CurrentMap == null || MapLoader.Instance.CurrentMap.Name != mapChange.MapName)
            {
                var mapLoadResult = await MapLoader.Instance.LoadMapAsync2(mapChange.MapName);

                if (mapLoadResult != MapLoadState.Loaded)
                {
                    return(GameLoadResult.FailedToLoadMap);
                }
            }

            PreGameLoaded?.Invoke();

            // 6. Load the gamemode
            LoadingHint = "Loading the gamemode: " + mapChange.Gamemode;
            if (_cancelled)
            {
                return(GameLoadResult.Cancelled);
            }

            var gamemodeLoaded = Game.GamemodeLoader.LoadGamemode(mapChange.Gamemode);

            if (!gamemodeLoaded)
            {
                return(GameLoadResult.FailedToLoadGamemode);
            }

            GameLoaded?.Invoke();

            // 7. Notify server we're in
            LoadingHint = "Done, entering game";
            if (_cancelled)
            {
                return(GameLoadResult.Cancelled);
            }

            var pi2 = PacketUtility.TakePacket <PlayerIntroduction>();

            pi2.Step = PlayerIntroduction.JoinStep.Introduce;
            Game.Network.BroadcastPacket(pi2);

            State = GameLoaderState.Playing;

            return(GameLoadResult.Success);
        }