예제 #1
0
        public static void RegisterSettings()
        {
            var category = MelonPreferences.CreateCategory("JoinNotifier", "Join Notifier");

            ShouldJoinBlink     = category.CreateEntry("BlinkIcon", true, "Blink HUD icon on join");
            ShouldPlayJoinSound = category.CreateEntry("PlaySound", true, "Play sound on join");
            JoinShowName        = category.CreateEntry("ShowJoinedName", true, "Show joined names");

            ShouldLeaveBlink     = category.CreateEntry("LeaveBlink", false, "Blink HUD icon on leave");
            ShouldPlayLeaveSound = category.CreateEntry("LeaveSound", false, "Play sound on leave");
            LeaveShowName        = category.CreateEntry("ShowLeaveName", false, "Show left names");

            SoundVolume = category.CreateEntry("SoundVolume", .3f, "Sound volume (0-1)");
            UseUiMixer  = category.CreateEntry("UseUiMixer", true, "Notifications are affected by UI volume slider");
            TextSize    = category.CreateEntry("TextSize", 36, "Text size (pt)");

            NotifyInPublic  = category.CreateEntry("NotifyInPublic", false, "Notify in public instances");
            NotifyInFriends = category.CreateEntry("NotifyInFriends", true, "Notify in friends[+] instances");
            NotifyInPrivate = category.CreateEntry("NotifyInPrivate", true, "Notify in private instances");

            ShowFriendsOnly = category.CreateEntry("ShowFriendsOnly", false, "Show friend join/leave only");
            JoinIconColor   = category.CreateEntry("JoinColor", "127 191 255", "Join icon color (r g b)");
            LeaveIconColor  = category.CreateEntry("LeaveColor", "153 82 51", "Leave icon color (r g b)");

            ShowFriendsInDifferentColor = category.CreateEntry("ShowFriendsInDifferentColor", true, "Show friend names in different color");
            FriendsJoinIconColor        = category.CreateEntry("FriendJoinColor", "224 224 0", "Friend join name color (r g b)");
            FriendsLeaveIconColor       = category.CreateEntry("FriendLeaveColor", "201 201 0", "Friend leave name color (r g b)");

            ShowFriendsAlways = category.CreateEntry("ShowFriendsAlways", false, "Show friend join/leave regardless of instance type");
            HideBlockedUsers  = category.CreateEntry("HideBlockedUsers", false, "Hide join/leave of blocked users");
            LogToConsole      = category.CreateEntry("LogToConsole", false, "Log user join/leave to console");
        }
예제 #2
0
        public override void OnApplicationStart()
        {
            InputSettings.ClickTimeThreshold       = 0.3f;
            InputSettings.DoubleClickTimeThreshold = 0.5f;
            InputSettings.HoldTimeThreshold        = 1f;
            InputSettings.TriggerThreshold         = 0.4f;

            inputSettingsCategory = MelonPreferences.CreateCategory(BuildInfo.Name, "Input System");
            ClickThresholdEntry   = (MelonPreferences_Entry <float>)inputSettingsCategory.CreateEntry(
                "ClickThreshold",
                InputSettings.ClickTimeThreshold,
                "Click Time-Threshold");

            DoubleClickThresholdEntry = (MelonPreferences_Entry <float>)inputSettingsCategory.CreateEntry(
                "DoubleClickThreshold",
                InputSettings.DoubleClickTimeThreshold,
                "Double-Click Time-Threshold");

            HoldTimeThresholdEntry = (MelonPreferences_Entry <float>)inputSettingsCategory.CreateEntry(
                "HoldThreshold",
                InputSettings.HoldTimeThreshold,
                "Hold Time-Threshold");

            TriggerThresholdEntry = (MelonPreferences_Entry <float>)inputSettingsCategory.CreateEntry(
                "TriggerThreshold",
                InputSettings.TriggerThreshold,
                "Trigger Threshold");

            ApplySettings();
        }
        public static void Init()
        {
            var category = MelonPreferences.CreateCategory("VibratorController");

            onlyTrusted = category.CreateEntry("Only Trusted", false);
            MelonCoroutines.Start(LoadClient());
            Timer timer = new Timer(200);

            timer.Elapsed += (_, __) => {
                if (client == null)
                {
                    return;
                }

                lock (messagesToSendPerTarget)
                {
                    foreach (var message in messagesToSendPerTarget)
                    {
                        client.Send(new Message()
                        {
                            Method = "VibratorControllerMessage", Target = message.Value.Target, Content = JsonConvert.SerializeObject(message.Value)
                        });
                    }
                    messagesToSendPerTarget.Clear();
                }
            };
            timer.Enabled = true;
        }
