/// <summary> /// Process the select & go back/cancel buttons. /// </summary> /// <returns></returns> private async Task ProcessMainButtons() { UIMenu currentMenu = Cf.GetOpenMenu(); if (currentMenu != null) { // Select / Enter if (Game.IsDisabledControlJustReleased(0, Control.FrontendAccept) || Game.IsControlJustReleased(0, Control.FrontendAccept)) { currentMenu.SelectItem(); if (DebugMode) { Subtitle.Custom("select"); } } // Cancel / Go Back else if (Game.IsDisabledControlJustReleased(0, Control.PhoneCancel)) { // Wait for the next frame to make sure the "cinematic camera" button doesn't get "re-enabled" before the menu gets closed. await Delay(0); currentMenu.GoBack(); if (DebugMode) { Subtitle.Custom("cancel"); } } } else { await Delay(0); } }
/// <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 }
private void CreateMenu() { currentChannel = channels[0]; if (cf.IsAllowed(Permission.VCStaffChannel)) { channels.Add("Staff Channel"); } // Create the menu. menu = new UIMenu("BigFam Crew", "Voice Chat Settings", true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; UIMenuCheckboxItem voiceChatEnabled = new UIMenuCheckboxItem("Enable Voice Chat", EnableVoicechat, "Enable or disable voice chat."); UIMenuCheckboxItem showCurrentSpeaker = new UIMenuCheckboxItem("Show Current Speaker", ShowCurrentSpeaker, "Shows who is currently talking."); UIMenuCheckboxItem showVoiceStatus = new UIMenuCheckboxItem("Show Microphone Status", ShowVoiceStatus, "Shows whether your microphone is open or muted."); List <dynamic> proximity = new List <dynamic>() { /*"5 m", * "10 m", * "15 m", * "20 m", * "100 m", * "300 m", * "1 km",*/ "2 km", //"Global", }; UIMenuListItem voiceChatProximity = new UIMenuListItem("Voice Chat Proximity", proximity, proximityRange.IndexOf(currentProximity), "Set the voice chat receiving proximity in meters."); UIMenuListItem voiceChatChannel = new UIMenuListItem("Voice Chat Channel", channels, channels.IndexOf(currentChannel), "Set the voice chat channel."); if (cf.IsAllowed(Permission.VCEnable)) { menu.AddItem(voiceChatEnabled); // Nested permissions because without voice chat enabled, you wouldn't be able to use these settings anyway. if (cf.IsAllowed(Permission.VCShowSpeaker)) { menu.AddItem(showCurrentSpeaker); } menu.AddItem(voiceChatProximity); menu.AddItem(voiceChatChannel); menu.AddItem(showVoiceStatus); } menu.OnCheckboxChange += (sender, item, _checked) => { if (item == voiceChatEnabled) { EnableVoicechat = _checked; } else if (item == showCurrentSpeaker) { ShowCurrentSpeaker = _checked; } else if (item == showVoiceStatus) { ShowVoiceStatus = _checked; } }; menu.OnListChange += (sender, item, index) => { if (item == voiceChatProximity) { currentProximity = proximityRange[index]; Subtitle.Custom($"New voice chat proximity set to: ~b~{proximity[index]}~s~."); } else if (item == voiceChatChannel) { currentChannel = channels[index]; Subtitle.Custom($"New voice chat channel set to: ~b~{channels[index]}~s~."); } }; }
/// <summary> /// Process left/right/up/down buttons (also holding down buttons will speed up after 3 iterations) /// </summary> /// <returns></returns> private async Task ProcessDirectionalButtons() { // Get the currently open menu. UIMenu currentMenu = Cf.GetOpenMenu(); // If it exists. if (currentMenu != null) { // Check if the Go Up controls are pressed. if (Game.IsDisabledControlJustPressed(0, Control.Phone) || Game.IsControlJustPressed(0, Control.SniperZoomInSecondary)) { // Update the currently selected item to the new one. currentMenu.GoUp(); currentMenu.GoUpOverflow(); // Get the current game time. var time = GetGameTimer(); var times = 0; var delay = 200; // Do the following as long as the controls are being pressed. while (Game.IsDisabledControlPressed(0, Control.Phone) && Cf.GetOpenMenu() != null) { // Update the current menu. currentMenu = Cf.GetOpenMenu(); // Check if the game time has changed by "delay" amount. if (GetGameTimer() - time > delay) { // Increment the "changed indexes" counter times++; // If the controls are still being held down after moving 3 indexes, reduce the delay between index changes. if (times > 2) { delay = 150; } // Update the currently selected item to the new one. currentMenu.GoUp(); currentMenu.GoUpOverflow(); // Reset the time to the current game timer. time = GetGameTimer(); } // Wait for the next game tick. await Delay(0); } // If debugging is enabled, a subtitle will be shown when this control is pressed. if (DebugMode) { Subtitle.Custom("up"); } } // Check if the Go Left controls are pressed. else if (Game.IsDisabledControlJustPressed(0, Control.PhoneLeft)) { currentMenu.GoLeft(); var time = GetGameTimer(); var times = 0; var delay = 200; while (Game.IsDisabledControlPressed(0, Control.PhoneLeft) && Cf.GetOpenMenu() != null) { currentMenu = Cf.GetOpenMenu(); if (GetGameTimer() - time > delay) { times++; if (times > 2) { delay = 150; } currentMenu.GoLeft(); time = GetGameTimer(); } await Delay(0); } if (DebugMode) { Subtitle.Custom("left"); } } // Check if the Go Right controls are pressed. else if (Game.IsDisabledControlJustPressed(0, Control.PhoneRight)) { currentMenu.GoRight(); var time = GetGameTimer(); var times = 0; var delay = 200; while (Game.IsDisabledControlPressed(0, Control.PhoneRight) && Cf.GetOpenMenu() != null) { currentMenu = Cf.GetOpenMenu(); if (GetGameTimer() - time > delay) { times++; if (times > 2) { delay = 150; } currentMenu.GoRight(); time = GetGameTimer(); } await Delay(0); } if (DebugMode) { Subtitle.Custom("right"); } } // Check if the Go Down controls are pressed. else if (Game.IsDisabledControlJustPressed(0, Control.PhoneDown) || Game.IsControlJustPressed(0, Control.SniperZoomOutSecondary)) { currentMenu.GoDown(); currentMenu.GoDownOverflow(); var time = GetGameTimer(); var times = 0; var delay = 200; while (Game.IsDisabledControlPressed(0, Control.PhoneDown) && Cf.GetOpenMenu() != null) { currentMenu = Cf.GetOpenMenu(); if (GetGameTimer() - time > delay) { times++; if (times > 2) { delay = 150; } currentMenu.GoDown(); currentMenu.GoDownOverflow(); time = GetGameTimer(); } await Delay(0); } if (DebugMode) { Subtitle.Custom("down"); } } } }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { #region create main weapon options menu and add items // Create the menu. menu = new Menu("YDDY:RP", "Оружие"); MenuItem getAllWeapons = new MenuItem("Get All Weapons", "Get all weapons."); MenuItem removeAllWeapons = new MenuItem("Убрать все оружие", ""); MenuCheckboxItem unlimitedAmmo = new MenuCheckboxItem("Unlimited Ammo", "Unlimited ammonition supply.", UnlimitedAmmo); MenuCheckboxItem noReload = new MenuCheckboxItem("No Reload", "Never reload.", NoReload); MenuItem setAmmo = new MenuItem("Set All Ammo Count", "Set the amount of ammo in all your weapons."); MenuItem refillMaxAmmo = new MenuItem("Refill All Ammo", "Give all your weapons max ammo."); MenuItem spawnByName = new MenuItem("Spawn Weapon By Name", "Enter a weapon mode name to spawn."); // Add items based on permissions if (IsAllowed(Permission.WPGetAll)) { menu.AddMenuItem(getAllWeapons); } if (IsAllowed(Permission.WPRemoveAll)) { menu.AddMenuItem(removeAllWeapons); } if (IsAllowed(Permission.WPUnlimitedAmmo)) { menu.AddMenuItem(unlimitedAmmo); } if (IsAllowed(Permission.WPNoReload)) { menu.AddMenuItem(noReload); } if (IsAllowed(Permission.WPSetAllAmmo)) { menu.AddMenuItem(setAmmo); menu.AddMenuItem(refillMaxAmmo); } if (IsAllowed(Permission.WPSpawnByName)) { menu.AddMenuItem(spawnByName); } #endregion #region addonweapons submenu MenuItem addonWeaponsBtn = new MenuItem("Аддоны", ""); Menu addonWeaponsMenu = new Menu("Аддоны", "Меню аддонов"); menu.AddMenuItem(addonWeaponsBtn); #region manage creating and accessing addon weapons menu if (IsAllowed(Permission.WPSpawn) && AddonWeapons != null && AddonWeapons.Count > 0) { MenuController.BindMenuItem(menu, addonWeaponsMenu, addonWeaponsBtn); foreach (KeyValuePair <string, uint> weapon in AddonWeapons) { string name = weapon.Key.ToString(); uint model = weapon.Value; var item = new MenuItem(name, $"Click to add/remove this weapon ({name}) to/from your inventory."); addonWeaponsMenu.AddMenuItem(item); if (!IsWeaponValid(model)) { item.Enabled = false; item.LeftIcon = MenuItem.Icon.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(Game.PlayerPed.Handle, weapon.Value, false)) { RemoveWeaponFromPed(Game.PlayerPed.Handle, weapon.Value); } else { var maxAmmo = 200; GetMaxAmmo(Game.PlayerPed.Handle, weapon.Value, ref maxAmmo); GiveWeaponToPed(Game.PlayerPed.Handle, weapon.Value, maxAmmo, false, true); } }; addonWeaponsBtn.Label = "→→→"; } else { addonWeaponsBtn.LeftIcon = MenuItem.Icon.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(); #endregion #region parachute options menu if (IsAllowed(Permission.WPParachute)) { // main parachute options menu setup Menu parachuteMenu = new Menu("Парашюты", "Опции парашютов"); MenuItem parachuteBtn = new MenuItem("Парашюты", "") { Label = "→→→" }; MenuController.AddSubmenu(menu, parachuteMenu); menu.AddMenuItem(parachuteBtn); MenuController.BindMenuItem(menu, parachuteMenu, parachuteBtn); List <string> chutes = new List <string>() { GetLabelText("PM_TINT0"), GetLabelText("PM_TINT1"), GetLabelText("PM_TINT2"), GetLabelText("PM_TINT3"), GetLabelText("PM_TINT4"), GetLabelText("PM_TINT5"), GetLabelText("PM_TINT6"), GetLabelText("PM_TINT7"), // broken in FiveM for some weird reason: GetLabelText("PS_CAN_0"), GetLabelText("PS_CAN_1"), GetLabelText("PS_CAN_2"), GetLabelText("PS_CAN_3"), GetLabelText("PS_CAN_4"), GetLabelText("PS_CAN_5") }; List <string> chuteDescriptions = new List <string>() { GetLabelText("PD_TINT0"), GetLabelText("PD_TINT1"), GetLabelText("PD_TINT2"), GetLabelText("PD_TINT3"), GetLabelText("PD_TINT4"), GetLabelText("PD_TINT5"), GetLabelText("PD_TINT6"), GetLabelText("PD_TINT7"), // broken in FiveM for some weird reason: GetLabelText("PSD_CAN_0") + " ~r~For some reason this one doesn't seem to work in FiveM.", GetLabelText("PSD_CAN_1") + " ~r~For some reason this one doesn't seem to work in FiveM.", GetLabelText("PSD_CAN_2") + " ~r~For some reason this one doesn't seem to work in FiveM.", GetLabelText("PSD_CAN_3") + " ~r~For some reason this one doesn't seem to work in FiveM.", GetLabelText("PSD_CAN_4") + " ~r~For some reason this one doesn't seem to work in FiveM.", GetLabelText("PSD_CAN_5") + " ~r~For some reason this one doesn't seem to work in FiveM." }; MenuItem togglePrimary = new MenuItem("Основной парашют", ""); MenuItem toggleReserve = new MenuItem("Резервный парашют", ""); MenuListItem primaryChutes = new MenuListItem("Цвет основного", chutes, 0, $"Основной парашют: {chuteDescriptions[0]}"); MenuListItem secondaryChutes = new MenuListItem("Цвет резервного", chutes, 0, $"Reserve chute: {chuteDescriptions[0]}"); MenuCheckboxItem unlimitedParachutes = new MenuCheckboxItem("Бесконечные парашюты", "", UnlimitedParachutes); MenuCheckboxItem autoEquipParachutes = new MenuCheckboxItem("Автоматические парашюты", "Получите бесплатный парашют в самолете.", AutoEquipChute); // smoke color list List <string> smokeColorsList = new List <string>() { GetLabelText("PM_TINT8"), // no smoke GetLabelText("PM_TINT9"), // red GetLabelText("PM_TINT10"), // orange GetLabelText("PM_TINT11"), // yellow GetLabelText("PM_TINT12"), // blue GetLabelText("PM_TINT13"), // black }; List <int[]> colors = new List <int[]>() { new int[3] { 255, 255, 255 }, new int[3] { 255, 0, 0 }, new int[3] { 255, 165, 0 }, new int[3] { 255, 255, 0 }, new int[3] { 0, 0, 255 }, new int[3] { 20, 20, 20 }, }; MenuListItem smokeColors = new MenuListItem("Трейл", smokeColorsList, 0, ""); parachuteMenu.AddMenuItem(togglePrimary); parachuteMenu.AddMenuItem(toggleReserve); parachuteMenu.AddMenuItem(autoEquipParachutes); parachuteMenu.AddMenuItem(unlimitedParachutes); parachuteMenu.AddMenuItem(smokeColors); parachuteMenu.AddMenuItem(primaryChutes); parachuteMenu.AddMenuItem(secondaryChutes); parachuteMenu.OnItemSelect += (sender, item, index) => { if (item == togglePrimary) { if (HasPedGotWeapon(Game.PlayerPed.Handle, (uint)GetHashKey("gadget_parachute"), false)) { Subtitle.Custom("Primary parachute removed."); RemoveWeaponFromPed(Game.PlayerPed.Handle, (uint)GetHashKey("gadget_parachute")); } else { Subtitle.Custom("Primary parachute added."); GiveWeaponToPed(Game.PlayerPed.Handle, (uint)GetHashKey("gadget_parachute"), 0, false, false); } } else if (item == toggleReserve) { SetPlayerHasReserveParachute(Game.Player.Handle); Subtitle.Custom("Reserve parachute has been added."); } }; parachuteMenu.OnCheckboxChange += (sender, item, index, _checked) => { if (item == unlimitedParachutes) { UnlimitedParachutes = _checked; } else if (item == autoEquipParachutes) { AutoEquipChute = _checked; } }; bool switching = false; async void IndexChangedEventHandler(Menu sender, MenuListItem item, int oldIndex, int newIndex, int itemIndex) { if (item == smokeColors && oldIndex == -1) { if (!switching) { switching = true; SetPlayerCanLeaveParachuteSmokeTrail(Game.Player.Handle, false); await Delay(4000); int[] color = colors[newIndex]; SetPlayerParachuteSmokeTrailColor(Game.Player.Handle, color[0], color[1], color[2]); SetPlayerCanLeaveParachuteSmokeTrail(Game.Player.Handle, newIndex != 0); switching = false; } } else if (item == primaryChutes) { item.Description = $"Основной парашют: {chuteDescriptions[newIndex]}"; SetPlayerParachuteTintIndex(Game.Player.Handle, newIndex); } else if (item == secondaryChutes) { item.Description = $"Резервный парашют: {chuteDescriptions[newIndex]}"; SetPlayerReserveParachuteTintIndex(Game.Player.Handle, newIndex); } } parachuteMenu.OnListItemSelect += (sender, item, index, itemIndex) => IndexChangedEventHandler(sender, item, -1, index, itemIndex); parachuteMenu.OnListIndexChange += IndexChangedEventHandler; } #endregion #region Create Weapon Category Submenus MenuItem spacer = GetSpacerMenuItem("↓ Категории ↓"); menu.AddMenuItem(spacer); Menu handGuns = new Menu("Оружие", "Пистолеты"); MenuItem handGunsBtn = new MenuItem("Пистолеты"); Menu rifles = new Menu("Оружие", "Винтовки"); MenuItem riflesBtn = new MenuItem("Винтовки"); Menu shotguns = new Menu("Оружие", "Дробовики"); MenuItem shotgunsBtn = new MenuItem("Дробовики"); Menu smgs = new Menu("Оружие", "Пистолеты-пулеметы"); MenuItem smgsBtn = new MenuItem("Пистолеты-пулеметы"); Menu throwables = new Menu("Оружие", "Кидаемое"); MenuItem throwablesBtn = new MenuItem("Кидаемое"); Menu melee = new Menu("Оружие", "Ближнего боя"); MenuItem meleeBtn = new MenuItem("Ближнего боя"); Menu heavy = new Menu("Оружие", "Тяжелое"); MenuItem heavyBtn = new MenuItem("Тяжелое"); Menu snipers = new Menu("Оружие", "Снайперские винтовки"); MenuItem snipersBtn = new MenuItem("Снайперские винтовки"); MenuController.AddSubmenu(menu, handGuns); MenuController.AddSubmenu(menu, rifles); MenuController.AddSubmenu(menu, shotguns); MenuController.AddSubmenu(menu, smgs); MenuController.AddSubmenu(menu, throwables); MenuController.AddSubmenu(menu, melee); MenuController.AddSubmenu(menu, heavy); MenuController.AddSubmenu(menu, snipers); #endregion #region Setup weapon category buttons and submenus. handGunsBtn.Label = "→→→"; menu.AddMenuItem(handGunsBtn); MenuController.BindMenuItem(menu, handGuns, handGunsBtn); riflesBtn.Label = "→→→"; menu.AddMenuItem(riflesBtn); MenuController.BindMenuItem(menu, rifles, riflesBtn); shotgunsBtn.Label = "→→→"; menu.AddMenuItem(shotgunsBtn); MenuController.BindMenuItem(menu, shotguns, shotgunsBtn); smgsBtn.Label = "→→→"; menu.AddMenuItem(smgsBtn); MenuController.BindMenuItem(menu, smgs, smgsBtn); throwablesBtn.Label = "→→→"; menu.AddMenuItem(throwablesBtn); MenuController.BindMenuItem(menu, throwables, throwablesBtn); meleeBtn.Label = "→→→"; menu.AddMenuItem(meleeBtn); MenuController.BindMenuItem(menu, melee, meleeBtn); heavyBtn.Label = "→→→"; menu.AddMenuItem(heavyBtn); MenuController.BindMenuItem(menu, heavy, heavyBtn); snipersBtn.Label = "→→→"; menu.AddMenuItem(snipersBtn); MenuController.BindMenuItem(menu, snipers, snipersBtn); #endregion #region Loop through all weapons, create menus for them and add all menu items and handle events. foreach (ValidWeapon weapon in ValidWeapons.WeaponList) { uint cat = (uint)GetWeapontypeGroup(weapon.Hash); if (!string.IsNullOrEmpty(weapon.Name) && (IsAllowed(weapon.Perm) || IsAllowed(Permission.WPGetAll))) { //Log($"[DEBUG LOG] [WEAPON-BUG] {weapon.Name} - {weapon.Perm} = {IsAllowed(weapon.Perm)} & All = {IsAllowed(Permission.WPGetAll)}"); #region Create menu for this weapon and add buttons Menu weaponMenu = new Menu("Опции", weapon.Name); MenuItem weaponItem = new MenuItem(weapon.Name, $"Open the options for ~y~{weapon.Name.ToString()}~s~.") { Label = "→→→", LeftIcon = MenuItem.Icon.GUN }; weaponInfo.Add(weaponMenu, weapon); MenuItem getOrRemoveWeapon = new MenuItem("Взять/Убрать", "") { LeftIcon = MenuItem.Icon.GUN }; weaponMenu.AddMenuItem(getOrRemoveWeapon); if (!IsAllowed(Permission.WPSpawn)) { getOrRemoveWeapon.Enabled = false; getOrRemoveWeapon.Description = "You do not have permission to use this option."; getOrRemoveWeapon.LeftIcon = MenuItem.Icon.LOCK; } MenuItem fillAmmo = new MenuItem("Пополнить боезапас", "") { LeftIcon = MenuItem.Icon.AMMO }; weaponMenu.AddMenuItem(fillAmmo); List <string> tints = new List <string>(); 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); } } MenuListItem weaponTints = new MenuListItem("Раскраски", tints, 0, ""); weaponMenu.AddMenuItem(weaponTints); #endregion #region Handle weapon specific list changes weaponMenu.OnListIndexChange += (sender, item, oldIndex, newIndex, itemIndex) => { if (item == weaponTints) { if (HasPedGotWeapon(Game.PlayerPed.Handle, weaponInfo[sender].Hash, false)) { SetPedWeaponTintIndex(Game.PlayerPed.Handle, weaponInfo[sender].Hash, newIndex); } else { Notify.Error("You need to get the weapon first!"); } } }; #endregion #region Handle weapon specific button presses weaponMenu.OnItemSelect += (sender, item, index) => { var info = weaponInfo[sender]; uint hash = info.Hash; SetCurrentPedWeapon(Game.PlayerPed.Handle, hash, true); if (item == getOrRemoveWeapon) { if (HasPedGotWeapon(Game.PlayerPed.Handle, hash, false)) { RemoveWeaponFromPed(Game.PlayerPed.Handle, hash); Subtitle.Custom("Weapon removed."); } else { var ammo = 255; GetMaxAmmo(Game.PlayerPed.Handle, hash, ref ammo); GiveWeaponToPed(Game.PlayerPed.Handle, hash, ammo, false, true); Subtitle.Custom("Weapon added."); } } else if (item == fillAmmo) { if (HasPedGotWeapon(Game.PlayerPed.Handle, hash, false)) { var ammo = 900; GetMaxAmmo(Game.PlayerPed.Handle, hash, ref ammo); SetPedAmmo(Game.PlayerPed.Handle, 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) { //Log($"{weapon.Name} : {comp.Key}"); MenuItem compItem = new MenuItem(comp.Key, "Click to equip or remove this component."); weaponComponents.Add(compItem, comp.Key); weaponMenu.AddMenuItem(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(Game.PlayerPed.Handle, Weapon.Hash, false)) { SetCurrentPedWeapon(Game.PlayerPed.Handle, Weapon.Hash, true); if (HasPedGotWeaponComponent(Game.PlayerPed.Handle, Weapon.Hash, componentHash)) { RemoveWeaponComponentFromPed(Game.PlayerPed.Handle, Weapon.Hash, componentHash); Subtitle.Custom("Component removed."); } else { int ammo = GetAmmoInPedWeapon(Game.PlayerPed.Handle, Weapon.Hash); int clipAmmo = GetMaxAmmoInClip(Game.PlayerPed.Handle, Weapon.Hash, false); GetAmmoInClip(Game.PlayerPed.Handle, Weapon.Hash, ref clipAmmo); GiveWeaponComponentToPed(Game.PlayerPed.Handle, Weapon.Hash, componentHash); SetAmmoInClip(Game.PlayerPed.Handle, Weapon.Hash, clipAmmo); SetPedAmmo(Game.PlayerPed.Handle, Weapon.Hash, ammo); 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(); if (cat == 970310034) // 970310034 rifles { MenuController.AddSubmenu(rifles, weaponMenu); MenuController.BindMenuItem(rifles, weaponMenu, weaponItem); rifles.AddMenuItem(weaponItem); } else if (cat == 416676503 || cat == 690389602) // 416676503 hand guns // 690389602 stun gun { MenuController.AddSubmenu(handGuns, weaponMenu); MenuController.BindMenuItem(handGuns, weaponMenu, weaponItem); handGuns.AddMenuItem(weaponItem); } else if (cat == 860033945) // 860033945 shotguns { MenuController.AddSubmenu(shotguns, weaponMenu); MenuController.BindMenuItem(shotguns, weaponMenu, weaponItem); shotguns.AddMenuItem(weaponItem); } else if (cat == 3337201093 || cat == 1159398588) // 3337201093 sub machine guns // 1159398588 light machine guns { MenuController.AddSubmenu(smgs, weaponMenu); MenuController.BindMenuItem(smgs, weaponMenu, weaponItem); smgs.AddMenuItem(weaponItem); } else if (cat == 1548507267 || cat == 4257178988 || cat == 1595662460) // 1548507267 throwables // 4257178988 fire extinghuiser // jerry can { MenuController.AddSubmenu(throwables, weaponMenu); MenuController.BindMenuItem(throwables, weaponMenu, weaponItem); throwables.AddMenuItem(weaponItem); } else if (cat == 3566412244 || cat == 2685387236) // 3566412244 melee weapons // 2685387236 knuckle duster { MenuController.AddSubmenu(melee, weaponMenu); MenuController.BindMenuItem(melee, weaponMenu, weaponItem); melee.AddMenuItem(weaponItem); } else if (cat == 2725924767) // 2725924767 heavy weapons { MenuController.AddSubmenu(heavy, weaponMenu); MenuController.BindMenuItem(heavy, weaponMenu, weaponItem); heavy.AddMenuItem(weaponItem); } else if (cat == 3082541095) // 3082541095 sniper rifles { MenuController.AddSubmenu(snipers, weaponMenu); MenuController.BindMenuItem(snipers, weaponMenu, weaponItem); snipers.AddMenuItem(weaponItem); } } } #endregion #region Disable submenus if no weapons in that category are allowed. if (handGuns.Size == 0) { handGunsBtn.LeftIcon = MenuItem.Icon.LOCK; handGunsBtn.Description = "The server owner removed the permissions for all weapons in this category."; handGunsBtn.Enabled = false; } if (rifles.Size == 0) { riflesBtn.LeftIcon = MenuItem.Icon.LOCK; riflesBtn.Description = "The server owner removed the permissions for all weapons in this category."; riflesBtn.Enabled = false; } if (shotguns.Size == 0) { shotgunsBtn.LeftIcon = MenuItem.Icon.LOCK; shotgunsBtn.Description = "The server owner removed the permissions for all weapons in this category."; shotgunsBtn.Enabled = false; } if (smgs.Size == 0) { smgsBtn.LeftIcon = MenuItem.Icon.LOCK; smgsBtn.Description = "The server owner removed the permissions for all weapons in this category."; smgsBtn.Enabled = false; } if (throwables.Size == 0) { throwablesBtn.LeftIcon = MenuItem.Icon.LOCK; throwablesBtn.Description = "The server owner removed the permissions for all weapons in this category."; throwablesBtn.Enabled = false; } if (melee.Size == 0) { meleeBtn.LeftIcon = MenuItem.Icon.LOCK; meleeBtn.Description = "The server owner removed the permissions for all weapons in this category."; meleeBtn.Enabled = false; } if (heavy.Size == 0) { heavyBtn.LeftIcon = MenuItem.Icon.LOCK; heavyBtn.Description = "The server owner removed the permissions for all weapons in this category."; heavyBtn.Enabled = false; } if (snipers.Size == 0) { snipersBtn.LeftIcon = MenuItem.Icon.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(Game.PlayerPed.Handle); if (item == getAllWeapons) { foreach (ValidWeapon vw in ValidWeapons.WeaponList) { if (IsAllowed(vw.Perm)) { GiveWeaponToPed(Game.PlayerPed.Handle, vw.Hash, vw.GetMaxAmmo, false, true); int ammoInClip = GetMaxAmmoInClip(Game.PlayerPed.Handle, vw.Hash, false); SetAmmoInClip(Game.PlayerPed.Handle, vw.Hash, ammoInClip); int ammo = 0; GetMaxAmmo(Game.PlayerPed.Handle, vw.Hash, ref ammo); SetPedAmmo(Game.PlayerPed.Handle, vw.Hash, ammo); } } SetCurrentPedWeapon(Game.PlayerPed.Handle, (uint)GetHashKey("weapon_unarmed"), true); } else if (item == removeAllWeapons) { ped.Weapons.RemoveAll(); } else if (item == setAmmo) { SetAllWeaponsAmmo(); } else if (item == refillMaxAmmo) { foreach (ValidWeapon vw in ValidWeapons.WeaponList) { if (HasPedGotWeapon(Game.PlayerPed.Handle, vw.Hash, false)) { int ammoInClip = GetMaxAmmoInClip(Game.PlayerPed.Handle, vw.Hash, false); SetAmmoInClip(Game.PlayerPed.Handle, vw.Hash, ammoInClip); int ammo = 0; GetMaxAmmo(Game.PlayerPed.Handle, vw.Hash, ref ammo); SetPedAmmo(Game.PlayerPed.Handle, vw.Hash, ammo); } } } else if (item == spawnByName) { SpawnCustomWeapon(); } }; #endregion #region Handle checkbox changes menu.OnCheckboxChange += (sender, item, index, _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 }
private void CreateMenu() { currentChannel = channels[0]; if (IsAllowed(Permission.VCStaffChannel)) { channels.Add("Staff Channel"); } // Create the menu. menu = new Menu(Game.Player.Name, "Voice Chat Settings"); MenuCheckboxItem voiceChatEnabled = new MenuCheckboxItem("Enable Voice Chat", "Enable or disable voice chat.", EnableVoicechat); MenuCheckboxItem showCurrentSpeaker = new MenuCheckboxItem("Show Current Speaker", "Shows who is currently talking.", ShowCurrentSpeaker); MenuCheckboxItem showVoiceStatus = new MenuCheckboxItem("Show Microphone Status", "Shows whether your microphone is open or muted.", ShowVoiceStatus); List <string> proximity = new List <string>() { "5 m", "10 m", "15 m", "20 m", "100 m", "300 m", "1 km", "2 km", "Global", }; MenuListItem voiceChatProximity = new MenuListItem("Voice Chat Proximity", proximity, proximityRange.IndexOf(currentProximity), "Set the voice chat receiving proximity in meters."); MenuListItem voiceChatChannel = new MenuListItem("Voice Chat Channel", channels, channels.IndexOf(currentChannel), "Set the voice chat channel."); if (IsAllowed(Permission.VCEnable)) { menu.AddMenuItem(voiceChatEnabled); // Nested permissions because without voice chat enabled, you wouldn't be able to use these settings anyway. if (IsAllowed(Permission.VCShowSpeaker)) { menu.AddMenuItem(showCurrentSpeaker); } menu.AddMenuItem(voiceChatProximity); menu.AddMenuItem(voiceChatChannel); menu.AddMenuItem(showVoiceStatus); } menu.OnCheckboxChange += (sender, item, index, _checked) => { if (item == voiceChatEnabled) { EnableVoicechat = _checked; } else if (item == showCurrentSpeaker) { ShowCurrentSpeaker = _checked; } else if (item == showVoiceStatus) { ShowVoiceStatus = _checked; } }; menu.OnListIndexChange += (sender, item, oldIndex, newIndex, itemIndex) => { if (item == voiceChatProximity) { currentProximity = proximityRange[newIndex]; Subtitle.Custom($"New voice chat proximity set to: ~b~{proximity[newIndex]}~s~."); } else if (item == voiceChatChannel) { currentChannel = channels[newIndex]; Subtitle.Custom($"New voice chat channel set to: ~b~{channels[newIndex]}~s~."); } }; }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { menu = new Menu(Game.Player.Name, LM.Get("Banned Players Management")); menu.InstructionalButtons.Add(Control.Jump, LM.Get("Filter Options")); menu.ButtonPressHandlers.Add(new Menu.ButtonPressHandler(Control.Jump, Menu.ControlPressCheckType.JUST_RELEASED, new Action <Menu, Control>(async(a, b) => { if (banlist.Count > 1) { string filterText = await GetUserInput(LM.Get("Filter List By Username (leave this empty to reset the filter!)")); if (string.IsNullOrEmpty(filterText)) { Subtitle.Custom(LM.Get("Filters have been cleared.")); menu.ResetFilter(); UpdateBans(); } else { menu.FilterMenuItems(item => item.ItemData is BanRecord br && br.playerName.ToLower().Contains(filterText.ToLower())); Subtitle.Custom(LM.Get("Username filter has been applied.")); } } else { Notify.Error(LM.Get("At least 2 players need to be banned in order to use the filter function.")); } Log($"Button pressed: {a} {b}"); }), true)); bannedPlayer.AddMenuItem(new MenuItem(LM.Get("Player Name"))); bannedPlayer.AddMenuItem(new MenuItem(LM.Get("Banned By"))); bannedPlayer.AddMenuItem(new MenuItem(LM.Get("Banned Until"))); bannedPlayer.AddMenuItem(new MenuItem(LM.Get("Player Identifiers"))); bannedPlayer.AddMenuItem(new MenuItem(LM.Get("Banned For"))); bannedPlayer.AddMenuItem(new MenuItem(LM.Get("~r~Unban"), LM.Get("~r~Warning, unbanning the player can NOT be undone. You will NOT be able to ban them again until they re-join the server. Are you absolutely sure you want to unban this player? ~s~Tip: Tempbanned players will automatically get unbanned if they log on to the server after their ban date has expired."))); // should be enough for now to cover all possible identifiers. List <string> colors = new List <string>() { "~r~", "~g~", "~b~", "~o~", "~y~", "~p~", "~s~", "~t~", }; bannedPlayer.OnMenuClose += (sender) => { BaseScript.TriggerServerEvent("vMenu:RequestBanList", Game.Player.Handle); bannedPlayer.GetMenuItems()[5].Label = ""; UpdateBans(); }; bannedPlayer.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { bannedPlayer.GetMenuItems()[5].Label = ""; }; bannedPlayer.OnItemSelect += (sender, item, index) => { if (index == 5 && IsAllowed(Permission.OPUnban)) { if (item.Label == LM.Get("Are you sure?")) { if (banlist.Contains(currentRecord)) { UnbanPlayer(banlist.IndexOf(currentRecord)); bannedPlayer.GetMenuItems()[5].Label = ""; bannedPlayer.GoBack(); } else { Notify.Error(LM.Get("Somehow you managed to click the unban button but this ban record you're apparently viewing does not even exist. Weird...")); } } else { item.Label = LM.Get("Are you sure?"); } } else { bannedPlayer.GetMenuItems()[5].Label = ""; } }; menu.OnItemSelect += (sender, item, index) => { //if (index < banlist.Count) //{ currentRecord = item.ItemData; bannedPlayer.MenuSubtitle = LM.Get("Ban Record: ~y~") + currentRecord.playerName; var nameItem = bannedPlayer.GetMenuItems()[0]; var bannedByItem = bannedPlayer.GetMenuItems()[1]; var bannedUntilItem = bannedPlayer.GetMenuItems()[2]; var playerIdentifiersItem = bannedPlayer.GetMenuItems()[3]; var banReasonItem = bannedPlayer.GetMenuItems()[4]; nameItem.Label = currentRecord.playerName; nameItem.Description = LM.Get("Player name: ~y~") + currentRecord.playerName; bannedByItem.Label = currentRecord.bannedBy; bannedByItem.Description = LM.Get("Player banned by: ~y~") + currentRecord.bannedBy; if (currentRecord.bannedUntil.Date.Year == 3000) { bannedUntilItem.Label = LM.Get("Forever"); } else { bannedUntilItem.Label = currentRecord.bannedUntil.Date.ToString(); } bannedUntilItem.Description = LM.Get("This player is banned until: ") + currentRecord.bannedUntil.Date.ToString(); playerIdentifiersItem.Description = ""; int i = 0; foreach (string id in currentRecord.identifiers) { // only (admins) people that can unban players are allowed to view IP's. // this is just a slight 'safety' feature in case someone who doesn't know what they're doing // gave builtin.everyone access to view the banlist. if (id.StartsWith("ip:") && !IsAllowed(Permission.OPUnban)) { playerIdentifiersItem.Description += $"{colors[i]}ip: (hidden) "; } else { playerIdentifiersItem.Description += $"{colors[i]}{id.Replace(":", ": ")} "; } i++; } banReasonItem.Description = LM.Get("Banned for: ") + currentRecord.banReason; var unbanPlayerBtn = bannedPlayer.GetMenuItems()[5]; unbanPlayerBtn.Label = ""; if (!IsAllowed(Permission.OPUnban)) { unbanPlayerBtn.Enabled = false; unbanPlayerBtn.Description = LM.Get("You are not allowed to unban players. You are only allowed to view their ban record."); unbanPlayerBtn.LeftIcon = MenuItem.Icon.LOCK; } bannedPlayer.RefreshIndex(); //} }; MenuController.AddMenu(bannedPlayer); }
/// <summary> /// Creates the menu(s). /// </summary> private void CreateMenu() { // Create the menu. menu = new Menu(Game.Player.Name, "Player Appearance"); spawnSavedPedMenu = new Menu("Saved Peds", "Spawn Saved Ped"); deleteSavedPedMenu = new Menu("Saved Peds", "Delete Saved Ped"); pedCustomizationMenu = new Menu("Ped Customization", "Customize Saved Ped"); // Add the (submenus) to the menu pool. MenuController.AddSubmenu(menu, pedCustomizationMenu); MenuController.AddSubmenu(menu, spawnSavedPedMenu); MenuController.AddSubmenu(menu, deleteSavedPedMenu); // Create the menu items. MenuItem pedCustomization = new MenuItem("Ped Customization", "Modify your ped's appearance.") { Label = "→→→" }; MenuItem savePed = new MenuItem("Save Current Ped", "Save your current ped and clothes.") { RightIcon = MenuItem.Icon.TICK }; MenuItem spawnSavedPed = new MenuItem("Spawn Saved Ped", "Spawn one of your saved peds.") { Label = "→→→" }; MenuItem deleteSavedPed = new MenuItem("Delete Saved Ped", "Delete one of your saved peds.") { Label = "→→→", LeftIcon = MenuItem.Icon.WARNING }; MenuItem spawnByName = new MenuItem("Spawn Ped By Name", "Enter a model name of a custom ped you want to spawn."); List <string> walkstyles = new List <string>() { "Normal", "Injured", "Tough Guy", "Femme", "Gangster", "Posh", "Sexy", "Business", "Drunk", "Hipster" }; MenuListItem walkingStyle = new MenuListItem("Walking Style", walkstyles, 0, "Change the walking style of your current ped. " + "You need to re-apply this each time you change player model or load a saved ped."); List <string> clothingGlowAnimations = new List <string>() { "On", "Off", "Fade", "Flash" }; MenuListItem clothingGlowType = new MenuListItem("Illuminated Clothing Style", clothingGlowAnimations, ClothingAnimationType, "Set the style of the animation used on your player's illuminated clothing items."); // Add items to the menu. menu.AddMenuItem(pedCustomization); menu.AddMenuItem(savePed); menu.AddMenuItem(spawnSavedPed); menu.AddMenuItem(deleteSavedPed); menu.AddMenuItem(walkingStyle); menu.AddMenuItem(clothingGlowType); if (IsAllowed(Permission.PACustomize)) { MenuController.BindMenuItem(menu, pedCustomizationMenu, pedCustomization); } else { pedCustomization.Enabled = false; pedCustomization.LeftIcon = MenuItem.Icon.LOCK; pedCustomization.Description = "~r~This option has been disabled by the server owner."; } if (IsAllowed(Permission.PASpawnSaved)) { MenuController.BindMenuItem(menu, spawnSavedPedMenu, spawnSavedPed); } else { spawnSavedPed.Enabled = false; spawnSavedPed.LeftIcon = MenuItem.Icon.LOCK; spawnSavedPed.Description = "~r~This option has been disabled by the server owner."; } MenuController.BindMenuItem(menu, deleteSavedPedMenu, deleteSavedPed); Menu addonPeds = new Menu("Model Spawner", "Spawn Addon Ped"); MenuItem addonPedsBtn = new MenuItem("Addon Peds", "Choose a player skin from the addons list available on this server."); menu.AddMenuItem(addonPedsBtn); MenuController.AddSubmenu(menu, addonPeds); if (AddonPeds != null) { if (AddonPeds.Count > 0) { addonPedsBtn.Label = "→→→"; foreach (KeyValuePair <string, uint> ped in AddonPeds) { var button = new MenuItem(ped.Key, "Click to use this ped."); addonPeds.AddMenuItem(button); if (!IsModelAPed(ped.Value) || !IsModelInCdimage(ped.Value)) { button.Enabled = false; button.LeftIcon = MenuItem.Icon.LOCK; button.Description = "This ped is not available on this server. Are you sure the model is valid?"; } } addonPeds.OnItemSelect += async(sender, item, index) => { if (item.Enabled) { await SetPlayerSkin(AddonPeds.ElementAt(index).Value, new PedInfo() { version = -1 }); } else { Notify.Error("This ped is not available. Please ask the server owner to verify this addon ped."); } }; MenuController.BindMenuItem(menu, addonPeds, addonPedsBtn); } else { addonPedsBtn.Enabled = false; addonPedsBtn.Description = "This server does not have any addon peds available."; addonPedsBtn.LeftIcon = MenuItem.Icon.LOCK; } } else { addonPedsBtn.Enabled = false; addonPedsBtn.Description = "This server does not have any addon peds available."; addonPedsBtn.LeftIcon = MenuItem.Icon.LOCK; } addonPeds.RefreshIndex(); //addonPeds.UpdateScaleform(); // Add the spawn by name button after the addon peds menu item. menu.AddMenuItem(spawnByName); // Loop through all the modelNames and create lists of max 50 ped names each. for (int i = 0; i < (modelNames.Count / 50) + 1; i++) { List <string> pedList = new List <string>(); for (int ii = 0; ii < 50; ii++) { int index = ((i * 50) + ii); if (index >= modelNames.Count) { break; } int max = ((modelNames.Count / 50) != i) ? 50 : modelNames.Count % 50; pedList.Add(modelNames[index] + $" ({(ii + 1).ToString()}/{max.ToString()})"); } MenuListItem pedl = new MenuListItem("Peds #" + (i + 1).ToString(), pedList, 0); menu.AddMenuItem(pedl); if (!IsAllowed(Permission.PASpawnNew)) { pedl.Enabled = false; pedl.LeftIcon = MenuItem.Icon.LOCK; pedl.Description = "This option has been disabled by the server owner."; } } // Handle list selections. menu.OnListItemSelect += async(sender, item, listIndex, itemIndex) => { if (item == walkingStyle) { if (MainMenu.DebugMode) { Subtitle.Custom("Ped is: " + IsPedMale(Game.PlayerPed.Handle)); } SetWalkingStyle(walkstyles[listIndex].ToString()); } else if (item == clothingGlowType) { ClothingAnimationType = item.ListIndex; } else { int i = ((itemIndex - 8) * 50) + listIndex; string modelName = modelNames[i]; if (IsAllowed(Permission.PASpawnNew)) { await SetPlayerSkin(modelName, new PedInfo() { version = -1 }); } } }; // Handle button presses. menu.OnItemSelect += (sender, item, index) => { if (item == pedCustomization) { RefreshCustomizationMenu(); } else if (item == spawnSavedPed) { RefreshSpawnSavedPedMenu(); } else if (item == deleteSavedPed) { RefreshDeleteSavedPedMenu(); } else if (item == savePed) { SavePed(); } else if (item == spawnByName) { SpawnPedByName(); } }; // Handle saved ped spawning. spawnSavedPedMenu.OnItemSelect += (sender, item, idex) => { var name = item.Text.ToString(); LoadSavedPed(name, true); }; #region ped drawable list changes // Manage list changes. pedCustomizationMenu.OnListIndexChange += (sender, item, oldListIndex, newListIndex, itemIndex) => { if (drawablesMenuListItems.ContainsKey(item)) { int drawableID = drawablesMenuListItems[item]; SetPedComponentVariation(Game.PlayerPed.Handle, drawableID, newListIndex, 0, 0); } else if (propsMenuListItems.ContainsKey(item)) { int propID = propsMenuListItems[item]; if (newListIndex == 0) { SetPedPropIndex(Game.PlayerPed.Handle, propID, newListIndex - 1, 0, false); ClearPedProp(Game.PlayerPed.Handle, propID); } else { SetPedPropIndex(Game.PlayerPed.Handle, propID, newListIndex - 1, 0, true); } if (propID == 0) { int component = GetPedPropIndex(Game.PlayerPed.Handle, 0); // helmet index int texture = GetPedPropTextureIndex(Game.PlayerPed.Handle, 0); // texture int compHash = GetHashNameForProp(Game.PlayerPed.Handle, 0, component, texture); // prop combination hash if (N_0xd40aac51e8e4c663(compHash) > 0) // helmet has visor. { if (!IsHelpMessageBeingDisplayed()) { BeginTextCommandDisplayHelp("TWOSTRINGS"); AddTextComponentSubstringPlayerName("Hold ~INPUT_SWITCH_VISOR~ to flip your helmet visor open or closed"); AddTextComponentSubstringPlayerName("when on foot or on a motorcycle and when vMenu is closed."); EndTextCommandDisplayHelp(0, false, true, 6000); } } } } }; // Manage list selections. pedCustomizationMenu.OnListItemSelect += (sender, item, listIndex, itemIndex) => { if (drawablesMenuListItems.ContainsKey(item)) // drawable { int currentDrawableID = drawablesMenuListItems[item]; int currentTextureIndex = GetPedTextureVariation(Game.PlayerPed.Handle, currentDrawableID); int maxDrawableTextures = GetNumberOfPedTextureVariations(Game.PlayerPed.Handle, currentDrawableID, listIndex) - 1; if (currentTextureIndex == -1) { currentTextureIndex = 0; } int newTexture = currentTextureIndex < maxDrawableTextures ? currentTextureIndex + 1 : 0; SetPedComponentVariation(Game.PlayerPed.Handle, currentDrawableID, listIndex, newTexture, 0); } else if (propsMenuListItems.ContainsKey(item)) // prop { int currentPropIndex = propsMenuListItems[item]; int currentPropVariationIndex = GetPedPropIndex(Game.PlayerPed.Handle, currentPropIndex); int currentPropTextureVariation = GetPedPropTextureIndex(Game.PlayerPed.Handle, currentPropIndex); int maxPropTextureVariations = GetNumberOfPedPropTextureVariations(Game.PlayerPed.Handle, currentPropIndex, currentPropVariationIndex) - 1; int newPropTextureVariationIndex = currentPropTextureVariation < maxPropTextureVariations ? currentPropTextureVariation + 1 : 0; SetPedPropIndex(Game.PlayerPed.Handle, currentPropIndex, currentPropVariationIndex, newPropTextureVariationIndex, true); } }; #endregion }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { // Create the menu. menu = new Menu(Game.Player.Name, "Online Players") { }; menu.CounterPreText = "Players: "; // MENU FILTER async void FilterMenu(Menu m, Control c) { string input = await GetUserInput("Filter by player name"); if (!string.IsNullOrEmpty(input)) { m.FilterMenuItems((mb) => mb.Label.ToLower().Contains(input.ToLower()) || mb.Text.ToLower().Contains(input.ToLower())); Subtitle.Custom("Filter applied."); } else { m.ResetFilter(); Subtitle.Custom("Filter cleared."); } } void ResetMenuFilter(Menu m) { m.ResetFilter(); } menu.OnMenuClose += ResetMenuFilter; menu.InstructionalButtons.Add(Control.Jump, "Filter Player List"); menu.ButtonPressHandlers.Add(new Menu.ButtonPressHandler(Control.Jump, Menu.ControlPressCheckType.JUST_RELEASED, new Action <Menu, Control>(FilterMenu), true)); MenuController.AddSubmenu(menu, playerMenu); MenuItem sendMessage = new MenuItem("Send Private Message", "Sends a private message to this player. ~r~Note: staff may be able to see all PM's."); MenuItem teleport = new MenuItem("Teleport To Player", "Teleport to this player."); MenuItem teleportVeh = new MenuItem("Teleport Into Player Vehicle", "Teleport into the vehicle of the player."); MenuItem summon = new MenuItem("Summon Player", "Teleport the player to you."); MenuItem toggleGPS = new MenuItem("Toggle GPS", "Enables or disables the GPS route on your radar to this player. ~y~Note for when the server is using OneSync Infinity: this may not work if the player is too far away."); MenuItem spectate = new MenuItem("Spectate Player", "Spectate this player. Click this button again to stop spectating. ~y~Note for when the server is using OneSync Infinity: You will be teleported to the player if you're too far away, you might want to go into noclip to become invisible, before using this option!"); MenuItem printIdentifiers = new MenuItem("Print Identifiers", "This will print the player's identifiers to the client console (F8). And also save it to the CitizenFX.log file."); MenuItem kill = new MenuItem("~r~Kill Player", "Kill this player, note they will receive a notification saying that you killed them. It will also be logged in the Staff Actions log."); MenuItem kick = new MenuItem("~r~Kick Player", "Kick the player from the server."); MenuItem ban = new MenuItem("~r~Ban Player Permanently", "Ban this player permanently from the server. Are you sure you want to do this? You can specify the ban reason after clicking this button."); MenuItem tempban = new MenuItem("~r~Ban Player Temporarily", "Give this player a tempban of up to 30 days (max). You can specify duration and ban reason after clicking this button."); // always allowed playerMenu.AddMenuItem(sendMessage); // permissions specific if (IsAllowed(Permission.OPTeleport)) { playerMenu.AddMenuItem(teleport); playerMenu.AddMenuItem(teleportVeh); } if (IsAllowed(Permission.OPSummon)) { playerMenu.AddMenuItem(summon); } if (IsAllowed(Permission.OPSpectate)) { playerMenu.AddMenuItem(spectate); } if (IsAllowed(Permission.OPWaypoint)) { playerMenu.AddMenuItem(toggleGPS); } if (IsAllowed(Permission.OPIdentifiers)) { playerMenu.AddMenuItem(printIdentifiers); } if (IsAllowed(Permission.OPKill)) { playerMenu.AddMenuItem(kill); } if (IsAllowed(Permission.OPKick)) { playerMenu.AddMenuItem(kick); } if (IsAllowed(Permission.OPTempBan)) { playerMenu.AddMenuItem(tempban); } if (IsAllowed(Permission.OPPermBan)) { playerMenu.AddMenuItem(ban); ban.LeftIcon = MenuItem.Icon.WARNING; } playerMenu.OnMenuClose += (sender) => { playerMenu.RefreshIndex(); ban.Label = ""; }; playerMenu.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { ban.Label = ""; }; // handle button presses for the specific player's menu. playerMenu.OnItemSelect += async(sender, item, index) => { // send message if (item == sendMessage) { if (MainMenu.MiscSettingsMenu != null && !MainMenu.MiscSettingsMenu.MiscDisablePrivateMessages) { string message = await GetUserInput($"Private Message To {currentPlayer.Name}", 200); if (string.IsNullOrEmpty(message)) { Notify.Error(CommonErrors.InvalidInput); } else { TriggerServerEvent("vMenu:SendMessageToPlayer", currentPlayer.ServerId, message); PrivateMessage(currentPlayer.ServerId.ToString(), message, true); TriggerServerEvent("vMenu:DamonLog", $"{Game.Player.Name} PM'd {GetSafePlayerName(currentPlayer.Name)}: {message}"); } } else { Notify.Error("You can't send a private message if you have private messages disabled yourself. Enable them in the Misc Settings menu and try again."); } } // teleport (in vehicle) button else if (item == teleport || item == teleportVeh) { if (!currentPlayer.IsLocal) { _ = TeleportToPlayer(currentPlayer, item == teleportVeh); // teleport to the player. optionally in the player's vehicle if that button was pressed. } else { Notify.Error("You can not teleport to yourself!"); } } // summon button else if (item == summon) { if (Game.Player.Handle != currentPlayer.Handle) { SummonPlayer(currentPlayer); } else { Notify.Error("You can't summon yourself."); } } // spectating else if (item == spectate) { SpectatePlayer(currentPlayer); } // kill button else if (item == kill) { KillPlayer(currentPlayer); } // manage the gps route being clicked. else if (item == toggleGPS) { bool selectedPedRouteAlreadyActive = false; if (PlayersWaypointList.Count > 0) { if (PlayersWaypointList.Contains(currentPlayer.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>{GetSafePlayerName(currentPlayer.Name)}</C>~g~ is now disabled."); TriggerServerEvent("vMenu:DamonLog", $"{Game.Player.Name} Disabled GPS to {GetSafePlayerName(currentPlayer.Name)}"); } } PlayersWaypointList.Clear(); } if (!selectedPedRouteAlreadyActive) { if (currentPlayer.Handle != Game.Player.Handle) { int ped = GetPlayerPed(currentPlayer.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(currentPlayer.Handle); Notify.Custom($"~g~GPS route to ~s~<C>{GetSafePlayerName(currentPlayer.Name)}</C>~g~ is now active, press the ~s~Toggle GPS Route~g~ button again to disable the route."); TriggerServerEvent("vMenu:DamonLog", $"{Game.Player.Name} Toggled GPS to {GetSafePlayerName(currentPlayer.Name)}"); } else { Notify.Error("You can not set a waypoint to yourself."); } } } else if (item == printIdentifiers) { Func <string, string> CallbackFunction = (data) => { Debug.WriteLine(data); string ids = "~s~"; foreach (string s in JsonConvert.DeserializeObject <string[]>(data)) { ids += "~n~" + s; } Notify.Custom($"~y~<C>{GetSafePlayerName(currentPlayer.Name)}</C>~g~'s Identifiers: {ids}", false); return(data); }; BaseScript.TriggerServerEvent("vMenu:GetPlayerIdentifiers", currentPlayer.ServerId, CallbackFunction); } // kick button else if (item == kick) { if (currentPlayer.Handle != Game.Player.Handle) { KickPlayer(currentPlayer, true); } else { Notify.Error("You cannot kick yourself!"); } } // temp ban else if (item == tempban) { BanPlayer(currentPlayer, false); } // perm ban else if (item == ban) { if (ban.Label == "Are you sure?") { ban.Label = ""; _ = UpdatePlayerlist(); playerMenu.GoBack(); BanPlayer(currentPlayer, true); } else { ban.Label = "Are you sure?"; } } }; // handle button presses in the player list. menu.OnItemSelect += (sender, item, index) => { var baseId = int.Parse(item.Label.Replace(" →→→", "").Replace("Server #", "")); var player = MainMenu.PlayersList.FirstOrDefault(p => p.ServerId == baseId); if (player != null) { currentPlayer = player; playerMenu.MenuSubtitle = $"~s~Player: ~y~{GetSafePlayerName(currentPlayer.Name)}"; playerMenu.CounterPreText = $"[Server ID: ~y~{currentPlayer.ServerId}~s~] "; } else { playerMenu.GoBack(); } }; }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { // Setup weapon dictionaries. weaponInfo = new Dictionary <Menu, ValidWeapon>(); weaponComponents = new Dictionary <MenuItem, string>(); #region create main weapon options menu and add items // Create the menu. menu = new Menu(Game.Player.Name, "Weapon Options"); MenuItem getAllWeapons = new MenuItem("Get All Weapons", "Get all weapons."); MenuItem removeAllWeapons = new MenuItem("Remove All Weapons", "Removes all weapons in your inventory."); MenuCheckboxItem unlimitedAmmo = new MenuCheckboxItem("Unlimited Ammo", "Unlimited ammonition supply.", UnlimitedAmmo); MenuCheckboxItem noReload = new MenuCheckboxItem("No Reload", "Never reload.", NoReload); MenuItem setAmmo = new MenuItem("Set All Ammo Count", "Set the amount of ammo in all your weapons."); MenuItem refillMaxAmmo = new MenuItem("Refill All Ammo", "Give all your weapons max ammo."); MenuItem spawnByName = new MenuItem("Spawn Weapon By Name", "Enter a weapon mode name to spawn."); // Add items based on permissions if (IsAllowed(Permission.WPGetAll)) { menu.AddMenuItem(getAllWeapons); } if (IsAllowed(Permission.WPRemoveAll)) { menu.AddMenuItem(removeAllWeapons); } if (IsAllowed(Permission.WPUnlimitedAmmo)) { menu.AddMenuItem(unlimitedAmmo); } if (IsAllowed(Permission.WPNoReload)) { menu.AddMenuItem(noReload); } if (IsAllowed(Permission.WPSetAllAmmo)) { menu.AddMenuItem(setAmmo); menu.AddMenuItem(refillMaxAmmo); } if (IsAllowed(Permission.WPSpawnByName)) { menu.AddMenuItem(spawnByName); } #endregion #region addonweapons submenu MenuItem addonWeaponsBtn = new MenuItem("Addon Weapons", "Equip / remove addon weapons available on this server."); Menu addonWeaponsMenu = new Menu("Addon Weapons", "Equip/Remove Addon Weapons"); menu.AddMenuItem(addonWeaponsBtn); #region manage creating and accessing addon weapons menu if (IsAllowed(Permission.WPSpawn) && AddonWeapons != null && AddonWeapons.Count > 0) { MenuController.BindMenuItem(menu, addonWeaponsMenu, addonWeaponsBtn); foreach (KeyValuePair <string, uint> weapon in AddonWeapons) { string name = weapon.Key.ToString(); uint model = weapon.Value; var item = new MenuItem(name, $"Click to add/remove this weapon ({name}) to/from your inventory."); addonWeaponsMenu.AddMenuItem(item); if (!IsWeaponValid(model)) { item.Enabled = false; item.LeftIcon = MenuItem.Icon.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(Game.PlayerPed.Handle, weapon.Value, false)) { RemoveWeaponFromPed(Game.PlayerPed.Handle, weapon.Value); } else { var maxAmmo = 200; GetMaxAmmo(Game.PlayerPed.Handle, weapon.Value, ref maxAmmo); GiveWeaponToPed(Game.PlayerPed.Handle, weapon.Value, maxAmmo, false, true); } }; addonWeaponsBtn.Label = "→→→"; } else { addonWeaponsBtn.LeftIcon = MenuItem.Icon.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(); #endregion #region parachute options menu if (IsAllowed(Permission.WPParachute)) { // main parachute options menu setup Menu parachuteMenu = new Menu("Parachute Options", "Parachute Options"); MenuItem parachuteBtn = new MenuItem("Parachute Options", "All parachute related options can be changed here.") { Label = "→→→" }; MenuController.AddSubmenu(menu, parachuteMenu); menu.AddMenuItem(parachuteBtn); MenuController.BindMenuItem(menu, parachuteMenu, parachuteBtn); List <string> chutes = new List <string>() { GetLabelText("PM_TINT0"), GetLabelText("PM_TINT1"), GetLabelText("PM_TINT2"), GetLabelText("PM_TINT3"), GetLabelText("PM_TINT4"), GetLabelText("PM_TINT5"), GetLabelText("PM_TINT6"), GetLabelText("PM_TINT7"), // broken in FiveM for some weird reason: GetLabelText("PS_CAN_0"), GetLabelText("PS_CAN_1"), GetLabelText("PS_CAN_2"), GetLabelText("PS_CAN_3"), GetLabelText("PS_CAN_4"), GetLabelText("PS_CAN_5") }; List <string> chuteDescriptions = new List <string>() { GetLabelText("PD_TINT0"), GetLabelText("PD_TINT1"), GetLabelText("PD_TINT2"), GetLabelText("PD_TINT3"), GetLabelText("PD_TINT4"), GetLabelText("PD_TINT5"), GetLabelText("PD_TINT6"), GetLabelText("PD_TINT7"), // broken in FiveM for some weird reason: GetLabelText("PSD_CAN_0") + " ~r~For some reason this one doesn't seem to work in FiveM.", GetLabelText("PSD_CAN_1") + " ~r~For some reason this one doesn't seem to work in FiveM.", GetLabelText("PSD_CAN_2") + " ~r~For some reason this one doesn't seem to work in FiveM.", GetLabelText("PSD_CAN_3") + " ~r~For some reason this one doesn't seem to work in FiveM.", GetLabelText("PSD_CAN_4") + " ~r~For some reason this one doesn't seem to work in FiveM.", GetLabelText("PSD_CAN_5") + " ~r~For some reason this one doesn't seem to work in FiveM." }; MenuItem togglePrimary = new MenuItem("Toggle Primary Parachute", "Equip or remove the primary parachute"); MenuItem toggleReserve = new MenuItem("Enable Reserve Parachute", "Enables the reserve parachute. Only works if you enabled the primary parachute first. Reserve parachute can not be removed from the player once it's activated."); MenuListItem primaryChutes = new MenuListItem("Primary Chute Style", chutes, 0, $"Primary chute: {chuteDescriptions[0]}"); MenuListItem secondaryChutes = new MenuListItem("Reserve Chute Style", chutes, 0, $"Reserve chute: {chuteDescriptions[0]}"); MenuCheckboxItem unlimitedParachutes = new MenuCheckboxItem("Unlimited Parachutes", "Enable unlimited parachutes and reserve parachutes.", UnlimitedParachutes); MenuCheckboxItem autoEquipParachutes = new MenuCheckboxItem("Auto Equip Parachutes", "Automatically equip a parachute and reserve parachute when entering planes/helicopters.", AutoEquipChute); // smoke color list List <string> smokeColorsList = new List <string>() { GetLabelText("PM_TINT8"), // no smoke GetLabelText("PM_TINT9"), // red GetLabelText("PM_TINT10"), // orange GetLabelText("PM_TINT11"), // yellow GetLabelText("PM_TINT12"), // blue GetLabelText("PM_TINT13"), // black }; List <int[]> colors = new List <int[]>() { new int[3] { 255, 255, 255 }, new int[3] { 255, 0, 0 }, new int[3] { 255, 165, 0 }, new int[3] { 255, 255, 0 }, new int[3] { 0, 0, 255 }, new int[3] { 20, 20, 20 }, }; MenuListItem smokeColors = new MenuListItem("Smoke Trail Color", smokeColorsList, 0, "Choose a smoke trail color, then press select to change it. Changing colors takes 4 seconds, you can not use your smoke while the color is being changed."); parachuteMenu.AddMenuItem(togglePrimary); parachuteMenu.AddMenuItem(toggleReserve); parachuteMenu.AddMenuItem(autoEquipParachutes); parachuteMenu.AddMenuItem(unlimitedParachutes); parachuteMenu.AddMenuItem(smokeColors); parachuteMenu.AddMenuItem(primaryChutes); parachuteMenu.AddMenuItem(secondaryChutes); parachuteMenu.OnItemSelect += (sender, item, index) => { if (item == togglePrimary) { if (HasPedGotWeapon(Game.PlayerPed.Handle, (uint)GetHashKey("gadget_parachute"), false)) { Subtitle.Custom("Primary parachute removed."); RemoveWeaponFromPed(Game.PlayerPed.Handle, (uint)GetHashKey("gadget_parachute")); } else { Subtitle.Custom("Primary parachute added."); GiveWeaponToPed(Game.PlayerPed.Handle, (uint)GetHashKey("gadget_parachute"), 0, false, false); } } else if (item == toggleReserve) { SetPlayerHasReserveParachute(Game.Player.Handle); Subtitle.Custom("Reserve parachute has been added."); } }; parachuteMenu.OnCheckboxChange += (sender, item, index, _checked) => { if (item == unlimitedParachutes) { UnlimitedParachutes = _checked; } else if (item == autoEquipParachutes) { AutoEquipChute = _checked; } }; bool switching = false; async void IndexChangedEventHandler(Menu sender, MenuListItem item, int oldIndex, int newIndex, int itemIndex) { if (item == smokeColors && oldIndex == -1) { if (!switching) { switching = true; SetPlayerCanLeaveParachuteSmokeTrail(Game.Player.Handle, false); await Delay(4000); int[] color = colors[newIndex]; SetPlayerParachuteSmokeTrailColor(Game.Player.Handle, color[0], color[1], color[2]); SetPlayerCanLeaveParachuteSmokeTrail(Game.Player.Handle, newIndex != 0); switching = false; } } else if (item == primaryChutes) { item.Description = $"Primary chute: {chuteDescriptions[newIndex]}"; SetPlayerParachuteTintIndex(Game.Player.Handle, newIndex); } else if (item == secondaryChutes) { item.Description = $"Reserve chute: {chuteDescriptions[newIndex]}"; SetPlayerReserveParachuteTintIndex(Game.Player.Handle, newIndex); } } parachuteMenu.OnListItemSelect += (sender, item, index, itemIndex) => IndexChangedEventHandler(sender, item, -1, index, itemIndex); parachuteMenu.OnListIndexChange += IndexChangedEventHandler; } #endregion #region Create Weapon Category Submenus MenuItem spacer = GetSpacerMenuItem("↓ Weapon Categories ↓"); menu.AddMenuItem(spacer); Menu handGuns = new Menu("Weapons", "Handguns"); MenuItem handGunsBtn = new MenuItem("Handguns"); Menu rifles = new Menu("Weapons", "Assault Rifles"); MenuItem riflesBtn = new MenuItem("Assault Rifles"); Menu shotguns = new Menu("Weapons", "Shotguns"); MenuItem shotgunsBtn = new MenuItem("Shotguns"); Menu smgs = new Menu("Weapons", "Sub-/Light Machine Guns"); MenuItem smgsBtn = new MenuItem("Sub-/Light Machine Guns"); Menu throwables = new Menu("Weapons", "Throwables"); MenuItem throwablesBtn = new MenuItem("Throwables"); Menu melee = new Menu("Weapons", "Melee"); MenuItem meleeBtn = new MenuItem("Melee"); Menu heavy = new Menu("Weapons", "Heavy Weapons"); MenuItem heavyBtn = new MenuItem("Heavy Weapons"); Menu snipers = new Menu("Weapons", "Sniper Rifles"); MenuItem snipersBtn = new MenuItem("Sniper Rifles"); MenuController.AddSubmenu(menu, handGuns); MenuController.AddSubmenu(menu, rifles); MenuController.AddSubmenu(menu, shotguns); MenuController.AddSubmenu(menu, smgs); MenuController.AddSubmenu(menu, throwables); MenuController.AddSubmenu(menu, melee); MenuController.AddSubmenu(menu, heavy); MenuController.AddSubmenu(menu, snipers); #endregion #region Setup weapon category buttons and submenus. handGunsBtn.Label = "→→→"; menu.AddMenuItem(handGunsBtn); MenuController.BindMenuItem(menu, handGuns, handGunsBtn); riflesBtn.Label = "→→→"; menu.AddMenuItem(riflesBtn); MenuController.BindMenuItem(menu, rifles, riflesBtn); shotgunsBtn.Label = "→→→"; menu.AddMenuItem(shotgunsBtn); MenuController.BindMenuItem(menu, shotguns, shotgunsBtn); smgsBtn.Label = "→→→"; menu.AddMenuItem(smgsBtn); MenuController.BindMenuItem(menu, smgs, smgsBtn); throwablesBtn.Label = "→→→"; menu.AddMenuItem(throwablesBtn); MenuController.BindMenuItem(menu, throwables, throwablesBtn); meleeBtn.Label = "→→→"; menu.AddMenuItem(meleeBtn); MenuController.BindMenuItem(menu, melee, meleeBtn); heavyBtn.Label = "→→→"; menu.AddMenuItem(heavyBtn); MenuController.BindMenuItem(menu, heavy, heavyBtn); snipersBtn.Label = "→→→"; menu.AddMenuItem(snipersBtn); MenuController.BindMenuItem(menu, snipers, snipersBtn); #endregion #region Loop through all weapons, create menus for them and add all menu items and handle events. foreach (ValidWeapon weapon in ValidWeapons.WeaponList) { uint cat = (uint)GetWeapontypeGroup(weapon.Hash); if (!string.IsNullOrEmpty(weapon.Name) && IsAllowed(weapon.Perm)) { //Log($"[DEBUG LOG] [WEAPON-BUG] {weapon.Name} - {weapon.Perm} = {IsAllowed(weapon.Perm)} & All = {IsAllowed(Permission.WPGetAll)}"); #region Create menu for this weapon and add buttons Menu weaponMenu = new Menu("Weapon Options", weapon.Name) { ShowWeaponStatsPanel = true }; var stats = new Game.WeaponHudStats(); Game.GetWeaponHudStats(weapon.Hash, ref stats); weaponMenu.SetWeaponStats((float)stats.hudDamage / 100f, (float)stats.hudSpeed / 100f, (float)stats.hudAccuracy / 100f, (float)stats.hudRange / 100f); MenuItem weaponItem = new MenuItem(weapon.Name, $"Open the options for ~y~{weapon.Name}~s~.") { Label = "→→→", LeftIcon = MenuItem.Icon.GUN, ItemData = stats }; weaponInfo.Add(weaponMenu, weapon); MenuItem getOrRemoveWeapon = new MenuItem("Equip/Remove Weapon", "Add or remove this weapon to/form your inventory.") { LeftIcon = MenuItem.Icon.GUN }; weaponMenu.AddMenuItem(getOrRemoveWeapon); if (!IsAllowed(Permission.WPSpawn)) { getOrRemoveWeapon.Enabled = false; getOrRemoveWeapon.Description = "You do not have permission to use this option."; getOrRemoveWeapon.LeftIcon = MenuItem.Icon.LOCK; } MenuItem fillAmmo = new MenuItem("Re-fill Ammo", "Get max ammo for this weapon.") { LeftIcon = MenuItem.Icon.AMMO }; weaponMenu.AddMenuItem(fillAmmo); List <string> tints = new List <string>(); 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); } } MenuListItem weaponTints = new MenuListItem("Tints", tints, 0, "Select a tint for your weapon."); weaponMenu.AddMenuItem(weaponTints); #endregion #region Handle weapon specific list changes weaponMenu.OnListIndexChange += (sender, item, oldIndex, newIndex, itemIndex) => { if (item == weaponTints) { if (HasPedGotWeapon(Game.PlayerPed.Handle, weaponInfo[sender].Hash, false)) { SetPedWeaponTintIndex(Game.PlayerPed.Handle, weaponInfo[sender].Hash, newIndex); } else { Notify.Error("You need to get the weapon first!"); } } }; #endregion #region Handle weapon specific button presses weaponMenu.OnItemSelect += (sender, item, index) => { var info = weaponInfo[sender]; uint hash = info.Hash; SetCurrentPedWeapon(Game.PlayerPed.Handle, hash, true); if (item == getOrRemoveWeapon) { if (HasPedGotWeapon(Game.PlayerPed.Handle, hash, false)) { RemoveWeaponFromPed(Game.PlayerPed.Handle, hash); TriggerServerEvent("vMenu:DamonLog", $"{Game.Player.Name} removed their {info.Name}"); Subtitle.Custom("Weapon removed."); } else { var ammo = 255; GetMaxAmmo(Game.PlayerPed.Handle, hash, ref ammo); GiveWeaponToPed(Game.PlayerPed.Handle, hash, ammo, false, true); TriggerServerEvent("vMenu:DamonLog", $"{Game.Player.Name} gave themself a {info.Name}"); Subtitle.Custom("Weapon added."); } } else if (item == fillAmmo) { if (HasPedGotWeapon(Game.PlayerPed.Handle, hash, false)) { var ammo = 900; GetMaxAmmo(Game.PlayerPed.Handle, hash, ref ammo); SetPedAmmo(Game.PlayerPed.Handle, 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) { //Log($"{weapon.Name} : {comp.Key}"); MenuItem compItem = new MenuItem(comp.Key, "Click to equip or remove this component."); weaponComponents.Add(compItem, comp.Key); weaponMenu.AddMenuItem(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(Game.PlayerPed.Handle, Weapon.Hash, false)) { SetCurrentPedWeapon(Game.PlayerPed.Handle, Weapon.Hash, true); if (HasPedGotWeaponComponent(Game.PlayerPed.Handle, Weapon.Hash, componentHash)) { RemoveWeaponComponentFromPed(Game.PlayerPed.Handle, Weapon.Hash, componentHash); Subtitle.Custom("Component removed."); } else { int ammo = GetAmmoInPedWeapon(Game.PlayerPed.Handle, Weapon.Hash); int clipAmmo = GetMaxAmmoInClip(Game.PlayerPed.Handle, Weapon.Hash, false); GetAmmoInClip(Game.PlayerPed.Handle, Weapon.Hash, ref clipAmmo); GiveWeaponComponentToPed(Game.PlayerPed.Handle, Weapon.Hash, componentHash); SetAmmoInClip(Game.PlayerPed.Handle, Weapon.Hash, clipAmmo); SetPedAmmo(Game.PlayerPed.Handle, Weapon.Hash, ammo); 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(); if (cat == 970310034) // 970310034 rifles { MenuController.AddSubmenu(rifles, weaponMenu); MenuController.BindMenuItem(rifles, weaponMenu, weaponItem); rifles.AddMenuItem(weaponItem); } else if (cat == 416676503 || cat == 690389602) // 416676503 hand guns // 690389602 stun gun { MenuController.AddSubmenu(handGuns, weaponMenu); MenuController.BindMenuItem(handGuns, weaponMenu, weaponItem); handGuns.AddMenuItem(weaponItem); } else if (cat == 860033945) // 860033945 shotguns { MenuController.AddSubmenu(shotguns, weaponMenu); MenuController.BindMenuItem(shotguns, weaponMenu, weaponItem); shotguns.AddMenuItem(weaponItem); } else if (cat == 3337201093 || cat == 1159398588) // 3337201093 sub machine guns // 1159398588 light machine guns { MenuController.AddSubmenu(smgs, weaponMenu); MenuController.BindMenuItem(smgs, weaponMenu, weaponItem); smgs.AddMenuItem(weaponItem); } else if (cat == 1548507267 || cat == 4257178988 || cat == 1595662460) // 1548507267 throwables // 4257178988 fire extinghuiser // jerry can { MenuController.AddSubmenu(throwables, weaponMenu); MenuController.BindMenuItem(throwables, weaponMenu, weaponItem); throwables.AddMenuItem(weaponItem); } else if (cat == 3566412244 || cat == 2685387236) // 3566412244 melee weapons // 2685387236 knuckle duster { MenuController.AddSubmenu(melee, weaponMenu); MenuController.BindMenuItem(melee, weaponMenu, weaponItem); melee.AddMenuItem(weaponItem); } else if (cat == 2725924767) // 2725924767 heavy weapons { MenuController.AddSubmenu(heavy, weaponMenu); MenuController.BindMenuItem(heavy, weaponMenu, weaponItem); heavy.AddMenuItem(weaponItem); } else if (cat == 3082541095) // 3082541095 sniper rifles { MenuController.AddSubmenu(snipers, weaponMenu); MenuController.BindMenuItem(snipers, weaponMenu, weaponItem); snipers.AddMenuItem(weaponItem); } } } #endregion #region Disable submenus if no weapons in that category are allowed. if (handGuns.Size == 0) { handGunsBtn.LeftIcon = MenuItem.Icon.LOCK; handGunsBtn.Description = "The server owner removed the permissions for all weapons in this category."; handGunsBtn.Enabled = false; } if (rifles.Size == 0) { riflesBtn.LeftIcon = MenuItem.Icon.LOCK; riflesBtn.Description = "The server owner removed the permissions for all weapons in this category."; riflesBtn.Enabled = false; } if (shotguns.Size == 0) { shotgunsBtn.LeftIcon = MenuItem.Icon.LOCK; shotgunsBtn.Description = "The server owner removed the permissions for all weapons in this category."; shotgunsBtn.Enabled = false; } if (smgs.Size == 0) { smgsBtn.LeftIcon = MenuItem.Icon.LOCK; smgsBtn.Description = "The server owner removed the permissions for all weapons in this category."; smgsBtn.Enabled = false; } if (throwables.Size == 0) { throwablesBtn.LeftIcon = MenuItem.Icon.LOCK; throwablesBtn.Description = "The server owner removed the permissions for all weapons in this category."; throwablesBtn.Enabled = false; } if (melee.Size == 0) { meleeBtn.LeftIcon = MenuItem.Icon.LOCK; meleeBtn.Description = "The server owner removed the permissions for all weapons in this category."; meleeBtn.Enabled = false; } if (heavy.Size == 0) { heavyBtn.LeftIcon = MenuItem.Icon.LOCK; heavyBtn.Description = "The server owner removed the permissions for all weapons in this category."; heavyBtn.Enabled = false; } if (snipers.Size == 0) { snipersBtn.LeftIcon = MenuItem.Icon.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(Game.PlayerPed.Handle); if (item == getAllWeapons) { foreach (ValidWeapon vw in ValidWeapons.WeaponList) { if (IsAllowed(vw.Perm)) { GiveWeaponToPed(Game.PlayerPed.Handle, vw.Hash, vw.GetMaxAmmo, false, true); int ammoInClip = GetMaxAmmoInClip(Game.PlayerPed.Handle, vw.Hash, false); SetAmmoInClip(Game.PlayerPed.Handle, vw.Hash, ammoInClip); int ammo = 0; GetMaxAmmo(Game.PlayerPed.Handle, vw.Hash, ref ammo); SetPedAmmo(Game.PlayerPed.Handle, vw.Hash, ammo); } } SetCurrentPedWeapon(Game.PlayerPed.Handle, (uint)GetHashKey("weapon_unarmed"), true); } else if (item == removeAllWeapons) { ped.Weapons.RemoveAll(); TriggerServerEvent("vMenu:DamonLog", $"{Game.Player.Name} removed all weapons"); } else if (item == setAmmo) { SetAllWeaponsAmmo(); } else if (item == refillMaxAmmo) { foreach (ValidWeapon vw in ValidWeapons.WeaponList) { if (HasPedGotWeapon(Game.PlayerPed.Handle, vw.Hash, false)) { int ammoInClip = GetMaxAmmoInClip(Game.PlayerPed.Handle, vw.Hash, false); SetAmmoInClip(Game.PlayerPed.Handle, vw.Hash, ammoInClip); int ammo = 0; GetMaxAmmo(Game.PlayerPed.Handle, vw.Hash, ref ammo); SetPedAmmo(Game.PlayerPed.Handle, vw.Hash, ammo); } } } else if (item == spawnByName) { SpawnCustomWeapon(); } }; #endregion #region Handle checkbox changes menu.OnCheckboxChange += (sender, item, index, _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 void OnIndexChange(Menu m, MenuItem i) { if (i.ItemData is Game.WeaponHudStats stats) { m.SetWeaponStats((float)stats.hudDamage / 100f, (float)stats.hudSpeed / 100f, (float)stats.hudAccuracy / 100f, (float)stats.hudRange / 100f); m.ShowWeaponStatsPanel = true; } else { m.ShowWeaponStatsPanel = false; } } handGuns.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; rifles.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; shotguns.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; smgs.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; throwables.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; melee.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; heavy.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; snipers.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; handGuns.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; rifles.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; shotguns.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; smgs.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; throwables.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; melee.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; heavy.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; snipers.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; }
/// <summary> /// Creates the menu(s). /// </summary> private void CreateMenu() { // Create the menu. menu = new Menu("YDDY:RP", "Вид персонажа"); spawnSavedPedMenu = new Menu("Сохраненные", "Заспавнить сохранение"); deleteSavedPedMenu = new Menu("Сохраненные", "Удалить сохранение"); pedCustomizationMenu = new Menu("Кастомизация", "Изменить вид персонажа"); // Add the (submenus) to the menu pool. MenuController.AddSubmenu(menu, pedCustomizationMenu); MenuController.AddSubmenu(menu, spawnSavedPedMenu); MenuController.AddSubmenu(menu, deleteSavedPedMenu); // Create the menu items. MenuItem pedCustomization = new MenuItem("Кастомизация", "Измените вид персонажа.") { Label = "→→→" }; MenuItem savePed = new MenuItem("Сохранить персонажа", "Сохраните персонажа и одежду.") { RightIcon = MenuItem.Icon.TICK }; MenuItem spawnSavedPed = new MenuItem("Заспавнить сохраненный", "") { Label = "→→→" }; MenuItem deleteSavedPed = new MenuItem("Удалить сохраненный", "") { Label = "→→→", LeftIcon = MenuItem.Icon.WARNING }; MenuItem spawnByName = new MenuItem("Заспавнить по имени", ""); List <string> walkstyles = new List <string>() { "Нормальная", "Раненый", "Здоровяк", "Женская", "Гангстер", "Шикарная", "Сексуальная", "Бизнес", "Пьяный", "Хипстер" }; MenuListItem walkingStyle = new MenuListItem("Походка", walkstyles, 0, "Изменить походку."); List <string> clothingGlowAnimations = new List <string>() { "Вкл", "Выкл", "Фейд", "Вспышка" }; MenuListItem clothingGlowType = new MenuListItem("Подстветка одежды", clothingGlowAnimations, ClothingAnimationType, "Тип анимации светящейся одежды."); // Add items to the menu. menu.AddMenuItem(pedCustomization); menu.AddMenuItem(savePed); menu.AddMenuItem(spawnSavedPed); menu.AddMenuItem(deleteSavedPed); menu.AddMenuItem(walkingStyle); menu.AddMenuItem(clothingGlowType); if (IsAllowed(Permission.PACustomize)) { MenuController.BindMenuItem(menu, pedCustomizationMenu, pedCustomization); } else { pedCustomization.Enabled = false; pedCustomization.LeftIcon = MenuItem.Icon.LOCK; pedCustomization.Description = "~r~This option has been disabled by the server owner."; } if (IsAllowed(Permission.PASpawnSaved)) { MenuController.BindMenuItem(menu, spawnSavedPedMenu, spawnSavedPed); } else { spawnSavedPed.Enabled = false; spawnSavedPed.LeftIcon = MenuItem.Icon.LOCK; spawnSavedPed.Description = "~r~This option has been disabled by the server owner."; } MenuController.BindMenuItem(menu, deleteSavedPedMenu, deleteSavedPed); Menu addonPeds = new Menu("Спавнер", "Заспавнить аддон"); MenuItem addonPedsBtn = new MenuItem("Аддоны", "Выберите скин из аддонов."); menu.AddMenuItem(addonPedsBtn); MenuController.AddSubmenu(menu, addonPeds); if (AddonPeds != null) { if (AddonPeds.Count > 0) { if (IsAllowed(Permission.PAAddonPeds)) { addonPedsBtn.Label = "→→→"; foreach (KeyValuePair <string, uint> ped in AddonPeds) { var button = new MenuItem(ped.Key, "Использовать этот аддон."); addonPeds.AddMenuItem(button); if (!IsModelAPed(ped.Value) || !IsModelInCdimage(ped.Value)) { button.Enabled = false; button.LeftIcon = MenuItem.Icon.LOCK; button.Description = "This ped is not available on this server. Ask the server owner to fix this streamed model and verify the model spawn name."; } } addonPeds.OnItemSelect += async(sender, item, index) => { await SetPlayerSkin(AddonPeds.ElementAt(index).Value, new PedInfo() { version = -1 }); }; MenuController.BindMenuItem(menu, addonPeds, addonPedsBtn); } else { menu.RemoveMenuItem(addonPedsBtn); } } else { addonPedsBtn.Enabled = false; addonPedsBtn.Description = "This server does not have any addon peds available."; addonPedsBtn.LeftIcon = MenuItem.Icon.LOCK; } } else { addonPedsBtn.Enabled = false; addonPedsBtn.Description = "This server does not have any addon peds available."; addonPedsBtn.LeftIcon = MenuItem.Icon.LOCK; } addonPeds.RefreshIndex(); // Add the spawn by name button after the addon peds menu item. menu.AddMenuItem(spawnByName); if (!IsAllowed(Permission.PASpawnNew)) { spawnByName.Enabled = false; spawnByName.Description = "This option is disabled by the server owner or you are not allowed to use it."; spawnByName.LeftIcon = MenuItem.Icon.LOCK; } // Loop through all the modelNames and create lists of max 50 ped names each. if (IsAllowed(Permission.PASpawnNew)) { for (int i = 0; i < (modelNames.Count / 50) + 1; i++) { List <string> pedList = new List <string>(); for (int ii = 0; ii < 50; ii++) { int index = ((i * 50) + ii); if (index >= modelNames.Count) { break; } int max = ((modelNames.Count / 50) != i) ? 50 : modelNames.Count % 50; pedList.Add(modelNames[index] + $" ({(ii + 1).ToString()}/{max.ToString()})"); } MenuListItem pedl = new MenuListItem("Ped #" + (i + 1).ToString(), pedList, 0); if (IsAllowed(Permission.PASpawnNew)) { menu.AddMenuItem(pedl); //pedl.Enabled = false; //pedl.LeftIcon = MenuItem.Icon.LOCK; //pedl.Description = "This option has been disabled by the server owner."; } } } // Handle list selections. menu.OnListItemSelect += async(sender, item, listIndex, itemIndex) => { if (item == walkingStyle) { if (MainMenu.DebugMode) { Subtitle.Custom("Ped is: " + IsPedMale(Game.PlayerPed.Handle)); } SetWalkingStyle(walkstyles[listIndex].ToString()); } else if (item == clothingGlowType) { ClothingAnimationType = item.ListIndex; } else if (IsAllowed(Permission.PASpawnNew)) { int listsCount = (modelNames.Count / 50) + 1; int i = ((itemIndex - (sender.Size - listsCount)) * 50) + listIndex; string modelName = modelNames[i]; await SetPlayerSkin(modelName, new PedInfo() { version = -1 }); } }; // Handle button presses. menu.OnItemSelect += (sender, item, index) => { if (item == pedCustomization) { RefreshCustomizationMenu(); } else if (item == spawnSavedPed) { RefreshSpawnSavedPedMenu(); } else if (item == deleteSavedPed) { RefreshDeleteSavedPedMenu(); } else if (item == savePed) { SavePed(); } else if (item == spawnByName) { SpawnPedByName(); } }; // Handle saved ped spawning. spawnSavedPedMenu.OnItemSelect += (sender, item, idex) => { var name = item.Text.ToString(); LoadSavedPed(name, true); }; #region ped drawable list changes // Manage list changes. pedCustomizationMenu.OnListIndexChange += (sender, item, oldListIndex, newListIndex, itemIndex) => { if (drawablesMenuListItems.ContainsKey(item)) { int drawableID = drawablesMenuListItems[item]; SetPedComponentVariation(Game.PlayerPed.Handle, drawableID, newListIndex, 0, 0); } else if (propsMenuListItems.ContainsKey(item)) { int propID = propsMenuListItems[item]; if (newListIndex == 0) { SetPedPropIndex(Game.PlayerPed.Handle, propID, newListIndex - 1, 0, false); ClearPedProp(Game.PlayerPed.Handle, propID); } else { SetPedPropIndex(Game.PlayerPed.Handle, propID, newListIndex - 1, 0, true); } if (propID == 0) { int component = GetPedPropIndex(Game.PlayerPed.Handle, 0); // helmet index int texture = GetPedPropTextureIndex(Game.PlayerPed.Handle, 0); // texture int compHash = GetHashNameForProp(Game.PlayerPed.Handle, 0, component, texture); // prop combination hash if (N_0xd40aac51e8e4c663((uint)compHash) > 0) // helmet has visor. { if (!IsHelpMessageBeingDisplayed()) { BeginTextCommandDisplayHelp("TWOSTRINGS"); AddTextComponentSubstringPlayerName("Hold ~INPUT_SWITCH_VISOR~ to flip your helmet visor open or closed"); AddTextComponentSubstringPlayerName("when on foot or on a motorcycle and when vMenu is closed."); EndTextCommandDisplayHelp(0, false, true, 6000); } } } } }; // Manage list selections. pedCustomizationMenu.OnListItemSelect += (sender, item, listIndex, itemIndex) => { if (drawablesMenuListItems.ContainsKey(item)) // drawable { int currentDrawableID = drawablesMenuListItems[item]; int currentTextureIndex = GetPedTextureVariation(Game.PlayerPed.Handle, currentDrawableID); int maxDrawableTextures = GetNumberOfPedTextureVariations(Game.PlayerPed.Handle, currentDrawableID, listIndex) - 1; if (currentTextureIndex == -1) { currentTextureIndex = 0; } int newTexture = currentTextureIndex < maxDrawableTextures ? currentTextureIndex + 1 : 0; SetPedComponentVariation(Game.PlayerPed.Handle, currentDrawableID, listIndex, newTexture, 0); } else if (propsMenuListItems.ContainsKey(item)) // prop { int currentPropIndex = propsMenuListItems[item]; int currentPropVariationIndex = GetPedPropIndex(Game.PlayerPed.Handle, currentPropIndex); int currentPropTextureVariation = GetPedPropTextureIndex(Game.PlayerPed.Handle, currentPropIndex); int maxPropTextureVariations = GetNumberOfPedPropTextureVariations(Game.PlayerPed.Handle, currentPropIndex, currentPropVariationIndex) - 1; int newPropTextureVariationIndex = currentPropTextureVariation < maxPropTextureVariations ? currentPropTextureVariation + 1 : 0; SetPedPropIndex(Game.PlayerPed.Handle, currentPropIndex, currentPropVariationIndex, newPropTextureVariationIndex, true); } }; #endregion }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { menu = new Menu(Game.Player.Name, "封鎖玩家管理"); menu.InstructionalButtons.Add(Control.Jump, "篩選選項"); menu.ButtonPressHandlers.Add(new Menu.ButtonPressHandler(Control.Jump, Menu.ControlPressCheckType.JUST_RELEASED, new Action <Menu, Control>(async(a, b) => { if (banlist.Count > 1) { string filterText = await GetUserInput("篩選列表(按用戶名排序)(將此保留為空以重置過濾器!)"); if (string.IsNullOrEmpty(filterText)) { Subtitle.Custom("篩選列表已清除."); menu.ResetFilter(); UpdateBans(); } else { menu.FilterMenuItems(item => item.ItemData is BanRecord br && br.playerName.ToLower().Contains(filterText.ToLower())); Subtitle.Custom("用戶名過濾已套用."); } } else { Notify.Error("要使用過濾功能,至少需要兩位以上的封鎖玩家"); } Log($"Button pressed: {a} {b}"); }), true)); bannedPlayer.AddMenuItem(new MenuItem("玩家名字")); bannedPlayer.AddMenuItem(new MenuItem("封鎖人")); bannedPlayer.AddMenuItem(new MenuItem("解封時間")); bannedPlayer.AddMenuItem(new MenuItem("玩家識別碼")); bannedPlayer.AddMenuItem(new MenuItem("封鎖理由")); bannedPlayer.AddMenuItem(new MenuItem("~r~解封", "~r~警告,禁止玩家無法撤消。 在它們重新加入服務器之前,您將無法再次禁止它們。 您確定要取消該此玩家的封鎖嗎? 〜s〜提示:如果被禁的玩家在封鎖日期結束後他們仍可以進入伺服器.")); // should be enough for now to cover all possible identifiers. List <string> colors = new List <string>() { "~r~", "~g~", "~b~", "~o~", "~y~", "~p~", "~s~", "~t~", }; bannedPlayer.OnMenuClose += (sender) => { BaseScript.TriggerServerEvent("vMenu:RequestBanList", Game.Player.Handle); bannedPlayer.GetMenuItems()[5].Label = ""; UpdateBans(); }; bannedPlayer.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { bannedPlayer.GetMenuItems()[5].Label = ""; }; bannedPlayer.OnItemSelect += (sender, item, index) => { if (index == 5 && IsAllowed(Permission.OPUnban)) { if (item.Label == "您確定嗎?") { if (banlist.Contains(currentRecord)) { UnbanPlayer(banlist.IndexOf(currentRecord)); bannedPlayer.GetMenuItems()[5].Label = ""; bannedPlayer.GoBack(); } else { Notify.Error("您設法以某種方式單擊了取消禁止按鈕,但是您顯然正在查看的禁止記錄甚至不存在..."); } } else { item.Label = "您確定嗎?"; } } else { bannedPlayer.GetMenuItems()[5].Label = ""; } }; menu.OnItemSelect += (sender, item, index) => { //if (index < banlist.Count) //{ currentRecord = item.ItemData; bannedPlayer.MenuSubtitle = "封鎖理由: ~y~" + currentRecord.playerName; var nameItem = bannedPlayer.GetMenuItems()[0]; var bannedByItem = bannedPlayer.GetMenuItems()[1]; var bannedUntilItem = bannedPlayer.GetMenuItems()[2]; var playerIdentifiersItem = bannedPlayer.GetMenuItems()[3]; var banReasonItem = bannedPlayer.GetMenuItems()[4]; nameItem.Label = currentRecord.playerName; nameItem.Description = "玩家名字: ~y~" + currentRecord.playerName; bannedByItem.Label = currentRecord.bannedBy; bannedByItem.Description = "被 ~y~" + currentRecord.bannedBy + "封鎖"; if (currentRecord.bannedUntil.Date.Year == 3000) { bannedUntilItem.Label = "永遠"; } else { bannedUntilItem.Label = currentRecord.bannedUntil.Date.ToString(); } bannedUntilItem.Description = "這個玩家將再: " + currentRecord.bannedUntil.Date.ToString() + "後解鎖"; playerIdentifiersItem.Description = ""; int i = 0; foreach (string id in currentRecord.identifiers) { // only (admins) people that can unban players are allowed to view IP's. // this is just a slight 'safety' feature in case someone who doesn't know what they're doing // gave builtin.everyone access to view the banlist. if (id.StartsWith("ip:") && !IsAllowed(Permission.OPUnban)) { playerIdentifiersItem.Description += $"{colors[i]}ip: (hidden) "; } else { playerIdentifiersItem.Description += $"{colors[i]}{id.Replace(":", ": ")} "; } i++; } banReasonItem.Description = "封鎖理由: " + currentRecord.banReason; var unbanPlayerBtn = bannedPlayer.GetMenuItems()[5]; unbanPlayerBtn.Label = ""; if (!IsAllowed(Permission.OPUnban)) { unbanPlayerBtn.Enabled = false; unbanPlayerBtn.Description = "您不能取消玩家封鎖。 您只能查看其封鎖記錄."; unbanPlayerBtn.LeftIcon = MenuItem.Icon.LOCK; } bannedPlayer.RefreshIndex(); //} }; MenuController.AddMenu(bannedPlayer); }
private void CreateMenu() { currentChannel = channels[0]; if (IsAllowed(Permission.VCStaffChannel)) { channels.Add("Staff Channel"); } // Create the menu. menu = new Menu(Game.Player.Name, "語音聊天設置"); MenuCheckboxItem voiceChatEnabled = new MenuCheckboxItem("啟用語音聊天", "啟用/停用語音聊天.", EnableVoicechat); MenuCheckboxItem showCurrentSpeaker = new MenuCheckboxItem("顯示當前發言人", "顯示目前誰正在說話.", ShowCurrentSpeaker); MenuCheckboxItem showVoiceStatus = new MenuCheckboxItem("顯示麥克風狀態", "顯示麥克風目前是打開還是靜音.", ShowVoiceStatus); List <string> proximity = new List <string>() { "5 米", "10 米", "15 米", "20 米", "100 米", "300 米", "1 公里", "2 公里", "全域", }; MenuListItem voiceChatProximity = new MenuListItem("語音聊天距離", proximity, proximityRange.IndexOf(currentProximity), "將語音聊天接收距離設置."); MenuListItem voiceChatChannel = new MenuListItem("語音聊天頻道", channels, channels.IndexOf(currentChannel), "設置語音聊天頻道."); if (IsAllowed(Permission.VCEnable)) { menu.AddMenuItem(voiceChatEnabled); // Nested permissions because without voice chat enabled, you wouldn't be able to use these settings anyway. if (IsAllowed(Permission.VCShowSpeaker)) { menu.AddMenuItem(showCurrentSpeaker); } menu.AddMenuItem(voiceChatProximity); menu.AddMenuItem(voiceChatChannel); menu.AddMenuItem(showVoiceStatus); } menu.OnCheckboxChange += (sender, item, index, _checked) => { if (item == voiceChatEnabled) { EnableVoicechat = _checked; } else if (item == showCurrentSpeaker) { ShowCurrentSpeaker = _checked; } else if (item == showVoiceStatus) { ShowVoiceStatus = _checked; } }; menu.OnListIndexChange += (sender, item, oldIndex, newIndex, itemIndex) => { if (item == voiceChatProximity) { currentProximity = proximityRange[newIndex]; Subtitle.Custom($"新的語音聊天接近度設置為: ~b~{proximity[newIndex]}~s~."); } else if (item == voiceChatChannel) { currentChannel = channels[newIndex]; Subtitle.Custom($"新的語音聊天頻道設置為: ~b~{channels[newIndex]}~s~."); } }; }
/// <summary> /// Creates the menu(s). /// </summary> private void CreateMenu() { // Create the menu. menu = new UIMenu(GetPlayerName(PlayerId()), "Player Appearance", true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; //Create the submenus. spawnSavedPedMenu = new UIMenu("Saved Peds", "Spawn a saved ped", true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; deleteSavedPedMenu = new UIMenu("Saved Peds", "Delete a saved ped", true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; pedTextures = new UIMenu("Ped Customization", "Customize your ped", true) { ScaleWithSafezone = false, MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false }; // Add the (submenus) to the menu pool. MainMenu.Mp.Add(pedTextures); MainMenu.Mp.Add(spawnSavedPedMenu); MainMenu.Mp.Add(deleteSavedPedMenu); // Create the menu items. UIMenuItem pedCustomization = new UIMenuItem("Ped Customization", "Modify your ped's appearance."); pedCustomization.SetRightLabel("→→→"); UIMenuItem savePed = new UIMenuItem("Save Current Ped", "Save your current ped and clothes."); savePed.SetRightBadge(UIMenuItem.BadgeStyle.Tick); UIMenuItem spawnSavedPed = new UIMenuItem("Spawn Saved Ped", "Spawn one of your saved peds."); spawnSavedPed.SetRightLabel("→→→"); UIMenuItem deleteSavedPed = new UIMenuItem("Delete Saved Ped", "Delete one of your saved peds."); deleteSavedPed.SetRightLabel("→→→"); deleteSavedPed.SetLeftBadge(UIMenuItem.BadgeStyle.Alert); UIMenuItem spawnByName = new UIMenuItem("Spawn Ped By Name", "Enter a model name of a custom ped you want to spawn."); List <dynamic> walkstyles = new List <dynamic>() { "Normal", "Injured", "Tough Guy", "Femme", "Gangster", "Posh", "Sexy", "Business", "Drunk", "Hipster" }; UIMenuListItem walkingStyle = new UIMenuListItem("Walking Style", walkstyles, 0, "Change the walking style of your current ped. " + "You need to re-apply this each time you change player model or load a saved ped."); // Add items to the mneu. menu.AddItem(pedCustomization); menu.AddItem(savePed); menu.AddItem(spawnSavedPed); menu.AddItem(deleteSavedPed); menu.AddItem(walkingStyle); // Bind items to the submenus. if (cf.IsAllowed(Permission.PACustomize)) { menu.BindMenuToItem(pedTextures, pedCustomization); } else { pedCustomization.Enabled = false; pedCustomization.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); pedCustomization.Description = "This option has been disabled by the server owner."; } if (cf.IsAllowed(Permission.PASpawnSaved)) { menu.BindMenuToItem(spawnSavedPedMenu, spawnSavedPed); } else { spawnSavedPed.Enabled = false; spawnSavedPed.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); spawnSavedPed.Description = "This option has been disabled by the server owner."; } menu.BindMenuToItem(deleteSavedPedMenu, deleteSavedPed); UIMenu addonPeds = new UIMenu("Model Spawner", "Spawn Addon Ped", true) { MouseControlsEnabled = false, MouseEdgeEnabled = false, ControlDisablingEnabled = false, ScaleWithSafezone = false }; UIMenuItem addonPedsBtn = new UIMenuItem("Addon Peds", "Choose a player skin from the addons list available on this server."); menu.AddItem(addonPedsBtn); MainMenu.Mp.Add(addonPeds); if (AddonPeds != null) { if (AddonPeds.Count > 0) { addonPedsBtn.SetRightLabel("→→→"); foreach (KeyValuePair <string, uint> ped in AddonPeds) { var button = new UIMenuItem(ped.Key, "Click to use this ped."); addonPeds.AddItem(button); if (!IsModelAPed(ped.Value) || !IsModelInCdimage(ped.Value)) { button.Enabled = false; button.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); button.Description = "This ped is not available on this server. Are you sure the model is valid?"; } } addonPeds.OnItemSelect += (sender, item, index) => { if (item.Enabled) { cf.SetPlayerSkin(AddonPeds.ElementAt(index).Value, new CommonFunctions.PedInfo() { version = -1 }); } else { Notify.Error("This ped is not available. Please ask the server owner to verify this addon ped."); } }; menu.BindMenuToItem(addonPeds, addonPedsBtn); } else { addonPedsBtn.Enabled = false; addonPedsBtn.Description = "This server does not have any addon peds available."; addonPedsBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); } } else { addonPedsBtn.Enabled = false; addonPedsBtn.Description = "This server does not have any addon peds available."; addonPedsBtn.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); } addonPeds.RefreshIndex(); addonPeds.UpdateScaleform(); // Add the spawn by name button after the addon peds menu item. menu.AddItem(spawnByName); // Handle button presses. menu.OnItemSelect += (sender, item, index) => { if (item == pedCustomization) { RefreshCustomizationMenu(); } else if (item == spawnSavedPed) { RefreshSpawnSavedPedMenu(); } else if (item == deleteSavedPed) { RefreshDeleteSavedPedMenu(); } else if (item == savePed) { cf.SavePed(); } else if (item == spawnByName) { cf.SpawnPedByName(); } }; // Loop through all the modelNames and create lists of max 50 ped names each. for (int i = 0; i < (modelNames.Count / 50) + 1; i++) { List <dynamic> pedList = new List <dynamic>(); for (int ii = 0; ii < 50; ii++) { int index = ((i * 50) + ii); if (index >= modelNames.Count) { break; } int max = ((modelNames.Count / 50) != i) ? 50 : modelNames.Count % 50; pedList.Add(modelNames[index] + $" ({(ii + 1).ToString()}/{max.ToString()})"); } UIMenuListItem pedl = new UIMenuListItem("Peds #" + (i + 1).ToString(), pedList, 0); menu.AddItem(pedl); if (!cf.IsAllowed(Permission.PASpawnNew)) { pedl.Enabled = false; pedl.SetLeftBadge(UIMenuItem.BadgeStyle.Lock); pedl.Description = "This option has been disabled by the server owner."; } } // Handle list selections. menu.OnListSelect += (sender, item, index) => { if (item == walkingStyle) { Subtitle.Custom("Ped is: " + IsPedMale(PlayerPedId())); cf.SetWalkingStyle(walkstyles[index].ToString()); } else { int i = ((sender.CurrentSelection - 7) * 50) + index; string modelName = modelNames[i]; if (cf.IsAllowed(Permission.PASpawnNew)) { cf.SetPlayerSkin(modelName, new CommonFunctions.PedInfo() { version = -1 }); } } }; }
/// <summary> /// Creates the menu. /// </summary> private void CreateMenu() { // Setup weapon dictionaries. weaponInfo = new Dictionary <Menu, ValidWeapon>(); weaponComponents = new Dictionary <MenuItem, string>(); #region create main weapon options menu and add items // Create the menu. menu = new Menu(Game.Player.Name, "武器選單"); MenuItem getAllWeapons = new MenuItem("獲得所有武器", "獲得所有武器."); MenuItem removeAllWeapons = new MenuItem("移除所有武器", "移除所有武器"); MenuCheckboxItem unlimitedAmmo = new MenuCheckboxItem("無限子彈", "無限子彈.", UnlimitedAmmo); MenuCheckboxItem noReload = new MenuCheckboxItem("永不裝彈夾", "永不裝彈夾.", NoReload); MenuItem setAmmo = new MenuItem("設置所有彈藥計數", "設置所有彈藥計數"); MenuItem refillMaxAmmo = new MenuItem("所有的武器最大彈藥", "給所有的武器最大彈藥."); MenuItem spawnByName = new MenuItem("叫武器", "輸入一個武器名字來得到武器."); // Add items based on permissions if (IsAllowed(Permission.WPGetAll)) { menu.AddMenuItem(getAllWeapons); } if (IsAllowed(Permission.WPRemoveAll)) { menu.AddMenuItem(removeAllWeapons); } if (IsAllowed(Permission.WPUnlimitedAmmo)) { menu.AddMenuItem(unlimitedAmmo); } if (IsAllowed(Permission.WPNoReload)) { menu.AddMenuItem(noReload); } if (IsAllowed(Permission.WPSetAllAmmo)) { menu.AddMenuItem(setAmmo); menu.AddMenuItem(refillMaxAmmo); } if (IsAllowed(Permission.WPSpawnByName)) { menu.AddMenuItem(spawnByName); } #endregion #region addonweapons submenu MenuItem addonWeaponsBtn = new MenuItem("附加武器", "穿戴/移除 此服務器上可用的附加武器."); Menu addonWeaponsMenu = new Menu("附加武器", "穿戴/移除 附加武器"); menu.AddMenuItem(addonWeaponsBtn); #region manage creating and accessing addon weapons menu if (IsAllowed(Permission.WPSpawn) && AddonWeapons != null && AddonWeapons.Count > 0) { MenuController.BindMenuItem(menu, addonWeaponsMenu, addonWeaponsBtn); foreach (KeyValuePair <string, uint> weapon in AddonWeapons) { string name = weapon.Key.ToString(); uint model = weapon.Value; var item = new MenuItem(name, $"點擊添加/刪除武器 ({name})."); addonWeaponsMenu.AddMenuItem(item); if (!IsWeaponValid(model)) { item.Enabled = false; item.LeftIcon = MenuItem.Icon.LOCK; item.Description = "該模型不可用。 請確認伺服器是否有該資源."; } } addonWeaponsMenu.OnItemSelect += (sender, item, index) => { var weapon = AddonWeapons.ElementAt(index); if (HasPedGotWeapon(Game.PlayerPed.Handle, weapon.Value, false)) { RemoveWeaponFromPed(Game.PlayerPed.Handle, weapon.Value); } else { var maxAmmo = 200; GetMaxAmmo(Game.PlayerPed.Handle, weapon.Value, ref maxAmmo); GiveWeaponToPed(Game.PlayerPed.Handle, weapon.Value, maxAmmo, false, true); } }; addonWeaponsBtn.Label = "→→→"; } else { addonWeaponsBtn.LeftIcon = MenuItem.Icon.LOCK; addonWeaponsBtn.Enabled = false; addonWeaponsBtn.Description = "該模型不可用。 請確認伺服器是否有該資源."; } #endregion addonWeaponsMenu.RefreshIndex(); #endregion #region parachute options menu if (IsAllowed(Permission.WPParachute)) { // main parachute options menu setup Menu parachuteMenu = new Menu("降落傘選項", "降落傘選項"); MenuItem parachuteBtn = new MenuItem("降落傘選項", "可以在這裡更改所有與降落傘相關的選項.") { Label = "→→→" }; MenuController.AddSubmenu(menu, parachuteMenu); menu.AddMenuItem(parachuteBtn); MenuController.BindMenuItem(menu, parachuteMenu, parachuteBtn); List <string> chutes = new List <string>() { GetLabelText("PM_TINT0"), GetLabelText("PM_TINT1"), GetLabelText("PM_TINT2"), GetLabelText("PM_TINT3"), GetLabelText("PM_TINT4"), GetLabelText("PM_TINT5"), GetLabelText("PM_TINT6"), GetLabelText("PM_TINT7"), // broken in FiveM for some weird reason: GetLabelText("PS_CAN_0"), GetLabelText("PS_CAN_1"), GetLabelText("PS_CAN_2"), GetLabelText("PS_CAN_3"), GetLabelText("PS_CAN_4"), GetLabelText("PS_CAN_5") }; List <string> chuteDescriptions = new List <string>() { GetLabelText("PD_TINT0"), GetLabelText("PD_TINT1"), GetLabelText("PD_TINT2"), GetLabelText("PD_TINT3"), GetLabelText("PD_TINT4"), GetLabelText("PD_TINT5"), GetLabelText("PD_TINT6"), GetLabelText("PD_TINT7"), // broken in FiveM for some weird reason: GetLabelText("PSD_CAN_0") + " ~r~由於某種原因,這似乎不起作用.", GetLabelText("PSD_CAN_1") + " ~r~由於某種原因,這似乎不起作用.", GetLabelText("PSD_CAN_2") + " ~r~由於某種原因,這似乎不起作用.", GetLabelText("PSD_CAN_3") + " ~r~由於某種原因,這似乎不起作用.", GetLabelText("PSD_CAN_4") + " ~r~由於某種原因,這似乎不起作用.", GetLabelText("PSD_CAN_5") + " ~r~由於某種原因,這似乎不起作用." }; MenuItem togglePrimary = new MenuItem("切換主降落傘", "裝備或卸下主降落傘"); MenuItem toggleReserve = new MenuItem("啟用備用降落傘", "僅在已啟用主降落傘的情況下有效,備用降落傘一旦啟動,便無法從播放器上取下."); MenuListItem primaryChutes = new MenuListItem("主要降落傘", chutes, 0, $"主要降落傘: {chuteDescriptions[0]}"); MenuListItem secondaryChutes = new MenuListItem("備用降落傘", chutes, 0, $"備用降落傘: {chuteDescriptions[0]}"); MenuCheckboxItem unlimitedParachutes = new MenuCheckboxItem("無限降落傘", "啟用後使用降落傘後並不會扣除.", UnlimitedParachutes); MenuCheckboxItem autoEquipParachutes = new MenuCheckboxItem("自動穿戴降落傘", "進入飛機/直升機時自動裝備降落傘並保留降落傘.", AutoEquipChute); // smoke color list List <string> smokeColorsList = new List <string>() { GetLabelText("PM_TINT8"), // no smoke GetLabelText("PM_TINT9"), // red GetLabelText("PM_TINT10"), // orange GetLabelText("PM_TINT11"), // yellow GetLabelText("PM_TINT12"), // blue GetLabelText("PM_TINT13"), // black }; List <int[]> colors = new List <int[]>() { new int[3] { 255, 255, 255 }, new int[3] { 255, 0, 0 }, new int[3] { 255, 165, 0 }, new int[3] { 255, 255, 0 }, new int[3] { 0, 0, 255 }, new int[3] { 20, 20, 20 }, }; MenuListItem smokeColors = new MenuListItem("煙霧顏色", smokeColorsList, 0, "選擇煙霧顏色,然後按選擇進行更改,更改顏色需要4秒鐘且無法抽煙."); parachuteMenu.AddMenuItem(togglePrimary); parachuteMenu.AddMenuItem(toggleReserve); parachuteMenu.AddMenuItem(autoEquipParachutes); parachuteMenu.AddMenuItem(unlimitedParachutes); parachuteMenu.AddMenuItem(smokeColors); parachuteMenu.AddMenuItem(primaryChutes); parachuteMenu.AddMenuItem(secondaryChutes); parachuteMenu.OnItemSelect += (sender, item, index) => { if (item == togglePrimary) { if (HasPedGotWeapon(Game.PlayerPed.Handle, (uint)GetHashKey("gadget_parachute"), false)) { Subtitle.Custom("主要降落傘已移除."); RemoveWeaponFromPed(Game.PlayerPed.Handle, (uint)GetHashKey("gadget_parachute")); } else { Subtitle.Custom("主要降落傘已新增."); GiveWeaponToPed(Game.PlayerPed.Handle, (uint)GetHashKey("gadget_parachute"), 0, false, false); } } else if (item == toggleReserve) { SetPlayerHasReserveParachute(Game.Player.Handle); Subtitle.Custom("備用降落傘已新增."); } }; parachuteMenu.OnCheckboxChange += (sender, item, index, _checked) => { if (item == unlimitedParachutes) { UnlimitedParachutes = _checked; } else if (item == autoEquipParachutes) { AutoEquipChute = _checked; } }; bool switching = false; async void IndexChangedEventHandler(Menu sender, MenuListItem item, int oldIndex, int newIndex, int itemIndex) { if (item == smokeColors && oldIndex == -1) { if (!switching) { switching = true; SetPlayerCanLeaveParachuteSmokeTrail(Game.Player.Handle, false); await Delay(4000); int[] color = colors[newIndex]; SetPlayerParachuteSmokeTrailColor(Game.Player.Handle, color[0], color[1], color[2]); SetPlayerCanLeaveParachuteSmokeTrail(Game.Player.Handle, newIndex != 0); switching = false; } } else if (item == primaryChutes) { item.Description = $"主要降落傘: {chuteDescriptions[newIndex]}"; SetPlayerParachuteTintIndex(Game.Player.Handle, newIndex); } else if (item == secondaryChutes) { item.Description = $"備用降落傘: {chuteDescriptions[newIndex]}"; SetPlayerReserveParachuteTintIndex(Game.Player.Handle, newIndex); } } parachuteMenu.OnListItemSelect += (sender, item, index, itemIndex) => IndexChangedEventHandler(sender, item, -1, index, itemIndex); parachuteMenu.OnListIndexChange += IndexChangedEventHandler; } #endregion #region Create Weapon Category Submenus MenuItem spacer = GetSpacerMenuItem("↓ 武器類別 ↓"); menu.AddMenuItem(spacer); Menu handGuns = new Menu("武器類", "手槍"); MenuItem handGunsBtn = new MenuItem("手槍"); Menu rifles = new Menu("武器類", "突襲步槍"); MenuItem riflesBtn = new MenuItem("突襲步槍"); Menu shotguns = new Menu("武器類", "散彈槍"); MenuItem shotgunsBtn = new MenuItem("散彈槍"); Menu smgs = new Menu("武器類", "輕型機槍"); MenuItem smgsBtn = new MenuItem("輕型機槍"); Menu throwables = new Menu("武器類", "投擲武器"); MenuItem throwablesBtn = new MenuItem("投擲武器"); Menu melee = new Menu("武器類", "近戰武器"); MenuItem meleeBtn = new MenuItem("近戰武器"); Menu heavy = new Menu("武器類", "重型武器"); MenuItem heavyBtn = new MenuItem("重型武器"); Menu snipers = new Menu("武器類", "狙擊步槍"); MenuItem snipersBtn = new MenuItem("狙擊步槍"); MenuController.AddSubmenu(menu, handGuns); MenuController.AddSubmenu(menu, rifles); MenuController.AddSubmenu(menu, shotguns); MenuController.AddSubmenu(menu, smgs); MenuController.AddSubmenu(menu, throwables); MenuController.AddSubmenu(menu, melee); MenuController.AddSubmenu(menu, heavy); MenuController.AddSubmenu(menu, snipers); #endregion #region Setup weapon category buttons and submenus. handGunsBtn.Label = "→→→"; menu.AddMenuItem(handGunsBtn); MenuController.BindMenuItem(menu, handGuns, handGunsBtn); riflesBtn.Label = "→→→"; menu.AddMenuItem(riflesBtn); MenuController.BindMenuItem(menu, rifles, riflesBtn); shotgunsBtn.Label = "→→→"; menu.AddMenuItem(shotgunsBtn); MenuController.BindMenuItem(menu, shotguns, shotgunsBtn); smgsBtn.Label = "→→→"; menu.AddMenuItem(smgsBtn); MenuController.BindMenuItem(menu, smgs, smgsBtn); throwablesBtn.Label = "→→→"; menu.AddMenuItem(throwablesBtn); MenuController.BindMenuItem(menu, throwables, throwablesBtn); meleeBtn.Label = "→→→"; menu.AddMenuItem(meleeBtn); MenuController.BindMenuItem(menu, melee, meleeBtn); heavyBtn.Label = "→→→"; menu.AddMenuItem(heavyBtn); MenuController.BindMenuItem(menu, heavy, heavyBtn); snipersBtn.Label = "→→→"; menu.AddMenuItem(snipersBtn); MenuController.BindMenuItem(menu, snipers, snipersBtn); #endregion #region Loop through all weapons, create menus for them and add all menu items and handle events. foreach (ValidWeapon weapon in ValidWeapons.WeaponList) { uint cat = (uint)GetWeapontypeGroup(weapon.Hash); if (!string.IsNullOrEmpty(weapon.Name) && IsAllowed(weapon.Perm)) { //Log($"[DEBUG LOG] [WEAPON-BUG] {weapon.Name} - {weapon.Perm} = {IsAllowed(weapon.Perm)} & All = {IsAllowed(Permission.WPGetAll)}"); #region Create menu for this weapon and add buttons Menu weaponMenu = new Menu("武器選單", weapon.Name) { ShowWeaponStatsPanel = true }; var stats = new Game.WeaponHudStats(); Game.GetWeaponHudStats(weapon.Hash, ref stats); weaponMenu.SetWeaponStats((float)stats.hudDamage / 100f, (float)stats.hudSpeed / 100f, (float)stats.hudAccuracy / 100f, (float)stats.hudRange / 100f); MenuItem weaponItem = new MenuItem(weapon.Name, $"打開以下選項 ~y~{weapon.Name}~s~.") { Label = "→→→", LeftIcon = MenuItem.Icon.GUN, ItemData = stats }; weaponInfo.Add(weaponMenu, weapon); MenuItem getOrRemoveWeapon = new MenuItem("穿戴/移除武器", "") { LeftIcon = MenuItem.Icon.GUN }; weaponMenu.AddMenuItem(getOrRemoveWeapon); if (!IsAllowed(Permission.WPSpawn)) { getOrRemoveWeapon.Enabled = false; getOrRemoveWeapon.Description = "您沒有權限使用此功能."; getOrRemoveWeapon.LeftIcon = MenuItem.Icon.LOCK; } MenuItem fillAmmo = new MenuItem("補充彈藥", "補充所有武器的最大數量.") { LeftIcon = MenuItem.Icon.AMMO }; weaponMenu.AddMenuItem(fillAmmo); List <string> tints = new List <string>(); 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); } } MenuListItem weaponTints = new MenuListItem("塗裝", tints, 0, "對您的武器做塗裝."); weaponMenu.AddMenuItem(weaponTints); #endregion #region Handle weapon specific list changes weaponMenu.OnListIndexChange += (sender, item, oldIndex, newIndex, itemIndex) => { if (item == weaponTints) { if (HasPedGotWeapon(Game.PlayerPed.Handle, weaponInfo[sender].Hash, false)) { SetPedWeaponTintIndex(Game.PlayerPed.Handle, weaponInfo[sender].Hash, newIndex); } else { Notify.Error("您需要一把武器!"); } } }; #endregion #region Handle weapon specific button presses weaponMenu.OnItemSelect += (sender, item, index) => { var info = weaponInfo[sender]; uint hash = info.Hash; SetCurrentPedWeapon(Game.PlayerPed.Handle, hash, true); if (item == getOrRemoveWeapon) { if (HasPedGotWeapon(Game.PlayerPed.Handle, hash, false)) { RemoveWeaponFromPed(Game.PlayerPed.Handle, hash); Subtitle.Custom("武器已經移除."); } else { var ammo = 255; GetMaxAmmo(Game.PlayerPed.Handle, hash, ref ammo); GiveWeaponToPed(Game.PlayerPed.Handle, hash, ammo, false, true); Subtitle.Custom("武器已經添加."); } } else if (item == fillAmmo) { if (HasPedGotWeapon(Game.PlayerPed.Handle, hash, false)) { var ammo = 900; GetMaxAmmo(Game.PlayerPed.Handle, hash, ref ammo); SetPedAmmo(Game.PlayerPed.Handle, hash, ammo); } else { Notify.Error("您需要一把武器!"); } } }; #endregion #region load components if (weapon.Components != null) { if (weapon.Components.Count > 0) { foreach (var comp in weapon.Components) { //Log($"{weapon.Name} : {comp.Key}"); MenuItem compItem = new MenuItem(comp.Key, "點擊來進行配備整理."); weaponComponents.Add(compItem, comp.Key); weaponMenu.AddMenuItem(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(Game.PlayerPed.Handle, Weapon.Hash, false)) { SetCurrentPedWeapon(Game.PlayerPed.Handle, Weapon.Hash, true); if (HasPedGotWeaponComponent(Game.PlayerPed.Handle, Weapon.Hash, componentHash)) { RemoveWeaponComponentFromPed(Game.PlayerPed.Handle, Weapon.Hash, componentHash); Subtitle.Custom("配件已經刪除."); } else { int ammo = GetAmmoInPedWeapon(Game.PlayerPed.Handle, Weapon.Hash); int clipAmmo = GetMaxAmmoInClip(Game.PlayerPed.Handle, Weapon.Hash, false); GetAmmoInClip(Game.PlayerPed.Handle, Weapon.Hash, ref clipAmmo); GiveWeaponComponentToPed(Game.PlayerPed.Handle, Weapon.Hash, componentHash); SetAmmoInClip(Game.PlayerPed.Handle, Weapon.Hash, clipAmmo); SetPedAmmo(Game.PlayerPed.Handle, Weapon.Hash, ammo); Subtitle.Custom("配件已經裝備."); } } else { Notify.Error("您需要一把武器."); } } }; #endregion } } } #endregion // refresh and add to menu. weaponMenu.RefreshIndex(); if (cat == 970310034) // 970310034 rifles { MenuController.AddSubmenu(rifles, weaponMenu); MenuController.BindMenuItem(rifles, weaponMenu, weaponItem); rifles.AddMenuItem(weaponItem); } else if (cat == 416676503 || cat == 690389602) // 416676503 hand guns // 690389602 stun gun { MenuController.AddSubmenu(handGuns, weaponMenu); MenuController.BindMenuItem(handGuns, weaponMenu, weaponItem); handGuns.AddMenuItem(weaponItem); } else if (cat == 860033945) // 860033945 shotguns { MenuController.AddSubmenu(shotguns, weaponMenu); MenuController.BindMenuItem(shotguns, weaponMenu, weaponItem); shotguns.AddMenuItem(weaponItem); } else if (cat == 3337201093 || cat == 1159398588) // 3337201093 sub machine guns // 1159398588 light machine guns { MenuController.AddSubmenu(smgs, weaponMenu); MenuController.BindMenuItem(smgs, weaponMenu, weaponItem); smgs.AddMenuItem(weaponItem); } else if (cat == 1548507267 || cat == 4257178988 || cat == 1595662460) // 1548507267 throwables // 4257178988 fire extinghuiser // jerry can { MenuController.AddSubmenu(throwables, weaponMenu); MenuController.BindMenuItem(throwables, weaponMenu, weaponItem); throwables.AddMenuItem(weaponItem); } else if (cat == 3566412244 || cat == 2685387236) // 3566412244 melee weapons // 2685387236 knuckle duster { MenuController.AddSubmenu(melee, weaponMenu); MenuController.BindMenuItem(melee, weaponMenu, weaponItem); melee.AddMenuItem(weaponItem); } else if (cat == 2725924767) // 2725924767 heavy weapons { MenuController.AddSubmenu(heavy, weaponMenu); MenuController.BindMenuItem(heavy, weaponMenu, weaponItem); heavy.AddMenuItem(weaponItem); } else if (cat == 3082541095) // 3082541095 sniper rifles { MenuController.AddSubmenu(snipers, weaponMenu); MenuController.BindMenuItem(snipers, weaponMenu, weaponItem); snipers.AddMenuItem(weaponItem); } } } #endregion #region Disable submenus if no weapons in that category are allowed. if (handGuns.Size == 0) { handGunsBtn.LeftIcon = MenuItem.Icon.LOCK; handGunsBtn.Description = "無法使用因為伺服器尚未載入該資源"; handGunsBtn.Enabled = false; } if (rifles.Size == 0) { riflesBtn.LeftIcon = MenuItem.Icon.LOCK; riflesBtn.Description = "無法使用因為伺服器尚未載入該資源"; riflesBtn.Enabled = false; } if (shotguns.Size == 0) { shotgunsBtn.LeftIcon = MenuItem.Icon.LOCK; shotgunsBtn.Description = "無法使用因為伺服器尚未載入該資源"; shotgunsBtn.Enabled = false; } if (smgs.Size == 0) { smgsBtn.LeftIcon = MenuItem.Icon.LOCK; smgsBtn.Description = "無法使用因為伺服器尚未載入該資源"; smgsBtn.Enabled = false; } if (throwables.Size == 0) { throwablesBtn.LeftIcon = MenuItem.Icon.LOCK; throwablesBtn.Description = "無法使用因為伺服器尚未載入該資源"; throwablesBtn.Enabled = false; } if (melee.Size == 0) { meleeBtn.LeftIcon = MenuItem.Icon.LOCK; meleeBtn.Description = "無法使用因為伺服器尚未載入該資源"; meleeBtn.Enabled = false; } if (heavy.Size == 0) { heavyBtn.LeftIcon = MenuItem.Icon.LOCK; heavyBtn.Description = "無法使用因為伺服器尚未載入該資源"; heavyBtn.Enabled = false; } if (snipers.Size == 0) { snipersBtn.LeftIcon = MenuItem.Icon.LOCK; snipersBtn.Description = "無法使用因為伺服器尚未載入該資源"; snipersBtn.Enabled = false; } #endregion #region Handle button presses menu.OnItemSelect += (sender, item, index) => { Ped ped = new Ped(Game.PlayerPed.Handle); if (item == getAllWeapons) { foreach (ValidWeapon vw in ValidWeapons.WeaponList) { if (IsAllowed(vw.Perm)) { GiveWeaponToPed(Game.PlayerPed.Handle, vw.Hash, vw.GetMaxAmmo, false, true); int ammoInClip = GetMaxAmmoInClip(Game.PlayerPed.Handle, vw.Hash, false); SetAmmoInClip(Game.PlayerPed.Handle, vw.Hash, ammoInClip); int ammo = 0; GetMaxAmmo(Game.PlayerPed.Handle, vw.Hash, ref ammo); SetPedAmmo(Game.PlayerPed.Handle, vw.Hash, ammo); } } SetCurrentPedWeapon(Game.PlayerPed.Handle, (uint)GetHashKey("weapon_unarmed"), true); } else if (item == removeAllWeapons) { ped.Weapons.RemoveAll(); } else if (item == setAmmo) { SetAllWeaponsAmmo(); } else if (item == refillMaxAmmo) { foreach (ValidWeapon vw in ValidWeapons.WeaponList) { if (HasPedGotWeapon(Game.PlayerPed.Handle, vw.Hash, false)) { int ammoInClip = GetMaxAmmoInClip(Game.PlayerPed.Handle, vw.Hash, false); SetAmmoInClip(Game.PlayerPed.Handle, vw.Hash, ammoInClip); int ammo = 0; GetMaxAmmo(Game.PlayerPed.Handle, vw.Hash, ref ammo); SetPedAmmo(Game.PlayerPed.Handle, vw.Hash, ammo); } } } else if (item == spawnByName) { SpawnCustomWeapon(); } }; #endregion #region Handle checkbox changes menu.OnCheckboxChange += (sender, item, index, _checked) => { if (item == noReload) { NoReload = _checked; Subtitle.Custom($"永不裝彈夾 {(_checked ? "啟用" : "禁用")}."); } else if (item == unlimitedAmmo) { UnlimitedAmmo = _checked; Subtitle.Custom($"無限彈藥已 {(_checked ? "啟用" : "禁用")}."); } }; #endregion void OnIndexChange(Menu m, MenuItem i) { if (i.ItemData is Game.WeaponHudStats stats) { m.SetWeaponStats((float)stats.hudDamage / 100f, (float)stats.hudSpeed / 100f, (float)stats.hudAccuracy / 100f, (float)stats.hudRange / 100f); m.ShowWeaponStatsPanel = true; } else { m.ShowWeaponStatsPanel = false; } } handGuns.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; rifles.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; shotguns.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; smgs.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; throwables.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; melee.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; heavy.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; snipers.OnIndexChange += (sender, oldItem, newItem, oldIndex, newIndex) => { OnIndexChange(sender, newItem); }; handGuns.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; rifles.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; shotguns.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; smgs.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; throwables.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; melee.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; heavy.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; snipers.OnMenuOpen += (sender) => { OnIndexChange(sender, sender.GetCurrentMenuItem()); }; }
private void CreateMenu() { currentChannel = channels[0]; if (IsAllowed(Permission.VCStaffChannel)) { channels.Add("Staff Channel"); } // Create the menu. menu = new Menu("YDDY:RP", "Настройки голосового чата"); MenuCheckboxItem voiceChatEnabled = new MenuCheckboxItem("Включить голосовой чат", "", EnableVoicechat); MenuCheckboxItem showCurrentSpeaker = new MenuCheckboxItem("Показывать говорящего", "", ShowCurrentSpeaker); MenuCheckboxItem showVoiceStatus = new MenuCheckboxItem("Статус микрофона", "", ShowVoiceStatus); List <string> proximity = new List <string>() { "5 m", "10 m", "15 m", "20 m", "100 m", "300 m", "1 km", "2 km", "Глобальный", }; MenuListItem voiceChatProximity = new MenuListItem("Дальность чата", proximity, proximityRange.IndexOf(currentProximity), "Дальность слышимости голосового чата."); MenuListItem voiceChatChannel = new MenuListItem("Канал голосовго чата", channels, channels.IndexOf(currentChannel), ""); if (IsAllowed(Permission.VCEnable)) { menu.AddMenuItem(voiceChatEnabled); // Nested permissions because without voice chat enabled, you wouldn't be able to use these settings anyway. if (IsAllowed(Permission.VCShowSpeaker)) { menu.AddMenuItem(showCurrentSpeaker); } menu.AddMenuItem(voiceChatProximity); menu.AddMenuItem(voiceChatChannel); menu.AddMenuItem(showVoiceStatus); } menu.OnCheckboxChange += (sender, item, index, _checked) => { if (item == voiceChatEnabled) { EnableVoicechat = _checked; } else if (item == showCurrentSpeaker) { ShowCurrentSpeaker = _checked; } else if (item == showVoiceStatus) { ShowVoiceStatus = _checked; } }; menu.OnListIndexChange += (sender, item, oldIndex, newIndex, itemIndex) => { if (item == voiceChatProximity) { currentProximity = proximityRange[newIndex]; Subtitle.Custom($"Новая дальность: ~b~{proximity[newIndex]}~s~."); } else if (item == voiceChatChannel) { currentChannel = channels[newIndex]; Subtitle.Custom($"Новый канал: ~b~{channels[newIndex]}~s~."); } }; }