Example #1
0
        public async Task Handle(InitGameEvent message, CancellationToken cancellationToken)
        {
            var player = message.Player;

            await _queueHandler.SendQueueMessage(new ReceiveEmailQueue(player.Id));

            var model = await _chatOnlineProvider.GetPlayerOnline(player.Id);

            var isOnline = model != null;

            if (isOnline)
            {
                await _mudProvider.ShowMessage(player.Id, $"<font color=#FF5555>你重新连接到【{_appConfig.Site.Name}】。</font>");
            }
            else
            {
                await _mudProvider.ShowMessage(player.Id, _appConfig.Site.WelcomeWords.Replace("{name}", player.Name));
            }

            //await CheckPlayerMainQuest(player);

            await _queueHandler.SendQueueMessage(new CheckPlayerMainQuestQueue(player.Id));

            await _queueHandler.SendQueueMessage(new CheckPlayerNewbieQuestQueue(player.Id));
        }
Example #2
0
        public async Task <string> CreateAsync(string userId, CreateGameModel model)
        {
            string userHeroId     = string.Empty;
            string opponentHeroId = string.Empty;
            Task   userTask       = _userRepository.GetByIdAsync(userId).ContinueWith(r =>
            {
                User result = r.Result;
                if (result?.Heroes != null && result.Heroes.Count > 0)
                {
                    userHeroId = result.Heroes[0].Id;
                }
            });
            Task opponentTask = string.IsNullOrEmpty(model.OpponentId) ? Task.FromResult(true) : _userRepository.GetByIdAsync(model.OpponentId).ContinueWith(r =>
            {
                User result = r.Result;
                if (result?.Heroes != null && result.Heroes.Count > 0)
                {
                    opponentHeroId = result.Heroes[0].Id;
                }
            });
            await Task.WhenAll(userTask, opponentTask);

            if (string.IsNullOrEmpty(userHeroId) || (!string.IsNullOrEmpty(model.OpponentId) && string.IsNullOrEmpty(opponentHeroId)))
            {
                throw new KeyNotFoundException("Hero not found");
            }
            var       gameId    = Guid.NewGuid();
            GameModel gameModel = new GameModel
            {
                Id             = gameId.ToString(),
                CreatedBy      = userId,
                UserHeroId     = userHeroId,
                OpponentId     = model.OpponentId,
                OpponentHeroId = opponentHeroId,
                Status         = GameStatus.Requesting,
                CreatedAt      = DateTime.UtcNow,
                Position       = new PositionModel
                {
                    Lat = model.Lat,
                    Lng = model.Lng
                },
                OpponentExtInfo = model.OpponentExtInfo,
                SelfPlaying     = model.SelfPlaying,
                Speed           = model.Speed,
                Difficulty      = model.Difficulty,
                UserArmySetting = model.UserArmySetting
            };
            GameModel game = gameModel;

            using (IEventStream stream = _store.CreateStream(new Guid(game.Id)))
            {
                var initEvent = new InitGameEvent
                {
                    UserId             = userId,
                    UserHeroId         = userHeroId,
                    OpponentId         = model.OpponentId,
                    OpponentHeroId     = opponentHeroId,
                    SelfPlaying        = model.SelfPlaying,
                    Speed              = model.Speed,
                    Difficulty         = model.Difficulty,
                    UserArmySetting    = Mapper.Map <GameArmySetting>(model.UserArmySetting),
                    UserTroopTypes     = Mapper.Map <List <CastleTroopType> >(await GetRandomTroopTypes()),
                    OpponentTroopTypes = Mapper.Map <List <CastleTroopType> >(await GetRandomTroopTypes()),
                };

                initEvent.UserProducedTroopTypes = new List <string>()
                {
                    initEvent.UserTroopTypes
                    .First(e => e.UpkeepCoins == initEvent.UserTroopTypes.Min(f => f.UpkeepCoins))
                    .ResourceType
                };
                initEvent.OpponentProducedTroopTypes = new List <string>()
                {
                    initEvent.OpponentTroopTypes
                    .First(e => e.UpkeepCoins == initEvent.OpponentTroopTypes.Min(f => f.UpkeepCoins))
                    .ResourceType
                };
                stream.Add(new EventMessage
                {
                    Body = initEvent
                });
                stream.Add(new EventMessage
                {
                    Body = new ChangeGameStatusEvent
                    {
                        Status = GameStatus.Requesting
                    }
                });

                stream.CommitChanges(Guid.NewGuid());
            }
            await Repository.AddAsync(Mapper.Map <Game>(game));

            _domain.Build(gameId, InitGameSnapshot);
            return(game.Id);
        }