Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 28 additions & 16 deletions GameFrameX.Hotfix/Logic/ServerRole/Trade/TradeComponentAgent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,35 @@ public Task OnPlaceAsync(long playerId, ReqTradePlace request, RespTradePlace re

var opposite = request.Side == TradeSide.Buy ? book.Sells : book.Buys;
var (remaining, deals) = TradeRules.ExecuteMatch(order, opposite);
RecordDeals(order, response, deals, now);

if (remaining > 0)
{
order.Remaining = (int)remaining;
var ownSide = request.Side == TradeSide.Buy ? book.Buys : book.Sells;
ownSide.Add(order);
ownSide.Sort(request.Side == TradeSide.Buy ? TradeRules.CompareBuy : TradeRules.CompareSell);
State.Orders[order.OrderId] = order;
response.OrderId = order.OrderId;
}

response.Remaining = (int)remaining;
return Task.CompletedTask;
}

/// <summary>
/// 逐笔成交落账:响应追加成交流水、状态记录 TradeDealState、对手挂单全额成交时从订单簿摘除。
/// </summary>
/// <param name="taker">吃单(携带 PlayerId / Side / ItemId)。</param>
/// <param name="response">挂单响应。</param>
/// <param name="deals">撮合成交明细。</param>
/// <param name="now">当前 Unix 时间戳(秒)。</param>
private void RecordDeals(TradeOrderState taker, RespTradePlace response, List<TradeMatchDeal> deals, long now)
{
foreach (var deal in deals)
{
var buyerPlayerId = request.Side == TradeSide.Buy ? playerId : deal.CounterpartyPlayerId;
var sellerPlayerId = request.Side == TradeSide.Buy ? deal.CounterpartyPlayerId : playerId;
var buyerPlayerId = taker.Side == TradeSide.Buy ? taker.PlayerId : deal.CounterpartyPlayerId;
var sellerPlayerId = taker.Side == TradeSide.Buy ? deal.CounterpartyPlayerId : taker.PlayerId;
var tradeId = State.NextTradeId++;
response.Trades.Add(new TradeDealInfo
{
Expand All @@ -105,7 +130,7 @@ public Task OnPlaceAsync(long playerId, ReqTradePlace request, RespTradePlace re
TradeRules.AppendTrade(State, new TradeDealState
{
TradeId = tradeId,
ItemId = request.ItemId,
ItemId = taker.ItemId,
BuyerPlayerId = buyerPlayerId,
SellerPlayerId = sellerPlayerId,
Quantity = deal.Quantity,
Expand All @@ -117,19 +142,6 @@ public Task OnPlaceAsync(long playerId, ReqTradePlace request, RespTradePlace re
State.Orders.Remove(deal.OrderId);
}
}

if (remaining > 0)
{
order.Remaining = (int)remaining;
var ownSide = request.Side == TradeSide.Buy ? book.Buys : book.Sells;
ownSide.Add(order);
ownSide.Sort(request.Side == TradeSide.Buy ? TradeRules.CompareBuy : TradeRules.CompareSell);
State.Orders[order.OrderId] = order;
response.OrderId = order.OrderId;
}

response.Remaining = (int)remaining;
return Task.CompletedTask;
}

/// <summary>
Expand Down
Loading