diff --git a/GameFrameX.Online/Matchmaking/OnlineMatchmakerCoordinator.cs b/GameFrameX.Online/Matchmaking/OnlineMatchmakerCoordinator.cs index 0ad6f272..2c93ec51 100644 --- a/GameFrameX.Online/Matchmaking/OnlineMatchmakerCoordinator.cs +++ b/GameFrameX.Online/Matchmaking/OnlineMatchmakerCoordinator.cs @@ -154,14 +154,7 @@ private async Task CommitAsync(OnlineMatchTicket anchor, { var ticketIds = new List(group.Count); var players = new SortedSet(); - foreach (var ticket in group) - { - ticketIds.Add(ticket.TicketId); - foreach (var playerId in ticket.PlayerIds) - { - players.Add(playerId); - } - } + CollectTicketIdsAndPlayers(group, ticketIds, players); var assignment = new OnlineMatchAssignment { @@ -184,8 +177,50 @@ private async Task CommitAsync(OnlineMatchTicket anchor, return null; } + await PublishAssignmentCreatedAsync(committed, cancellationToken).ConfigureAwait(false); + + await PublishMatchedTicketEventsAsync(committed, ticketIds, cancellationToken).ConfigureAwait(false); + + return committed; + } + + /// + /// 累加成组票据的标识与成员(成员去重进有序集合,保证分配的玩家列表稳定有序)。 + /// + /// 成组票据。 + /// 票据标识输出(按组内顺序累加)。 + /// 玩家集合输出(去重累加)。 + private static void CollectTicketIdsAndPlayers(List group, List ticketIds, SortedSet players) + { + foreach (var ticket in group) + { + ticketIds.Add(ticket.TicketId); + foreach (var playerId in ticket.PlayerIds) + { + players.Add(playerId); + } + } + } + + /// + /// 发布对局分配创建事件(先于逐票据事件;空安全实参与既有口径逐字一致)。 + /// + /// 已落档的分配。 + /// 取消令牌。 + private async Task PublishAssignmentCreatedAsync(OnlineMatchAssignment committed, CancellationToken cancellationToken) + { await _eventPublisher.PublishAsync(OnlineMatchEvents.CreateAssignmentCreated(committed.TenantId, committed.AppId, committed.ServerId, committed.AssignmentId, committed.MatchId, committed.Mode, committed.Region, committed.PlayerIds == null ? 0 : committed.PlayerIds.Count, committed.PlayerIds != null && committed.PlayerIds.Count > 0 ? committed.PlayerIds[0] : 0, committed.TicketIds), cancellationToken).ConfigureAwait(false); + } + /// + /// 逐票据补发匹配态变更事件(按提交票据序 ,查得才发; + /// 竞态下票据缺失则静默跳过该张,与提交后重查口径一致)。 + /// + /// 已落档的分配。 + /// 本组票据标识。 + /// 取消令牌。 + private async Task PublishMatchedTicketEventsAsync(OnlineMatchAssignment committed, List ticketIds, CancellationToken cancellationToken) + { foreach (var ticketId in ticketIds) { var matched = await _store.FindAsync(committed.TenantId, committed.AppId, ticketId, cancellationToken).ConfigureAwait(false); @@ -194,8 +229,6 @@ private async Task CommitAsync(OnlineMatchTicket anchor, await _eventPublisher.PublishAsync(OnlineMatchEvents.CreateTicketChanged(matched.TenantId, matched.AppId, matched.ServerId, matched.TicketId, matched.PartyId, matched.FailureReason.ToString(), matched.AssignmentId, matched.PlayerIds == null ? 0 : matched.PlayerIds.Count, matched.PlayerIds != null && matched.PlayerIds.Count > 0 ? matched.PlayerIds[0] : 0, OnlineMatchTicketState.Queued.ToString(), OnlineMatchTicketState.Matched.ToString()), cancellationToken).ConfigureAwait(false); } } - - return committed; } ///