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); }
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); }