Пример #1
0
    static void BuildABs()
    {
        string buildPath = Application.dataPath.Substring(0, Application.dataPath.Length - 6) + "Mods";

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

        AssetBundleBuild[] buildMap = new AssetBundleBuild[2];

        buildMap[1].assetBundleName = "ingame";
        buildMap[1].assetNames      = new string[]
        {
            "Assets/Configurations",
        };

        string[] modGuids = AssetDatabase.FindAssets("t:Mod");

        foreach (var guid in modGuids)
        {
            string modAssetPath = AssetDatabase.GUIDToAssetPath(guid);
            string directory    = Path.GetDirectoryName(modAssetPath);
            string name         = Path.GetFileName(Path.GetDirectoryName(modAssetPath));

            buildMap[0].assetBundleName    = name.ToLower().Replace(' ', '_');
            buildMap[0].assetBundleVariant = "mod";
            buildMap[0].assetNames         = new string[] { directory };
        }

        BuildPipeline.BuildAssetBundles("Mods", buildMap, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64);

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

        string[] files = Directory.GetFiles("Mods", "*.mod");

        foreach (string file in files)
        {
            ModBundle modBundle = new ModBundle(Path.GetFileName(file));

            AssetBundle bundle = AssetBundle.LoadFromFile(file);
            Mod[]       mods   = bundle.LoadAllAssets <Mod>();

            List <byte> bytes = new List <byte>();
            for (int i = 0; i < mods.Length; i++)
            {
                ModMetaData metaData = mods[i].GenerateMetaData();
                modBundle.AddModMetaData(metaData);
            }

            string modBundleJson = JsonUtility.ToJson(modBundle);

            bytes.AddRange(Encoding.Unicode.GetBytes(modBundleJson));
            bytes.AddRange(BitConverter.GetBytes(Encoding.Unicode.GetByteCount(modBundleJson)));

            using (var stream = new FileStream(file, FileMode.Append))
            {
                stream.Write(bytes.ToArray(), 0, bytes.Count);

                stream.Write(versionTag, 0, versionTag.Length);
                stream.Close();
            }

            FileInfo file_info = new FileInfo(file);
            File.Copy(file, modPath + file_info.Name, true);
        }

        PostBuildWindow.Open(modPath, files);
    }
Пример #2
0
        public static ModMetaData MakeMetafromJobXML(string xml)
        {
            if (!XMLHelper.Validate(xml, File.ReadAllText(basepath + "templates\\validate.xsd")))
            {
                return(null);
            }
            XmlDocument dom = new XmlDocument();

            dom.LoadXml(xml);
            ModDetail        detail       = null;
            List <ModReq>    requirements = new List <ModReq>();
            List <ModBundle> bundles      = new List <ModBundle>();

            foreach (XmlNode n in dom.ChildNodes[0].ChildNodes)
            {
                switch (n.Name)
                {
                case "details":
                    detail = new ModDetail("", 0, "", "");
                    foreach (XmlNode child in n.ChildNodes)
                    {
                        switch (child.Name)
                        {
                        case "name":
                            detail.name = child.InnerText;
                            break;

                        case "version":
                            detail.version = Convert.ToByte(child.InnerText);
                            break;

                        case "author":
                            detail.author = child.InnerText;
                            break;

                        case "description":
                            detail.description = child.InnerText;
                            break;
                        }
                    }
                    break;

                case "requirements":
                    foreach (XmlNode child in n.ChildNodes)
                    {
                        if (child.Name == "requires")
                        {
                            ModReq req = new ModReq("", "");
                            foreach (XmlAttribute a in child.Attributes)
                            {
                                switch (a.Name)
                                {
                                case "id":
                                    req.id = a.Value;
                                    break;

                                case "minVersion":
                                    req.minVersion = a.Value;
                                    break;
                                }
                            }
                        }
                    }
                    break;

                case "bundles":
                    foreach (XmlNode child in n.ChildNodes)
                    {
                        if (child.Name == "bundle")
                        {
                            ModBundle bundle = new ModBundle("", "", null);
                            foreach (XmlAttribute a in child.Attributes)
                            {
                                switch (a.Name)
                                {
                                case "name":
                                    bundle.name = a.Value;
                                    break;

                                case "action":
                                    bundle.action = a.Value;
                                    break;
                                }
                            }
                            bundle.entries = new List <ModBundleEntry>();
                            foreach (XmlNode child2 in child.ChildNodes[0])
                            {
                                ModBundleEntry entry = new ModBundleEntry("", "", "", 0);
                                foreach (XmlAttribute a in child2.Attributes)
                                {
                                    switch (a.Name)
                                    {
                                    case "name":
                                        entry.name = a.Value;
                                        break;

                                    case "action":
                                        entry.action = a.Value;
                                        break;

                                    case "originalSha1":
                                        entry.orgSHA1 = a.Value;
                                        break;

                                    case "resourceId":
                                        entry.resId = Convert.ToByte(a.Value);
                                        break;
                                    }
                                }
                                bundle.entries.Add(entry);
                            }
                            bundles.Add(bundle);
                        }
                    }
                    break;
                }
            }
            byte   version = 1;
            string id      = "";

            foreach (XmlAttribute a in dom.ChildNodes[0].Attributes)
            {
                switch (a.Name)
                {
                case "version":
                    version = Convert.ToByte(a.Value);
                    break;

                case "id":
                    id = a.Value;
                    break;
                }
            }
            ModMetaData result = new ModMetaData(version, id, detail, requirements, bundles);

            return(result);
        }