コード例 #1
0
ファイル: Domain.cs プロジェクト: indangerofcollapsing/wow
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="eventArgs"></param>
        private void DomainWorld_InitOnceServer(object sender, BaseWorldEventArgs eventArgs)
        {
            //////////////////////////////////////////////////////////////////////////
            //
            m_ListenerMessagePump.EventNetStateCreate  += new EventHandler <NetStateInitEventArgs>(ListenerInitNetState);
            m_ConnecterMessagePump.EventNetStateCreate += new EventHandler <NetStateInitEventArgs>(ConnecterIniNetState);

            m_ListenerMessagePump.EventProcessReceive  += new EventHandler <NetStateEventArgs>(ListenerProcessReceive);
            m_ConnecterMessagePump.EventProcessReceive += new EventHandler <NetStateEventArgs>(ConnecterProcessReceive);

            m_ListenerMessagePump.AddListener(m_Listener);
            m_ConnecterMessagePump.AddConnecter(m_Connecter);

            m_World.AddMessagePump(m_ListenerMessagePump);
            m_World.AddMessagePump(m_ConnecterMessagePump);

            //////////////////////////////////////////////////////////////////////////
            // 开始注册协议

            // 客户端的协议
            DomainPacketHandlers.Register((long)DomainOpCodeToZoneCluster.SMSG_LOGIN_ZONE_CLUSTER_RESULT, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerLoginZoneClusterResult));
            DomainPacketHandlers.Register((long)DomainOpCodeToZoneCluster.SMSG_NOTIFY_ADD_ZONE_CLUSTER_RESULT, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerNotifyAddZoneClusterResult));
            DomainPacketHandlers.Register((long)DomainOpCodeToZoneCluster.SMSG_NOTIFY_REMOVE_ZONE_CLUSTER_RESULT, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerNotifyRemoveZoneClusterResult));
            DomainPacketHandlers.Register((long)DomainOpCodeToZoneCluster.SMSG_PONG_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerPongZoneCluster));

            DomainPacketHandlers.Register((long)DomainOpCodeFromZoneCluster.SMSG_LOGIN_DOMAIN, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerLoginDomain));
            DomainPacketHandlers.Register((long)DomainOpCodeFromZoneCluster.SMSG_ADD_CURRENT_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerAddCurrentZoneCluster));
            DomainPacketHandlers.Register((long)DomainOpCodeFromZoneCluster.SMSG_REMOVE_CURRENT_ZONE_CLUSTER, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerRemoveCurrentZoneCluster));
            DomainPacketHandlers.Register((long)DomainOpCodeFromZoneCluster.SMSG_PING_DOMAIN, 4 + 0, false, new PacketReceiveCallback(DomainPacketHandlers.Domain_HandlerPingDomain));

            ListenerDomainServer();
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: indangerofcollapsing/wow
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        private static void Main(string[] strArgs)
        {
            //////////////////////////////////////////////////////////////////////////
            // 初始化参数

            InitServerArguments(strArgs);

            //////////////////////////////////////////////////////////////////////////
            // 初始化一些工作

            BaseServer.EventConfigServer   += new ConfigServerEventHandler(BaseServer_ConfigServer);
            BaseServer.EventInitOnceServer += new InitOnceServerEventHandler(BaseServer_InitOnceServer);
            BaseServer.EventExitServer     += new ExitServerEventHandler(BaseServer_ExitServer);

            BaseServer.EventCommandLineInfo     += new CommandLineInfoEventHandler(BaseServer_CommandLineInfo);
            BaseServer.EventCommandLineDisposal += new CommandLineDisposalEventHandler(BaseServer_CommandLineDisposal);

            NetState.EventCreatedCallback += new CreatedNetStateEventHandler(ProcessNet.NetState_InitializeNetState);

            s_MessagePump.ThreadEventProcessReceive += new EventHandler <NetStateEventArgs>(ProcessNet.MessagePump_ProcessReceive);

            ReceiveQueue.ThreadEventPacketLength += new EventHandler <PacketLengthInfoEventArgs>(ProcessNet.ReceiveQueue_PacketLength);

            PacketReader.EventPacketID += new EventHandler <PacketIdInfoEventArgs>(ProcessNet.PacketReader_PacketID);

            s_MessagePump.AddListener(s_Listener);
            s_BaseWorld.AddMessagePump(s_MessagePump);

            //////////////////////////////////////////////////////////////////////////
            // 开始运行服务

            BaseServer.RunServer(strArgs, s_BaseWorld);
        }
コード例 #3
0
        public void AddListenerTest()
        {
            MessagePump target   = new MessagePump(); // TODO: 初始化为适当的值
            Listener    listener = null;              // TODO: 初始化为适当的值

            target.AddListener(listener);
            Assert.Inconclusive("无法验证不返回值的方法。");
        }
コード例 #4
0
        public static void Main(string[] args)
        {
            m_Assembly = Assembly.GetEntryAssembly();

            /* print a banner */
            Version ver = m_Assembly.GetName().Version;

            Console.WriteLine("SunLogin Version {0}.{1}.{2} http://www.sunuo.org/",
                              ver.Major, ver.Minor, ver.Revision);
            Console.WriteLine("  on {0}, runtime {1}",
                              Environment.OSVersion, Environment.Version);

            if ((int)Environment.OSVersion.Platform == 128)
            {
                Console.WriteLine("Please make sure you have Mono 1.1.7 or newer! (mono -V)");
            }

            Console.WriteLine();

            /* prepare SunUO */
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
            AppDomain.CurrentDomain.ProcessExit        += new EventHandler(CurrentDomain_ProcessExit);

            if (args.Length > 0)
            {
                Console.WriteLine("SunLogin does not understand command line arguments");
                return;
            }

            string baseDirectory = Path.GetDirectoryName(ExePath);
            string confDirectory = new DirectoryInfo(baseDirectory)
                                   .CreateSubdirectory("etc").FullName;

            config = new Config.Root(baseDirectory,
                                     Path.Combine(confDirectory, "sunuo.xml"));

            Directory.SetCurrentDirectory(config.BaseDirectory);

            m_Thread = Thread.CurrentThread;

            if (m_Thread != null)
            {
                m_Thread.Name = "Core Thread";
            }

            if (config.BaseDirectory.Length > 0)
            {
                Directory.SetCurrentDirectory(config.BaseDirectory);
            }

            Timer.TimerThread ttObj = new Timer.TimerThread();
            timerThread      = new Thread(new ThreadStart(ttObj.TimerMain));
            timerThread.Name = "Timer Thread";

            if (!config.Exists)
            {
                config.Save();
            }

            m_MessagePump = new MessagePump();
            foreach (IPEndPoint ipep in Config.Network.Bind)
            {
                m_MessagePump.AddListener(new Listener(ipep));
            }

            timerThread.Start();

            NetState.Initialize();
            Encryption.Initialize();
            ServerList.Initialize();
            ServerQueryTimer.Initialize();
            Server.Accounting.AccountHandler.Initialize();

            EventSink.InvokeServerStarted();

            log.Info("SunLogin initialized, entering main loop");

            try
            {
                while (!m_Closing)
                {
                    m_Signal.WaitOne();
                    m_Now = DateTime.UtcNow;

                    Timer.Slice();
                    m_MessagePump.Slice();

                    NetState.FlushAll();
                    NetState.ProcessDisposedQueue();
                }
            }
            catch (Exception e)
            {
                CurrentDomain_UnhandledException(null, new UnhandledExceptionEventArgs(e, true));
            }

            if (timerThread.IsAlive)
            {
                timerThread.Abort();
            }
        }
コード例 #5
0
ファイル: Main.cs プロジェクト: BackupTheBerlios/sunuo-svn
        public static void Start(bool repair)
        {
            if (!ScriptCompiler.Compile(true))
            {
                return;
            }

            m_ItemCount   = 0;
            m_MobileCount = 0;
            foreach (Library l in ScriptCompiler.Libraries)
            {
                int itemCount = 0, mobileCount = 0;
                l.Verify(ref itemCount, ref mobileCount);
                log.InfoFormat("Library {0} verified: {1} items, {2} mobiles",
                               l.Name, itemCount, mobileCount);
                m_ItemCount   += itemCount;
                m_MobileCount += mobileCount;
            }
            log.InfoFormat("All libraries verified: {0} items, {1} mobiles)",
                           m_ItemCount, m_MobileCount);

            try {
                TileData.Configure();

                ScriptCompiler.Configure();
            } catch (TargetInvocationException e) {
                log.Fatal("Configure exception: {0}", e.InnerException);
                return;
            }

            if (!config.Exists)
            {
                config.Save();
            }

            World.Load();
            if (World.LoadErrors > 0)
            {
                log.ErrorFormat("There were {0} errors during world load.", World.LoadErrors);
                if (repair)
                {
                    log.Error("The world load errors are being ignored for now, and will not reappear once you save this world.");
                }
                else
                {
                    log.Error("Try 'SunUO --repair' to repair this world save, or restore an older non-corrupt save.");
                    return;
                }
            }

            try {
                ScriptCompiler.Initialize();
            } catch (TargetInvocationException e) {
                log.Fatal("Initialize exception: {0}", e.InnerException);
                return;
            }

            Region.Load();

            m_MessagePump = new MessagePump();
            foreach (IPEndPoint ipep in Config.Network.Bind)
            {
                m_MessagePump.AddListener(new Listener(ipep));
            }

            Timer.TimerThread ttObj = new Timer.TimerThread();
            timerThread      = new Thread(new ThreadStart(ttObj.TimerMain));
            timerThread.Name = "Timer Thread";
            timerThread.Start();

            NetState.Initialize();
            Encryption.Initialize();

            EventSink.InvokeServerStarted();

            log.Info("SunUO initialized, entering main loop");

            try
            {
                Run();
            }
            catch (Exception e)
            {
                CurrentDomain_UnhandledException(null, new UnhandledExceptionEventArgs(e, true));
            }

            if (timerThread.IsAlive)
            {
                timerThread.Abort();
            }
        }