/// <summary> /// New function used to save vehicle info to local storage. /// </summary> /// <param name="saveName"></param> /// <param name="vehicleInfo"></param> /// <param name="overrideOldVersion"></param> /// <returns></returns> public bool SaveVehicleInfo(string saveName, CommonFunctions.VehicleInfo vehicleInfo, bool overrideOldVersion) { if ((GetResourceKvpString(saveName) ?? "NULL") == "NULL" || overrideOldVersion) { if ((saveName ?? "NULL") != "NULL" && saveName.Length > 4) { // convert string json = JsonConvert.SerializeObject(vehicleInfo); // log MainMenu.Cf.Log($"[vMenu] Saving!\nName: {saveName}\nVehicle Data: {json}\n"); // save SetResourceKvp(saveName, json); // confirm return(GetResourceKvpString(saveName) == json); } } // if something isn't right, then the save is aborted and return false ("failed" state). return(false); }
/// <summary> /// New function to get vehicle information from a saved vehicle. /// </summary> /// <param name="saveName">Saved vehicle name to get info from. (name includes "veh_")</param> /// <returns></returns> public CommonFunctions.VehicleInfo GetSavedVehicleInfo(string saveName) { string json = GetResourceKvpString(saveName); var vi = new CommonFunctions.VehicleInfo() { }; dynamic data = JsonConvert.DeserializeObject(json); if (data.ContainsKey("version")) { MainMenu.Cf.Log("New Version: " + data["version"] + "\n"); var colors = new Dictionary <string, int>(); foreach (Newtonsoft.Json.Linq.JProperty c in data["colors"]) { colors.Add(c.Name, (int)c.Value); } vi.colors = colors; vi.customWheels = (bool)data["customWheels"]; var extras = new Dictionary <int, bool>(); foreach (Newtonsoft.Json.Linq.JProperty e in data["extras"]) { extras.Add(int.Parse(e.Name), (bool)e.Value); } vi.extras = extras; vi.livery = (int)data["livery"]; vi.model = (uint)data["model"]; var mods = new Dictionary <int, int>(); foreach (Newtonsoft.Json.Linq.JProperty m in data["mods"]) { mods.Add(int.Parse(m.Name.ToString()), (int)m.Value); } vi.mods = mods; vi.name = (string)data["name"]; vi.neonBack = (bool)data["neonBack"]; vi.neonFront = (bool)data["neonFront"]; vi.neonLeft = (bool)data["neonLeft"]; vi.neonRight = (bool)data["neonRight"]; vi.plateStyle = (int)data["plateStyle"]; vi.plateText = (string)data["plateText"]; vi.turbo = (bool)data["turbo"]; vi.tyreSmoke = (bool)data["tyreSmoke"]; vi.version = (int)data["version"]; vi.wheelType = (int)data["wheelType"]; vi.windowTint = (int)data["windowTint"]; vi.xenonHeadlights = (bool)data["xenonHeadlights"]; } else { MainMenu.Cf.Log("Old: " + json + "\n"); var dict = MainMenu.Cf.JsonToDictionary(json); var colors = new Dictionary <string, int>() { ["primary"] = int.Parse(dict["primaryColor"]), ["secondary"] = int.Parse(dict["secondaryColor"]), ["pearlescent"] = int.Parse(dict["pearlescentColor"]), ["wheels"] = int.Parse(dict["wheelsColor"]), ["dash"] = int.Parse(dict["dashboardColor"]), ["trim"] = int.Parse(dict["interiorColor"]), ["neonR"] = 255, ["neonG"] = 255, ["neonB"] = 255, ["tyresmokeR"] = int.Parse(dict["tireSmokeR"]), ["tyresmokeG"] = int.Parse(dict["tireSmokeG"]), ["tyresmokeB"] = int.Parse(dict["tireSmokeB"]), }; var extras = new Dictionary <int, bool>(); for (int i = 0; i < 15; i++) { if (dict["extra" + i] == "true") { extras.Add(i, true); } else { extras.Add(i, false); } } var mods = new Dictionary <int, int>(); int skip = 8 + 24 + 2 + 1; foreach (var mod in dict) { skip--; if (skip < 0) { var key = int.Parse(mod.Key); var val = int.Parse(mod.Value); mods.Add(key, val); } } vi.colors = colors; vi.customWheels = dict["customWheels"] == "true"; vi.extras = extras; vi.livery = int.Parse(dict["oldLivery"]); vi.model = (uint)Int64.Parse(dict["model"]); vi.mods = mods; vi.name = dict["name"]; vi.neonBack = false; vi.neonFront = false; vi.neonLeft = false; vi.neonRight = false; vi.plateStyle = int.Parse(dict["plateStyle"]); vi.plateText = dict["plate"]; vi.turbo = dict["turbo"] == "true"; vi.tyreSmoke = dict["tireSmoke"] == "true"; vi.version = 1; vi.wheelType = int.Parse(dict["wheelType"]); vi.windowTint = int.Parse(dict["windowTint"]); vi.xenonHeadlights = dict["xenonHeadlights"] == "true"; SaveVehicleInfo(saveName, vi, true); } MainMenu.Cf.Log(json + "\n"); return(vi); }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { string menuTitle = "Saved Vehicles"; #region Create menus and submenus // Create the menu. menu = new UIMenu(menuTitle, "Manage Saved Vehicles", true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; // Create submenus. UIMenu spawnSavedVehicles = new UIMenu(menuTitle, "Spawn Saved Vehicle", true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; UIMenu deleteSavedVehicles = new UIMenu(menuTitle, "~r~Delete Saved Vehicle", true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; #endregion #region Create, add and bind buttons to the menus. // Create menu buttons. UIMenuItem saveVeh = new UIMenuItem("Save Current Vehicle", "Save the vehicle you are currently in."); saveVeh.SetRightBadge(UIMenuItem.BadgeStyle.Tick); UIMenuItem savedVehiclesBtn = new UIMenuItem("Spawn Saved Vehicle", "Select a vehicle from your saved vehicles list."); savedVehiclesBtn.SetRightLabel("→→→"); UIMenuItem deleteSavedVehiclesBtn = new UIMenuItem("~r~Delete Saved Vehicle", "~r~Delete ~s~a saved vehicle."); deleteSavedVehiclesBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Alert); deleteSavedVehiclesBtn.SetRightLabel("→→→"); // Add buttons to the menu. menu.AddItem(saveVeh); menu.AddItem(savedVehiclesBtn); menu.AddItem(deleteSavedVehiclesBtn); // Bind submenus to menu items. if (cf.IsAllowed(Permission.SVSpawn)) { menu.BindMenuToItem(spawnSavedVehicles, savedVehiclesBtn); } else { savedVehiclesBtn.Enabled = false; savedVehiclesBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); savedVehiclesBtn.Description = "This option has been disabled by the server owner."; } menu.BindMenuToItem(deleteSavedVehicles, deleteSavedVehiclesBtn); #endregion #region Button pressed events // Handle button presses. menu.OnItemSelect += (sender, item, index) => { // Save the current vehicle. if (item == saveVeh) { cf.SaveVehicle(); } // Open and refresh the "spawn saved vehicle from list" submenu. else if (item == savedVehiclesBtn) { // Remove all old items. spawnSavedVehicles.MenuItems.Clear(); // Get all saved vehicles. SavedVehiclesDict = cf.GetSavedVehicles(); // Loop through all saved vehicles and create a button for it, then add that button to the submenu. foreach (KeyValuePair <string, CommonFunctions.VehicleInfo> savedVehicle in SavedVehiclesDict) { //MainMenu.Cf.Log(savedVehicle.ToString()); UIMenuItem vehBtn = new UIMenuItem(savedVehicle.Key.Substring(4), "Click to spawn this saved vehicle."); vehBtn.SetRightLabel($"({savedVehicle.Value.name})"); spawnSavedVehicles.AddItem(vehBtn); if (!IsModelInCdimage(savedVehicle.Value.model)) { vehBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); vehBtn.Enabled = false; vehBtn.Description = "This model is not available on this server, if this is an addon vehicle or DLC vehicle, please make sure " + "that it's being streamed on this server."; } else { if (!VehicleSpawner.allowedCategories[GetVehicleClassFromName(savedVehicle.Value.model)]) { vehBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); vehBtn.Enabled = false; vehBtn.Description = "This vehicle is not available on this server because you do not have permissions for this vehicle class."; } } } // Sort the menu items (case IN-sensitive) by name. spawnSavedVehicles.MenuItems.Sort((pair1, pair2) => pair1.Text.ToString().ToLower().CompareTo(pair2.Text.ToString().ToLower())); // Refresh the index of the page. spawnSavedVehicles.RefreshIndex(); // Update the scaleform. spawnSavedVehicles.UpdateScaleform(); } // Delete saved vehicle. else if (item == deleteSavedVehiclesBtn) { deleteSavedVehicles.MenuItems.Clear(); // Get the dictionary containing all saved vehicles. SavedVehiclesDict = cf.GetSavedVehicles(); // Loop through the list and add all saved vehicles to the menu. foreach (KeyValuePair <string, CommonFunctions.VehicleInfo> savedVehicle in SavedVehiclesDict) { //MainMenu.Cf.Log(savedVehicle.ToString()); UIMenuItem vehBtn = new UIMenuItem(savedVehicle.Key.Substring(4), "Are you sure you want to delete this saved vehicle? This action cannot be undone!"); vehBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Alert); vehBtn.SetRightLabel($"({savedVehicle.Value.name})"); deleteSavedVehicles.AddItem(vehBtn); } // Sort the menu items (case IN-sensitive) by name. deleteSavedVehicles.MenuItems.Sort((pair1, pair2) => pair1.Text.ToString().ToLower().CompareTo(pair2.Text.ToString().ToLower())); deleteSavedVehicles.RefreshIndex(); deleteSavedVehicles.UpdateScaleform(); } }; #endregion #region Handle saved vehicles being pressed. (spawning) // When a vehicle is selected... spawnSavedVehicles.OnItemSelect += (sender2, item2, index2) => { CommonFunctions.VehicleInfo vehInfo = SavedVehiclesDict["veh_" + item2.Text]; // Spawn a vehicle using the hash, and pass on the vehicleInfo dictionary containing all saved vehicle mods. if (MainMenu.VehicleSpawnerMenu != null) { cf.SpawnVehicle(vehInfo.model, MainMenu.VehicleSpawnerMenu.SpawnInVehicle, MainMenu.VehicleSpawnerMenu.ReplaceVehicle, false, vehicleInfo: vehInfo, saveName: item2.Text); } else { cf.SpawnVehicle(vehInfo.model, true, true, false, vehicleInfo: vehInfo, saveName: item2.Text); } }; // Handle vehicle deletions deleteSavedVehicles.OnItemSelect += (sender2, item2, index2) => { var vehDictName = "veh_" + item2.Text; new StorageManager().DeleteSavedStorageItem(vehDictName); deleteSavedVehicles.GoBack(); }; #endregion // Add the submenus to the menu pool. MainMenu.Mp.Add(spawnSavedVehicles); MainMenu.Mp.Add(deleteSavedVehicles); }