private PacketResult GetPacketResultOnClientPacketReceived(SROClient client, SROPacket packet) { //For ClientlessSwitcher if (this.m_client.CanSwitchClient) { #region Fake Client #region 0x2001 if (packet.Opcode == 0x2001) { //[S -> C][2001][16 bytes] //0D 00 47 61 74 65 77 61 79 53 65 72 76 65 72 00 ..GatewayServer. Packet response = new Packet(0x2001); if (!this.m_client.IsConnectedToAgent) { response.WriteAscii("GatewayServer"); } else { response.WriteAscii("AgentServer"); this.m_client.IsConnectedToAgent = false; } response.WriteByte(0); //Client-Connection response.Lock(); client.SendPacket(response); response = new Packet(0x2005, false, true); response.WriteByte(0x01); response.WriteByte(0x00); response.WriteByte(0x01); response.WriteByte(0xBA); response.WriteByte(0x02); response.WriteByte(0x05); response.WriteByte(0x00); response.WriteByte(0x00); response.WriteByte(0x00); response.WriteByte(0x02); response.Lock(); client.SendPacket(response); response = new Packet(0x6005, false, true); response.WriteByte(0x03); response.WriteByte(0x00); response.WriteByte(0x02); response.WriteByte(0x00); response.WriteByte(0x02); response.Lock(); client.SendPacket(response); } #endregion #region 0x6100 if (packet.Opcode == 0x6100) { byte local = packet.ReadByte(); string identity = packet.ReadAscii(); uint version = packet.ReadUInt(); //S->P:A100 Data:01 Packet response = new Packet(0xA100, false, true); if (local != this.m_client.LocaleID) { response.WriteByte(0x02); response.WriteByte(0x01); //(C4) } else if (identity != "SR_Client") { response.WriteByte(0x02); response.WriteByte(0x03); //(C4) } else if (version != this.m_client.VersionID) { response.WriteByte(0x02); response.WriteByte(0x02); } else { response.WriteByte(0x01); //Success } response.Lock(); client.SendPacket(response); } #endregion #region 0x6101 if (packet.Opcode == 0x6101 && this.m_client.IsConnectedToAgent == false) { Packet response = new Packet(0xA102); response.WriteByte(0x01); //Success response.WriteUInt(uint.MaxValue); //SessionID response.WriteAscii("127.0.0.1"); //AgentIP response.WriteUShort(this.m_client.LocalPort); response.Lock(); this.m_client.IsConnectedToAgent = true; client.SendPacket(response); } #endregion #region 0x6103 if (packet.Opcode == 0x6103) { uint sessionID = packet.ReadUInt(); string username = packet.ReadAscii(); string password = packet.ReadAscii(); byte local = packet.ReadByte(); //byte[] mac = packet.ReadByteArray(6); //No need Packet response = new Packet(0xA103); if (sessionID != uint.MaxValue) { response.WriteByte(0x02); response.WriteByte(0x02); } else if (!string.IsNullOrEmpty(username)) { response.WriteByte(0x02); response.WriteByte(0x02); } else if (!string.IsNullOrEmpty(password)) { response.WriteByte(0x02); response.WriteByte(0x02); } else if (local != this.m_client.LocaleID) { response.WriteByte(0x02); response.WriteByte(0x02); } else { response.WriteByte(0x01); //Success } response.Lock(); client.SendPacket(response); } #endregion #region 0x7007 if (packet.Opcode == 0x7007) { byte type = packet.ReadByte(); if (type == 0x02) { Packet responseEndCS = new Packet(0xB001); responseEndCS.WriteByte(0x01); Packet responseInitLoad = new Packet(0x34A5); client.SendPacket(responseEndCS); client.SendPacket(responseInitLoad); this.m_client.IsWaitingForData = true; } } #endregion #endregion } else { //Not sure why but after clientless->client the clients preferes to send 0x6103 twice. if (packet.Opcode == 0x6103) { if (this.m_client.AgentLoginFixCounter > 0) { return(new PacketResult(PacketOperationType.IGNORE)); } this.m_client.AgentLoginFixCounter++; } if (packet.Opcode == 0x6102) { this.m_client.AgentLoginFixCounter = 0; } return(new PacketResult(PacketOperationType.NOTHING)); //if (this.m_client.IsConnectedToAgent) { // this.m_agentComponent. // m_agentSocket.Send(packet); //} else { // m_gatewaySocket.Send(packet); //} } return(new PacketResult(PacketOperationType.NOTHING)); }