Example #1
0
        public async Task CompleteQuest(QuestDetailAction questAction)
        {
            var result = await DoCommand(async() => {
                var playerId = _account.PlayerId;

                var command = new CompleteQuestCommand(playerId, questAction.QuestId);
                await _bus.SendCommand(command);
            });
        }
Example #2
0
        public async Task <Unit> Handle(CompleteQuestCommand command, CancellationToken cancellationToken)
        {
            var playerId = command.PlayerId;
            var questId  = command.QuestId;

            var player = await _playerDomainService.Get(playerId);

            if (player == null)
            {
                await _bus.RaiseEvent(new DomainNotification($"角色不存在!"));

                return(Unit.Value);
            }

            var quest = await _questDomainService.Get(questId);

            if (quest == null)
            {
                await _bus.RaiseEvent(new DomainNotification($"任务不存在!"));

                return(Unit.Value);
            }

            var playerQuest = await _playerQuestDomainService.Get(x => x.PlayerId == playerId && x.QuestId == quest.Id);

            if (playerQuest == null)
            {
                await _mudProvider.ShowMessage(playerId, "请先领取任务!");

                return(Unit.Value);
            }

            //未领取
            if (playerQuest.Status != QuestStateEnum.已领取进行中)
            {
                await _mudProvider.ShowMessage(playerId, "请先领取任务!");

                return(Unit.Value);
            }

            var checkResult = await CheckQuestIfComplete(player, playerQuest.Target);

            if (!checkResult.IsSuccess)
            {
                //任务未完成
                await _mudProvider.ShowMessage(player.Id, "任务未完成!");

                return(Unit.Value);
            }

            var checkConsumeResult = await CheckQuestConsume(player, quest.Consume);

            if (!checkConsumeResult.IsSuccess)
            {
                await _mudProvider.ShowMessage(player.Id, $"领取奖励失败!{checkConsumeResult.ErrorMessage}");

                return(Unit.Value);
            }



            //TODO 修改任务状态
            //playerQuest.HasTake = false;
            playerQuest.CompleteDate = DateTime.Now;
            playerQuest.Status       = QuestStateEnum.完成已领奖;
            playerQuest.CompleteTimes++;
            //playerQuest.IsComplete = true;
            await _playerQuestDomainService.Update(playerQuest);

            await DoQuestConsume(player, quest.Consume);


            await TakeQuestReward(player, quest.Reward);

            //TODO  领取奖励



            if (await Commit())
            {
                //await _mudProvider.ShowMessage(player.Id, quest.CompletedWords);
                await _mudProvider.ShowMessage(player.Id, "领取奖励成功");

                await _bus.RaiseEvent(new CompleteQuestEvent(player, quest)).ConfigureAwait(false);
            }

            return(Unit.Value);
        }