コード例 #1
0
        public override void HandlePacket(IPacketStream packet)
        {
            if (this.Socket == null)
            {
                _logger.LogTrace("Skip to handle packet. Reason: client is no more connected.");
                return;
            }

            try
            {
                PacketDeserializeHandler handler;

                if (PacketHandlers.TryGetValue(packet.PacketType, out handler))
                {
                    var deserializedPacket = handler.Invoke(packet);
                    OnPacketArrived?.Invoke(this, deserializedPacket);
                }
                else
                {
                    if (Enum.IsDefined(typeof(PacketType), packet.PacketType))
                    {
                        _logger.LogWarning("Received an unimplemented packet {0} from {1}.", packet.PacketType, this.RemoteEndPoint);
                    }
                    else
                    {
                        _logger.LogWarning("Received an unknown packet 0x{0} from {1}.", ((ushort)packet.PacketType).ToString("X2"), this.RemoteEndPoint);
                    }
                }
            }
            catch (Exception exception)
            {
                _logger.LogError("Packet handle error from {0}. {1}", this.RemoteEndPoint, exception.Message);
                _logger.LogDebug(exception.InnerException?.StackTrace);
            }
        }
コード例 #2
0
 public GMTeleportPlayerPacket(IPacketStream packet)
 {
     Name  = packet.ReadString(21);
     X     = packet.Read <float>();
     Z     = packet.Read <float>();
     MapId = packet.Read <ushort>();
 }
コード例 #3
0
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                lock (this)
                {
                    if (_stream != null)
                    {
                        _stream.Dispose();
                    }

                    if (_tcp != null)
                    {
                        _tcp.Close();
                    }

                    ConnectionState = ClientState.Unconnected;

                    _tcp               = null;
                    _stream            = null;
                    _localPlayerNumber = -1;
                    _playerData        = default(TPlayerData);
                }
            }

            base.Dispose(disposing);
        }
コード例 #4
0
        /// <summary>Join a local game.</summary>
        /// <param name="server">the local server to join.</param>
        /// <param name="playerName">the name with which to register.</param>
        /// <param name="playerData">additional data to be associated with our player.</param>
        public void Join(IServerSession server, string playerName, object playerData)
        {
            if (ConnectionState != ClientState.Unconnected)
            {
                throw new InvalidOperationException("Must leave the current session first.");
            }
            if (!(server is HybridServerSession <TPlayerData>))
            {
                throw new InvalidOperationException("Incompatible server type.");
            }
            if (!(playerData is TPlayerData))
            {
                throw new ArgumentException("Invalid type.", "playerData");
            }

            Logger.Debug("Begin connecting to local server.");
            _playerName     = playerName;
            _playerData     = (TPlayerData)playerData;
            ConnectionState = ClientState.Connecting;

            // Check if the server is already full.
            if (server.PlayerCount >= server.MaxPlayers)
            {
                Logger.Debug("Join failed, server already full.");
                Reset();
                return;
            }

            // Create the two 'pipes' we use to pass data from client to server
            // and vice versa.
            var toClient = new SlidingStream();
            var toServer = new SlidingStream();

            // Our stream is the one where the sink is the server.
            // The server gets one in the other direction (see below).
            _stream = new SlidingPacketStream(toClient, toServer);
            using (var packet = new Packet())
            {
                using (var packetInner = new Packet())
                {
                    packetInner.
                    Write(_playerName).
                    Write(_playerData);
                    packet.
                    Write((byte)SessionMessage.JoinRequest).
                    Write((IWritablePacket)packetInner);
                    var written = _stream.Write(packet);

                    // Statistics.
                    Info.PutOutgoingTraffic(written, TrafficTypes.Protocol);
                    Info.PutOutgoingPacketSize(written);
                    Info.PutOutgoingPacketCompression((packet.Length / (float)written) - 1f);
                }
            }

            // Let's try this. This can throw if the server is already
            // full, but that shouldn't happen, because we checked above.
            ((HybridServerSession <TPlayerData>)server).
            Add(new SlidingPacketStream(toServer, toClient));
        }
コード例 #5
0
 public TradeAddItemPacket(IPacketStream packet)
 {
     Bag               = packet.Read <byte>();
     Slot              = packet.Read <byte>();
     Quantity          = packet.Read <byte>();
     SlotInTradeWindow = packet.Read <byte>();
 }
