/// <summary> /// Tries to change the trade button change to the new <paramref name="tradeButtonState"/>. /// </summary> /// <param name="trader">The trader.</param> /// <param name="tradeButtonState">The new state of the trade button.</param> public void TradeButtonChanged(ITrader trader, TradeButtonState tradeButtonState) { using var loggerScope = (trader as Player)?.Logger.BeginScope(this.GetType()); var success = (tradeButtonState == TradeButtonState.Checked && trader.PlayerState.TryAdvanceTo(PlayerState.TradeButtonPressed)) || (tradeButtonState == TradeButtonState.Unchecked && trader.PlayerState.TryAdvanceTo(PlayerState.TradeOpened)); if (!success) { return; } var tradingPartner = trader.TradingPartner; if (trader.PlayerState.CurrentState == PlayerState.TradeButtonPressed && tradingPartner != null && tradingPartner.PlayerState.CurrentState == PlayerState.TradeButtonPressed) { TradeResult result = this.InternalFinishTrade(trader, tradingPartner); if (result != TradeResult.Success) { this.CancelTrade(tradingPartner); this.CancelTrade(trader); (trader as Player)?.Logger.LogDebug($"Cancelled the trade because of unfinished state. trader: {trader.Name}, partner:{tradingPartner.Name}"); } trader.ViewPlugIns.GetPlugIn <ITradeFinishedPlugIn>()?.TradeFinished(result); tradingPartner.ViewPlugIns.GetPlugIn <ITradeFinishedPlugIn>()?.TradeFinished(result); } else { tradingPartner?.ViewPlugIns.GetPlugIn <IChangeTradeButtonStatePlugIn>()?.ChangeTradeButtonState(TradeButtonState.Checked); } }
/// <summary> /// Tries to change the trade button change to the new <paramref name="tradeButtonState"/>. /// </summary> /// <param name="trader">The trader.</param> /// <param name="tradeButtonState">The new state of the trade button.</param> public void TradeButtonChanged(ITrader trader, TradeButtonState tradeButtonState) { var success = (tradeButtonState == TradeButtonState.Checked && trader.PlayerState.TryAdvanceTo(PlayerState.TradeButtonPressed)) || (tradeButtonState == TradeButtonState.Unchecked && trader.PlayerState.TryAdvanceTo(PlayerState.TradeOpened)); if (!success) { return; } var tradingPartner = trader.TradingPartner; if (trader.PlayerState.CurrentState == PlayerState.TradeButtonPressed && tradingPartner != null && tradingPartner.PlayerState.CurrentState == PlayerState.TradeButtonPressed) { TradeResult result = this.InternalFinishTrade(trader, tradingPartner); if (result != TradeResult.Success) { this.CancelTrade(tradingPartner); this.CancelTrade(trader); Log.Warn($"Cancelled the trade because of unfinished state. trader: {trader.Name}, partner:{tradingPartner.Name}"); } trader.TradeView.TradeFinished(result); tradingPartner.TradeView.TradeFinished(result); } else { (trader.TradingPartner as Player)?.PlayerView.TradeView.ChangeTradeButtonState(TradeButtonState.Checked); } }
/// <inheritdoc/> /// <remarks> /// This message is sent when the trading partner presses or un-presses the trade accept button. /// Examples: /// C1 04 3C 00 Partner unpressed /// C1 04 3C 01 Partner pressed /// C1 04 3C 02 Button is red for x seconds /// </remarks> public void ChangeTradeButtonState(TradeButtonState state) { using (var writer = this.connection.StartSafeWrite(0xC1, 4)) { var packet = writer.Span; packet[2] = 0x3C; packet[3] = (byte)state; writer.Commit(); } }
/// <inheritdoc/> /// <remarks> /// This message is sent when the trading partner presses or un-presses the trade accept button. /// Examples: /// C1 04 3C 00 Partner unpressed /// C1 04 3C 01 Partner pressed /// C1 04 3C 02 Button is red for x seconds /// </remarks> public void ChangeTradeButtonState(TradeButtonState state) { this.connection.Send(new byte[] { 0xC1, 0x04, 0x3C, (byte)state }); }