예제 #4
0
        public override void OnApplicationStart()
        {
            var category = MelonPreferences.CreateCategory(SettingsCategory, "Friends+ Home");

            StartupName = category.CreateEntry(SettingStartupName, nameof(InstanceAccessType.FriendsOfGuests), "Startup instance type");
            ButtonName  = category.CreateEntry(SettingButtonName, nameof(InstanceAccessType.FriendsOfGuests), "\"Go Home\" instance type");

            if (MelonHandler.Mods.Any(it => it.Info.Name == "UI Expansion Kit" && !it.Info.Version.StartsWith("0.1.")))
            {
                RegisterUix2Extension();
            }

            foreach (var methodInfo in typeof(VRCFlowManager).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly))
            {
                if (methodInfo.ReturnType != typeof(void) || methodInfo.GetParameters().Length != 0)
                {
                    continue;
                }

                if (!XrefScanner.XrefScan(methodInfo).Any(it => it.Type == XrefType.Global && it.ReadAsObject()?.ToString() == "Going to Home Location: "))
                {
                    continue;
                }

                MelonLogger.Msg($"Patched {methodInfo.Name}");
                HarmonyInstance.Patch(methodInfo, postfix: new HarmonyMethod(AccessTools.Method(typeof(FriendsPlusHomeMod), nameof(GoHomePatch))));
            }

            DoAfterUiManagerInit(OnUiManagerInit);
        }
        public override void OnApplicationStart()
        {
            settingsCategory             = MelonPreferences.CreateCategory("NoPerformanceStats", "No Performance Stats");
            disablePerformanceStatsEntry =
                settingsCategory.CreateEntry("DisablePerformanceStats", true, "Disable Performance Stats") as MelonPreferences_Entry <bool>;

            MethodInfo calculatePerformanceStatsMethod = typeof(AvatarPerformance).GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly).Single(
                m => m.Name.StartsWith("Method_Public_Static_Void_String_GameObject_AvatarPerformanceStats_") &&
                m.ReturnType == typeof(void) &&
                m.GetParameters().Length == 3);

            calculatePerformanceStats = Patch <CalculatePerformanceStats>(calculatePerformanceStatsMethod, GetDetour(nameof(CalculatePerformanceStatsPatch)));

            MethodInfo calculatePerformanceStatsEnumeratorMethod = typeof(AvatarPerformance).GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly).Single(
                m => m.Name.StartsWith("Method_Public_Static_IEnumerator_String_GameObject_AvatarPerformanceStats") && m.GetParameters().Length == 3);

            calculatePerformanceStatsEnumerator = Patch <CalculatePerformanceStatsEnumerator>(
                calculatePerformanceStatsEnumeratorMethod,
                GetDetour(nameof(CalculatePerformanceStatsEnumeratorPatch)));

            MethodInfo applyPerformanceFiltersMethod = typeof(AvatarPerformance).GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly).Single(
                m => m.Name.StartsWith("Method_Public_Static_IEnumerator_GameObject_AvatarPerformanceStats_PerformanceRating_MulticastDelegate") &&
                m.GetParameters().Length == 4);

            applyPerformanceFiltersEnumerator = Patch <ApplyPerformanceFiltersEnumerator>(
                applyPerformanceFiltersMethod,
                GetDetour(nameof(ApplyPerformanceFiltersPatch)));
        }
예제 #6
0
        internal static bool CreatePinnedPrefButton(MelonPreferences_Entry entry, Transform expandoRoot, PreloadedBundleContents bundle)
        {
            switch (entry)
            {
            case MelonPreferences_Entry <bool> boolEntry:
                CreatePinnedPrefButton(boolEntry, expandoRoot, bundle.QuickMenuToggle);
                return(true);

            case MelonPreferences_Entry <string> stringEntry:
                if (ExpansionKitApi.EnumSettings.TryGetValue((stringEntry.Category.Identifier, stringEntry.Identifier), out var possibleValues))
                {
                    CreatePinnedPrefButtonForString(stringEntry, possibleValues, expandoRoot, bundle.QuickMenuButton);
                    return(true);
                }

                break;
            }

            var entryType = entry.GetReflectedType();

            if (entryType.IsEnum)
            {
                typeof(PinnedPrefUtil).GetMethod(nameof(CreatePinnedPrefButtonForEnum), BindingFlags.Static | BindingFlags.NonPublic) !
                .MakeGenericMethod(entryType)
                .Invoke(null, new object[] { entry, expandoRoot, bundle.QuickMenuButton });

                return(true);
            }

            return(false);
        }
