예제 #1
0
        public void SelectCharacterHandler(GameSession session, CSelectCharacterReqMessage message)
        {
            var plr = session.Player;

            // Prevents player from changing characters while playing
            if (plr.Room != null && plr.RoomInfo.State != PlayerState.Lobby &&
                !plr.Room.GameRuleManager.GameRule.StateMachine.IsInState(GameRuleState.HalfTime))
            {
                session.Send(new SServerResultInfoAckMessage(ServerResult.SelectCharacterFailed));
                return;
            }

            Logger.Info()
            .Account(session)
            .Message($"Selecting character {message.Slot}")
            .Write();

            try
            {
                plr.CharacterManager.Select(message.Slot);
            }
            catch (CharacterException ex)
            {
                Logger.Error()
                .Account(session)
                .Message(ex.Message)
                .Write();
                session.Send(new SServerResultInfoAckMessage(ServerResult.SelectCharacterFailed));
            }
        }
예제 #2
0
        public async Task <bool> OnHandle(MessageContext context, CSelectCharacterReqMessage message)
        {
            var session = context.GetSession <Session>();
            var plr     = session.Player;

            // Prevents player from changing characters while playing
            if (plr.Room != null && plr.State != PlayerState.Lobby &&
                plr.Room.GameRule.StateMachine.TimeState != GameTimeState.HalfTime)
            {
                session.Send(new SServerResultInfoAckMessage(ServerResult.SelectCharacterFailed));
                return(true);
            }

            // Cant switch characters when ready
            if (plr.Room != null && plr.IsReady)
            {
                session.Send(new SServerResultInfoAckMessage(ServerResult.SelectCharacterFailed));
                return(true);
            }

            // Validate equip
            if (plr.Room != null && plr.State != PlayerState.Lobby &&
                plr.Room.GameRule.StateMachine.TimeState == GameTimeState.HalfTime)
            {
                var character = plr.CharacterManager[message.Slot];
                if (character != null && !_equipValidator.IsValid(character))
                {
                    session.Send(new SServerResultInfoAckMessage(ServerResult.WearingUnusableItem));
                    return(true);
                }
            }

            if (!plr.CharacterManager.Select(message.Slot))
            {
                session.Send(new SServerResultInfoAckMessage(ServerResult.SelectCharacterFailed));
            }

            return(true);
        }