Пример #1
0
        internal static void OnSettingsApplied()
        {
            ShoulderMode = MelonPrefs.GetBool(IkTweaksCategory, FixShoulders)
                ? IKSolverVR.Arm.ShoulderRotationMode.YawPitch
                : IKSolverVR.Arm.ShoulderRotationMode.FromTo;

            foreach (var fieldInfo in typeof(IkTweaksSettings).GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly))
            {
                if (fieldInfo.FieldType == typeof(string))
                {
                    fieldInfo.SetValue(null, MelonPrefs.GetString(IkTweaksCategory, fieldInfo.Name));
                }
                else if (fieldInfo.FieldType == typeof(bool))
                {
                    fieldInfo.SetValue(null, MelonPrefs.GetBool(IkTweaksCategory, fieldInfo.Name));
                }
                else if (fieldInfo.FieldType == typeof(float))
                {
                    fieldInfo.SetValue(null, MelonPrefs.GetFloat(IkTweaksCategory, fieldInfo.Name));
                }
                else if (fieldInfo.FieldType == typeof(int))
                {
                    fieldInfo.SetValue(null, MelonPrefs.GetInt(IkTweaksCategory, fieldInfo.Name));
                }
            }

            if (SpineRelaxIterations > 25)
            {
                SpineRelaxIterations = 25;
            }
        }
Пример #2
0
        public override void OnModSettingsApplied()
        {
            var cursorManager = VRCUiCursorManager.field_Private_Static_VRCUiCursorManager_0;

            if (cursorManager == null)
            {
                return;
            }

            var leftHand  = cursorManager.transform.Find("LeftHandBeam").GetComponent <VRCUiCursor>();
            var rightHand = cursorManager.transform.Find("RightHandBeam").GetComponent <VRCUiCursor>();

            if (myOriginalLaserTexture == null)
            {
                myOriginalLaserTexture            = leftHand.GetComponent <LineRenderer>().material.mainTexture.Cast <Texture2D>();
                myOriginalLaserTexture.hideFlags |= HideFlags.DontUnloadUnusedAsset;
            }

            var targetTexture = MelonPrefs.GetBool(SettingsCategory, RecolorBeamsSetting) ? myWhiteLaserTexture : myOriginalLaserTexture;

            leftHand.GetComponent <LineRenderer>().material.mainTexture  = targetTexture;
            rightHand.GetComponent <LineRenderer>().material.mainTexture = targetTexture;

            AdjustParticleSystems(leftHand.gameObject);
            AdjustParticleSystems(rightHand.gameObject);

            var color = DecodeColor(MelonPrefs.GetString(SettingsCategory, BeamColorSetting));

            ourBeamColor       = color;
            ourDoRecolorSparks = MelonPrefs.GetBool(SettingsCategory, RecolorSparksSetting);
            ourDoRecolorBeams  = MelonPrefs.GetBool(SettingsCategory, RecolorBeamsSetting);
        }
Пример #3
0
        public override void OnModSettingsApplied()
        {
            // Highly recommend using UIExpansionKit to easily change your title (For VRChat)

            TitleString = MelonPrefs.GetString(ModCategory, CustomTitleText);

            Console.Title = string.Format(TitleString);
            MelonLogger.Log("Set console title to: " + TitleString);
        }
Пример #4
0
        public static string[] GetModData()
        {
            var username      = MelonPrefs.GetString(settingsCategory, IrcMenuNames[0]);
            var realname      = MelonPrefs.GetString(settingsCategory, IrcMenuNames[1]);
            var nickname      = MelonPrefs.GetString(settingsCategory, IrcMenuNames[2]);
            var defaultServer = MelonPrefs.GetString(settingsCategory, IrcMenuNames[3]);

            return(new[] { username, realname, nickname, defaultServer });
        }
