using System; using System.Net; using System.Timers; using System.Reflection; using System.Net.Sockets; using Filter.Handlers.Zone; using Filter.Networking.Instances; using Filter.Networking.Manager; namespace Filter.Networking.Zone { internal class ZoneClient : Client { public Byte ZoneID; public ZoneServer Server; private FiestaCrypto Crypto; public ManagerClient Manager; public Boolean InNPC; public Int32 SlotID; public ZoneClient(Socket AcceptedSocket, IPEndPoint AcceptedEndPoint, Byte ZID, Int32 ConnectPort) : base(AcceptedSocket, AcceptedEndPoint) { ZoneID = ZID; Server = new ZoneServer(this, ConnectPort); } public void SendCrypto() { if (IsConnected != 0) { return; } Crypto = new FiestaCrypto(2); Packet ServerPacket = new Packet(Zone2TypeServer.SetXor); ServerPacket.WriteInt16(2); SendPacket(ServerPacket); } public void SendPacket(Packet ServerPacket) { if (IsConnected != 0) { return; } Byte[] PacketBuffer; ServerPacket.ToArray(out PacketBuffer); ServerPacket.Dispose(); Send(PacketBuffer); } public override void Connected() { } public override void ConnectFailed(SocketException Exception) { } public override void Received(Byte[] Buffer) { if (Crypto != null) { Crypto.Crypt(Buffer, 0, Buffer.Length); } Packet ClientPacket = new Packet(Buffer); if (!ClientPacket.SetHeaderAndType()) { } else if (Program.ZoneHandlers.HasHandler(ClientPacket.Header, ClientPacket.Type)) { try { MethodInfo PacketMethod = Program.ZoneHandlers.GetHandler(ClientPacket.Header, ClientPacket.Type); Action PacketAction = Program.ZoneHandlers.GetAction(PacketMethod, this, ClientPacket); PacketAction(); } catch { SendPacket(ClientPacket); } } else { Server.SendPacket(ClientPacket); } } public override void Disconnected() { Console.ForegroundColor = ConsoleColor.Red; //if (Manager != null && Manager.CharacterName != String.Empty) { Console.WriteLine("[{0}]: left Zone {1}.", Manager.CharacterName, ZoneID); } } } }