private bool DecodePacket(BufferData data, out ushort length) { using (var br = data.GetReader(data.Offset, data.RemainingLength)) { var rawPacket = new ProtocolPacket(); rawPacket.Read(br); if (rawPacket.Channel != 0) { if (rawPacket.SequenceNumber < ReceiveSequence[rawPacket.Channel]) { Debugger.Break(); length = rawPacket.Size; // throw away the packet return(true); } ReceiveSequence[rawPacket.Channel] = rawPacket.SequenceNumber; } length = rawPacket.Size; data.Offset += (int)br.BaseStream.Position; if (rawPacket.Type == ClientMessageOpcode.None) { if (length != 4) { Debugger.Break(); // If it's not send timeout check, let's investigate... } return(true); } _packetQueue.EnqueueIncoming(rawPacket); } /*var packet = new PythonCallPacket(length); * using (var br = data.GetReader()) * { * packet.Read(br); * * if (packet.Return.HasValue) * return packet.Return.Value; * * if (packet.Type == 2) * { * State = ClientState.LoggedIn; * Entry = Server.AuthenticateClient(this, packet.AccountId, packet.OneTimeKey); * if (Entry == null) * { * Logger.WriteLog(LogType.Error, "Client with ip: {0} tried to log in with invalid session data! User Id: {1} | OneTimeKey: {2}", Socket.RemoteAddress, packet.AccountId, packet.OneTimeKey); * Close(false); * return false; * } * * CharacterManager.Instance.StartCharacterSelection(this); * return true; * } * * if (packet.DataSize > 0 && br.BaseStream.Position + packet.DataSize < br.BaseStream.Length) * { * if (br.ReadByte() != 0x4F) // 'O' format * throw new Exception("Unsupported serialization format!"); * * var packetType = PacketRouter.GetPacketType(packet.Opcode); * if (packetType != null) * { * var pythonPacket = Activator.CreateInstance(packetType) as IBasePacket; * if (pythonPacket == null) * return false; * * pythonPacket.Read(br); * * Server.PacketQueue.EnqueueIncoming(this, pythonPacket); * } * else * Logger.WriteLog(LogType.Error, $"Unhandled game opcode: {packet.Opcode}"); * } * else * Logger.WriteLog(LogType.Error, $"Invalid data found in Python method call! Off: {br.BaseStream.Position} | Len: {packet.DataSize} | Array len: {br.BaseStream.Length}"); * }*/ return(true); }
private bool DecodePacket(BufferData data, out ushort length) { using (var br = data.GetReader(data.Offset, data.RemainingLength)) { var rawPacket = new ProtocolPacket(); rawPacket.Read(br); if (rawPacket.Channel != 0) { if (rawPacket.SequenceNumber < ReceiveSequence[rawPacket.Channel]) { Debugger.Break(); length = rawPacket.Size; // throw away the packet return(true); } ReceiveSequence[rawPacket.Channel] = rawPacket.SequenceNumber; } length = rawPacket.Size; data.Offset += (int)br.BaseStream.Position; switch (rawPacket.Type) { case ClientMessageOpcode.None: // Send timeout check if (length != 4) { Debugger.Break(); // If it's not send timeout check, let's investigate... } return(true); case ClientMessageOpcode.Login: var loginMsg = rawPacket.Message as LoginMessage; if (loginMsg == null) { Close(false); return(false); } if (loginMsg.Version.Length != 8 || loginMsg.Version != "1.16.5.0") { Logger.WriteLog(LogType.Error, $"Client version mismatch: Server: 1.16.5.0 | Client: {loginMsg.Version}"); SendMessage(new LoginResponseMessage { ErrorCode = LoginErrorCodes.VersionMismatch, Subtype = LoginResponseMessageSubtype.Failed }); Close(false); return(false); } Entry = Server.AuthenticateClient(this, loginMsg.AccountId, loginMsg.OneTimeKey); // TODO: implement ban system and check if the account is banned if (Entry == null) { Logger.WriteLog(LogType.Error, "Client with ip: {0} tried to log in with invalid session data! User Id: {1} | OneTimeKey: {2}", Socket.RemoteAddress, loginMsg.AccountId, loginMsg.OneTimeKey); SendMessage(new LoginResponseMessage { ErrorCode = LoginErrorCodes.AuthenticationFailed, Subtype = LoginResponseMessageSubtype.Failed }); Close(false); return(false); } SendMessage(new LoginResponseMessage { AccountId = loginMsg.AccountId, Subtype = LoginResponseMessageSubtype.Success }); State = ClientState.LoggedIn; CharacterManager.Instance.StartCharacterSelection(this); return(true); case ClientMessageOpcode.Move: break; case ClientMessageOpcode.CallServerMethod: break; case ClientMessageOpcode.Ping: break; } } /*var packet = new PythonCallPacket(length); * using (var br = data.GetReader()) * { * packet.Read(br); * * if (packet.Return.HasValue) * return packet.Return.Value; * * if (packet.Type == 2) * { * State = ClientState.LoggedIn; * Entry = Server.AuthenticateClient(this, packet.AccountId, packet.OneTimeKey); * if (Entry == null) * { * Logger.WriteLog(LogType.Error, "Client with ip: {0} tried to log in with invalid session data! User Id: {1} | OneTimeKey: {2}", Socket.RemoteAddress, packet.AccountId, packet.OneTimeKey); * Close(false); * return false; * } * * CharacterManager.Instance.StartCharacterSelection(this); * return true; * } * * if (packet.DataSize > 0 && br.BaseStream.Position + packet.DataSize < br.BaseStream.Length) * { * if (br.ReadByte() != 0x4F) // 'O' format * throw new Exception("Unsupported serialization format!"); * * var packetType = PacketRouter.GetPacketType(packet.Opcode); * if (packetType != null) * { * var pythonPacket = Activator.CreateInstance(packetType) as IBasePacket; * if (pythonPacket == null) * return false; * * pythonPacket.Read(br); * * Server.PacketQueue.EnqueueIncoming(this, pythonPacket); * } * else * Logger.WriteLog(LogType.Error, $"Unhandled game opcode: {packet.Opcode}"); * } * else * Logger.WriteLog(LogType.Error, $"Invalid data found in Python method call! Off: {br.BaseStream.Position} | Len: {packet.DataSize} | Array len: {br.BaseStream.Length}"); * }*/ return(true); }