void ToggleDuelState(bool duelStarted) { btnGood.SetPropertyThreadSafe(() => btnGood.Visible, duelStarted); btnGood.SetPropertyThreadSafe(() => btnGood.Enabled, false); btnBad.SetPropertyThreadSafe(() => btnBad.Visible, duelStarted); btnBad.SetPropertyThreadSafe(() => btnBad.Enabled, false); btnStartDuel.SetPropertyThreadSafe(() => btnStartDuel.Visible, !duelStarted); btnGetStat.SetPropertyThreadSafe(() => btnGetStat.Enabled, !duelStarted); if (!duelStarted) { lblEnemyHealth.SetPropertyThreadSafe(() => lblEnemyHealth.Text, ""); lblEnemyName.SetPropertyThreadSafe(() => lblEnemyName.Text, ""); TestFormControlHelper.ControlInvoke(lvDuelHistory, () => lvDuelHistory.Items.Clear()); } }
void ReadClientMsg() { string serverIp; try { GrpcChannel channel = Connection.GetDispatcherChannel(); var client = new GodvilleServiceClient(channel); serverIp = client.StartDuel(new ClientId { Id = Program.Client.Id }).Ip; } catch (Exception e) { //Выбранный диспетчер вдруг умер после проверки на активность Logger.AddErrorMessage(e.Message); MessageBox.Show("Дуэль не может быть начата"); return; } //заглушка serverIp = "127.0.0.1:8017"; var lines = serverIp.Split(":"); int port = int.Parse(lines[1]); string server = lines[1]; try { using (TcpClient tcpClient = new TcpClient(lines[0], port)) { NetworkStream networkStream = tcpClient.GetStream(); StreamReader sr = new StreamReader(networkStream); StreamWriter sw = new StreamWriter(networkStream); WriteStream.WriteNetworkStream = networkStream; sr.BaseStream.ReadTimeout = 20 * 1000; sw.WriteLine(Program.Client.Id.ToString()); sw.Flush(); string input; ToggleDuelState(true); while (true) { Model.ClientMsg clientMsg; try { if ((input = sr.ReadLine()) != null) { clientMsg = JsonConvert.DeserializeObject <Model.ClientMsg>(input); } else { continue; } } catch (IOException e) { MessageBox.Show("Дуэль была прервана обстоятельствами, теперь вы можете найти ее в статистике"); Logger.AddErrorMessage(e.Message); ToggleDuelState(false); return; } if (clientMsg != null) { bool isHodEven = clientMsg.HodNum % 2 == 0; if (clientMsg.Type != 4) { ToggleMyHod(isHodEven); } if (clientMsg.Type == 4) { lblEnemyName.SetPropertyThreadSafe(() => lblEnemyName.Text, clientMsg.EnemyName); } TestFormControlHelper.ControlInvoke(lvDuelHistory, () => lvDuelHistory.Items.Add(clientMsg.Phrase)); if (clientMsg.Glas != -1 && clientMsg.Type != 4) { string glasMsg; if (isHodEven) // в ход клиента приходит глас от противника { glasMsg = clientMsg.Glas == 0 ? "Противник сделал плохо. Ваше здоровье уменьшилось" : "Противник сделал хорошо. Его герой вылечился"; } else // в ход противника видим глас с нашего прошлого хода (если сработал) { glasMsg = clientMsg.Glas == 0 ? "Вы сделали плохо. Здоровье противника уменьшилось" : "Вы сделали хорошо. Ваш герой подлатал раны"; } TestFormControlHelper.ControlInvoke(lvDuelHistory, () => lvDuelHistory.Items.Add(glasMsg)); TestFormControlHelper.ControlInvoke( lvDuelHistory, () => lvDuelHistory.Items[lvDuelHistory.Items.Count - 1].BackColor = Color.PeachPuff); } TestFormControlHelper.ControlInvoke(lvDuelHistory, () => lvDuelHistory.EnsureVisible(lvDuelHistory.Items.Count - 1)); lblEnemyHealth.SetPropertyThreadSafe(() => lblEnemyHealth.Text, clientMsg.EnemyLives.ToString()); lblYourHealth.SetPropertyThreadSafe(() => lblYourHealth.Text, clientMsg.Lives.ToString()); if (clientMsg.Type == 0) { MessageBox.Show("Дуэль завершена, теперь вы можете найти ее в статистике"); ToggleDuelState(false); return; } } } } } catch (Exception e) { MessageBox.Show("Дуэль закончилась, не начавшись: ваш противник внезано провалился сквозь землю"); Logger.AddErrorMessage(e.Message); return; } }