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); }
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); }