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); }
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 }
public void Init(List <Assembly> openModAssemblies, RuntimeInitParameters parameters, Func <IHostBuilder>?hostBuilderFunc = null) { AsyncHelper.RunSync(() => InitAsync(openModAssemblies, parameters, hostBuilderFunc)); }
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; } }
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; } }
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); }