Пример #5
0
        public override void OnApplicationStart() // Runs after Game Initialization.
        {
            MelonPrefs.RegisterCategory(ModCategory, "Custom Console Title");

            MelonPrefs.RegisterString(ModCategory, CustomTitleText, "Being a Cutie!", "Custom Console Text");

            TitleString = MelonPrefs.GetString(ModCategory, CustomTitleText);

            Console.Title = string.Format(TitleString);
        }
        private void ApplySettings()
        {
            activeSettings.Enabled         = MelonPrefs.GetBool(SettingsCategory, nameof(Settings.Enabled));
            activeSettings.SpeedMultiplier = MelonPrefs.GetFloat(SettingsCategory, nameof(Settings.SpeedMultiplier));
            activeSettings.DoubleClickTime = MelonPrefs.GetFloat(SettingsCategory, nameof(Settings.DoubleClickTime));

            if (Enum.TryParse(MelonPrefs.GetString(SettingsCategory, nameof(Settings.Forward)), out KeyCode forward))
            {
                activeSettings.Forward = forward;
            }
            else
            {
                MelonLogger.LogError("Failed to parse KeyCode Forward");
            }

            if (Enum.TryParse(MelonPrefs.GetString(SettingsCategory, nameof(Settings.Backward)), out KeyCode backward))
            {
                activeSettings.Backward = backward;
            }
            else
            {
                MelonLogger.LogError("Failed to parse KeyCode Backward");
            }

            if (Enum.TryParse(MelonPrefs.GetString(SettingsCategory, nameof(Settings.Left)), out KeyCode left))
            {
                activeSettings.Left = left;
            }
            else
            {
                MelonLogger.LogError("Failed to parse KeyCode Left");
            }

            if (Enum.TryParse(MelonPrefs.GetString(SettingsCategory, nameof(Settings.Right)), out KeyCode right))
            {
                activeSettings.Right = right;
            }
            else
            {
                MelonLogger.LogError("Failed to parse KeyCode Right");
            }

            activeSettings.AxisDeadZone       = MelonPrefs.GetFloat(SettingsCategory, nameof(Settings.AxisDeadZone));
            activeSettings.AxisClickThreshold = MelonPrefs.GetFloat(SettingsCategory, nameof(Settings.AxisClickThreshold));

            SetLocomotion();
        }
Пример #7
0
 private void LoadConfig()
 {
     leaderboardUserColor     = MelonPrefs.GetString("ScorePercentage", "leaderboardUserColor");
     leaderboardHighScoreSize = MelonPrefs.GetString("ScorePercentage", "leaderboardHighScoreSize");
     leaderboardPercentSize   = MelonPrefs.GetString("ScorePercentage", "leaderboardPercentSize");
     leaderboardUsernameSize  = MelonPrefs.GetString("ScorePercentage", "leaderboardUsernameSize");
     songListHighScoreSize    = MelonPrefs.GetString("ScorePercentage", "songListHighScoreSize");
     songListPercentSize      = MelonPrefs.GetString("ScorePercentage", "songListPercentSize");
     inGameCurrentScoreSize   = MelonPrefs.GetString("ScorePercentage", "inGameCurrentScoreSize");
     inGameCurrentPercentSize = MelonPrefs.GetString("ScorePercentage", "inGameCurrentPercentSize");
     inGameHighScoreLabelText = MelonPrefs.GetString("ScorePercentage", "inGameHighScoreLabelText");
     inGameHighScoreLabelSize = MelonPrefs.GetString("ScorePercentage", "inGameHighScoreLabelSize");
     inGameHighScoreSize      = MelonPrefs.GetString("ScorePercentage", "inGameHighScoreSize");
     inGamePercentSize        = MelonPrefs.GetString("ScorePercentage", "inGamePercentSize");
     historyTopScoreSize      = MelonPrefs.GetString("ScorePercentage", "historyTopScoreSize");
     historyTopPercentSize    = MelonPrefs.GetString("ScorePercentage", "historyTopPercentSize");
 }
        public static IEnumerable <Type> GetTypes()
        {
            var blockedclasses = MelonPrefs.GetString(settingsCategory, "CustomBlocker").Split(';').Select(item =>
            {
                Type asss = null;
                try
                {
                    asss = Type.GetType(item);
                }
                catch (Exception e)
                {
                }

                return(asss);
            });

            return(blockedclasses);
        }
Пример #9
0
        public override void OnModSettingsApplied()
        {
            bool enabled = MelonPrefs.GetBool("DirectionalVoice", "Enabled");

            if (!enabled && mEnabled)
            {
                foreach (Player player in Util.GetPlayers())
                {
                    player.field_Private_USpeaker_0.SpeakerVolume = 1f;
                }
            }
            mEnabled = enabled;

            mMinVolume = MelonPrefs.GetFloat("DirectionalVoice", "MinVolume");

#if DEBUG
            mDebugTarget = MelonPrefs.GetString("DirectionalVoice", "DebugTarget");
#endif
        }
