public void handlePacket(Client c, PacketReader packet) { int tickCount = packet.ReadInt(); byte inventoryType = packet.ReadByte(); short src = packet.ReadShort(); short dst = packet.ReadShort(); short quantity = packet.ReadShort(); c.SendPacket(CWvsContext.BroadcastMessage(5, string.Format("InventoryOperation {0},{1} {2},{3},{4}", tickCount, inventoryType, src, dst, quantity))); c.SendPacket(CUser.UpdatePrimaryStat(PrimaryStat.Null)); }
public void handlePacket(Client c, PacketReader packet) { byte region = packet.ReadByte(); short majorVersion = packet.ReadShort(); short minorVersion = packet.ReadShort(); if (region == 8 // North America && majorVersion == Common.Config.MajorVersion) c.validated = true; else { Logger.Write(Logger.LogTypes.경고, "Client at {0} connected with invalid version ({1},{2},{3})", c.mSession.Socket.RemoteEndPoint.ToString(), region, majorVersion, minorVersion); c.Close(); } }
public static void HandleMigrate(CenterServer serv, PacketReader packet) { int accid = packet.ReadInt(); int cid = packet.ReadInt(); byte[] ip = packet.ReadBytes(4); ushort port = (ushort)packet.ReadShort(); if (port == 0) Program.mServer.GetClientByAccountId(accid).SendPacket(PacketDefinitions.SelectCharacter(0x0C, 0x1F, ip, port, cid)); else Program.mServer.GetClientByAccountId(accid).SendPacket(PacketDefinitions.SelectCharacter(0x00, 0x00, ip, port, cid)); }
void _Session_OnPacketReceived(PacketReader packet) { short opcode = packet.ReadShort(); switch ((CenterRecvOps)opcode) { case CenterRecvOps.Identify: CenterServerPacketHandling.Identify(this, packet); break; case CenterRecvOps.ClientCount: CenterServerPacketHandling.ClientCount(this, packet); break; case CenterRecvOps.PollChannelLoad: CenterServerPacketHandling.ChannelLoad(this, packet); break; case CenterRecvOps.Migrate: CenterServerPacketHandling.Migrate(this, packet); break; case CenterRecvOps.GuildOperation: CenterServerPacketHandling.GuildOperation(this, packet); break; } }
public void handlePacket(Client c, PacketReader packet) { int portalCount = packet.ReadByte(); int crc = packet.ReadInt(); int tickcount = packet.ReadInt(); c.mCharacter.mPosition = new System.Drawing.Point(packet.ReadShort(), packet.ReadShort()); Program.mServer.Fields[c.mCharacter.mField][c.mCharacter.mFieldInstance].SendPacket(c, CField.UserMove(c.mCharacter.mID, c.mCharacter.mPosition, packet.ReadBytes(packet.Length - packet.Position))); //Console.WriteLine("UH....PACKET?\r\n{0}", CField.UserMove(c.mCharacter.mID, c.mCharacter.mPosition, packet.ReadBytes(packet.Length - packet.Position)).ToString2s()); /* int portalCount = packet.ReadByte(); int crc = packet.ReadInt(); int tickcount = packet.ReadInt(); short x = packet.ReadShort(); short y = packet.ReadShort(); c.mCharacter.mPosition = new System.Drawing.Point(x, y); byte[] movement = packet.ReadBytes(packet.Length - packet.Position); packet.ReadBytes(4); int tickcount = packet.ReadInt(); c.mCharacter.mPosition = new System.Drawing.Point(packet.ReadShort(), packet.ReadShort()); packet.ReadBytes(4); - c.mCharacter.ParseMovementPath(packet);*/ //c.mCharacter.ParseMovementPath(packet); //Program.mServer.Fields[c.mCharacter.mField][c.mCharacter.mFieldInstance].SendPacket(c, CField.UserMove(c.mCharacter.mID, c.mCharacter.mPosition, MovementParser.ParseMovementPath(packet))); //Program.mServer.Fields[c.mCharacter.mField][c.mCharacter.mFieldInstance].SendPacket(c, CField.UserMove(c.mCharacter.mID, c.mCharacter.mPosition, packet.ReadBytes(packet.Length - packet.Position))); //if (x < Program.mServer.Fields[c.mCharacter.mField][c.mCharacter.mFieldInstance].WzData //c.mCharacter.ParseMovementPath(packet); //Program.mServer.Fields[c.mCharacter.mField][c.mCharacter.mFieldInstance].SendPacket(c, CField.UserMove(c.mCharacter.mID, c.mCharacter.mPosition, MovementParser.ParseMovementPath(packet))); //Program.mServer.Fields[c.mCharacter.mField][c.mCharacter.mFieldInstance].SendPacket(c, CField.UserMove(c.mCharacter.mID, c.mCharacter.mPosition, movement)); //Program.mServer.Fields[c.mCharacter.mField][c.mCharacter.mFieldInstance].SendPacket(c, CField.UserMove(c.mCharacter.mID, c.mCharacter.mPosition, c.mCharacter.ParseMovementPath(packet))); /*[9/12/2012 12:40:34 AM][대타] 받은 패킷 * 49 00 * 01 AC 7E BC BC 80 15 FC 05 BA 02 12 01 00 00 00 00 03 00 BA 02 12 01 00 00 00 00 61 00 00 00 00 00 * 04 4A 01 00 C8 02 12 01 96 00 00 00 61 00 00 00 00 00 02 96 00 00 CC 02 12 01 7E 00 00 00 61 00 00 * 00 00 00 04 1E 00 11 00 00 00 00 00 40 44 44 00 BA 02 12 01 CC 02 12 01 * */ }
public void handlePacket(Client c, PacketReader packet) { short world = packet.ReadShort(); int count = 0; foreach (KeyValuePair<int, int> server in Program.mServer.GetCenterServerById(world).channels) { count += server.Value; } if (count > 30) c.SendPacket(PacketDefinitions.CheckUserLimit(0, 1)); else c.SendPacket(PacketDefinitions.CheckUserLimit(0, 0)); }
public static void HandleGuildOperation(PacketReader packet) { int cid = packet.ReadInt(); int gid = packet.ReadInt(); string name = packet.ReadMapleString(); int point = packet.ReadInt(); int membercap = packet.ReadInt(); int emblemBG = packet.ReadShort(); int emblemBGC = packet.ReadShort(); int emblem = packet.ReadShort(); int emblemC = packet.ReadShort(); int membercount = packet.ReadInt(); List<GuildMember> mems = new List<GuildMember>(); for (int i = 0; i < membercount; ++i) { var member = new GuildMember(); member.CharacterID = packet.ReadInt(); member.Grade = packet.ReadInt(); member.GuildID = gid; mems.Add(member); } if (membercap == 0) ++membercap; var guild = new Guild(); guild.Name = name; guild.GuildID = gid; guild.Point = point; guild.MemberCap = membercap; guild.EmblemBG = emblemBG; guild.EmblemBGColour = emblemBGC; guild.Emblem = emblem; guild.EmblemColour = emblemC; guild.Members = mems.ToArray(); Program.mServer.GetClient(cid).mCharacter.mGuild = guild; }
public void handlePacket(Client c, PacketReader packet) { string charname = Database.MySqlEscape(packet.ReadMapleString()); int jobtype = packet.ReadInt(); short specialjobtype = packet.ReadShort(); byte gender = packet.ReadByte(); packet.Skip(2); int face = packet.ReadInt(); int hair = packet.ReadInt(); int haircolor = packet.ReadInt(); int skin = packet.ReadInt(); int top = packet.ReadInt(); int bottom = 0; if (jobtype < 5) bottom = packet.ReadInt(); int shoes = packet.ReadInt(); int weapon = packet.ReadInt(); int shield = 0; if (jobtype == 6) shield = packet.ReadInt(); Character newchr = new Character(); newchr.mName = charname; if (jobtype == 0) { newchr.mPrimaryStats.Job = (short)Job.Citizen; } else if (jobtype == 1) { newchr.mPrimaryStats.Job = (short)Job.Beginner; } else if (jobtype == 2) { newchr.mPrimaryStats.Job = (short)Job.Noblesse; } else if (jobtype == 3) { newchr.mPrimaryStats.Job = (short)Job.Legend; } else if (jobtype == 4) { newchr.mPrimaryStats.Job = (short)Job.Evan1; } else if (jobtype == 5) { newchr.mPrimaryStats.Job = (short)Job.Mercedes; } else if (jobtype == 6) { newchr.mPrimaryStats.Job = (short)Job.DemonSlayer; } newchr.mMap = 100000000; newchr.mClient = c; newchr.mHair = hair + haircolor; newchr.mFace = face; newchr.mSkin = (byte)skin; newchr.mGender = gender; newchr.mPrimaryStats.Level = 1; newchr.mPrimaryStats.HP = 50; newchr.mPrimaryStats.MaxHP = 50; newchr.mPrimaryStats.MP = 50; newchr.mPrimaryStats.MaxMP = 50; newchr.mPrimaryStats.Str = 4; newchr.mPrimaryStats.Dex = 4; newchr.mPrimaryStats.Int = 4; newchr.mPrimaryStats.Luk = 4; Equip eweapon = new Equip(weapon, "Character creation (JobId " + jobtype + ")"); eweapon.Watk = 17; eweapon.Position = -11; newchr.mInventory[0].Add(eweapon.Position, eweapon); if (shield > 0) { Equip eshield = new Equip(shield, "Character creation (JobId " + jobtype + ")"); eshield.Position = -10; newchr.mInventory[0].Add(eshield.Position, eshield); } Equip etop = new Equip(top, "Character creation (JobId " + jobtype + ")"); etop.Position = -5; newchr.mInventory[0].Add(etop.Position, etop); if (bottom > 0) { Equip ebottom = new Equip(bottom, "Character creation (JobId " + jobtype + ")"); ebottom.Position = -6; newchr.mInventory[0].Add(ebottom.Position, ebottom); } Equip eshoes = new Equip(shoes, "Character creation (JobId " + jobtype + ")"); eshoes.Position = -7; newchr.mInventory[0].Add(eshoes.Position, eshoes); Database.SaveCharacter(newchr, true); c.SendPacket(PacketDefinitions.NewCharacter(newchr)); }
/// <summary> /// Data received event handler /// </summary> /// <param name="iar">IAsyncResult of the data received event</param> private void OnDataReceived(IAsyncResult iar) { SocketInfo socketInfo = (SocketInfo)iar.AsyncState; try { int received = socketInfo.Socket.EndReceive(iar); if (received == 0) { if (OnClientDisconnected != null) { OnClientDisconnected(this); } return; } socketInfo.Index += received; if (socketInfo.Index == socketInfo.DataBuffer.Length) { switch (socketInfo.State) { case SocketInfo.StateEnum.Header: if (socketInfo.NoEncryption) { PacketReader headerReader = new PacketReader(socketInfo.DataBuffer); short packetHeader = headerReader.ReadShort(); socketInfo.State = SocketInfo.StateEnum.Content; socketInfo.DataBuffer = new byte[packetHeader]; socketInfo.Index = 0; WaitForData(socketInfo); } else { PacketReader headerReader = new PacketReader(socketInfo.DataBuffer); byte[] packetHeaderB = headerReader.ToArray(); int packetHeader = headerReader.ReadInt(); short packetLength = (short)MapleCrypto.getPacketLength(packetHeader); if (_type == SessionType.SERVER_TO_CLIENT && !_RIV.checkPacketToServer(BitConverter.GetBytes(packetHeader))) { Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Packet check failed. Disconnecting client."); //this.Socket.Close(); } socketInfo.State = SocketInfo.StateEnum.Content; socketInfo.DataBuffer = new byte[packetLength]; socketInfo.Index = 0; WaitForData(socketInfo); } break; case SocketInfo.StateEnum.Content: byte[] data = socketInfo.DataBuffer; if (socketInfo.NoEncryption) { socketInfo.NoEncryption = false; PacketReader reader = new PacketReader(data); short version = reader.ReadShort(); string unknown = reader.ReadMapleString(); _SIV = new MapleCrypto(reader.ReadBytes(4), version); _RIV = new MapleCrypto(reader.ReadBytes(4), version); byte serverType = reader.ReadByte(); if (_type == SessionType.CLIENT_TO_SERVER) { OnInitPacketReceived(version, serverType); } OnPacketReceived(new PacketReader(data), true); WaitForData(); } else { _RIV.crypt(data); MapleCustomEncryption.Decrypt(data); if (data.Length != 0 && OnPacketReceived != null) { OnPacketReceived(new PacketReader(data), false); } WaitForData(); } break; } } else { Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Warning] Not enough data"); WaitForData(socketInfo); } } catch (ObjectDisposedException) { Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: Socket has been closed"); } catch (SocketException se) { if (se.ErrorCode != 10054) { Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: " + se); } } catch (Exception e) { Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: " + e); } }
void mSession_OnPacketReceived(PacketReader packet) { short opcode = packet.ReadShort(); switch ((CenterSendOps)opcode) { case CenterSendOps.IdentifySuccess: CenterServerPacketHandling.HandleIdentify(packet); break; case CenterSendOps.GuildOperation: CenterServerPacketHandling.HandleGuildOperation(packet); break; } }
void mSession_OnPacketReceived(PacketReader packet) { Logger.Write(Logger.LogTypes.대타, "받은 패킷 {0}", packet.ToArray().ToString2s()); IPacketHandler handler = PacketHandler.getInstance().GetHandler(packet.ReadShort()); if (handler != null) handler.handlePacket(this, packet); else { packet.Reset(0); Logger.Write(Logger.LogTypes.경고, "!!: {0}", HexEncoding.ToHex(packet.ReadShort())); } }
void mSession_OnPacketReceived(PacketReader packet) { short opcode = packet.ReadShort(); switch ((CenterSendOps)opcode) { case CenterSendOps.IdentifySuccess: CenterServerPacketHandling.HandleIdentify(packet); break; case CenterSendOps.ChannelLoad: CenterServerPacketHandling.HandleChannelLoad(packet, mCenterServer); break; case CenterSendOps.Migrate: CenterServerPacketHandling.HandleMigrate(mCenterServer, packet); break; } }
/// <summary> /// Data received event handler /// </summary> /// <param name="iar">IAsyncResult of the data received event</param> private void OnDataReceived(IAsyncResult iar) { var socketInfo = (SocketInfo)iar.AsyncState; try { var received = socketInfo.Socket.EndReceive(iar); if (received == 0) { OnClientDisconnected?.Invoke(this); return; } socketInfo.Index += received; if (socketInfo.Index == socketInfo.DataBuffer.Length) { switch (socketInfo.State) { case SocketInfo.StateEnum.Header: if (socketInfo.IsNoEncryption) { var headerReader = new PacketReader(socketInfo.DataBuffer); var packetHeader = headerReader.ReadShort(); socketInfo.State = SocketInfo.StateEnum.Content; socketInfo.DataBuffer = new byte[packetHeader]; socketInfo.Index = 0; WaitForData(socketInfo); } else { var headerReader = new PacketReader(socketInfo.DataBuffer); var packetHeaderB = headerReader.ToArray(); var packetHeader = headerReader.ReadInt(); var packetLength = (short)MapleCrypto.GetPacketLength(packetHeader); if (Type == SessionType.SERVER_TO_CLIENT && !RIV.CheckPacketToServer(BitConverter.GetBytes(packetHeader))) { Log.LogError("Packet check failed. Disconnecting client"); Socket.Close(); } socketInfo.State = SocketInfo.StateEnum.Content; socketInfo.DataBuffer = new byte[packetLength]; socketInfo.Index = 0; WaitForData(socketInfo); } break; case SocketInfo.StateEnum.Content: var data = socketInfo.DataBuffer; if (socketInfo.IsNoEncryption) { socketInfo.IsNoEncryption = false; var reader = new PacketReader(data); var version = reader.ReadShort(); var unknown = reader.ReadMapleString(); SIV = new MapleCrypto(reader.ReadBytes(4), version); RIV = new MapleCrypto(reader.ReadBytes(4), version); var serverType = reader.ReadByte(); if (Type == SessionType.CLIENT_TO_SERVER) { OnInitPacketReceived(version, serverType); } OnPacketReceived(new PacketReader(data), true); WaitForData(); } else { RIV.Crypt(data); MapleCustomEncryption.Decrypt(data); if (data.Length != 0) { OnPacketReceived?.Invoke(new PacketReader(data), false); } WaitForData(); } break; } } else { Log.LogWarning("Not enough data"); WaitForData(socketInfo); } } catch (ObjectDisposedException e) { Log.LogError("Socket has been closed", e); } catch (SocketException se) { if (se.ErrorCode != 10054) { Log.LogError("Session.OnDataReceived", se); } } catch (Exception e) { Log.LogError("Session.OnDataReceived", e); } }
/// <summary> /// Data received event handler /// </summary> /// <param name="iar">IAsyncResult of the data received event</param> private void OnDataReceived(IAsyncResult iar) { SocketInfo socketInfo = (SocketInfo)iar.AsyncState; try { int received = socketInfo.Socket.EndReceive(iar); if (received == 0) { if (OnClientDisconnected != null) { OnClientDisconnected(this); } return; } socketInfo.Index += received; if (socketInfo.Index == socketInfo.DataBuffer.Length) { switch (socketInfo.State) { case SocketInfo.StateEnum.Header: if (socketInfo.NoEncryption) { PacketReader headerReader = new PacketReader(socketInfo.DataBuffer); short packetHeader = headerReader.ReadShort(); socketInfo.State = SocketInfo.StateEnum.Content; socketInfo.DataBuffer = new byte[packetHeader]; socketInfo.Index = 0; WaitForData(socketInfo); } else { PacketReader headerReader = new PacketReader(socketInfo.DataBuffer); byte[] packetHeaderB = headerReader.ToArray(); int packetHeader = headerReader.ReadInt(); short packetLength = (short)MapleCrypto.GetPacketLength(packetHeader); if (_type == SessionType.SERVER_TO_CLIENT && !_RIV.CheckPacketToServer(BitConverter.GetBytes(packetHeader))) { Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Packet check failed. Disconnecting client."); //this.Socket.Close(); } socketInfo.State = SocketInfo.StateEnum.Content; socketInfo.DataBuffer = new byte[packetLength]; socketInfo.Index = 0; WaitForData(socketInfo); } break; case SocketInfo.StateEnum.Content: byte[] data = socketInfo.DataBuffer; if (socketInfo.NoEncryption) { socketInfo.NoEncryption = false; PacketReader reader = new PacketReader(data); short version = reader.ReadShort(); string unknown = reader.ReadMapleString(); _SIV = new MapleCrypto(reader.ReadBytes(4), version); _RIV = new MapleCrypto(reader.ReadBytes(4), version); byte serverType = reader.ReadByte(); if (_type == SessionType.CLIENT_TO_SERVER) { OnInitPacketReceived(version, serverType); } OnPacketReceived(new PacketReader(data), true); WaitForData(); } else { _RIV.Crypt(data); MapleCustomEncryption.Decrypt(data); if (data.Length != 0 && OnPacketReceived != null) { OnPacketReceived(new PacketReader(data), false); } WaitForData(); } break; } } else { Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Warning] Not enough data"); WaitForData(socketInfo); } } catch (ObjectDisposedException) { Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: Socket has been closed"); } catch (SocketException se) { if (se.ErrorCode != 10054) { Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: " + se); } } catch (Exception e) { Helpers.ErrorLogger.Log(Helpers.ErrorLevel.Critical, "[Error] Session.OnDataReceived: " + e); } }
internal Results BufferTCPPacket(TcpPacket pTCPPacket, DateTime pArrivalTime) { if (pTCPPacket.Fin || pTCPPacket.Rst) { mTerminated = true; Text += " (Terminated)"; if (mPackets.Count == 0) { // f**k return Results.CloseMe; } else { return Results.Terminated; } } if (pTCPPacket.Syn && !pTCPPacket.Ack) { mLocalPort = (ushort)pTCPPacket.SourcePort; mRemotePort = (ushort)pTCPPacket.DestinationPort; mOutboundSequence = (uint)(pTCPPacket.SequenceNumber + 1); Text = "Port " + mLocalPort.ToString(); startTime = DateTime.Now; mRemoteEndpoint = ((PacketDotNet.IPv4Packet)pTCPPacket.ParentPacket).SourceAddress.ToString() + ":" + pTCPPacket.SourcePort.ToString(); mLocalEndpoint = ((PacketDotNet.IPv4Packet)pTCPPacket.ParentPacket).DestinationAddress.ToString() + ":" + pTCPPacket.DestinationPort.ToString(); Console.WriteLine("[CONNECTION] From {0} to {1}", mLocalEndpoint, mRemoteEndpoint); return Results.Continue; } if (pTCPPacket.Syn && pTCPPacket.Ack) { mInboundSequence = (uint)(pTCPPacket.SequenceNumber + 1); return Results.Continue; } if (pTCPPacket.PayloadData.Length == 0) return Results.Continue; if (mBuild == 0) { if (pTCPPacket.PayloadData.Length < 13) return Results.CloseMe; byte[] tcpData = pTCPPacket.PayloadData; //mBuild = (ushort)(tcpData[2] | (tcpData[3] << 8)); bool mIsKMS = false; PacketReader pr = new PacketReader(tcpData); pr.ReadShort(); ushort version = pr.ReadUShort(); var pos = pr.Position; { var shrt = pr.ReadShort(); if (shrt < 0 || shrt > 0x0020) { return Results.CloseMe; } } pr.Reset(pos); string patchLocation = pr.ReadMapleString(); byte[] localIV = pr.ReadBytes(4); byte[] remoteIV = pr.ReadBytes(4); byte serverLocale = pr.ReadByte(); if (pr.Remaining > 0 || serverLocale > 0x12) { return Results.CloseMe; } if (serverLocale == 0x02 || (serverLocale == 0x01 && version > 255)) mIsKMS = true; else mIsKMS = false; if (mIsKMS) { int test = int.Parse(patchLocation); ushort t1 = (ushort)(test & 0x7FFF); int t2 = (test >> 15) & 1; int t3 = (test >> 16) & 0xFF; Console.WriteLine("Logging KMS connection. Version {0} | {1} | {2}", t1, t2, t3); mBuild = t1; } else { mBuild = version; } mLocale = serverLocale; mPatchLocation = patchLocation; mOutboundStream = new MapleStream(true, mBuild, mLocale, localIV); mInboundStream = new MapleStream(false, (ushort)(0xFFFF - mBuild), mLocale, remoteIV); mInboundSequence += (uint)tcpData.Length; // Generate HandShake packet Definition definition = Config.Instance.GetDefinition(mBuild, mLocale, false, 0xFFFF); if (definition == null) { definition = new Definition(); definition.Outbound = false; definition.Locale = mLocale; definition.Opcode = 0xFFFF; definition.Name = "Maple Handshake"; definition.Build = mBuild; Config.Instance.Definitions.Add(definition); } { string filename = "Scripts" + Path.DirectorySeparatorChar + mLocale.ToString() + Path.DirectorySeparatorChar + mBuild.ToString() + Path.DirectorySeparatorChar + "Inbound" + Path.DirectorySeparatorChar + "0xFFFF.txt"; if (!Directory.Exists(Path.GetDirectoryName(filename))) Directory.CreateDirectory(Path.GetDirectoryName(filename)); if (!File.Exists(filename)) { string contents = ""; contents += "using (ScriptAPI) {\r\n"; contents += "\tAddShort(\"Packet Size\");\r\n"; contents += "\tAddUShort(\"MapleStory Version\");\r\n"; contents += "\tAddString(\"MapleStory Patch Location\");\r\n"; contents += "\tAddField(\"Local Initializing Vector (IV)\", 4);\r\n"; contents += "\tAddField(\"Remote Initializing Vector (IV)\", 4);\r\n"; contents += "\tAddByte(\"MapleStory Locale\");\r\n"; contents += "}"; File.WriteAllText(filename, contents); } } MaplePacket packet = new MaplePacket(pArrivalTime, false, mBuild, mLocale, 0xFFFF, definition == null ? "" : definition.Name, tcpData); if (!mOpcodes.Exists(kv => kv.First == packet.Outbound && kv.Second == packet.Opcode)) { // Should be false, but w/e mOpcodes.Add(new Pair<bool, ushort>(packet.Outbound, packet.Opcode)); } mPacketList.Items.Add(packet); mPackets.Add(packet); MainForm.SearchForm.RefreshOpcodes(true); Console.WriteLine("[CONNECTION] MapleStory V{2}.{3} Locale {4}", mLocalEndpoint, mRemoteEndpoint, mBuild, patchLocation, serverLocale); } if (pTCPPacket.SourcePort == mLocalPort) ProcessTCPPacket(pTCPPacket, ref mOutboundSequence, mOutboundBuffer, mOutboundStream, pArrivalTime); else ProcessTCPPacket(pTCPPacket, ref mInboundSequence, mInboundBuffer, mInboundStream, pArrivalTime); return Results.Continue; }