Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 public HotloaderVariable(string name, Hotloader hotloader)
 {
     p_Name      = name;
     p_Hash      = name.GetHashCode();
     p_Accessors = HotloaderAccessor.NONE;
     p_Value     = new HotloaderExpression(hotloader, this);
 }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 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;
 }
Ejemplo n.º 5
0
    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];
    }
Ejemplo n.º 6
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);
    }
Ejemplo n.º 7
0
        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;
                }
            }
        }
Ejemplo n.º 8
0
        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);
            }
        }
Ejemplo n.º 9
0
        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.");
            }
        }
Ejemplo n.º 10
0
        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.");
            }
        }
Ejemplo n.º 11
0
        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.");
            }
        }
Ejemplo n.º 12
0
    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);
    }
Ejemplo n.º 13
0
        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);
            }
        }
Ejemplo n.º 14
0
 public HotloaderVariable(string name, object value, HotloaderAccessor accessors, Hotloader hotloader)
     : this(name, hotloader)
 {
     p_Value.SetValue(value);
     p_Accessors = accessors;
 }
Ejemplo n.º 15
0
 public HotloaderVariable(string name, object value, Hotloader hotloader)
     : this(name, value, HotloaderAccessor.NONE, hotloader)
 {
 }