public void Process() { const int HEADER_LEN = 7; var result = false; if (DataStream.Count >= 5) { using (Reader Reader = new Reader(DataStream.ToArray())) { ushort Identifier = Reader.ReadUInt16(); int Length = Reader.ReadInt24(); ushort Version = Reader.ReadUInt16(); if (DataStream.Count - HEADER_LEN >= Length) { var message = MessageFactory.Read(this, Reader, Identifier); if (message != null) { message.Identifier = Identifier; // Just in case they don't do it in the constructor. message.Length = Length; message.Version = Version; #if Info Logger.SayInfo("[MESSAGE] " + message.Device.Socket.RemoteEndPoint + " --> " + message.GetType().Name + " [" + message.Identifier + "]"); #endif try { message.Decrypt(); } catch (Exception ex) { ExceptionLogger.Log(ex, $"Unable to decrypt message with ID: {Identifier}"); } try { message.Decode(); } catch (Exception ex) { ExceptionLogger.Log(ex, $"Unable to decode message with ID: {Identifier}"); } try { message.Process(); } catch (Exception ex) { ExceptionLogger.Log(ex, $"Exception while processing incoming message {message.GetType()}"); } } else { Logger.Say("Unhandled message " + Identifier); // Make sure we don't break the stream. SNonce.Increment(); } // Clean up. DataStream.RemoveRange(0, HEADER_LEN + Length); if (DataStream.Count >= 7) { this.Process(); } } } } }
public void Process(int _Range) { int[] _Header = new int[3]; if (_Range >= 7) { using (Reader _Reader = new Reader(DataStream.ToArray())) { _Header[0] = _Reader.ReadUInt16(); // ID _Reader.BaseStream.Seek(1, SeekOrigin.Current); _Header[1] = _Reader.ReadUInt16(); // Length _Header[2] = _Reader.ReadUInt16(); // Version if (DataStream.Count - 7 >= _Header[1]) { if (MessageFactory.m_vMessages.ContainsKey(_Header[0])) { Message _Message = Activator.CreateInstance(MessageFactory.m_vMessages[_Header[0]], this, _Reader, _Header) as Message; Level pl = _Message.Client.GetLevel(); if (_Message != null) { if (Core.Settings.Settings.Debug) { Console.WriteLine(ConsolePad.Padding(((IPEndPoint)Connection.RemoteEndPoint).Address.ToString()) + " -> " + ConsolePad.Padding(_Message.GetType().Name) + " -> SERVER -> " + Interface); } try { _Message.Decrypt(); _Message.Decode(); _Message.Process(); } catch (Exception _Error) { Console.WriteLine("The player " + (string.IsNullOrEmpty(pl.GetPlayerAvatar().GetAvatarName()) ? "with ID " + pl.GetPlayerAvatar().GetId() : "with name '" + pl.GetPlayerAvatar().GetAvatarName()) + " throwed an exception."); if (SNonce != null) { if (State >= State.LOGGED) { // this.SNonce.Increment(); } else { // Login Failed. } } else { if (Errors > 5) { ResourcesManager.DropClient(this.m_vSocketHandle); } else { Errors = Errors + 1; } } } } } else { SNonce.Increment(); Console.WriteLine("The message " + _Header[0] + " can't be processed."); } DataStream.RemoveRange(0, _Header[1] + 7); } } } }