void SearchForClientPacketDelegates(Type type) { try { MethodInfo[] methods = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); foreach (MethodInfo method in methods) { LoginPacketDelegate[] attribs = (LoginPacketDelegate[])method.GetCustomAttributes(typeof(LoginPacketDelegate), true); if (attribs.Length == 0) { continue; } if (method.IsStatic) { foreach (LoginPacketDelegate attrib in attribs) { if (attrib.ClientMessage) { LoginClientPacketDelegate wcpd = (LoginClientPacketDelegate)Delegate.CreateDelegate(typeof(LoginClientPacketDelegate), method); LoginPacketManager.RegisterPacketHandler((CMSG)attrib.MsgID, wcpd); if (m_clientPacketDelegates.Contains(attrib.MsgID)) { LoginClientPacketDelegate dele = (LoginClientPacketDelegate)m_clientPacketDelegates[attrib.MsgID]; m_clientPacketDelegates[attrib.MsgID] = dele + wcpd; } else { m_clientPacketDelegates[attrib.MsgID] = wcpd; } } } } else { object obj = GetHandlerObject(type); foreach (LoginPacketDelegate attrib in attribs) { if (attrib.ClientMessage) { LoginClientPacketDelegate wcpd = (LoginClientPacketDelegate)Delegate.CreateDelegate(typeof(LoginClientPacketDelegate), obj, method.Name); LoginPacketManager.RegisterPacketHandler((CMSG)attrib.MsgID, wcpd); if (m_clientPacketDelegates.Contains(attrib.MsgID)) { LoginClientPacketDelegate dele = (LoginClientPacketDelegate)m_clientPacketDelegates[attrib.MsgID]; m_clientPacketDelegates[attrib.MsgID] = dele + wcpd; } else { m_clientPacketDelegates[attrib.MsgID] = wcpd; } } } } } } catch (Exception exp) { DebugLogger.Logger.Log("", exp); } }
public override void OnClientData(ClientBase aClient, byte[] data) { LoginClient client = aClient as LoginClient; BinReader read = new BinReader(data); read.BaseStream.Position += 2; // skip len CMSG msgID = (CMSG)read.ReadInt32(); if (!LoginPacketManager.HandlePacket(client, msgID, read)) { if (client.WorldConnection != null) { ClientPacket pkg = new ClientPacket(msgID, client.Character.ObjectId, data, 6, data.Length - 6); client.SendWorldServer(pkg); } } }
public void Unload() { IDictionaryEnumerator e = m_clientPacketDelegates.GetEnumerator(); while (e.MoveNext()) { LoginPacketManager.UnregisterPacketHandler((CMSG)e.Key, (LoginClientPacketDelegate)e.Value); } foreach (CMSG msgID in m_registeredClientPackets) { LoginPacketManager.UnregisterPacketHandler(msgID); } assemblies.Clear(); m_clientPacketDelegates.Clear(); m_registeredClientPackets.Clear(); m_scriptPacketHandlers.Clear(); handlerObjects.Clear(); ChatManager.ClearChatCmds(); }
/* * internal bool processWorldServerData() * { * if(m_client.PendingSendData) * m_client.SendWork(); * if(m_client.Connected == false) * return false; * byte[] data; * while((data = m_client.GetNextPacketData()) != null) * OnWorldServerData(data); * return m_client.Connected; * }*/ private void OnWorldServerData(ClientBase c, byte[] data) { BinReader read = new BinReader(data); read.BaseStream.Position += 4; // skip len WORLDMSG msgID = (WORLDMSG)read.ReadInt32(); if (msgID == WORLDMSG.SERVER_MESSAGE) { SMSG smsg = (SMSG)read.ReadInt32(); Console.WriteLine("WorldServer sent: " + smsg); int len = read.ReadInt32(); BinWriter pkg = LoginClient.NewPacket(smsg); if (len > 0) { pkg.Write(read.ReadBytes(len)); } while (read.BaseStream.Position < read.BaseStream.Length) { uint plrID = read.ReadUInt32(); LoginClient client = LoginServer.GetLoginClientByCharacterID(plrID); if (client == null) { Console.WriteLine("client missing for plrID " + plrID + " while sending " + smsg.ToString()); } else { client.Send(pkg); } } } else if (msgID == WORLDMSG.SCRIPT_MESSAGE) { LoginServer.Scripts.OnScriptMessage(read.ReadInt32(), read); } else { LoginPacketManager.HandlePacket(this, msgID, read); } }
void RegisterClientPacketHandler(Type type) { LoginPacketHandler[] attribs = (LoginPacketHandler[])type.GetCustomAttributes(typeof(LoginPacketHandler), true); foreach (LoginPacketHandler attrib in attribs) { if (attrib.UseDelegates) { SearchForClientPacketDelegates(type); } else { if (attrib.ClientMessage) { if (type.GetInterface(typeof(ILoginClientPacketHandler).ToString()) != null) { object obj = GetHandlerObject(type); LoginPacketManager.RegisterPacketHandler((CMSG)attrib.MsgID, (ILoginClientPacketHandler)obj); m_registeredClientPackets.Add((CMSG)attrib.MsgID); } } } } }
public override void OnClientData(ClientBase aClient, byte[] data) { LoginClient client = aClient as LoginClient; BinReader read = new BinReader(data); CMSG msgID; if (client.Authenticated == true) { // Why do we discard the first two bytes? read.BaseStream.Position += 2; byte[] header = read.ReadBytes(4); client.Decode(header, 4); BinReader decoded = new BinReader(header); msgID = (CMSG)decoded.ReadInt32(); /*BinReader ops = new BinReader(client.m_opcode); * msgID = (CMSG)ops.ReadInt32();*/ } else { read.BaseStream.Position += 2; // skip len msgID = (CMSG)read.ReadInt32(); } // Console.WriteLine("CMSG:"+ msgID.ToString()); // log opcode to console if (!LoginPacketManager.HandlePacket(client, msgID, read)) { Console.WriteLine("Login Handler not found for CMSG " + msgID + " ..sending to worldserver"); // report error if (client.WorldConnection != null) { ClientPacket pkg = new ClientPacket(msgID, client.Character.ObjectId, data, 6, data.Length - 6); client.SendWorldServer(pkg); } } }
static LoginServer() { LoginPacketManager.SearchAssemblyForHandlers(System.Reflection.Assembly.GetExecutingAssembly()); }