Пример #1
0
        public async Task <Unit> Handle(InitGameCommand command, CancellationToken cancellationToken)
        {
            _logger.LogDebug($"Handle InitGameCommand:{JsonConvert.SerializeObject(command)}");

            var playerId = command.PlayerId;

            if (playerId <= 0)
            {
                await _bus.RaiseEvent(new DomainNotification($"请重新进入!"));

                return(Unit.Value);
            }

            var player = await _playerDomainService.Get(playerId);

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

                return(Unit.Value);
            }

            var room = await _roomDomainService.Get(player.RoomId);

            if (room == null)
            {
                await _bus.RaiseEvent(new DomainNotification("房间不存在!"));

                return(Unit.Value);
            }

            player.LastDate = DateTime.Now;


            await _cache.GetOrCreateAsync(CacheKey.IsActivityIn24Hours, async x => {
                x.AbsoluteExpiration = DateTime.UtcNow.AddHours(24);
                Random random        = new Random();
                player.Kar           = random.Next(1, 100);
                return(await Task.FromResult(true));
            });

            player.Computed();


            await _playerDomainService.Update(player);



            if (await Commit())
            {
                await _bus.RaiseEvent(new InitGameEvent(player)).ConfigureAwait(false);

                await _bus.RaiseEvent(new PlayerInRoomEvent(player, room)).ConfigureAwait(false);
            }


            return(Unit.Value);
        }
Пример #2
0
        /// <summary>
        /// 执行消耗
        /// </summary>
        /// <param name="player"></param>
        /// <param name="consumeStr"></param>
        /// <returns></returns>
        private async Task <ResultModel> DoQuestConsume(PlayerEntity player, string consumeStr)
        {
            var result = new ResultModel
            {
                IsSuccess = false
            };

            if (!string.IsNullOrEmpty(consumeStr))
            {
                List <QuestConsume> questConsumes = new List <QuestConsume>();
                try
                {
                    questConsumes = JsonConvert.DeserializeObject <List <QuestConsume> >(consumeStr);
                }
                catch (Exception ex)
                {
                    _logger.LogError($"Convert QuestConsume:{ex}");
                }

                foreach (var questConsume in questConsumes)
                {
                    var npcId = questConsume.Attrs.FirstOrDefault(x => x.Attr == "NpcId")?.Val;
                    int.TryParse(questConsume.Attrs.FirstOrDefault(x => x.Attr == "Exp")?.Val, out int exp);
                    long.TryParse(questConsume.Attrs.FirstOrDefault(x => x.Attr == "Money")?.Val, out long money);

                    var consumeEnum = (QuestConsumeEnum)Enum.Parse(typeof(QuestConsumeEnum), questConsume.Consume, true);


                    switch (consumeEnum)
                    {
                    case QuestConsumeEnum.物品:

                        //TODO 减少物品
                        return(result);

                        break;

                    case QuestConsumeEnum.经验:
                        player.Exp -= exp;
                        break;

                    case QuestConsumeEnum.金钱:
                        player.Money -= money;
                        break;
                    }
                }

                await _playerDomainService.Update(player);
            }

            result.IsSuccess = true;
            return(await Task.FromResult(result));
        }
Пример #3
0
        public async Task Execute(int playerId)
        {
            var player = await _playerDomainService.Get(playerId);

            if (player == null)
            {
                _logger.LogDebug($"player == null");
                return;
            }

            var level      = player.Level;
            var levelUpExp = (level * level * level + 60) / 5 * (level * 2 + 60) - 600;

            if (levelUpExp <= player.Exp)
            {
                player.Level += 1;
                player.Point += 1;

                player.Computed();

                await _playerDomainService.Update(player);

                await _bus.RaiseEvent(new PlayerStatusChangedEvent(player)).ConfigureAwait(false);

                await _mudProvider.ShowMessage(player.Id, $"恭喜你升级到 Lv{ player.Level }。");
            }
        }
