public virtual async Task <ICollection <Assembly> > LoadPluginAssembliesAsync() { var assemblyList = new List <Assembly>(); foreach (var file in Directory.GetFiles(m_PluginsDirectory, "*.dll")) { try { using var stream = File.Open(file, FileMode.Open); var data = new byte[stream.Length]; await stream.ReadAsync(data, 0, (int)stream.Length); var pluginAssembly = Hotloader.LoadAssembly(data); var pluginMetadata = pluginAssembly.GetCustomAttribute <PluginMetadataAttribute>(); if (pluginMetadata == null) { // not a plugin, but could be a library continue; } assemblyList.Add(pluginAssembly); } catch (Exception ex) { m_Logger.LogWarning(ex, $"Failed to load plugin metadata from file: {file}"); } } return(assemblyList); }
public HotloaderVariable(string name, Hotloader hotloader) { p_Name = name; p_Hash = name.GetHashCode(); p_Accessors = HotloaderAccessor.NONE; p_Value = new HotloaderExpression(hotloader, this); }
public virtual async Task <ICollection <Assembly> > LoadPluginAssembliesAsync() { var assemblyList = new List <Assembly>(); foreach (var assemblyPath in Directory.GetFiles(m_PluginsDirectory, "*.dll")) { try { var assemblyData = await FileHelper.ReadAllBytesAsync(assemblyPath); var assemblySymbolsPath = Path.ChangeExtension(assemblyPath, "pdb"); var assemblySymbols = File.Exists(assemblySymbolsPath) ? await FileHelper.ReadAllBytesAsync(assemblySymbolsPath) : null; var pluginAssembly = Hotloader.LoadAssembly(assemblyData, assemblySymbols); var pluginMetadata = pluginAssembly.GetCustomAttribute <PluginMetadataAttribute>(); if (pluginMetadata == null) { // not a plugin, but could be a library continue; } assemblyList.Add(pluginAssembly); } catch (Exception ex) { m_Logger.LogWarning(ex, "Failed to load plugin metadata from file: {File}", assemblyPath); } } return(assemblyList); }
public HotloaderClass(string name, Hotloader hotloader) { p_Name = name; p_NameHash = name.GetHashCode(); p_ChildClasses = new List <HotloaderClass>(); p_ChildVariables = new List <HotloaderVariable>(); p_Hotloader = hotloader; }
public HotloaderExpression(Hotloader hotloader, HotloaderVariable variable) { p_Hotloader = hotloader; p_Globals = hotloader.Globals; p_Variable = variable; p_Operators = new HotloaderValueOperator[0]; p_Operands = new HotloaderValueOperand[0]; }
public HotloaderVariable(string name, HotloaderEvaluationCallback evaluation, Hotloader hotloader) : this(name, hotloader) { //for obvious reasons, this is a const static p_Accessors = HotloaderAccessor.CONST | HotloaderAccessor.STATIC; //set the callback p_Value.SetEvaluationCallback(evaluation); }
public PomeloMySqlConnectorResolver(NuGetPackageManager nuGetPackageManager, ILogger <PomeloMySqlConnectorResolver> logger) { if (!Hotloader.Enabled) { logger.LogCritical( "Hotloader is not enabled and MySqlConnector v0.69 will not be able to load. Some plugins may not work as intended."); return; } using var stream = GetType().Assembly .GetManifestResourceStream("OpenMod.EntityFrameworkCore.MySql.libs.MySqlConnector.dll"); if (stream == null) { logger.LogCritical( "Could not retrieve MySqlConnector assembly stream. Some plugins may not work as intended."); return; } using var memStream = new MemoryStream(); stream.CopyTo(memStream); var assemblyBytes = memStream.ToArray(); Hotloader.LoadAssembly(assemblyBytes); logger.LogDebug("Loaded MySqlConnector v0.69 into Hotloader"); var nuGetResolverInstalled = AccessTools.FieldRefAccess <NuGetPackageManager, bool>("m_AssemblyResolverInstalled")( nuGetPackageManager); if (nuGetResolverInstalled) { var assemblyResolveMethod = typeof(NuGetPackageManager).GetMethod("OnAssemblyResolve", BindingFlags.NonPublic | BindingFlags.Instance); if (assemblyResolveMethod == null) { logger.LogCritical($"Couldn't find OnAssemblyResolve method for {nameof(NuGetPackageManager)}!"); } else { var @delegate = (ResolveEventHandler)assemblyResolveMethod.CreateDelegate(typeof(ResolveEventHandler), nuGetPackageManager); AppDomain.CurrentDomain.AssemblyResolve -= @delegate; AppDomain.CurrentDomain.AssemblyResolve += @delegate; } } }
public static void CopyAssemblyResources(Assembly assembly, string baseDir, bool overwrite = false) { baseDir ??= string.Empty; var resourceNames = assembly.GetManifestResourceNames(); if (resourceNames.Length > 0 && !Directory.Exists(baseDir)) { Directory.CreateDirectory(baseDir); } foreach (var resourceName in resourceNames) { var assemblyName = Hotloader.GetRealAssemblyName(assembly); if (!resourceName.Contains(assemblyName.Name + ".")) { Log.Warning($"{resourceName} does not contain assembly name in assembly: {assemblyName.Name}. <AssemblyName> and <RootNamespace> must be equal inside your plugins .csproj file."); } var regex = new Regex(Regex.Escape(assemblyName.Name + ".")); var fileName = regex.Replace(resourceName, string.Empty, 1); var filePath = Path.Combine(baseDir, fileName); using var stream = assembly.GetManifestResourceStream(resourceName); using var reader = new StreamReader(stream ?? throw new MissingManifestResourceException($"Couldn't find resource: {resourceName}")); var fileContent = reader.ReadToEnd(); if (File.Exists(filePath) && !overwrite) { continue; } File.WriteAllText(filePath, fileContent); } }
protected override async Task OnExecuteAsync() { var modulesDirectory = Path.Combine(ReadWrite.PATH, "Modules"); var openModDirPath = Path.GetDirectoryName(Directory .GetFiles(modulesDirectory, "OpenMod.Unturned.Module.dll", SearchOption.AllDirectories) .FirstOrDefault() ?? throw new Exception("Failed to find OpenMod directory")) !; using var client = new HttpClient(); client.DefaultRequestHeaders.Add("User-Agent", "request"); var releaseData = await client.GetStringAsync("https://api.github.com/repos/openmod/openmod/releases/latest"); var release = JsonConvert.DeserializeObject <LatestRelease>(releaseData); var isPre = Context.Parameters.Contains("--pre"); var anyUpdated = false; var moduleAsset = release.Assets.Find(x => x.BrowserDownloadUrl.Contains("OpenMod.Unturned.Module")); if (moduleAsset != null && m_HostInformation.HostVersion.CompareTo(release.TagName) < 0) { BackupFiles(openModDirPath); try { await PrintAsync($"Downloading {moduleAsset.AssetName}..."); var stream = await client.GetStreamAsync(moduleAsset.BrowserDownloadUrl); await PrintAsync("Extracting update..."); await ExtractArchiveAsync(stream, openModDirPath !); } catch (Exception) { RestoreFiles(openModDirPath); throw; } DeleteBackup(openModDirPath); anyUpdated = true; } foreach (var assembly in m_Runtime.HostAssemblies) { var ident = await m_PackageManager.QueryPackageExactAsync(assembly.GetName().Name, null, isPre); if (ident == null) { m_Logger.LogWarning("No package found for assembly: {AssemblyName}", assembly.FullName); continue; } var installed = await m_PackageManager.GetLatestPackageIdentityAsync(ident.Identity.Id); if (installed != null && installed.Version >= ident.Identity.Version) { continue; } await PrintAsync($"Updating package \"{ident.Identity.Id}\" to {ident.Identity.Version}"); await m_PackageManager.InstallAsync(ident.Identity, isPre); anyUpdated = true; } if (!anyUpdated) { await PrintAsync("No update found."); return; } if (Hotloader.Enabled) { var modulePath = Path.Combine(openModDirPath, "OpenMod.Unturned.Module.dll"); var moduleAssembly = Hotloader.LoadAssembly(File.ReadAllBytes(modulePath)); var moduleNexusType = moduleAssembly.GetType("OpenMod.Unturned.Module.OpenModUnturnedModule"); if (moduleNexusType == null) { await PrintAsync("Failed to dynamically reload OpenMod. Please restart your server.", Color.Red); return; } await PrintAsync("Reloading OpenMod..."); try { await m_Runtime.ShutdownAsync(); var nexus = (IModuleNexus)Activator.CreateInstance(moduleNexusType); // set OpenModUnturnedModule.IsDynamicLoad to true var isDynamicPropertySetter = moduleNexusType.GetProperty("IsDynamicLoad")?.GetSetMethod(true); isDynamicPropertySetter?.Invoke(nexus, new object[] { true }); nexus.initialize(); } catch { await PrintAsync( "Reloading OpenMod has failed! Please restart your server and report this error.", Color.Red); throw; } await PrintAsync("Update has been installed and loaded."); } else { await PrintAsync("Update has been installed. Restart to apply it."); } }
protected override async Task OnExecuteAsync() { var modulesDirectory = Path.Combine(ReadWrite.PATH, "Modules"); var openModDirPath = Path.GetDirectoryName(Directory .GetFiles(modulesDirectory, "OpenMod.Unturned.dll", SearchOption.AllDirectories) .FirstOrDefault() ?? throw new Exception("Failed to find OpenMod directory")); using var client = new HttpClient(); client.DefaultRequestHeaders.Add("User-Agent", "request"); var releaseData = await client.GetStringAsync("https://api.github.com/repos/openmod/openmod/releases/latest"); var release = JsonConvert.DeserializeObject <LatestRelease>(releaseData); var moduleAsset = release.Assets.Find(x => x.BrowserDownloadUrl.Contains("OpenMod.Unturned.Module")); if (moduleAsset == null || m_HostInformation.HostVersion.CompareTo(release.TagName) >= 0) { await PrintAsync("No update found..."); return; } await PrintAsync($"Downloading {moduleAsset.AssetName}..."); var stream = await client.GetStreamAsync(moduleAsset.BrowserDownloadUrl); await PrintAsync("Extracting update..."); await ExtractArchiveAsync(stream, openModDirPath !); if (Hotloader.Enabled) { var modulePath = Path.Combine(openModDirPath, "OpenMod.Unturned.Module.dll"); var moduleAssembly = Hotloader.LoadAssembly(File.ReadAllBytes(modulePath)); var moduleNexusType = moduleAssembly.GetType("OpenMod.Unturned.Module.OpenModUnturnedModule"); if (moduleNexusType == null) { await PrintAsync("Failed to dynamically reload OpenMod. Please restart your server.", Color.Red); return; } await PrintAsync("Reloading OpenMod..."); try { await m_Runtime.ShutdownAsync(); var nexus = (IModuleNexus)Activator.CreateInstance(moduleNexusType); // set OpenModUnturnedModule.IsDynamicLoad to true var isDynamicPropertySetter = moduleNexusType.GetProperty("IsDynamicLoad")?.GetSetMethod(true); isDynamicPropertySetter?.Invoke(nexus, new object[] { true }); nexus.initialize(); } catch { await PrintAsync("Reloading OpenMod has failed! Please restart your server and report this error.", Color.Red); throw; } await PrintAsync("Update has been installed and loaded."); } else { await PrintAsync("Update has been installed. Restart to apply it."); } }
protected override async Task OnExecuteAsync() { var modulesDirectory = Path.Combine(ReadWrite.PATH, "Modules"); using var client = new HttpClient(); var releaseData = await client.GetStringAsync("https://api.github.com/repos/openmod/openmod/releases/latest"); var release = JsonConvert.DeserializeObject <LatestRelease>(releaseData); var moduleAsset = release.Assets.Find(x => x.BrowserDownloadUrl.Contains("OpenMod.Unturned.Module")); if (moduleAsset == null) { // todo: enumerator other releases until it finds OpenMod.Unturned.Module await PrintAsync($"No update found..."); return; } await PrintAsync($"Downloading {moduleAsset.AssetName}..."); var stream = await client.GetStreamAsync(moduleAsset.BrowserDownloadUrl); await PrintAsync("Extracting update..."); await ExtractArchiveAsync(stream, modulesDirectory); if (Hotloader.Enabled) { var modulePath = Path.Combine(modulesDirectory, "OpenMod.Unturned", "OpenMod.Unturned.Module.dll"); var moduleAssembly = Hotloader.LoadAssembly(File.ReadAllBytes(modulePath)); var moduleNexusType = moduleAssembly.GetType("OpenMod.Unturned.Module.OpenModUnturnedModule"); if (moduleNexusType == null) { await PrintAsync("Failed to dynamically reload OpenMod. Please restart your server.", Color.Red); return; } await PrintAsync("Reloading OpenMod..."); try { await m_Runtime.ShutdownAsync(); var nexus = (IModuleNexus)Activator.CreateInstance(moduleNexusType); // set OpenModUnturnedModule.IsDynamicLoad to true var isDynamicPropertySetter = moduleNexusType.GetProperty("IsDynamicLoad")?.GetSetMethod(true); if (isDynamicPropertySetter != null) { isDynamicPropertySetter.Invoke(nexus, new object[] { true }); } nexus.initialize(); } catch { await PrintAsync("Reloading OpenMod has failed! Please restart your server and report this error.", Color.Red); throw; } await PrintAsync("Update has been installed and loaded."); } else { await PrintAsync("Update has been installed. Restart to apply it."); } }
public Game(GameWindow wnd) { p_Window = wnd; /*hook crash events at the first opportunity.*/ Application.ThreadException += handleCrash; /*fullscreen*/ p_Window.Shown += delegate(object s, EventArgs e) { //p_Window.ToggleFullscreen(); p_Window.Focus(); p_Window.BringToFront(); cmd("warp 0 0"); cmd("zoom 0 0"); cmd("toggle debug"); cmd("toggle debug full"); cmd("toggle fog"); cmd("toggle los"); testCode(); }; /*initialize hotloader*/ p_Hotloader = new Hotloader(); /*initialize the camera*/ p_Camera = new Camera(this); /*initialize map*/ p_Map = new Map(this, 1000, 1000); p_MapRenderer = new MapRenderer(this, p_Map, p_Camera); /*setup camera position*/ p_Camera.ZoomAbs(32); p_Camera.MoveCenter(250, 250); /*init sub-systems*/ initUI(); initMouse(); initPlayers(); initLogic(); initDebug(); initDraw(); /*hook events*/ p_Cursor.HookEvents(); wnd.Click += handleMouseClick; wnd.MouseWheel += handleMouseScroll; wnd.MouseMove += handleMouseMove; wnd.MouseUp += handleMouseUp; wnd.KeyDown += handleKeyDown; wnd.KeyUp += handleKeyUp; wnd.Resize += handleResize; wnd.GotFocus += handleFocusChanged; wnd.LostFocus += handleFocusChanged; unsafe { IPathfinderContext ctx = Pathfinder.ASCreateContext(p_Map.Width, p_Map.Height); while (true) { break; int time = Environment.TickCount; //break; List <Point> lol = Pathfinder.ASSearch( ctx, Point.Empty, new Point(p_Map.Width - 1, p_Map.Height - 1), p_Map.GetConcreteMatrix(true)); Console.WriteLine((Environment.TickCount - time) + "ms for " + lol.Count + " items"); } } wnd.HookCoreEvents(); p_Camera.EnableMargin = true; p_Camera.SetMargin(10, 10); }
public static void CopyAssemblyResources(Assembly assembly, string?baseDir, bool overwrite = false) { baseDir ??= string.Empty; var resourceNames = assembly.GetManifestResourceNames(); if (resourceNames.Length > 0 && !Directory.Exists(baseDir)) { Directory.CreateDirectory(baseDir); } foreach (var resourceName in resourceNames) { if (resourceName.EndsWith("..directory")) { continue; } var assemblyName = Hotloader.GetRealAssemblyName(assembly); if (!resourceName.Contains(assemblyName.Name + ".")) { Log.Warning( "{ResourceName} does not contain assembly name in assembly: {AssemblyName}. <AssemblyName> and <RootNamespace> must be equal inside your plugins .csproj file", resourceName, assemblyName.Name); } var regex = new Regex(Regex.Escape(assemblyName.Name + ".")); var fileName = regex.Replace(resourceName, string.Empty, 1); if (s_ExcludedResources.Contains(fileName)) { continue; } var parts = fileName.Split('.'); fileName = ""; var pathSb = new StringBuilder(assemblyName.Name + "."); foreach (var part in parts) { pathSb.Append(part + "."); using var tmpStream = assembly.GetManifestResourceStream(pathSb + ".directory"); var isDirectory = tmpStream != null; if (isDirectory) { fileName += part + Path.DirectorySeparatorChar; } else { fileName += part + "."; } } if (fileName.EndsWith(".")) { fileName = fileName.Substring(0, fileName.Length - 1); } var directory = Path.GetDirectoryName(fileName); if (directory != null) { directory = Path.Combine(baseDir, directory); } if (directory != null && !Directory.Exists(directory)) { Directory.CreateDirectory(directory); } var filePath = Path.Combine(baseDir, fileName); using var stream = assembly.GetManifestResourceStream(resourceName); using var reader = new StreamReader(stream ?? throw new MissingManifestResourceException( $"Couldn't find resource: {resourceName}")); var fileContent = reader.ReadToEnd(); if (File.Exists(filePath) && !overwrite) { continue; } File.WriteAllText(filePath, fileContent); } }
public HotloaderVariable(string name, object value, HotloaderAccessor accessors, Hotloader hotloader) : this(name, hotloader) { p_Value.SetValue(value); p_Accessors = accessors; }
public HotloaderVariable(string name, object value, Hotloader hotloader) : this(name, value, HotloaderAccessor.NONE, hotloader) { }