コード例 #1
0
ファイル: LoginDecoder.cs プロジェクト: JayArrowz/NetScape
        /// <summary>
        /// Writes a response code to the client and closes the current channel.
        /// </summary>
        /// <param name="ctx">The ctx.</param>
        /// <param name="response">The response.</param>
        private void WriteResponseCode(IChannelHandlerContext ctx, ThreeOneSevenLoginStatus response)
        {
            var buffer = ctx.Allocator.Buffer(sizeof(byte));

            buffer.WriteByte((int)response);
            ctx.WriteAndFlushAsync(buffer);
            HandleLoginProcessorResponse(null, response, ctx, null);
        }
コード例 #2
0
ファイル: LoginDecoder.cs プロジェクト: JayArrowz/NetScape
        private void HandleLoginProcessorResponse(Player player, ThreeOneSevenLoginStatus response, IChannelHandlerContext ctx, IsaacRandomPair randomPair)
        {
            if (response != ThreeOneSevenLoginStatus.StatusOk)
            {
                ctx.CloseAsync();
            }
            else
            {
                if (player == null)
                {
                    ctx.CloseAsync();
                    throw new InvalidOperationException("Cannot initialize player is null");
                }

                ctx.Channel.Pipeline.Remove(nameof(LoginEncoder));
                ctx.Channel.Pipeline.Remove(nameof(LoginDecoder));
                var gameMessageHandlers = _gameMessageProvider.Provide();

                foreach (var gameMessageHandler in gameMessageHandlers)
                {
                    if (gameMessageHandler is ICipherAwareHandler awareHandler)
                    {
                        awareHandler.CipherPair = randomPair;
                    }

                    if (gameMessageHandler is IPlayerAwareHandler handler)
                    {
                        handler.Player = player;
                    }
                }
                ctx.Channel.Pipeline.AddLast(gameMessageHandlers);
                ctx.GetAttribute(Constants.PlayerAttributeKey).SetIfAbsent(player);
                player.ChannelHandlerContext = ctx;
                _world.Add(player);
                if (!_reconnecting)
                {
                    _ = _playerInitializer.InitializeAsync(player);
                }
                else
                {
                    player.UpdateAppearance();
                }
            }
        }