private void OnInitialize()
        {
            string openModDirectory = Path.GetFullPath($"Servers/{Dedicator.serverID}/OpenMod/");

            if (!Directory.Exists(openModDirectory))
            {
                Directory.CreateDirectory(openModDirectory);
            }

            var parameters = new RuntimeInitParameters
            {
                CommandlineArgs  = Environment.GetCommandLineArgs(),
                WorkingDirectory = openModDirectory
            };

            var assemblies = new List <Assembly>
            {
                typeof(OpenMod.UnityEngine.UnityMainThreadDispatcher).Assembly,
                typeof(OpenModUnturnedHost).Assembly
            };

            var runtime = new Runtime.Runtime();

            runtime.Init(assemblies, parameters);
        }
Beispiel #2
0
        private void OnInitialize()
        {
            System.Environment.CurrentDirectory = ReadWrite.PATH;
            var openModDirectory = Path.Combine(ReadWrite.PATH, $"Servers/{Dedicator.serverID}/OpenMod/");

            if (!Directory.Exists(openModDirectory))
            {
                Directory.CreateDirectory(openModDirectory);
            }

            var parameters = new RuntimeInitParameters
            {
                CommandlineArgs  = System.Environment.GetCommandLineArgs(),
                WorkingDirectory = openModDirectory
            };

            var assemblies = new List <Assembly>
            {
                typeof(OpenModUnityEnginePlugin).Assembly,
                typeof(OpenModUnturnedHost).Assembly
            };

            OpenModRuntime = new Runtime.Runtime();
            OpenModRuntime.Init(assemblies, parameters);
            m_SharedModule.OnPostInitialize();
        }
        public override void Load()
        {
            var openModDirectory = Path.Combine(Interface.Oxide.RootDirectory, "openmod");

            if (!Directory.Exists(openModDirectory))
            {
                Directory.CreateDirectory(openModDirectory);
            }

            var parameters = new RuntimeInitParameters
            {
                CommandlineArgs  = Environment.GetCommandLineArgs(),
                WorkingDirectory = openModDirectory
            };

            var assemblies = new List <Assembly>
            {
                typeof(OpenModUnityEnginePlugin).Assembly,
                typeof(OpenModRustOxideHost).Assembly,
                typeof(BaseOpenModRustHost).Assembly
            };

            var openModRuntime = new Runtime.Runtime();

            OpenModRuntime = openModRuntime;
            openModRuntime.Init(assemblies, parameters);
        }
        public static void Initialize()
        {
            string openModDirectory = Path.GetFullPath($"Servers/{Dedicator.serverID}/OpenMod/");

            if (!Directory.Exists(openModDirectory))
            {
                Directory.CreateDirectory(openModDirectory);
            }

#if NUGET_BOOTSTRAP
            Console.WriteLine("Bootstrapping OpenMod for Unturned, this might take a while...");

            var bootrapper = new OpenModDynamicBootstrapper();

            bootrapper.Bootstrap(
                openModDirectory,
                Environment.GetCommandLineArgs(),
                new List <string> {
                "OpenMod.Unturned"
            },
                false,
                new NuGetConsoleLogger());
#else
            var parameters = new RuntimeInitParameters
            {
                CommandlineArgs  = Environment.GetCommandLineArgs(),
                WorkingDirectory = openModDirectory
            };

            var assemblies = new List <Assembly>
            {
                typeof(OpenMod.UnityEngine.UnityMainThreadDispatcher).Assembly,
                typeof(OpenMod.Unturned.OpenModUnturnedHost).Assembly
            };

            var runtime = new Runtime.Runtime();
            runtime.Init(assemblies, parameters);
#endif
        }
Beispiel #5
0
 public void Init(List <Assembly> openModAssemblies, RuntimeInitParameters parameters, Func <IHostBuilder>?hostBuilderFunc = null)
 {
     AsyncHelper.RunSync(() => InitAsync(openModAssemblies, parameters, hostBuilderFunc));
 }
