Example #1
0
        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();
            }
        }
Example #2
0
        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);
        }