private async Task TakeQuest(PlayerEntity player, int questId) { var questToTake = await _questDomainService.Get(questId); if (questToTake == null) { return; } var playerQuestToTake = await _playerQuestDomainService.Get(x => x.PlayerId == player.Id && x.QuestId == questToTake.Id); if (playerQuestToTake == null) { playerQuestToTake = new PlayerQuestEntity { PlayerId = player.Id, QuestId = questId, Status = QuestStateEnum.已领取进行中, //IsComplete = false, TakeDate = DateTime.Now, CompleteDate = DateTime.Now, CreateDate = DateTime.Now, DayTimes = 1, //HasTake = true, Target = questToTake.Target, Times = 1, UpdateDate = DateTime.Now }; await _playerQuestDomainService.Add(playerQuestToTake); } else if (playerQuestToTake.Status == QuestStateEnum.完成已领奖 || playerQuestToTake.Status == QuestStateEnum.未领取) { //TODO 领取任务 //playerQuestToTake.HasTake = true; //playerQuestToTake.IsComplete = false; playerQuestToTake.Status = QuestStateEnum.已领取进行中; playerQuestToTake.TakeDate = DateTime.Now; playerQuestToTake.Times += 1; playerQuestToTake.Target = questToTake.Target; await _playerQuestDomainService.Update(playerQuestToTake); } }
public async Task <bool> CheckPlayerNewbieQuestQueue(CheckPlayerNewbieQuestQueue message) { _logger.LogDebug($"Consumer Get Queue {JsonConvert.SerializeObject(message)} ready"); var playerId = message.PlayerId; //已经领取的所有任务 var myQuests = (await _playerQuestDomainService.GetPlayerQuests(playerId)); //正在进行的任务 var myQuestsNotComplete = myQuests.Where(x => x.Status == QuestStateEnum.已领取进行中); //所有新手任务 var newbieQuests = (await _questDomainService.GetAll()).Where(x => x.Type == QuestTypeEnum.新手).ToList(); foreach (var newbieQuest in newbieQuests) { if (myQuests.Count(x => x.QuestId == newbieQuest.Id) == 0) { var playerQuest = new PlayerQuestEntity { PlayerId = playerId, QuestId = newbieQuest.Id, Status = QuestStateEnum.已领取进行中, TakeDate = DateTime.Now, CompleteDate = DateTime.Now, CreateDate = DateTime.Now, DayTimes = 1, Target = newbieQuest.Target, Times = 1, UpdateDate = DateTime.Now }; await _playerQuestDomainService.Add(playerQuest); } } await Commit(); return(true); }
public async Task <Unit> Handle(QuestCommand 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 == questId); if (playerQuest != null) { //已领取 if (playerQuest.HasTake) { await _mudProvider.ShowMessage(playerId, "领取任务成功!"); //await _mudProvider.ShowMessage(playerId, quest.InProgressWords); return(Unit.Value); } //未领取但是之前已经完成过 switch (quest.Period) { case QuestPeriodEnum.可重复: await _mudProvider.ShowMessage(playerId, "该任务仅可领取一次,你已经领取过!"); return(Unit.Value); break; case QuestPeriodEnum.无限制: break; case QuestPeriodEnum.每周一次: if (DateTime.Now.Subtract(playerQuest.TakeDate).TotalDays <= 7) { await _mudProvider.ShowMessage(playerId, "该任务每周仅可领取一次,你已经领取过!"); return(Unit.Value); } break; case QuestPeriodEnum.每天一次: if (DateTime.Now.Subtract(playerQuest.TakeDate).TotalHours <= 24) { await _mudProvider.ShowMessage(playerId, "该任务每天仅可领取一次,你已经领取过!"); return(Unit.Value); } break; case QuestPeriodEnum.每年一次: if (DateTime.Now.Subtract(playerQuest.TakeDate).TotalDays <= 365) { await _mudProvider.ShowMessage(playerId, "该任务每年仅可领取一次,你已经领取过!"); return(Unit.Value); } break; case QuestPeriodEnum.每月一次: if (DateTime.Now.Subtract(playerQuest.TakeDate).TotalDays <= 30) { await _mudProvider.ShowMessage(playerId, "该任务每月仅可领取一次,你已经领取过!"); return(Unit.Value); } break; } } var checkCondition = await CheckTakeCondition(player, quest.TakeCondition); if (!checkCondition.IsSuccess) { await _bus.RaiseEvent(new DomainNotification($"你还不能领取这个任务 !{checkCondition.ErrorMessage}")); return(Unit.Value); } if (playerQuest == null) { playerQuest = new PlayerQuestEntity { PlayerId = player.Id, QuestId = questId, IsComplete = false, TakeDate = DateTime.Now, CompleteDate = DateTime.Now, CreateDate = DateTime.Now, DayTimes = 1, HasTake = true, Target = quest.Target, Times = 1, UpdateDate = DateTime.Now }; await _playerQuestDomainService.Add(playerQuest); } else { //TODO 领取任务 playerQuest.HasTake = true; playerQuest.IsComplete = false; playerQuest.TakeDate = DateTime.Now; playerQuest.Times += 1; playerQuest.Target = quest.Target; await _playerQuestDomainService.Update(playerQuest); } if (await Commit()) { await _bus.RaiseEvent(new DomainNotification($"领取任务 {quest.Name} !")); } return(Unit.Value); }
public async Task Update(PlayerQuestEntity entity) { await _questRepository.Update(entity); await _bus.RaiseEvent(new EntityUpdatedEvent <PlayerQuestEntity>(entity)).ConfigureAwait(false); }
public async Task Add(PlayerQuestEntity entity) { await _questRepository.Add(entity); await _bus.RaiseEvent(new EntityInsertedEvent <PlayerQuestEntity>(entity)).ConfigureAwait(false); }
public async Task <bool> CheckPlayerMainQuestQueue(CheckPlayerMainQuestQueue message) { _logger.LogDebug($"Consumer Get Queue {JsonConvert.SerializeObject(message)} ready"); var playerId = message.PlayerId; //已经领取的所有任务 var myQuests = (await _playerQuestDomainService.GetPlayerQuests(playerId)); //正在进行的任务 var myQuestsNotComplete = myQuests.Where(x => !x.IsComplete); //所有主线任务 var mainQuests = (await _questDomainService.GetAll()).Where(x => x.Type == QuestTypeEnum.主线).OrderBy(x => x.SortId); //是否有正在进行的主线任务 var mainQuest = mainQuests.FirstOrDefault(x => myQuestsNotComplete.Select(y => y.QuestId).Contains(x.Id)); if (mainQuest == null) { //没有正在进行中的主线任务,找到第一个没有领取的主线任务 mainQuest = mainQuests.FirstOrDefault(x => !myQuests.Select(y => y.QuestId).Contains(x.Id)); if (mainQuest != null) { //自动领取第一个主线任务 var playerQuest = new PlayerQuestEntity { PlayerId = playerId, QuestId = mainQuest.Id, IsComplete = false, TakeDate = DateTime.Now, CompleteDate = DateTime.Now, CreateDate = DateTime.Now, DayTimes = 1, HasTake = true, Target = mainQuest.Target, Times = 1, UpdateDate = DateTime.Now }; await _playerQuestDomainService.Add(playerQuest); await _mudProvider.ShowMessage(playerId, $"已自动激活任务 [{mainQuest.Name}]。"); //判断是否第一个任务 var isFirst = mainQuests.FirstOrDefault()?.Id == mainQuest.Id; await _mudProvider.ShowQuest(playerId, new { mainQuest, isFirst }); } else { //所有主线任务都已完成 } } else { //有正在进行的主线任务 //判断是否第一个任务 var isFirst = mainQuests.FirstOrDefault()?.Id == mainQuest.Id; await _mudProvider.ShowQuest(playerId, new { mainQuest, isFirst }); } await Commit(); return(true); }