예제 #7
0
        internal static void RegisterSettings()
        {
            var avatarSearchModeName = "AvatarSearchMode";

            var category = MelonPreferences.CreateCategory(SettingsCategory, "FavCat");

            DatabasePath        = category.CreateEntry("DatabasePath", "./UserData", "Database directory path", is_hidden: true, dont_save_default: false);
            ImageCachePath      = category.CreateEntry("ImageCachePath", "./UserData", "Image cache directory path", is_hidden: true, dont_save_default: false);
            AnnoyingMessageSeen = category.CreateEntry("AnnoyingMessageSeen", "", is_hidden: true);

            EnableAvatarFavs = category.CreateEntry("EnableAvatarFavs", true, "Enable avatar favorites (restart required)");
            EnableWorldFavs  = category.CreateEntry("EnableWorldFavs", true, "Enable world favorites (restart required)");
            EnablePlayerFavs = category.CreateEntry("EnablePlayerFavs", true, "Enable player favorites (restart required)");

            ImageCacheMode    = category.CreateEntry("ImageCachingMode", "full", "Image caching mode");
            ImageCacheMaxSize = category.CreateEntry("ImageCacheMaxSize", 4096, "Image cache max size (MB)");
            HidePopupAfterFav = category.CreateEntry("HidePopupAfterFav", true, "Hide favorite popup after (un)favoriting a world or a player");

            MakeClickSounds     = category.CreateEntry("MakeClickSounds", true, "Click sounds");
            AvatarSearchMode    = category.CreateEntry(avatarSearchModeName, "select", "Avatar search result action");
            SortPlayersByOnline = category.CreateEntry(nameof(SortPlayersByOnline), true, "Show offline players at the end of the list");

            SortPlayersByJoinable = category.CreateEntry(nameof(SortPlayersByJoinable), true, "Show players in private instances at the end of the list");

            ExpansionKitApi.RegisterSettingAsStringEnum(SettingsCategory, "ImageCachingMode", new [] { ("full", "Full local image cache (fastest, safest)"), ("fast", "Fast, use more RAM"), ("builtin", "Preserve RAM, more API requests") });
        public static void SetString(string section, string name, string value)
        {
            MelonPreferences_Category category = MelonPreferences.GetCategory(section);

            if (category == null)
            {
                return;
            }
            MelonPreferences_Entry entry = category.GetEntry(name);

            if (entry == null)
            {
                return;
            }
            int   val_int   = 0;
            float val_float = 0f;

            if (value.ToLower().StartsWith("true") || value.ToLower().StartsWith("false"))
            {
                entry.SetValue(value.ToLower().StartsWith("true"));
            }
            else if (Int32.TryParse(value, out val_int))
            {
                entry.SetValue(val_int);
            }
            else if (float.TryParse(value, out val_float))
            {
                entry.SetValue(val_float);
            }
            else
            {
                entry.SetValue(value);
            }
        }
예제 #9
0
        public override void OnApplicationStart() // Runs after Game Initialization.
        {
            if (MelonDebug.IsEnabled() || Environment.CommandLine.Contains("--ct.debug"))
            {
                isDebug = true;
                MelonLogger.Msg("Debug mode is active");
            }

            melon               = MelonPreferences.CreateCategory(BuildInfo.Name, BuildInfo.Name);
            VRC_Pickup          = (MelonPreferences_Entry <bool>)melon.CreateEntry("EnablePickup", true, "Enable Pickup");
            VRC_Pickup_Objects  = (MelonPreferences_Entry <bool>)melon.CreateEntry("ShowPickupObjects", true, "Show Pickup Objects");
            VRC_SyncVideoPlayer = (MelonPreferences_Entry <bool>)melon.CreateEntry("ShowVideoPlayers", true, "Show Video Players");
            Pens               = (MelonPreferences_Entry <bool>)melon.CreateEntry("ShowPens", true, "Show Pens / Erasers");
            VRC_Station        = (MelonPreferences_Entry <bool>)melon.CreateEntry("EnableChairs", true, "Enable Chairs");
            VRC_MirrorReflect  = (MelonPreferences_Entry <bool>)melon.CreateEntry("ShowMirrors", true, "Show Mirrors");
            PostProcessing     = (MelonPreferences_Entry <bool>)melon.CreateEntry("EnablePostProcessing", true, "Enable Post Processing");
            VRC_AvatarPedestal = (MelonPreferences_Entry <bool>)melon.CreateEntry("ShowAvatarsPedestals", true, "Show Avatars Pedestals");

            try { CustomConfig.Load(); }
            catch
            {
                if (!File.Exists(CustomConfig.final) && isDebug)
                {
                    MelonLogger.Msg("Not an error > Old Config file does not exist, ignoring function.");
                }
            }

            MelonLogger.Msg("Initialized!");
        }
예제 #10
0
 public static void ToggleMirrorState(ref MelonPreferences_Entry <string> pref)
 {
     if (pref.Value == "MirrorFull")
     {
         pref.Value = "MirrorOpt";
     }
     else if (pref.Value == "MirrorOpt")
     {
         pref.Value = "MirrorCutout";
     }
     else if (pref.Value == "MirrorCutout")
     {
         pref.Value = "MirrorTransparent";
     }
     else if (pref.Value == "MirrorTransparent")
     {
         pref.Value = "MirrorCutoutSolo";
     }
     else if (pref.Value == "MirrorCutoutSolo")
     {
         pref.Value = "MirrorTransparentSolo";
     }
     else if (pref.Value == "MirrorTransparentSolo")
     {
         pref.Value = "MirrorFull";
     }
 }
예제 #11
0
        public static void RegisterSettings()
        {
            if (Utilities.HasMod("AdvancedInvites"))
            {
                AdvancedInvites = true;
            }
            var category = MelonPreferences.CreateCategory(categoryName, categoryName);

            AutoFollowInvites        = category.CreateEntry("AutoFollowInvites", autoFollowInvites, "Auto Follow Invite Predownloads");
            AutoFollowWorlds         = category.CreateEntry("AutoFollowWorlds", autoFollowWorlds, "Auto Join World Predownloads");
            AutoFollowFriends        = category.CreateEntry("AutoFollowFriends", autoFollowFriends, "Auto Join Friend Predownloads");
            ShowStatusOnQM           = category.CreateEntry("ShowStatusOnQM", showStatusOnQM, "Display download status on QM");
            HideQMStatusWhenInActive = category.CreateEntry("HideQMStatusWhenInActive", hideQMStatusWhenInActive, "Hide status on QM when not downloading");
            ShowStatusOnHud          = category.CreateEntry("ShowStatusOnHud", showStatusOnHud, "Display download status on HUD");
            ShowHudMessages          = category.CreateEntry("ShowHudMessages", showHudMessages, "Show Hud Messages");
            ShowPopupsOnComplete     = category.CreateEntry("ShowPopupsOnComplete", showPopupsOnComplete, "Show Popup On Complete");
            DownloadUserAgent        = category.CreateEntry("DownloadUserAgent", downloadUserAgent, null, null, true);

            //CVRStyle = category.CreateEntry("OverrideVRChatJoinWorldButtons", cvrStyle, "Override VRChat Join Buttons (CVR Style  & Requires Restart to Apply)") as MelonPreferences_Entry<bool>;
            if (AdvancedInvites)
            {
                TryUseAdvancedInvitePopup = category.CreateEntry("UseAdvancedInvitesPopup", tryUseAdvancedInvitePopup,
                                                                 "Accept invites using AdvancedInvites popup");
            }
        }
예제 #12
0
        public static void Store(int location)
        {
            MelonPreferences_Entry <string> melonPref = Main.savedPrefs;

            try
            {
                var updated = new System.Tuple <System.Tuple <bool, bool, bool, bool, bool>, System.Tuple <int, float, float, float, float, float, float>, System.Tuple <float, string, float, bool, Vector3, Vector3>, System.Tuple <float, float, float> >(
                    new System.Tuple <bool, bool, bool, bool, bool>(Main.FixShoulders.Value, Main.PinHipRotation.Value, Main.DoHipShifting.Value, Main.PreStraightenSpine.Value, Main.StraightenNeck.Value),
                    new System.Tuple <int, float, float, float, float, float, float>(Main.SpineRelaxIterations.Value, Main.MaxSpineAngleFwd.Value, Main.MaxSpineAngleBack.Value, Main.MaxNeckAngleFwd.Value,
                                                                                     Main.MaxNeckAngleBack.Value, Main.NeckPriority.Value, Main.StraightSpineAngle.Value), new System.Tuple <float, string, float, bool, Vector3, Vector3>(Main.StraightSpinePower.Value,
                                                                                                                                                                                                                                           Main.MeasureMode.Value, Main.WingspanMeasurementAdjustFactor.Value, Main.PlantFeet.Value, Main.HandAngleOffset.Value, Main.HandPositionOffset.Value),
                    new System.Tuple <float, float, float>(Main.ElbowGoalOffset.Value, Main.KneeGoalOffset.Value, Main.ChestGoalOffset.Value));
                var Dict = GetSaved();
                Dict[location]  = updated;
                melonPref.Value = string.Join(";", Dict.Select(s => String.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},{18},{19},{20},{21},{22},{23},{24},{25}", s.Key,
                                                                                  s.Value.Item1.Item1, s.Value.Item1.Item2, s.Value.Item1.Item3, s.Value.Item1.Item4, s.Value.Item1.Item5,
                                                                                  s.Value.Item2.Item1.ToString(), s.Value.Item2.Item2.ToString("F5").TrimEnd('0'), s.Value.Item2.Item3.ToString("F5").TrimEnd('0'), s.Value.Item2.Item4.ToString("F5").TrimEnd('0'),
                                                                                  s.Value.Item2.Item5.ToString("F5").TrimEnd('0'), s.Value.Item2.Item6.ToString("F5").TrimEnd('0'), s.Value.Item2.Item7.ToString("F5").TrimEnd('0'),
                                                                                  s.Value.Item3.Item1.ToString("F5").TrimEnd('0'), s.Value.Item3.Item2, s.Value.Item3.Item3.ToString("F5").TrimEnd('0'), s.Value.Item3.Item4,
                                                                                  s.Value.Item3.Item5.x.ToString("F5").TrimEnd('0'), s.Value.Item3.Item5.y.ToString("F5").TrimEnd('0'), s.Value.Item3.Item5.z.ToString("F5").TrimEnd('0'),
                                                                                  s.Value.Item3.Item6.x.ToString("F5").TrimEnd('0'), s.Value.Item3.Item6.y.ToString("F5").TrimEnd('0'), s.Value.Item3.Item6.z.ToString("F5").TrimEnd('0'),
                                                                                  s.Value.Item4.Item1.ToString("F5").TrimEnd('0'), s.Value.Item4.Item2.ToString("F5").TrimEnd('0'), s.Value.Item4.Item3.ToString("F5").TrimEnd('0')
                                                                                  )));
                Main.cat.SaveToFile();
            }
            catch (System.Exception ex) { Main.Logger.Error($"Error storing new saved pref\n" + ex.ToString()); }
        }
