/// <summary> /// Reads a packet from the given <see cref="INetworkMessage"/>. /// </summary> /// <param name="message">The message to read from.</param> /// <returns>The packet read from the message.</returns> public override IIncomingPacket ReadFromMessage(INetworkMessage message) { message.ThrowIfNull(nameof(message)); // OS and Version were included plainly in this version var operatingSystem = message.GetUInt16(); var version = message.GetUInt16(); // Skip dat, spr, and pic signatures (4 bytes each)? message.SkipBytes(12); var targetSpan = message.Buffer[message.Cursor..message.Length];
/// <summary> /// Reads a packet from the given <see cref="INetworkMessage"/>. /// </summary> /// <param name="message">The message to read from.</param> /// <returns>The packet read from the message.</returns> public override IIncomingPacket ReadFromMessage(INetworkMessage message) { message.ThrowIfNull(nameof(message)); return(new LookAtPacket( location: new Location { X = message.GetUInt16(), Y = message.GetUInt16(), Z = (sbyte)message.GetByte(), }, thingId: message.GetUInt16(), stackPos: message.GetByte())); }
/// <summary> /// Reads a packet from the given <see cref="INetworkMessage"/>. /// </summary> /// <param name="message">The message to read from.</param> /// <returns>The packet read from the message.</returns> public override IIncomingPacket ReadFromMessage(INetworkMessage message) { message.ThrowIfNull(nameof(message)); SpeechType type = (SpeechType)message.GetByte(); switch (type) { case SpeechType.Private: // case SpeechType.PrivateRed: case SpeechType.RuleViolationAnswer: return new SpeechPacket(type, ChatChannelType.Private, receiver: message.GetString(), content: message.GetString()); case SpeechType.ChannelYellow: // case SpeechType.ChannelRed: // case SpeechType.ChannelRedAnonymous: // case SpeechType.ChannelWhite: return new SpeechPacket(type, channelId: (ChatChannelType)message.GetUInt16(), content: message.GetString()); default: return new SpeechPacket(type, channelId: ChatChannelType.None, content: message.GetString()); } }
/// <summary> /// Reads a packet from the given <see cref="INetworkMessage"/>. /// </summary> /// <param name="message">The message to read from.</param> /// <returns>The packet read from the message.</returns> public override IIncomingPacket ReadFromMessage(INetworkMessage message) { message.ThrowIfNull(nameof(message)); return(new TurnOnDemandPacket(Direction.West)); }
/// <summary> /// Reads a packet from the given <see cref="INetworkMessage"/>. /// </summary> /// <param name="message">The message to read from.</param> /// <returns>The packet read from the message.</returns> public override IInboundPacket ReadFromMessage(INetworkMessage message) { message.ThrowIfNull(nameof(message)); return(new WalkOnDemandPacket(Direction.North)); }
/// <summary> /// Reads a packet from the given <see cref="INetworkMessage"/>. /// </summary> /// <param name="message">The message to read from.</param> /// <returns>The packet read from the message.</returns> public override IIncomingPacket ReadFromMessage(INetworkMessage message) { message.ThrowIfNull(nameof(message)); return(message.ReadAsBytesInfo()); }
/// <summary> /// Reads a packet from the given <see cref="INetworkMessage"/>. /// </summary> /// <param name="message">The message to read from.</param> /// <returns>The packet read from the message.</returns> public override IIncomingPacket ReadFromMessage(INetworkMessage message) { message.ThrowIfNull(nameof(message)); return(new AttackPacket(targetCreatureId: message.GetUInt32())); }
/// <summary> /// Reads a packet from the given <see cref="INetworkMessage"/>. /// </summary> /// <param name="message">The message to read from.</param> /// <returns>The packet read from the message.</returns> public override IInboundPacket ReadFromMessage(INetworkMessage message) { message.ThrowIfNull(nameof(message)); return(new FollowPacket(targetCreatureId: message.GetUInt32())); }
/// <summary> /// Processes an incomming message from the connection. /// </summary> /// <param name="connection">The connection where the message is being read from.</param> /// <param name="inboundMessage">The message to process.</param> public override void ProcessMessage(IConnection connection, INetworkMessage inboundMessage) { connection.ThrowIfNull(nameof(connection)); inboundMessage.ThrowIfNull(nameof(inboundMessage)); byte packetType; if (!connection.IsAuthenticated || connection.XTeaKey.Sum(b => b) == 0) { // this is a new connection... packetType = inboundMessage.GetByte(); if (packetType != (byte)IncomingGamePacketType.LogIn) { // but this is not the packet we were expecting for a new connection. connection.Close(); return; } // Make a copy of the message in case we fail to decrypt using the first set of keys. var messageCopy = inboundMessage.Copy(); inboundMessage.RsaDecrypt(useCipKeys: this.ProtocolConfiguration.UsingCipsoftRsaKeys); if (inboundMessage.GetByte() != 0) { // means the RSA decrypt was unsuccessful, lets try with the other set of RSA keys... inboundMessage = messageCopy; inboundMessage.RsaDecrypt(useCipKeys: !this.ProtocolConfiguration.UsingCipsoftRsaKeys); if (inboundMessage.GetByte() != 0) { // These RSA keys are also usuccessful... so give up. connection.Close(); return; } } } else { // Decrypt message using XTea inboundMessage.XteaDecrypt(connection.XTeaKey); inboundMessage.GetUInt16(); packetType = inboundMessage.GetByte(); } var handler = this.HandlerSelector.SelectForType(packetType); if (handler == null) { return; } var(intendsToRespond, responsePackets) = handler.HandleRequest(inboundMessage, connection); if (intendsToRespond) { // Send any responses prepared for this. var responseMessage = handler.PrepareResponse(responsePackets); connection.Send(responseMessage); } }