Пример #4
0
        public async Task Execute(PlayerStatusModel model)
        {
            int playerId = model.PlayerId;
            var player   = await _playerDomainService.Get(playerId);

            if (player == null)
            {
                _logger.LogDebug($"player == null");
                return;
            }

            var online = await _mudOnlineProvider.GetPlayerOnline(playerId);

            if (online == null)
            {
                //玩家离线后,从队列删除,并且修改状态为空闲
                await _recurringQueue.Remove <PlayerStatusModel>(playerId);

                if (player.Status != PlayerStatusEnum.空闲)
                {
                    player.Status = PlayerStatusEnum.空闲;
                    await _playerDomainService.Update(player);

                    await _bus.RaiseEvent(new PlayerStatusChangedEvent(player)).ConfigureAwait(false);
                }
                return;
            }

            if (player.Status != model.Status)
            {
                await _recurringQueue.Remove <PlayerStatusModel>(playerId);

                return;
            }


            //TODO
            switch (model.Status)
            {
            case PlayerStatusEnum.伐木:

                break;
            }

            await _mudProvider.ShowMessage(playerId, $"你正在{model.Status}。。。");
        }
Пример #5
0
        public async Task <ResultDto> Update(int id, PlayerInput item)
        {
            var result = new ResultDto {
                Message = ""
            };

            try
            {
                var player = await _playerDomainService.Get(id);

                if (player == null)
                {
                    result.Message = $"玩家 {id} 不存在!";
                    return(result);
                }
                var content = player.ComparisonTo(item);
                _mapper.Map(item, player);

                await _playerDomainService.Update(player);

                await _operatorLogDomainService.AddSuccess(new OperatorLogEntity
                {
                    Type    = OperatorLogType.修改玩家,
                    Content = $"Id = {id},Data = {content}"
                });

                await Commit();

                result.IsSuccess = true;
            }
            catch (Exception ex)
            {
                result.Message = ex.Message;
                await _operatorLogDomainService.AddError(new OperatorLogEntity
                {
                    Type    = OperatorLogType.修改玩家,
                    Content = $"Data={JsonConvert.SerializeObject(item)},ErrorMessage={result.Message}"
                });
                await Commit();
            }
            return(result);
        }
Пример #6
0
        public async Task Execute(PlayerStatusModel model)
        {
            int playerId = model.PlayerId;
            var player   = await _playerDomainService.Get(playerId);

            if (player == null)
            {
                _logger.LogDebug($"player == null");
                return;
            }

            var online = await _mudOnlineProvider.GetPlayerOnline(playerId);

            if (online == null)
            {
                //玩家离线后,从队列删除,并且修改状态为空闲
                await _recurringQueue.Remove <PlayerStatusModel>(playerId);

                if (player.Status != PlayerStatusEnum.空闲)
                {
                    player.Status = PlayerStatusEnum.空闲;
                    await _playerDomainService.Update(player);

                    await _bus.RaiseEvent(new PlayerStatusChangedEvent(player)).ConfigureAwait(false);
                }
                return;
            }

            if (player.Status != model.Status)
            {
                await _recurringQueue.Remove <PlayerStatusModel>(playerId);

                return;
            }


            //TODO
            switch (model.Status)
            {
            case PlayerStatusEnum.伐木:
            case PlayerStatusEnum.挖矿:
            case PlayerStatusEnum.打猎:
            case PlayerStatusEnum.采药:
            case PlayerStatusEnum.钓鱼:
            case PlayerStatusEnum.打工:

                await DoWork(player);

                break;

            case PlayerStatusEnum.疗伤:
                await Heal(player);

                break;

            case PlayerStatusEnum.打坐:
                await Muse(player);

                break;

            case PlayerStatusEnum.战斗:
                await Fighting(player, model.TargetId);

                break;
            }
        }
