Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        public async Task Update(PlayerQuestEntity entity)
        {
            await _questRepository.Update(entity);

            await _bus.RaiseEvent(new EntityUpdatedEvent <PlayerQuestEntity>(entity)).ConfigureAwait(false);
        }
Esempio n. 5
0
        public async Task Add(PlayerQuestEntity entity)
        {
            await _questRepository.Add(entity);

            await _bus.RaiseEvent(new EntityInsertedEvent <PlayerQuestEntity>(entity)).ConfigureAwait(false);
        }
Esempio n. 6
0
        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);
        }