Пример #1
0
 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);
     }
 }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
        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);
            }
        }
Пример #5
0
 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);
                 }
             }
         }
     }
 }
Пример #6
0
        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);
                }
            }
        }
Пример #7
0
 static LoginServer()
 {
     LoginPacketManager.SearchAssemblyForHandlers(System.Reflection.Assembly.GetExecutingAssembly());
 }