public void CMixChangeTeamReq(GameSession session, CMixChangeTeamReqMessage message) { var plr = session.Player; var plrToMove = plr.Room.Players.GetValueOrDefault(message.PlayerToMove); var plrToReplace = plr.Room.Players.GetValueOrDefault(message.PlayerToReplace); var fromTeam = plr.Room.TeamManager[message.FromTeam]; var toTeam = plr.Room.TeamManager[message.ToTeam]; if (fromTeam == null || toTeam == null || plrToMove == null || fromTeam != plrToMove.RoomInfo.Team || (plrToReplace != null && toTeam != plrToReplace.RoomInfo.Team)) { session.SendAsync(new SMixChangeTeamFailAckMessage()); return; } if (plrToReplace == null) { try { toTeam.Join(plrToMove); } catch (TeamLimitReachedException) { session.SendAsync(new SMixChangeTeamFailAckMessage()); } } else { fromTeam.Leave(plrToMove); toTeam.Leave(plrToReplace); fromTeam.Join(plrToReplace); toTeam.Join(plrToMove); plr.Room.Broadcast(new SMixChangeTeamAckMessage(plrToMove.Account.Id, plrToReplace.Account.Id, fromTeam.Team, toTeam.Team)); // SMixChangeTeamAckMessage alone doesn't seem to change the player list plr.Room.BroadcastBriefing(); } }
public async Task <bool> OnHandle(MessageContext context, CMixChangeTeamReqMessage message) { var session = context.GetSession <Session>(); var plr = session.Player; var room = plr.Room; var plrToMove = room.Players.GetValueOrDefault(message.PlayerToMove); var plrToReplace = room.Players.GetValueOrDefault(message.PlayerToReplace); var fromTeam = room.TeamManager[message.FromTeam]; var toTeam = room.TeamManager[message.ToTeam]; if (fromTeam == null || toTeam == null || plrToMove == null || fromTeam != plrToMove.Team || plrToReplace != null && toTeam != plrToReplace.Team) { session.Send(new SMixChangeTeamFailAckMessage()); return(true); } if (plrToReplace == null) { var error = toTeam.Join(plrToMove); if (error != TeamJoinError.OK) { session.Send(new SMixChangeTeamFailAckMessage()); } } else { room.TeamManager.SwapPlayer(plrToMove, plrToReplace); plr.Room.Broadcast(new SMixChangeTeamAckMessage( plrToMove.Account.Id, plrToReplace.Account.Id, fromTeam.Id, toTeam.Id)); // SMixChangeTeamAckMessage alone doesn't seem to change the player list plr.Room.BroadcastBriefing(); } return(true); }