internal void CheckOutfitTriggerInfoCount(int CoordinateIndex) { if (!MakerAPI.InsideMaker) { return; } bool Current = (CoordinateIndex == CurrentCoordinateIndex); int InfoCount = CharaTriggerInfo[CoordinateIndex].Parts.Count(); int PartCount = MoreAccessories_Support.GetCoordinatePartsInfo(ChaControl, CoordinateIndex).Count(); if (InfoCount > PartCount) // shit happend { CharaTriggerInfo[CoordinateIndex].Parts = CharaTriggerInfo[CoordinateIndex].Parts.Take(PartCount).ToList(); Logger.LogError($"[CheckOutfitTriggerInfoCount][{ChaControl.chaFile.parameter?.fullname}] CharaTriggerInfo[{CoordinateIndex}].Parts removed: {InfoCount} -> {PartCount}"); } if (InfoCount < PartCount) { for (int i = InfoCount; i < PartCount; i++) { CharaTriggerInfo[CoordinateIndex].Parts.Add(new AccTriggerInfo(i)); } Logger.Log(DebugLogLevel, $"[CheckOutfitTriggerInfoCount][{ChaControl.chaFile.parameter?.fullname}] CharaTriggerInfo[{CoordinateIndex}].Parts {InfoCount} -> {PartCount}"); } if (Current) { CurOutfitTriggerInfo = CharaTriggerInfo[CoordinateIndex]; } }
internal void ToggleByVirtualGroup(string group, bool show) { if (!TriggerEnabled) { Logger.Log(DebugLogLevel, $"[ToggleByVirtualGroup][{ChaControl.chaFile.parameter?.fullname}] TriggerEnabled false"); return; } Logger.Log(DebugLogLevel, $"[ToggleByVirtualGroup][{ChaControl.chaFile.parameter?.fullname}][group: {group}][show: {show}]"); VirtualGroupStates[group] = show; foreach (AccTriggerInfo Part in CurOutfitTriggerInfo.Parts) { if ((Part.Kind >= 9) && (!Part.Group.IsNullOrEmpty())) { if (Part.Group == group) { bool vis = show ? Part.State[0] : Part.State[3]; ChaControl.SetAccessoryState(Part.Slot, vis); Logger.Log(DebugLogLevel, $"[ToggleByVirtualGroup][{ChaControl.chaFile.parameter?.fullname}][Part.Slot: {Part.Slot}][show: {show}]"); } } } if (InsideCharaStudio) { MoreAccessories_Support.UpdateUI(); } }
internal static void MakerSettingChangePreview(ChaControl chaCtrl, AccTriggerInfo Part) { AccStateSyncController pluginCtrl = GetController(chaCtrl); if (MathfEx.RangeEqualOn(0, Part.Kind, 7)) { int state = chaCtrl.fileStatus.clothesState[Part.Kind]; bool vis = Part.State[state]; Part.Group = ""; chaCtrl.SetAccessoryState(Part.Slot, vis); } else if (Part.Kind >= 9) { if (Part.Kind == 9) { List <ChaFileAccessory.PartsInfo> PartsInfo = MoreAccessories_Support.GetAccessoriesInfos(chaCtrl); Part.Group = PartsInfo[Part.Slot].parentKey; } else { Part.Group = "custom_" + (Part.Kind - 9).ToString(); } bool vis = true; if (pluginCtrl.VirtualGroupStates.ContainsKey(Part.Group)) { vis = pluginCtrl.VirtualGroupStates[Part.Group] ? Part.State[0] : Part.State[3]; } chaCtrl.SetAccessoryState(Part.Slot, vis); } }
internal void Start() { Logger = base.Logger; instance = this; CharacterApi.RegisterExtraBehaviour <AccStateSyncController>(GUID); MoreAccessories_Support.LoadAssembly(); CoroutineSlotChangeDelay = Config.Bind("Maker", "Slot Change Delay", 1f, new ConfigDescription("", null, new ConfigurationManagerAttributes { IsAdvanced = true, Order = 2 })); CoroutineCounterMax = Config.Bind("Maker", "Maximun Coroutine Counter", 30f, new ConfigDescription("", null, new ConfigurationManagerAttributes { IsAdvanced = true, Order = 1 })); CharaMakerPreview = Config.Bind("Maker", "CharaMaker Force Preview", true, new ConfigDescription("", null, new ConfigurationManagerAttributes { Order = 10 })); CharaMakerPreview.SettingChanged += (sender, args) => { if (MakerAPI.InsideMaker) { CharaMakerPreviewSidebarToggle.Value = CharaMakerPreview.Value; if (CharaMakerPreviewSidebarToggle.Value) { GetController(MakerAPI.GetCharacterControl()).SyncAllAccToggle(); } } }; // MakerAPI.MakerBaseLoaded += MakerAPI_MakerBaseLoaded; MakerAPI.MakerFinishedLoading += (object sender, EventArgs e) => CreateMakerInterface(); AccessoriesApi.SelectedMakerAccSlotChanged += (object sender, AccessorySlotEventArgs eventArgs) => GetController(MakerAPI.GetCharacterControl()).AccSlotChangedHandler(eventArgs.SlotIndex); AccessoriesApi.AccessoryTransferred += (object sender, AccessoryTransferEventArgs eventArgs) => GetController(MakerAPI.GetCharacterControl()).AccessoryTransferredHandler(eventArgs.SourceSlotIndex, eventArgs.DestinationSlotIndex); AccessoriesApi.AccessoriesCopied += (object sender, AccessoryCopyEventArgs eventArgs) => GetController(MakerAPI.GetCharacterControl()).AccessoriesCopiedHandler((int)eventArgs.CopySource, (int)eventArgs.CopyDestination, eventArgs.CopiedSlotIndexes.ToList()); MakerAPI.RegisterCustomSubCategories += (sender, e) => { CharaMakerPreviewSidebarToggle = e.AddSidebarControl(new SidebarToggle("Force Preview", CharaMakerPreview.Value, this)); CharaMakerPreviewSidebarToggle.ValueChanged.Subscribe(b => CharaMakerPreview.Value = b); }; MakerAPI.MakerExiting += (sender, e) => { CharaMakerPreviewSidebarToggle = null; }; StudioAPI.StudioLoadedChanged += (sender, e) => RegisterStudioControls(); GameAPI.StartH += (sender, e) => { InsideHScene = true; UpdateHUI(); }; GameAPI.EndH += (sender, e) => { InsideHScene = false; HSprites.Clear(); }; HarmonyWrapper.PatchAll(typeof(Hooks)); if (UnityEngine.Application.dataPath.EndsWith("KoikatuVR_Data")) { HarmonyWrapper.PatchAll(typeof(HooksVR)); } foreach (var key in System.Enum.GetValues(typeof(ChaAccessoryDefine.AccessoryParentKey))) { AccParentNames[key.ToString()] = ChaAccessoryDefine.dictAccessoryParent[(int)key]; } }
internal void SyncOutfitTriggerInfo(int CoordinateIndex) { if (!TriggerEnabled) { Logger.Log(DebugLogLevel, $"[SyncOutfitTriggerInfo][{ChaControl.chaFile.parameter?.fullname}] TriggerEnabled false"); return; } List <ChaFileAccessory.PartsInfo> PartsInfo = MoreAccessories_Support.GetCoordinatePartsInfo(ChaControl, CoordinateIndex); OutfitTriggerInfo OutfitTriggerInfo = CharaTriggerInfo.ElementAtOrDefault(CoordinateIndex); Logger.Log(DebugLogLevel, $"[SyncOutfitTriggerInfo][{ChaControl.chaFile.parameter?.fullname}]Process OutfitTriggerInfo for Coordinate {CoordinateIndex}"); List <AccTriggerInfo> TriggerParts = OutfitTriggerInfo.Parts; int PartsInfoCount = PartsInfo.Count(); int TriggerPartsCount = TriggerParts.Count(); Logger.Log(DebugLogLevel, $"[SyncOutfitTriggerInfo][{ChaControl.chaFile.parameter?.fullname}][{CoordinateIndex}] Count {TriggerPartsCount} : {PartsInfoCount}"); if (TriggerPartsCount > PartsInfoCount) { CharaTriggerInfo[CoordinateIndex].Parts = CharaTriggerInfo[CoordinateIndex].Parts.Take(PartsInfoCount).ToList(); Logger.LogWarning($"[SyncOutfitTriggerInfo][{ChaControl.chaFile.parameter?.fullname}] AccTriggerInfo for Coordinate {CoordinateIndex} Slot {TriggerPartsCount} -> {PartsInfoCount}"); } else if (TriggerPartsCount < PartsInfoCount) { for (int j = TriggerPartsCount; j < PartsInfoCount; j++) { CharaTriggerInfo[CoordinateIndex].Parts.Add(new AccTriggerInfo(j)); } Logger.Log(DebugLogLevel, $"[SyncOutfitTriggerInfo][{ChaControl.chaFile.parameter?.fullname}] AccTriggerInfo for Coordinate {CoordinateIndex} Slot {TriggerPartsCount} -> {PartsInfoCount - 1}"); } for (int i = 0; i < PartsInfoCount; i++) { AccTriggerInfo TriggerPart = TriggerParts.ElementAtOrDefault(i); if ((TriggerPart.Kind != -1) && (PartsInfo[i].type == 120)) { CharaTriggerInfo[CoordinateIndex].Parts[i] = new AccTriggerInfo(i); Logger.LogMessage($"AccTriggerInfo for Coordinate {CoordinateIndex} Slot {i + 1:00} has been reset"); } else { if (TriggerPart.Kind == -1) { CharaTriggerInfo[CoordinateIndex].Parts[i] = new AccTriggerInfo(i); } else if (MathfEx.RangeEqualOn(0, TriggerPart.Kind, 7)) { CharaTriggerInfo[CoordinateIndex].Parts[i].Group = ""; } else if (TriggerPart.Kind == 9) { CharaTriggerInfo[CoordinateIndex].Parts[i].Group = PartsInfo[i].parentKey; } else if (TriggerPart.Kind > 9) { CharaTriggerInfo[CoordinateIndex].Parts[i].Group = "custom_" + (TriggerPart.Kind - 9).ToString(); } } } }