private static void Register( byte PacketID, PacketHandler callback ) { m_Table[PacketID] = callback; }
private unsafe void HandleComm(Buffer *inBuff, Buffer *outBuff, ConcurrentQueue <Packet> queue, PacketPath path) { CommMutex.WaitOne(); while (inBuff->Length > 0) { byte *buff = (&inBuff->Buff0) + inBuff->Start; int len = DLLImport.Razor.GetPacketLength(buff, inBuff->Length); if (len > inBuff->Length || len <= 0) { break; } inBuff->Start += len; inBuff->Length -= len; bool viewer = false; bool filter = false; switch (path) { case PacketPath.ClientToServer: viewer = PacketHandler.HasClientViewer(buff[0]); filter = PacketHandler.HasClientFilter(buff[0]); break; case PacketPath.ServerToClient: viewer = PacketHandler.HasServerViewer(buff[0]); filter = PacketHandler.HasServerFilter(buff[0]); break; } Packet p = null; PacketReader pr = null; if (viewer) { pr = new PacketReader(buff, len, DLLImport.Razor.IsDynLength(buff[0])); if (filter) { p = MakePacketFrom(pr); } } else if (filter) { byte[] temp = new byte[len]; fixed(byte *ptr = temp) DLLImport.Win.memcpy(ptr, buff, len); p = new Packet(temp, len, DLLImport.Razor.IsDynLength(buff[0])); /*byte[] temp = new byte[len]; * fixed (byte* ptr = temp) * { * IntPtr to = (IntPtr)ptr; * IntPtr from = (IntPtr)buff; * DLLImport.Win.memcpy(to, from, new UIntPtr((uint)len)); * } * p = new Packet(temp, len, DLLImport.Razor.IsDynLength(buff[0])); */ } bool blocked = false; switch (path) { // yes it should be this way case PacketPath.ClientToServer: { blocked = PacketHandler.OnClientPacket(buff[0], pr, p); break; } case PacketPath.ServerToClient: { blocked = PacketHandler.OnServerPacket(buff[0], pr, p); break; } } if (filter) { byte[] data = p.Compile(); if (data[0] == 0xc8 || data[0] == 0x73 || data[0] == 0xbf || data[0] == 0xdc) { } else { int something = len; Debug.WriteLine("Packet id 0x{0:X}", data[0]); } fixed(byte *ptr = data) { Packet.Log(path, ptr, data.Length, blocked); if (!blocked) { CopyToBuffer(outBuff, ptr, data.Length); } } } else { //Packet.Log(path, buff, len, blocked); if (!blocked) { CopyToBuffer(outBuff, buff, len); } } while (queue.Count > 0) { if (!queue.TryDequeue(out p)) { continue; } byte[] data = p.Compile(); fixed(byte *ptr = data) { CopyToBuffer(outBuff, ptr, data.Length); //Packet.Log((PacketPath)(((int)path) + 1), ptr, data.Length); } } } CommMutex.ReleaseMutex(); }
public static void Initialize() { PacketHandler.RegisterClientToServerViewer(0x6C, new PacketViewerCallback(TargetResponse)); PacketHandler.RegisterServerToClientViewer(0x6C, new PacketViewerCallback(NewTarget)); PacketHandler.RegisterServerToClientViewer(0xAA, new PacketViewerCallback(CombatantChange)); }
static Command() { m_List = new Dictionary <string, CommandCallback>(16, StringComparer.OrdinalIgnoreCase); PacketHandler.RegisterClientToServerFilter(0xAD, OnSpeech); }
private void HandleComm(Buffer *inBuff, Buffer *outBuff, Queue <Packet> queue, PacketPath path) { CommMutex.WaitOne(); while (inBuff->Length > 0) { byte *buff = (&inBuff->Buff0) + inBuff->Start; short len = PacketsTable.GetPacketLength(buff, inBuff->Length); if (len > inBuff->Length || len <= 0) { break; } inBuff->Start += len; inBuff->Length -= len; bool viewer = false; bool filter = false; switch (path) { case PacketPath.ClientToServer: viewer = PacketHandler.HasClientViewer(buff[0]); filter = PacketHandler.HasClientFilter(buff[0]); break; case PacketPath.ServerToClient: viewer = PacketHandler.HasServerViewer(buff[0]); filter = PacketHandler.HasServerFilter(buff[0]); break; } Packet p = null; PacketReader pr = null; if (viewer) { pr = new PacketReader(buff, len, PacketsTable.IsDynLength(buff[0])); if (filter) { p = MakePacketFrom(pr); } } else if (filter) { byte[] temp = new byte[len]; fixed(byte *ptr = temp) Platform.memcpy(ptr, buff, len); p = new Packet(temp, len, PacketsTable.IsDynLength(buff[0])); } bool blocked = false; switch (path) { // yes it should be this way case PacketPath.ClientToServer: { blocked = PacketHandler.OnClientPacket(buff[0], pr, p); break; } case PacketPath.ServerToClient: { blocked = PacketHandler.OnServerPacket(buff[0], pr, p); break; } } if (filter) { byte[] data = p.Compile(); fixed(byte *ptr = data) { Packet.Log(path, ptr, data.Length, blocked); if (!blocked) { CopyToBuffer(outBuff, ptr, data.Length); } } } else { Packet.Log(path, buff, len, blocked); if (!blocked) { CopyToBuffer(outBuff, buff, len); } } while (queue.Count > 0) { p = (Packet)queue.Dequeue(); byte[] data = p.Compile(); fixed(byte *ptr = data) { CopyToBuffer(outBuff, ptr, data.Length); Packet.Log((PacketPath)(((int)path) + 1), ptr, data.Length); } } } CommMutex.ReleaseMutex(); }
static Command() { m_List = new Dictionary <string, CommandCallback>(); PacketHandler.RegisterClientToServerFilter(0xAD, new PacketFilterCallback(OnSpeech)); }