コード例 #6
0
        public IResolverSession GetProtocolResolver(IPacketStream packetStream, CancellationToken cancellationToken)
        {
            var resolver = new Resolver();

            resolver.LoadFromReference <ProtocolTests>();
            var session = resolver.CreateSession();

            var handler = new HandlerProvider(session.Resolve <IMethodContextInfoProvider>());

            handler.LoadFromReference <ProtocolTests>();

            var converter = new Serializer();

            converter.LoadFromReference <ProtocolTests>();

            var protocol = new SocketProtocolHandler(session, packetStream, converter, handler);

            session.Resolver.Register(protocol);
            session.Resolver.Register(handler);
            session.Resolver.Register(converter);

            var listenTask = protocol.ListenAsync(cancellationToken);

            return(session);
        }
コード例 #7
0
        public static void OnSelectServer(LoginClient client, IPacketStream packet)
        {
            if (packet.Length != 9)
            {
                return;
            }

            var selectServerPacket = new SelectServerPacket(packet);

            var server    = DependencyContainer.Instance.Resolve <ILoginServer>();
            var worldInfo = server.GetWorldByID(selectServerPacket.WorldId);

            if (worldInfo == null)
            {
                LoginPacketFactory.SelectServerFailed(client, SelectServer.CannotConnect);
                return;
            }

            if (worldInfo.BuildVersion != selectServerPacket.BuildClient)
            {
                LoginPacketFactory.SelectServerFailed(client, SelectServer.VersionDoesntMatch);
                return;
            }

            if (worldInfo.ConnectedUsers >= worldInfo.MaxAllowedUsers)
            {
                LoginPacketFactory.SelectServerFailed(client, SelectServer.ServerSaturated);
                return;
            }

            LoginPacketFactory.SelectServerSuccess(client, worldInfo.Host);
        }
コード例 #8
0
 public DyeSelectItemPacket(IPacketStream packet)
 {
     DyeItemBag     = packet.Read <byte>();
     DyeItemSlot    = packet.Read <byte>();
     TargetItemBag  = packet.Read <byte>();
     TargetItemSlot = packet.Read <byte>();
 }
コード例 #9
0
ファイル: ISClient.cs プロジェクト: momo314/Imgeneus
        public override void HandlePacket(IPacketStream packet)
        {
            if (this.Socket == null)
            {
                this.logger.LogTrace("Skip to handle packet from {0}. Reason: socket is no more connected.", this.RemoteEndPoint);
                return;
            }

            try
            {
                if (!PacketHandler <ISClient> .Invoke(this, packet, packet.PacketType))
                {
                    if (Enum.IsDefined(typeof(PacketType), packet.PacketType))
                    {
                        this.logger.LogWarning("Received an unimplemented packet {0} from {2}.", packet.PacketType, this.RemoteEndPoint);
                    }
                    else
                    {
                        this.logger.LogWarning("Received an unknown packet 0x{0} from {1}.", ((ushort)packet.PacketType).ToString("X2"), this.RemoteEndPoint);
                    }
                }
            }
            catch (Exception exception)
            {
                this.logger.LogError("Packet handle error from {0}. {1}", this.RemoteEndPoint, exception.Message);
                this.logger.LogDebug(exception.InnerException?.StackTrace);
            }
        }
コード例 #10
0
        public static void OnLoginRequest(LoginClient client, IPacketStream packet)
        {
            if (packet.Length != 52)
            {
                return;
            }

            var authenticationPacket = new AuthenticationPacket(packet);

            var result = Authentication(authenticationPacket.Username, authenticationPacket.Password);

            if (result != AuthenticationResult.SUCCESS)
            {
                LoginPacketFactory.AuthenticationFailed(client, result);
                return;
            }
            var loginServer = DependencyContainer.Instance.Resolve <ILoginServer>();

            using var database = DependencyContainer.Instance.Resolve <IDatabase>();
            DbUser dbUser = database.Users.Get(x => x.Username.Equals(authenticationPacket.Username, StringComparison.OrdinalIgnoreCase));

            if (loginServer.IsClientConnected(dbUser.Id))
            {
                client.Disconnect();
                return;
            }

            dbUser.LastConnectionTime = DateTime.Now;
            database.Users.Update(dbUser);
            database.Complete();

            client.SetClientUserID(dbUser.Id);

            LoginPacketFactory.AuthenticationFailed(client, result, dbUser);
        }
コード例 #11
0
 public MoveItemInInventoryPacket(IPacketStream packet)
 {
     CurrentBag      = packet.Read <byte>();
     CurrentSlot     = packet.Read <byte>();
     DestinationBag  = packet.Read <byte>();
     DestinationSlot = packet.Read <byte>();
 }
コード例 #12
0
        public ChatWhisperPacket(IPacketStream packet)
        {
            TargetName = packet.ReadString(21);
            var messageLength = packet.Read <byte>();

            Message = packet.ReadString(messageLength);
        }
