private async Task ListenGameState(Channel channel) { var mapState = new ClientMapData(); var playerState = new ClientPlayerState(); await mSyncContext.Execute(() => PlayerConnected?.Invoke(playerState), channel.ShutdownToken); try { while (true) { try { mGameService = new GameService.GameServiceClient(channel); using (var call = mGameService.ConnectAndListenState(new Empty())) using (var stateStream = call.ResponseStream) { while (await stateStream.MoveNext(channel.ShutdownToken)) { channel.ShutdownToken.ThrowIfCancellationRequested(); var state = stateStream.Current; if (state.Map != null) { mapState.State = new MapState(state.Map); } if (state.Player != null) { playerState.PlayerState = new PlayerState(state.Player); } channel.ShutdownToken.ThrowIfCancellationRequested(); if (!mMapLoaded) { mMapLoaded = true; await mSyncContext.Execute(() => { MapLoaded?.Invoke(mapState); BaseCreated?.Invoke(state.BasePos.ToUnity()); }, channel.ShutdownToken); var tChat = ListenChat(mGameService, channel); var t0 = mWorkerCreationStateListener.ListenCreations(mChannel); var t1 = mBuildingTemplateCreationStateListener.ListenCreations(mChannel); var t2 = mCentralBuildingCreationStateListener.ListenCreations(mChannel); var t3 = mMiningCampCreationListener.ListenCreations(mChannel); var t4 = mBarrakCreationListener.ListenCreations(mChannel); var t5 = mRangedWarriorCreationStateListener.ListenCreations(mChannel); var t6 = mMeeleeWarriorCreationStateListener.ListenCreations(mChannel); } } } break; } catch (RpcException e) { if (e.Status.StatusCode != StatusCode.Unavailable) { throw; } await Task.Delay(TimeSpan.FromSeconds(0.5)); } } } catch (Exception e) { Debug.LogError(e); DisconnectedFromServer?.Invoke(); throw; } }