internal static void ResolveStudioObjectPattern(StudioPatternResolveInfo extResolve, ObjectInfo OI, ResolveType resolveType = ResolveType.Load) { if (OI is OIItemInfo Item) { #if KK for (int i = 0; i < Item.pattern.Length; i++) { if (!extResolve.ObjectPatternInfo.TryGetValue(i, out var patternInfo)) { continue; } var intResolve = TryGetResolutionInfo(Item.pattern[i].key, ChaListDefine.CategoryNo.mt_pattern, patternInfo.GUID); if (intResolve != null) { if (resolveType == ResolveType.Load && Sideloader.DebugLogging.Value) { Sideloader.Logger.LogDebug($"Resolving (Studio Item Pattern) [{ patternInfo.GUID}] {Item.pattern[i].key}->{intResolve.LocalSlot}"); } Item.pattern[i].key = intResolve.LocalSlot; } else if (resolveType == ResolveType.Load) { ShowGUIDError(patternInfo.GUID); Item.pattern[i].key = BaseSlotID - 1; } } #elif AI || HS2 for (int i = 0; i < Item.colors.Length; i++) { if (!extResolve.ObjectPatternInfo.TryGetValue(i, out var patternInfo)) { continue; } var intResolve = TryGetResolutionInfo(Item.colors[i].pattern.key, AIChara.ChaListDefine.CategoryNo.st_pattern, patternInfo.GUID); if (intResolve != null) { if (resolveType == ResolveType.Load && Sideloader.DebugLogging.Value) { Sideloader.Logger.LogDebug($"Resolving (Studio Item Pattern) [{ patternInfo.GUID}] {Item.colors[i].pattern.key}->{intResolve.LocalSlot}"); } Item.colors[i].pattern.key = intResolve.LocalSlot; } else if (resolveType == ResolveType.Load) { ShowGUIDError(patternInfo.GUID); Item.colors[i].pattern.key = BaseSlotID - 1; } } #endif } }
internal static void ExtendedSceneImport(string path) { PluginData ExtendedData = ExtendedSave.GetSceneExtendedDataById(UARExtID); Dictionary <int, ObjectInfo> ObjectList = FindObjectInfo(SearchType.All); Dictionary <int, int> ItemImportOrder = FindObjectInfoOrder(SearchType.Import, typeof(OIItemInfo)); //Resolve patterns on items if (ExtendedData != null && ExtendedData.data.ContainsKey("patternInfo")) { List <StudioPatternResolveInfo> extPatternInfo = ((object[])ExtendedData.data["patternInfo"]).Select(x => StudioPatternResolveInfo.Deserialize((byte[])x)).ToList(); foreach (StudioPatternResolveInfo extPatternResolve in extPatternInfo) { int NewDicKey = ItemImportOrder.Where(x => x.Value == extPatternResolve.ObjectOrder).Select(x => x.Key).FirstOrDefault(); if (ObjectList[NewDicKey] is OIItemInfo Item) { ResolveStudioObjectPattern(extPatternResolve, Item); } } } if (ExtendedData != null && ExtendedData.data.ContainsKey("itemInfo")) { List <StudioResolveInfo> extInfo = ((object[])ExtendedData.data["itemInfo"]).Select(x => StudioResolveInfo.Deserialize((byte[])x)).ToList(); Dictionary <int, int> LightImportOrder = FindObjectInfoOrder(SearchType.Import, typeof(OILightInfo)); Dictionary <int, int> CharImportOrder = FindObjectInfoOrder(SearchType.Import, typeof(OICharInfo)); //Match objects from the StudioResolveInfo to objects in the scene based on the item order that was generated and saved to the scene data foreach (StudioResolveInfo extResolve in extInfo) { int NewDicKey = ItemImportOrder.Where(x => x.Value == extResolve.ObjectOrder).Select(x => x.Key).FirstOrDefault(); if (ObjectList[NewDicKey] is OIItemInfo Item) { ResolveStudioObject(extResolve, Item); ObjectList.Remove(NewDicKey); } else { NewDicKey = LightImportOrder.Where(x => x.Value == extResolve.ObjectOrder).Select(x => x.Key).FirstOrDefault(); if (ObjectList[NewDicKey] is OILightInfo Light) { ResolveStudioObject(extResolve, Light); ObjectList.Remove(NewDicKey); } else { NewDicKey = CharImportOrder.Where(x => x.Value == extResolve.ObjectOrder).Select(x => x.Key).FirstOrDefault(); if (ObjectList[NewDicKey] is OICharInfo CharInfo) { ResolveStudioObject(extResolve, CharInfo); ObjectList.Remove(NewDicKey); } } } } } //Resolve every item without extended data in case of hard mods foreach (ObjectInfo OI in ObjectList.Where(x => x.Value is OIItemInfo || x.Value is OILightInfo).Select(x => x.Value)) { if (OI is OIItemInfo Item) { ResolveStudioObject(Item); } else if (OI is OILightInfo Light) { ResolveStudioObject(Light); } } //Maps and filters are not imported //UniversalAutoResolver.ResolveStudioMap(extData); }
internal static void ResolveStudioObjects(ExtensibleSaveFormat.PluginData extendedData, ResolveType resolveType) { Dictionary <int, ObjectInfo> ObjectList = StudioObjectSearch.FindObjectInfo(StudioObjectSearch.SearchType.All); //Resolve all patterns for objects if (extendedData != null && extendedData.data.ContainsKey("patternInfo")) { List <StudioPatternResolveInfo> extPatternInfo; if (resolveType == ResolveType.Save) { extPatternInfo = ((List <byte[]>)extendedData.data["patternInfo"]).Select(x => StudioPatternResolveInfo.Deserialize(x)).ToList(); } else { extPatternInfo = ((object[])extendedData.data["patternInfo"]).Select(x => StudioPatternResolveInfo.Deserialize((byte[])x)).ToList(); } foreach (StudioPatternResolveInfo extPatternResolve in extPatternInfo) { ResolveStudioObjectPattern(extPatternResolve, ObjectList[extPatternResolve.DicKey], resolveType); } } //Resolve every item with extended data if (extendedData != null && extendedData.data.ContainsKey("itemInfo")) { List <StudioResolveInfo> extInfo; if (resolveType == ResolveType.Save) { extInfo = ((List <byte[]>)extendedData.data["itemInfo"]).Select(x => StudioResolveInfo.Deserialize(x)).ToList(); } else { extInfo = ((object[])extendedData.data["itemInfo"]).Select(x => StudioResolveInfo.Deserialize((byte[])x)).ToList(); } foreach (StudioResolveInfo extResolve in extInfo) { ResolveStudioObject(extResolve, ObjectList[extResolve.DicKey], resolveType); ObjectList.Remove(extResolve.DicKey); } } //Resolve every item without extended data in case of hard mods if (resolveType == ResolveType.Load) { foreach (ObjectInfo OI in ObjectList.Where(x => x.Value is OIItemInfo || x.Value is OILightInfo || x.Value is OICharInfo).Select(x => x.Value)) { ResolveStudioObject(OI); } } }
private static void SavePrefix() { Dictionary <string, object> ExtendedData = new Dictionary <string, object>(); List <StudioResolveInfo> ObjectResolutionInfo = new List <StudioResolveInfo>(); List <StudioPatternResolveInfo> PatternResolutionInfo = new List <StudioPatternResolveInfo>(); Dictionary <int, ObjectInfo> ObjectList = FindObjectInfoAndOrder(SearchType.All, typeof(OIItemInfo), out Dictionary <int, int> ItemOrder); Dictionary <int, int> LightOrder = FindObjectInfoOrder(SearchType.All, typeof(OILightInfo)); Dictionary <int, int> CharOrder = FindObjectInfoOrder(SearchType.All, typeof(OICharInfo)); foreach (ObjectInfo oi in ObjectList.Select(x => x.Value)) { if (oi is OIItemInfo Item) { //Resolve the IDs of any patterns applied to the item StudioPatternResolveInfo studioPatternResolveInfo = new StudioPatternResolveInfo { DicKey = Item.dicKey, ObjectOrder = ItemOrder[Item.dicKey], ObjectPatternInfo = new Dictionary <int, StudioPatternResolveInfo.PatternInfo>() }; #if KK for (int i = 0; i < Item.pattern.Length; i++) { if (Item.pattern[i].key >= BaseSlotID) { var intResolve = TryGetResolutionInfo(ChaListDefine.CategoryNo.mt_pattern, Item.pattern[i].key); if (intResolve != null) { studioPatternResolveInfo.ObjectPatternInfo[i] = new StudioPatternResolveInfo.PatternInfo { GUID = intResolve.GUID, Slot = intResolve.Slot, LocalSlot = Item.pattern[i].key }; //Set pattern ID back to original non-resolved ID if (Sideloader.DebugLogging.Value) { Sideloader.Logger.LogDebug($"Setting [{Item.dicKey}] ID:{Item.pattern[i].key}->{intResolve.Slot}"); } Item.pattern[i].key = intResolve.Slot; } } } #elif AI || HS2 for (int i = 0; i < Item.colors.Length; i++) { if (Item.colors[i].pattern.key >= BaseSlotID) { var intResolve = TryGetResolutionInfo(AIChara.ChaListDefine.CategoryNo.st_pattern, Item.colors[i].pattern.key); if (intResolve != null) { studioPatternResolveInfo.ObjectPatternInfo[i] = new StudioPatternResolveInfo.PatternInfo { GUID = intResolve.GUID, Slot = intResolve.Slot, LocalSlot = Item.colors[i].pattern.key }; //Set pattern ID back to original non-resolved ID if (Sideloader.DebugLogging.Value) { Sideloader.Logger.LogDebug($"Setting [{Item.dicKey}] ID:{Item.colors[i].pattern.key}->{intResolve.Slot}"); } Item.colors[i].pattern.key = intResolve.Slot; } } } #endif if (studioPatternResolveInfo.ObjectPatternInfo.Count > 0) { PatternResolutionInfo.Add(studioPatternResolveInfo); } if (Item.no >= BaseSlotID) { StudioResolveInfo extResolve = LoadedStudioResolutionInfo.Where(x => x.LocalSlot == Item.no).FirstOrDefault(); if (extResolve != null) { StudioResolveInfo intResolve = new StudioResolveInfo { GUID = extResolve.GUID, Slot = extResolve.Slot, LocalSlot = extResolve.LocalSlot, DicKey = Item.dicKey, ObjectOrder = ItemOrder[Item.dicKey] }; ObjectResolutionInfo.Add(intResolve); //Set item ID back to original non-resolved ID if (Sideloader.DebugLogging.Value) { Sideloader.Logger.LogDebug($"Setting [{Item.dicKey}] ID:{Item.no}->{extResolve.Slot}"); } Traverse.Create(Item).Property("no").SetValue(extResolve.Slot); } } } else if (oi is OILightInfo Light && Light.no >= BaseSlotID) { StudioResolveInfo extResolve = LoadedStudioResolutionInfo.Where(x => x.LocalSlot == Light.no).FirstOrDefault(); if (extResolve != null) { StudioResolveInfo intResolve = new StudioResolveInfo { GUID = extResolve.GUID, Slot = extResolve.Slot, LocalSlot = extResolve.LocalSlot, DicKey = Light.dicKey, ObjectOrder = LightOrder[Light.dicKey] }; ObjectResolutionInfo.Add(intResolve); //Set item ID back to original non-resolved ID if (Sideloader.DebugLogging.Value) { Sideloader.Logger.LogDebug($"Setting [{Light.dicKey}] ID:{Light.no}->{extResolve.Slot}"); } Traverse.Create(Light).Property("no").SetValue(extResolve.Slot); } }