Beispiel #6
0
        public async Task <IHost> InitAsync(
            List <Assembly> openModHostAssemblies,
            RuntimeInitParameters parameters,
            Func <IHostBuilder>?hostBuilderFunc = null)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            HostAssemblies = openModHostAssemblies ?? throw new ArgumentNullException(nameof(openModHostAssemblies));

            try
            {
                IsDisposing = false;

                var openModCoreAssembly = typeof(AsyncHelper).Assembly;
                if (!openModHostAssemblies.Contains(openModCoreAssembly))
                {
                    openModHostAssemblies.Insert(0, openModCoreAssembly);
                }

                var hostInformationType = openModHostAssemblies
                                          .Select(asm =>
                                                  AssemblyExtensions.GetLoadableTypes(asm)
                                                  .FirstOrDefault(t => typeof(IHostInformation).IsAssignableFrom(t)))
                                          .LastOrDefault(d => d != null);

                if (hostInformationType == null)
                {
                    throw new Exception("Failed to find IHostInformation in host assemblies.");
                }

                HostInformation         = (IHostInformation)Activator.CreateInstance(hostInformationType);
                m_OpenModHostAssemblies = openModHostAssemblies;
                m_HostBuilderFunc       = hostBuilderFunc;
                m_RuntimeInitParameters = parameters;

                var hostBuilder = hostBuilderFunc == null ? new HostBuilder() : hostBuilderFunc();

                if (!Directory.Exists(parameters.WorkingDirectory))
                {
                    Directory.CreateDirectory(parameters.WorkingDirectory);
                }

                Status           = RuntimeStatus.Initializing;
                WorkingDirectory = parameters.WorkingDirectory;
                CommandlineArgs  = parameters.CommandlineArgs;

                SetupSerilog();

                m_Logger.LogInformation($"OpenMod v{Version} is starting...");

                if (parameters.PackageManager is not NuGetPackageManager nugetPackageManager)
                {
                    var packagesDirectory = Path.Combine(WorkingDirectory, "packages");
                    nugetPackageManager = new NuGetPackageManager(packagesDirectory)
                    {
                        Logger = new OpenModNuGetLogger(m_LoggerFactory !.CreateLogger("NuGet"))
                    };
                }

                nugetPackageManager.Logger = new OpenModNuGetLogger(m_LoggerFactory !.CreateLogger("NuGet"));

                await nugetPackageManager.RemoveOutdatedPackagesAsync();

                nugetPackageManager.InstallAssemblyResolver();
                nugetPackageManager.SetAssemblyLoader(Hotloader.LoadAssembly);

                var startupContext = new OpenModStartupContext
                {
                    Runtime             = this,
                    LoggerFactory       = m_LoggerFactory !,
                    NuGetPackageManager = nugetPackageManager,
                    DataStore           = new Dictionary <string, object>()
                };

                var startup = new OpenModStartup(startupContext);
                startupContext.OpenModStartup = startup;

                foreach (var assembly in openModHostAssemblies)
                {
                    startup.RegisterIocAssemblyAndCopyResources(assembly, string.Empty);
                }

                var configFile = Path.Combine(WorkingDirectory, "openmod.yaml");
                if (File.Exists(configFile))
                {
                    var yaml         = File.ReadAllText(configFile);
                    var deserializer = new DeserializerBuilder()
                                       .WithTypeConverter(new YamlNullableEnumTypeConverter())
                                       .WithNamingConvention(CamelCaseNamingConvention.Instance)
                                       .Build();

                    var config = deserializer.Deserialize <Dictionary <string, object> >(yaml);

                    var hotReloadingEnabled = true;
                    if (config.TryGetValue("hotreloading", out var unparsed))
                    {
                        switch (unparsed)
                        {
                        case bool value:
                            hotReloadingEnabled = value;
                            break;

                        case string strValue when bool.TryParse(strValue, out var parsed):
                            hotReloadingEnabled = parsed;

                            break;

                        default:
                            m_Logger.LogWarning("Unknown config for 'hotreloading' in OpenMod configuration: " + unparsed);
                            break;
                        }
                    }
                    Hotloader.Enabled = hotReloadingEnabled;

                    var tryInstallMissingDependencies = false;
                    if (config.TryGetValue("nuget", out unparsed) && unparsed is Dictionary <object, object> nugetConfig)
                    {
                        if (nugetConfig.TryGetValue("tryAutoInstallMissingDependencies", out unparsed))
                        {
                            switch (unparsed)
                            {
                            case bool value:
                                tryInstallMissingDependencies = value;
                                break;

                            case string strValue when bool.TryParse(strValue, out var parsed):
                                tryInstallMissingDependencies = parsed;

                                break;

                            default:
                                m_Logger.LogWarning("Unknown config for 'tryAutoInstallMissingDependencies' in OpenMod configuration: " + unparsed);
                                break;
                            }
                        }
                    }

                    PluginAssemblyStore.TryInstallMissingDependencies = tryInstallMissingDependencies;
                }

                await nugetPackageManager.InstallMissingPackagesAsync(updateExisting : true);

                await startup.LoadPluginAssembliesAsync();

                hostBuilder
                .UseContentRoot(parameters.WorkingDirectory)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureHostConfiguration(builder =>
                {
                    ConfigureConfiguration(builder, startup);
                    ((OpenModStartupContext)startup.Context).Configuration = builder.Build();
                })
                .ConfigureAppConfiguration(builder => ConfigureConfiguration(builder, startup))
                .ConfigureContainer <ContainerBuilder>(builder => SetupContainer(builder, startup))
                .ConfigureServices(services => SetupServices(services, startup))
                .UseSerilog();

                Host = hostBuilder.Build();

                m_AppLifeTime = Host.Services.GetRequiredService <IHostApplicationLifetime>();
                m_AppLifeTime.ApplicationStopping.Register(() => { AsyncHelper.RunSync(ShutdownAsync); });

                Status        = RuntimeStatus.Initialized;
                LifetimeScope = Host.Services.GetRequiredService <ILifetimeScope>().BeginLifetimeScopeEx(
                    containerBuilder =>
                {
                    containerBuilder.Register(_ => this)
                    .As <IOpenModComponent>()
                    .SingleInstance()
                    .ExternallyOwned();

                    containerBuilder.RegisterType <ScopedPermissionChecker>()
                    .As <IPermissionChecker>()
                    .InstancePerLifetimeScope()
                    .OwnedByLifetimeScope();
                });

                DataStore = Host.Services.GetRequiredService <IDataStoreFactory>().CreateDataStore(
                    new DataStoreCreationParameters
                {
                    Component        = this,
                    Prefix           = "openmod",
                    Suffix           = null,
                    WorkingDirectory = WorkingDirectory
                });

                try
                {
                    await Host.StartAsync();
                }
                catch (Exception ex)
                {
                    Status = RuntimeStatus.Crashed;
                    m_Logger.LogCritical(ex, "OpenMod has crashed.");
                    Log.CloseAndFlush();
                }

                return(Host);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                throw;
            }
        }
