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);
            }
        }
Beispiel #4
0
        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();
                        }
                    }
                }
            }