Advertisement
Trsak

Untitled

Nov 6th, 2020
2,167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 40.30 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using MenuAPI;
  7. using Newtonsoft.Json;
  8. using CitizenFX.Core;
  9. using static CitizenFX.Core.UI.Screen;
  10. using static CitizenFX.Core.Native.API;
  11. using static vMenuClient.CommonFunctions;
  12. using static vMenuShared.ConfigManager;
  13. using static vMenuShared.PermissionsManager;
  14.  
  15. namespace vMenuClient
  16. {
  17.     public class MainMenu : BaseScript
  18.     {
  19.         #region Variables
  20.         //public static MenuPool Mp { get; } = new MenuPool();
  21.  
  22.         private bool firstTick = true;
  23.         public static bool PermissionsSetupComplete => ArePermissionsSetup;
  24.         public static bool ConfigOptionsSetupComplete = false;
  25.  
  26.         public static Control MenuToggleKey { get { return MenuController.MenuToggleKey; } private set { MenuController.MenuToggleKey = value; } } // M by default (InteractionMenu)
  27.         public static int NoClipKey { get; private set; } = 289; // F2 by default (ReplayStartStopRecordingSecondary)
  28.         public static Menu Menu { get; private set; }
  29.         public static Menu PlayerSubmenu { get; private set; }
  30.         public static Menu VehicleSubmenu { get; private set; }
  31.         public static Menu WorldSubmenu { get; private set; }
  32.  
  33.         public static PlayerOptions PlayerOptionsMenu { get; private set; }
  34.         public static OnlinePlayers OnlinePlayersMenu { get; private set; }
  35.         public static BannedPlayers BannedPlayersMenu { get; private set; }
  36.         public static SavedVehicles SavedVehiclesMenu { get; private set; }
  37.         public static PersonalVehicle PersonalVehicleMenu { get; private set; }
  38.         public static VehicleOptions VehicleOptionsMenu { get; private set; }
  39.         public static VehicleSpawner VehicleSpawnerMenu { get; private set; }
  40.         public static PlayerAppearance PlayerAppearanceMenu { get; private set; }
  41.         public static MpPedCustomization MpPedCustomizationMenu { get; private set; }
  42.         public static TimeOptions TimeOptionsMenu { get; private set; }
  43.         public static WeatherOptions WeatherOptionsMenu { get; private set; }
  44.         public static WeaponOptions WeaponOptionsMenu { get; private set; }
  45.         public static WeaponLoadouts WeaponLoadoutsMenu { get; private set; }
  46.         public static Recording RecordingMenu { get; private set; }
  47.         public static MiscSettings MiscSettingsMenu { get; private set; }
  48.         public static VoiceChat VoiceChatSettingsMenu { get; private set; }
  49.         public static About AboutMenu { get; private set; }
  50.         public static bool NoClipEnabled { get { return NoClip.IsNoclipActive(); } set { NoClip.SetNoclipActive(value); } }
  51.         public static IPlayerList PlayersList;
  52.  
  53.         public static bool DebugMode = GetResourceMetadata(GetCurrentResourceName(), "client_debug_mode", 0) == "true" ? true : false;
  54.         public static bool EnableExperimentalFeatures = (GetResourceMetadata(GetCurrentResourceName(), "experimental_features_enabled", 0) ?? "0") == "1";
  55.         public static string Version { get { return GetResourceMetadata(GetCurrentResourceName(), "version", 0); } }
  56.  
  57.         public static bool DontOpenMenus { get { return MenuController.DontOpenAnyMenu; } set { MenuController.DontOpenAnyMenu = value; } }
  58.         public static bool DisableControls { get { return MenuController.DisableMenuButtons; } set { MenuController.DisableMenuButtons = value; } }
  59.  
  60.         private const int currentCleanupVersion = 2;
  61.         #endregion
  62.  
  63.         /// <summary>
  64.         /// Constructor.
  65.         /// </summary>
  66.         public MainMenu()
  67.         {
  68.             PlayersList = new NativePlayerList(Players);
  69.  
  70.             #region cleanup unused kvps
  71.             int tmp_kvp_handle = StartFindKvp("");
  72.             bool cleanupVersionChecked = false;
  73.             List<string> tmp_kvp_names = new List<string>();
  74.             while (true)
  75.             {
  76.                 string k = FindKvp(tmp_kvp_handle);
  77.                 if (string.IsNullOrEmpty(k))
  78.                 {
  79.                     break;
  80.                 }
  81.                 if (k == "vmenu_cleanup_version")
  82.                 {
  83.                     if (GetResourceKvpInt("vmenu_cleanup_version") >= currentCleanupVersion)
  84.                     {
  85.                         cleanupVersionChecked = true;
  86.                     }
  87.                 }
  88.                 tmp_kvp_names.Add(k);
  89.             }
  90.             EndFindKvp(tmp_kvp_handle);
  91.  
  92.             if (!cleanupVersionChecked)
  93.             {
  94.                 SetResourceKvpInt("vmenu_cleanup_version", currentCleanupVersion);
  95.                 foreach (string kvp in tmp_kvp_names)
  96.                 {
  97.                     if (currentCleanupVersion == 1 || currentCleanupVersion == 2)
  98.                     {
  99.                         if (!kvp.StartsWith("settings_") && !kvp.StartsWith("vmenu") && !kvp.StartsWith("veh_") && !kvp.StartsWith("ped_") && !kvp.StartsWith("mp_ped_"))
  100.                         {
  101.                             DeleteResourceKvp(kvp);
  102.                             Debug.WriteLine($"[vMenu] [cleanup id: 1] Removed unused (old) KVP: {kvp}.");
  103.                         }
  104.                     }
  105.                     if (currentCleanupVersion == 2)
  106.                     {
  107.                         if (kvp.StartsWith("mp_char"))
  108.                         {
  109.                             DeleteResourceKvp(kvp);
  110.                             Debug.WriteLine($"[vMenu] [cleanup id: 2] Removed unused (old) KVP: {kvp}.");
  111.                         }
  112.                     }
  113.                 }
  114.                 Debug.WriteLine("[vMenu] Cleanup of old unused KVP items completed.");
  115.             }
  116.             #endregion
  117.  
  118.             if (EnableExperimentalFeatures)
  119.             {
  120.                 RegisterCommand("testped", new Action<dynamic, List<dynamic>, string>((dynamic source, List<dynamic> args, string rawCommand) =>
  121.                 {
  122.                     PedHeadBlendData data = Game.PlayerPed.GetHeadBlendData();
  123.                     Debug.WriteLine(JsonConvert.SerializeObject(data, Formatting.Indented));
  124.                 }), false);
  125.  
  126.                 RegisterCommand("tattoo", new Action<dynamic, List<dynamic>, string>((dynamic source, List<dynamic> args, string rawCommand) =>
  127.                 {
  128.                     if (args != null && args[0] != null && args[1] != null)
  129.                     {
  130.                         Debug.WriteLine(args[0].ToString() + " " + args[1].ToString());
  131.                         TattooCollectionData d = Game.GetTattooCollectionData(int.Parse(args[0].ToString()), int.Parse(args[1].ToString()));
  132.                         Debug.WriteLine("check");
  133.                         Debug.Write(JsonConvert.SerializeObject(d, Formatting.Indented) + "\n");
  134.                     }
  135.                 }), false);
  136.  
  137.                 RegisterCommand("clearfocus", new Action<dynamic, List<dynamic>, string>((dynamic source, List<dynamic> args, string rawCommand) =>
  138.                 {
  139.                     SetNuiFocus(false, false);
  140.                 }), false);
  141.             }
  142.  
  143.             RegisterCommand("vmenuclient", new Action<dynamic, List<dynamic>, string>((dynamic source, List<dynamic> args, string rawCommand) =>
  144.             {
  145.                 if (args != null)
  146.                 {
  147.                     if (args.Count > 0)
  148.                     {
  149.                         if (args[0].ToString().ToLower() == "debug")
  150.                         {
  151.                             DebugMode = !DebugMode;
  152.                             Notify.Custom($"Debug mode is now set to: {DebugMode}.");
  153.                             // Set discord rich precense once, allowing it to be overruled by other resources once those load.
  154.                             if (DebugMode)
  155.                             {
  156.                                 SetRichPresence($"Debugging vMenu {Version}!");
  157.                             }
  158.                             else
  159.                             {
  160.                                 SetRichPresence($"Enjoying FiveM!");
  161.                             }
  162.                         }
  163.                         else if (args[0].ToString().ToLower() == "gc")
  164.                         {
  165.                             GC.Collect();
  166.                             Debug.Write("Cleared memory.\n");
  167.                         }
  168.                         else if (args[0].ToString().ToLower() == "dump")
  169.                         {
  170.                             Notify.Info("A full config dump will be made to the console. Check the log file. This can cause lag!");
  171.                             Debug.WriteLine("\n\n\n########################### vMenu ###########################");
  172.                             Debug.WriteLine($"Running vMenu Version: {Version}, Experimental features: {EnableExperimentalFeatures}, Debug mode: {DebugMode}.");
  173.                             Debug.WriteLine("\nDumping a list of all KVPs:");
  174.                             int handle = StartFindKvp("");
  175.                             List<string> names = new List<string>();
  176.                             while (true)
  177.                             {
  178.                                 string k = FindKvp(handle);
  179.                                 if (string.IsNullOrEmpty(k))
  180.                                 {
  181.                                     break;
  182.                                 }
  183.                                 //if (!k.StartsWith("settings_") && !k.StartsWith("vmenu") && !k.StartsWith("veh_") && !k.StartsWith("ped_") && !k.StartsWith("mp_ped_"))
  184.                                 //{
  185.                                 //    DeleteResourceKvp(k);
  186.                                 //}
  187.                                 names.Add(k);
  188.                             }
  189.                             EndFindKvp(handle);
  190.  
  191.                             Dictionary<string, dynamic> kvps = new Dictionary<string, dynamic>();
  192.                             foreach (var kvp in names)
  193.                             {
  194.                                 int type = 0; // 0 = string, 1 = float, 2 = int.
  195.                                 if (kvp.StartsWith("settings_"))
  196.                                 {
  197.                                     if (kvp == "settings_voiceChatProximity") // float
  198.                                     {
  199.                                         type = 1;
  200.                                     }
  201.                                     else if (kvp == "settings_clothingAnimationType") // int
  202.                                     {
  203.                                         type = 2;
  204.                                     }
  205.                                     else if (kvp == "settings_miscLastTimeCycleModifierIndex") // int
  206.                                     {
  207.                                         type = 2;
  208.                                     }
  209.                                     else if (kvp == "settings_miscLastTimeCycleModifierStrength") // int
  210.                                     {
  211.                                         type = 2;
  212.                                     }
  213.                                 }
  214.                                 else if (kvp == "vmenu_cleanup_version") // int
  215.                                 {
  216.                                     type = 2;
  217.                                 }
  218.                                 switch (type)
  219.                                 {
  220.                                     case 0:
  221.                                         var s = GetResourceKvpString(kvp);
  222.                                         if (s.StartsWith("{") || s.StartsWith("["))
  223.                                         {
  224.                                             kvps.Add(kvp, JsonConvert.DeserializeObject(s));
  225.                                         }
  226.                                         else
  227.                                         {
  228.                                             kvps.Add(kvp, GetResourceKvpString(kvp));
  229.                                         }
  230.                                         break;
  231.                                     case 1:
  232.                                         kvps.Add(kvp, GetResourceKvpFloat(kvp));
  233.                                         break;
  234.                                     case 2:
  235.                                         kvps.Add(kvp, GetResourceKvpInt(kvp));
  236.                                         break;
  237.                                 }
  238.                             }
  239.                             Debug.WriteLine(@JsonConvert.SerializeObject(kvps, Formatting.None) + "\n");
  240.  
  241.                             Debug.WriteLine("\n\nDumping a list of allowed permissions:");
  242.                             Debug.WriteLine(@JsonConvert.SerializeObject(Permissions, Formatting.None));
  243.  
  244.                             Debug.WriteLine("\n\nDumping vmenu server configuration settings:");
  245.                             var settings = new Dictionary<string, string>();
  246.                             foreach (var a in Enum.GetValues(typeof(Setting)))
  247.                             {
  248.                                 settings.Add(a.ToString(), GetSettingsString((Setting)a));
  249.                             }
  250.                             Debug.WriteLine(@JsonConvert.SerializeObject(settings, Formatting.None));
  251.                             Debug.WriteLine("\nEnd of vMenu dump!");
  252.                             Debug.WriteLine("\n########################### vMenu ###########################");
  253.                         }
  254.                     }
  255.                     else
  256.                     {
  257.                         Notify.Custom($"vMenu is currently running version: {Version}.");
  258.                     }
  259.                 }
  260.             }), false);
  261.  
  262.             // Set discord rich precense once, allowing it to be overruled by other resources once those load.
  263.             if (DebugMode)
  264.             {
  265.                 SetRichPresence($"Debugging vMenu {Version}!");
  266.             }
  267.  
  268.             if (GetCurrentResourceName() != "vMenu")
  269.             {
  270.                 Exception InvalidNameException = new Exception("\r\n\r\n[vMenu] INSTALLATION ERROR!\r\nThe name of the resource is not valid. Please change the folder name from '" + GetCurrentResourceName() + "' to 'vMenu' (case sensitive) instead!\r\n\r\n\r\n");
  271.                 try
  272.                 {
  273.                     throw InvalidNameException;
  274.                 }
  275.                 catch (Exception e)
  276.                 {
  277.                     Log(e.Message);
  278.                 }
  279.                 TriggerEvent("chatMessage", "^3IMPORTANT: vMenu IS NOT SETUP CORRECTLY. PLEASE CHECK THE SERVER LOG FOR MORE INFO.");
  280.                 MenuController.MainMenu = null;
  281.                 MenuController.DontOpenAnyMenu = true;
  282.                 MenuController.DisableMenuButtons = true;
  283.             }
  284.             else
  285.             {
  286.                 Tick += OnTick;
  287.                 Tick += OnTickResolve;
  288.             }
  289.             try
  290.             {
  291.                 SetClockDate(DateTime.Now.Day, DateTime.Now.Month, DateTime.Now.Year);
  292.             }
  293.             catch (InvalidTimeZoneException timeEx)
  294.             {
  295.                 Debug.WriteLine($"[vMenu] [Error] Could not set the in-game day, month and year because of an invalid timezone(?).");
  296.                 Debug.WriteLine($"[vMenu] [Error] InvalidTimeZoneException: {timeEx.Message}");
  297.                 Debug.WriteLine($"[vMenu] [Error] vMenu will continue to work normally.");
  298.             }
  299.         }
  300.  
  301.         #region Infinity bits
  302.         [EventHandler("vMenu:SetServerState")]
  303.         public void SetServerState(IDictionary<string, object> data)
  304.         {
  305.             if (data.TryGetValue("IsInfinity", out var isInfinity))
  306.             {
  307.                 if (isInfinity is bool isInfinityBool)
  308.                 {
  309.                     if (isInfinityBool)
  310.                     {
  311.                         PlayersList = new InfinityPlayerList(Players);
  312.                     }
  313.                 }
  314.             }
  315.         }
  316.  
  317.         [EventHandler("vMenu:ReceivePlayerList")]
  318.         public void ReceivedPlayerList(IList<object> players)
  319.         {
  320.             PlayersList?.ReceivedPlayerList(players);
  321.         }
  322.  
  323.         public static async Task<Vector3> RequestPlayerCoordinates(int serverId)
  324.         {
  325.             Vector3 coords = Vector3.Zero;
  326.             bool completed = false;
  327.  
  328.             // TODO: replace with client<->server RPC once implemented in CitizenFX!
  329.             Func<Vector3, bool> CallbackFunction = (data) =>
  330.             {
  331.                 coords = data;
  332.                 completed = true;
  333.                 return true;
  334.             };
  335.  
  336.             TriggerServerEvent("vMenu:GetPlayerCoords", serverId, CallbackFunction);
  337.  
  338.             while (!completed)
  339.             {
  340.                 await Delay(0);
  341.             }
  342.  
  343.             return coords;
  344.         }
  345.         #endregion
  346.  
  347.         #region Set Permissions function
  348.         /// <summary>
  349.         /// Set the permissions for this client.
  350.         /// </summary>
  351.         /// <param name="dict"></param>
  352.         public static void SetPermissions(string permissionsList)
  353.         {
  354.             vMenuShared.PermissionsManager.SetPermissions(permissionsList);
  355.  
  356.             VehicleSpawner.allowedCategories = new List<bool>()
  357.             {
  358.                 IsAllowed(Permission.VSCompacts, checkAnyway: true),
  359.                 IsAllowed(Permission.VSSedans, checkAnyway: true),
  360.                 IsAllowed(Permission.VSSUVs, checkAnyway: true),
  361.                 IsAllowed(Permission.VSCoupes, checkAnyway: true),
  362.                 IsAllowed(Permission.VSMuscle, checkAnyway: true),
  363.                 IsAllowed(Permission.VSSportsClassic, checkAnyway: true),
  364.                 IsAllowed(Permission.VSSports, checkAnyway: true),
  365.                 IsAllowed(Permission.VSSuper, checkAnyway: true),
  366.                 IsAllowed(Permission.VSMotorcycles, checkAnyway: true),
  367.                 IsAllowed(Permission.VSOffRoad, checkAnyway: true),
  368.                 IsAllowed(Permission.VSIndustrial, checkAnyway: true),
  369.                 IsAllowed(Permission.VSUtility, checkAnyway: true),
  370.                 IsAllowed(Permission.VSVans, checkAnyway: true),
  371.                 IsAllowed(Permission.VSCycles, checkAnyway: true),
  372.                 IsAllowed(Permission.VSBoats, checkAnyway: true),
  373.                 IsAllowed(Permission.VSHelicopters, checkAnyway: true),
  374.                 IsAllowed(Permission.VSPlanes, checkAnyway: true),
  375.                 IsAllowed(Permission.VSService, checkAnyway: true),
  376.                 IsAllowed(Permission.VSEmergency, checkAnyway: true),
  377.                 IsAllowed(Permission.VSMilitary, checkAnyway: true),
  378.                 IsAllowed(Permission.VSCommercial, checkAnyway: true),
  379.                 IsAllowed(Permission.VSTrains, checkAnyway: true),
  380.                 IsAllowed(Permission.VSOpenWheel, checkAnyway: true)
  381.             };
  382.             ArePermissionsSetup = true;
  383.  
  384.             TriggerServerEvent("vMenu:IsResourceUpToDate");
  385.         }
  386.         #endregion
  387.  
  388.  
  389.         /// <summary>
  390.         /// Main OnTickResolve task runs every game tick and handles all the menu stuff.
  391.         /// </summary>
  392.         /// <returns></returns>
  393.         private async Task OnTickResolve()
  394.         {
  395.             while (true) {
  396.                 await Delay(1000);
  397.  
  398.                 if (!PermissionsSetupComplete)
  399.                 {
  400.                     Debug.WriteLine("[vMenu] Permissions not loaded, trying to reload them...");
  401.                     TriggerServerEvent("vMenu:RequestPermissions");
  402.                 }
  403.                 else if (!ConfigOptionsSetupComplete || Game.Player.Name == "**Invalid**" || Game.Player.Name == "** Invalid **")
  404.                 {
  405.                     Debug.WriteLine("[vMenu] Server state not loaded, trying to reload...");
  406.                     TriggerServerEvent("vMenu:RequestServerState");
  407.                 }
  408.                 else
  409.                 {
  410.                     break;
  411.                 }
  412.             }
  413.         }
  414.  
  415.  
  416.         /// <summary>
  417.         /// Main OnTick task runs every game tick and handles all the menu stuff.
  418.         /// </summary>
  419.         /// <returns></returns>
  420.         private async Task OnTick()
  421.         {
  422.             #region FirstTick
  423.             // Only run this the first tick.
  424.             if (firstTick)
  425.             {
  426.                 firstTick = false;
  427.                 switch (GetSettingsInt(Setting.vmenu_pvp_mode))
  428.                 {
  429.                     case 1:
  430.                         NetworkSetFriendlyFireOption(true);
  431.                         SetCanAttackFriendly(Game.PlayerPed.Handle, true, false);
  432.                         break;
  433.                     case 2:
  434.                         NetworkSetFriendlyFireOption(false);
  435.                         SetCanAttackFriendly(Game.PlayerPed.Handle, false, false);
  436.                         break;
  437.                     case 0:
  438.                     default:
  439.                         break;
  440.                 }
  441.                 // Clear all previous pause menu info/brief messages on resource start.
  442.                 ClearBrief();
  443.  
  444.                 // Request the permissions data from the server.
  445.                 TriggerServerEvent("vMenu:RequestPermissions");
  446.  
  447.                 // Request server state from the server.
  448.                 TriggerServerEvent("vMenu:RequestServerState");
  449.  
  450.                 // Wait until the data is received and the player's name is loaded correctly.
  451.                 while (!ConfigOptionsSetupComplete || !PermissionsSetupComplete || Game.Player.Name == "**Invalid**" || Game.Player.Name == "** Invalid **")
  452.                 {
  453.                     await Delay(0);
  454.                 }
  455.                 if ((IsAllowed(Permission.Staff) && GetSettingsBool(Setting.vmenu_menu_staff_only)) || GetSettingsBool(Setting.vmenu_menu_staff_only) == false)
  456.                 {
  457.                     if (GetSettingsInt(Setting.vmenu_menu_toggle_key) != -1)
  458.                     {
  459.                         MenuToggleKey = (Control)GetSettingsInt(Setting.vmenu_menu_toggle_key);
  460.                         //MenuToggleKey = GetSettingsInt(Setting.vmenu_menu_toggle_key);
  461.                     }
  462.                     if (GetSettingsInt(Setting.vmenu_noclip_toggle_key) != -1)
  463.                     {
  464.                         NoClipKey = GetSettingsInt(Setting.vmenu_noclip_toggle_key);
  465.                     }
  466.  
  467.                     // Create the main menu.
  468.                     Menu = new Menu(Game.Player.Name, "Main Menu");
  469.                     PlayerSubmenu = new Menu(Game.Player.Name, "Player Related Options");
  470.                     VehicleSubmenu = new Menu(Game.Player.Name, "Vehicle Related Options");
  471.                     WorldSubmenu = new Menu(Game.Player.Name, "World Options");
  472.  
  473.                     // Add the main menu to the menu pool.
  474.                     MenuController.AddMenu(Menu);
  475.                     MenuController.MainMenu = Menu;
  476.  
  477.                     MenuController.AddSubmenu(Menu, PlayerSubmenu);
  478.                     MenuController.AddSubmenu(Menu, VehicleSubmenu);
  479.                     MenuController.AddSubmenu(Menu, WorldSubmenu);
  480.  
  481.                     // Create all (sub)menus.
  482.                     CreateSubmenus();
  483.                 }
  484.                 else
  485.                 {
  486.                     MenuController.MainMenu = null;
  487.                     MenuController.DisableMenuButtons = true;
  488.                     MenuController.DontOpenAnyMenu = true;
  489.                     MenuController.MenuToggleKey = (Control)(-1); // disables the menu toggle key
  490.                 }
  491.  
  492.                 // Manage Stamina
  493.                 if (PlayerOptionsMenu != null && PlayerOptionsMenu.PlayerStamina && IsAllowed(Permission.POUnlimitedStamina))
  494.                     StatSetInt((uint)GetHashKey("MP0_STAMINA"), 100, true);
  495.                 else
  496.                     StatSetInt((uint)GetHashKey("MP0_STAMINA"), 0, true);
  497.  
  498.                 // Manage other stats, in order of appearance in the pause menu (stats) page.
  499.                 StatSetInt((uint)GetHashKey("MP0_SHOOTING_ABILITY"), 100, true);        // Shooting
  500.                 StatSetInt((uint)GetHashKey("MP0_STRENGTH"), 100, true);                // Strength
  501.                 StatSetInt((uint)GetHashKey("MP0_STEALTH_ABILITY"), 100, true);         // Stealth
  502.                 StatSetInt((uint)GetHashKey("MP0_FLYING_ABILITY"), 100, true);          // Flying
  503.                 StatSetInt((uint)GetHashKey("MP0_WHEELIE_ABILITY"), 100, true);         // Driving
  504.                 StatSetInt((uint)GetHashKey("MP0_LUNG_CAPACITY"), 100, true);           // Lung Capacity
  505.                 StatSetFloat((uint)GetHashKey("MP0_PLAYER_MENTAL_STATE"), 0f, true);    // Mental State
  506.  
  507.             }
  508.             #endregion
  509.  
  510.  
  511.             // If the setup (permissions) is done, and it's not the first tick, then do this:
  512.             if (ConfigOptionsSetupComplete && !firstTick)
  513.             {
  514.                 #region Handle Opening/Closing of the menu.
  515.  
  516.  
  517.                 var tmpMenu = GetOpenMenu();
  518.                 if (MpPedCustomizationMenu != null)
  519.                 {
  520.                     bool IsOpen()
  521.                     {
  522.                         return
  523.                             MpPedCustomizationMenu.appearanceMenu.Visible ||
  524.                             MpPedCustomizationMenu.faceShapeMenu.Visible ||
  525.                             MpPedCustomizationMenu.createCharacterMenu.Visible ||
  526.                             MpPedCustomizationMenu.inheritanceMenu.Visible ||
  527.                             MpPedCustomizationMenu.propsMenu.Visible ||
  528.                             MpPedCustomizationMenu.clothesMenu.Visible ||
  529.                             MpPedCustomizationMenu.tattoosMenu.Visible;
  530.                     }
  531.  
  532.                     if (IsOpen())
  533.                     {
  534.                         if (tmpMenu == MpPedCustomizationMenu.createCharacterMenu)
  535.                         {
  536.                             MpPedCustomization.DisableBackButton = true;
  537.                         }
  538.                         else
  539.                         {
  540.                             MpPedCustomization.DisableBackButton = false;
  541.                         }
  542.                         MpPedCustomization.DontCloseMenus = true;
  543.                     }
  544.                     else
  545.                     {
  546.                         MpPedCustomization.DisableBackButton = false;
  547.                         MpPedCustomization.DontCloseMenus = false;
  548.                     }
  549.                 }
  550.  
  551.                 if (Game.IsDisabledControlJustReleased(0, Control.PhoneCancel) && MpPedCustomization.DisableBackButton)
  552.                 {
  553.                     await Delay(0);
  554.                     Notify.Alert("You must save your ped first before exiting, or click the ~r~Exit Without Saving~s~ button.");
  555.                 }
  556.  
  557.                 if (Game.CurrentInputMode == InputMode.MouseAndKeyboard)
  558.                 {
  559.                     if (Game.IsControlJustPressed(0, (Control)NoClipKey) && IsAllowed(Permission.NoClip) && UpdateOnscreenKeyboard() != 0)
  560.                     {
  561.                         if (Game.PlayerPed.IsInVehicle())
  562.                         {
  563.                             Vehicle veh = GetVehicle();
  564.                             if (veh != null && veh.Exists() && veh.Driver == Game.PlayerPed)
  565.                             {
  566.                                 NoClipEnabled = !NoClipEnabled;
  567.                             }
  568.                             else
  569.                             {
  570.                                 NoClipEnabled = false;
  571.                                 Notify.Error("This vehicle does not exist (somehow) or you need to be the driver of this vehicle to enable noclip!");
  572.                             }
  573.                         }
  574.                         else
  575.                         {
  576.                             NoClipEnabled = !NoClipEnabled;
  577.                         }
  578.                     }
  579.                 }
  580.  
  581.                 #endregion
  582.  
  583.                 // Menu toggle button.
  584.                 Game.DisableControlThisFrame(0, MenuToggleKey);
  585.             }
  586.         }
  587.  
  588.         #region Add Menu Function
  589.         /// <summary>
  590.         /// Add the menu to the menu pool and set it up correctly.
  591.         /// Also add and bind the menu buttons.
  592.         /// </summary>
  593.         /// <param name="submenu"></param>
  594.         /// <param name="menuButton"></param>
  595.         private void AddMenu(Menu parentMenu, Menu submenu, MenuItem menuButton)
  596.         {
  597.             parentMenu.AddMenuItem(menuButton);
  598.             MenuController.AddSubmenu(parentMenu, submenu);
  599.             MenuController.BindMenuItem(parentMenu, submenu, menuButton);
  600.             submenu.RefreshIndex();
  601.         }
  602.         #endregion
  603.  
  604.         #region Create Submenus
  605.         /// <summary>
  606.         /// Creates all the submenus depending on the permissions of the user.
  607.         /// </summary>
  608.         private void CreateSubmenus()
  609.         {
  610.             // Add the online players menu.
  611.             if (IsAllowed(Permission.OPMenu))
  612.             {
  613.                 OnlinePlayersMenu = new OnlinePlayers();
  614.                 Menu menu = OnlinePlayersMenu.GetMenu();
  615.                 MenuItem button = new MenuItem("Online Players", "All currently connected players.")
  616.                 {
  617.                     Label = "→→→"
  618.                 };
  619.                 AddMenu(Menu, menu, button);
  620.                 Menu.OnItemSelect += async (sender, item, index) =>
  621.                 {
  622.                     if (item == button)
  623.                     {
  624.                         PlayersList.RequestPlayerList();
  625.  
  626.                         await OnlinePlayersMenu.UpdatePlayerlist();
  627.                         menu.RefreshIndex();
  628.                     }
  629.                 };
  630.             }
  631.             if (IsAllowed(Permission.OPUnban) || IsAllowed(Permission.OPViewBannedPlayers))
  632.             {
  633.                 BannedPlayersMenu = new BannedPlayers();
  634.                 Menu menu = BannedPlayersMenu.GetMenu();
  635.                 MenuItem button = new MenuItem("Banned Players", "View and manage all banned players in this menu.")
  636.                 {
  637.                     Label = "→→→"
  638.                 };
  639.                 AddMenu(Menu, menu, button);
  640.                 Menu.OnItemSelect += (sender, item, index) =>
  641.                 {
  642.                     if (item == button)
  643.                     {
  644.                         TriggerServerEvent("vMenu:RequestBanList", Game.Player.Handle);
  645.                         menu.RefreshIndex();
  646.                     }
  647.                 };
  648.             }
  649.  
  650.             MenuItem playerSubmenuBtn = new MenuItem("Player Related Options", "Open this submenu for player related subcategories.") { Label = "→→→" };
  651.             Menu.AddMenuItem(playerSubmenuBtn);
  652.  
  653.             // Add the player options menu.
  654.             if (IsAllowed(Permission.POMenu))
  655.             {
  656.                 PlayerOptionsMenu = new PlayerOptions();
  657.                 Menu menu = PlayerOptionsMenu.GetMenu();
  658.                 MenuItem button = new MenuItem("Player Options", "Common player options can be accessed here.")
  659.                 {
  660.                     Label = "→→→"
  661.                 };
  662.                 AddMenu(PlayerSubmenu, menu, button);
  663.             }
  664.  
  665.             MenuItem vehicleSubmenuBtn = new MenuItem("Vehicle Related Options", "Open this submenu for vehicle related subcategories.") { Label = "→→→" };
  666.             Menu.AddMenuItem(vehicleSubmenuBtn);
  667.             // Add the vehicle options Menu.
  668.             if (IsAllowed(Permission.VOMenu))
  669.             {
  670.                 VehicleOptionsMenu = new VehicleOptions();
  671.                 Menu menu = VehicleOptionsMenu.GetMenu();
  672.                 MenuItem button = new MenuItem("Vehicle Options", "Here you can change common vehicle options, as well as tune & style your vehicle.")
  673.                 {
  674.                     Label = "→→→"
  675.                 };
  676.                 AddMenu(VehicleSubmenu, menu, button);
  677.             }
  678.  
  679.             // Add the vehicle spawner menu.
  680.             if (IsAllowed(Permission.VSMenu))
  681.             {
  682.                 VehicleSpawnerMenu = new VehicleSpawner();
  683.                 Menu menu = VehicleSpawnerMenu.GetMenu();
  684.                 MenuItem button = new MenuItem("Vehicle Spawner", "Spawn a vehicle by name or choose one from a specific category.")
  685.                 {
  686.                     Label = "→→→"
  687.                 };
  688.                 AddMenu(VehicleSubmenu, menu, button);
  689.             }
  690.  
  691.             // Add Saved Vehicles menu.
  692.             if (IsAllowed(Permission.SVMenu))
  693.             {
  694.                 SavedVehiclesMenu = new SavedVehicles();
  695.                 Menu menu = SavedVehiclesMenu.GetMenu();
  696.                 MenuItem button = new MenuItem("Saved Vehicles", "Save new vehicles, or spawn or delete already saved vehicles.")
  697.                 {
  698.                     Label = "→→→"
  699.                 };
  700.                 AddMenu(VehicleSubmenu, menu, button);
  701.                 VehicleSubmenu.OnItemSelect += (sender, item, index) =>
  702.                 {
  703.                     if (item == button)
  704.                     {
  705.                         SavedVehiclesMenu.UpdateMenuAvailableCategories();
  706.                     }
  707.                 };
  708.             }
  709.  
  710.             // Add the Personal Vehicle menu.
  711.             if (IsAllowed(Permission.PVMenu))
  712.             {
  713.                 PersonalVehicleMenu = new PersonalVehicle();
  714.                 Menu menu = PersonalVehicleMenu.GetMenu();
  715.                 MenuItem button = new MenuItem("Personal Vehicle", "Set a vehicle as your personal vehicle, and control some things about that vehicle when you're not inside.")
  716.                 {
  717.                     Label = "→→→"
  718.                 };
  719.                 AddMenu(VehicleSubmenu, menu, button);
  720.             }
  721.  
  722.             // Add the player appearance menu.
  723.             if (IsAllowed(Permission.PAMenu))
  724.             {
  725.                 PlayerAppearanceMenu = new PlayerAppearance();
  726.                 Menu menu = PlayerAppearanceMenu.GetMenu();
  727.                 MenuItem button = new MenuItem("Player Appearance", "Choose a ped model, customize it and save & load your customized characters.")
  728.                 {
  729.                     Label = "→→→"
  730.                 };
  731.                 AddMenu(PlayerSubmenu, menu, button);
  732.  
  733.                 MpPedCustomizationMenu = new MpPedCustomization();
  734.                 Menu menu2 = MpPedCustomizationMenu.GetMenu();
  735.                 MenuItem button2 = new MenuItem("MP Ped Customization", "Create, edit, save and load multiplayer peds. ~r~Note, you can only save peds created in this submenu. vMenu can NOT detect peds created outside of this submenu. Simply due to GTA limitations.")
  736.                 {
  737.                     Label = "→→→"
  738.                 };
  739.                 AddMenu(PlayerSubmenu, menu2, button2);
  740.             }
  741.  
  742.             MenuItem worldSubmenuBtn = new MenuItem("World Related Options", "Open this submenu for world related subcategories.") { Label = "→→→" };
  743.             Menu.AddMenuItem(worldSubmenuBtn);
  744.  
  745.             // Add the time options menu.
  746.             // check for 'not true' to make sure that it _ONLY_ gets disabled if the owner _REALLY_ wants it disabled, not if they accidentally spelled "false" wrong or whatever.
  747.             if (IsAllowed(Permission.TOMenu) && GetSettingsBool(Setting.vmenu_enable_time_sync))
  748.             {
  749.                 TimeOptionsMenu = new TimeOptions();
  750.                 Menu menu = TimeOptionsMenu.GetMenu();
  751.                 MenuItem button = new MenuItem("Time Options", "Change the time, and edit other time related options.")
  752.                 {
  753.                     Label = "→→→"
  754.                 };
  755.                 AddMenu(WorldSubmenu, menu, button);
  756.             }
  757.  
  758.             // Add the weather options menu.
  759.             // check for 'not true' to make sure that it _ONLY_ gets disabled if the owner _REALLY_ wants it disabled, not if they accidentally spelled "false" wrong or whatever.
  760.             if (IsAllowed(Permission.WOMenu) && GetSettingsBool(Setting.vmenu_enable_weather_sync))
  761.             {
  762.                 WeatherOptionsMenu = new WeatherOptions();
  763.                 Menu menu = WeatherOptionsMenu.GetMenu();
  764.                 MenuItem button = new MenuItem("Weather Options", "Change all weather related options here.")
  765.                 {
  766.                     Label = "→→→"
  767.                 };
  768.                 AddMenu(WorldSubmenu, menu, button);
  769.             }
  770.  
  771.             // Add the weapons menu.
  772.             if (IsAllowed(Permission.WPMenu))
  773.             {
  774.                 WeaponOptionsMenu = new WeaponOptions();
  775.                 Menu menu = WeaponOptionsMenu.GetMenu();
  776.                 MenuItem button = new MenuItem("Weapon Options", "Add/remove weapons, modify weapons and set ammo options.")
  777.                 {
  778.                     Label = "→→→"
  779.                 };
  780.                 AddMenu(PlayerSubmenu, menu, button);
  781.             }
  782.  
  783.             // Add Weapon Loadouts menu.
  784.             if (IsAllowed(Permission.WLMenu))
  785.             {
  786.                 WeaponLoadoutsMenu = new WeaponLoadouts();
  787.                 Menu menu = WeaponLoadoutsMenu.GetMenu();
  788.                 MenuItem button = new MenuItem("Weapon Loadouts", "Mange, and spawn saved weapon loadouts.")
  789.                 {
  790.                     Label = "→→→"
  791.                 };
  792.                 AddMenu(PlayerSubmenu, menu, button);
  793.             }
  794.  
  795.             if (IsAllowed(Permission.NoClip))
  796.             {
  797.                 MenuItem toggleNoclip = new MenuItem("Toggle NoClip", "Toggle NoClip on or off.");
  798.                 PlayerSubmenu.AddMenuItem(toggleNoclip);
  799.                 PlayerSubmenu.OnItemSelect += (sender, item, index) =>
  800.                 {
  801.                     if (item == toggleNoclip)
  802.                     {
  803.                         NoClipEnabled = !NoClipEnabled;
  804.                     }
  805.                 };
  806.             }
  807.  
  808.             // Add Voice Chat Menu.
  809.             if (IsAllowed(Permission.VCMenu))
  810.             {
  811.                 VoiceChatSettingsMenu = new VoiceChat();
  812.                 Menu menu = VoiceChatSettingsMenu.GetMenu();
  813.                 MenuItem button = new MenuItem("Voice Chat Settings", "Change Voice Chat options here.")
  814.                 {
  815.                     Label = "→→→"
  816.                 };
  817.                 AddMenu(Menu, menu, button);
  818.             }
  819.  
  820.             {
  821.                 RecordingMenu = new Recording();
  822.                 Menu menu = RecordingMenu.GetMenu();
  823.                 MenuItem button = new MenuItem("Recording Options", "In-game recording options.")
  824.                 {
  825.                     Label = "→→→"
  826.                 };
  827.                 AddMenu(Menu, menu, button);
  828.             }
  829.  
  830.             // Add misc settings menu.
  831.             {
  832.                 MiscSettingsMenu = new MiscSettings();
  833.                 Menu menu = MiscSettingsMenu.GetMenu();
  834.                 MenuItem button = new MenuItem("Misc Settings", "Miscellaneous vMenu options/settings can be configured here. You can also save your settings in this menu.")
  835.                 {
  836.                     Label = "→→→"
  837.                 };
  838.                 AddMenu(Menu, menu, button);
  839.             }
  840.  
  841.             // Add About Menu.
  842.             AboutMenu = new About();
  843.             Menu sub = AboutMenu.GetMenu();
  844.             MenuItem btn = new MenuItem("About vMenu", "Information about vMenu.")
  845.             {
  846.                 Label = "→→→"
  847.             };
  848.             AddMenu(Menu, sub, btn);
  849.  
  850.             // Refresh everything.
  851.             MenuController.Menus.ForEach((m) => m.RefreshIndex());
  852.  
  853.             if (!GetSettingsBool(Setting.vmenu_use_permissions))
  854.             {
  855.                 Notify.Alert("vMenu is set up to ignore permissions, default permissions will be used.");
  856.             }
  857.  
  858.             if (PlayerSubmenu.Size > 0)
  859.             {
  860.                 MenuController.BindMenuItem(Menu, PlayerSubmenu, playerSubmenuBtn);
  861.             }
  862.             else
  863.             {
  864.                 Menu.RemoveMenuItem(playerSubmenuBtn);
  865.             }
  866.  
  867.             if (VehicleSubmenu.Size > 0)
  868.             {
  869.                 MenuController.BindMenuItem(Menu, VehicleSubmenu, vehicleSubmenuBtn);
  870.             }
  871.             else
  872.             {
  873.                 Menu.RemoveMenuItem(vehicleSubmenuBtn);
  874.             }
  875.  
  876.             if (WorldSubmenu.Size > 0)
  877.             {
  878.                 MenuController.BindMenuItem(Menu, WorldSubmenu, worldSubmenuBtn);
  879.             }
  880.             else
  881.             {
  882.                 Menu.RemoveMenuItem(worldSubmenuBtn);
  883.             }
  884.  
  885.             if (MiscSettingsMenu != null)
  886.             {
  887.                 MenuController.EnableMenuToggleKeyOnController = !MiscSettingsMenu.MiscDisableControllerSupport;
  888.             }
  889.         }
  890.         #endregion
  891.     }
  892. }
  893.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement