コード例 #1
0
        public void ReconnectToNewClient()
        {
            var c = new ClientMessagePipe("a");
            var s = new ServerMessagePipe("a");

            var e = new AutoResetEvent(false);

            s.Callback = O =>
            {
                Console.WriteLine(O);
                e.Set();
            };

            Thread.Sleep(2000);

            c.SendMessage(new ClientHostComData()
            {
                Command = ClientHostCommand.Game_Update
            });
            e.WaitOne();

            c.Dispose();
            Thread.Sleep(2000);
            e.Reset();

            c = new ClientMessagePipe("a");
            Thread.Sleep(2000);

            c.SendMessage(new ClientHostComData()
            {
                Command = ClientHostCommand.Game_Update
            });
            e.WaitOne();
        }
コード例 #2
0
        public void Game_Start(ModGameAPI dediAPI)
        {
            GameAPI = dediAPI;
            GameAPI.Console_Write($"ModClientDll: start");

            CurrentConfig = new ConfigurationManager <Configuration>()
            {
                ConfigFilename = Path.Combine(Path.GetDirectoryName(Assembly.GetAssembly(GetType()).Location), "Configuration.xml")
            };
            CurrentConfig.Load();
            CurrentConfig.Current.EmpyrionToModPipeName = string.Format(CurrentConfig.Current.EmpyrionToModPipeName, Guid.NewGuid().ToString("N"));
            CurrentConfig.Current.ModToEmpyrionPipeName = string.Format(CurrentConfig.Current.ModToEmpyrionPipeName, Guid.NewGuid().ToString("N"));
            CurrentConfig.Save();

            GameAPI.Console_Write($"ModClientDll (CurrentDir:{Directory.GetCurrentDirectory()}): Config:{CurrentConfig.ConfigFilename}");

            InServerMessageHandler = new Dictionary <Type, Action <object> > {
                { typeof(EmpyrionGameEventData), M => HandleGameEvent((EmpyrionGameEventData)M) },
                { typeof(ClientHostComData), M => HandleClientHostCommunication((ClientHostComData)M) },
                { typeof(ModComData), M => HandleModCommunication((ModComData)M) }
            };

            OutServer = new ClientMessagePipe(CurrentConfig.Current.EmpyrionToModPipeName)
            {
                log = GameAPI.Console_Write
            };
            InServer = new ServerMessagePipe(CurrentConfig.Current.ModToEmpyrionPipeName)
            {
                log = GameAPI.Console_Write
            };
            InServer.Callback = Msg => {
                if (InServerMessageHandler.TryGetValue(Msg.GetType(), out Action <object> Handler))
                {
                    Handler(Msg);
                }
            };

            new Thread(() => { while (!Exit)
                               {
                                   Thread.Sleep(1000); CheckHostProcess();
                               }
                       })
            {
                IsBackground = true
            }.Start();
            new Thread(() => ReadGlobalStructureInfoForEvent())
            {
                IsBackground = true
            }.Start();

            GameAPI.Console_Write($"ModClientDll: started");
        }
コード例 #3
0
        private void StartModToEmpyrionPipe()
        {
            GameAPI.Console_Write($"StartModToEmpyrionPipe: start {CurrentConfig.Current.ModToEmpyrionPipeName}");
            try { InServer?.Close(); } catch { }
            Thread.Sleep(1000);

            InServer = new ServerMessagePipe(CurrentConfig.Current.ModToEmpyrionPipeName)
            {
                log = GameAPI.Console_Write
            };
            InServer.Callback = Msg => {
                if (InServerMessageHandler.TryGetValue(Msg.GetType(), out Action <object> Handler))
                {
                    Handler(Msg);
                }
            };

            GameAPI.Console_Write($"StartModToEmpyrionPipe: startet {CurrentConfig.Current.ModToEmpyrionPipeName}");
        }
コード例 #4
0
        public void InitComunicationChannels()
        {
            ToEmpyrion = new ClientMessagePipe(CommandLineOptions.GetOption("-ModToEmpyrionPipe", "EWAToEmpyrionPipe"))
            {
                log = LogOut
            };
            FromEmpyrion = new ServerMessagePipe(CommandLineOptions.GetOption("-EmpyrionToModPipe", "EmpyrionToEWAPipe"))
            {
                log = LogOut
            };

            FromEmpyrion.Callback = Msg => { if (InServerMessageHandler.TryGetValue(Msg.GetType(), out Action <object> Handler))
                                             {
                                                 Handler(Msg);
                                             }
            };

            Parallel.ForEach(Plugins.OfType <IClientHostCommunication>(), async P => await SaveApiCall(() => P.ToEmpyrion = ToEmpyrion, P, "ToEmpyrion"));
            Parallel.ForEach(Plugins, async P => await SaveApiCall(() => P.Game_Start(this), P, "Game_Start"));
        }
コード例 #5
0
        public void InitComunicationChannels()
        {
            Dispatcher = new ModDispatcher();

            ToEmpyrion = new ClientMessagePipe(CommandLineOptions.GetOption("-ModToEmpyrionPipe", "ModToEmpyrionPipe"))
            {
                log = LogOut
            };
            FromEmpyrion = new ServerMessagePipe(CommandLineOptions.GetOption("-EmpyrionToModPipe", "EmpyrionToModPipe"))
            {
                log = LogOut
            };

            FromEmpyrion.Callback = Msg => { if (InServerMessageHandler.TryGetValue(Msg.GetType(), out Action <object> Handler))
                                             {
                                                 Handler(Msg);
                                             }
            };

            Dispatcher.Game_Start(this);
        }