예제 #13
0
파일: Main.cs 프로젝트: Nirv-git/VRMods
        public override void OnApplicationStart()
        {
            hideCams      = MelonPreferences.CreateEntry(catagory, nameof(hideCams), false, "Hide Camera Indicators");
            shrinkCams    = MelonPreferences.CreateEntry(catagory, nameof(shrinkCams), false, "Shrink Indicators to .25x, Do not hide entirely");
            hideNameplate = MelonPreferences.CreateEntry(catagory, nameof(hideNameplate), false, "Hide Camera Nameplates");

            hideCamTex  = MelonPreferences.CreateEntry(catagory, nameof(hideCamTex), false, "Hide Camera Texture");
            recolorCams = MelonPreferences.CreateEntry(catagory, nameof(recolorCams), false, "Recolor Cameras");
            noGloss     = MelonPreferences.CreateEntry(catagory, nameof(noGloss), false, "Less glossiness on Cameras");

            noUIXButt = MelonPreferences.CreateEntry(catagory, nameof(noUIXButt), true, "UIX Button in 'Camera' Quick Menu");

            camColor         = MelonPreferences.CreateEntry(catagory, nameof(camColor), Color.black, "", "", true);
            colorList["Red"] = camColor.Value.r * 100; colorList["Green"] = camColor.Value.g * 100; colorList["Blue"] = camColor.Value.b * 100;


            hideCams.OnValueChanged      += UpdateAll;
            shrinkCams.OnValueChanged    += UpdateAll;
            hideNameplate.OnValueChanged += UpdateAll;
            recolorCams.OnValueChanged   += UpdateAll;
            hideCamTex.OnValueChanged    += UpdateAll;
            noGloss.OnValueChanged       += UpdateAll;

            NetworkEvents.OnAvatarInstantiated += OnAvatarInstantiated;
            NetworkEvents.OnPlayerLeft         += OnPlayerLeft;

            ExpansionKitApi.GetExpandedMenu(ExpandedMenu.CameraQuickMenu).AddSimpleButton("Other User's Camera Indicators", () =>
            {
                CamSettingsMenu();
            }, (button) => { UIXButt = button; UIXButt.SetActive(noUIXButt.Value); });
        }