Beispiel #7
0
        public async Task <IHost> InitAsync(
            List <Assembly> openModHostAssemblies,
            RuntimeInitParameters parameters,
            Func <IHostBuilder> hostBuilderFunc = null)
        {
            try
            {
                var openModCoreAssembly = typeof(AsyncHelper).Assembly;
                if (!openModHostAssemblies.Contains(openModCoreAssembly))
                {
                    openModHostAssemblies.Insert(0, openModCoreAssembly);
                }

                Type hostInformationType = openModHostAssemblies
                                           .Select(asm =>
                                                   asm.GetLoadableTypes().FirstOrDefault(t => typeof(IHostInformation).IsAssignableFrom(t)))
                                           .LastOrDefault(d => d != null);

                if (hostInformationType == null)
                {
                    throw new Exception("Failed to find IHostInformation in host assemblies.");
                }

                HostInformation         = (IHostInformation)Activator.CreateInstance(hostInformationType);
                m_OpenModHostAssemblies = openModHostAssemblies;
                m_HostBuilderFunc       = hostBuilderFunc;
                m_RuntimeInitParameters = parameters;

                var hostBuilder = hostBuilderFunc == null ? new HostBuilder() : hostBuilderFunc();

                if (!Directory.Exists(parameters.WorkingDirectory))
                {
                    Directory.CreateDirectory(parameters.WorkingDirectory);
                }

                Status           = RuntimeStatus.Initializing;
                WorkingDirectory = parameters.WorkingDirectory;
                CommandlineArgs  = parameters.CommandlineArgs;

                SetupSerilog();

                m_Logger.LogInformation($"OpenMod v{Version} is starting...");

                var packagesDirectory   = Path.Combine(WorkingDirectory, "packages");
                var nuGetPackageManager = parameters.PackageManager as NuGetPackageManager ??
                                          new NuGetPackageManager(packagesDirectory);
                // nuGetPackageManager.ClearCache();

                nuGetPackageManager.Logger = new OpenModNuGetLogger(m_LoggerFactory.CreateLogger("NuGet"));
                await nuGetPackageManager.RemoveOutdatedPackagesAsync();

                nuGetPackageManager.InstallAssemblyResolver();
                nuGetPackageManager.SetAssemblyLoader(Hotloader.LoadAssembly);

                var startupContext = new OpenModStartupContext
                {
                    Runtime             = this,
                    LoggerFactory       = m_LoggerFactory,
                    NuGetPackageManager = nuGetPackageManager,
                    DataStore           = new Dictionary <string, object>()
                };

                var startup = new OpenModStartup(startupContext);
                startupContext.OpenModStartup = startup;

                foreach (var assembly in openModHostAssemblies)
                {
                    startup.RegisterIocAssemblyAndCopyResources(assembly, string.Empty);
                }

                await startup.LoadPluginAssembliesAsync();

                hostBuilder
                .UseContentRoot(parameters.WorkingDirectory)
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureHostConfiguration(builder =>
                {
                    ConfigureConfiguration(builder, startup);
                    ((OpenModStartupContext)startup.Context).Configuration = builder.Build();
                })
                .ConfigureAppConfiguration(builder => ConfigureConfiguration(builder, startup))
                .ConfigureContainer <ContainerBuilder>(builder => SetupContainer(builder, startup))
                .ConfigureServices(services => SetupServices(services, startup))
                .UseSerilog();

                Host          = hostBuilder.Build();
                m_AppLifeTime = Host.Services.GetRequiredService <IHostApplicationLifetime>();
                m_AppLifeTime.ApplicationStopping.Register(() => { AsyncHelper.RunSync(ShutdownAsync); });

                Status        = RuntimeStatus.Initialized;
                LifetimeScope = Host.Services.GetRequiredService <ILifetimeScope>().BeginLifetimeScope(
                    containerBuilder =>
                {
                    containerBuilder.Register(ctx => this)
                    .As <IOpenModComponent>()
                    .SingleInstance()
                    .ExternallyOwned();

                    containerBuilder.RegisterType <ScopedPermissionChecker>()
                    .As <IPermissionChecker>()
                    .InstancePerLifetimeScope()
                    .OwnedByLifetimeScope();
                });
                DataStore = Host.Services.GetRequiredService <IDataStoreFactory>().CreateDataStore(
                    new DataStoreCreationParameters
                {
                    ComponentId      = OpenModComponentId,
                    Prefix           = "openmod",
                    Suffix           = null,
                    WorkingDirectory = WorkingDirectory
                });

                var eventBus = Host.Services.GetRequiredService <IEventBus>();
                foreach (var assembly in openModHostAssemblies)
                {
                    eventBus.Subscribe(this, assembly);
                }

                try
                {
                    await Host.StartAsync();
                }
                catch (Exception ex)
                {
                    Status = RuntimeStatus.Crashed;
                    m_Logger.LogCritical(ex, "OpenMod has crashed.");
                    Log.CloseAndFlush();
                }

                return(Host);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                throw;
            }
        }