コード例 #13
0
        public GMNoticeAdminsPacket(IPacketStream packet)
        {
            var messageLength = packet.Read <byte>();

            // Message always ends with an empty character
            Message = packet.ReadString(messageLength - 1);
        }
コード例 #14
0
        public AesKeyResponsePacket(IPacketStream packet)
        {
            // First goes session id.
            byte[] guidBytes = new byte[16];
            for (int i = 0; i < 16; i++)
            {
                guidBytes[i] = packet.Read <byte>();
            }

            Guid = new Guid(guidBytes);

            // After that aes key.
            Key = new byte[16];
            for (int i = 0; i < 16; i++)
            {
                Key[i] = packet.Read <byte>();
            }

            // After that iv.
            IV = new byte[16];
            for (int i = 0; i < 16; i++)
            {
                IV[i] = packet.Read <byte>();
            }
        }
コード例 #15
0
        public static void OnSelectServer(LoginClient client, IPacketStream packet)
        {
            if (packet.Length != 9)
            {
                return;
            }

            var selectServerPacket = new SelectServerPacket(packet);

            var server    = DependencyContainer.Instance.Resolve <ILoginServer>();
            var worldInfo = server.GetWorldByID(selectServerPacket.WorldId);

            if (worldInfo == null)
            {
                LoginPacketFactory.SelectServerFailed(client, SelectServer.CannotConnect);
                return;
            }

            // For some reason, the current game.exe has version -1. Maybe this is somehow connected with decrypted packages?
            // In any case, for now client version check is disabled.
            if (worldInfo.BuildVersion != selectServerPacket.BuildClient && selectServerPacket.BuildClient != -1)
            {
                LoginPacketFactory.SelectServerFailed(client, SelectServer.VersionDoesntMatch);
                return;
            }

            if (worldInfo.ConnectedUsers >= worldInfo.MaxAllowedUsers)
            {
                LoginPacketFactory.SelectServerFailed(client, SelectServer.ServerSaturated);
                return;
            }

            LoginPacketFactory.SelectServerSuccess(client, worldInfo.Host);
        }
コード例 #16
0
 public ItemComposePacket(IPacketStream packet)
 {
     RuneBag  = packet.Read <byte>();
     RuneSlot = packet.Read <byte>();
     ItemBag  = packet.Read <byte>();
     ItemSlot = packet.Read <byte>();
 }
コード例 #17
0
 public MoveCharacterPacket(IPacketStream packet)
 {
     MovementType = (MovementType)packet.Read <byte>();
     Angle        = packet.Read <ushort>();
     X            = packet.Read <float>();
     Y            = packet.Read <float>();
     Z            = packet.Read <float>();
 }
コード例 #18
0
        public RimPacketHandlerAuthorized(IPacketStream packetStream, Contact.Contact contact, SignatureAlgorithm localSignatureAlgorithm) : base(packetStream)
        {
            this.contact = contact;

            Console.WriteLine("Connected to " + contact.Identity.GetFingerprintString() + ".");

            Stream.WritePacket(new Packet4Signature(new Packet1Message(contact.Identity, "Kekkoning is stronk!").ToSignature(localSignatureAlgorithm)));
        }
コード例 #19
0
        public GMWarningPacket(IPacketStream packet)
        {
            Name = packet.ReadString(21);

            var messageLength = packet.Read <byte>();

            Message = packet.ReadString(messageLength);
        }
コード例 #20
0
 /// <summary>
 ///     Add a single connection for this server. This connection will be put into login pending mode, meaning it has to
 ///     send its login data. If it doesn't by the time <c>LoginTimeout</c> milliseconds have passed, it'll be disconnected.
 ///     <para>
 ///         This is used for local joins, i.e. clients running in the same program joining the game. We avoid going
 ///         through the network stack this way.
 ///     </para>
 /// </summary>
 /// <param name="stream">the packet stream used for this client.</param>
 internal void Add(IPacketStream stream)
 {
     if (PlayerCount == MaxPlayers)
     {
         throw new InvalidOperationException("Game already full.");
     }
     _pending.Add(new PendingLogin(null, stream));
 }
コード例 #21
0
        public GMNoticeFactionPacket(IPacketStream packet)
        {
            TimeInterval = packet.Read <short>();
            var messageLength = packet.Read <byte>();

            // Message always ends with an empty character
            Message = packet.ReadString(messageLength - 1);
        }
コード例 #22
0
 public ChangeAppearancePacket(IPacketStream packet)
 {
     Bag  = packet.Read <byte>();
     Slot = packet.Read <byte>();
     Hair = packet.Read <byte>();
     Face = packet.Read <byte>();
     Size = packet.Read <byte>();
     Sex  = packet.Read <byte>();
 }