예제 #14
0
        internal static T GetValue <T>(MelonPreferences_Entry entry)
        {
            TypeParser parser = GetParser(typeof(T));

            if (parser == null)
            {
                return(default);
예제 #15
0
        public override void OnApplicationStart()
        {
            category                  = MelonPreferences.CreateCategory("CloningBeGone", "CloningBeGone Settings");
            PublicCloningSetting      = category.CreateEntry(nameof(PublicCloningSetting), false, "Cloning setting in public instances");
            FriendsPlusCloningSetting = category.CreateEntry(nameof(FriendsPlusCloningSetting), false, "Cloning setting in friends+ instances");
            FriendsCloningSetting     = category.CreateEntry(nameof(FriendsCloningSetting), false, "Cloning setting in friend only instances");
            InvitePlusCloningSetting  = category.CreateEntry(nameof(InvitePlusCloningSetting), false, "Cloning setting in invite+ instances");
            InviteCloningSetting      = category.CreateEntry(nameof(InviteCloningSetting), false, "Cloning setting in invite only instances");

            foreach (MelonPreferences_Entry entry in category.Entries)
            {
                entry.OnValueChangedUntyped += OnPrefValueChanged;
            }

            cloningOnAvatars  = category.CreateEntry(nameof(cloningOnAvatars), new List <string>(), null, null, true);
            cloningOffAvatars = category.CreateEntry(nameof(cloningOffAvatars), new List <string>(), null, null, true);

            HarmonyInstance.Patch(typeof(NetworkManager).GetMethod("OnJoinedRoom"), new HarmonyMethod(typeof(CloningBeGoneMod).GetMethod(nameof(OnJoinedRoom))));

            NetworkEvents.OnInstanceChanged    += OnInstanceChange;
            NetworkEvents.OnAvatarInstantiated += OnAvatarInstantiated;

            if (VRCUtils.IsUIXPresent)
            {
                typeof(UIXManager).GetMethod("Init").Invoke(null, null);
            }
        }
예제 #16
0
        public override void OnApplicationStart()
        {
            MelonPreferences.CreateCategory("ReloadAvatars", "ReloadAvatars Settings");
            reloadAvatarPref     = (MelonPreferences_Entry <bool>)MelonPreferences.CreateEntry("ReloadAvatars", "ReloadAvatar", true, "Enable/Disable Reload Avatar Button");
            reloadAllAvatarsPref = (MelonPreferences_Entry <bool>)MelonPreferences.CreateEntry("ReloadAvatars", "ReloadAllAvatars", true, "Enable/Disable Reload All Avatars Button");

            MethodInfo reloadAvatarMethod     = typeof(VRCPlayer).GetMethods().First(mi => mi.Name.StartsWith("Method_Private_Void_Boolean_") && mi.Name.Length < 31 && mi.GetParameters().Any(pi => pi.IsOptional));
            MethodInfo reloadAllAvatarsMethod = typeof(VRCPlayer).GetMethods().Where(mi => mi.Name.StartsWith("Method_Public_Void_Boolean_") && mi.Name.Length < 30 && mi.GetParameters().Any(pi => pi.IsOptional)).First(); // Both methods seem to do the same thing

            ExpansionKitApi.GetExpandedMenu(ExpandedMenu.UserQuickMenu).AddSimpleButton("Reload Avatar", new Action(() =>
            {
                try
                {
                    reloadAvatarMethod.Invoke(QuickMenu.prop_QuickMenu_0.field_Private_Player_0.field_Internal_VRCPlayer_0, new object[] { true });
                }
                catch (Exception ex)
                {
                    MelonLogger.Error("Error while reloading single avatar:\n" + ex.ToString());
                } // Ignore
            }), new Action <GameObject>((gameObject) => { reloadAvatarButton = gameObject; reloadAvatarButton.SetActive(reloadAllAvatarsPref.Value); }));

            ExpansionKitApi.GetExpandedMenu(ExpandedMenu.QuickMenu).AddSimpleButton("Reload All Avatars", new Action(() =>
            {
                try
                {
                    reloadAllAvatarsMethod.Invoke(VRCPlayer.field_Internal_Static_VRCPlayer_0, new object[] { true });
                }
                catch (Exception ex)
                {
                    MelonLogger.Error("Error while reloading all avatars:\n" + ex.ToString());
                } // Ignore
            }), new Action <GameObject>((gameObject) => { reloadAllAvatarsButton = gameObject; reloadAllAvatarsButton.SetActive(reloadAvatarPref.Value); }));
            MelonLogger.Msg("Initialized!");
        }
예제 #17
0
        public override void Init()
        {
            AvatarInfoMenuButton = MelonPreferences.CreateEntry("UserInfoExtensionsSettings", nameof(AvatarInfoMenuButton), true, "Show \"Avatar Info Menu\" button in Avatar Menu");

            ExpansionKitApi.GetExpandedMenu(ExpandedMenu.AvatarMenu).AddSimpleButton("Avatar Info Menu", new Action(() => { avatarInfoMenu?.Show(); OnMenuShown(); }), new Action <GameObject>((go) =>
            {
                avatarInfoMenuButtonGameObject = go;
                GetAvatarAuthor.avatarPage.GetComponent <EnableDisableListener>().OnDisabled += new Action(() => avatarInfoMenu?.Hide());
            }));

            avatarInfoMenu = ExpansionKitApi.CreateCustomFullMenuPopup(new LayoutDescription()
            {
                RowHeight  = 80,
                NumColumns = 3,
                NumRows    = 5
            });
            avatarInfoMenu.AddLabel("Avatar information:");
            avatarInfoMenu.AddSpacer();
            avatarInfoMenu.AddSimpleButton("Back", new Action(() => avatarInfoMenu.Hide()));
            avatarInfoMenu.AddSimpleButton("", new Action(() => { }), new Action <GameObject>((gameObject) => authorNameLabel = gameObject.transform.GetChild(0).GetComponent <Text>()));
            avatarInfoMenu.AddSimpleButton("Show Avatar Description", new Action(() => { avatarInfoMenu.Hide(); UiManager.OpenSmallPopup("Description:", avatar.description == null ? "" : avatar.description, "Close", UiManager.ClosePopup); }));
            avatarInfoMenu.AddSimpleButton("", new Action(() => { }), new Action <GameObject>((gameObject) => avatarNameLabel  = gameObject.transform.GetChild(0).GetComponent <Text>()));
            avatarInfoMenu.AddSimpleButton("", new Action(() => { }), new Action <GameObject>((gameObject) => platformLabel    = gameObject.transform.GetChild(0).GetComponent <Text>()));
            avatarInfoMenu.AddSimpleButton("", new Action(() => { }), new Action <GameObject>((gameObject) => releaseTypeLabel = gameObject.transform.GetChild(0).GetComponent <Text>()));
            avatarInfoMenu.AddSimpleButton("", new Action(() => { }), new Action <GameObject>((gameObject) => lastUpdatedLabel = gameObject.transform.GetChild(0).GetComponent <Text>()));
            avatarInfoMenu.AddSimpleButton("", new Action(() => { }), new Action <GameObject>((gameObject) => VersionLabel     = gameObject.transform.GetChild(0).GetComponent <Text>()));
        }
예제 #18
0
 internal override void Load(MelonPreferences_Entry entry, TomlObject obj)
 {
     if (obj.Kind == ObjectKind.String)
     {
         entry.SetValue(((TomlString)obj).Value);
     }
 }
예제 #19
0
파일: Main.cs 프로젝트: Nirv-git/VRMods
        public override void OnApplicationStart()
        {
            Logger = new MelonLogger.Instance("DisableControllerOverlay", ConsoleColor.DarkYellow);

            cat = MelonPreferences.CreateCategory("DisableControllerOverlay", "DisableControllerOverlay");
            disableToolTipsOnLoad = MelonPreferences.CreateEntry("DisableControllerOverlay", nameof(disableToolTipsOnLoad), true, "Disable Controller Tooltips on Game Load");
            disableToolTips       = MelonPreferences.CreateEntry("DisableControllerOverlay", nameof(disableToolTips), true, "Disable Controller Tooltips");
            disableMeshOnly       = MelonPreferences.CreateEntry("DisableControllerOverlay", nameof(disableMeshOnly), true, "Disable Controller Mesh Only");

            disableToolTips.OnValueChanged += disableChange;
            disableMeshOnly.OnValueChanged += disableChange;

            var toolTipsMenu = ExpansionKitApi.CreateCustomQuickMenuPage(LayoutDescriptionCustom.QuickMenu1Column5Row);

            ExpansionKitApi.GetExpandedMenu(ExpandedMenu.UiElementsQuickMenu).AddSimpleButton("Controller Tooltips", () => toolTipsMenu.Show());
            toolTipsMenu.AddLabel("Controller Tooltips");
            toolTipsMenu.AddToggleButton("Disable Controller Tooltips", (action) =>
            {
                disableToolTips.Value = !disableToolTips.Value;
            }, () => disableToolTips.Value);
            toolTipsMenu.AddToggleButton("Disable Controller Mesh Only", (action) =>
            {
                disableMeshOnly.Value = !disableMeshOnly.Value;
            }, () => disableMeshOnly.Value);
            toolTipsMenu.AddToggleButton("Disable on Game Load", (action) =>
            {
                disableToolTipsOnLoad.Value = !disableToolTipsOnLoad.Value;
            }, () => disableToolTipsOnLoad.Value);
            toolTipsMenu.AddSimpleButton("Close", () => toolTipsMenu.Hide());
        }
예제 #20
0
파일: Config.cs 프로젝트: loukylor/VRC-Mods
 public static void Init()
 {
     category    = MelonPreferences.CreateCategory("InstanceHistory Config");
     useUIX      = category.CreateEntry(nameof(useUIX), true, "Should use UIX instead of regular buttons", null, !InstanceHistoryMod.HasUIX);
     openButtonX = category.CreateEntry(nameof(openButtonX), 0f, "X position of button. Does not apply when using UIX.");
     openButtonY = category.CreateEntry(nameof(openButtonY), 0f, "Y position of button. Does not apply when using UIX.");
 }
예제 #21
0
        public override void OnApplicationStart()
        {
            var category = MelonPreferences.CreateCategory(SettingsCategory, "Lag Free Screenshots");

            ourEnabled           = category.CreateEntry(SettingEnableMod, true, "Enabled");
            ourResolution        = category.CreateEntry(SettingScreenshotResolution, PresetScreenshotSizes.Default, "Screenshot resolution override");
            ourFormat            = category.CreateEntry(SettingScreenshotFormat, "png", "Screenshot format");
            ourJpegPercent       = category.CreateEntry(SettingJpegPercent, 95, "JPEG quality (0-100)");
            ourAutorotation      = category.CreateEntry(SettingAutorotation, true, "Rotate picture to match camera");
            ourMetadata          = category.CreateEntry(SettingMetadata, false, "Save metadata in picture");
            ourRecommendedMaxFb  = category.CreateEntry(SettingRecommendedMaximumFb, 1024, "Try to keep framebuffer below (MB) by reducing MSAA");
            ourCustomResolutionX = category.CreateEntry(SettingCustomResolutionX, 1920, "Custom screenshot resolution (X)");
            ourCustomResolutionY = category.CreateEntry(SettingCustomResolutionY, 1080, "Custom screenshot resolution (Y)");

            if (!MelonHandler.Mods.Any(it => it.Info.Name == "UI Expansion Kit" && it.Assembly.GetName().Version >= new Version(0, 2, 6)))
            {
                MelonLogger.Error("UI Expansion Kit is not found. Lag Free Screenshots will not work.");
                return;
            }

            HarmonyInstance.Patch(
                typeof(CameraTakePhotoEnumerator).GetMethod("MoveNext"),
                new HarmonyMethod(AccessTools.Method(typeof(LagFreeScreenshotsMod), nameof(MoveNextPatchAsyncReadback))));

            AddEnumSettings();
        }
예제 #22
0
        public override void OnApplicationStart()
        {
            MelonCoroutines.Start(CheckUIManager());
            MelonPreferences_Category Category = MelonPreferences.CreateCategory("InstanceJoiner", "InstanceJoiner");

            ButtonsX = Category.CreateEntry("ButtonsX", 0, "Button Position X");
            ButtonsY = Category.CreateEntry("ButtonsY", 1, "Button Position Y");
        }
예제 #23
0
            public EntryDelegateWrapper(MelonPreferences_Entry <T> entry, ConfigElement <T> config)
            {
                this.entry  = entry;
                this.config = config;
                var evt = entry.GetType().GetEvent("OnValueChangedUntyped");

                evt.AddEventHandler(entry, Delegate.CreateDelegate(evt.EventHandlerType, this, GetType().GetMethod("OnChanged")));
            }
예제 #24
0
파일: Main.cs 프로젝트: Nirv-git/VRMods
        public override void OnApplicationStart()
        {
            buttX = MelonPreferences.CreateEntry(catagory, nameof(buttX), 200f, "X position of button");
            buttY = MelonPreferences.CreateEntry(catagory, nameof(buttY), -60f, "Y position of button");

            loadAssets();
            VRCUtils.OnUiManagerInit += Init;
        }
예제 #25
0
        public static void Init()
        {
            enableAlwaysOnButton  = CloningBeGoneMod.category.CreateEntry(nameof(enableAlwaysOnButton), true, "Enable/Disable the \"Always have cloning on with this avatar\" button");
            enableAlwaysOffButton = CloningBeGoneMod.category.CreateEntry(nameof(enableAlwaysOffButton), true, "Enable/Disable the \"Always have cloning off with this avatar\" button");
            enableAlwaysOnButton.OnValueChangedUntyped  += OnPrefChanged;
            enableAlwaysOffButton.OnValueChangedUntyped += OnPrefChanged;

            UiManager.OnQuickMenuIndexSet += OnSetMenuIndexCalled;

            ICustomLayoutedMenu menu = ExpansionKitApi.GetExpandedMenu(ExpandedMenu.QuickMenu);

            menu.AddToggleButton("Always have cloning on with this avatar", new Action <bool>((state) =>
            {
                if (ignore)
                {
                    return;
                }

                if (state)
                {
                    CloningBeGoneMod.cloningOnAvatars.Value.Add(Player.prop_Player_0.prop_ApiAvatar_0.id);
                }
                else
                {
                    CloningBeGoneMod.cloningOnAvatars.Value.Remove(Player.prop_Player_0.prop_ApiAvatar_0.id);
                }

                if (RoomManager.field_Internal_Static_ApiWorldInstance_0 != null)
                {
                    CloningBeGoneMod.CheckAccessType(RoomManager.field_Internal_Static_ApiWorldInstance_0.type);
                }
                CloningBeGoneMod.OnAvatarInstantiated(Player.prop_Player_0.prop_ApiAvatar_0);
            }), null, new Action <GameObject>((gameObject) => { alwaysOnButton = gameObject; alwaysOnButton?.SetActive(enableAlwaysOnButton.Value); }));

            menu.AddToggleButton("Always have cloning off with this avatar", new Action <bool>((state) =>
            {
                if (ignore)
                {
                    return;
                }

                if (state)
                {
                    CloningBeGoneMod.cloningOffAvatars.Value.Add(Player.prop_Player_0.prop_ApiAvatar_0.id);
                }
                else
                {
                    CloningBeGoneMod.cloningOffAvatars.Value.Remove(Player.prop_Player_0.prop_ApiAvatar_0.id);
                }

                if (RoomManager.field_Internal_Static_ApiWorldInstance_0 != null)
                {
                    CloningBeGoneMod.CheckAccessType(RoomManager.field_Internal_Static_ApiWorldInstance_0.type);
                }
                CloningBeGoneMod.OnAvatarInstantiated(Player.prop_Player_0.prop_ApiAvatar_0);
            }), null, new Action <GameObject>((gameObject) => { alwaysOffButton = gameObject; alwaysOffButton?.SetActive(enableAlwaysOnButton.Value); }));
        }
예제 #26
0
        public override void OnApplicationStart()
        {
            Logger = new MelonLogger.Instance("NearClipPlaneAdj", ConsoleColor.DarkYellow);

            MelonPreferences.CreateCategory("NearClipAdj", "NearClipPlane Adjuster");
            changeClipOnLoad = MelonPreferences.CreateEntry <bool>("NearClipAdj", "changeClipOnLoad", true, "Change NearClip on world load");
            UIX_butts_QM     = MelonPreferences.CreateEntry("NearClipAdj", "UIX_butts_QM", true, "Place buttons in Settings QM instead of Settings Big Menu");
            keybindsEnabled  = MelonPreferences.CreateEntry <bool>("NearClipAdj", "Keyboard", true, "Keyboard Shortcuts: '[' - 0.0001, ']' - 0.05");

            changeUIcam    = MelonPreferences.CreateEntry <bool>("NearClipAdj", "changeUIcam", true, "Change UI Camera Nearclip");
            smallerDefault = MelonPreferences.CreateEntry <bool>("NearClipAdj", "SmallerDefault", false, "Smaller Default Nearclip on World Change - 0.001 vs 0.01");
            raiseNearClip  = MelonPreferences.CreateEntry <bool>("NearClipAdj", "RaiseOnQuickMenu", false, "If using smaller Default Nearclip (0.001) raise to 0.01 when Quick Menu opens.");

            AMAPI_en               = MelonPreferences.CreateEntry <bool>("NearClipAdj", "AMAPI_en", true, "Action Menu API Support (Requires Restart)");
            amapi_ModsFolder       = MelonPreferences.CreateEntry("NearClipAdj", "amapi_ModsFolder", false, "Place Action Menu in 'Mods' Sub Menu instead of 'Config' menu (Restert Required)");
            defaultChangeBlackList = MelonPreferences.CreateEntry("NearClipAdj", "defaultChangeBlackList", true, "Check a blacklist for worlds to not auto change the NearClip on (Restart Required to Enable)");

            ExpansionKitApi.GetExpandedMenu(ExpandedMenu.SettingsMenu).AddSimpleButton("Nearplane-0.05", (() => ChangeNearClipPlane(.05f, true)), (butt) => { n05 = butt; butt.SetActive(!UIX_butts_QM.Value); });
            ExpansionKitApi.GetExpandedMenu(ExpandedMenu.SettingsMenu).AddSimpleButton("Nearplane-0.01", (() => ChangeNearClipPlane(.01f, true)), (butt) => { n01 = butt; butt.SetActive(!UIX_butts_QM.Value); });
            ExpansionKitApi.GetExpandedMenu(ExpandedMenu.SettingsMenu).AddSimpleButton("Nearplane-0.001", (() => ChangeNearClipPlane(.001f, true)), (butt) => { n001 = butt; butt.SetActive(!UIX_butts_QM.Value); });
            ExpansionKitApi.GetExpandedMenu(ExpandedMenu.SettingsMenu).AddSimpleButton("Nearplane-0.0001", (() => ChangeNearClipPlane(.0001f, true)), (butt) => { n0001 = butt; butt.SetActive(!UIX_butts_QM.Value); });

            var clips = new float[] {
                .05f,
                .01f,
                .001f,
                .0001f,
            };

            var Menu = ExpansionKitApi.CreateCustomQuickMenuPage(LayoutDescriptionCustom.QuickMenu1Column6Row);

            ExpansionKitApi.GetExpandedMenu(ExpandedMenu.UiElementsQuickMenu).AddSimpleButton("Near Clipping Plane Distance", () => Menu.Show(), (butt) => { QMbutt = butt; butt.SetActive(UIX_butts_QM.Value); });
            Menu.AddLabel("Near Clipping Plane Distance");
            foreach (var clip in clips)
            {
                Menu.AddSimpleButton($"Nearplane-{clip}", (() => ChangeNearClipPlane(clip, true)));
            }
            Menu.AddSimpleButton("Close", () => Menu.Hide());

            Logger.Msg("Registering components...");
            ClassInjector.RegisterTypeInIl2Cpp <EnableDisableListener>();
            MelonCoroutines.Start(OnLoad());

            if (MelonHandler.Mods.Any(m => m.Info.Name == "ActionMenuApi") && AMAPI_en.Value)
            {
                CustomActionMenu.InitUi();
            }
            else
            {
                Logger.Msg("ActionMenuApi is missing, or setting is toggled off in Mod Settings - Not adding controls to ActionMenu");
            }

            if (defaultChangeBlackList.Value)
            {
                GetBlackList();
            }
        }
예제 #27
0
        public static void RegisterSettings()
        {
            var category = MelonPreferences.CreateCategory("BetterLoadingScreen", "Better Loading Screen");

            ShowLoadingMessages = category.CreateEntry("LoadingMessages", false, "Show loading messages. (Enable for LoadingScreenPictures compatibility)");
            WarpTunnel          = category.CreateEntry("Warp Tunnel", true, "Toggle warp tunnel (good for reducing motion)");
            VrcLogo             = category.CreateEntry("Vrchat Logo", true, "Toggle VRChat logo");
            ModSounds           = category.CreateEntry("Mod Sounds", true, "Toggle mod music");
        }
예제 #28
0
파일: Main.cs 프로젝트: Nirv-git/VRMods
 public override void OnApplicationStart()
 {
     cat   = MelonPreferences.CreateCategory(catagory, "QMVolumePercent Settings");
     textR = MelonPreferences.CreateEntry(catagory, nameof(textR), 100, "Text Red (0-100)");
     textG = MelonPreferences.CreateEntry(catagory, nameof(textG), 100, "Text Green (0-100)");
     textB = MelonPreferences.CreateEntry(catagory, nameof(textB), 100, "Text Blue (0-100)");
     MelonCoroutines.Start(OnLoad());
     OnPreferencesSaved();
 }
예제 #29
0
 public override void OnApplicationStart()
 {
     ModCategory     = MelonPreferences.CreateCategory("CustomConsoleTitle", "CustomConsoleTitle");
     CustomTitleText = ModCategory.CreateEntry("TitleText", "Being a Cutie!", "Title Text",
                                               "Text to show on the Console Window Title");
     _titleString  = GetFormattedTitleText();
     Console.Title = string.Format(_titleString);
     Logger.Msg($"Set console title to: {_titleString}");
 }
예제 #30
0
        public override void Init()
        {
            AuthorFromSocialMenuButton = MelonPreferences.CreateEntry("UserInfoExtensionsSettings", nameof(AuthorFromSocialMenuButton), false, "Show \"Avatar Author\" button in Social Menu");
            AuthorFromAvatarMenuButton = MelonPreferences.CreateEntry("UserInfoExtensionsSettings", nameof(AuthorFromAvatarMenuButton), true, "Show \"Avatar Author\" button in Avatar Menu");

            UserInfoExtensionsMod.userDetailsMenu.AddSimpleButton("Avatar Author", FromSocial, new Action <GameObject>((gameObject) => { authorFromSocialMenuButtonGameObject = gameObject; gameObject.SetActive(AuthorFromSocialMenuButton.Value); }));
            UIExpansionKit.API.ExpansionKitApi.GetExpandedMenu(UIExpansionKit.API.ExpandedMenu.AvatarMenu).AddSimpleButton("Avatar Author", FromAvatar, new Action <GameObject>((gameObject) => { authorFromAvatarMenuButtonGameObject = gameObject; gameObject.SetActive(AuthorFromAvatarMenuButton.Value); }));
            UserInfoExtensionsMod.menu.AddSimpleButton("Avatar Author", FromSocial);
            UserInfoExtensionsMod.menu.AddSpacer();
        }