Пример #7
0
        public async Task <Unit> Handle(StopActionCommand command, CancellationToken cancellationToken)
        {
            //await _bus.RaiseEvent(new DomainNotification("功能暂时未实现"));

            var playerId = command.PlayerId;
            var player   = await _playerDomainService.Get(playerId);

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

                return(Unit.Value);
            }
            var status = player.Status;

            if (status == PlayerStatusEnum.空闲)
            {
                return(Unit.Value);
            }


            player.Status = PlayerStatusEnum.空闲;
            await _playerDomainService.Update(player);

            switch (status)
            {
            case PlayerStatusEnum.打坐:
                await _mudProvider.ShowMessage(playerId, "你停止了打坐。。。");

                break;

            case PlayerStatusEnum.打工:
                await _mudProvider.ShowMessage(playerId, "你停止了打工。。。");

                break;

            case PlayerStatusEnum.伐木:
                await _mudProvider.ShowMessage(playerId, "你停止了伐木。。。");

                break;

            case PlayerStatusEnum.打猎:
                await _mudProvider.ShowMessage(playerId, "你停止了打猎。。。");

                break;

            case PlayerStatusEnum.挖矿:
                await _mudProvider.ShowMessage(playerId, "你停止了挖矿。。。");

                break;

            case PlayerStatusEnum.疗伤:
                await _mudProvider.ShowMessage(playerId, "你停止了疗伤。。。");

                break;

            case PlayerStatusEnum.采药:
                await _mudProvider.ShowMessage(playerId, "你停止了采药。。。");

                break;

            case PlayerStatusEnum.钓鱼:
                await _mudProvider.ShowMessage(playerId, "你停止了钓鱼。。。");

                break;

            default:
                await _mudProvider.ShowMessage(playerId, $"你停止了{status}。。。");

                break;
            }

            await _recurringQueue.Remove <PlayerStatusModel>($"player_{playerId}");

            if (await Commit())
            {
                await _bus.RaiseEvent(new PlayerStatusChangedEvent(player)).ConfigureAwait(false);
            }
            return(Unit.Value);
        }
Пример #8
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;
         * }
         */


        /// <summary>
        /// 领取奖励
        /// </summary>
        /// <param name="player"></param>
        /// <param name="rewardStr"></param>
        /// <returns></returns>
        private async Task <ResultModel> TakeQuestReward(PlayerEntity player, string rewardStr)
        {
            var result = new ResultModel
            {
                IsSuccess = false
            };

            if (!string.IsNullOrEmpty(rewardStr))
            {
                List <QuestReward> questRewards = new List <QuestReward>();
                try
                {
                    questRewards = JsonConvert.DeserializeObject <List <QuestReward> >(rewardStr);
                }
                catch (Exception ex)
                {
                    _logger.LogError($"Convert QuestReward:{ex}");
                }

                foreach (var questReward in questRewards)
                {
                    int.TryParse(questReward.Attrs.FirstOrDefault(x => x.Attr == "NpcId")?.Val, out int npcId);
                    int.TryParse(questReward.Attrs.FirstOrDefault(x => x.Attr == "Exp")?.Val, out int exp);
                    long.TryParse(questReward.Attrs.FirstOrDefault(x => x.Attr == "Money")?.Val, out long money);
                    int.TryParse(questReward.Attrs.FirstOrDefault(x => x.Attr == "WareId")?.Val, out int wareId);
                    int.TryParse(questReward.Attrs.FirstOrDefault(x => x.Attr == "Number")?.Val, out int number);

                    var rewardEnum = (QuestRewardEnum)Enum.Parse(typeof(QuestRewardEnum), questReward.Reward, true);


                    switch (rewardEnum)
                    {
                    case QuestRewardEnum.物品:
                        var ware = await _wareDomainService.Get(wareId);

                        if (ware != null)
                        {
                            await _mudProvider.ShowMessage(player.Id, $"获得 {number}{ware.Unit}[{ware.Name}]");
                        }
                        // 添加物品

                        break;

                    case QuestRewardEnum.经验:
                        player.Exp += exp;
                        await _mudProvider.ShowMessage(player.Id, $"获得经验 +{exp}");

                        break;

                    case QuestRewardEnum.金钱:
                        player.Money += money;
                        await _mudProvider.ShowMessage(player.Id, $"获得 +{money.ToMoney()}");

                        break;
                    }
                }

                await _playerDomainService.Update(player);
            }

            result.IsSuccess = true;
            return(await Task.FromResult(result));
        }