Пример #10
0
        public static void OnModSettingsApplied()
        {
            foreach (var fieldInfo in typeof(Config).GetFields(BindingFlags.Static | BindingFlags.Public))
            {
                if (fieldInfo.Name == "Category")
                {
                    continue;
                }

                if (fieldInfo.FieldType == typeof(float))
                {
                    fieldInfo.SetValue(null, MelonPrefs.GetFloat(Category, fieldInfo.Name));
                }

                if (fieldInfo.FieldType == typeof(string))
                {
                    fieldInfo.SetValue(null, MelonPrefs.GetString(Category, fieldInfo.Name));
                }
            }
        }
Пример #11
0
        public override unsafe void OnApplicationStart()
        {
            try
            {
                var settingsCategory = "HWIDPatch";
                MelonPrefs.RegisterCategory(settingsCategory, "HWID Patch");
                MelonPrefs.RegisterString(settingsCategory, "HWID", "", hideFromList: true);

                var newId = MelonPrefs.GetString(settingsCategory, "HWID");
                if (newId.Length != SystemInfo.deviceUniqueIdentifier.Length)
                {
                    var random = new System.Random(Environment.TickCount);
                    var bytes  = new byte[SystemInfo.deviceUniqueIdentifier.Length / 2];
                    random.NextBytes(bytes);
                    newId = string.Join("", bytes.Select(it => it.ToString("x2")));
                    MelonPrefs.SetString(settingsCategory, "HWID", newId);
                }

                ourGeneratedHwidString = new Il2CppSystem.Object(IL2CPP.ManagedStringToIl2Cpp(newId));

                var icallName    = "UnityEngine.SystemInfo::GetDeviceUniqueIdentifier";
                var icallAddress = IL2CPP.il2cpp_resolve_icall(icallName);
                if (icallAddress == IntPtr.Zero)
                {
                    MelonLogger.LogError("Can't resolve the icall, not patching");
                    return;
                }

                CompatHook((IntPtr)(&icallAddress),
                           typeof(HWIDPatchMod).GetMethod(nameof(GetDeviceIdPatch),
                                                          BindingFlags.Static | BindingFlags.NonPublic) !.MethodHandle.GetFunctionPointer());

                MelonLogger.Log("Patched HWID; below two should match:");
                MelonLogger.Log($"Current: {SystemInfo.deviceUniqueIdentifier}");
                MelonLogger.Log($"Target:  {newId}");
            }
            catch (Exception ex)
            {
                MelonLogger.LogError(ex.ToString());
            }
        }
Пример #12
0
 public static Color GetLeaveIconColor() => DecodeColor(MelonPrefs.GetString(SettingsCategory, SettingLeaveIconColor));
Пример #13
0
 public static Color GetFriendJoinIconColor() => DecodeColor(MelonPrefs.GetString(SettingsCategory, SettingFriendsJoinColor));
