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"); }
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; }
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))); }
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); }
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); } }
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!"); }
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"; } }
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"); } }
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()); } }
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); }); }
internal static T GetValue <T>(MelonPreferences_Entry entry) { TypeParser parser = GetParser(typeof(T)); if (parser == null) { return(default);
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); } }
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!"); }
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>())); }
internal override void Load(MelonPreferences_Entry entry, TomlObject obj) { if (obj.Kind == ObjectKind.String) { entry.SetValue(((TomlString)obj).Value); } }
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()); }
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."); }
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(); }
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"); }
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"))); }
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; }
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); })); }
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(); } }
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"); }
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(); }
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}"); }
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(); }