Esempio n. 1
0
        public Module Load(string dllUnpackDir, string mapUnpackDir, string assetUnpackDir, bool overwriteExisting = false)
        {
            if (IsLoaded)
            {
                return(null);
            }

            var mod = ModDatabase.Get(ModName, ModMajor);

            if (mod == null)
            {
                return(null);
            }
            string errors;

            return(ModLoader.LoadCompressedModFile(mod.File, dllUnpackDir, mapUnpackDir, assetUnpackDir,
                                                   out errors, mod.UsesWhitelist, overwriteExisting));
        }
Esempio n. 2
0
        public static Module LoadCompressedModFile(string modFile, string dllUnpackDir, string mapUnpackDir, string assetUnpackDir, out string errors, bool verifySafe = true, bool overwriteExisting = false)
        {
            errors = "";
            if (loadedModFiles.ContainsKey(modFile))
            {
                return(loadedModFiles[modFile]);
            }

            Module output = null;
            string err    = "";

#if !DISABLE_ERROR_HANDLING_FOR_MODLOADER
            try
            {
#endif
            //Get the header to resolve dependencies
            var header = ModUnpacker.GetHeader(modFile);
            var deps   = new List <string>();
            //Resolve the dependencies and get all of their dlls
            foreach (var dep in header.Dependencies)
            {
                deps.AddRange(DependencyResolver.LoadDependency(dep.ModName, dep.Major, dep.Minor,
                                                                dllUnpackDir, mapUnpackDir, assetUnpackDir, header.Name, overwriteExisting));
            }
            //Remove duplicates
            deps = deps.Distinct().ToList();
            //Then, unpack (our) assemblies to the correct directory
            var dllPaths = ModUnpacker.UnpackDlls(modFile, dllUnpackDir, overwriteExisting);

            //If it has source code, compile that
            if (header.CodeFiles.Length > 0)
            {
                string mErr = "";
                output = LoadFromSourceCode(
                    ModUnpacker.GetSourceCode(modFile),
                    verifySafe,
                    out mErr,
                    dllPaths,
                    deps.ToArray()
                    );

                err += mErr;
            }
            else
            {
                //Otherwise, just do a simple load
                string mErr = "";
                output = LoadPrecompiled(
                    dllPaths, verifySafe, out mErr);
                err += mErr;
            }

            //Check if the mod failed at loading
            errors = err;
            if (output == null)
            {
                return(null);
            }

            //If it didn't, write the header
            output.Header = ModUnpacker.GetHeader(modFile);
            //And finally, unpack assets
            MapAssetFileNames(output.Header.ImageFiles, ModUnpacker.UnpackImages(modFile, assetUnpackDir, overwriteExisting), output);
            MapAssetFileNames(output.Header.SoundFiles, ModUnpacker.UnpackSounds(modFile, assetUnpackDir, overwriteExisting), output);
            MapAssetFileNames(output.Header.MapFiles, ModUnpacker.UnpackMaps(modFile, mapUnpackDir, overwriteExisting), output);
            MapAssetFileNames(output.Header.ComponentFiles, ModUnpacker.UnpackComponents(modFile, assetUnpackDir, overwriteExisting), output);
#if !DISABLE_ERROR_HANDLING_FOR_MODLOADER
        }

        catch (Exception ex)
        {
            err += ex.ToString() + "\n\n";
        }
#endif
            errors = err;
            loadedModFiles.Add(modFile, output);

            output.PackedFile = modFile;

            //Mark the mod as loaded
            ModDatabase.AddLoaded(output);
            return(output);
        }