public async Task <GameLoadResult> CreateGameAsync(string mapName, string gamemode) { if (State != GameLoaderState.None) { Debug.LogError($"{Game.IsHost} Can't create game while state is: {State}"); return(GameLoadResult.None); } State = GameLoaderState.Creating; FileSystem.ClearDownloadList(); _cancelled = false; Loading = true; var result = await _CreateGameAsync(mapName, gamemode); Loading = false; if (result == GameLoadResult.Success) { State = GameLoaderState.Playing; } return(result); }
public async Task <GameLoadResult> JoinGameAsync(string address, int port = 0, string password = null) { if (State != GameLoaderState.None) { Debug.LogError($"{Game.IsHost} Can't join while state is: {State}"); return(GameLoadResult.None); } State = GameLoaderState.Joining; _lastAddress = address; _lastPort = port; _lastPassword = password; _cancelled = false; FileSystem.EmptyTempFolder(); Loading = true; var result = await _JoinGameAsync(address, port, password); Loading = false; if (result != GameLoadResult.Success) { return(result); } else { _retrying = false; } State = GameLoaderState.Playing; return(result); }
protected override void _Destroy() { PreGameLoaded = null; GameLoaded = null; PreGameUnloaded = null; GameUnloaded = null; State = GameLoaderState.None; }
private async void ChangeMapAsync(string map, string gamemode, string name, string pass) { if (State != GameLoaderState.Playing) { Debug.LogError($"{Game.IsHost} Can't change map while state is: {State}"); return; } State = GameLoaderState.ChangingMap; GameServer.Instance.Socket.DisconnectAllPlayers(DenyReason.MapChange.ToString()); await Task.Delay(100); await CreateGameAsync(map, gamemode); }
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); }