public DumpPacket(MaplePacket pPacket) { pPacket.Reset(); MaplePacket.CommunicationType type = (MaplePacket.CommunicationType)pPacket.ReadByte(); Outboud = type == MaplePacket.CommunicationType.ClientPacket; Opcode = pPacket.ReadUShort(); Data = new byte[pPacket.Length - 3]; Buffer.BlockCopy(pPacket.ToArray(), 3, Data, 0, Data.Length); // byte + short (header) ArrivalTime = MasterThread.CurrentDate; pPacket.Reset(); }
public void ForwardPacket(MaplePacket.CommunicationType pType, MaplePacket pPacket) { pPacket.Reset(); ushort header = pPacket.ReadUShort(); if (!_validHeaders[(byte)pType].Contains(header)) { return; } using (MaplePacket packet = new MaplePacket(pType, header)) { packet.WriteBytes(pPacket.ReadLeftoverBytes()); SendPacket(packet); } }
public override void OnPacket(MaplePacket pPacket) { MasterThread.Instance.AddCallback((a) => { try { if (Disconnected) { return; // Just to be sure... } if (_exporter != null) { _exporter.AddPacket(pPacket); } MaplePacket.CommunicationType type = (MaplePacket.CommunicationType)pPacket.ReadByte(); ushort opcode = pPacket.ReadUShort(); if (IsFake) { Logger.WriteLine("Emulating {0:X4} (Len: {1})", opcode, pPacket.Length); } if ((byte)type < Program.ValidHeaders.Length) { // Check if packet is accepted var list = Program.ValidHeaders[(byte)type]; if (list.ContainsKey(opcode)) { var action = list[opcode]; if (action != null) { try { if (action.CanHandle == null || action.CanHandle(this)) { action.Handle(this, pPacket); } } catch (Exception ex) { Logger_ErrorLog("Failed parsing {0:X4} for {1}", opcode, type); Logger_WriteLine(ex.ToString()); if (!IsFake) { LogFilename += "ERROR"; SendInfoText("An error occurred on the Mapler.me server! Please report this :)"); // Save exception to packet using (MaplePacket mp = new MaplePacket(MaplePacket.CommunicationType.ServerPacket, 0x9999)) { mp.WriteString(ex.ToString()); if (ex.ToString().Contains("MySql.Data.MySqlClient.MySqlException")) { Logger_ErrorLog("MySQL exception!"); var queries = MySQL_Connection.Instance.GetRanQueries(); mp.WriteInt(queries.Count); foreach (var kvp in queries) { mp.WriteString(kvp.Key); mp.WriteString(kvp.Value); } } mp.SwitchOver(); // Make read packet _exporter.AddPacket(mp); } Save(false, false); } } } else { if (!IsFake) { Logger_WriteLine("No action for {0:X4}", opcode); } } } else { if (!IsFake) { Logger_WriteLine("Client sent packet {0:X4} for {1} but this one is not handled!", opcode, type); } } } else { Logger_ErrorLog("Packet Type not accepted!!! {0:X4} {1}", opcode, (byte)type); } } catch (Exception ex) { Logger.ErrorLog("Failed handling packet: {0}", ex.ToString()); SendInfoText("An error occurred on the Mapler.me server! Please report this :)"); } pPacket.Dispose(); pPacket = null; }); }