Пример #14
0
        public static IEnumerator PopulateSettingsPanel(RectTransform settingsContentRoot)
        {
            yield return(null);

            yield return(null);

            yield return(null);

            var categoryPrefab = ourStuffBundle.SettingsCategory;
            var boolPrefab     = ourStuffBundle.SettingsBool;
            var textPrefab     = ourStuffBundle.SettingsText;
            var comboBoxPrefab = ourStuffBundle.SettingsComboBox;

            settingsContentRoot.DestroyChildren();

            var pinnedSettings = ExpansionKitSettings.ListPinnedPrefs(false).ToList();

            foreach (var keyValuePair in MelonPrefs.GetPreferences())
            {
                var categoryId = keyValuePair.Key;
                var prefDict   = keyValuePair.Value;

                if (ExpansionKitApi.CustomCategoryUIs.TryGetValue(categoryId, out var specificPrefab))
                {
                    Object.Instantiate(specificPrefab, settingsContentRoot, false);
                    continue;
                }

                var prefsToPopulate = prefDict.Where(it => !it.Value.Hidden).ToList();

                if (prefsToPopulate.Count == 0)
                {
                    continue;
                }

                var categoryUi = Object.Instantiate(categoryPrefab, settingsContentRoot, false);
                categoryUi.GetComponentInChildren <Text>().text = MelonPrefs.GetCategoryDisplayName(categoryId);
                var categoryUiContent     = categoryUi.transform.Find("CategoryEntries");
                var expandButtonTransform = categoryUi.transform.Find("ExpandButton");
                var expandButton          = expandButtonTransform.GetComponent <Button>();
                var expandButtonText      = expandButtonTransform.GetComponentInChildren <Text>();

                void SetExpanded(bool expanded)
                {
                    expandButtonText.text = expanded ? "^" : "V";
                    categoryUiContent.gameObject.SetActive(expanded);
                }

                expandButton.onClick.AddListener(new Action(() =>
                {
                    SetExpanded(ourCategoryExpanded[categoryId] = !ourCategoryExpanded[categoryId]);
                }));

                if (!ourCategoryExpanded.ContainsKey(categoryId))
                {
                    ourCategoryExpanded[categoryId] = !ExpansionKitSettings.IsCategoriesStartCollapsed();
                }

                SetExpanded(ourCategoryExpanded[categoryId]);

                foreach (var valuePair in prefsToPopulate)
                {
                    var prefId   = valuePair.Key;
                    var prefDesc = valuePair.Value;

                    switch (prefDesc.Type)
                    {
                    case MelonPrefs.MelonPreferenceType.STRING:
                    {
                        if (ExpansionKitApi.EnumSettings.TryGetValue((categoryId, prefId), out var enumValues))
                        {
                            var comboSetting = Object.Instantiate(comboBoxPrefab, categoryUiContent, false);
                            comboSetting.GetComponentInChildren <Text>().text = prefDesc.DisplayText ?? prefId;
                            var dropdown      = comboSetting.GetComponentInChildren <Dropdown>();
                            var options       = new Il2CppSystem.Collections.Generic.List <Dropdown.OptionData>();
                            var currentValue  = MelonPrefs.GetString(categoryId, prefId);
                            var selectedIndex = enumValues.Count;
                            for (var i = 0; i < enumValues.Count; i++)
                            {
                                var valueTuple = enumValues[i];
                                options.Add(new Dropdown.OptionData(valueTuple.DisplayName));
                                if (currentValue == valueTuple.SettingsValue)
                                {
                                    selectedIndex = i;
                                }
                            }
                            if (enumValues.All(it => it.SettingsValue != currentValue))
                            {
                                options.Add(new Dropdown.OptionData(currentValue));
                            }
                            dropdown.options = options;
                            dropdown.value   = selectedIndex;
                            dropdown.onValueChanged.AddListener(new Action <int>(value =>
                                {
                                    prefDesc.ValueEdited = value >= enumValues.Count
                                        ? currentValue
                                        : enumValues[value].SettingsValue;
                                }));
                        }
Пример #15
0
        public static IEnumerator PopulateSettingsPanel(RectTransform settingsContentRoot)
        {
            yield return(null);

            yield return(null);

            yield return(null);

            var categoryPrefab = ourStuffBundle.SettingsCategory;
            var boolPrefab     = ourStuffBundle.SettingsBool;
            var textPrefab     = ourStuffBundle.SettingsText;

            settingsContentRoot.DestroyChildren();

            var pinnedSettings = ExpansionKitSettings.ListPinnedPrefs(false).ToList();

            foreach (var keyValuePair in MelonPrefs.GetPreferences())
            {
                var categoryId = keyValuePair.Key;
                var prefDict   = keyValuePair.Value;

                if (ExpansionKitApi.CustomCategoryUIs.TryGetValue(categoryId, out var specificPrefab))
                {
                    Object.Instantiate(specificPrefab, settingsContentRoot, false);
                    continue;
                }

                var prefsToPopulate = prefDict.Where(it => !it.Value.Hidden).ToList();

                if (prefsToPopulate.Count == 0)
                {
                    continue;
                }

                var categoryUi = Object.Instantiate(categoryPrefab, settingsContentRoot, false);
                categoryUi.GetComponentInChildren <Text>().text = MelonPrefs.GetCategoryDisplayName(categoryId);
                var categoryUiContent     = categoryUi.transform.Find("CategoryEntries");
                var expandButtonTransform = categoryUi.transform.Find("ExpandButton");
                var expandButton          = expandButtonTransform.GetComponent <Button>();
                var expandButtonText      = expandButtonTransform.GetComponentInChildren <Text>();

                void SetExpanded(bool expanded)
                {
                    expandButtonText.text = expanded ? "^" : "V";
                    categoryUiContent.gameObject.SetActive(expanded);
                }

                expandButton.onClick.AddListener(new Action(() =>
                {
                    SetExpanded(ourCategoryExpanded[categoryId] = !ourCategoryExpanded[categoryId]);
                }));

                if (!ourCategoryExpanded.ContainsKey(categoryId))
                {
                    ourCategoryExpanded[categoryId] = !ExpansionKitSettings.IsCategoriesStartCollapsed();
                }

                SetExpanded(ourCategoryExpanded[categoryId]);

                foreach (var valuePair in prefsToPopulate)
                {
                    var prefId   = valuePair.Key;
                    var prefDesc = valuePair.Value;

                    switch (prefDesc.Type)
                    {
                    case MelonPrefs.MelonPreferenceType.STRING:
                    {
                        var textSetting = Object.Instantiate(textPrefab, categoryUiContent, false);
                        textSetting.GetComponentInChildren <Text>().text = prefDesc.DisplayText ?? prefId;
                        var textField = textSetting.GetComponentInChildren <InputField>();
                        textField.text = MelonPrefs.GetString(categoryId, prefId);
                        textField.onValueChanged.AddListener(new Action <string>(value =>
                            {
                                prefDesc.ValueEdited = value;
                            }));
                        textSetting.GetComponentInChildren <Button>().onClick.AddListener(new Action(() =>
                            {
                                BuiltinUiUtils.ShowInputPopup(prefDesc.DisplayText ?? prefId, textField.text,
                                                              InputField.InputType.Standard, false, "Done",
                                                              (result, _, __) => prefDesc.ValueEdited = textField.text = result);
                            }));
                        break;
                    }

                    case MelonPrefs.MelonPreferenceType.BOOL:
                        var boolSetting = Object.Instantiate(boolPrefab, categoryUiContent, false);
                        boolSetting.GetComponentInChildren <Text>().text = prefDesc.DisplayText ?? prefId;
                        var mainToggle = boolSetting.transform.Find("Toggle").GetComponent <Toggle>();
                        mainToggle.isOn = MelonPrefs.GetBool(categoryId, prefId);
                        mainToggle.onValueChanged.AddListener(new Action <bool>(
                                                                  isSet =>
                        {
                            prefDesc.ValueEdited = isSet.ToString().ToLowerInvariant();
                        }));
                        var pinToggle = boolSetting.transform.Find("PinToggle").GetComponent <Toggle>();
                        pinToggle.isOn = pinnedSettings.Contains((categoryId, prefId));
                        pinToggle.onValueChanged.AddListener(new Action <bool>(isSet =>
                        {
                            if (isSet)
                            {
                                ExpansionKitSettings.PinPref(categoryId, prefId);
                            }
                            else
                            {
                                ExpansionKitSettings.UnpinPref(categoryId, prefId);
                            }
                        }));
                        break;

                    case MelonPrefs.MelonPreferenceType.INT:
                    case MelonPrefs.MelonPreferenceType.FLOAT:
                    {
                        var textSetting = Object.Instantiate(textPrefab, categoryUiContent, false);
                        textSetting.GetComponentInChildren <Text>().text = prefDesc.DisplayText ?? prefId;
                        var textField = textSetting.GetComponentInChildren <InputField>();
                        textField.text        = MelonPrefs.GetString(categoryId, prefId);
                        textField.contentType = prefDesc.Type == MelonPrefs.MelonPreferenceType.INT
                                ? InputField.ContentType.IntegerNumber
                                : InputField.ContentType.DecimalNumber;
                        textField.onValueChanged.AddListener(new Action <string>(value =>
                            {
                                prefDesc.ValueEdited = value;
                            }));
                        textSetting.GetComponentInChildren <Button>().onClick.AddListener(new Action(() =>
                            {
                                BuiltinUiUtils.ShowInputPopup(prefDesc.DisplayText ?? prefId, textField.text,
                                                              InputField.InputType.Standard, prefDesc.Type == MelonPrefs.MelonPreferenceType.INT, "Done",
                                                              (result, _, __) => prefDesc.ValueEdited = textField.text = result);
                            }));
                        break;
                    }

                    default:
                        MelonLogger.LogError($"Unknown mod pref type {prefDesc.Type}");
                        break;
                    }
                }
            }
        }