Пример #9
0
        public async Task <Unit> Handle(LoadWareCommand command, CancellationToken cancellationToken)
        {
            var myWareId = command.MyWareId;
            var playerId = command.PlayerId;

            var player = await _playerDomainService.Get(playerId);

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

                return(Unit.Value);
            }

            var playerWare = await _playerWareDomainService.Get(myWareId);

            if (playerWare == null || playerWare.PlayerId != playerId)
            {
                await _bus.RaiseEvent(new DomainNotification($"武器不存在!"));

                return(Unit.Value);
            }

            if (playerWare.Status == WareStatusEnum.装备)
            {
                await _bus.RaiseEvent(new DomainNotification($"武器已装备!"));

                return(Unit.Value);
            }

            var ware = await _wareDomainService.Get(playerWare.WareId);

            if (ware == null)
            {
                await _bus.RaiseEvent(new DomainNotification($"武器状态异常!"));

                return(Unit.Value);
            }


            var playerWares = await _playerWareDomainService.GetAll(playerId);

            var ids       = playerWares.Where(x => x.Status == WareStatusEnum.装备).Select(x => x.WareId).ToList();
            var wareQuery = await _wareDomainService.GetAll();

            var wares = wareQuery.Where(x => ids.Contains(x.Id));

            WareTypeEnum[] wareTypes = null;
            WareEntity     loadWare  = null;

            switch (ware.Type)
            {
            case WareTypeEnum.刀:
            case WareTypeEnum.剑:
            case WareTypeEnum.枪:
                wareTypes = new[] { WareTypeEnum.刀, WareTypeEnum.剑, WareTypeEnum.枪 };
                break;

            case WareTypeEnum.衣服:
                wareTypes = new[] { WareTypeEnum.衣服 };
                break;

            case WareTypeEnum.鞋:
                wareTypes = new[] { WareTypeEnum.鞋 };
                break;

            case WareTypeEnum.帽:
                wareTypes = new[] { WareTypeEnum.帽 };
                break;
            }
            if (wareTypes != null)
            {
                loadWare = wares.FirstOrDefault(x => wareTypes.Contains(x.Type));
            }

            if (loadWare != null)
            {
                await _bus.RaiseEvent(new DomainNotification($"你已经装备了 [{loadWare.Name}]!"));

                return(Unit.Value);
            }


            playerWare.Status = WareStatusEnum.装备;
            await _playerWareDomainService.Update(playerWare);

            var wareEffectAttr = await Computed(playerId);

            player.Atk = wareEffectAttr.Atk;
            player.Def = wareEffectAttr.Def;

            await _playerDomainService.Update(player);

            /*
             * var wareModel = _mapper.Map<WareModel>(ware);
             * wareModel.PlayerWareId = playerWare.Id;
             * wareModel.Number = playerWare.Number;
             * wareModel.Status = playerWare.Status;
             * await _mudProvider.LoadWare(playerId, wareModel);
             */

            var wareModel = await Computed(ware, playerWare);

            await _mudProvider.ShowWare(playerId, wareModel);

            await _mudProvider.ShowMessage(playerId, $"你装备了 [{wareModel.Name}]!");

            return(Unit.Value);
        }
