/// <summary> /// 讀取MoreAccessories /// </summary> /// <param name="chaFileCoordinate">讀取的衣裝對象</param> /// <returns></returns> public static string[] LoadMoreAcc(ChaFileCoordinate chaFileCoordinate) { List <ChaFileAccessory.PartsInfo> tempLoadedAccessories = new List <ChaFileAccessory.PartsInfo>(); Extension.Extension.InvokeStatic(typeof(Sideloader.AutoResolver.UniversalAutoResolver).GetNestedType("Hooks", BindingFlags.NonPublic), "ExtendedCoordinateLoad", new object[] { chaFileCoordinate }); //本地Info List <ResolveInfo> LoadedResolutionInfoList = Sideloader.AutoResolver.UniversalAutoResolver.LoadedResolutionInfo?.ToList(); //讀取Sideloader extData List <ResolveInfo> extInfoList; sideLoaderExtData = ExtendedSave.GetExtendedDataById(chaFileCoordinate, "com.bepis.sideloader.universalautoresolver"); if (sideLoaderExtData == null || !sideLoaderExtData.data.ContainsKey("info")) { Logger.LogDebug("No sideloader extInfo found"); extInfoList = null; } else { object[] tmpExtInfo = (object[])sideLoaderExtData.data["info"]; extInfoList = tmpExtInfo.Select(x => MessagePackSerializer.Deserialize <ResolveInfo>((byte[])x)).ToList(); } XmlNode node = null; PluginData pluginData = ExtendedSave.GetExtendedDataById(chaFileCoordinate, "moreAccessories"); if (pluginData != null && pluginData.data.TryGetValue("additionalAccessories", out object xmlData)) { XmlDocument doc = new XmlDocument(); doc.LoadXml((string)xmlData); node = doc.FirstChild; } if (node != null) { foreach (XmlNode accessoryNode in node.ChildNodes) { ChaFileAccessory.PartsInfo part = new ChaFileAccessory.PartsInfo { type = XmlConvert.ToInt32(accessoryNode.Attributes["type"].Value) }; if (part.type != 120) { part.id = XmlConvert.ToInt32(accessoryNode.Attributes["id"].Value); part.parentKey = accessoryNode.Attributes["parentKey"].Value; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { part.addMove[i, j] = new Vector3 { x = XmlConvert.ToSingle(accessoryNode.Attributes[$"addMove{i}{j}x"].Value), y = XmlConvert.ToSingle(accessoryNode.Attributes[$"addMove{i}{j}y"].Value), z = XmlConvert.ToSingle(accessoryNode.Attributes[$"addMove{i}{j}z"].Value) }; } } for (int i = 0; i < 4; i++) { part.color[i] = new Color { r = XmlConvert.ToSingle(accessoryNode.Attributes[$"color{i}r"].Value), g = XmlConvert.ToSingle(accessoryNode.Attributes[$"color{i}g"].Value), b = XmlConvert.ToSingle(accessoryNode.Attributes[$"color{i}b"].Value), a = XmlConvert.ToSingle(accessoryNode.Attributes[$"color{i}a"].Value) }; } part.hideCategory = XmlConvert.ToInt32(accessoryNode.Attributes["hideCategory"].Value); part.noShake = (accessoryNode.Attributes["noShake"] != null && XmlConvert.ToBoolean(accessoryNode.Attributes["noShake"].Value)); //處理Sideloader mod if (null != extInfoList && null != LoadedResolutionInfoList) { ResolveInfo tmpExtInfo = extInfoList.FirstOrDefault(x => x.CategoryNo == (ChaListDefine.CategoryNo)part.type && x.Slot == part.id); if (default(ResolveInfo) != tmpExtInfo) { ResolveInfo localExtInfo = LoadedResolutionInfoList.FirstOrDefault(x => x.GUID == tmpExtInfo.GUID && x.CategoryNo == tmpExtInfo.CategoryNo && x.Slot == tmpExtInfo.Slot); if (default(ResolveInfo) != localExtInfo) { Logger.LogDebug($"Resolve {localExtInfo.GUID}: {localExtInfo.Slot} -> {localExtInfo.LocalSlot}"); part.id = localExtInfo.LocalSlot; } } } } tempLoadedAccessories.Add(part); } } ////由後往前刪除空欄 RemoveEmptyFromBackToFront(tempLoadedAccessories); return(tempLoadedAccessories.Select(x => Patches.GetNameFromIDAndType(x.id, (ChaListDefine.CategoryNo)x.type)).ToArray()); }