コード例 #23
0
ファイル: GemAddPacket.cs プロジェクト: tai-engineer/Imgeneus
 public GemAddPacket(IPacketStream packet)
 {
     Bag             = packet.Read <byte>();
     Slot            = packet.Read <byte>();
     DestinationBag  = packet.Read <byte>();
     DestinationSlot = packet.Read <byte>();
     HammerBag       = packet.Read <byte>();
     HammerSlot      = packet.Read <byte>();
 }
コード例 #24
0
 public GemAddPossibilityPacket(IPacketStream packet)
 {
     GemBag          = packet.Read <byte>();
     GemSlot         = packet.Read <byte>();
     DestinationBag  = packet.Read <byte>();
     DestinationSlot = packet.Read <byte>();
     HammerBag       = packet.Read <byte>();
     HammerSlot      = packet.Read <byte>();
 }
コード例 #25
0
 public GemRemovePossibilityPacket(IPacketStream packet)
 {
     Bag  = packet.Read <byte>();
     Slot = packet.Read <byte>();
     ShouldRemoveSpecificGem = packet.Read <bool>();
     GemPosition             = packet.Read <byte>();
     HammerBag  = packet.Read <byte>();
     HammerSlot = packet.Read <byte>();
 }
コード例 #26
0
 public UpdateStatsPacket(IPacketStream packet)
 {
     Str = packet.Read <ushort>();
     Dex = packet.Read <ushort>();
     Rec = packet.Read <ushort>();
     Int = packet.Read <ushort>();
     Wis = packet.Read <ushort>();
     Luc = packet.Read <ushort>();
 }
コード例 #27
0
        public static void OnSelectCharacter(WorldClient client, IPacketStream packet)
        {
            var selectCharacterPacket = new SelectCharacterPacket(packet);

            using var database = DependencyContainer.Instance.Resolve <IDatabase>();
            var character = database.Charaters.Include(c => c.Items).Where(c => c.Id == selectCharacterPacket.CharacterId).FirstOrDefault();

            WorldPacketFactory.SendSelectedCharacter(client, character);
        }
コード例 #28
0
        public static void OnCheckAvailableName(WorldClient client, IPacketStream packet)
        {
            var checkNamePacket = new CheckCharacterAvailableNamePacket(packet);

            using var database = DependencyContainer.Instance.Resolve <IDatabase>();
            DbCharacter character = database.Charaters.Get(c => c.Name == checkNamePacket.CharacterName);

            WorldPacketFactory.SendCharacterAvailability(client, character is null);
        }
コード例 #29
0
        public GuildCreatePacket(IPacketStream packet)
        {
            Name = packet.ReadString(25);

#if (EP8_V2 || SHAIYA_US)
            Message = packet.ReadString(25, Encoding.Unicode);
#else
            Message = packet.ReadString(25);
#endif
        }
コード例 #30
0
        public AesKeyRequestPacket(IPacketStream packet)
        {
            byte[] guidBytes = new byte[16];
            for (int i = 0; i < 16; i++)
            {
                guidBytes[i] = packet.Read <byte>();
            }

            Guid = new Guid(guidBytes);
        }
コード例 #31
0
ファイル: TcpClient.cs プロジェクト: EBassie/Potato
 protected TcpClient()
     : base()
 {
     this.ReceivedBuffer = new byte[this.BufferSize];
     this.PacketStream = new PacketStream();
 }
コード例 #32
0
ファイル: TcpClient.cs プロジェクト: EBassie/Potato
        /// <summary>
        /// Attempts a connection to a server, provided we are not currently backing off from an offline server.
        /// </summary>
        public override void Connect()
        {
            if (this.MarkManager.RemoveExpiredMarks().IsValidMarkWindow() == true) {
                this.MarkManager.Mark();

                if (this.Options.Hostname != null && this.Options.Port != 0) {
                    try {
                        this.ReceivedBuffer = new byte[this.BufferSize];
                        this.PacketStream = new PacketStream();

                        this.SequenceNumber = 0;

                        this.ConnectionState = ConnectionState.ConnectionConnecting;

                        this.Client = new System.Net.Sockets.TcpClient {
                            NoDelay = true
                        };

                        this.Client.BeginConnect(this.Options.Hostname, this.Options.Port, this.ConnectedCallback, this);
                    }
                    catch (SocketException se) {
                        this.Shutdown(se);
                    }
                    catch (Exception e) {
                        this.Shutdown(e);
                    }
                }
            }
        }