public async void SaveCamera(string updateExistingSavedCameraName = null) { DroneSaveInfo ci = new DroneSaveInfo() { gravityMult_ = gravityMult, timestepMult_ = timestepMult, dragMult_ = dragMult, accelerationMult_ = accelerationMult, rotationMult_ = rotationMult, maxVel_ = maxVel, tiltAngle_ = tiltAngle, droneFov_ = droneFov }; if (updateExistingSavedCameraName == null) { var saveName = await GetUserInput(windowTitle : "Enter a save name", maxInputLength : 30); // If the name is not invalid. if (!string.IsNullOrEmpty(saveName)) { // Save everything from the dictionary into the client's kvp storage. // If the save was successfull: if (SaveCameraInfo("xdm_" + saveName, ci, false)) { Notify.Success($"Drone {saveName} saved."); LoadDroneCameras(); } // If the save was not successfull: else { Notify.Error(CommonErrors.SaveNameAlreadyExists, placeholderValue: "(" + saveName + ")"); } } // The user did not enter a valid name to use as a save name for this vehicle. else { Notify.Error(CommonErrors.InvalidSaveName); } } // We need to update an existing slot. else { SaveCameraInfo("xdm_" + updateExistingSavedCameraName, ci, true); } }
/// <summary> /// Refresh the delete saved peds menu. /// </summary> private void RefreshDeleteSavedPedMenu() { deleteSavedPedMenu.ClearMenuItems(); int findHandle = StartFindKvp("ped_"); List <string> savesFound = new List <string>(); while (true) { var saveName = FindKvp(findHandle); if (saveName != null && saveName != "" && saveName != "NULL") { savesFound.Add(saveName); } else { break; } } foreach (var savename in savesFound) { MenuItem deleteSavedPed = new MenuItem(savename.Substring(4), "~r~Delete ~s~this saved ped, this action can ~r~NOT~s~ be undone!") { LeftIcon = MenuItem.Icon.WARNING }; deleteSavedPedMenu.AddMenuItem(deleteSavedPed); } // Sort the menu items (case IN-sensitive) by name. deleteSavedPedMenu.SortMenuItems((pair1, pair2) => pair1.Text.ToString().ToLower().CompareTo(pair2.Text.ToString().ToLower())); deleteSavedPedMenu.OnItemSelect += (sender, item, idex) => { var name = item.Text.ToString(); StorageManager.DeleteSavedStorageItem("ped_" + name); Notify.Success("Saved ped deleted."); deleteSavedPedMenu.GoBack(); }; deleteSavedPedMenu.RefreshIndex(); //deleteSavedPedMenu.UpdateScaleform(); }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { #region create menu and menu items // Create the menu. menu = new Menu("YDDY:RP", "Меню настроек персонажа"); // Create all checkboxes. MenuCheckboxItem playerGodModeCheckbox = new MenuCheckboxItem("Godmode", "Makes you invincible.", PlayerGodMode); MenuCheckboxItem invisibleCheckbox = new MenuCheckboxItem("Невидимый", "Делает персонажа невидимым. Как шляпа-невидимка.", PlayerInvisible); MenuCheckboxItem unlimitedStaminaCheckbox = new MenuCheckboxItem("Unlimited Stamina", "Allows you to run forever without slowing down or taking damage.", PlayerStamina); MenuCheckboxItem fastRunCheckbox = new MenuCheckboxItem("Fast Run", "Get ~g~Snail~s~ powers and run very fast!", PlayerFastRun); SetRunSprintMultiplierForPlayer(Game.Player.Handle, (PlayerFastRun && IsAllowed(Permission.POFastRun) ? 1.49f : 1f)); MenuCheckboxItem fastSwimCheckbox = new MenuCheckboxItem("Fast Swim", "Get ~g~Snail 2.0~s~ powers and swim super fast!", PlayerFastSwim); SetSwimMultiplierForPlayer(Game.Player.Handle, (PlayerFastSwim && IsAllowed(Permission.POFastSwim) ? 1.49f : 1f)); MenuCheckboxItem superJumpCheckbox = new MenuCheckboxItem("Super Jump", "Get ~g~Snail 3.0~s~ powers and jump like a champ!", PlayerSuperJump); MenuCheckboxItem noRagdollCheckbox = new MenuCheckboxItem("No Ragdoll", "Disables player ragdoll, makes you not fall off your bike anymore.", PlayerNoRagdoll); MenuCheckboxItem neverWantedCheckbox = new MenuCheckboxItem("Never Wanted", "Disables all wanted levels.", PlayerNeverWanted); MenuCheckboxItem everyoneIgnoresPlayerCheckbox = new MenuCheckboxItem("Игнорировать персонажа", "Все оставят вас в покое.", PlayerIsIgnored); MenuCheckboxItem playerStayInVehicleCheckbox = new MenuCheckboxItem("Stay In Vehicle", "When this is enabled, NPCs will not be able to drag you out of your vehicle if they get angry at you.", PlayerStayInVehicle); MenuCheckboxItem playerFrozenCheckbox = new MenuCheckboxItem("Заморозить персонажа", "Как в криокамере!", PlayerFrozen); // Wanted level options List <string> wantedLevelList = new List <string> { "No Wanted Level", "1", "2", "3", "4", "5" }; MenuListItem setWantedLevel = new MenuListItem("Set Wanted Level", wantedLevelList, GetPlayerWantedLevel(Game.Player.Handle), "Set your wanted level by selecting a value, and pressing enter."); MenuListItem setArmorItem = new MenuListItem("Set Armor Type", new List <string> { "No Armor", GetLabelText("WT_BA_0"), GetLabelText("WT_BA_1"), GetLabelText("WT_BA_2"), GetLabelText("WT_BA_3"), GetLabelText("WT_BA_4"), }, 0, "Set the armor level/type for your player."); MenuItem healPlayerBtn = new MenuItem("Heal Player", "Give the player max health."); MenuItem cleanPlayerBtn = new MenuItem("Очистить одежду", "Убрать засохшую кровь одной кнопкой."); MenuItem dryPlayerBtn = new MenuItem("Высушить одежду", "На 20% безопаснее, чем промышленным феном."); MenuItem wetPlayerBtn = new MenuItem("Намочить одежду", "Ну вот опять."); MenuItem suicidePlayerBtn = new MenuItem("~r~Самоубийство", "Съесть 6 аскорбинок или воспользоваться пистолетом?"); Menu vehicleAutoPilot = new Menu("Auto Pilot", "Vehicle auto pilot options."); MenuController.AddSubmenu(menu, vehicleAutoPilot); MenuItem vehicleAutoPilotBtn = new MenuItem("Vehicle Auto Pilot Menu", "Manage vehicle auto pilot options.") { Label = "→→→" }; List <string> drivingStyles = new List <string>() { "Normal", "Rushed", "Avoid highways", "Drive in reverse", "Custom" }; MenuListItem drivingStyle = new MenuListItem("Driving Style", drivingStyles, 0, "Set the driving style that is used for the Drive to Waypoint and Drive Around Randomly functions."); // Scenarios (list can be found in the PedScenarios class) MenuListItem playerScenarios = new MenuListItem("Анимации", PedScenarios.Scenarios, 0, "Enter - выбрать/отменить анимацию."); MenuItem stopScenario = new MenuItem("Отменить анимацию", "Отменяет выполнение анимации за 0.22 мс."); #endregion #region add items to menu based on permissions // Add all checkboxes to the menu. (keeping permissions in mind) if (IsAllowed(Permission.POGod)) { menu.AddMenuItem(playerGodModeCheckbox); } if (IsAllowed(Permission.POInvisible)) { menu.AddMenuItem(invisibleCheckbox); } if (IsAllowed(Permission.POUnlimitedStamina)) { menu.AddMenuItem(unlimitedStaminaCheckbox); } if (IsAllowed(Permission.POFastRun)) { menu.AddMenuItem(fastRunCheckbox); } if (IsAllowed(Permission.POFastSwim)) { menu.AddMenuItem(fastSwimCheckbox); } if (IsAllowed(Permission.POSuperjump)) { menu.AddMenuItem(superJumpCheckbox); } if (IsAllowed(Permission.PONoRagdoll)) { menu.AddMenuItem(noRagdollCheckbox); } if (IsAllowed(Permission.PONeverWanted)) { menu.AddMenuItem(neverWantedCheckbox); } if (IsAllowed(Permission.POSetWanted)) { menu.AddMenuItem(setWantedLevel); } if (IsAllowed(Permission.POIgnored)) { menu.AddMenuItem(everyoneIgnoresPlayerCheckbox); } if (IsAllowed(Permission.POStayInVehicle)) { menu.AddMenuItem(playerStayInVehicleCheckbox); } if (IsAllowed(Permission.POMaxHealth)) { menu.AddMenuItem(healPlayerBtn); } if (IsAllowed(Permission.POMaxArmor)) { menu.AddMenuItem(setArmorItem); } if (IsAllowed(Permission.POCleanPlayer)) { menu.AddMenuItem(cleanPlayerBtn); } if (IsAllowed(Permission.PODryPlayer)) { menu.AddMenuItem(dryPlayerBtn); } if (IsAllowed(Permission.POWetPlayer)) { menu.AddMenuItem(wetPlayerBtn); } menu.AddMenuItem(suicidePlayerBtn); if (IsAllowed(Permission.POVehicleAutoPilotMenu)) { menu.AddMenuItem(vehicleAutoPilotBtn); MenuController.BindMenuItem(menu, vehicleAutoPilot, vehicleAutoPilotBtn); vehicleAutoPilot.AddMenuItem(drivingStyle); MenuItem startDrivingWaypoint = new MenuItem("Drive To Waypoint", "Make your player ped drive your vehicle to your waypoint."); MenuItem startDrivingRandomly = new MenuItem("Drive Around Randomly", "Make your player ped drive your vehicle randomly around the map."); MenuItem stopDriving = new MenuItem("Stop Driving", "The player ped will find a suitable place to stop the vehicle. The task will be stopped once the vehicle has reached the suitable stop location."); MenuItem forceStopDriving = new MenuItem("Force Stop Driving", "This will stop the driving task immediately without finding a suitable place to stop."); MenuItem customDrivingStyle = new MenuItem("Custom Driving Style", "Select a custom driving style. Make sure to also enable it by selecting the 'Custom' driving style in the driving styles list.") { Label = "→→→" }; MenuController.AddSubmenu(vehicleAutoPilot, CustomDrivingStyleMenu); vehicleAutoPilot.AddMenuItem(customDrivingStyle); MenuController.BindMenuItem(vehicleAutoPilot, CustomDrivingStyleMenu, customDrivingStyle); Dictionary <int, string> knownNames = new Dictionary <int, string>() { { 0, "Stop before vehicles" }, { 1, "Stop before peds" }, { 2, "Avoid vehicles" }, { 3, "Avoid empty vehicles" }, { 4, "Avoid peds" }, { 5, "Avoid objects" }, { 7, "Stop at traffic lights" }, { 8, "Use blinkers" }, { 9, "Allow going wrong way" }, { 10, "Go in reverse gear" }, { 18, "Use shortest path" }, { 22, "Ignore roads" }, { 24, "Ignore all pathing" }, { 29, "Avoid highways (if possible)" }, }; for (var i = 0; i < 31; i++) { string name = "~r~Unknown Flag"; if (knownNames.ContainsKey(i)) { name = knownNames[i]; } MenuCheckboxItem checkbox = new MenuCheckboxItem(name, "Toggle this driving style flag.", false); CustomDrivingStyleMenu.AddMenuItem(checkbox); } CustomDrivingStyleMenu.OnCheckboxChange += (sender, item, index, _checked) => { int style = GetStyleFromIndex(drivingStyle.ListIndex); CustomDrivingStyleMenu.MenuSubtitle = $"custom style: {style}"; if (drivingStyle.ListIndex == 4) { Notify.Custom("Driving style updated."); SetDriveTaskDrivingStyle(Game.PlayerPed.Handle, style); } else { Notify.Custom("Driving style NOT updated because you haven't enabled the Custom driving style in the previous menu."); } }; vehicleAutoPilot.AddMenuItem(startDrivingWaypoint); vehicleAutoPilot.AddMenuItem(startDrivingRandomly); vehicleAutoPilot.AddMenuItem(stopDriving); vehicleAutoPilot.AddMenuItem(forceStopDriving); vehicleAutoPilot.RefreshIndex(); vehicleAutoPilot.OnItemSelect += async(sender, item, index) => { if (Game.PlayerPed.IsInVehicle() && item != stopDriving && item != forceStopDriving) { if (Game.PlayerPed.CurrentVehicle != null && Game.PlayerPed.CurrentVehicle.Exists() && !Game.PlayerPed.CurrentVehicle.IsDead && Game.PlayerPed.CurrentVehicle.IsDriveable) { if (Game.PlayerPed.CurrentVehicle.Driver == Game.PlayerPed) { if (item == startDrivingWaypoint) { if (IsWaypointActive()) { int style = GetStyleFromIndex(drivingStyle.ListIndex); DriveToWp(style); Notify.Info("Your player ped is now driving the vehicle for you. You can cancel any time by pressing the Stop Driving button. The vehicle will stop when it has reached the destination."); } else { Notify.Error("You need a waypoint before you can drive to it!"); } } else if (item == startDrivingRandomly) { int style = GetStyleFromIndex(drivingStyle.ListIndex); DriveWander(style); Notify.Info("Your player ped is now driving the vehicle for you. You can cancel any time by pressing the Stop Driving button."); } } else { Notify.Error("You must be the driver of this vehicle!"); } } else { Notify.Error("Your vehicle is broken or it does not exist!"); } } else if (item != stopDriving && item != forceStopDriving) { Notify.Error("You need to be in a vehicle first!"); } if (item == stopDriving) { if (Game.PlayerPed.IsInVehicle()) { Vehicle veh = GetVehicle(); if (veh != null && veh.Exists() && !veh.IsDead) { Vector3 outPos = new Vector3(); if (GetNthClosestVehicleNode(Game.PlayerPed.Position.X, Game.PlayerPed.Position.Y, Game.PlayerPed.Position.Z, 3, ref outPos, 0, 0, 0)) { Notify.Info("The player ped will find a suitable place to park the car and will then stop driving. Please wait."); ClearPedTasks(Game.PlayerPed.Handle); TaskVehiclePark(Game.PlayerPed.Handle, veh.Handle, outPos.X, outPos.Y, outPos.Z, Game.PlayerPed.Heading, 3, 60f, true); while (Game.PlayerPed.Position.DistanceToSquared2D(outPos) > 3f) { await BaseScript.Delay(0); } SetVehicleHalt(veh.Handle, 3f, 0, false); ClearPedTasks(Game.PlayerPed.Handle); Notify.Info("The player ped has stopped driving."); } } } else { ClearPedTasks(Game.PlayerPed.Handle); Notify.Alert("Your ped is not in any vehicle."); } } else if (item == forceStopDriving) { ClearPedTasks(Game.PlayerPed.Handle); Notify.Info("Driving task cancelled."); } }; vehicleAutoPilot.OnListItemSelect += (sender, item, listIndex, itemIndex) => { if (item == drivingStyle) { int style = GetStyleFromIndex(listIndex); SetDriveTaskDrivingStyle(Game.PlayerPed.Handle, style); Notify.Info($"Driving task style is now set to: ~r~{drivingStyles[listIndex]}~s~."); } }; } if (IsAllowed(Permission.POFreeze)) { menu.AddMenuItem(playerFrozenCheckbox); } if (IsAllowed(Permission.POScenarios)) { menu.AddMenuItem(playerScenarios); menu.AddMenuItem(stopScenario); } #endregion #region handle all events // Checkbox changes. menu.OnCheckboxChange += (sender, item, itemIndex, _checked) => { // God Mode toggled. if (item == playerGodModeCheckbox) { PlayerGodMode = _checked; } // Invisibility toggled. else if (item == invisibleCheckbox) { PlayerInvisible = _checked; SetEntityVisible(Game.PlayerPed.Handle, !PlayerInvisible, false); } // Unlimited Stamina toggled. else if (item == unlimitedStaminaCheckbox) { PlayerStamina = _checked; StatSetInt((uint)GetHashKey("MP0_STAMINA"), _checked ? 100 : 0, true); } // Fast run toggled. else if (item == fastRunCheckbox) { PlayerFastRun = _checked; SetRunSprintMultiplierForPlayer(Game.Player.Handle, (_checked ? 1.49f : 1f)); } // Fast swim toggled. else if (item == fastSwimCheckbox) { PlayerFastSwim = _checked; SetSwimMultiplierForPlayer(Game.Player.Handle, (_checked ? 1.49f : 1f)); } // Super jump toggled. else if (item == superJumpCheckbox) { PlayerSuperJump = _checked; } // No ragdoll toggled. else if (item == noRagdollCheckbox) { PlayerNoRagdoll = _checked; } // Never wanted toggled. else if (item == neverWantedCheckbox) { PlayerNeverWanted = _checked; if (!_checked) { SetMaxWantedLevel(5); } else { SetMaxWantedLevel(0); } } // Everyone ignores player toggled. else if (item == everyoneIgnoresPlayerCheckbox) { PlayerIsIgnored = _checked; // Manage player is ignored by everyone. SetEveryoneIgnorePlayer(Game.Player.Handle, PlayerIsIgnored); SetPoliceIgnorePlayer(Game.Player.Handle, PlayerIsIgnored); SetPlayerCanBeHassledByGangs(Game.Player.Handle, !PlayerIsIgnored); } else if (item == playerStayInVehicleCheckbox) { PlayerStayInVehicle = _checked; } // Freeze player toggled. else if (item == playerFrozenCheckbox) { PlayerFrozen = _checked; if (MainMenu.NoClipMenu != null && !MainMenu.NoClipEnabled) { FreezeEntityPosition(Game.PlayerPed.Handle, PlayerFrozen); } else if (!MainMenu.NoClipEnabled) { FreezeEntityPosition(Game.PlayerPed.Handle, PlayerFrozen); } } }; // List selections menu.OnListItemSelect += (sender, listItem, listIndex, itemIndex) => { // Set wanted Level if (listItem == setWantedLevel) { SetPlayerWantedLevel(Game.Player.Handle, listIndex, false); SetPlayerWantedLevelNow(Game.Player.Handle, false); } // Player Scenarios else if (listItem == playerScenarios) { PlayScenario(PedScenarios.ScenarioNames[PedScenarios.Scenarios[listIndex]]); } else if (listItem == setArmorItem) { Game.PlayerPed.Armor = (listItem.ListIndex) * 20; } }; // button presses menu.OnItemSelect += (sender, item, index) => { // Force Stop Scenario button if (item == stopScenario) { // Play a new scenario named "forcestop" (this scenario doesn't exist, but the "Play" function checks // for the string "forcestop", if that's provided as th scenario name then it will forcefully clear the player task. PlayScenario("forcestop"); } else if (item == healPlayerBtn) { Game.PlayerPed.Health = Game.PlayerPed.MaxHealth; Notify.Success("Player healed."); } else if (item == cleanPlayerBtn) { Game.PlayerPed.ClearBloodDamage(); Notify.Success("Player clothes have been cleaned."); } else if (item == dryPlayerBtn) { Game.PlayerPed.WetnessHeight = 0f; Notify.Success("Player is now dry."); } else if (item == wetPlayerBtn) { Game.PlayerPed.WetnessHeight = 2f; Notify.Success("Player is now wet."); } else if (item == suicidePlayerBtn) { CommitSuicide(); } }; #endregion }
/// <summary> /// Saves all personal settings to the client storage. /// </summary> public static void SaveSettings() { Dictionary <string, dynamic> prefs = new Dictionary <string, dynamic>(); if (MainMenu.PlayerOptionsMenu != null) { EveryoneIgnorePlayer = MainMenu.PlayerOptionsMenu.PlayerIsIgnored; prefs.Add("everyoneIgnorePlayer", EveryoneIgnorePlayer); FastRun = MainMenu.PlayerOptionsMenu.PlayerFastRun; prefs.Add("fastRun", FastRun); FastSwim = MainMenu.PlayerOptionsMenu.PlayerFastSwim; prefs.Add("fastSwim", FastSwim); NeverWanted = MainMenu.PlayerOptionsMenu.PlayerNeverWanted; prefs.Add("neverWanted", NeverWanted); NoRagdoll = MainMenu.PlayerOptionsMenu.PlayerNoRagdoll; prefs.Add("noRagdoll", NoRagdoll); PlayerGodMode = MainMenu.PlayerOptionsMenu.PlayerGodMode; prefs.Add("playerGodMode", PlayerGodMode); PlayerStayInVehicle = MainMenu.PlayerOptionsMenu.PlayerStayInVehicle; prefs.Add("playerStayInVehicle", PlayerStayInVehicle); SuperJump = MainMenu.PlayerOptionsMenu.PlayerSuperJump; prefs.Add("superJump", SuperJump); UnlimitedStamina = MainMenu.PlayerOptionsMenu.PlayerStamina; prefs.Add("unlimitedStamina", UnlimitedStamina); } if (MainMenu.MiscSettingsMenu != null) { MiscDeathNotifications = MainMenu.MiscSettingsMenu.DeathNotifications; prefs.Add("miscDeathNotifications", MiscDeathNotifications); MiscJoinQuitNotifications = MainMenu.MiscSettingsMenu.JoinQuitNotifications; prefs.Add("miscJoinQuitNotifications", MiscJoinQuitNotifications); MiscSpeedKmh = MainMenu.MiscSettingsMenu.ShowSpeedoKmh; prefs.Add("miscSpeedKmh", MiscSpeedKmh); MiscSpeedMph = MainMenu.MiscSettingsMenu.ShowSpeedoMph; prefs.Add("miscSpeedMph", MiscSpeedMph); MiscShowLocation = MainMenu.MiscSettingsMenu.ShowLocation; prefs.Add("miscShowLocation", MiscShowLocation); MiscLocationBlips = MainMenu.MiscSettingsMenu.ShowLocationBlips; prefs.Add("miscLocationBlips", MiscLocationBlips); MiscShowPlayerBlips = MainMenu.MiscSettingsMenu.ShowPlayerBlips; prefs.Add("miscShowPlayerBlips", MiscShowPlayerBlips); MiscShowOverheadNames = MainMenu.MiscSettingsMenu.MiscShowOverheadNames; prefs.Add("miscShowOverheadNames", MiscShowOverheadNames); MiscRespawnDefaultCharacter = MainMenu.MiscSettingsMenu.MiscRespawnDefaultCharacter; prefs.Add("miscRespawnDefaultCharacter", MiscRespawnDefaultCharacter); MiscRestorePlayerAppearance = MainMenu.MiscSettingsMenu.RestorePlayerAppearance; prefs.Add("miscRestorePlayerAppearance", MiscRestorePlayerAppearance); MiscRestorePlayerWeapons = MainMenu.MiscSettingsMenu.RestorePlayerWeapons; prefs.Add("miscRestorePlayerWeapons", MiscRestorePlayerWeapons); MiscShowTime = MainMenu.MiscSettingsMenu.DrawTimeOnScreen; prefs.Add("miscShowTime", MiscShowTime); MiscRightAlignMenu = MainMenu.MiscSettingsMenu.MiscRightAlignMenu; prefs.Add("miscRightAlignMenu", MiscRightAlignMenu); MiscDisablePrivateMessages = MainMenu.MiscSettingsMenu.MiscDisablePrivateMessages; prefs.Add("miscDisablePrivateMessages", MiscDisablePrivateMessages); MiscDisableControllerSupport = MainMenu.MiscSettingsMenu.MiscDisableControllerSupport; prefs.Add("miscDisableControllerSupport", MiscDisableControllerSupport); KbTpToWaypoint = MainMenu.MiscSettingsMenu.KbTpToWaypoint; prefs.Add("kbTpToWaypoint", KbTpToWaypoint); KbDriftMode = MainMenu.MiscSettingsMenu.KbDriftMode; prefs.Add("kbDriftMode", KbDriftMode); KbRecordKeys = MainMenu.MiscSettingsMenu.KbRecordKeys; prefs.Add("kbRecordKeys", KbRecordKeys); KbRadarKeys = MainMenu.MiscSettingsMenu.KbRadarKeys; prefs.Add("kbRadarKeys", KbRadarKeys); KbPointKeys = MainMenu.MiscSettingsMenu.KbPointKeys; prefs.Add("kbPointKeys", KbPointKeys); } if (MainMenu.VehicleOptionsMenu != null) { VehicleEngineAlwaysOn = MainMenu.VehicleOptionsMenu.VehicleEngineAlwaysOn; prefs.Add("vehicleEngineAlwaysOn", VehicleEngineAlwaysOn); VehicleGodMode = MainMenu.VehicleOptionsMenu.VehicleGodMode; prefs.Add("vehicleGodMode", VehicleGodMode); VehicleGodInvincible = MainMenu.VehicleOptionsMenu.VehicleGodInvincible; prefs.Add("vehicleGodInvincible", VehicleGodInvincible); VehicleGodEngine = MainMenu.VehicleOptionsMenu.VehicleGodEngine; prefs.Add("vehicleGodEngine", VehicleGodEngine); VehicleGodVisual = MainMenu.VehicleOptionsMenu.VehicleGodVisual; prefs.Add("vehicleGodVisual", VehicleGodVisual); VehicleGodStrongWheels = MainMenu.VehicleOptionsMenu.VehicleGodStrongWheels; prefs.Add("vehicleGodStrongWheels", VehicleGodStrongWheels); VehicleGodRamp = MainMenu.VehicleOptionsMenu.VehicleGodRamp; prefs.Add("vehicleGodRamp", VehicleGodRamp); VehicleGodAutoRepair = MainMenu.VehicleOptionsMenu.VehicleGodAutoRepair; prefs.Add("vehicleGodAutoRepair", VehicleGodAutoRepair); //VehicleSpecialGodMode = MainMenu.VehicleOptionsMenu.VehicleSpecialGodMode; //prefs.Add("vehicleSpecialGodMode", VehicleSpecialGodMode); VehicleNeverDirty = MainMenu.VehicleOptionsMenu.VehicleNeverDirty; prefs.Add("vehicleNeverDirty", VehicleNeverDirty); VehicleNoBikeHelmet = MainMenu.VehicleOptionsMenu.VehicleNoBikeHelemet; prefs.Add("vehicleNoBikeHelmet", VehicleNoBikeHelmet); VehicleNoSiren = MainMenu.VehicleOptionsMenu.VehicleNoSiren; prefs.Add("vehicleNoSiren", VehicleNoSiren); VehicleHighbeamsOnHonk = MainMenu.VehicleOptionsMenu.FlashHighbeamsOnHonk; prefs.Add("vehicleHighbeamsOnHonk", VehicleHighbeamsOnHonk); VehicleDisablePlaneTurbulence = MainMenu.VehicleOptionsMenu.DisablePlaneTurbulence; prefs.Add("vehicleDisablePlaneTurbulence", VehicleDisablePlaneTurbulence); VehicleBikeSeatbelt = MainMenu.VehicleOptionsMenu.VehicleBikeSeatbelt; prefs.Add("vehicleBikeSeatbelt", VehicleBikeSeatbelt); } if (MainMenu.VehicleSpawnerMenu != null) { VehicleSpawnerReplacePrevious = MainMenu.VehicleSpawnerMenu.ReplaceVehicle; prefs.Add("vehicleSpawnerReplacePrevious", VehicleSpawnerReplacePrevious); VehicleSpawnerSpawnInside = MainMenu.VehicleSpawnerMenu.SpawnInVehicle; prefs.Add("vehicleSpawnerSpawnInside", VehicleSpawnerSpawnInside); } if (MainMenu.VoiceChatSettingsMenu != null) { VoiceChatEnabled = MainMenu.VoiceChatSettingsMenu.EnableVoicechat; prefs.Add("voiceChatEnabled", VoiceChatEnabled); VoiceChatProximity = MainMenu.VoiceChatSettingsMenu.currentProximity; prefs.Add("voiceChatProximity", VoiceChatProximity); ShowCurrentSpeaker = MainMenu.VoiceChatSettingsMenu.ShowCurrentSpeaker; prefs.Add("voiceChatShowSpeaker", ShowCurrentSpeaker); ShowVoiceStatus = MainMenu.VoiceChatSettingsMenu.ShowVoiceStatus; prefs.Add("voiceChatShowVoiceStatus", ShowVoiceStatus); } if (MainMenu.WeaponOptionsMenu != null) { WeaponsNoReload = MainMenu.WeaponOptionsMenu.NoReload; prefs.Add("weaponsNoReload", WeaponsNoReload); WeaponsUnlimitedAmmo = MainMenu.WeaponOptionsMenu.UnlimitedAmmo; prefs.Add("weaponsUnlimitedAmmo", WeaponsUnlimitedAmmo); WeaponsUnlimitedParachutes = MainMenu.WeaponOptionsMenu.UnlimitedParachutes; prefs.Add("weaponsUnlimitedParachutes", WeaponsUnlimitedParachutes); AutoEquipChute = MainMenu.WeaponOptionsMenu.AutoEquipChute; prefs.Add("autoEquipParachuteWhenInPlane", AutoEquipChute); } if (PlayerAppearance.ClothingAnimationType >= 0) { PAClothingAnimationType = PlayerAppearance.ClothingAnimationType; prefs.Add("clothingAnimationType", PAClothingAnimationType); } if (MainMenu.WeaponLoadoutsMenu != null) { WeaponLoadoutsSetLoadoutOnRespawn = MainMenu.WeaponLoadoutsMenu.WeaponLoadoutsSetLoadoutOnRespawn; prefs.Add("weaponLoadoutsSetLoadoutOnRespawn", WeaponLoadoutsSetLoadoutOnRespawn); } if (MainMenu.PersonalVehicleMenu != null) { PVEnableVehicleBlip = MainMenu.PersonalVehicleMenu.EnableVehicleBlip; prefs.Add("pvEnableVehicleBlip", PVEnableVehicleBlip); } Notify.Success("Your settings have been saved."); Log($"Saving preferences:\n{JsonConvert.SerializeObject(prefs)}"); }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { #region create menu and menu items // Create the menu. menu = new Menu(Game.Player.Name, "Player Options"); // Create all checkboxes. MenuCheckboxItem everyoneIgnoresPlayerCheckbox = new MenuCheckboxItem("Everyone Ignore Player", "Everyone will leave you alone.", PlayerIsIgnored); MenuCheckboxItem playerStayInVehicleCheckbox = new MenuCheckboxItem("Stay In Vehicle", "When this is enabled, NPCs will not be able to drag you out of your vehicle if they get angry at you.", PlayerStayInVehicle); MenuCheckboxItem playerFrozenCheckbox = new MenuCheckboxItem("Freeze Player", "Freezes your current location.", PlayerFrozen); // Wanted level options MenuItem healPlayerBtn = new MenuItem("Heal Player", "Give the player max health."); MenuItem cleanPlayerBtn = new MenuItem("Clean Player Clothes", "Clean your player clothes."); MenuItem dryPlayerBtn = new MenuItem("Dry Player Clothes", "Make your player clothes dry."); MenuItem wetPlayerBtn = new MenuItem("Wet Player Clothes", "Make your player clothes wet."); MenuItem suicidePlayerBtn = new MenuItem("~r~Commit Suicide", "Kill yourself by taking the pill. Or by using a pistol if you have one."); Menu vehicleAutoPilot = new Menu("Auto Pilot", "Vehicle auto pilot options."); MenuController.AddSubmenu(menu, vehicleAutoPilot); MenuItem vehicleAutoPilotBtn = new MenuItem("Vehicle Auto Pilot Menu", "Manage vehicle auto pilot options.") { Label = "→→→" }; MenuItem stopScenario = new MenuItem("Force Stop Scenario", "This will force a playing scenario to stop immediately, without waiting for it to finish it's 'stopping' animation."); #endregion #region add items to menu based on permissions // Add all checkboxes to the menu. (keeping permissions in mind) if (IsAllowed(Permission.POIgnored)) { menu.AddMenuItem(everyoneIgnoresPlayerCheckbox); } if (IsAllowed(Permission.POStayInVehicle)) { menu.AddMenuItem(playerStayInVehicleCheckbox); } if (IsAllowed(Permission.POMaxHealth)) { menu.AddMenuItem(healPlayerBtn); } if (IsAllowed(Permission.POCleanPlayer)) { menu.AddMenuItem(cleanPlayerBtn); } if (IsAllowed(Permission.PODryPlayer)) { menu.AddMenuItem(dryPlayerBtn); } if (IsAllowed(Permission.POWetPlayer)) { menu.AddMenuItem(wetPlayerBtn); } menu.AddMenuItem(suicidePlayerBtn); if (IsAllowed(Permission.POFreeze)) { menu.AddMenuItem(playerFrozenCheckbox); } if (IsAllowed(Permission.POScenarios)) { menu.AddMenuItem(stopScenario); } #endregion #region handle all events // Checkbox changes. menu.OnCheckboxChange += (sender, item, itemIndex, _checked) => { // Everyone ignores player toggled. if (item == everyoneIgnoresPlayerCheckbox) { PlayerIsIgnored = _checked; // Manage player is ignored by everyone. SetEveryoneIgnorePlayer(Game.Player.Handle, PlayerIsIgnored); SetPoliceIgnorePlayer(Game.Player.Handle, PlayerIsIgnored); SetPlayerCanBeHassledByGangs(Game.Player.Handle, !PlayerIsIgnored); } else if (item == playerStayInVehicleCheckbox) { PlayerStayInVehicle = _checked; } // Freeze player toggled. else if (item == playerFrozenCheckbox) { PlayerFrozen = _checked; if (!MainMenu.NoClipEnabled) { FreezeEntityPosition(Game.PlayerPed.Handle, PlayerFrozen); } else if (!MainMenu.NoClipEnabled) { FreezeEntityPosition(Game.PlayerPed.Handle, PlayerFrozen); } } }; // button presses menu.OnItemSelect += (sender, item, index) => { // Force Stop Scenario button if (item == stopScenario) { // Play a new scenario named "forcestop" (this scenario doesn't exist, but the "Play" function checks // for the string "forcestop", if that's provided as th scenario name then it will forcefully clear the player task. PlayScenario("forcestop"); } else if (item == healPlayerBtn) { Game.PlayerPed.Health = Game.PlayerPed.MaxHealth; Notify.Success("Player healed."); } else if (item == cleanPlayerBtn) { Game.PlayerPed.ClearBloodDamage(); Notify.Success("Player clothes have been cleaned."); } else if (item == dryPlayerBtn) { Game.PlayerPed.WetnessHeight = 0f; Notify.Success("Player is now dry."); } else if (item == wetPlayerBtn) { Game.PlayerPed.WetnessHeight = 2f; Notify.Success("Player is now wet."); } else if (item == suicidePlayerBtn) { CommitSuicide(); } }; #endregion }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { string menuTitle = "儲存載具"; #region Create menus and submenus // Create the menu. menu = new Menu(menuTitle, "管理已保存的載具"); MenuItem saveVehicle = new MenuItem("保存當前載具", "保存您當前坐入之載具."); menu.AddMenuItem(saveVehicle); saveVehicle.LeftIcon = MenuItem.Icon.CAR; menu.OnItemSelect += (sender, item, index) => { if (item == saveVehicle) { if (Game.PlayerPed.IsInVehicle()) { SaveVehicle(); } else { Notify.Error("您目前不在任何車輛中。 請先輸入車輛再嘗試保存."); } } }; for (int i = 0; i < 22; i++) { Menu categoryMenu = new Menu("儲存車輛", GetLabelText($"VEH_CLASS_{i}")); MenuItem categoryButton = new MenuItem(GetLabelText($"VEH_CLASS_{i}"), $"從中保存的所有車輛 {(GetLabelText($"VEH_CLASS_{i}"))} 類型."); subMenus.Add(categoryMenu); MenuController.AddSubmenu(menu, categoryMenu); menu.AddMenuItem(categoryButton); categoryButton.Label = "→→→"; MenuController.BindMenuItem(menu, categoryMenu, categoryButton); categoryMenu.OnMenuClose += (sender) => { UpdateMenuAvailableCategories(); }; categoryMenu.OnItemSelect += (sender, item, index) => { UpdateSelectedVehicleMenu(item, sender); }; } MenuItem unavailableModels = new MenuItem("車輛遺失", "在遊戲文件中找不到該模組。可能原因這是一個附加載具,並且伺服器當前未對其進行處理.") { Label = "→→→" }; menu.AddMenuItem(unavailableModels); MenuController.BindMenuItem(menu, unavailableVehiclesMenu, unavailableModels); MenuController.AddSubmenu(menu, unavailableVehiclesMenu); MenuController.AddMenu(selectedVehicleMenu); MenuItem spawnVehicle = new MenuItem("生成車輛", "生成此已保存的車輛."); MenuItem renameVehicle = new MenuItem("重命名車輛", "重命名您保存的車輛."); MenuItem replaceVehicle = new MenuItem("~r~更換車輛", "您保存的車輛將被您當前所坐的車輛代替。~r~警告:這無法撤消!"); MenuItem deleteVehicle = new MenuItem("~r~刪除車輛", "~r~這將刪除您保存的車輛。警告:這不能撤消!"); selectedVehicleMenu.AddMenuItem(spawnVehicle); selectedVehicleMenu.AddMenuItem(renameVehicle); selectedVehicleMenu.AddMenuItem(replaceVehicle); selectedVehicleMenu.AddMenuItem(deleteVehicle); selectedVehicleMenu.OnMenuOpen += (sender) => { spawnVehicle.Label = "(" + GetDisplayNameFromVehicleModel(currentlySelectedVehicle.Value.model).ToLower() + ")"; }; selectedVehicleMenu.OnMenuClose += (sender) => { selectedVehicleMenu.RefreshIndex(); deleteButtonPressedCount = 0; deleteVehicle.Label = ""; }; selectedVehicleMenu.OnItemSelect += async(sender, item, index) => { if (item == spawnVehicle) { if (MainMenu.VehicleSpawnerMenu != null) { SpawnVehicle(currentlySelectedVehicle.Value.model, MainMenu.VehicleSpawnerMenu.SpawnInVehicle, MainMenu.VehicleSpawnerMenu.ReplaceVehicle, false, vehicleInfo: currentlySelectedVehicle.Value, saveName: currentlySelectedVehicle.Key.Substring(4)); } else { SpawnVehicle(currentlySelectedVehicle.Value.model, true, true, false, vehicleInfo: currentlySelectedVehicle.Value, saveName: currentlySelectedVehicle.Key.Substring(4)); } } else if (item == renameVehicle) { string newName = await GetUserInput(windowTitle : "輸入此車輛的新名稱.", maxInputLength : 30); if (string.IsNullOrEmpty(newName)) { Notify.Error(CommonErrors.InvalidInput); } else { if (StorageManager.SaveVehicleInfo("veh_" + newName, currentlySelectedVehicle.Value, false)) { DeleteResourceKvp(currentlySelectedVehicle.Key); while (!selectedVehicleMenu.Visible) { await BaseScript.Delay(0); } Notify.Success("您的車輛已成功重命名."); UpdateMenuAvailableCategories(); selectedVehicleMenu.GoBack(); currentlySelectedVehicle = new KeyValuePair <string, VehicleInfo>(); // clear the old info } else { Notify.Error("此名稱已被使用或未知失敗。 如果您認為有問題,請與服務器所有者聯繫。"); } } } else if (item == replaceVehicle) { if (Game.PlayerPed.IsInVehicle()) { SaveVehicle(currentlySelectedVehicle.Key.Substring(4)); selectedVehicleMenu.GoBack(); Notify.Success("您保存的車輛已替換為當前車輛."); } else { Notify.Error("您需要先上車才能更換舊車."); } } else if (item == deleteVehicle) { if (deleteButtonPressedCount == 0) { deleteButtonPressedCount = 1; item.Label = "再按一次確認."; Notify.Alert("您確定要刪除這輛車嗎? 再按一次按鈕確認."); } else { deleteButtonPressedCount = 0; item.Label = ""; DeleteResourceKvp(currentlySelectedVehicle.Key); UpdateMenuAvailableCategories(); selectedVehicleMenu.GoBack(); Notify.Success("您保存的車輛已被刪除."); } } if (item != deleteVehicle) // if any other button is pressed, restore the delete vehicle button pressed count. { deleteButtonPressedCount = 0; deleteVehicle.Label = ""; } }; unavailableVehiclesMenu.InstructionalButtons.Add(Control.FrontendDelete, "刪除載具!"); unavailableVehiclesMenu.ButtonPressHandlers.Add(new Menu.ButtonPressHandler(Control.FrontendDelete, Menu.ControlPressCheckType.JUST_RELEASED, new Action <Menu, Control>((m, c) => { if (m.Size > 0) { int index = m.CurrentIndex; if (index < m.Size) { MenuItem item = m.GetMenuItems().Find(i => i.Index == index); if (item != null && (item.ItemData is KeyValuePair <string, VehicleInfo> sd)) { if (item.Label == "~r~您確定嗎?") { Log("Unavailable saved vehicle deleted, data: " + JsonConvert.SerializeObject(sd)); DeleteResourceKvp(sd.Key); unavailableVehiclesMenu.GoBack(); UpdateMenuAvailableCategories(); } else { item.Label = "~r~您確定嗎?"; } } else { Notify.Error("不知何故找不到這輛車."); } } else { Notify.Error("您以某種方式設法觸發了一個不存在的菜單項的刪除...?"); } }
/// <summary> /// Creates the menu. /// </summary> void CreateMenu() { #region Create menus and submenus // Create the menu. menu = new Menu("Saved Vehicles", "Manage Saved Vehicles"); var saveVehicle = new MenuItem("Save Current Vehicle", "Save the vehicle you are currently sitting in."); menu.AddMenuItem(saveVehicle); saveVehicle.RightIcon = MenuItem.Icon.CAR; menu.OnItemSelect += (sender, item, index) => { if (item == saveVehicle) { if (Game.PlayerPed.IsInVehicle()) { SaveVehicle(); } else { Notify.Error("You are currently not in any vehicle. Please enter a vehicle before trying to save it."); } } }; for (int i = 0; i < array.brands.Count(); i++) { var categoryName = array.brands[i].brandName; var categoryMenu = new Menu("Saved Vehicles", categoryName); var categoryButton = new MenuItem(categoryName, $"All saved vehicles from the {categoryName} category."); subMenus.Add(categoryMenu); MenuController.AddSubmenu(menu, categoryMenu); menu.AddMenuItem(categoryButton); categoryButton.Label = "→→→"; MenuController.BindMenuItem(menu, categoryMenu, categoryButton); categoryMenu.OnMenuClose += (sender) => { UpdateMenuAvailableCategories(); }; categoryMenu.OnItemSelect += (sender, item, index) => { UpdateSelectedVehicleMenu(item, sender); }; } var unavailableModels = new MenuItem("Unavailable Saved Vehicles", "These vehicles are currently unavailable because the models are not present in the game. These vehicles are most likely not being streamed from the server.") { Label = "→→→" }; MenuController.AddMenu(selectedVehicleMenu); var spawnVehicle = new MenuItem("Spawn Vehicle", "Spawn this saved vehicle."); var renameVehicle = new MenuItem("Rename Vehicle", "Rename your saved vehicle."); var replaceVehicle = new MenuItem("~r~Replace Vehicle", "Your saved vehicle will be replaced with the vehicle you are currently sitting in. ~r~Warning: this can NOT be undone!"); var deleteVehicle = new MenuItem("~r~Delete Vehicle", "~r~This will delete your saved vehicle. Warning: this can NOT be undone!"); selectedVehicleMenu.AddMenuItem(spawnVehicle); selectedVehicleMenu.AddMenuItem(renameVehicle); selectedVehicleMenu.AddMenuItem(replaceVehicle); selectedVehicleMenu.AddMenuItem(deleteVehicle); selectedVehicleMenu.OnMenuOpen += (sender) => { spawnVehicle.Label = "(" + GetDisplayNameFromVehicleModel(currentlySelectedVehicle.Value.model).ToLower() + ")"; }; selectedVehicleMenu.OnMenuClose += (sender) => { selectedVehicleMenu.RefreshIndex(); deleteButtonPressedCount = 0; deleteVehicle.Label = ""; }; selectedVehicleMenu.OnItemSelect += async(sender, item, index) => { if (item == spawnVehicle) { if (MainMenu.VehicleSpawnerMenu != null) { if (IsAllowed(Permission.VSSpawnByName)) { SpawnVehicle(currentlySelectedVehicle.Value.model, MainMenu.VehicleSpawnerMenu.SpawnInVehicle, MainMenu.VehicleSpawnerMenu.ReplaceVehicle, false, vehicleInfo: currentlySelectedVehicle.Value, saveName: currentlySelectedVehicle.Key.Substring(4)); Exports["vstancer"].LoadVStancerPreset(); } else { if (CanSpawn) { SpawnVehicle(currentlySelectedVehicle.Value.model, MainMenu.VehicleSpawnerMenu.SpawnInVehicle, MainMenu.VehicleSpawnerMenu.ReplaceVehicle, false, vehicleInfo: currentlySelectedVehicle.Value, saveName: currentlySelectedVehicle.Key.Substring(4)); Exports["vstancer"].LoadVStancerPreset(); Spawned(); int tmpTimer = GetGameTimer(); while (GetGameTimer() - tmpTimer < 6000) // wait 30 _real_ seconds { await Delay(0); float carCoolDownState = (GetGameTimer() - (float)tmpTimer) / 6000f; spawnVehicle.Enabled = false; spawnVehicle.Description = $"Cooldown: {Math.Ceiling(6f - (6f * carCoolDownState))}"; } spawnVehicle.Enabled = true; spawnVehicle.Description = "Spawn this saved vehicle."; } else { Notify.Info("Wait for the 6 second cooldown before spawning another car"); } MainMenu.SavedVehiclesMenu.GetMenu().CounterPreText = null; } } else { SpawnVehicle(currentlySelectedVehicle.Value.model, true, true, false, vehicleInfo: currentlySelectedVehicle.Value, saveName: currentlySelectedVehicle.Key.Substring(4)); } } else if (item == renameVehicle) { var newName = await GetUserInput(windowTitle : "Enter a new name for this vehicle.", maxInputLength : 30); if (string.IsNullOrEmpty(newName)) { Notify.Error(CommonErrors.InvalidInput); } else { if (StorageManager.SaveVehicleInfo("veh_" + newName, currentlySelectedVehicle.Value, false)) { DeleteResourceKvp(currentlySelectedVehicle.Key); while (!selectedVehicleMenu.Visible) { await Delay(0); } Notify.Success("Your vehicle has successfully been renamed."); UpdateMenuAvailableCategories(); selectedVehicleMenu.GoBack(); currentlySelectedVehicle = new KeyValuePair <string, VehicleInfo>(); // clear the old info } else { Notify.Error("This name is already in use or something unknown failed. Contact the server owner if you believe something is wrong."); } } } else if (item == replaceVehicle) { if (Game.PlayerPed.IsInVehicle()) { SaveVehicle(currentlySelectedVehicle.Key.Substring(4)); selectedVehicleMenu.GoBack(); Notify.Success("Your saved vehicle has been replaced with your current vehicle."); } else { Notify.Error("You need to be in a vehicle before you can relplace your old vehicle."); } } else if (item == deleteVehicle) { if (deleteButtonPressedCount == 0) { deleteButtonPressedCount = 1; item.Label = "Press again to confirm."; Notify.Alert("Are you sure you want to delete this vehicle? Press the button again to confirm."); } else { deleteButtonPressedCount = 0; item.Label = ""; DeleteResourceKvp(currentlySelectedVehicle.Key); UpdateMenuAvailableCategories(); selectedVehicleMenu.GoBack(); Notify.Success("Your saved vehicle has been deleted."); } } if (item != deleteVehicle) // if any other button is pressed, restore the delete vehicle button pressed count. { deleteButtonPressedCount = 0; deleteVehicle.Label = ""; } }; #endregion }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { #region create main weapon options menu and add items // Create the menu. menu = new UIMenu(GetPlayerName(PlayerId()), "Weapon Options", true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; UIMenuItem getAllWeapons = new UIMenuItem("Get All Weapons", "Get all weapons."); UIMenuItem removeAllWeapons = new UIMenuItem("Remove All Weapons", "Removes all weapons in your inventory."); UIMenuCheckboxItem unlimitedAmmo = new UIMenuCheckboxItem("Unlimited Ammo", UnlimitedAmmo, "Unlimited ammonition supply."); UIMenuCheckboxItem noReload = new UIMenuCheckboxItem("No Reload", NoReload, "Never reload."); UIMenuItem setAmmo = new UIMenuItem("Set All Ammo Count", "Set the amount of ammo in all your weapons."); UIMenuItem refillMaxAmmo = new UIMenuItem("Refill All Ammo", "Give all your weapons max ammo."); ValidWeapons vw = new ValidWeapons(); UIMenuItem spawnByName = new UIMenuItem("Spawn Weapon By Name", "Enter a weapon mode name to spawn."); // Add items based on permissions if (cf.IsAllowed(Permission.WPGetAll)) { menu.AddItem(getAllWeapons); } if (cf.IsAllowed(Permission.WPRemoveAll)) { menu.AddItem(removeAllWeapons); } if (cf.IsAllowed(Permission.WPUnlimitedAmmo)) { menu.AddItem(unlimitedAmmo); } if (cf.IsAllowed(Permission.WPNoReload)) { menu.AddItem(noReload); } if (cf.IsAllowed(Permission.WPSetAllAmmo)) { menu.AddItem(setAmmo); menu.AddItem(refillMaxAmmo); } if (cf.IsAllowed(Permission.WPSpawn)) { menu.AddItem(spawnByName); } #endregion #region addonweapons submenu UIMenuItem addonWeaponsBtn = new UIMenuItem("Addon Weapons", "Equip / remove addon weapons available on this server."); UIMenu addonWeaponsMenu = new UIMenu("Addon Weapons", "Equip/Remove Addon Weapons", true) { MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false, ScaleWithSafezone = false }; menu.AddItem(addonWeaponsBtn); #region manage creating and accessing addon weapons menu if (cf.IsAllowed(Permission.WPSpawn) && AddonWeapons != null && AddonWeapons.Count > 0) { menu.BindMenuToItem(addonWeaponsMenu, addonWeaponsBtn); foreach (KeyValuePair <string, uint> weapon in AddonWeapons) { string name = weapon.Key.ToString(); uint model = weapon.Value; var item = new UIMenuItem(name, $"Click to add/remove this weapon ({name}) to/from your inventory."); addonWeaponsMenu.AddItem(item); if (!IsWeaponValid(model)) { item.Enabled = false; item.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); item.Description = "This model is not available. Please ask the server owner to verify it's being streamed correctly."; } } addonWeaponsMenu.OnItemSelect += (sender, item, index) => { var weapon = AddonWeapons.ElementAt(index); if (HasPedGotWeapon(PlayerPedId(), weapon.Value, false)) { RemoveWeaponFromPed(PlayerPedId(), weapon.Value); } else { var maxAmmo = 200; GetMaxAmmo(PlayerPedId(), weapon.Value, ref maxAmmo); GiveWeaponToPed(PlayerPedId(), weapon.Value, maxAmmo, false, true); } }; addonWeaponsBtn.SetRightLabel("→→→"); } else { addonWeaponsBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); addonWeaponsBtn.Enabled = false; addonWeaponsBtn.Description = "This option is not available on this server because you don't have permission to use it, or it is not setup correctly."; } #endregion addonWeaponsMenu.RefreshIndex(); addonWeaponsMenu.UpdateScaleform(); #endregion #region parachute options menu #region parachute buttons and submenus UIMenuItem parachuteBtn = new UIMenuItem("Parachute Options", "All parachute related options can be changed here."); UIMenu parachuteMenu = new UIMenu("Parachute Options", "Parachute Options", true) { MouseEdgeEnabled = false, MouseControlsEnabled = false, ControlDisablingEnabled = false, ScaleWithSafezone = false }; UIMenu primaryChute = new UIMenu("Parachute Options", "Select A Primary Parachute", true) { MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false, ScaleWithSafezone = false }; UIMenu secondaryChute = new UIMenu("Parachute Options", "Select A Reserve Parachute", true) { MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false, ScaleWithSafezone = false }; UIMenuItem chute = new UIMenuItem("No Style", "Default parachute."); UIMenuItem chute0 = new UIMenuItem(GetLabelText("PM_TINT0"), GetLabelText("PD_TINT0")); // Rainbow Chute UIMenuItem chute1 = new UIMenuItem(GetLabelText("PM_TINT1"), GetLabelText("PD_TINT1")); // Red Chute UIMenuItem chute2 = new UIMenuItem(GetLabelText("PM_TINT2"), GetLabelText("PD_TINT2")); // Seaside Stripes Chute UIMenuItem chute3 = new UIMenuItem(GetLabelText("PM_TINT3"), GetLabelText("PD_TINT3")); // Window Maker Chute UIMenuItem chute4 = new UIMenuItem(GetLabelText("PM_TINT4"), GetLabelText("PD_TINT4")); // Patriot Chute UIMenuItem chute5 = new UIMenuItem(GetLabelText("PM_TINT5"), GetLabelText("PD_TINT5")); // Blue Chute UIMenuItem chute6 = new UIMenuItem(GetLabelText("PM_TINT6"), GetLabelText("PD_TINT6")); // Black Chute UIMenuItem chute7 = new UIMenuItem(GetLabelText("PM_TINT7"), GetLabelText("PD_TINT7")); // Hornet Chute UIMenuItem chute8 = new UIMenuItem(GetLabelText("PS_CAN_0"), "Air Force parachute."); // Air Force Chute UIMenuItem chute9 = new UIMenuItem(GetLabelText("PM_TINT0"), "Desert parachute."); // Desert Chute UIMenuItem chute10 = new UIMenuItem("Shadow Chute", "Shadow parachute."); // Shadow Chute UIMenuItem chute11 = new UIMenuItem(GetLabelText("UNLOCK_NAME_PSRWD"), "High altitude parachute."); // High Altitude Chute UIMenuItem chute12 = new UIMenuItem("Airborne Chute", "Airborne parachute."); // Airborne Chute UIMenuItem chute13 = new UIMenuItem("Sunrise Chute", "Sunrise parachute."); // Sunrise Chute UIMenuItem rchute = new UIMenuItem("No Style", "Default parachute."); UIMenuItem rchute0 = new UIMenuItem(GetLabelText("PM_TINT0"), GetLabelText("PD_TINT0")); // Rainbow Chute UIMenuItem rchute1 = new UIMenuItem(GetLabelText("PM_TINT1"), GetLabelText("PD_TINT1")); // Red Chute UIMenuItem rchute2 = new UIMenuItem(GetLabelText("PM_TINT2"), GetLabelText("PD_TINT2")); // Seaside Stripes Chute UIMenuItem rchute3 = new UIMenuItem(GetLabelText("PM_TINT3"), GetLabelText("PD_TINT3")); // Window Maker Chute UIMenuItem rchute4 = new UIMenuItem(GetLabelText("PM_TINT4"), GetLabelText("PD_TINT4")); // Patriot Chute UIMenuItem rchute5 = new UIMenuItem(GetLabelText("PM_TINT5"), GetLabelText("PD_TINT5")); // Blue Chute UIMenuItem rchute6 = new UIMenuItem(GetLabelText("PM_TINT6"), GetLabelText("PD_TINT6")); // Black Chute UIMenuItem rchute7 = new UIMenuItem(GetLabelText("PM_TINT7"), GetLabelText("PD_TINT7")); // Hornet Chute UIMenuItem rchute8 = new UIMenuItem(GetLabelText("PS_CAN_0"), "Air Force parachute."); // Air Force Chute UIMenuItem rchute9 = new UIMenuItem(GetLabelText("PM_TINT0"), "Desert parachute."); // Desert Chute UIMenuItem rchute10 = new UIMenuItem("Shadow Chute", "Shadow parachute."); // Shadow Chute UIMenuItem rchute11 = new UIMenuItem(GetLabelText("UNLOCK_NAME_PSRWD"), "High altitude parachute."); // High Altitude Chute UIMenuItem rchute12 = new UIMenuItem("Airborne Chute", "Airborne parachute."); // Airborne Chute UIMenuItem rchute13 = new UIMenuItem("Sunrise Chute", "Sunrise parachute."); // Sunrise Chute primaryChute.AddItem(chute); primaryChute.AddItem(chute0); primaryChute.AddItem(chute1); primaryChute.AddItem(chute2); primaryChute.AddItem(chute3); primaryChute.AddItem(chute4); primaryChute.AddItem(chute5); primaryChute.AddItem(chute6); primaryChute.AddItem(chute7); primaryChute.AddItem(chute8); primaryChute.AddItem(chute9); primaryChute.AddItem(chute10); primaryChute.AddItem(chute11); primaryChute.AddItem(chute12); primaryChute.AddItem(chute13); secondaryChute.AddItem(rchute); secondaryChute.AddItem(rchute0); secondaryChute.AddItem(rchute1); secondaryChute.AddItem(rchute2); secondaryChute.AddItem(rchute3); secondaryChute.AddItem(rchute4); secondaryChute.AddItem(rchute5); secondaryChute.AddItem(rchute6); secondaryChute.AddItem(rchute7); secondaryChute.AddItem(rchute8); secondaryChute.AddItem(rchute9); secondaryChute.AddItem(rchute10); secondaryChute.AddItem(rchute11); secondaryChute.AddItem(rchute12); secondaryChute.AddItem(rchute13); #endregion #region handle events primaryChute.OnItemSelect += (sender, item, index) => { SetPedParachuteTintIndex(PlayerPedId(), index - 1); Subtitle.Custom($"Primary parachute style selected: ~r~{item.Text}~s~."); }; secondaryChute.OnItemSelect += (sender, item, index) => { SetPlayerReserveParachuteTintIndex(PlayerId(), index - 1); Subtitle.Custom($"Reserve parachute style selected: ~r~{item.Text}~s~."); }; #endregion #region create more buttons UIMenuItem primaryChuteBtn = new UIMenuItem("Primary Parachute Style", "Select a primary parachute."); UIMenuItem secondaryChuteBtn = new UIMenuItem("Reserve Parachute Style", "Select a reserve parachute."); parachuteMenu.AddItem(primaryChuteBtn); primaryChuteBtn.SetRightLabel("→→→"); parachuteMenu.AddItem(secondaryChuteBtn); secondaryChuteBtn.SetRightLabel("→→→"); parachuteMenu.BindMenuToItem(primaryChute, primaryChuteBtn); parachuteMenu.BindMenuToItem(secondaryChute, secondaryChuteBtn); UIMenuCheckboxItem autoEquipParachute = new UIMenuCheckboxItem("Auto Equip Parachute", AutoEquipChute, "Automatically equip a parachute whenever you enter a plane/helicopter."); parachuteMenu.AddItem(autoEquipParachute); UIMenuItem togglePrimary = new UIMenuItem("Get / Remove Primary Parachute", "Equip a primary parachute."); UIMenuItem toggleSecondary = new UIMenuItem("Get Reserve Parachute", "Equip a reserve parachute, you need to get a primary parachute first before equipping a reserve parachute."); parachuteMenu.AddItem(togglePrimary); parachuteMenu.AddItem(toggleSecondary); #endregion #region handle parachute menu events parachuteMenu.OnItemSelect += (sender, item, index) => { if (item == togglePrimary) { if (HasPedGotWeapon(PlayerPedId(), (uint)WeaponHash.Parachute, false)) { RemoveWeaponFromPed(PlayerPedId(), (uint)WeaponHash.Parachute); Notify.Success("Primary parachute ~r~removed~s~.", true); } else { GiveWeaponToPed(PlayerPedId(), (uint)WeaponHash.Parachute, 1, false, false); Notify.Success("Primary parachute ~g~equippped~s~.", true); } } else if (item == toggleSecondary) { SetPlayerHasReserveParachute(PlayerId()); Notify.Success("Reserve parachute ~g~equippped~s~.", true); } }; parachuteMenu.OnCheckboxChange += (sender, item, _checked) => { if (item == autoEquipParachute) { AutoEquipChute = _checked; } }; #endregion #region parachute smoke trail colors List <dynamic> smokeColor = new List <dynamic>() { "White", "Yellow", "Red", "Green", "Blue", "Dark Gray", }; UIMenuListItem smokeColors = new UIMenuListItem("Smoke Trail Color", smokeColor, 0, "Select a parachute smoke trail color."); parachuteMenu.AddItem(smokeColors); parachuteMenu.OnListChange += (sender, item, index) => { if (item == smokeColors) { SetPlayerCanLeaveParachuteSmokeTrail(PlayerId(), false); if (index == 0) { SetPlayerParachuteSmokeTrailColor(PlayerId(), 255, 255, 255); } else if (index == 1) { SetPlayerParachuteSmokeTrailColor(PlayerId(), 255, 255, 0); } else if (index == 2) { SetPlayerParachuteSmokeTrailColor(PlayerId(), 255, 0, 0); } else if (index == 3) { SetPlayerParachuteSmokeTrailColor(PlayerId(), 0, 255, 0); } else if (index == 4) { SetPlayerParachuteSmokeTrailColor(PlayerId(), 0, 0, 255); } else if (index == 5) { SetPlayerParachuteSmokeTrailColor(PlayerId(), 1, 1, 1); } SetPlayerCanLeaveParachuteSmokeTrail(PlayerId(), true); } }; #endregion #region misc parachute menu setup menu.AddItem(parachuteBtn); parachuteBtn.SetRightLabel("→→→"); menu.BindMenuToItem(parachuteMenu, parachuteBtn); parachuteMenu.RefreshIndex(); parachuteMenu.UpdateScaleform(); primaryChute.RefreshIndex(); primaryChute.UpdateScaleform(); secondaryChute.RefreshIndex(); secondaryChute.UpdateScaleform(); MainMenu.Mp.Add(addonWeaponsMenu); MainMenu.Mp.Add(parachuteMenu); MainMenu.Mp.Add(primaryChute); MainMenu.Mp.Add(secondaryChute); #endregion #endregion #region Create Weapon Category Submenus UIMenuItem spacer = cf.GetSpacerMenuItem("↓ Weapon Categories ↓"); menu.AddItem(spacer); UIMenu handGuns = new UIMenu("Weapons", "Handguns", true) { ScaleWithSafezone = false, ControlDisablingEnabled = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, }; handGuns.SetMenuWidthOffset(50); UIMenuItem handGunsBtn = new UIMenuItem("Handguns"); UIMenu rifles = new UIMenu("Weapons", "Assault Rifles", true) { ScaleWithSafezone = false, ControlDisablingEnabled = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, }; rifles.SetMenuWidthOffset(50); UIMenuItem riflesBtn = new UIMenuItem("Assault Rifles"); UIMenu shotguns = new UIMenu("Weapons", "Shotguns", true) { ScaleWithSafezone = false, ControlDisablingEnabled = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, }; shotguns.SetMenuWidthOffset(50); UIMenuItem shotgunsBtn = new UIMenuItem("Shotguns"); UIMenu smgs = new UIMenu("Weapons", "Sub-/Light Machine Guns", true) { ScaleWithSafezone = false, ControlDisablingEnabled = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, }; smgs.SetMenuWidthOffset(50); UIMenuItem smgsBtn = new UIMenuItem("Sub-/Light Machine Guns"); UIMenu throwables = new UIMenu("Weapons", "Throwables", true) { ScaleWithSafezone = false, ControlDisablingEnabled = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, }; throwables.SetMenuWidthOffset(50); UIMenuItem throwablesBtn = new UIMenuItem("Throwables"); UIMenu melee = new UIMenu("Weapons", "Melee", true) { ScaleWithSafezone = false, ControlDisablingEnabled = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, }; melee.SetMenuWidthOffset(50); UIMenuItem meleeBtn = new UIMenuItem("Melee"); UIMenu heavy = new UIMenu("Weapons", "Heavy Weapons", true) { ScaleWithSafezone = false, ControlDisablingEnabled = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, }; heavy.SetMenuWidthOffset(50); UIMenuItem heavyBtn = new UIMenuItem("Heavy Weapons"); UIMenu snipers = new UIMenu("Weapons", "Sniper Rifles", true) { ScaleWithSafezone = false, ControlDisablingEnabled = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, }; snipers.SetMenuWidthOffset(50); UIMenuItem snipersBtn = new UIMenuItem("Sniper Rifles"); MainMenu.Mp.Add(handGuns); MainMenu.Mp.Add(rifles); MainMenu.Mp.Add(shotguns); MainMenu.Mp.Add(smgs); MainMenu.Mp.Add(throwables); MainMenu.Mp.Add(melee); MainMenu.Mp.Add(heavy); MainMenu.Mp.Add(snipers); #endregion #region Setup weapon category buttons and submenus. handGunsBtn.SetRightLabel("→→→"); menu.AddItem(handGunsBtn); menu.BindMenuToItem(handGuns, handGunsBtn); riflesBtn.SetRightLabel("→→→"); menu.AddItem(riflesBtn); menu.BindMenuToItem(rifles, riflesBtn); shotgunsBtn.SetRightLabel("→→→"); menu.AddItem(shotgunsBtn); menu.BindMenuToItem(shotguns, shotgunsBtn); smgsBtn.SetRightLabel("→→→"); menu.AddItem(smgsBtn); menu.BindMenuToItem(smgs, smgsBtn); throwablesBtn.SetRightLabel("→→→"); menu.AddItem(throwablesBtn); menu.BindMenuToItem(throwables, throwablesBtn); meleeBtn.SetRightLabel("→→→"); menu.AddItem(meleeBtn); menu.BindMenuToItem(melee, meleeBtn); heavyBtn.SetRightLabel("→→→"); menu.AddItem(heavyBtn); menu.BindMenuToItem(heavy, heavyBtn); snipersBtn.SetRightLabel("→→→"); menu.AddItem(snipersBtn); menu.BindMenuToItem(snipers, snipersBtn); #endregion #region Loop through all weapons, create menus for them and add all menu items and handle events. foreach (ValidWeapon weapon in vw.WeaponList) { uint cat = (uint)GetWeapontypeGroup(weapon.Hash); if (weapon.Name != null && (cf.IsAllowed(weapon.Perm) || cf.IsAllowed(Permission.WPGetAll))) { #region Create menu for this weapon and add buttons UIMenu weaponMenu = new UIMenu("Weapon Options", weapon.Name, true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; UIMenuItem weaponItem = new UIMenuItem(weapon.Name, $"Open the options for ~y~{weapon.Name.ToString()}~s~."); weaponItem.SetRightLabel("→→→"); weaponItem.SetLeftBadge(UIMenuItem.BadgeStyle.Gun); MainMenu.Mp.Add(weaponMenu); weaponInfo.Add(weaponMenu, weapon); UIMenuItem getOrRemoveWeapon = new UIMenuItem("Equip/Remove Weapon", "Add or remove this weapon to/form your inventory."); getOrRemoveWeapon.SetLeftBadge(UIMenuItem.BadgeStyle.Gun); weaponMenu.AddItem(getOrRemoveWeapon); if (!cf.IsAllowed(Permission.WPSpawn)) { getOrRemoveWeapon.Enabled = false; getOrRemoveWeapon.Description = "This option has been disabled by the server owner."; getOrRemoveWeapon.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); } UIMenuItem fillAmmo = new UIMenuItem("Re-fill Ammo", "Get max ammo for this weapon."); fillAmmo.SetLeftBadge(UIMenuItem.BadgeStyle.Ammo); weaponMenu.AddItem(fillAmmo); List <dynamic> tints = new List <dynamic>(); if (weapon.Name.Contains(" Mk II")) { foreach (var tint in ValidWeapons.WeaponTintsMkII) { tints.Add(tint.Key); } } else { foreach (var tint in ValidWeapons.WeaponTints) { tints.Add(tint.Key); } } UIMenuListItem weaponTints = new UIMenuListItem("Tints", tints, 0, "Select a tint for your weapon."); weaponMenu.AddItem(weaponTints); #endregion #region Handle weapon specific list changes weaponMenu.OnListChange += (sender, item, index) => { if (item == weaponTints) { if (HasPedGotWeapon(PlayerPedId(), weaponInfo[sender].Hash, false)) { SetPedWeaponTintIndex(PlayerPedId(), weaponInfo[sender].Hash, index); } else { Notify.Error("You need to get the weapon first!"); } } }; #endregion #region Handle weapon specific button presses weaponMenu.OnItemSelect += (sender, item, index) => { if (item == getOrRemoveWeapon) { var info = weaponInfo[sender]; uint hash = info.Hash; if (HasPedGotWeapon(PlayerPedId(), hash, false)) { RemoveWeaponFromPed(PlayerPedId(), hash); Subtitle.Custom("Weapon removed."); } else { var ammo = 255; GetMaxAmmo(PlayerPedId(), hash, ref ammo); GiveWeaponToPed(PlayerPedId(), hash, ammo, false, true); Subtitle.Custom("Weapon added."); } } else if (item == fillAmmo) { if (HasPedGotWeapon(PlayerPedId(), weaponInfo[sender].Hash, false)) { var ammo = 900; GetMaxAmmo(PlayerPedId(), weaponInfo[sender].Hash, ref ammo); SetAmmoInClip(PlayerPedId(), weaponInfo[sender].Hash, ammo); } else { Notify.Error("You need to get the weapon first before re-filling ammo!"); } } }; #endregion #region load components if (weapon.Components != null) { if (weapon.Components.Count > 0) { foreach (var comp in weapon.Components) { UIMenuItem compItem = new UIMenuItem(comp.Key, "Click to equip or remove this component."); weaponComponents.Add(compItem, comp.Key); weaponMenu.AddItem(compItem); #region Handle component button presses weaponMenu.OnItemSelect += (sender, item, index) => { if (item == compItem) { var Weapon = weaponInfo[sender]; var componentHash = Weapon.Components[weaponComponents[item]]; if (HasPedGotWeapon(PlayerPedId(), Weapon.Hash, false)) { if (HasPedGotWeaponComponent(PlayerPedId(), Weapon.Hash, componentHash)) { RemoveWeaponComponentFromPed(PlayerPedId(), Weapon.Hash, componentHash); Subtitle.Custom("Component removed."); } else { GiveWeaponComponentToPed(PlayerPedId(), Weapon.Hash, componentHash); Subtitle.Custom("Component equiped."); } } else { Notify.Error("You need to get the weapon first before you can modify it."); } } }; #endregion } } } #endregion // refresh and add to menu. weaponMenu.RefreshIndex(); weaponMenu.UpdateScaleform(); if (cat == 970310034) // 970310034 rifles { rifles.AddItem(weaponItem); rifles.BindMenuToItem(weaponMenu, weaponItem); } else if (cat == 416676503 || cat == 690389602) // 416676503 hand guns // 690389602 stun gun { handGuns.AddItem(weaponItem); handGuns.BindMenuToItem(weaponMenu, weaponItem); } else if (cat == 860033945) // 860033945 shotguns { shotguns.AddItem(weaponItem); shotguns.BindMenuToItem(weaponMenu, weaponItem); } else if (cat == 3337201093 || cat == 1159398588) // 3337201093 sub machine guns // 1159398588 light machine guns { smgs.AddItem(weaponItem); smgs.BindMenuToItem(weaponMenu, weaponItem); } else if (cat == 1548507267 || cat == 4257178988 || cat == 1595662460) // 1548507267 throwables // 4257178988 fire extinghuiser // jerry can { throwables.AddItem(weaponItem); throwables.BindMenuToItem(weaponMenu, weaponItem); } else if (cat == 3566412244 || cat == 2685387236) // 3566412244 melee weapons // 2685387236 knuckle duster { melee.AddItem(weaponItem); melee.BindMenuToItem(weaponMenu, weaponItem); } else if (cat == 2725924767) // 2725924767 heavy weapons { heavy.AddItem(weaponItem); heavy.BindMenuToItem(weaponMenu, weaponItem); } else if (cat == 3082541095) // 3082541095 sniper rifles { snipers.AddItem(weaponItem); snipers.BindMenuToItem(weaponMenu, weaponItem); } } } #endregion #region Disable submenus if no weapons in that category are allowed. if (handGuns.MenuItems.Count == 0) { menu.ReleaseMenuFromItem(handGunsBtn); handGunsBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); handGunsBtn.Description = "The server owner removed the permissions for all weapons in this category."; handGunsBtn.Enabled = false; } if (rifles.MenuItems.Count == 0) { menu.ReleaseMenuFromItem(riflesBtn); riflesBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); riflesBtn.Description = "The server owner removed the permissions for all weapons in this category."; riflesBtn.Enabled = false; } if (shotguns.MenuItems.Count == 0) { menu.ReleaseMenuFromItem(shotgunsBtn); shotgunsBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); shotgunsBtn.Description = "The server owner removed the permissions for all weapons in this category."; shotgunsBtn.Enabled = false; } if (smgs.MenuItems.Count == 0) { menu.ReleaseMenuFromItem(smgsBtn); smgsBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); smgsBtn.Description = "The server owner removed the permissions for all weapons in this category."; smgsBtn.Enabled = false; } if (throwables.MenuItems.Count == 0) { menu.ReleaseMenuFromItem(throwablesBtn); throwablesBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); throwablesBtn.Description = "The server owner removed the permissions for all weapons in this category."; throwablesBtn.Enabled = false; } if (melee.MenuItems.Count == 0) { menu.ReleaseMenuFromItem(meleeBtn); meleeBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); meleeBtn.Description = "The server owner removed the permissions for all weapons in this category."; meleeBtn.Enabled = false; } if (heavy.MenuItems.Count == 0) { menu.ReleaseMenuFromItem(heavyBtn); heavyBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); heavyBtn.Description = "The server owner removed the permissions for all weapons in this category."; heavyBtn.Enabled = false; } if (snipers.MenuItems.Count == 0) { menu.ReleaseMenuFromItem(snipersBtn); snipersBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); snipersBtn.Description = "The server owner removed the permissions for all weapons in this category."; snipersBtn.Enabled = false; } #endregion #region Handle button presses menu.OnItemSelect += (sender, item, index) => { Ped ped = new Ped(PlayerPedId()); if (item == getAllWeapons) { foreach (var weapon in ValidWeapons.Weapons) { var ammo = 255; GetMaxAmmo(PlayerPedId(), weapon.Value, ref ammo); ped.Weapons.Give((WeaponHash)weapon.Value, ammo, weapon.Key == "Unarmed", true); } ped.Weapons.Give(WeaponHash.Unarmed, 0, true, true); } else if (item == removeAllWeapons) { ped.Weapons.RemoveAll(); } else if (item == setAmmo) { cf.SetAllWeaponsAmmo(); } else if (item == refillMaxAmmo) { foreach (var wp in ValidWeapons.Weapons) { if (ped.Weapons.HasWeapon((WeaponHash)wp.Value)) { int maxammo = 200; GetMaxAmmo(ped.Handle, wp.Value, ref maxammo); SetPedAmmo(ped.Handle, wp.Value, maxammo); } } } else if (item == spawnByName) { cf.SpawnCustomWeapon(); } }; #endregion #region Handle checkbox changes menu.OnCheckboxChange += (sender, item, _checked) => { if (item == noReload) { NoReload = _checked; Subtitle.Custom($"No reload is now {(_checked ? "enabled" : "disabled")}."); } else if (item == unlimitedAmmo) { UnlimitedAmmo = _checked; Subtitle.Custom($"Unlimited ammo is now {(_checked ? "enabled" : "disabled")}."); } }; #endregion }
/// <summary> /// Saves all personal settings to the client storage. /// </summary> public static void SaveSettings() { Dictionary <string, dynamic> prefs = new Dictionary <string, dynamic>(); if (MainMenu.PlayerOptionsMenu != null) { EveryoneIgnorePlayer = MainMenu.PlayerOptionsMenu.PlayerIsIgnored; prefs.Add("everyoneIgnorePlayer", MainMenu.PlayerOptionsMenu.PlayerIsIgnored); FastRun = MainMenu.PlayerOptionsMenu.PlayerFastRun; prefs.Add("fastRun", MainMenu.PlayerOptionsMenu.PlayerFastRun); FastSwim = MainMenu.PlayerOptionsMenu.PlayerFastSwim; prefs.Add("fastSwim", MainMenu.PlayerOptionsMenu.PlayerFastSwim); NeverWanted = MainMenu.PlayerOptionsMenu.PlayerNeverWanted; prefs.Add("neverWanted", MainMenu.PlayerOptionsMenu.PlayerNeverWanted); NoRagdoll = MainMenu.PlayerOptionsMenu.PlayerNoRagdoll; prefs.Add("noRagdoll", MainMenu.PlayerOptionsMenu.PlayerNoRagdoll); PlayerGodMode = MainMenu.PlayerOptionsMenu.PlayerGodMode; prefs.Add("playerGodMode", MainMenu.PlayerOptionsMenu.PlayerGodMode); SuperJump = MainMenu.PlayerOptionsMenu.PlayerSuperJump; prefs.Add("superJump", MainMenu.PlayerOptionsMenu.PlayerSuperJump); UnlimitedStamina = MainMenu.PlayerOptionsMenu.PlayerStamina; prefs.Add("unlimitedStamina", MainMenu.PlayerOptionsMenu.PlayerStamina); } if (MainMenu.MiscSettingsMenu != null) { MiscDeathNotifications = MainMenu.MiscSettingsMenu.DeathNotifications; prefs.Add("miscDeathNotifications", MainMenu.MiscSettingsMenu.DeathNotifications); MiscJoinQuitNotifications = MainMenu.MiscSettingsMenu.JoinQuitNotifications; prefs.Add("miscJoinQuitNotifications", MainMenu.MiscSettingsMenu.JoinQuitNotifications); MiscSpeedKmh = MainMenu.MiscSettingsMenu.ShowSpeedoKmh; prefs.Add("miscSpeedKmh", MainMenu.MiscSettingsMenu.ShowSpeedoKmh); MiscSpeedMph = MainMenu.MiscSettingsMenu.ShowSpeedoMph; prefs.Add("miscSpeedMph", MainMenu.MiscSettingsMenu.ShowSpeedoMph); MiscShowLocation = MainMenu.MiscSettingsMenu.ShowLocation; prefs.Add("miscShowLocation", MainMenu.MiscSettingsMenu.ShowLocation); MiscLocationBlips = MainMenu.MiscSettingsMenu.ShowLocationBlips; prefs.Add("miscLocationBlips", MainMenu.MiscSettingsMenu.ShowLocationBlips); MiscShowPlayerBlips = MainMenu.MiscSettingsMenu.ShowPlayerBlips; prefs.Add("miscShowPlayerBlips", MainMenu.MiscSettingsMenu.ShowPlayerBlips); MiscRespawnDefaultCharacter = MainMenu.MiscSettingsMenu.MiscRespawnDefaultCharacter; prefs.Add("miscRespawnDefaultCharacter", MainMenu.MiscSettingsMenu.MiscRespawnDefaultCharacter); MiscRestorePlayerAppearance = MainMenu.MiscSettingsMenu.RestorePlayerAppearance; prefs.Add("miscRestorePlayerAppearance", MainMenu.MiscSettingsMenu.RestorePlayerAppearance); MiscRestorePlayerWeapons = MainMenu.MiscSettingsMenu.RestorePlayerWeapons; prefs.Add("miscRestorePlayerWeapons", MainMenu.MiscSettingsMenu.RestorePlayerWeapons); MiscShowTime = MainMenu.MiscSettingsMenu.DrawTimeOnScreen; prefs.Add("miscShowTime", MainMenu.MiscSettingsMenu.DrawTimeOnScreen); MiscRightAlignMenu = MainMenu.MiscSettingsMenu.MiscRightAlignMenu; prefs.Add("miscRightAlignMenu", MainMenu.MiscSettingsMenu.MiscRightAlignMenu); KbTpToWaypoint = MainMenu.MiscSettingsMenu.KbTpToWaypoint; prefs.Add("kbTpToWaypoint", MainMenu.MiscSettingsMenu.KbTpToWaypoint); KbDriftMode = MainMenu.MiscSettingsMenu.KbDriftMode; prefs.Add("kbDriftMode", MainMenu.MiscSettingsMenu.KbDriftMode); } if (MainMenu.VehicleOptionsMenu != null) { VehicleEngineAlwaysOn = MainMenu.VehicleOptionsMenu.VehicleEngineAlwaysOn; prefs.Add("vehicleEngineAlwaysOn", MainMenu.VehicleOptionsMenu.VehicleEngineAlwaysOn); VehicleGodMode = MainMenu.VehicleOptionsMenu.VehicleGodMode; prefs.Add("vehicleGodMode", MainMenu.VehicleOptionsMenu.VehicleGodMode); VehicleSpecialGodMode = MainMenu.VehicleOptionsMenu.VehicleSpecialGodMode; prefs.Add("vehicleSpecialGodMode", MainMenu.VehicleOptionsMenu.VehicleSpecialGodMode); VehicleNeverDirty = MainMenu.VehicleOptionsMenu.VehicleNeverDirty; prefs.Add("vehicleNeverDirty", MainMenu.VehicleOptionsMenu.VehicleNeverDirty); VehicleNoBikeHelmet = MainMenu.VehicleOptionsMenu.VehicleNoBikeHelemet; prefs.Add("vehicleNoBikeHelmet", MainMenu.VehicleOptionsMenu.VehicleNoBikeHelemet); VehicleNoSiren = MainMenu.VehicleOptionsMenu.VehicleNoSiren; prefs.Add("vehicleNoSiren", MainMenu.VehicleOptionsMenu.VehicleNoSiren); VehicleHighbeamsOnHonk = MainMenu.VehicleOptionsMenu.FlashHighbeamsOnHonk; prefs.Add("vehicleHighbeamsOnHonk", MainMenu.VehicleOptionsMenu.FlashHighbeamsOnHonk); VehicleDisablePlaneTurbulence = MainMenu.VehicleOptionsMenu.DisablePlaneTurbulence; prefs.Add("vehicleDisablePlaneTurbulence", MainMenu.VehicleOptionsMenu.DisablePlaneTurbulence); } if (MainMenu.VehicleSpawnerMenu != null) { VehicleSpawnerReplacePrevious = MainMenu.VehicleSpawnerMenu.ReplaceVehicle; prefs.Add("vehicleSpawnerReplacePrevious", MainMenu.VehicleSpawnerMenu.ReplaceVehicle); VehicleSpawnerSpawnInside = MainMenu.VehicleSpawnerMenu.SpawnInVehicle; prefs.Add("vehicleSpawnerSpawnInside", MainMenu.VehicleSpawnerMenu.SpawnInVehicle); } if (MainMenu.VoiceChatSettingsMenu != null) { VoiceChatEnabled = MainMenu.VoiceChatSettingsMenu.EnableVoicechat; prefs.Add("voiceChatEnabled", MainMenu.VoiceChatSettingsMenu.EnableVoicechat); VoiceChatProximity = MainMenu.VoiceChatSettingsMenu.currentProximity; prefs.Add("voiceChatProximity", MainMenu.VoiceChatSettingsMenu.currentProximity); ShowCurrentSpeaker = MainMenu.VoiceChatSettingsMenu.ShowCurrentSpeaker; prefs.Add("voiceChatShowSpeaker", MainMenu.VoiceChatSettingsMenu.ShowCurrentSpeaker); ShowVoiceStatus = MainMenu.VoiceChatSettingsMenu.ShowVoiceStatus; prefs.Add("voiceChatShowVoiceStatus", MainMenu.VoiceChatSettingsMenu.ShowVoiceStatus); } if (MainMenu.WeaponOptionsMenu != null) { WeaponsNoReload = MainMenu.WeaponOptionsMenu.NoReload; prefs.Add("weaponsNoReload", MainMenu.WeaponOptionsMenu.NoReload); WeaponsUnlimitedAmmo = MainMenu.WeaponOptionsMenu.UnlimitedAmmo; prefs.Add("weaponsUnlimitedAmmo", MainMenu.WeaponOptionsMenu.UnlimitedAmmo); } if (PlayerAppearance.ClothingAnimationType >= 0) { PAClothingAnimationType = PlayerAppearance.ClothingAnimationType; prefs.Add("clothingAnimationType", PlayerAppearance.ClothingAnimationType); } if (MainMenu.WeaponLoadoutsMenu != null) { WeaponLoadoutsSetLoadoutOnRespawn = MainMenu.WeaponLoadoutsMenu.WeaponLoadoutsSetLoadoutOnRespawn; prefs.Add("weaponLoadoutsSetLoadoutOnRespawn", MainMenu.WeaponLoadoutsMenu.WeaponLoadoutsSetLoadoutOnRespawn); } Notify.Success("Your settings have been saved."); Log($"Saving preferences:\n{JsonConvert.SerializeObject(prefs)}"); }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { #region create menu and menu items // Create the menu. menu = new Menu(Game.Player.Name, "Player Options"); // Create all checkboxes. MenuCheckboxItem playerGodModeCheckbox = new MenuCheckboxItem("Godmode", "Makes you invincible.", PlayerGodMode); MenuCheckboxItem invisibleCheckbox = new MenuCheckboxItem("Invisible", "Makes you invisible to yourself and others.", PlayerInvisible); MenuCheckboxItem unlimitedStaminaCheckbox = new MenuCheckboxItem("Unlimited Stamina", "Allows you to run forever without slowing down or taking damage.", PlayerStamina); MenuCheckboxItem fastRunCheckbox = new MenuCheckboxItem("Fast Run", "Get ~g~Snail~s~ powers and run very fast!", PlayerFastRun); SetRunSprintMultiplierForPlayer(Game.Player.Handle, (PlayerFastRun ? 1.49f : 1f)); MenuCheckboxItem fastSwimCheckbox = new MenuCheckboxItem("Fast Swim", "Get ~g~Snail 2.0~s~ powers and swim super fast!", PlayerFastSwim); SetSwimMultiplierForPlayer(Game.Player.Handle, (PlayerFastSwim ? 1.49f : 1f)); MenuCheckboxItem superJumpCheckbox = new MenuCheckboxItem("Super Jump", "Get ~g~Snail 3.0~s~ powers and jump like a champ!", PlayerSuperJump); MenuCheckboxItem noRagdollCheckbox = new MenuCheckboxItem("No Ragdoll", "Disables player ragdoll, makes you not fall off your bike anymore.", PlayerNoRagdoll); MenuCheckboxItem neverWantedCheckbox = new MenuCheckboxItem("Never Wanted", "Disables all wanted levels.", PlayerNeverWanted); MenuCheckboxItem everyoneIgnoresPlayerCheckbox = new MenuCheckboxItem("Everyone Ignore Player", "Everyone will leave you alone.", PlayerIsIgnored); MenuCheckboxItem playerFrozenCheckbox = new MenuCheckboxItem("Freeze Player", "Freezes your current location.", PlayerFrozen); // Wanted level options List <string> wantedLevelList = new List <string> { "No Wanted Level", "1", "2", "3", "4", "5" }; MenuListItem setWantedLevel = new MenuListItem("Set Wanted Level", wantedLevelList, GetPlayerWantedLevel(Game.Player.Handle), "Set your wanted level by selecting a value, and pressing enter."); MenuListItem setArmorItem = new MenuListItem("Set Armor Type", new List <string> { "No Armor", GetLabelText("WT_BA_0"), GetLabelText("WT_BA_1"), GetLabelText("WT_BA_2"), GetLabelText("WT_BA_3"), GetLabelText("WT_BA_4"), }, 0, "Set the armor level/type for your player."); MenuItem healPlayerBtn = new MenuItem("Heal Player", "Give the player max health."); MenuItem cleanPlayerBtn = new MenuItem("Clean Player Clothes", "Clean your player clothes."); MenuItem dryPlayerBtn = new MenuItem("Dry Player Clothes", "Make your player clothes dry."); MenuItem wetPlayerBtn = new MenuItem("Wet Player Clothes", "Make your player clothes wet."); MenuItem suicidePlayerBtn = new MenuItem("~r~Commit Suicide", "Kill yourself by taking the pill. Or by using a pistol if you have one."); Menu vehicleAutoPilot = new Menu("Auto Pilot", "Vehicle auto pilot options."); MenuController.AddSubmenu(menu, vehicleAutoPilot); MenuItem vehicleAutoPilotBtn = new MenuItem("Vehicle Auto Pilot Menu", "Manage vehicle auto pilot options."); vehicleAutoPilotBtn.Label = "→→→"; List <string> drivingStyles = new List <string>() { "Normal", "Rushed", "Avoid highways", "Drive in reverse" }; MenuListItem drivingStyle = new MenuListItem("Driving Style", drivingStyles, 0, "Set the driving style that is used for the Drive to Waypoint and Drive Around Randomly functions."); // Scenarios (list can be found in the PedScenarios class) MenuListItem playerScenarios = new MenuListItem("Player Scenarios", PedScenarios.Scenarios, 0, "Select a scenario and hit enter to start it. Selecting another scenario will override the current scenario. If you're already playing the selected scenario, selecting it again will stop the scenario."); MenuItem stopScenario = new MenuItem("Force Stop Scenario", "This will force a playing scenario to stop immediately, without waiting for it to finish it's 'stopping' animation."); #endregion #region add items to menu based on permissions // Add all checkboxes to the menu. (keeping permissions in mind) if (IsAllowed(Permission.POGod)) { menu.AddMenuItem(playerGodModeCheckbox); } if (IsAllowed(Permission.POInvisible)) { menu.AddMenuItem(invisibleCheckbox); } if (IsAllowed(Permission.POUnlimitedStamina)) { menu.AddMenuItem(unlimitedStaminaCheckbox); } if (IsAllowed(Permission.POFastRun)) { menu.AddMenuItem(fastRunCheckbox); } if (IsAllowed(Permission.POFastSwim)) { menu.AddMenuItem(fastSwimCheckbox); } if (IsAllowed(Permission.POSuperjump)) { menu.AddMenuItem(superJumpCheckbox); } if (IsAllowed(Permission.PONoRagdoll)) { menu.AddMenuItem(noRagdollCheckbox); } if (IsAllowed(Permission.PONeverWanted)) { menu.AddMenuItem(neverWantedCheckbox); } if (IsAllowed(Permission.POSetWanted)) { menu.AddMenuItem(setWantedLevel); } if (IsAllowed(Permission.POIgnored)) { menu.AddMenuItem(everyoneIgnoresPlayerCheckbox); } if (IsAllowed(Permission.POMaxHealth)) { menu.AddMenuItem(healPlayerBtn); } if (IsAllowed(Permission.POMaxArmor)) { menu.AddMenuItem(setArmorItem); } if (IsAllowed(Permission.POCleanPlayer)) { menu.AddMenuItem(cleanPlayerBtn); } if (IsAllowed(Permission.PODryPlayer)) { menu.AddMenuItem(dryPlayerBtn); } if (IsAllowed(Permission.POWetPlayer)) { menu.AddMenuItem(wetPlayerBtn); } menu.AddMenuItem(suicidePlayerBtn); if (IsAllowed(Permission.POVehicleAutoPilotMenu)) { menu.AddMenuItem(vehicleAutoPilotBtn); MenuController.BindMenuItem(menu, vehicleAutoPilot, vehicleAutoPilotBtn); vehicleAutoPilot.AddMenuItem(drivingStyle); MenuItem startDrivingWaypoint = new MenuItem("Drive To Waypoint", "Make your player ped drive your vehicle to your waypoint."); MenuItem startDrivingRandomly = new MenuItem("Drive Around Randomly", "Make your player ped drive your vehicle randomly around the map."); MenuItem stopDriving = new MenuItem("Stop Driving", "The player ped will find a suitable place to stop the vehicle. The task will be stopped once the vehicle has reached the suitable stop location."); MenuItem forceStopDriving = new MenuItem("Force Stop Driving", "This will stop the driving task immediately without finding a suitable place to stop."); vehicleAutoPilot.AddMenuItem(startDrivingWaypoint); vehicleAutoPilot.AddMenuItem(startDrivingRandomly); vehicleAutoPilot.AddMenuItem(stopDriving); vehicleAutoPilot.AddMenuItem(forceStopDriving); vehicleAutoPilot.RefreshIndex(); vehicleAutoPilot.OnItemSelect += async(sender, item, index) => { if (Game.PlayerPed.IsInVehicle() && item != stopDriving && item != forceStopDriving) { if (Game.PlayerPed.CurrentVehicle != null && Game.PlayerPed.CurrentVehicle.Exists() && !Game.PlayerPed.CurrentVehicle.IsDead && Game.PlayerPed.CurrentVehicle.IsDriveable) { if (Game.PlayerPed.CurrentVehicle.Driver == Game.PlayerPed) { if (item == startDrivingWaypoint) { if (IsWaypointActive()) { int style = GetStyleFromIndex(drivingStyle.ListIndex); DriveToWp(style); Notify.Info("Your player ped is now driving the vehicle for you. You can cancel any time by pressing the Stop Driving button. The vehicle will stop when it has reached the destination."); } else { Notify.Error("You need a waypoint before you can drive to it!"); } } else if (item == startDrivingRandomly) { int style = GetStyleFromIndex(drivingStyle.ListIndex); DriveWander(style); Notify.Info("Your player ped is now driving the vehicle for you. You can cancel any time by pressing the Stop Driving button."); } } else { Notify.Error("You must be the driver of this vehicle!"); } } else { Notify.Error("Your vehicle is broken or it does not exist!"); } } else if (item != stopDriving && item != forceStopDriving) { Notify.Error("You need to be in a vehicle first!"); } if (item == stopDriving) { if (Game.PlayerPed.IsInVehicle()) { Vehicle veh = GetVehicle(); if (veh != null && veh.Exists() && !veh.IsDead) { Vector3 outPos = new Vector3(); if (GetNthClosestVehicleNode(Game.PlayerPed.Position.X, Game.PlayerPed.Position.Y, Game.PlayerPed.Position.Z, 3, ref outPos, 0, 0, 0)) { Notify.Info("The player ped will find a suitable place to park the car and will then stop driving. Please wait."); ClearPedTasks(Game.PlayerPed.Handle); TaskVehiclePark(Game.PlayerPed.Handle, veh.Handle, outPos.X, outPos.Y, outPos.Z, Game.PlayerPed.Heading, 3, 60f, true); while (Game.PlayerPed.Position.DistanceToSquared2D(outPos) > 3f) { await BaseScript.Delay(0); } SetVehicleHalt(veh.Handle, 3f, 0, false); ClearPedTasks(Game.PlayerPed.Handle); Notify.Info("The player ped has stopped driving."); } } } else { ClearPedTasks(Game.PlayerPed.Handle); Notify.Alert("Your ped is not in any vehicle."); } } else if (item == forceStopDriving) { ClearPedTasks(Game.PlayerPed.Handle); Notify.Info("Driving task cancelled."); } }; vehicleAutoPilot.OnListItemSelect += (sender, item, listIndex, itemIndex) => { if (item == drivingStyle) { int style = GetStyleFromIndex(listIndex); SetDriveTaskDrivingStyle(Game.PlayerPed.Handle, style); Notify.Info($"Driving task style is now set to: ~r~{drivingStyles[listIndex]}~s~."); } }; } if (IsAllowed(Permission.POFreeze)) { menu.AddMenuItem(playerFrozenCheckbox); } if (IsAllowed(Permission.POScenarios)) { menu.AddMenuItem(playerScenarios); menu.AddMenuItem(stopScenario); } #endregion #region handle all events // Checkbox changes. menu.OnCheckboxChange += (sender, item, itemIndex, _checked) => { // God Mode toggled. if (item == playerGodModeCheckbox) { PlayerGodMode = _checked; } // Invisibility toggled. else if (item == invisibleCheckbox) { PlayerInvisible = _checked; SetEntityVisible(Game.PlayerPed.Handle, !PlayerInvisible, false); } // Unlimited Stamina toggled. else if (item == unlimitedStaminaCheckbox) { PlayerStamina = _checked; StatSetInt((uint)GetHashKey("MP0_STAMINA"), _checked ? 100 : 0, true); } // Fast run toggled. else if (item == fastRunCheckbox) { PlayerFastRun = _checked; SetRunSprintMultiplierForPlayer(Game.Player.Handle, (_checked ? 1.49f : 1f)); } // Fast swim toggled. else if (item == fastSwimCheckbox) { PlayerFastSwim = _checked; SetSwimMultiplierForPlayer(Game.Player.Handle, (_checked ? 1.49f : 1f)); } // Super jump toggled. else if (item == superJumpCheckbox) { PlayerSuperJump = _checked; } // No ragdoll toggled. else if (item == noRagdollCheckbox) { PlayerNoRagdoll = _checked; } // Never wanted toggled. else if (item == neverWantedCheckbox) { PlayerNeverWanted = _checked; } // Everyone ignores player toggled. else if (item == everyoneIgnoresPlayerCheckbox) { PlayerIsIgnored = _checked; // Manage player is ignored by everyone. SetEveryoneIgnorePlayer(Game.Player.Handle, PlayerIsIgnored); SetPoliceIgnorePlayer(Game.Player.Handle, PlayerIsIgnored); SetPlayerCanBeHassledByGangs(Game.Player.Handle, !PlayerIsIgnored); } // Freeze player toggled. else if (item == playerFrozenCheckbox) { PlayerFrozen = _checked; if (MainMenu.NoClipMenu != null && !MainMenu.NoClipEnabled) { FreezeEntityPosition(Game.PlayerPed.Handle, PlayerFrozen); } else if (!MainMenu.NoClipEnabled) { FreezeEntityPosition(Game.PlayerPed.Handle, PlayerFrozen); } } }; // List selections menu.OnListItemSelect += (sender, listItem, listIndex, itemIndex) => { // Set wanted Level if (listItem == setWantedLevel) { SetPlayerWantedLevel(Game.Player.Handle, listIndex, false); SetPlayerWantedLevelNow(Game.Player.Handle, false); } // Player Scenarios else if (listItem == playerScenarios) { PlayScenario(PedScenarios.ScenarioNames[PedScenarios.Scenarios[listIndex]]); } else if (listItem == setArmorItem) { Game.PlayerPed.Armor = (listItem.ListIndex) * 20; } }; // button presses menu.OnItemSelect += (sender, item, index) => { // Force Stop Scenario button if (item == stopScenario) { // Play a new scenario named "forcestop" (this scenario doesn't exist, but the "Play" function checks // for the string "forcestop", if that's provided as th scenario name then it will forcefully clear the player task. PlayScenario("forcestop"); } else if (item == healPlayerBtn) { Game.PlayerPed.Health = Game.PlayerPed.MaxHealth; Notify.Success("Player healed."); } else if (item == cleanPlayerBtn) { Game.PlayerPed.ClearBloodDamage(); Notify.Success("Player clothes have been cleaned."); } else if (item == dryPlayerBtn) { Game.PlayerPed.WetnessHeight = 0f; Notify.Success("Player is now dry."); } else if (item == wetPlayerBtn) { Game.PlayerPed.WetnessHeight = 2f; Notify.Success("Player is now wet."); } else if (item == suicidePlayerBtn) { CommitSuicide(); } }; #endregion }
private void CreateMenu() { menu = new Menu(Game.Player.Name, "Drone Camera parameters"); #region main parameters // Drone modes List <string> modeListData = new List <string>() { "Race drone", "Zero-G drone", "Spectator drone", "Homing drone" }; modeList = new MenuListItem("Mode", modeListData, 0, "Select drone flight mode.\n" + "~y~Race drone~s~ - regular, gravity based drone cam\n" + "~y~Zero-G drone~s~ - gravity set to 0, added deceleration\n" + "~y~Spectator drone~s~ - easy to operate for spectating\n" + "~y~Homing drone~s~ - acquire target and keep it in center"); // Invert input invertPitch = new MenuCheckboxItem("Invert pitch", "Inverts user input in pitch axis.", false); invertRoll = new MenuCheckboxItem("Invert roll", "Inverts user input in roll axis.", false); // Gravity multiplier List <string> gravityMultValues = new List <string>(); for (float i = 0.5f; i <= 4.0f; i += 0.05f) { gravityMultValues.Add(i.ToString("0.00")); } gravityMultList = new MenuListItem("Gravity multiplier", gravityMultValues, 10, "Modifies gravity constant, higher values makes drone fall quicker during freefall.") { ShowColorPanel = false }; // Timestep multiplier List <string> timestepValues = new List <string>(); for (float i = 0.5f; i <= 4.0f; i += 0.05f) { timestepValues.Add(i.ToString("0.00")); } timestepMultList = new MenuListItem("Timestep multiplier", timestepValues, 10, "Affects gravity and drone responsiveness.") { ShowColorPanel = false }; // Drag multiplier List <string> dragMultValues = new List <string>(); for (float i = 0.0f; i <= 4.0f; i += 0.05f) { dragMultValues.Add(i.ToString("0.00")); } dragMultList = new MenuListItem("Drag multiplier", dragMultValues, 20, "How much air ressistance there is - higher values make drone lose velocity quicker.") { ShowColorPanel = false }; // Acceleration multiplier List <string> accelerationMultValues = new List <string>(); for (float i = 0.5f; i <= 4.0f; i += 0.05f) { accelerationMultValues.Add(i.ToString("0.00")); } accelerationMultList = new MenuListItem("Acceleration multiplier", accelerationMultValues, 10, "How responsive drone is in terms of acceleration.") { ShowColorPanel = false }; // Rotation multipliers List <string> rotationMultXValues = new List <string>(); for (float i = 0.5f; i <= 4.0f; i += 0.05f) { rotationMultXValues.Add(i.ToString("0.00")); } rotationMultXList = new MenuListItem("Pitch multiplier", rotationMultXValues, 10, "How responsive drone is in terms of rotation (pitch).") { ShowColorPanel = false }; List <string> rotationMultYValues = new List <string>(); for (float i = 0.5f; i <= 4.0f; i += 0.05f) { rotationMultYValues.Add(i.ToString("0.00")); } rotationMultYList = new MenuListItem("Roll multiplier", rotationMultYValues, 10, "How responsive drone is in terms of rotation (roll).") { ShowColorPanel = false }; List <string> rotationMultZValues = new List <string>(); for (float i = 0.5f; i <= 4.0f; i += 0.05f) { rotationMultZValues.Add(i.ToString("0.00")); } rotationMultZList = new MenuListItem("Yaw multiplier", rotationMultZValues, 10, "How responsive drone is in terms of rotation (yaw).") { ShowColorPanel = false }; // Tilt angle List <string> tiltAngleValues = new List <string>(); for (float i = 0.0f; i <= 80.0f; i += 5f) { tiltAngleValues.Add(i.ToString("0.0")); } tiltAngleList = new MenuListItem("Tilt angle", tiltAngleValues, 9, "Defines how much is camera tilted relative to the drone.") { ShowColorPanel = false }; // FOV List <string> fovValues = new List <string>(); for (float i = 30.0f; i <= 120.0f; i += 5f) { fovValues.Add(i.ToString("0.0")); } fovList = new MenuListItem("FOV", fovValues, 10, "Field of view of the camera") { ShowColorPanel = false }; // Max velocity List <string> maxVelValues = new List <string>(); for (float i = 10.0f; i <= 50.0f; i += 1f) { maxVelValues.Add(i.ToString("0.0")); } maxVelList = new MenuListItem("Max velocity", maxVelValues, 20, "Max velocity of the drone") { ShowColorPanel = false }; #endregion #region adding menu items menu.AddMenuItem(modeList); menu.AddMenuItem(invertPitch); menu.AddMenuItem(invertRoll); menu.AddMenuItem(gravityMultList); menu.AddMenuItem(timestepMultList); menu.AddMenuItem(dragMultList); menu.AddMenuItem(accelerationMultList); menu.AddMenuItem(maxVelList); menu.AddMenuItem(rotationMultXList); menu.AddMenuItem(rotationMultYList); menu.AddMenuItem(rotationMultZList); menu.AddMenuItem(tiltAngleList); menu.AddMenuItem(fovList); #endregion #region managing save/load camera stuff // Saving/Loading cameras MenuItem savedDronesButton = new MenuItem("Saved drones", "User created drone params"); savedDronesMenu = new Menu("Saved drone params"); MenuController.AddSubmenu(menu, savedDronesMenu); menu.AddMenuItem(savedDronesButton); savedDronesButton.Label = "→→→"; MenuController.BindMenuItem(menu, savedDronesMenu, savedDronesButton); MenuItem saveDrone = new MenuItem("Save Current Drone", "Save the current drone parameters."); savedDronesMenu.AddMenuItem(saveDrone); savedDronesMenu.OnMenuOpen += (sender) => { savedDronesMenu.ClearMenuItems(); savedDronesMenu.AddMenuItem(saveDrone); LoadDroneCameras(); }; savedDronesMenu.OnItemSelect += (sender, item, index) => { if (item == saveDrone) { SaveCamera(); savedDronesMenu.GoBack(); } else { UpdateSelectedCameraMenu(item, sender); } }; MenuController.AddMenu(selectedDroneMenu); MenuItem spawnCamera = new MenuItem("Spawn Drone", "Spawn this saved drone."); MenuItem renameCamera = new MenuItem("Rename Drone", "Rename your saved drone."); MenuItem deleteCamera = new MenuItem("~r~Delete Drone", "~r~This will delete your saved drone. Warning: this can NOT be undone!"); selectedDroneMenu.AddMenuItem(spawnCamera); selectedDroneMenu.AddMenuItem(renameCamera); selectedDroneMenu.AddMenuItem(deleteCamera); selectedDroneMenu.OnMenuClose += (sender) => { selectedDroneMenu.RefreshIndex(); }; selectedDroneMenu.OnItemSelect += async(sender, item, index) => { if (item == spawnCamera) { MainMenu.EnhancedCamMenu.ResetCameras(); SpawnSavedCamera(); UpdateParams(); selectedDroneMenu.GoBack(); savedDronesMenu.RefreshIndex(); } else if (item == deleteCamera) { item.Label = ""; DeleteResourceKvp(currentlySelectedDrone.Key); selectedDroneMenu.GoBack(); savedDronesMenu.RefreshIndex(); Notify.Success("Your saved drone has been deleted."); } else if (item == renameCamera) { string newName = await GetUserInput(windowTitle : "Enter a new name for this drone.", maxInputLength : 30); if (string.IsNullOrEmpty(newName)) { Notify.Error(CommonErrors.InvalidInput); } else { if (SaveCameraInfo("xdm_" + newName, currentlySelectedDrone.Value, false)) { DeleteResourceKvp(currentlySelectedDrone.Key); while (!selectedDroneMenu.Visible) { await BaseScript.Delay(0); } Notify.Success("Your drone has successfully been renamed."); selectedDroneMenu.GoBack(); currentlySelectedDrone = new KeyValuePair <string, DroneSaveInfo>(); } else { Notify.Error("This name is already in use or something unknown failed. Contact the server owner if you believe something is wrong."); } } } }; #endregion #region handling menu changes // Handle checkbox menu.OnCheckboxChange += (_menu, _item, _index, _checked) => { if (_item == invertPitch) { invertedPitch = _checked; } else if (_item == invertRoll) { invertedRoll = _checked; } }; // Handle sliders menu.OnListIndexChange += (_menu, _listItem, _oldIndex, _newIndex, _itemIndex) => { if (_listItem == modeList) { droneMode = _newIndex; if (droneMode == 3) { homingTarget = GetClosestVehicleToDrone(2000); } } if (_listItem == gravityMultList) { gravityMult = _newIndex * 0.05f + 0.5f; } if (_listItem == timestepMultList) { timestepMult = _newIndex * 0.05f + 0.5f; } if (_listItem == dragMultList) { dragMult = _newIndex * 0.05f; } if (_listItem == accelerationMultList) { accelerationMult = _newIndex * 0.05f + 0.5f; } if (_listItem == rotationMultXList) { rotationMult.X = _newIndex * 0.05f + 0.5f; } if (_listItem == rotationMultYList) { rotationMult.Y = _newIndex * 0.05f + 0.5f; } if (_listItem == rotationMultZList) { rotationMult.Z = _newIndex * 0.05f + 0.5f; } if (_listItem == maxVelList) { maxVel = _newIndex * 1f + 10f; } if (_listItem == tiltAngleList) { tiltAngle = _newIndex * 5.0f; } if (_listItem == fovList) { droneFov = _newIndex * 5.0f + 30f; if (MainMenu.EnhancedCamMenu.droneCamera != null) { SetCamFov(MainMenu.EnhancedCamMenu.droneCamera.Handle, droneFov); } } }; #endregion }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { string menuTitle = "Saved Vehicles"; #region Create menus and submenus // Create the menu. menu = new Menu(menuTitle, "Manage Saved Vehicles"); MenuItem saveVehicle = new MenuItem("Save Current Vehicle", "Save the vehicle you are currently sitting in."); menu.AddMenuItem(saveVehicle); saveVehicle.LeftIcon = MenuItem.Icon.CAR; menu.OnItemSelect += (sender, item, index) => { if (item == saveVehicle) { if (Game.PlayerPed.IsInVehicle()) { SaveVehicle(); } else { Notify.Error("You are currently not in any vehicle. Please enter a vehicle before trying to save it."); } } }; for (int i = 0; i < 23; i++) { Menu categoryMenu = new Menu("Saved Vehicles", GetLabelText($"VEH_CLASS_{i}")); MenuItem categoryButton = new MenuItem(GetLabelText($"VEH_CLASS_{i}"), $"All saved vehicles from the {(GetLabelText($"VEH_CLASS_{i}"))} category."); subMenus.Add(categoryMenu); MenuController.AddSubmenu(menu, categoryMenu); menu.AddMenuItem(categoryButton); categoryButton.Label = "→→→"; MenuController.BindMenuItem(menu, categoryMenu, categoryButton); categoryMenu.OnMenuClose += (sender) => { UpdateMenuAvailableCategories(); }; categoryMenu.OnItemSelect += (sender, item, index) => { UpdateSelectedVehicleMenu(item, sender); }; } MenuItem unavailableModels = new MenuItem("Unavailable Saved Vehicles", "These vehicles are currently unavailable because the models are not present in the game. These vehicles are most likely not being streamed from the server.") { Label = "→→→" }; menu.AddMenuItem(unavailableModels); MenuController.BindMenuItem(menu, unavailableVehiclesMenu, unavailableModels); MenuController.AddSubmenu(menu, unavailableVehiclesMenu); MenuController.AddMenu(selectedVehicleMenu); MenuItem spawnVehicle = new MenuItem("Spawn Vehicle", "Spawn this saved vehicle."); MenuItem renameVehicle = new MenuItem("Rename Vehicle", "Rename your saved vehicle."); MenuItem replaceVehicle = new MenuItem("~r~Replace Vehicle", "Your saved vehicle will be replaced with the vehicle you are currently sitting in. ~r~Warning: this can NOT be undone!"); MenuItem deleteVehicle = new MenuItem("~r~Delete Vehicle", "~r~This will delete your saved vehicle. Warning: this can NOT be undone!"); selectedVehicleMenu.AddMenuItem(spawnVehicle); selectedVehicleMenu.AddMenuItem(renameVehicle); selectedVehicleMenu.AddMenuItem(replaceVehicle); selectedVehicleMenu.AddMenuItem(deleteVehicle); selectedVehicleMenu.OnMenuOpen += (sender) => { spawnVehicle.Label = "(" + GetDisplayNameFromVehicleModel(currentlySelectedVehicle.Value.model).ToLower() + ")"; }; selectedVehicleMenu.OnMenuClose += (sender) => { selectedVehicleMenu.RefreshIndex(); deleteButtonPressedCount = 0; deleteVehicle.Label = ""; }; selectedVehicleMenu.OnItemSelect += async(sender, item, index) => { if (item == spawnVehicle) { if (MainMenu.VehicleSpawnerMenu != null) { SpawnVehicle(currentlySelectedVehicle.Value.model, MainMenu.VehicleSpawnerMenu.SpawnInVehicle, MainMenu.VehicleSpawnerMenu.ReplaceVehicle, false, vehicleInfo: currentlySelectedVehicle.Value, saveName: currentlySelectedVehicle.Key.Substring(4)); TriggerServerEvent("tallerik:logMessage", GetPlayerName(PlayerId()) + " spawnt ein Fahrzeug (" + currentlySelectedVehicle.Value.model + ")"); } else { SpawnVehicle(currentlySelectedVehicle.Value.model, true, true, false, vehicleInfo: currentlySelectedVehicle.Value, saveName: currentlySelectedVehicle.Key.Substring(4)); TriggerServerEvent("tallerik:logMessage", GetPlayerName(PlayerId()) + " spawnt ein Fahrzeug (" + currentlySelectedVehicle.Value.model + ")"); } } else if (item == renameVehicle) { string newName = await GetUserInput(windowTitle : "Enter a new name for this vehicle.", maxInputLength : 30); if (string.IsNullOrEmpty(newName)) { Notify.Error(CommonErrors.InvalidInput); } else { if (StorageManager.SaveVehicleInfo("veh_" + newName, currentlySelectedVehicle.Value, false)) { DeleteResourceKvp(currentlySelectedVehicle.Key); while (!selectedVehicleMenu.Visible) { await BaseScript.Delay(0); } Notify.Success("Your vehicle has successfully been renamed."); UpdateMenuAvailableCategories(); selectedVehicleMenu.GoBack(); currentlySelectedVehicle = new KeyValuePair <string, VehicleInfo>(); // clear the old info } else { Notify.Error("This name is already in use or something unknown failed. Contact the server owner if you believe something is wrong."); } } } else if (item == replaceVehicle) { if (Game.PlayerPed.IsInVehicle()) { SaveVehicle(currentlySelectedVehicle.Key.Substring(4)); selectedVehicleMenu.GoBack(); Notify.Success("Your saved vehicle has been replaced with your current vehicle."); } else { Notify.Error("You need to be in a vehicle before you can relplace your old vehicle."); } } else if (item == deleteVehicle) { if (deleteButtonPressedCount == 0) { deleteButtonPressedCount = 1; item.Label = "Press again to confirm."; Notify.Alert("Are you sure you want to delete this vehicle? Press the button again to confirm."); } else { deleteButtonPressedCount = 0; item.Label = ""; DeleteResourceKvp(currentlySelectedVehicle.Key); UpdateMenuAvailableCategories(); selectedVehicleMenu.GoBack(); Notify.Success("Your saved vehicle has been deleted."); } } if (item != deleteVehicle) // if any other button is pressed, restore the delete vehicle button pressed count. { deleteButtonPressedCount = 0; deleteVehicle.Label = ""; } }; unavailableVehiclesMenu.InstructionalButtons.Add(Control.FrontendDelete, "Delete Vehicle!"); unavailableVehiclesMenu.ButtonPressHandlers.Add(new Menu.ButtonPressHandler(Control.FrontendDelete, Menu.ControlPressCheckType.JUST_RELEASED, new Action <Menu, Control>((m, c) => { if (m.Size > 0) { int index = m.CurrentIndex; if (index < m.Size) { MenuItem item = m.GetMenuItems().Find(i => i.Index == index); if (item != null && (item.ItemData is KeyValuePair <string, VehicleInfo> sd)) { if (item.Label == "~r~Are you sure?") { Log("Unavailable saved vehicle deleted, data: " + JsonConvert.SerializeObject(sd)); DeleteResourceKvp(sd.Key); unavailableVehiclesMenu.GoBack(); UpdateMenuAvailableCategories(); } else { item.Label = "~r~Are you sure?"; } } else { Notify.Error("Somehow this vehicle could not be found."); } } else { Notify.Error("You somehow managed to trigger deletion of a menu item that doesn't exist, how...?"); } }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { #region create menu and menu items // Create the menu. menu = new Menu(Game.Player.Name, "Player Options"); // Create all checkboxes. MenuCheckboxItem playerGodModeCheckbox = new MenuCheckboxItem("Godmode", "Makes you invincible.", PlayerGodMode); MenuCheckboxItem invisibleCheckbox = new MenuCheckboxItem("Invisible", "Makes you invisible to yourself and others.", PlayerInvisible); MenuCheckboxItem unlimitedStaminaCheckbox = new MenuCheckboxItem("Unlimited Stamina", "Allows you to run forever without slowing down or taking damage.", PlayerStamina); MenuCheckboxItem fastRunCheckbox = new MenuCheckboxItem("Fast Run", "Get ~g~Snail~s~ powers and run very fast!", PlayerFastRun); SetRunSprintMultiplierForPlayer(Game.Player.Handle, (PlayerFastRun && IsAllowed(Permission.POFastRun) ? 1.49f : 1f)); MenuCheckboxItem fastSwimCheckbox = new MenuCheckboxItem("Fast Swim", "Get ~g~Snail 2.0~s~ powers and swim super fast!", PlayerFastSwim); SetSwimMultiplierForPlayer(Game.Player.Handle, (PlayerFastSwim && IsAllowed(Permission.POFastSwim) ? 1.49f : 1f)); MenuCheckboxItem superJumpCheckbox = new MenuCheckboxItem("Super Jump", "Get ~g~Snail 3.0~s~ powers and jump like a champ!", PlayerSuperJump); MenuCheckboxItem noRagdollCheckbox = new MenuCheckboxItem("No Ragdoll", "Disables player ragdoll, makes you not fall off your bike anymore.", PlayerNoRagdoll); MenuCheckboxItem neverWantedCheckbox = new MenuCheckboxItem("Never Wanted", "Disables all wanted levels.", PlayerNeverWanted); MenuCheckboxItem everyoneIgnoresPlayerCheckbox = new MenuCheckboxItem("Everyone Ignore Player", "Everyone will leave you alone.", PlayerIsIgnored); MenuCheckboxItem playerStayInVehicleCheckbox = new MenuCheckboxItem("Stay In Vehicle", "When this is enabled, NPCs will not be able to drag you out of your vehicle if they get angry at you.", PlayerStayInVehicle); MenuCheckboxItem playerFrozenCheckbox = new MenuCheckboxItem("Freeze Player", "Freezes your current location.", PlayerFrozen); // Wanted level options List <string> wantedLevelList = new List <string> { "No Wanted Level", "1", "2", "3", "4", "5" }; MenuListItem setWantedLevel = new MenuListItem("Set Wanted Level", wantedLevelList, GetPlayerWantedLevel(Game.Player.Handle), "Set your wanted level by selecting a value, and pressing enter."); MenuListItem setArmorItem = new MenuListItem("Set Armor Type", new List <string> { "No Armor", GetLabelText("WT_BA_0"), GetLabelText("WT_BA_1"), GetLabelText("WT_BA_2"), GetLabelText("WT_BA_3"), GetLabelText("WT_BA_4"), }, 0, "Set the armor level/type for your player."); MenuItem healPlayerBtn = new MenuItem("Heal Player", "Give the player max health."); MenuItem cleanPlayerBtn = new MenuItem("Clean Player Clothes", "Clean your player clothes."); MenuItem dryPlayerBtn = new MenuItem("Dry Player Clothes", "Make your player clothes dry."); MenuItem wetPlayerBtn = new MenuItem("Wet Player Clothes", "Make your player clothes wet."); MenuItem suicidePlayerBtn = new MenuItem("~r~Commit Suicide", "Kill yourself by taking the pill. Or by using a pistol if you have one."); Menu vehicleAutoPilot = new Menu("Auto Pilot", "Vehicle auto pilot options."); MenuController.AddSubmenu(menu, vehicleAutoPilot); MenuItem vehicleAutoPilotBtn = new MenuItem("Vehicle Auto Pilot Menu", "Manage vehicle auto pilot options.") { Label = "→→→" }; List <string> drivingStyles = new List <string>() { "Normal", "Rushed", "Avoid highways", "Drive in reverse", "Custom" }; MenuListItem drivingStyle = new MenuListItem("Driving Style", drivingStyles, 0, "Set the driving style that is used for the Drive to Waypoint and Drive Around Randomly functions."); // Scenarios (list can be found in the PedScenarios class) MenuListItem playerScenarios = new MenuListItem("Player Scenarios", PedScenarios.Scenarios, 0, "Select a scenario and hit enter to start it. Selecting another scenario will override the current scenario. If you're already playing the selected scenario, selecting it again will stop the scenario."); MenuItem stopScenario = new MenuItem("Force Stop Scenario", "This will force a playing scenario to stop immediately, without waiting for it to finish it's 'stopping' animation."); #endregion #region add items to menu based on permissions // Add all checkboxes to the menu. (keeping permissions in mind) if (IsAllowed(Permission.POGod)) { menu.AddMenuItem(playerGodModeCheckbox); } if (IsAllowed(Permission.POInvisible)) { menu.AddMenuItem(invisibleCheckbox); } if (IsAllowed(Permission.POUnlimitedStamina)) { menu.AddMenuItem(unlimitedStaminaCheckbox); } if (IsAllowed(Permission.POFastRun)) { menu.AddMenuItem(fastRunCheckbox); } if (IsAllowed(Permission.POFastSwim)) { menu.AddMenuItem(fastSwimCheckbox); } if (IsAllowed(Permission.POSuperjump)) { menu.AddMenuItem(superJumpCheckbox); } if (IsAllowed(Permission.PONoRagdoll)) { menu.AddMenuItem(noRagdollCheckbox); } if (IsAllowed(Permission.PONeverWanted)) { menu.AddMenuItem(neverWantedCheckbox); } if (IsAllowed(Permission.POSetWanted)) { menu.AddMenuItem(setWantedLevel); } if (IsAllowed(Permission.POIgnored)) { menu.AddMenuItem(everyoneIgnoresPlayerCheckbox); } if (IsAllowed(Permission.POStayInVehicle)) { menu.AddMenuItem(playerStayInVehicleCheckbox); } if (IsAllowed(Permission.POMaxHealth)) { menu.AddMenuItem(healPlayerBtn); } if (IsAllowed(Permission.POMaxArmor)) { menu.AddMenuItem(setArmorItem); } if (IsAllowed(Permission.POCleanPlayer)) { menu.AddMenuItem(cleanPlayerBtn); } if (IsAllowed(Permission.PODryPlayer)) { menu.AddMenuItem(dryPlayerBtn); } if (IsAllowed(Permission.POWetPlayer)) { menu.AddMenuItem(wetPlayerBtn); } menu.AddMenuItem(suicidePlayerBtn); if (IsAllowed(Permission.POVehicleAutoPilotMenu)) { menu.AddMenuItem(vehicleAutoPilotBtn); MenuController.BindMenuItem(menu, vehicleAutoPilot, vehicleAutoPilotBtn); vehicleAutoPilot.AddMenuItem(drivingStyle); MenuItem startDrivingWaypoint = new MenuItem("Drive To Waypoint", "Make your player ped drive your vehicle to your waypoint."); MenuItem startDrivingRandomly = new MenuItem("Drive Around Randomly", "Make your player ped drive your vehicle randomly around the map."); MenuItem stopDriving = new MenuItem("Stop Driving", "The player ped will find a suitable place to stop the vehicle. The task will be stopped once the vehicle has reached the suitable stop location."); MenuItem forceStopDriving = new MenuItem("Force Stop Driving", "This will stop the driving task immediately without finding a suitable place to stop."); MenuItem customDrivingStyle = new MenuItem("Custom Driving Style", "Select a custom driving style. Make sure to also enable it by selecting the 'Custom' driving style in the driving styles list.") { Label = "→→→" }; MenuController.AddSubmenu(vehicleAutoPilot, CustomDrivingStyleMenu); vehicleAutoPilot.AddMenuItem(customDrivingStyle); MenuController.BindMenuItem(vehicleAutoPilot, CustomDrivingStyleMenu, customDrivingStyle); Dictionary <int, string> knownNames = new Dictionary <int, string>() { { 0, "Stop before vehicles" }, { 1, "Stop before peds" }, { 2, "Avoid vehicles" }, { 3, "Avoid empty vehicles" }, { 4, "Avoid peds" }, { 5, "Avoid objects" }, { 7, "Stop at traffic lights" }, { 8, "Use blinkers" }, { 9, "Allow going wrong way" }, { 10, "Go in reverse gear" }, { 18, "Use shortest path" }, { 22, "Ignore roads" }, { 24, "Ignore all pathing" }, { 29, "Avoid highways (if possible)" }, }; for (var i = 0; i < 31; i++) { string name = "~r~Unknown Flag"; if (knownNames.ContainsKey(i)) { name = knownNames[i]; } MenuCheckboxItem checkbox = new MenuCheckboxItem(name, "Toggle this driving style flag.", false); CustomDrivingStyleMenu.AddMenuItem(checkbox); } CustomDrivingStyleMenu.OnCheckboxChange += (sender, item, index, _checked) => { int style = GetStyleFromIndex(drivingStyle.ListIndex); CustomDrivingStyleMenu.MenuSubtitle = $"custom style: {style}"; if (drivingStyle.ListIndex == 4) { Notify.Custom("Driving style updated."); SetDriveTaskDrivingStyle(Game.PlayerPed.Handle, style); } else { Notify.Custom("Driving style NOT updated because you haven't enabled the Custom driving style in the previous menu."); } }; vehicleAutoPilot.AddMenuItem(startDrivingWaypoint); vehicleAutoPilot.AddMenuItem(startDrivingRandomly); vehicleAutoPilot.AddMenuItem(stopDriving); vehicleAutoPilot.AddMenuItem(forceStopDriving); vehicleAutoPilot.RefreshIndex(); vehicleAutoPilot.OnItemSelect += async(sender, item, index) => { if (Game.PlayerPed.IsInVehicle() && item != stopDriving && item != forceStopDriving) { if (Game.PlayerPed.CurrentVehicle != null && Game.PlayerPed.CurrentVehicle.Exists() && !Game.PlayerPed.CurrentVehicle.IsDead && Game.PlayerPed.CurrentVehicle.IsDriveable) { if (Game.PlayerPed.CurrentVehicle.Driver == Game.PlayerPed) { if (item == startDrivingWaypoint) { if (IsWaypointActive()) { int style = GetStyleFromIndex(drivingStyle.ListIndex); DriveToWp(style); Notify.Info("Your player ped is now driving the vehicle for you. You can cancel any time by pressing the Stop Driving button. The vehicle will stop when it has reached the destination."); } else { Notify.Error("You need a waypoint before you can drive to it!"); } } else if (item == startDrivingRandomly) { int style = GetStyleFromIndex(drivingStyle.ListIndex); DriveWander(style); Notify.Info("Your player ped is now driving the vehicle for you. You can cancel any time by pressing the Stop Driving button."); } } else { Notify.Error("You must be the driver of this vehicle!"); } } else { Notify.Error("Your vehicle is broken or it does not exist!"); } } else if (item != stopDriving && item != forceStopDriving) { Notify.Error("You need to be in a vehicle first!"); } if (item == stopDriving) { if (Game.PlayerPed.IsInVehicle()) { Vehicle veh = GetVehicle(); if (veh != null && veh.Exists() && !veh.IsDead) { Vector3 outPos = new Vector3(); if (GetNthClosestVehicleNode(Game.PlayerPed.Position.X, Game.PlayerPed.Position.Y, Game.PlayerPed.Position.Z, 3, ref outPos, 0, 0, 0)) { Notify.Info("The player ped will find a suitable place to park the car and will then stop driving. Please wait."); ClearPedTasks(Game.PlayerPed.Handle); TaskVehiclePark(Game.PlayerPed.Handle, veh.Handle, outPos.X, outPos.Y, outPos.Z, Game.PlayerPed.Heading, 3, 60f, true); while (Game.PlayerPed.Position.DistanceToSquared2D(outPos) > 3f) { await BaseScript.Delay(0); } SetVehicleHalt(veh.Handle, 3f, 0, false); ClearPedTasks(Game.PlayerPed.Handle); Notify.Info("The player ped has stopped driving."); } } } else { ClearPedTasks(Game.PlayerPed.Handle); Notify.Alert("Your ped is not in any vehicle."); } } else if (item == forceStopDriving) { ClearPedTasks(Game.PlayerPed.Handle); Notify.Info("Driving task cancelled."); } }; vehicleAutoPilot.OnListItemSelect += (sender, item, listIndex, itemIndex) => { if (item == drivingStyle) { int style = GetStyleFromIndex(listIndex); SetDriveTaskDrivingStyle(Game.PlayerPed.Handle, style); Notify.Info($"Driving task style is now set to: ~r~{drivingStyles[listIndex]}~s~."); } }; } if (IsAllowed(Permission.POFreeze)) { menu.AddMenuItem(playerFrozenCheckbox); } if (IsAllowed(Permission.POScenarios)) { menu.AddMenuItem(playerScenarios); menu.AddMenuItem(stopScenario); } #endregion #region handle all events // Checkbox changes. menu.OnCheckboxChange += (sender, item, itemIndex, _checked) => { // God Mode toggled. if (item == playerGodModeCheckbox) { PlayerGodMode = _checked; TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980012021022721, content = $"**Zmieniono status __GodMode__:** {_checked}", scriptName = "vMenu", functionName = "playerGodModeCheckbox", }); } // Invisibility toggled. else if (item == invisibleCheckbox) { PlayerInvisible = _checked; SetEntityVisible(Game.PlayerPed.Handle, !PlayerInvisible, false); TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980012021022721, content = $"**Zmieniono status __Niewidzialnosc__:** {_checked}", scriptName = "vMenu", functionName = "invisibleCheckbox", }); } // Unlimited Stamina toggled. else if (item == unlimitedStaminaCheckbox) { PlayerStamina = _checked; StatSetInt((uint)GetHashKey("MP0_STAMINA"), _checked ? 100 : 0, true); TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980077397508122, content = $"**Zmieniono status __Stamina__:** {_checked}", scriptName = "vMenu", functionName = "unlimitedStaminaCheckbox", }); } // Fast run toggled. else if (item == fastRunCheckbox) { PlayerFastRun = _checked; SetRunSprintMultiplierForPlayer(Game.Player.Handle, (_checked ? 1.49f : 1f)); TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980077397508122, content = $"**Zmieniono status __Szybkie bieganie__:** {_checked}", scriptName = "vMenu", functionName = "fastRunCheckbox", }); } // Fast swim toggled. else if (item == fastSwimCheckbox) { PlayerFastSwim = _checked; SetSwimMultiplierForPlayer(Game.Player.Handle, (_checked ? 1.49f : 1f)); TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980077397508122, content = $"**Zmieniono status __Szybkie plywanie__:** {_checked}", scriptName = "vMenu", functionName = "fastSwimCheckbox", }); } // Super jump toggled. else if (item == superJumpCheckbox) { PlayerSuperJump = _checked; TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980077397508122, content = $"**Zmieniono status __Wysokie skakanie__:** {_checked}", scriptName = "vMenu", functionName = "superJumpCheckbox", }); } // No ragdoll toggled. else if (item == noRagdollCheckbox) { PlayerNoRagdoll = _checked; TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980077397508122, content = $"**Zmieniono status __Brak ragdolla__:** {_checked}", scriptName = "vMenu", functionName = "noRagdollCheckbox", }); } // Never wanted toggled. else if (item == neverWantedCheckbox) { PlayerNeverWanted = _checked; if (!_checked) { SetMaxWantedLevel(5); } else { SetMaxWantedLevel(0); } } // Everyone ignores player toggled. else if (item == everyoneIgnoresPlayerCheckbox) { PlayerIsIgnored = _checked; // Manage player is ignored by everyone. SetEveryoneIgnorePlayer(Game.Player.Handle, PlayerIsIgnored); SetPoliceIgnorePlayer(Game.Player.Handle, PlayerIsIgnored); SetPlayerCanBeHassledByGangs(Game.Player.Handle, !PlayerIsIgnored); } else if (item == playerStayInVehicleCheckbox) { PlayerStayInVehicle = _checked; TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980077397508122, content = $"**Zmieniono status __Pozostan w pojezdzie__:** {_checked}", scriptName = "vMenu", functionName = "playerStayInVehicleCheckbox", }); } // Freeze player toggled. else if (item == playerFrozenCheckbox) { PlayerFrozen = _checked; if (!MainMenu.NoClipEnabled) { FreezeEntityPosition(Game.PlayerPed.Handle, PlayerFrozen); } else if (!MainMenu.NoClipEnabled) { FreezeEntityPosition(Game.PlayerPed.Handle, PlayerFrozen); } TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980077397508122, content = $"**Zmieniono status __Zamroz postac__:** {_checked}", scriptName = "vMenu", functionName = "playerFrozenCheckbox", }); } }; // List selections menu.OnListItemSelect += (sender, listItem, listIndex, itemIndex) => { // Set wanted Level if (listItem == setWantedLevel) { SetPlayerWantedLevel(Game.Player.Handle, listIndex, false); SetPlayerWantedLevelNow(Game.Player.Handle, false); } // Player Scenarios else if (listItem == playerScenarios) { PlayScenario(PedScenarios.ScenarioNames[PedScenarios.Scenarios[listIndex]]); } else if (listItem == setArmorItem) { Game.PlayerPed.Armor = (listItem.ListIndex) * 20; TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980185832849429, content = $"**Zmieniono status __Poziomu kamizelki__:** {Game.PlayerPed.Armor}", scriptName = "vMenu", functionName = "setArmorItem", }); } }; // button presses menu.OnItemSelect += (sender, item, index) => { // Force Stop Scenario button if (item == stopScenario) { // Play a new scenario named "forcestop" (this scenario doesn't exist, but the "Play" function checks // for the string "forcestop", if that's provided as th scenario name then it will forcefully clear the player task. PlayScenario("forcestop"); } else if (item == healPlayerBtn) { Game.PlayerPed.Health = Game.PlayerPed.MaxHealth; Notify.Success("Player healed."); TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980236860751912, content = $"**Uleczono gracza**", scriptName = "vMenu", functionName = "healPlayerBtn", }); } else if (item == cleanPlayerBtn) { Game.PlayerPed.ClearBloodDamage(); Notify.Success("Player clothes have been cleaned."); } else if (item == dryPlayerBtn) { Game.PlayerPed.WetnessHeight = 0f; Notify.Success("Player is now dry."); } else if (item == wetPlayerBtn) { Game.PlayerPed.WetnessHeight = 2f; Notify.Success("Player is now wet."); } else if (item == suicidePlayerBtn) { CommitSuicide(); TriggerServerEvent("ex_logger:SendLogBot", new { source = GetPlayerServerId(Game.Player.Handle), channel = 645980236860751912, content = $"**Samobojstwo**", scriptName = "vMenu", functionName = "suicidePlayerBtn", }); } }; #endregion }
/// <summary> /// Creates the menu if it doesn't exist yet and sets the event handlers. /// </summary> public void CreateMenu() { menu = new Menu(Game.Player.Name, "武器裝載管理"); MenuController.AddSubmenu(menu, SavedLoadoutsMenu); MenuController.AddSubmenu(SavedLoadoutsMenu, ManageLoadoutMenu); MenuItem saveLoadout = new MenuItem("保存裝載", "將您當前的武器保存到新的裝載槽中."); MenuItem savedLoadoutsMenuBtn = new MenuItem("管理裝載", "管理已保存的武器裝載.") { Label = "→→→" }; MenuCheckboxItem enableDefaultLoadouts = new MenuCheckboxItem("重生預設裝載", "如果您已將裝載設置為預設,則每當您重生時,您的裝載將自動進行裝備.", WeaponLoadoutsSetLoadoutOnRespawn); menu.AddMenuItem(saveLoadout); menu.AddMenuItem(savedLoadoutsMenuBtn); MenuController.BindMenuItem(menu, SavedLoadoutsMenu, savedLoadoutsMenuBtn); if (IsAllowed(Permission.WLEquipOnRespawn)) { menu.AddMenuItem(enableDefaultLoadouts); menu.OnCheckboxChange += (sender, checkbox, index, _checked) => { WeaponLoadoutsSetLoadoutOnRespawn = _checked; }; } void RefreshSavedWeaponsMenu() { int oldCount = SavedLoadoutsMenu.Size; SavedLoadoutsMenu.ClearMenuItems(true); RefreshSavedWeaponsList(); foreach (var sw in SavedWeapons) { MenuItem btn = new MenuItem(sw.Key.Replace("vmenu_string_saved_weapon_loadout_", ""), "點擊以管理此加載.") { Label = "→→→" }; SavedLoadoutsMenu.AddMenuItem(btn); MenuController.BindMenuItem(SavedLoadoutsMenu, ManageLoadoutMenu, btn); } if (oldCount > SavedWeapons.Count) { SavedLoadoutsMenu.RefreshIndex(); } } MenuItem spawnLoadout = new MenuItem("裝備裝載", "這將刪除您當前所有的武器,並替換它們."); MenuItem renameLoadout = new MenuItem("重命名裝載", "重新命名並保存."); MenuItem cloneLoadout = new MenuItem("複製裝載", "將此複製到新的插槽."); MenuItem setDefaultLoadout = new MenuItem("設置為默認裝載", "將此裝載設置為每次重生成時的預設值."); MenuItem replaceLoadout = new MenuItem("~r~取代裝載", "~r~這將用您當前庫存中的武器替換此保存插槽,此操作無法撤消!"); MenuItem deleteLoadout = new MenuItem("~r~刪除加載", "~r~這將刪除此次保存。此操作無法撤消!"); if (IsAllowed(Permission.WLEquip)) { ManageLoadoutMenu.AddMenuItem(spawnLoadout); } ManageLoadoutMenu.AddMenuItem(renameLoadout); ManageLoadoutMenu.AddMenuItem(cloneLoadout); ManageLoadoutMenu.AddMenuItem(setDefaultLoadout); ManageLoadoutMenu.AddMenuItem(replaceLoadout); ManageLoadoutMenu.AddMenuItem(deleteLoadout); // Save the weapons loadout. menu.OnItemSelect += async(sender, item, index) => { if (item == saveLoadout) { string name = await GetUserInput("輸入保存名字", 30); if (string.IsNullOrEmpty(name)) { Notify.Error(CommonErrors.InvalidInput); } else { if (SavedWeapons.ContainsKey("vmenu_string_saved_weapon_loadout_" + name)) { Notify.Error(CommonErrors.SaveNameAlreadyExists); } else { if (SaveWeaponLoadout("vmenu_string_saved_weapon_loadout_" + name)) { Log("saveweapons called from menu select (save loadout button)"); Notify.Success($"您的武器已儲存為 ~g~{name}~s~."); } else { Notify.Error(CommonErrors.UnknownError); } } } } }; // manage spawning, renaming, deleting etc. ManageLoadoutMenu.OnItemSelect += async(sender, item, index) => { if (SavedWeapons.ContainsKey(SelectedSavedLoadoutName)) { List <ValidWeapon> weapons = SavedWeapons[SelectedSavedLoadoutName]; if (item == spawnLoadout) // spawn { await SpawnWeaponLoadoutAsync(SelectedSavedLoadoutName, false, true, false); } else if (item == renameLoadout || item == cloneLoadout) // rename or clone { string newName = await GetUserInput("輸入儲存名字", SelectedSavedLoadoutName.Replace("vmenu_string_saved_weapon_loadout_", ""), 30); if (string.IsNullOrEmpty(newName)) { Notify.Error(CommonErrors.InvalidInput); } else { if (SavedWeapons.ContainsKey("vmenu_string_saved_weapon_loadout_" + newName)) { Notify.Error(CommonErrors.SaveNameAlreadyExists); } else { SetResourceKvp("vmenu_string_saved_weapon_loadout_" + newName, JsonConvert.SerializeObject(weapons)); Notify.Success($"您的武器裝載量為 {(item == renameLoadout ? "重命名" : "複製")} to ~g~{newName}~s~."); if (item == renameLoadout) { DeleteResourceKvp(SelectedSavedLoadoutName); } ManageLoadoutMenu.GoBack(); } } } else if (item == setDefaultLoadout) // set as default { SetResourceKvp("vmenu_string_default_loadout", SelectedSavedLoadoutName); Notify.Success("現在這是您的默認裝載."); item.LeftIcon = MenuItem.Icon.TICK; } else if (item == replaceLoadout) // replace { if (replaceLoadout.Label == "您確定嗎?") { replaceLoadout.Label = ""; SaveWeaponLoadout(SelectedSavedLoadoutName); Log("save weapons called from replace loadout"); Notify.Success("您保存的裝載已被當前武器取代."); } else { replaceLoadout.Label = "您確定嗎?"; } } else if (item == deleteLoadout) // delete { if (deleteLoadout.Label == "您確定嗎?") { deleteLoadout.Label = ""; DeleteResourceKvp(SelectedSavedLoadoutName); ManageLoadoutMenu.GoBack(); Notify.Success("您保存的裝載已刪除。"); } else { deleteLoadout.Label = "您確定嗎?"; } } } }; // Reset the 'are you sure' states. ManageLoadoutMenu.OnMenuClose += (sender) => { deleteLoadout.Label = ""; renameLoadout.Label = ""; }; // Reset the 'are you sure' states. ManageLoadoutMenu.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { deleteLoadout.Label = ""; renameLoadout.Label = ""; }; // Refresh the spawned weapons menu whenever this menu is opened. SavedLoadoutsMenu.OnMenuOpen += (sender) => { RefreshSavedWeaponsMenu(); }; // Set the current saved loadout whenever a loadout is selected. SavedLoadoutsMenu.OnItemSelect += (sender, item, index) => { if (SavedWeapons.ContainsKey("vmenu_string_saved_weapon_loadout_" + item.Text)) { SelectedSavedLoadoutName = "vmenu_string_saved_weapon_loadout_" + item.Text; } else // shouldn't ever happen, but just in case { ManageLoadoutMenu.GoBack(); } }; // Reset the index whenever the ManageLoadout menu is opened. Just to prevent auto selecting the delete option for example. ManageLoadoutMenu.OnMenuOpen += (sender) => { ManageLoadoutMenu.RefreshIndex(); string kvp = GetResourceKvpString("vmenu_string_default_loadout"); if (string.IsNullOrEmpty(kvp) || kvp != SelectedSavedLoadoutName) { setDefaultLoadout.LeftIcon = MenuItem.Icon.NONE; } else { setDefaultLoadout.LeftIcon = MenuItem.Icon.TICK; } }; // Refresh the saved weapons menu. RefreshSavedWeaponsMenu(); }
/// <summary> /// Updates the player items. /// </summary> public void UpdatePlayerlist() { // Remove leftover menu items if they exist. if (menu.MenuItems.Count > 0) { menu.MenuItems.Clear(); } // Create a new player list. PlayerList pl = new PlayerList(); // Loop through the playerlist. foreach (Player p in pl) { // Create a button for this player and add it to the menu. UIMenuItem playerItem = new UIMenuItem(p.Name, "[" + (p.Handle < 10 ? "0" : "") + p.Handle + "] " + p.Name + " (Server ID: " + p.ServerId + ")"); playerItem.SetRightLabel("→→→"); menu.AddItem(playerItem); // Handle button presses. menu.OnItemSelect += (sender, item, index) => { // If the player item is pressed. if (item == playerItem) { // Create the player object. Player player = new Player(int.Parse(item.Description.Substring(1, 2).ToString())); // Create the menu for the player & set the width offset. UIMenu PlayerMenu = new UIMenu(player.Name, "[" + (player.Handle < 10 ? "0" : "") + player.Handle + "] " + player.Name + " (Server ID: " + player.ServerId + ")", true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; PlayerMenu.SetMenuWidthOffset(50); // Create all player options buttons. UIMenuItem teleportBtn = new UIMenuItem("Teleport To Player", "Teleport to this player."); UIMenuItem teleportInVehBtn = new UIMenuItem("Teleport Into Vehicle", "Teleport into the player's vehicle."); UIMenuItem setWaypointBtn = new UIMenuItem("Toggle GPS Route", "Enables or disables drawing a GPS route to this player."); UIMenuItem spectateBtn = new UIMenuItem("Spectate Player", "Spectate this player."); UIMenuItem summonBtn = new UIMenuItem("Summon Player", "Bring this player to your location."); summonBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); UIMenuItem killBtn = new UIMenuItem("Kill Player", "Kill the selected player! Why are you so cruel :("); killBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); UIMenuItem kickPlayerBtn = new UIMenuItem("~r~Kick Player", "~r~Kick~s~ this player from the server, you need to specify a reason " + "otherwise the kick will be cancelled."); kickPlayerBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); UIMenuItem permBanBtn = new UIMenuItem("~r~Ban Player", "Ban the player from the server forever."); permBanBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); UIMenuItem tempBanBtn = new UIMenuItem("~r~Tempban Player", "Ban the player from the server for the specified amount of hours. " + "The player will be able to rejoin after the ban expires."); tempBanBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); // Add all buttons to the player options submenu. Keeping permissions in mind. if (cf.IsAllowed(Permission.OPTeleport)) { PlayerMenu.AddItem(teleportBtn); PlayerMenu.AddItem(teleportInVehBtn); } if (cf.IsAllowed(Permission.OPWaypoint)) { PlayerMenu.AddItem(setWaypointBtn); } if (cf.IsAllowed(Permission.OPSpectate)) { PlayerMenu.AddItem(spectateBtn); } if (cf.IsAllowed(Permission.OPSummon)) { PlayerMenu.AddItem(summonBtn); } if (cf.IsAllowed(Permission.OPKill)) { PlayerMenu.AddItem(killBtn); } if (cf.IsAllowed(Permission.OPKick)) { PlayerMenu.AddItem(kickPlayerBtn); } if (cf.IsAllowed(Permission.OPTempBan)) { PlayerMenu.AddItem(tempBanBtn); } if (cf.IsAllowed(Permission.OPPermBan)) { PlayerMenu.AddItem(permBanBtn); } // Add the player menu to the menu pool. MainMenu.Mp.Add(PlayerMenu); // Set the menu invisible. menu.Visible = false; // Set the player menu visible. PlayerMenu.Visible = true; // If a button is pressed in the player's options menu. PlayerMenu.OnItemSelect += (sender2, item2, index2) => { // Teleport button is pressed. if (item2 == teleportBtn) { cf.TeleportToPlayerAsync(player.Handle, false); } // Teleport in vehicle button is pressed. else if (item2 == teleportInVehBtn) { cf.TeleportToPlayerAsync(player.Handle, true); } // Set waypoint button is pressed. else if (item2 == setWaypointBtn) { bool selectedPedRouteAlreadyActive = false; if (PlayersWaypointList.Count > 0) { if (PlayersWaypointList.Contains(player.Handle)) { selectedPedRouteAlreadyActive = true; } foreach (int playerId in PlayersWaypointList) { int playerPed = GetPlayerPed(playerId); if (DoesEntityExist(playerPed) && DoesBlipExist(GetBlipFromEntity(playerPed))) { int oldBlip = GetBlipFromEntity(playerPed); SetBlipRoute(oldBlip, false); RemoveBlip(ref oldBlip); Notify.Custom($"~g~GPS route to ~s~<C>{GetPlayerName(playerId)}</C>~g~ is now disabled."); } } PlayersWaypointList.Clear(); } if (!selectedPedRouteAlreadyActive) { if (player.Handle != PlayerId()) { int ped = GetPlayerPed(player.Handle); int blip = GetBlipFromEntity(ped); if (DoesBlipExist(blip)) { SetBlipColour(blip, 58); SetBlipRouteColour(blip, 58); SetBlipRoute(blip, true); } else { blip = AddBlipForEntity(ped); SetBlipColour(blip, 58); SetBlipRouteColour(blip, 58); SetBlipRoute(blip, true); } PlayersWaypointList.Add(player.Handle); Notify.Custom($"~g~GPS route to ~s~<C>{player.Name}</C>~g~ is now active, press the ~s~Toggle GPS Route~g~ button again to disable the route."); } else { Notify.Error("You can not set a waypoint to yourself."); } } } // Spectate player button is pressed. else if (item2 == spectateBtn) { if (player.Handle == PlayerId()) { Notify.Error("Sorry, you can ~r~~h~not~h~ ~s~spectate yourself!", true, true); } else { cf.SpectateAsync(player.Handle); } } // Summon player button is pressed. else if (item2 == summonBtn) { if (player.Handle == PlayerId()) { Notify.Error("Sorry, you can ~r~~h~not~h~ ~s~summon yourself!", true, true); } else { cf.SummonPlayer(player); } } // Kill player button is pressed. else if (item2 == killBtn) { Notify.Success($"Player ~y~<C>{player.Name}</C> ~s~has been killed."); cf.KillPlayer(player); } // Kick player button is pressed. else if (item2 == kickPlayerBtn) { // Close the menu. PlayerMenu.GoBack(); // Kick the player. cf.KickPlayer(player, true); // Update the player list. UpdatePlayerlist(); // Refresh the index & update scaleform. menu.RefreshIndex(); menu.UpdateScaleform(); } else if (item2 == tempBanBtn) { // Close the menu. PlayerMenu.GoBack(); // ban player cf.BanPlayer(player: player, forever: false); // Update the player list. UpdatePlayerlist(); // Refresh the index & update scaleform. menu.RefreshIndex(); menu.UpdateScaleform(); } else if (item2 == permBanBtn) { // Close the menu. PlayerMenu.GoBack(); // ban player cf.BanPlayer(player: player, forever: true); // Update the player list. UpdatePlayerlist(); // Refresh the index & update scaleform. menu.RefreshIndex(); menu.UpdateScaleform(); } }; // Reopen the playerlist menu when a player specific menu is closed. PlayerMenu.OnMenuClose += (sender2) => { menu.Visible = true; }; PlayerMenu.RefreshIndex(); PlayerMenu.UpdateScaleform(); } }; } ; }
/// <summary> /// Updates the player items. /// </summary> public void UpdatePlayerlist() { // Remove leftover menu items if they exist. if (menu.MenuItems.Count > 0) { menu.MenuItems.Clear(); } // Create a new player list. PlayerList pl = new PlayerList(); // Loop through the playerlist. foreach (Player p in pl) { // Create a button for this player and add it to the menu. UIMenuItem playerItem = new UIMenuItem(p.Name, "[" + (p.Handle < 10 ? "0" : "") + p.Handle + "] " + p.Name + " (Server ID: " + p.ServerId + ")"); playerItem.SetRightLabel("→→→"); menu.AddItem(playerItem); // Handle button presses. menu.OnItemSelect += (sender, item, index) => { // If the player item is pressed. if (item == playerItem) { // Create the player object. Player player = new Player(int.Parse(item.Description.Substring(1, 2).ToString())); // Create the menu for the player & set the width offset. UIMenu PlayerMenu = new UIMenu(player.Name, "[" + (player.Handle < 10 ? "0" : "") + player.Handle + "] " + player.Name + " (Server ID: " + player.ServerId + ")", true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; PlayerMenu.SetMenuWidthOffset(50); PlayerMenu.RefreshIndex(); PlayerMenu.UpdateScaleform(); // Create all player options buttons. UIMenuItem teleportBtn = new UIMenuItem("Teleport To Player", "Teleport to this player."); UIMenuItem teleportInVehBtn = new UIMenuItem("Teleport Into Vehicle", "Teleport into the player's vehicle."); UIMenuItem setWaypointBtn = new UIMenuItem("Set Waypoint", "Set a waypoint to this player."); UIMenuItem spectateBtn = new UIMenuItem("Spectate Player", "Spectate this player."); UIMenuItem summonBtn = new UIMenuItem("Summon Player", "Bring this player to your location."); summonBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); UIMenuItem killBtn = new UIMenuItem("Kill Player", "Kill the selected player! Why are you so cruel :("); killBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); UIMenuItem kickPlayerBtn = new UIMenuItem("~r~Kick Player", "~r~Kick~s~ this player from the server, you need to specify a reason " + "otherwise the kick will be cancelled."); kickPlayerBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); UIMenuItem permBanBtn = new UIMenuItem("~r~Ban Player", "Ban the player from the server forever."); permBanBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); UIMenuItem tempBanBtn = new UIMenuItem("~r~Tempban Player", "Ban the player from the server for the specified amount of hours. " + "The player will be able to rejoin after the ban expires."); tempBanBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); // Add all buttons to the player options submenu. Keeping permissions in mind. if (cf.IsAllowed(Permission.OPTeleport)) { PlayerMenu.AddItem(teleportBtn); PlayerMenu.AddItem(teleportInVehBtn); } if (cf.IsAllowed(Permission.OPWaypoint)) { PlayerMenu.AddItem(setWaypointBtn); } if (cf.IsAllowed(Permission.OPSpectate)) { PlayerMenu.AddItem(spectateBtn); } if (cf.IsAllowed(Permission.OPSummon)) { PlayerMenu.AddItem(summonBtn); } if (cf.IsAllowed(Permission.OPKill)) { PlayerMenu.AddItem(killBtn); } if (cf.IsAllowed(Permission.OPKick)) { PlayerMenu.AddItem(kickPlayerBtn); } if (cf.IsAllowed(Permission.OPTempBan)) { PlayerMenu.AddItem(tempBanBtn); } if (cf.IsAllowed(Permission.OPPermBan)) { PlayerMenu.AddItem(permBanBtn); } // Add the player menu to the menu pool. MainMenu.Mp.Add(PlayerMenu); // Set the menu invisible. menu.Visible = false; // Set the player menu visible. PlayerMenu.Visible = true; // If a button is pressed in the player's options menu. PlayerMenu.OnItemSelect += (sender2, item2, index2) => { // Teleport button is pressed. if (item2 == teleportBtn) { cf.TeleportToPlayerAsync(player.Handle, false); } // Teleport in vehicle button is pressed. else if (item2 == teleportInVehBtn) { cf.TeleportToPlayerAsync(player.Handle, true); } // Set waypoint button is pressed. else if (item2 == setWaypointBtn) { World.WaypointPosition = GetEntityCoords(GetPlayerPed(player.Handle), true); //Subtitle.Info($"A new waypoint has been set to ~y~{player.Name}~z~.", prefix: "Info:"); } // Spectate player button is pressed. else if (item2 == spectateBtn) { if (player.Handle == PlayerId()) { //Subtitle.Error("You can ~h~not~h~ spectate yourself!", prefix: "Error:"); Notify.Error("Sorry, you can ~r~~h~not~h~ ~s~spectate yourself!"); } else { cf.SpectateAsync(player.Handle); } } // Summon player button is pressed. else if (item2 == summonBtn) { if (player.Handle == PlayerId()) { Notify.Error("Sorry, you can ~r~~h~not~h~ ~s~summon yourself!"); } else { cf.SummonPlayer(player); } } // Kill player button is pressed. else if (item2 == killBtn) { //Subtitle.Info($"~y~{player.Name} ~z~has been killed.", prefix: "Info:"); Notify.Success($"Player ~y~<C>{player.Name}</C> ~s~has been killed."); cf.KillPlayer(player); } // Kick player button is pressed. else if (item2 == kickPlayerBtn) { // Close the menu. PlayerMenu.GoBack(); // Kick the player. cf.KickPlayer(player, true); // Update the player list. UpdatePlayerlist(); // Refresh the index & update scaleform. menu.RefreshIndex(); menu.UpdateScaleform(); } else if (item2 == tempBanBtn) { cf.BanPlayer(player: player, forever: false); } else if (item2 == permBanBtn) { cf.BanPlayer(player: player, forever: true); } }; // Reopen the playerlist menu when a player specific menu is closed. PlayerMenu.OnMenuClose += (sender2) => { menu.Visible = true; }; } }; } ; }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { string menuTitle = "YDDY:RP"; #region Create menus and submenus // Create the menu. menu = new Menu(menuTitle, "Меню сохраненных автомобилей"); MenuItem saveVehicle = new MenuItem("Сохранить текущий автомобиль", ""); menu.AddMenuItem(saveVehicle); saveVehicle.LeftIcon = MenuItem.Icon.CAR; menu.OnItemSelect += (sender, item, index) => { if (item == saveVehicle) { if (Game.PlayerPed.IsInVehicle()) { SaveVehicle(); } else { Notify.Error("You are currently not in any vehicle. Please enter a vehicle before trying to save it."); } } }; for (int i = 0; i < 22; i++) { Menu categoryMenu = new Menu("Сохраненные", GetLabelText($"VEH_CLASS_{i}")); MenuItem categoryButton = new MenuItem(GetLabelText($"VEH_CLASS_{i}"), $"Все сохраненные автомобили категории {(GetLabelText($"VEH_CLASS_{i}"))}."); subMenus.Add(categoryMenu); MenuController.AddSubmenu(menu, categoryMenu); menu.AddMenuItem(categoryButton); categoryButton.Label = "→→→"; MenuController.BindMenuItem(menu, categoryMenu, categoryButton); categoryMenu.OnMenuClose += (sender) => { UpdateMenuAvailableCategories(); }; categoryMenu.OnItemSelect += (sender, item, index) => { UpdateSelectedVehicleMenu(item, sender); }; } MenuItem unavailableModels = new MenuItem("Недоступные сохраненные автомобили", "") { Label = "→→→" }; menu.AddMenuItem(unavailableModels); MenuController.BindMenuItem(menu, unavailableVehiclesMenu, unavailableModels); MenuController.AddSubmenu(menu, unavailableVehiclesMenu); MenuController.AddMenu(selectedVehicleMenu); MenuItem spawnVehicle = new MenuItem("Заспавнить", ""); MenuItem renameVehicle = new MenuItem("Переименовать", ""); MenuItem replaceVehicle = new MenuItem("~r~Заменить текущим", ""); MenuItem deleteVehicle = new MenuItem("~r~Удалить", ""); selectedVehicleMenu.AddMenuItem(spawnVehicle); selectedVehicleMenu.AddMenuItem(renameVehicle); selectedVehicleMenu.AddMenuItem(replaceVehicle); selectedVehicleMenu.AddMenuItem(deleteVehicle); selectedVehicleMenu.OnMenuClose += (sender) => { selectedVehicleMenu.RefreshIndex(); deleteButtonPressedCount = 0; deleteVehicle.Label = ""; }; selectedVehicleMenu.OnItemSelect += async(sender, item, index) => { if (item == spawnVehicle) { if (MainMenu.VehicleSpawnerMenu != null) { SpawnVehicle(currentlySelectedVehicle.Value.model, MainMenu.VehicleSpawnerMenu.SpawnInVehicle, MainMenu.VehicleSpawnerMenu.ReplaceVehicle, false, vehicleInfo: currentlySelectedVehicle.Value, saveName: currentlySelectedVehicle.Key.Substring(4)); } else { SpawnVehicle(currentlySelectedVehicle.Value.model, true, true, false, vehicleInfo: currentlySelectedVehicle.Value, saveName: currentlySelectedVehicle.Key.Substring(4)); } } else if (item == renameVehicle) { string newName = await GetUserInput(windowTitle : "Enter a new name for this vehicle.", maxInputLength : 30); if (string.IsNullOrEmpty(newName)) { Notify.Error(CommonErrors.InvalidInput); } else { if (StorageManager.SaveVehicleInfo("veh_" + newName, currentlySelectedVehicle.Value, false)) { DeleteResourceKvp(currentlySelectedVehicle.Key); while (!selectedVehicleMenu.Visible) { await BaseScript.Delay(0); } Notify.Success("Your vehicle has successfully been renamed."); UpdateMenuAvailableCategories(); selectedVehicleMenu.GoBack(); currentlySelectedVehicle = new KeyValuePair <string, VehicleInfo>(); // clear the old info } else { Notify.Error("This name is already in use or something unknown failed. Contact the server owner if you believe something is wrong."); } } } else if (item == replaceVehicle) { if (Game.PlayerPed.IsInVehicle()) { SaveVehicle(currentlySelectedVehicle.Key.Substring(4)); selectedVehicleMenu.GoBack(); Notify.Success("Your saved vehicle has been replaced with your current vehicle."); } else { Notify.Error("You need to be in a vehicle before you can relplace your old vehicle."); } } else if (item == deleteVehicle) { if (deleteButtonPressedCount == 0) { deleteButtonPressedCount = 1; item.Label = "Press again to confirm."; Notify.Alert("Are you sure you want to delete this vehicle? Press the button again to confirm."); } else { deleteButtonPressedCount = 0; item.Label = ""; DeleteResourceKvp(currentlySelectedVehicle.Key); UpdateMenuAvailableCategories(); selectedVehicleMenu.GoBack(); Notify.Success("Your saved vehicle has been deleted."); } } if (item != deleteVehicle) // if any other button is pressed, restore the delete vehicle button pressed count. { deleteButtonPressedCount = 0; deleteVehicle.Label = ""; } }; #endregion }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { #region create menu and menu items // Create the menu. menu = new Menu(Game.Player.Name, "玩家選單"); // Create all checkboxes. MenuCheckboxItem playerGodModeCheckbox = new MenuCheckboxItem("無敵", "使您變無敵.", PlayerGodMode); MenuCheckboxItem invisibleCheckbox = new MenuCheckboxItem("隱身", "使您隱身,其他人看不見.", PlayerInvisible); MenuCheckboxItem unlimitedStaminaCheckbox = new MenuCheckboxItem("無限體力", "使您可以永遠的跑步,而不會疲勞造成減速.", PlayerStamina); MenuCheckboxItem fastRunCheckbox = new MenuCheckboxItem("快速跑步", "獲得 ~g~超級~s~ 的力量快速游泳!", PlayerFastRun); SetRunSprintMultiplierForPlayer(Game.Player.Handle, (PlayerFastRun && IsAllowed(Permission.POFastRun) ? 1.49f : 1f)); MenuCheckboxItem fastSwimCheckbox = new MenuCheckboxItem("快速游泳", "獲得 ~g~超級 2.0~s~ 的游泳速度!", PlayerFastSwim); SetSwimMultiplierForPlayer(Game.Player.Handle, (PlayerFastSwim && IsAllowed(Permission.POFastSwim) ? 1.49f : 1f)); MenuCheckboxItem superJumpCheckbox = new MenuCheckboxItem("超級跳躍", "獲得 ~g~超級 3.0~s~ 的力量跳躍!", PlayerSuperJump); MenuCheckboxItem noRagdollCheckbox = new MenuCheckboxItem("停止摔車", "發生車禍時不會再摔車.", PlayerNoRagdoll); MenuCheckboxItem neverWantedCheckbox = new MenuCheckboxItem("永不通輯", "永遠都不會有通緝.", PlayerNeverWanted); MenuCheckboxItem everyoneIgnoresPlayerCheckbox = new MenuCheckboxItem("無視所有玩家", "所有人遠離此玩家.", PlayerIsIgnored); MenuCheckboxItem playerStayInVehicleCheckbox = new MenuCheckboxItem("待在車內", "啟用功能後,如果NPC對您發火,無法將您拖出車外.", PlayerStayInVehicle); MenuCheckboxItem playerFrozenCheckbox = new MenuCheckboxItem("凍結玩家", "把該玩家定住在原地.", PlayerFrozen); // Wanted level options List <string> wantedLevelList = new List <string> { "0", "1", "2", "3", "4", "5" }; MenuListItem setWantedLevel = new MenuListItem("設置通緝等級", wantedLevelList, GetPlayerWantedLevel(Game.Player.Handle), "選擇一個值來設置目前通緝等輯"); MenuListItem setArmorItem = new MenuListItem("設置護甲", new List <string> { "無護甲", GetLabelText("WT_BA_0"), GetLabelText("WT_BA_1"), GetLabelText("WT_BA_2"), GetLabelText("WT_BA_3"), GetLabelText("WT_BA_4"), }, 0, "Set the armor level/type for your player."); MenuItem healPlayerBtn = new MenuItem("治癒玩家", "給予玩家最大生命值."); MenuItem cleanPlayerBtn = new MenuItem("清潔衣服", "清潔衣服."); MenuItem dryPlayerBtn = new MenuItem("烘乾衣服", "烘乾衣服."); MenuItem wetPlayerBtn = new MenuItem("撥濕衣服", "撥濕衣服."); MenuItem suicidePlayerBtn = new MenuItem("~r~自殺", "服用藥物殺死自己,或者如過手上有手槍將會開槍自盡."); Menu vehicleAutoPilot = new Menu("自動駕駛", "管理載具自動駕駛選項."); MenuController.AddSubmenu(menu, vehicleAutoPilot); MenuItem vehicleAutoPilotBtn = new MenuItem("自動駕駛選單", "管理載具自動駕駛選項.") { Label = "→→→" }; List <string> drivingStyles = new List <string>() { "正常", "衝刺", "避開高速公路", "倒車", "自訂" }; MenuListItem drivingStyle = new MenuListItem("駕駛風格", drivingStyles, 0, "將用於'駕駛' 的駕駛方式設置為'導航點'和'隨機駕駛'"); // Scenarios (list can be found in the PedScenarios class) MenuListItem playerScenarios = new MenuListItem("玩家場景", PedScenarios.Scenarios, 0, "選擇一個場景,然後按Enter鍵以啟動它。 選擇另一個方案將覆蓋當前方案。 如果您已經在玩家選定的場景,再次選擇它將會停止該場景."); MenuItem stopScenario = new MenuItem("強制停止場景", "這將迫使正在播放的場景立即停止,而無需等待其完成“停止”動畫."); #endregion #region add items to menu based on permissions // Add all checkboxes to the menu. (keeping permissions in mind) if (IsAllowed(Permission.POGod)) { menu.AddMenuItem(playerGodModeCheckbox); } if (IsAllowed(Permission.POInvisible)) { menu.AddMenuItem(invisibleCheckbox); } if (IsAllowed(Permission.POUnlimitedStamina)) { menu.AddMenuItem(unlimitedStaminaCheckbox); } if (IsAllowed(Permission.POFastRun)) { menu.AddMenuItem(fastRunCheckbox); } if (IsAllowed(Permission.POFastSwim)) { menu.AddMenuItem(fastSwimCheckbox); } if (IsAllowed(Permission.POSuperjump)) { menu.AddMenuItem(superJumpCheckbox); } if (IsAllowed(Permission.PONoRagdoll)) { menu.AddMenuItem(noRagdollCheckbox); } if (IsAllowed(Permission.PONeverWanted)) { menu.AddMenuItem(neverWantedCheckbox); } if (IsAllowed(Permission.POSetWanted)) { menu.AddMenuItem(setWantedLevel); } if (IsAllowed(Permission.POIgnored)) { menu.AddMenuItem(everyoneIgnoresPlayerCheckbox); } if (IsAllowed(Permission.POStayInVehicle)) { menu.AddMenuItem(playerStayInVehicleCheckbox); } if (IsAllowed(Permission.POMaxHealth)) { menu.AddMenuItem(healPlayerBtn); } if (IsAllowed(Permission.POMaxArmor)) { menu.AddMenuItem(setArmorItem); } if (IsAllowed(Permission.POCleanPlayer)) { menu.AddMenuItem(cleanPlayerBtn); } if (IsAllowed(Permission.PODryPlayer)) { menu.AddMenuItem(dryPlayerBtn); } if (IsAllowed(Permission.POWetPlayer)) { menu.AddMenuItem(wetPlayerBtn); } menu.AddMenuItem(suicidePlayerBtn); if (IsAllowed(Permission.POVehicleAutoPilotMenu)) { menu.AddMenuItem(vehicleAutoPilotBtn); MenuController.BindMenuItem(menu, vehicleAutoPilot, vehicleAutoPilotBtn); vehicleAutoPilot.AddMenuItem(drivingStyle); MenuItem startDrivingWaypoint = new MenuItem("開至導航點", "開到地圖上的標記點."); MenuItem startDrivingRandomly = new MenuItem("隨機行駛", "在地圖上隨便亂開."); MenuItem stopDriving = new MenuItem("停止行駛", "會先找到一個停靠點在停止行使."); MenuItem forceStopDriving = new MenuItem("強制停止行駛", "立即停在駕駛"); MenuItem customDrivingStyle = new MenuItem("自訂駕駛風格", "選擇自訂駕駛風格.") { Label = "→→→" }; MenuController.AddSubmenu(vehicleAutoPilot, CustomDrivingStyleMenu); vehicleAutoPilot.AddMenuItem(customDrivingStyle); MenuController.BindMenuItem(vehicleAutoPilot, CustomDrivingStyleMenu, customDrivingStyle); Dictionary <int, string> knownNames = new Dictionary <int, string>() { { 0, "在車輛前停車" }, { 1, "在人之前停車" }, { 2, "避開車輛" }, { 3, "避開空車" }, { 4, "避開人" }, { 5, "避開物體" }, { 7, "在紅綠燈處停下" }, { 8, "使用紅綠燈" }, { 9, "允行開錯路" }, { 10, "倒檔" }, { 18, "使用最短程的捷徑" }, { 22, "無視道路" }, { 24, "無視所有捷徑" }, { 29, "避免行駛高速公路 (如果可能的話)" }, }; for (var i = 0; i < 31; i++) { string name = "~r~未知選項"; if (knownNames.ContainsKey(i)) { name = knownNames[i]; } MenuCheckboxItem checkbox = new MenuCheckboxItem(name, "開關駕駛風格選項", false); CustomDrivingStyleMenu.AddMenuItem(checkbox); } CustomDrivingStyleMenu.OnCheckboxChange += (sender, item, index, _checked) => { int style = GetStyleFromIndex(drivingStyle.ListIndex); CustomDrivingStyleMenu.MenuSubtitle = $"自訂駕駛風格: {style}"; if (drivingStyle.ListIndex == 4) { Notify.Custom("駕駛風格已更新"); SetDriveTaskDrivingStyle(Game.PlayerPed.Handle, style); } else { Notify.Custom("駕駛風格未更新,因為您沒有在上一個選單中啟用自定義駕駛風格."); } }; vehicleAutoPilot.AddMenuItem(startDrivingWaypoint); vehicleAutoPilot.AddMenuItem(startDrivingRandomly); vehicleAutoPilot.AddMenuItem(stopDriving); vehicleAutoPilot.AddMenuItem(forceStopDriving); vehicleAutoPilot.RefreshIndex(); vehicleAutoPilot.OnItemSelect += async(sender, item, index) => { if (Game.PlayerPed.IsInVehicle() && item != stopDriving && item != forceStopDriving) { if (Game.PlayerPed.CurrentVehicle != null && Game.PlayerPed.CurrentVehicle.Exists() && !Game.PlayerPed.CurrentVehicle.IsDead && Game.PlayerPed.CurrentVehicle.IsDriveable) { if (Game.PlayerPed.CurrentVehicle.Driver == Game.PlayerPed) { if (item == startDrivingWaypoint) { if (IsWaypointActive()) { int style = GetStyleFromIndex(drivingStyle.ListIndex); DriveToWp(style); Notify.Info("您的司機現在正在為您駕駛車輛。 您可以隨時按“停止駕駛”按鈕取消。 車輛到達目的地後將停止."); } else { Notify.Error("您需要先上車!"); } } else if (item == startDrivingRandomly) { int style = GetStyleFromIndex(drivingStyle.ListIndex); DriveWander(style); Notify.Info("您的司機現在正在為您駕駛車輛。 您可以隨時按“停止駕駛”按鈕取消."); } } else { Notify.Error("您必須是這輛車的駕駛員!"); } } else { Notify.Error("您的車輛損壞或不存在!"); } } else if (item != stopDriving && item != forceStopDriving) { Notify.Error("您需要先上車!"); } if (item == stopDriving) { if (Game.PlayerPed.IsInVehicle()) { Vehicle veh = GetVehicle(); if (veh != null && veh.Exists() && !veh.IsDead) { Vector3 outPos = new Vector3(); if (GetNthClosestVehicleNode(Game.PlayerPed.Position.X, Game.PlayerPed.Position.Y, Game.PlayerPed.Position.Z, 3, ref outPos, 0, 0, 0)) { Notify.Info("司機將找到合適的停車位,然後停止駕駛。 請耐心等待."); ClearPedTasks(Game.PlayerPed.Handle); TaskVehiclePark(Game.PlayerPed.Handle, veh.Handle, outPos.X, outPos.Y, outPos.Z, Game.PlayerPed.Heading, 3, 60f, true); while (Game.PlayerPed.Position.DistanceToSquared2D(outPos) > 3f) { await BaseScript.Delay(0); } SetVehicleHalt(veh.Handle, 3f, 0, false); ClearPedTasks(Game.PlayerPed.Handle); Notify.Info("您的司機已經停止駕駛."); } } } else { ClearPedTasks(Game.PlayerPed.Handle); Notify.Alert("您的司機不在任何車輛上."); } } else if (item == forceStopDriving) { ClearPedTasks(Game.PlayerPed.Handle); Notify.Info("駕駛任務已取消."); } }; vehicleAutoPilot.OnListItemSelect += (sender, item, listIndex, itemIndex) => { if (item == drivingStyle) { int style = GetStyleFromIndex(listIndex); SetDriveTaskDrivingStyle(Game.PlayerPed.Handle, style); Notify.Info($"駕駛風格現在設置為: ~r~{drivingStyles[listIndex]}~s~."); } }; } if (IsAllowed(Permission.POFreeze)) { menu.AddMenuItem(playerFrozenCheckbox); } if (IsAllowed(Permission.POScenarios)) { menu.AddMenuItem(playerScenarios); menu.AddMenuItem(stopScenario); } #endregion #region handle all events // Checkbox changes. menu.OnCheckboxChange += (sender, item, itemIndex, _checked) => { // God Mode toggled. if (item == playerGodModeCheckbox) { PlayerGodMode = _checked; } // Invisibility toggled. else if (item == invisibleCheckbox) { PlayerInvisible = _checked; SetEntityVisible(Game.PlayerPed.Handle, !PlayerInvisible, false); } // Unlimited Stamina toggled. else if (item == unlimitedStaminaCheckbox) { PlayerStamina = _checked; StatSetInt((uint)GetHashKey("MP0_STAMINA"), _checked ? 100 : 0, true); } // Fast run toggled. else if (item == fastRunCheckbox) { PlayerFastRun = _checked; SetRunSprintMultiplierForPlayer(Game.Player.Handle, (_checked ? 1.49f : 1f)); } // Fast swim toggled. else if (item == fastSwimCheckbox) { PlayerFastSwim = _checked; SetSwimMultiplierForPlayer(Game.Player.Handle, (_checked ? 1.49f : 1f)); } // Super jump toggled. else if (item == superJumpCheckbox) { PlayerSuperJump = _checked; } // No ragdoll toggled. else if (item == noRagdollCheckbox) { PlayerNoRagdoll = _checked; } // Never wanted toggled. else if (item == neverWantedCheckbox) { PlayerNeverWanted = _checked; if (!_checked) { SetMaxWantedLevel(5); } else { SetMaxWantedLevel(0); } } // Everyone ignores player toggled. else if (item == everyoneIgnoresPlayerCheckbox) { PlayerIsIgnored = _checked; // Manage player is ignored by everyone. SetEveryoneIgnorePlayer(Game.Player.Handle, PlayerIsIgnored); SetPoliceIgnorePlayer(Game.Player.Handle, PlayerIsIgnored); SetPlayerCanBeHassledByGangs(Game.Player.Handle, !PlayerIsIgnored); } else if (item == playerStayInVehicleCheckbox) { PlayerStayInVehicle = _checked; } // Freeze player toggled. else if (item == playerFrozenCheckbox) { PlayerFrozen = _checked; if (!MainMenu.NoClipEnabled) { FreezeEntityPosition(Game.PlayerPed.Handle, PlayerFrozen); } else if (!MainMenu.NoClipEnabled) { FreezeEntityPosition(Game.PlayerPed.Handle, PlayerFrozen); } } }; // List selections menu.OnListItemSelect += (sender, listItem, listIndex, itemIndex) => { // Set wanted Level if (listItem == setWantedLevel) { SetPlayerWantedLevel(Game.Player.Handle, listIndex, false); SetPlayerWantedLevelNow(Game.Player.Handle, false); } // Player Scenarios else if (listItem == playerScenarios) { PlayScenario(PedScenarios.ScenarioNames[PedScenarios.Scenarios[listIndex]]); } else if (listItem == setArmorItem) { Game.PlayerPed.Armor = (listItem.ListIndex) * 20; } }; // button presses menu.OnItemSelect += (sender, item, index) => { // Force Stop Scenario button if (item == stopScenario) { // Play a new scenario named "forcestop" (this scenario doesn't exist, but the "Play" function checks // for the string "forcestop", if that's provided as th scenario name then it will forcefully clear the player task. PlayScenario("forcestop"); } else if (item == healPlayerBtn) { Game.PlayerPed.Health = Game.PlayerPed.MaxHealth; Notify.Success("已經治療."); } else if (item == cleanPlayerBtn) { Game.PlayerPed.ClearBloodDamage(); Notify.Success("衣服已經洗乾淨了."); } else if (item == dryPlayerBtn) { Game.PlayerPed.WetnessHeight = 0f; Notify.Success("衣服已經烘乾了."); } else if (item == wetPlayerBtn) { Game.PlayerPed.WetnessHeight = 2f; Notify.Success("衣服現在濕了."); } else if (item == suicidePlayerBtn) { CommitSuicide(); } }; #endregion }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { string menuTitle = "Saved Vehicles"; #region Create menus and submenus // Create the menu. menu = new Menu(menuTitle, "Manage Saved Vehicles"); MenuItem saveVehicle = new MenuItem("Save Current Vehicle", "Save the vehicle you are currently sitting in."); menu.AddMenuItem(saveVehicle); saveVehicle.LeftIcon = MenuItem.Icon.CAR; menu.OnItemSelect += (sender, item, index) => { if (item == saveVehicle) { if (Game.PlayerPed.IsInVehicle()) { SaveVehicle(); } else { Notify.Error("You are currently not in any vehicle. Please enter a vehicle before trying to save it."); } } }; for (int i = 0; i < 22; i++) { Menu categoryMenu = new Menu("Saved Vehicles", GetLabelText($"VEH_CLASS_{i}")); MenuItem categoryButton = new MenuItem(GetLabelText($"VEH_CLASS_{i}"), $"All saved vehicles from the {(GetLabelText($"VEH_CLASS_{i}"))} category."); subMenus.Add(categoryMenu); MenuController.AddSubmenu(menu, categoryMenu); menu.AddMenuItem(categoryButton); categoryButton.Label = "→→→"; MenuController.BindMenuItem(menu, categoryMenu, categoryButton); categoryMenu.OnMenuClose += (sender) => { UpdateMenuAvailableCategories(); }; categoryMenu.OnItemSelect += (sender, item, index) => { UpdateSelectedVehicleMenu(item, sender); }; } MenuItem unavailableModels = new MenuItem("Unavailable Saved Vehicles", "These vehicles are currently unavailable because the models are not present in the game. These vehicles are most likely not being streamed from the server."); unavailableModels.Label = "→→→"; menu.AddMenuItem(unavailableModels); MenuController.BindMenuItem(menu, unavailableVehiclesMenu, unavailableModels); MenuController.AddSubmenu(menu, unavailableVehiclesMenu); MenuController.AddMenu(selectedVehicleMenu); MenuItem spawnVehicle = new MenuItem("Spawn Vehicle", "Spawn this saved vehicle."); MenuItem renameVehicle = new MenuItem("Rename Vehicle", "Rename your saved vehicle."); MenuItem replaceVehicle = new MenuItem("~r~Replace Vehicle", "Your saved vehicle will be replaced with the vehicle you are currently sitting in. ~r~Warning: this can NOT be undone!"); MenuItem deleteVehicle = new MenuItem("~r~Delete Vehicle", "~r~This will delete your saved vehicle. Warning: this can NOT be undone!"); selectedVehicleMenu.AddMenuItem(spawnVehicle); selectedVehicleMenu.AddMenuItem(renameVehicle); selectedVehicleMenu.AddMenuItem(replaceVehicle); selectedVehicleMenu.AddMenuItem(deleteVehicle); selectedVehicleMenu.OnMenuClose += (sender) => { selectedVehicleMenu.RefreshIndex(); deleteButtonPressedCount = 0; deleteVehicle.Label = ""; }; selectedVehicleMenu.OnItemSelect += async(sender, item, index) => { if (item == spawnVehicle) { if (MainMenu.VehicleSpawnerMenu != null) { SpawnVehicle(currentlySelectedVehicle.Value.model, MainMenu.VehicleSpawnerMenu.SpawnInVehicle, MainMenu.VehicleSpawnerMenu.ReplaceVehicle, false, vehicleInfo: currentlySelectedVehicle.Value, saveName: currentlySelectedVehicle.Key.Substring(4)); } else { SpawnVehicle(currentlySelectedVehicle.Value.model, true, true, false, vehicleInfo: currentlySelectedVehicle.Value, saveName: currentlySelectedVehicle.Key.Substring(4)); } } else if (item == renameVehicle) { string newName = await GetUserInput(windowTitle : "Enter a new name for this vehicle.", maxInputLength : 30); if (string.IsNullOrEmpty(newName)) { Notify.Error(CommonErrors.InvalidInput); } else { if (StorageManager.SaveVehicleInfo("veh_" + newName, currentlySelectedVehicle.Value, false)) { DeleteResourceKvp(currentlySelectedVehicle.Key); while (!selectedVehicleMenu.Visible) { await BaseScript.Delay(0); } Notify.Success("Your vehicle has successfully been renamed."); UpdateMenuAvailableCategories(); selectedVehicleMenu.GoBack(); currentlySelectedVehicle = new KeyValuePair <string, VehicleInfo>(); // clear the old info } else { Notify.Error("This name is already in use or something unknown failed. Contact the server owner if you believe something is wrong."); } } } else if (item == replaceVehicle) { if (Game.PlayerPed.IsInVehicle()) { SaveVehicle(currentlySelectedVehicle.Key.Substring(4)); selectedVehicleMenu.GoBack(); Notify.Success("Your saved vehicle has been replaced with your current vehicle."); } else { Notify.Error("You need to be in a vehicle before you can relplace your old vehicle."); } } else if (item == deleteVehicle) { if (deleteButtonPressedCount == 0) { deleteButtonPressedCount = 1; item.Label = "Press again to confirm."; Notify.Alert("Are you sure you want to delete this vehicle? Press the button again to confirm."); } else { deleteButtonPressedCount = 0; item.Label = ""; DeleteResourceKvp(currentlySelectedVehicle.Key); UpdateMenuAvailableCategories(); selectedVehicleMenu.GoBack(); Notify.Success("Your saved vehicle has been deleted."); } } if (item != deleteVehicle) // if any other button is pressed, restore the delete vehicle button pressed count. { deleteButtonPressedCount = 0; deleteVehicle.Label = ""; } }; #endregion }
/// <summary> /// Saves all personal settings to the client storage. /// </summary> public static void SaveSettings() { Dictionary <string, dynamic> prefs = new Dictionary <string, dynamic>(); if (MainMenu.PlayerOptionsMenu != null) { EveryoneIgnorePlayer = MainMenu.PlayerOptionsMenu.PlayerIsIgnored; prefs.Add("everyoneIgnorePlayer", MainMenu.PlayerOptionsMenu.PlayerIsIgnored); FastRun = MainMenu.PlayerOptionsMenu.PlayerFastRun; prefs.Add("fastRun", MainMenu.PlayerOptionsMenu.PlayerFastRun); FastSwim = MainMenu.PlayerOptionsMenu.PlayerFastSwim; prefs.Add("fastSwim", MainMenu.PlayerOptionsMenu.PlayerFastSwim); NeverWanted = MainMenu.PlayerOptionsMenu.PlayerNeverWanted; prefs.Add("neverWanted", MainMenu.PlayerOptionsMenu.PlayerNeverWanted); NoRagdoll = MainMenu.PlayerOptionsMenu.PlayerNoRagdoll; prefs.Add("noRagdoll", MainMenu.PlayerOptionsMenu.PlayerNoRagdoll); PlayerGodMode = MainMenu.PlayerOptionsMenu.PlayerGodMode; prefs.Add("playerGodMode", MainMenu.PlayerOptionsMenu.PlayerGodMode); SuperJump = MainMenu.PlayerOptionsMenu.PlayerSuperJump; prefs.Add("superJump", MainMenu.PlayerOptionsMenu.PlayerSuperJump); UnlimitedStamina = MainMenu.PlayerOptionsMenu.PlayerStamina; prefs.Add("unlimitedStamina", MainMenu.PlayerOptionsMenu.PlayerStamina); } if (MainMenu.MiscSettingsMenu != null) { MiscDeathNotifications = MainMenu.MiscSettingsMenu.DeathNotifications; prefs.Add("miscDeathNotifications", MainMenu.MiscSettingsMenu.DeathNotifications); MiscJoinQuitNotifications = MainMenu.MiscSettingsMenu.JoinQuitNotifications; prefs.Add("miscJoinQuitNotifications", MainMenu.MiscSettingsMenu.JoinQuitNotifications); MiscSpeedKmh = MainMenu.MiscSettingsMenu.ShowSpeedoKmh; prefs.Add("miscSpeedKmh", MainMenu.MiscSettingsMenu.ShowSpeedoKmh); MiscSpeedMph = MainMenu.MiscSettingsMenu.ShowSpeedoMph; prefs.Add("miscSpeedMph", MainMenu.MiscSettingsMenu.ShowSpeedoMph); MiscShowLocation = MainMenu.MiscSettingsMenu.ShowLocation; prefs.Add("miscShowLocation", MainMenu.MiscSettingsMenu.ShowLocation); MiscLocationBlips = MainMenu.MiscSettingsMenu.ShowLocationBlips; prefs.Add("miscLocationBlips", MainMenu.MiscSettingsMenu.ShowLocationBlips); MiscShowPlayerBlips = MainMenu.MiscSettingsMenu.ShowPlayerBlips; prefs.Add("miscShowPlayerBlips", MainMenu.MiscSettingsMenu.ShowPlayerBlips); } if (MainMenu.VehicleOptionsMenu != null) { VehicleEngineAlwaysOn = MainMenu.VehicleOptionsMenu.VehicleEngineAlwaysOn; prefs.Add("vehicleEngineAlwaysOn", MainMenu.VehicleOptionsMenu.VehicleEngineAlwaysOn); VehicleGodMode = MainMenu.VehicleOptionsMenu.VehicleGodMode; prefs.Add("vehicleGodMode", MainMenu.VehicleOptionsMenu.VehicleGodMode); VehicleNoBikeHelmet = MainMenu.VehicleOptionsMenu.VehicleNoBikeHelemet; prefs.Add("vehicleNoBikeHelmet", MainMenu.VehicleOptionsMenu.VehicleNoBikeHelemet); VehicleNoSiren = MainMenu.VehicleOptionsMenu.VehicleNoSiren; prefs.Add("vehicleNoSiren", MainMenu.VehicleOptionsMenu.VehicleNoSiren); VehicleHighbeamsOnHonk = MainMenu.VehicleOptionsMenu.FlashHighbeamsOnHonk; prefs.Add("vehicleHighbeamsOnHonk", MainMenu.VehicleOptionsMenu.FlashHighbeamsOnHonk); } if (MainMenu.VehicleSpawnerMenu != null) { VehicleSpawnerReplacePrevious = MainMenu.VehicleSpawnerMenu.ReplaceVehicle; prefs.Add("vehicleSpawnerReplacePrevious", MainMenu.VehicleSpawnerMenu.ReplaceVehicle); VehicleSpawnerSpawnInside = MainMenu.VehicleSpawnerMenu.SpawnInVehicle; prefs.Add("vehicleSpawnerSpawnInside", MainMenu.VehicleSpawnerMenu.SpawnInVehicle); } if (MainMenu.VoiceChatSettingsMenu != null) { VoiceChatEnabled = MainMenu.VoiceChatSettingsMenu.EnableVoicechat; prefs.Add("voiceChatEnabled", MainMenu.VoiceChatSettingsMenu.EnableVoicechat); ShowCurrentSpeaker = MainMenu.VoiceChatSettingsMenu.ShowCurrentSpeaker; prefs.Add("voiceChatShowSpeaker", MainMenu.VoiceChatSettingsMenu.ShowCurrentSpeaker); ShowVoiceStatus = MainMenu.VoiceChatSettingsMenu.ShowVoiceStatus; prefs.Add("voiceChatShowVoiceStatus", MainMenu.VoiceChatSettingsMenu.ShowVoiceStatus); VoiceChatProximity = 2000f; // MainMenu.VoiceChatSettingsMenu.currentProximity; prefs.Add("voiceChatProximity", 2000f); // MainMenu.VoiceChatSettingsMenu.currentProximity); } if (MainMenu.WeaponOptionsMenu != null) { WeaponsNoReload = MainMenu.WeaponOptionsMenu.NoReload; prefs.Add("weaponsNoReload", MainMenu.WeaponOptionsMenu.NoReload); WeaponsUnlimitedAmmo = MainMenu.WeaponOptionsMenu.UnlimitedAmmo; prefs.Add("weaponsUnlimitedAmmo", MainMenu.WeaponOptionsMenu.UnlimitedAmmo); } Notify.Success("Your settings have been saved."); MainMenu.Cf.Log($"Saving preferences:\n{JsonConvert.SerializeObject(prefs)}"); }
/// <summary> /// Creates the menu if it doesn't exist yet and sets the event handlers. /// </summary> public void CreateMenu() { menu = new Menu(Game.Player.Name, "weapon loadouts management"); MenuController.AddSubmenu(menu, SavedLoadoutsMenu); MenuController.AddSubmenu(SavedLoadoutsMenu, ManageLoadoutMenu); MenuItem saveLoadout = new MenuItem("Save Loadout", "Save your current weapons into a new loadout slot."); MenuItem savedLoadoutsMenuBtn = new MenuItem("Manage Loadouts", "Manage saved weapon loadouts.") { Label = "→→→" }; MenuCheckboxItem enableDefaultLoadouts = new MenuCheckboxItem("Restore Default Loadout On Respawn", "If you've set a loadout as default loadout, then your loadout will be equipped automatically whenever you (re)spawn.", WeaponLoadoutsSetLoadoutOnRespawn); menu.AddMenuItem(saveLoadout); menu.AddMenuItem(savedLoadoutsMenuBtn); MenuController.BindMenuItem(menu, SavedLoadoutsMenu, savedLoadoutsMenuBtn); if (IsAllowed(Permission.WLEquipOnRespawn)) { menu.AddMenuItem(enableDefaultLoadouts); menu.OnCheckboxChange += (sender, checkbox, index, _checked) => { WeaponLoadoutsSetLoadoutOnRespawn = _checked; }; } void RefreshSavedWeaponsMenu() { int oldCount = SavedLoadoutsMenu.Size; SavedLoadoutsMenu.ClearMenuItems(true); RefreshSavedWeaponsList(); foreach (var sw in SavedWeapons) { MenuItem btn = new MenuItem(sw.Key.Replace("vmenu_string_saved_weapon_loadout_", ""), "Click to manage this loadout.") { Label = "→→→" }; SavedLoadoutsMenu.AddMenuItem(btn); MenuController.BindMenuItem(SavedLoadoutsMenu, ManageLoadoutMenu, btn); } if (oldCount > SavedWeapons.Count) { SavedLoadoutsMenu.RefreshIndex(); } } MenuItem spawnLoadout = new MenuItem("Equip Loadout", "Spawn this saved weapons loadout. This will remove all your current weapons and replace them with this saved slot."); MenuItem renameLoadout = new MenuItem("Rename Loadout", "Rename this saved loadout."); MenuItem cloneLoadout = new MenuItem("Clone Loadout", "Clones this saved loadout to a new slot."); MenuItem setDefaultLoadout = new MenuItem("Set As Default Loadout", "Set this loadout to be your default loadout for whenever you (re)spawn. This will override the 'Restore Weapons' option inside the Misc Settings menu. You can toggle this option in the main Weapon Loadouts menu."); MenuItem replaceLoadout = new MenuItem("~r~Replace Loadout", "~r~This replaces this saved slot with the weapons that you currently have in your inventory. This action can not be undone!"); MenuItem deleteLoadout = new MenuItem("~r~Delete Loadout", "~r~This will delete this saved loadout. This action can not be undone!"); if (IsAllowed(Permission.WLEquip)) { ManageLoadoutMenu.AddMenuItem(spawnLoadout); } ManageLoadoutMenu.AddMenuItem(renameLoadout); ManageLoadoutMenu.AddMenuItem(cloneLoadout); ManageLoadoutMenu.AddMenuItem(setDefaultLoadout); ManageLoadoutMenu.AddMenuItem(replaceLoadout); ManageLoadoutMenu.AddMenuItem(deleteLoadout); // Save the weapons loadout. menu.OnItemSelect += async(sender, item, index) => { if (item == saveLoadout) { string name = await GetUserInput("Enter a save name", 30); if (string.IsNullOrEmpty(name)) { Notify.Error(CommonErrors.InvalidInput); } else { if (SavedWeapons.ContainsKey("vmenu_string_saved_weapon_loadout_" + name)) { Notify.Error(CommonErrors.SaveNameAlreadyExists); } else { if (SaveWeaponLoadout("vmenu_string_saved_weapon_loadout_" + name)) { Log("saveweapons called from menu select (save loadout button)"); Notify.Success($"Your weapons have been saved as ~g~<C>{name}</C>~s~."); } else { Notify.Error(CommonErrors.UnknownError); } } } } }; // manage spawning, renaming, deleting etc. ManageLoadoutMenu.OnItemSelect += async(sender, item, index) => { if (SavedWeapons.ContainsKey(SelectedSavedLoadoutName)) { List <ValidWeapon> weapons = SavedWeapons[SelectedSavedLoadoutName]; if (item == spawnLoadout) // spawn { await SpawnWeaponLoadoutAsync(SelectedSavedLoadoutName, false, true, false); } else if (item == renameLoadout || item == cloneLoadout) // rename or clone { string newName = await GetUserInput("Enter a save name", SelectedSavedLoadoutName.Replace("vmenu_string_saved_weapon_loadout_", ""), 30); if (string.IsNullOrEmpty(newName)) { Notify.Error(CommonErrors.InvalidInput); } else { if (SavedWeapons.ContainsKey("vmenu_string_saved_weapon_loadout_" + newName)) { Notify.Error(CommonErrors.SaveNameAlreadyExists); } else { SetResourceKvp("vmenu_string_saved_weapon_loadout_" + newName, JsonConvert.SerializeObject(weapons)); Notify.Success($"Your weapons loadout has been {(item == renameLoadout ? "renamed" : "cloned")} to ~g~<C>{newName}</C>~s~."); if (item == renameLoadout) { DeleteResourceKvp(SelectedSavedLoadoutName); } ManageLoadoutMenu.GoBack(); } } } else if (item == setDefaultLoadout) // set as default { SetResourceKvp("vmenu_string_default_loadout", SelectedSavedLoadoutName); Notify.Success("This is now your default loadout."); item.LeftIcon = MenuItem.Icon.TICK; } else if (item == replaceLoadout) // replace { if (replaceLoadout.Label == "Are you sure?") { replaceLoadout.Label = ""; SaveWeaponLoadout(SelectedSavedLoadoutName); Log("save weapons called from replace loadout"); Notify.Success("Your saved loadout has been replaced with your current weapons."); } else { replaceLoadout.Label = "Are you sure?"; } } else if (item == deleteLoadout) // delete { if (deleteLoadout.Label == "Are you sure?") { deleteLoadout.Label = ""; DeleteResourceKvp(SelectedSavedLoadoutName); ManageLoadoutMenu.GoBack(); Notify.Success("Your saved loadout has been deleted."); } else { deleteLoadout.Label = "Are you sure?"; } } } }; // Reset the 'are you sure' states. ManageLoadoutMenu.OnMenuClose += (sender) => { deleteLoadout.Label = ""; renameLoadout.Label = ""; }; // Reset the 'are you sure' states. ManageLoadoutMenu.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { deleteLoadout.Label = ""; renameLoadout.Label = ""; }; // Refresh the spawned weapons menu whenever this menu is opened. SavedLoadoutsMenu.OnMenuOpen += (sender) => { RefreshSavedWeaponsMenu(); }; // Set the current saved loadout whenever a loadout is selected. SavedLoadoutsMenu.OnItemSelect += (sender, item, index) => { if (SavedWeapons.ContainsKey("vmenu_string_saved_weapon_loadout_" + item.Text)) { SelectedSavedLoadoutName = "vmenu_string_saved_weapon_loadout_" + item.Text; } else // shouldn't ever happen, but just in case { ManageLoadoutMenu.GoBack(); } }; // Reset the index whenever the ManageLoadout menu is opened. Just to prevent auto selecting the delete option for example. ManageLoadoutMenu.OnMenuOpen += (sender) => { ManageLoadoutMenu.RefreshIndex(); string kvp = GetResourceKvpString("vmenu_string_default_loadout"); if (string.IsNullOrEmpty(kvp) || kvp != SelectedSavedLoadoutName) { setDefaultLoadout.LeftIcon = MenuItem.Icon.NONE; } else { setDefaultLoadout.LeftIcon = MenuItem.Icon.TICK; } }; // Refresh the saved weapons menu. RefreshSavedWeaponsMenu(); }
/// <summary> /// Constructor. /// </summary> public MainMenu() { PlayersList = Players; #region cleanup unused kvps int tmp_kvp_handle = StartFindKvp(""); bool cleanupVersionChecked = false; List <string> tmp_kvp_names = new List <string>(); while (true) { string k = FindKvp(tmp_kvp_handle); if (string.IsNullOrEmpty(k)) { break; } if (k == "vmenu_cleanup_version") { if (GetResourceKvpInt("vmenu_cleanup_version") >= currentCleanupVersion) { cleanupVersionChecked = true; } } tmp_kvp_names.Add(k); } EndFindKvp(tmp_kvp_handle); if (!cleanupVersionChecked) { SetResourceKvpInt("vmenu_cleanup_version", currentCleanupVersion); foreach (string kvp in tmp_kvp_names) { if (currentCleanupVersion == 1 || currentCleanupVersion == 2) { if (!kvp.StartsWith("settings_") && !kvp.StartsWith("vmenu") && !kvp.StartsWith("veh_") && !kvp.StartsWith("ped_") && !kvp.StartsWith("mp_ped_")) { DeleteResourceKvp(kvp); Debug.WriteLine($"[vMenu] [cleanup id: 1] Removed unused (old) KVP: {kvp}."); } } if (currentCleanupVersion == 2) { if (kvp.StartsWith("mp_char")) { DeleteResourceKvp(kvp); Debug.WriteLine($"[vMenu] [cleanup id: 2] Removed unused (old) KVP: {kvp}."); } } } Debug.WriteLine("[vMenu] Cleanup of old unused KVP items completed."); } #endregion #region loading language LanguageData = ConfigManager.GetLanguages(); string[] LanguageType = { "american", "french", "german", "italian", "spanish", "portuguese", "polish", "russian", "korean", "chinesetraditional", "japanese", "mexican", "chinesesimplified" }; string LanguageName = ""; try { LanguageName = LanguageType[API.GetCurrentLanguage()]; if (LanguageData.TryGetValue(LanguageName, out CurrentLanguage)) { Debug.WriteLine($"[vMenu] Successful load the language: {LanguageName}."); } } catch (Exception ex) { Debug.WriteLine("[vMenu] Wtf? Is Rockstar added new language support for GTAV? That's impossable."); } LM = new LanguageManager(); #endregion if (EnableExperimentalFeatures || DebugMode) { RegisterCommand("testped", new Action <dynamic, List <dynamic>, string>((dynamic source, List <dynamic> args, string rawCommand) => { PedHeadBlendData data = Game.PlayerPed.GetHeadBlendData(); Debug.WriteLine(JsonConvert.SerializeObject(data, Formatting.Indented)); }), false); RegisterCommand("tattoo", new Action <dynamic, List <dynamic>, string>((dynamic source, List <dynamic> args, string rawCommand) => { if (args != null && args[0] != null && args[1] != null) { Debug.WriteLine(args[0].ToString() + " " + args[1].ToString()); TattooCollectionData d = Game.GetTattooCollectionData(int.Parse(args[0].ToString()), int.Parse(args[1].ToString())); Debug.WriteLine("check"); Debug.Write(JsonConvert.SerializeObject(d, Formatting.Indented) + "\n"); } }), false); } RegisterCommand("vmenuclient", new Action <dynamic, List <dynamic>, string>((dynamic source, List <dynamic> args, string rawCommand) => { if (args != null) { if (args.Count > 0) { if (args[0].ToString().ToLower() == "debug") { DebugMode = !DebugMode; Notify.Custom($"Debug mode is now set to: {DebugMode}."); // Set discord rich precense once, allowing it to be overruled by other resources once those load. if (DebugMode) { SetRichPresence($"Debugging vMenu {Version}!"); } else { SetRichPresence($"Enjoying FiveM!"); } } else if (args[0].ToString().ToLower() == "dumplang") { Notify.Info("Uploading dumped data to server..."); Debug.Write(JsonConvert.SerializeObject(DumpedData, Formatting.Indented)); TriggerServerEvent("vMenu:DumpLanguages", JsonConvert.SerializeObject(DumpedData, Formatting.Indented)); Notify.Success("Upload finished!"); } else if (args[0].ToString().ToLower() == "gc") { GC.Collect(); Debug.Write("Cleared memory.\n"); } else if (args[0].ToString().ToLower() == "dump") { Notify.Info("A full config dump will be made to the console. Check the log file. This can cause lag!"); Debug.WriteLine("\n\n\n########################### vMenu ###########################"); Debug.WriteLine($"Running vMenu Version: {Version}, Experimental features: {EnableExperimentalFeatures}, Debug mode: {DebugMode}."); Debug.WriteLine("\nDumping a list of all KVPs:"); int handle = StartFindKvp(""); List <string> names = new List <string>(); while (true) { string k = FindKvp(handle); if (string.IsNullOrEmpty(k)) { break; } //if (!k.StartsWith("settings_") && !k.StartsWith("vmenu") && !k.StartsWith("veh_") && !k.StartsWith("ped_") && !k.StartsWith("mp_ped_")) //{ // DeleteResourceKvp(k); //} names.Add(k); } EndFindKvp(handle); Dictionary <string, dynamic> kvps = new Dictionary <string, dynamic>(); foreach (var kvp in names) { int type = 0; // 0 = string, 1 = float, 2 = int. if (kvp.StartsWith("settings_")) { if (kvp == "settings_voiceChatProximity") // float { type = 1; } else if (kvp == "settings_clothingAnimationType") // int { type = 2; } else if (kvp == "settings_miscLastTimeCycleModifierIndex") // int { type = 2; } else if (kvp == "settings_miscLastTimeCycleModifierStrength") // int { type = 2; } } else if (kvp == "vmenu_cleanup_version") // int { type = 2; } switch (type) { case 0: var s = GetResourceKvpString(kvp); if (s.StartsWith("{") || s.StartsWith("[")) { kvps.Add(kvp, JsonConvert.DeserializeObject(s)); } else { kvps.Add(kvp, GetResourceKvpString(kvp)); } break; case 1: kvps.Add(kvp, GetResourceKvpFloat(kvp)); break; case 2: kvps.Add(kvp, GetResourceKvpInt(kvp)); break; } } Debug.WriteLine(@JsonConvert.SerializeObject(kvps, Formatting.None) + "\n"); Debug.WriteLine("\n\nDumping a list of allowed permissions:"); Debug.WriteLine(@JsonConvert.SerializeObject(Permissions, Formatting.None)); Debug.WriteLine("\n\nDumping vmenu server configuration settings:"); var settings = new Dictionary <string, string>(); foreach (var a in Enum.GetValues(typeof(Setting))) { settings.Add(a.ToString(), GetSettingsString((Setting)a)); } Debug.WriteLine(@JsonConvert.SerializeObject(settings, Formatting.None)); Debug.WriteLine("\nEnd of vMenu dump!"); Debug.WriteLine("\n########################### vMenu ###########################"); } } else { Notify.Custom($"vMenu is currently running version: {Version}."); } } }), false); // Set discord rich precense once, allowing it to be overruled by other resources once those load. if (DebugMode) { SetRichPresence($"Debugging vMenu {Version}!"); } if (GetCurrentResourceName() != "vMenu") { 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"); try { throw InvalidNameException; } catch (Exception e) { Log(e.Message); } TriggerEvent("chatMessage", "^3IMPORTANT: vMenu IS NOT SETUP CORRECTLY. PLEASE CHECK THE SERVER LOG FOR MORE INFO."); MenuController.MainMenu = null; MenuController.DontOpenAnyMenu = true; MenuController.DisableMenuButtons = true; } else { Tick += OnTick; } try { SetClockDate(DateTime.Now.Day, DateTime.Now.Month, DateTime.Now.Year); } catch (InvalidTimeZoneException timeEx) { Debug.WriteLine($"[vMenu] [Error] Could not set the in-game day, month and year because of an invalid timezone(?)."); Debug.WriteLine($"[vMenu] [Error] InvalidTimeZoneException: {timeEx.Message}"); Debug.WriteLine($"[vMenu] [Error] vMenu will continue to work normally."); } }