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); }); }
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); }