Beispiel #8
0
        public async Task <IHost> InitAsync(
            List <Assembly> openModHostAssemblies,
            RuntimeInitParameters parameters,
            Func <IHostBuilder> hostBuilderFunc = null)
        {
            var openModCoreAssembly = typeof(AsyncHelper).Assembly;

            if (!openModHostAssemblies.Contains(openModCoreAssembly))
            {
                openModHostAssemblies.Insert(0, openModCoreAssembly);
            }

            m_OpenModHostAssemblies = openModHostAssemblies;
            m_HostBuilderFunc       = hostBuilderFunc;
            m_RuntimeInitParameters = parameters;

            var hostBuilder = hostBuilderFunc == null ? new HostBuilder() : hostBuilderFunc();

            if (!Directory.Exists(parameters.WorkingDirectory))
            {
                Directory.CreateDirectory(parameters.WorkingDirectory);
            }

            Status           = RuntimeStatus.Initializing;
            WorkingDirectory = parameters.WorkingDirectory;
            CommandlineArgs  = parameters.CommandlineArgs;

            SetupSerilog();

            m_Logger.LogInformation($"OpenMod v{Version} is starting...");

            var packagesDirectory   = Path.Combine(WorkingDirectory, "packages");
            var nuGetPackageManager = new NuGetPackageManager(packagesDirectory)
            {
                Logger = new OpenModNuGetLogger(m_LoggerFactory.CreateLogger <OpenModNuGetLogger>())
            };

            nuGetPackageManager.InstallAssemblyResolver();

            var startupContext = new OpenModStartupContext
            {
                Runtime             = this,
                LoggerFactory       = m_LoggerFactory,
                NuGetPackageManager = nuGetPackageManager,
                DataStore           = new Dictionary <string, object>()
            };

            var startup = new OpenModStartup(startupContext);

            foreach (var assembly in openModHostAssemblies)
            {
                startup.RegisterIocAssemblyAndCopyResources(assembly, string.Empty);
            }

            await startup.LoadPluginAssembliesAsync();

            hostBuilder
            .UseContentRoot(parameters.WorkingDirectory)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureHostConfiguration(builder =>
            {
                ConfigureConfiguration(builder, startup);
                ((OpenModStartupContext)startup.Context).Configuration = builder.Build();
            })
            .ConfigureAppConfiguration(builder => ConfigureConfiguration(builder, startup))
            .ConfigureContainer <ContainerBuilder>(builder => SetupContainer(builder, startup))
            .ConfigureServices(services => SetupServices(services, startup))
            .UseSerilog();

            m_Host        = hostBuilder.Build();
            m_AppLifeTime = m_Host.Services.GetRequiredService <IHostApplicationLifetime>();
            m_AppLifeTime.ApplicationStopping.Register(() => { AsyncHelper.RunSync(ShutdownAsync); });

            Status        = RuntimeStatus.Initialized;
            LifetimeScope = m_Host.Services.GetRequiredService <ILifetimeScope>();
            DataStore     = m_Host.Services.GetRequiredService <IDataStoreFactory>().CreateDataStore("openmod", WorkingDirectory);

            var eventBus = m_Host.Services.GetRequiredService <IEventBus>();

            foreach (var assembly in openModHostAssemblies)
            {
                eventBus.Subscribe(this, assembly);
            }

            try
            {
                await m_Host.StartAsync();
            }
            catch (Exception ex)
            {
                Status = RuntimeStatus.Crashed;
                m_Logger.LogCritical(ex, "OpenMod has crashed.");
                Log.CloseAndFlush();
            }
            return(m_Host);
        }