Пример #10
0
        public async Task <Unit> Handle(LearnSkillCommand command, CancellationToken cancellationToken)
        {
            var playerId      = command.PlayerId;
            var objectSkillId = command.MySkillId;
            var type          = command.Type;
            var player        = await _playerDomainService.Get(playerId);

            if (player == null)
            {
                return(Unit.Value);
            }

            int skillId          = 0;
            int objectSkillLevel = 0;

            if (type == 1)
            {
                var objectSkill = await _playerSkillDomainService.Get(objectSkillId);

                if (objectSkill == null)
                {
                    return(Unit.Value);
                }
                skillId          = objectSkill.SkillId;
                objectSkillLevel = objectSkill.Level;
            }
            else
            {
                var objectSkill = await _npcSkillDomainService.Get(objectSkillId);

                if (objectSkill == null)
                {
                    return(Unit.Value);
                }
                skillId          = objectSkill.SkillId;
                objectSkillLevel = objectSkill.Level;
            }


            var skill = await _skillDomainService.Get(skillId);

            if (skill == null)
            {
                return(Unit.Value);
            }

            if (player.Pot <= 0)
            {
                await _mudProvider.ShowMessage(player.Id, $"潜能不够,无法修练!");

                return(Unit.Value);
            }

            var needPot = 0;
            var exp     = 0;

            var mySkill = await _playerSkillDomainService.Get(x => x.PlayerId == playerId && x.SkillId == skillId);

            if (mySkill == null)
            {
                needPot = 100;
                exp     = 1;
                if (player.Pot <= needPot)
                {
                    await _mudProvider.ShowMessage(player.Id, $"潜能不够,无法修练!");

                    return(Unit.Value);
                }

                mySkill = new PlayerSkillEntity
                {
                    Exp       = 1,
                    Level     = 1,
                    SkillId   = skillId,
                    PlayerId  = playerId,
                    SkillName = skill.Name
                };
                await _playerSkillDomainService.Add(mySkill);

                player.Pot -= needPot;
                await _playerDomainService.Update(player);

                await _mudProvider.ShowMessage(player.Id, $"你消耗潜能{needPot},学会了[{skill.Name}]!");

                return(Unit.Value);
            }


            if (player.Level * 10 < mySkill.Level)
            {
                await _mudProvider.ShowMessage(player.Id, $"武功最高等级不能超过自身等级的10倍!");

                return(Unit.Value);
            }

            if (mySkill.Level >= objectSkillLevel && !skill.IsBase)
            {
                await _mudProvider.ShowMessage(player.Id, $"你已经无法从对方身上学到什么了!");

                return(Unit.Value);
            }

            var @int         = player.Int * 3 + player.IntAdd;
            var nextLevelExp = (mySkill.Level + 1) * (mySkill.Level + 1) * 50;
            var levelUpExp   = nextLevelExp - mySkill.Level * mySkill.Level * 50;

            Random random = new Random();

            exp     = random.Next(1, levelUpExp / 10);
            needPot = exp * 100 / @int;

            var effect = exp * 1000 / levelUpExp;

            string effectWords;

            if (effect > 80)
            {
                effectWords = "恍然大悟";
            }
            else if (effect > 50)
            {
                effectWords = "有所顿悟";
            }
            else if (effect > 20)
            {
                effectWords = "略有所获";
            }
            else if (effect > 10)
            {
                effectWords = "略有所获";
            }
            else
            {
                effectWords = "似乎没有什么进展";
            }

            player.Pot -= needPot;
            await _playerDomainService.Update(player);

            mySkill.SkillName = skill.Name;
            mySkill.Exp      += exp;
            await _mudProvider.ShowMessage(player.Id, $"你消耗潜能{needPot},{effectWords},[{skill.Name}]经验增加{exp}!");

            if (mySkill.Exp > nextLevelExp)
            {
                mySkill.Level++;
                await _mudProvider.ShowMessage(player.Id, $"[{skill.Name}]等级上升为 Lv.{mySkill.Level}!");
            }



            await _playerSkillDomainService.Update(mySkill);



            await _bus.RaiseEvent(new PlayerAttributeChangedEvent(player)).ConfigureAwait(false);

            return(Unit.Value);
        }