From 09630f0a4e8d31a42a03f671cd875390ace9c7de Mon Sep 17 00:00:00 2001 From: Tom Grobbe <31419184+TomGrobbe@users.noreply.github.com> Date: Sun, 18 Feb 2018 22:06:27 +0100 Subject: [PATCH 1/8] starting fresh --- vMenu/menus/OnlinePlayersMenu.cs | 199 ------------ vMenu/menus/PlayerOptionsMenu.cs | 412 ------------------------- vMenuServer/CitizenFX.Core.dll | Bin 161792 -> 0 bytes vMenuServer/EventManager.cs | 19 -- vMenuServer/HttpHelper.cs | 104 ------- vMenuServer/Properties/AssemblyInfo.cs | 36 --- vMenuServer/UpdateChecker.cs | 60 ---- vMenuServer/__resource.lua | 24 -- vMenuServer/packages.config | 4 - vMenuServer/vMenuServer.csproj | 65 ---- 10 files changed, 923 deletions(-) delete mode 100644 vMenu/menus/OnlinePlayersMenu.cs delete mode 100644 vMenu/menus/PlayerOptionsMenu.cs delete mode 100644 vMenuServer/CitizenFX.Core.dll delete mode 100644 vMenuServer/EventManager.cs delete mode 100644 vMenuServer/HttpHelper.cs delete mode 100644 vMenuServer/Properties/AssemblyInfo.cs delete mode 100644 vMenuServer/UpdateChecker.cs delete mode 100644 vMenuServer/__resource.lua delete mode 100644 vMenuServer/packages.config delete mode 100644 vMenuServer/vMenuServer.csproj diff --git a/vMenu/menus/OnlinePlayersMenu.cs b/vMenu/menus/OnlinePlayersMenu.cs deleted file mode 100644 index 4a811f74..00000000 --- a/vMenu/menus/OnlinePlayersMenu.cs +++ /dev/null @@ -1,199 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using CitizenFX.Core; -using static CitizenFX.Core.Native.API; -using NativeUI; - -namespace vMenuClient.menus -{ - class OnlinePlayersMenu : BaseScript - { - // Variables - private UIMenu menu; - private CommonFunctions cf = new CommonFunctions(); - private Notification Notify = new Notification(); - - #region constructor - /// - /// Constructor. - /// Creates the menu. - /// - public OnlinePlayersMenu() - { - menu = new UIMenu("Online Players", "Currently connected players.") - { - ControlDisablingEnabled = false, - ScaleWithSafezone = true - }; - RefreshMenu(); - UIMenuItem onlinePlayersMenuBtn = new UIMenuItem("Online Players", "Online players in this server."); - MainMenu.menu.AddItem(onlinePlayersMenuBtn); - MainMenu.menu.BindMenuToItem(menu, onlinePlayersMenuBtn); - - // If the online players menu closes, reopen the main menu. - menu.OnMenuClose += (sender2) => - { - menu.Visible = false; - MainMenu.menu.Visible = true; - }; - - MainMenu._mp.Add(menu); - } - #endregion - - #region Public getter for the menu. - /// - /// Public getter for the menu. - /// - //public UIMenu Menu - //{ - // get - // { - // return menu; - // } - //} - #endregion - - #region Refresh / initialize the menu. - /// - /// Updates the menu (updated playerlist). - /// - public void RefreshMenu() - { - // Remove all current players. - for (var i = 0; i < menu.MenuItems.Count; i++) - { - menu.RemoveItemAt(i); - } - - // Loop through all online players, and add them to the list if they exist. - // Made it 64 so it's already future proof ;^) - for (var i = 0; i < 64; i++) - { - // If the player exists. - if (NetworkIsPlayerActive(i)) - { - // Create a new button for that player. - UIMenuItem playerItem = new UIMenuItem(GetPlayerServerId(i) + " " + GetPlayerName(i), "Open the player options for " + GetPlayerName(i)); - // Add the button to the menu. - menu.AddItem(playerItem); - - // Handle button selected event. - menu.OnItemSelect += (sender, item, index) => - { - // If the button is the player button, then... - if (item == playerItem) - { - var playerIndex = i; - string playerName = GetPlayerName(playerIndex); - if (playerIndex == PlayerId()) - { - playerName += " (me)"; - } - - // ...Create a new menu for that player. - UIMenu playerMenu = new UIMenu("[" + GetPlayerServerId(playerIndex).ToString() + "] " + playerName, "Server ID: " + GetPlayerServerId(playerIndex)); - // Create all player options buttons. - UIMenuItem teleportBtn = new UIMenuItem("Teleport to Player", "Teleport to this player."); - UIMenuItem teleportInVehBtn = new UIMenuItem("Teleport into Vehicle", "Telepor into the player's vehicle."); - UIMenuItem setWaypointBtn = new UIMenuItem("Set waypoint", "Set a waypoint to this player."); - UIMenuItem spectateBtn = new UIMenuItem("Spectate Player", "Spectate this player."); - UIMenuItem summonBtn = new UIMenuItem("Summon Player", "Teleport the player in front of you."); - UIMenuItem killBtn = new UIMenuItem("Kill Player", "Kill the other player!"); - UIMenuItem kickPlayerBtn = new UIMenuItem("Kick Player", "Kick the player from the server."); - kickPlayerBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); - - // Add all buttons to the player options submenu. - playerMenu.AddItem(teleportBtn); - playerMenu.AddItem(teleportInVehBtn); - playerMenu.AddItem(setWaypointBtn); - playerMenu.AddItem(spectateBtn); - playerMenu.AddItem(summonBtn); - playerMenu.AddItem(killBtn); - playerMenu.AddItem(kickPlayerBtn); - - // Set the player options submenu visible, and the player list menu hidden. - playerMenu.Visible = true; - menu.Visible = false; - - // If a button is pressed in the player's options menu. - playerMenu.OnItemSelect += (sender2, item2, index2) => - { - // Teleport button is pressed. - if (item2 == teleportBtn) - { - //Vector3 playerPos = GetEntityCoords(GetPlayerPed(playerIndex), true); - //SetPedCoordsKeepVehicle(PlayerPedId(), playerPos.X, playerPos.Y, playerPos.Z + 2.0f); - cf.TeleportToPlayerAsync(playerIndex, false); - } - // Teleport in vehicle button is pressed. - else if (item2 == teleportInVehBtn) - { - cf.TeleportToPlayerAsync(playerIndex, true); - } - // Set waypoint button is pressed. - else if (item2 == setWaypointBtn) - { - CitizenFX.Core.World.WaypointPosition = GetEntityCoords(GetPlayerPed(playerIndex), true); - Notify.Info("A new waypoint has been set to " + playerName, false, false); - } - // Spectate player button is pressed. - else if (item2 == spectateBtn) - { - if (playerIndex == PlayerId()) - { - Notify.Error("You can ~h~not ~w~spectate yourself!"); - } - else - { - cf.Spectate(playerIndex); - } - } - // Summon player button is pressed. - else if (item2 == summonBtn) - { - TriggerServerEvent("vMenu:TeleportPlayer", GetPlayerServerId(playerIndex)); - } - // Kill player button is pressed. - else if (item2 == killBtn) - { - TriggerServerEvent("vMenu:KillPlayer", GetPlayerServerId(playerIndex)); - } - // Kick player button is pressed. - else if (item2 == kickPlayerBtn) - { - TriggerServerEvent("vMenu:KickPlayer", GetPlayerServerId(playerIndex)); - playerMenu.Visible = false; - RefreshMenu(); - menu.RefreshIndex(); - menu.Visible = true; - } - }; - - // If the player options menu closes, reopen the playerlist menu. - playerMenu.OnMenuClose += (sender3) => - { - playerMenu.Visible = false; - menu.Visible = true; - }; - - // Re-enable controls & refresh index. - playerMenu.ControlDisablingEnabled = false; - playerMenu.RefreshIndex(); - - // Add the menu to the Menu Pool. - MainMenu._mp.Add(playerMenu); - } - }; - - menu.RefreshIndex(); - } - } - } - #endregion - - } -} diff --git a/vMenu/menus/PlayerOptionsMenu.cs b/vMenu/menus/PlayerOptionsMenu.cs deleted file mode 100644 index c5ac1a50..00000000 --- a/vMenu/menus/PlayerOptionsMenu.cs +++ /dev/null @@ -1,412 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using CitizenFX.Core; -using static CitizenFX.Core.Native.API; -using NativeUI; - -namespace vMenuClient.menus -{ - class PlayerOptionsMenu : BaseScript - { - // Variables - private UIMenu menu; - private CommonFunctions cf = new CommonFunctions(); - private Notification Notify = new Notification(); - private Subtitles Subtitle = new Subtitles(); - - private bool firstTick = true; - - private bool godMode = false; - private bool invisible = false; - private bool unlimitedStamina = true; - private bool superJump = false; - private bool noRagdoll = false; - private bool neverWanted = false; - private bool everyoneIgnoresPlayer = false; - private bool playerFrozen = false; - // will be implemented later: private bool driving = false; - private int IsPlayingScenario = -1; - - /// - /// Constructor. - /// - public PlayerOptionsMenu() - { - CreateMenu(); - - Tick += OnTick; - Tick += ScenarioTick; - } - - #region Public getter for the menu. - /// - /// Public getter for the menu. - /// - //public UIMenu Menu - //{ - // get - // { - // return menu; - // } - //} - #endregion - - #region OnTick Tasks - /// - /// OnTick used for all basic options that need to be set every tick. - /// - /// - private async Task OnTick() - { - // Just here to stop the annoying build warnings about no "Await in async task". - if (firstTick) - { - firstTick = false; - await Delay(0); - } - - // God mode - SetEntityInvincible(PlayerPedId(), godMode); - - // Invisibility - SetEntityVisible(PlayerPedId(), !invisible, false); - - // Unlimited Stamina - if (unlimitedStamina) - { - ResetPlayerStamina(PlayerId()); - } - - // Super Jump - if (superJump) - { - SetSuperJumpThisFrame(PlayerId()); - } - - // No Ragdoll - SetPedCanRagdoll(PlayerPedId(), !noRagdoll); - SetPedCanRagdollFromPlayerImpact(PlayerPedId(), !noRagdoll); - - // Never Wanted - if (neverWanted && GetPlayerWantedLevel(PlayerId()) > 0) - { - ClearPlayerWantedLevel(PlayerId()); - } - - // Everyone Ignores Player - SetEveryoneIgnorePlayer(PlayerId(), everyoneIgnoresPlayer); - } - - /// - /// OnTick used for playing/stopping scenarios. - /// - /// - private async Task ScenarioTick() - { - // Each game tick, check if the player is using a scenario. - if (IsPlayingScenario != -1) - { - // If so, set the current scenario to the playing scenario. - var currentScenario = IsPlayingScenario; - // Then loop below and wait until the player is no longer playing a scenario (IsPlayingScenario == -1). - while (IsPlayingScenario != -1) - { - // Wait to prevent crashing. - await Delay(0); - // If the scenario is not the "current" scenario and it's not -1 ( = no scenario) then: - if (IsPlayingScenario != currentScenario && IsPlayingScenario != -1) - { - if (CanPlayScenarios()) - { - // Clear the tasks (any scenarios). - ClearPedTasks(PlayerPedId()); - // Start the new scenario. - TaskStartScenarioInPlace(PlayerPedId(), PedScenarios.ScenarioNames[PedScenarios.Scenarios[IsPlayingScenario]], 0, true); - // Set the current scenario to be the new scenario. - currentScenario = IsPlayingScenario; - } - else - { - Notify.Alert("You can only start a scenario if you're standing still, and you're not inside any vehicle."); - ClearPedTasksImmediately(PlayerPedId()); - IsPlayingScenario = -1; - currentScenario = IsPlayingScenario; - } - - } - // Keep looping until the scenario id = -1s - } - // When it's -1, clear the player tasks once. - if (IsPlayingScenario == -1) - { - ClearPedTasks(PlayerPedId()); - } - // Then go back to the regular OnTick loop and wait for any new scenarios to be selected. - } - } - #endregion - - #region Create the Main Menu. - /// - /// Create the Player Options menu. - /// - private void CreateMenu() - { - // Create the menu. - menu = new UIMenu("Player Options", "Common player options.") - { - ControlDisablingEnabled = false, - ScaleWithSafezone = true - }; - - #region Create Menu Items - // Checkboxes - UIMenuCheckboxItem playerGodModeCheckbox = new UIMenuCheckboxItem("God Mode", godMode, "If you turn this on, you won't take any damage."); - UIMenuCheckboxItem invisibleCheckbox = new UIMenuCheckboxItem("Invisibility", invisible, "If you turn this on, you will become invisible."); - UIMenuCheckboxItem unlimitedStaminaCheckbox = new UIMenuCheckboxItem("Unlimited Stamina", unlimitedStamina, "If you disable this then you won't be able to run for more than 5 seconds. So it's recommended to keep this on at all times."); - UIMenuCheckboxItem fastRunCheckbox = new UIMenuCheckboxItem("Fast Running", false, "Super Snail! I'm fast as f*ck boi!!!"); - UIMenuCheckboxItem fastSwimCheckbox = new UIMenuCheckboxItem("Fast Swimming", false, "Super Sail 2.0! Swim like a real snail!"); - UIMenuCheckboxItem superJumpCheckbox = new UIMenuCheckboxItem("Super Jump", superJump, "Super Snail 3.0! You can't beat a snail's jumping skills!"); - UIMenuCheckboxItem noRagdollCheckbox = new UIMenuCheckboxItem("No Ragdoll", noRagdoll, "Don't fall over."); - UIMenuCheckboxItem neverWantedCheckbox = new UIMenuCheckboxItem("Never Wanted", neverWanted, "Nobody has time for annoying cops! Bribe them or deal with it."); - UIMenuCheckboxItem everyoneIgnoresPlayerCheckbox = new UIMenuCheckboxItem("Everyone Ignores You", everyoneIgnoresPlayer, "Annoying hillbillies trying to kill you? Turn this off and the Snail will make them shit their pants!"); - UIMenuCheckboxItem playerFrozenCheckbox = new UIMenuCheckboxItem("Freeze Yourself", playerFrozen, "Why would you do this...?"); - - // Wanted level options - List wantedLevelList = new List { "No Cops", 1, 2, 3, 4 }; - UIMenuListItem setWantedLevel = new UIMenuListItem("Set Wanted Level", wantedLevelList, GetPlayerWantedLevel(PlayerId()), "Set the wanted level by selecting a value, and pressing enter."); - - // Player options - List playerOptionsList = new List { "Heal Player", "Apply Max Armor", "Clean Player", "Dry Player", "Soack Player" }; - UIMenuListItem playerOptions = new UIMenuListItem("Player Options", playerOptionsList, 0, "Select an option and press enter to execute it."); - - // Actions - List playerActionsList = new List { "Commit Suicide", "Drive To Waypoint", "Drive Wander" }; - UIMenuListItem playerActions = new UIMenuListItem("Player Actions", playerActionsList, 0, "Select an action and press enter to run it, use the cancel button below to stop the driving actions."); - UIMenuItem cancelActions = new UIMenuItem("Cancel Player Actions", "Click this to cancel any of the driving player actions from the list above."); - - // Scenarios (list can be found in the PedScenarios class) - UIMenuListItem playerScenarios = new UIMenuListItem("Scenarios", PedScenarios.Scenarios, 0, "Select a scenario and hit enter to start it. Press it again to cancel it. Selecting another scenario and hitting enter will override the current scenario. Pressing enter again will then stop the scenario."); - #endregion - - #region Add items to menu - // Add all items to the menu. - menu.AddItem(playerGodModeCheckbox); - menu.AddItem(invisibleCheckbox); - menu.AddItem(unlimitedStaminaCheckbox); - menu.AddItem(fastRunCheckbox); - menu.AddItem(fastSwimCheckbox); - menu.AddItem(superJumpCheckbox); - menu.AddItem(noRagdollCheckbox); - menu.AddItem(neverWantedCheckbox); - menu.AddItem(setWantedLevel); - menu.AddItem(everyoneIgnoresPlayerCheckbox); - menu.AddItem(playerOptions); - menu.AddItem(playerActions); - menu.AddItem(playerFrozenCheckbox); - menu.AddItem(playerScenarios); - #endregion - - #region Checkbox Changes - // Handle all checkbox changes. - menu.OnCheckboxChange += (sender, item, _checked) => - { - // Toggle godmode. - if (item == playerGodModeCheckbox) - { - godMode = _checked; - Subtitle.Info("God mode has been " + (_checked ? "~g~enabled" : "~r~disabled") + "~b~."); - } - // Toggle invisibility. - else if (item == invisibleCheckbox) - { - invisible = _checked; - Subtitle.Info("Invisibility has been " + (_checked ? "~g~enabled" : "~r~disabled") + "~b~."); - } - // Toggle unlimited stamina. - else if (item == unlimitedStaminaCheckbox) - { - unlimitedStamina = _checked; - Subtitle.Info("Unlimited Stamina has been " + (_checked ? "~g~enabled" : "~r~disabled") + "~b~."); - } - // Toggle fast running. - else if (item == fastRunCheckbox) - { - SetRunSprintMultiplierForPlayer(PlayerId(), (_checked ? 1.49f : 1.0f)); - Subtitle.Info("Fast Running has been " + (_checked ? "~g~enabled" : "~r~disabled") + "~b~."); - } - // Toggle fast swimming - else if (item == fastSwimCheckbox) - { - SetSwimMultiplierForPlayer(PlayerId(), (_checked ? 1.49f : 1.0f)); - Subtitle.Info("Fast Swimming has been " + (_checked ? "~g~enabled" : "~r~disabled") + "~b~."); - } - // Super jump - else if (item == superJumpCheckbox) - { - superJump = _checked; - Subtitle.Info("Superjump has been " + (_checked ? "~g~enabled" : "~r~disabled") + "~b~."); - } - // No Ragdoll - else if (item == noRagdollCheckbox) - { - noRagdoll = _checked; - Subtitle.Info("No Ragdoll has been " + (_checked ? "~g~enabled" : "~r~disabled") + "~b~."); - } - // Never Wanted - else if (item == neverWantedCheckbox) - { - neverWanted = _checked; - Subtitle.Info("Never Wanted has been " + (_checked ? "~g~enabled" : "~r~disabled") + "~b~."); - } - // Everyone Ignores Player - else if (item == everyoneIgnoresPlayerCheckbox) - { - everyoneIgnoresPlayer = _checked; - Subtitle.Info("Everyone Ignores Player has been " + (_checked ? "~g~enabled" : "~r~disabled") + "~b~."); - } - // Freeze Player - else if (item == playerFrozenCheckbox) - { - FreezeEntityPosition(PlayerPedId(), playerFrozen); - Subtitle.Info("Freeze Player has been " + (_checked ? "~g~enabled" : "~r~disabled") + "~b~."); - } - }; - #endregion - - #region When lists are selected, handle the functions here. - menu.OnListSelect += (sender, listItem, index) => - { - // Set wanted Level - if (listItem == setWantedLevel) - { - SetPlayerWantedLevel(PlayerId(), index, false); - SetPlayerWantedLevelNow(PlayerId(), false); - } - - // Player options (healing, cleaning, armor, dry/wet, etc) - else if (listItem == playerOptions) - { - switch (index) - { - case 0: - SetEntityHealth(PlayerPedId(), GetEntityMaxHealth(PlayerPedId())); - Subtitle.Success("Player Healed Successfully."); - break; - case 1: - SetPedArmour(PlayerPedId(), GetPlayerMaxArmour(PlayerId())); - Subtitle.Success("Max Armor Applied Successfully."); - break; - case 2: - ClearPedBloodDamage(PlayerPedId()); - Subtitle.Success("Player Successfully Cleaned."); - break; - case 3: - ClearPedWetness(PlayerPedId()); - Subtitle.Success("Player Successfully Dried."); - break; - case 4: - SetPedWetnessHeight(PlayerPedId(), 2f); - SetPedWetnessEnabledThisFrame(PlayerPedId()); - Subtitle.Success("Player Successfully Soacked."); - break; - default: - break; - } - } - - // Player actions (suicide, driving tasks, etc) - else if (listItem == playerActions) - { - switch (index) - { - case 0: - SetEntityHealth(PlayerPedId(), 0); - Notify.Success("You killed yourself!"); - break; - case 1: - // Todo create drive to wp task. - break; - case 2: - break; - // Todo create drive wander task. - default: - break; - } - } - - // Player Scenarios - else if (listItem == playerScenarios) - { - // If they are currently in a scenario, and they select the same scenario, then cancel it. - if (IsPlayingScenario == index) - { - IsPlayingScenario = -1; - } - // Otherwise, start a new scenario. - else - { - // If the player can start a scenario. - if (CanPlayScenarios()) - { - // check if they are starting a new scenario for the first time. - if (IsPlayingScenario == -1) - { - // Clear the tasks (any scenarios). - ClearPedTasks(PlayerPedId()); - // Start the new scenario. - TaskStartScenarioInPlace(PlayerPedId(), PedScenarios.ScenarioNames[PedScenarios.Scenarios[IsPlayingScenario]], 0, true); - } - IsPlayingScenario = index; - } - else - { - Notify.Alert("You can only start a scenario if you're standing still, and you're not inside any vehicle."); - } - } - } - }; - #endregion - - // Open the main menu if this submenu closes. - menu.OnMenuClose += (sender) => - { - menu.Visible = false; - MainMenu.menu.Visible = true; - }; - - // Add this menu to the menu pool. - MainMenu._mp.Add(menu); - - // Create a button for this menu. - UIMenuItem PlayerOptionsButton = new UIMenuItem("Player Options", "Configure common player options in this submenu."); - // Add the button to the main menu. - MainMenu.menu.AddItem(PlayerOptionsButton); - // Bind the button from the main menu to this menu. - MainMenu.menu.BindMenuToItem(menu, PlayerOptionsButton); - - // Refresh the index on this menu, the main menu and the menu pool. - menu.RefreshIndex(); - MainMenu.menu.RefreshIndex(); - MainMenu._mp.RefreshIndex(); - - } - - #endregion - - #region Check if the player can start a new scenario - /// - /// Returns true if the player can start a scenario, false if they can't. - /// - /// (bool) True: the player can start a new scenario. False: the player can NOT start a new scenario. - private bool CanPlayScenarios() - { - return !(IsPedInAnyVehicle(PlayerPedId(), true) || IsPedDeadOrDying(PlayerPedId(), true) || IsPedRagdoll(PlayerPedId()) || IsPedStopped(PlayerPedId())); - } - #endregion - - } -} diff --git a/vMenuServer/CitizenFX.Core.dll b/vMenuServer/CitizenFX.Core.dll deleted file mode 100644 index 4146a622a46f231cb37739acac864d437512a83b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161792 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 responseDictionary; - - public RequestInternal() - { - responseDictionary = new Dictionary>(); - EventHandlers["__cfx_internal:httpResponse"] += new Action(Response); - Exports.Add("HttpRequest", new Func>>(Http)); - } - - public void Response(int token, int status, string text, dynamic header) - { - Dictionary response = new Dictionary(); - response["headers"] = header; - response["status"] = status; - response["content"] = text; - responseDictionary[token] = response; - } - - public async Task> Http(string url, string method, string data, dynamic headers) - { - RequestDataInternal requestData = new RequestDataInternal(); - requestData.url = url; - requestData.method = method; - requestData.data = data; - requestData.headers = headers; - string json = JsonConvert.SerializeObject(requestData); - int token = API.PerformHttpRequestInternal(json, json.Length); - while (!responseDictionary.ContainsKey(token)) - { - await Delay(0); - } - Dictionary res = responseDictionary[token]; - responseDictionary.Remove(token); - return res; - } - } - - public class Request : BaseScript - { - public Request() {} - - public async Task Http(string url, string method = "GET", string data = "", Dictionary headers = null) - { - headers = (headers == null) ? new Dictionary() : headers; - return ParseRequestResponseInternal( - await Exports[API.GetCurrentResourceName()].HttpRequest(url, method, data, headers) - ); - } - - private WebHeaderCollection ParseHeadersInternal(dynamic headerDyn) - { - WebHeaderCollection headers = new WebHeaderCollection(); - IDictionary headerDict = (IDictionary) headerDyn; - foreach(KeyValuePair entry in headerDict) - { - headers.Add(entry.Key, entry.Value.ToString()); - } - return headers; - } - - private HttpStatusCode ParseStatusInternal(int status) - { - return (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), status); - } - - private RequestResponse ParseRequestResponseInternal(IDictionary rr) - { - RequestResponse result = new RequestResponse(); - result.status = ParseStatusInternal(rr["status"]); - result.headers = ParseHeadersInternal(rr["headers"]); - result.content = rr["content"]; - return result; - } - - } - -} diff --git a/vMenuServer/Properties/AssemblyInfo.cs b/vMenuServer/Properties/AssemblyInfo.cs deleted file mode 100644 index 0634ae8f..00000000 --- a/vMenuServer/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("vMenuServer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("vMenuServer")] -[assembly: AssemblyCopyright("Copyright © 2018")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("897c1141-8cd6-4609-a692-53daff9bcbbe")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/vMenuServer/UpdateChecker.cs b/vMenuServer/UpdateChecker.cs deleted file mode 100644 index d8e7a073..00000000 --- a/vMenuServer/UpdateChecker.cs +++ /dev/null @@ -1,60 +0,0 @@ -using GHMatti.Http; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using CitizenFX.Core; -using static CitizenFX.Core.Native.API; -using Newtonsoft.Json; - -namespace vMenuServer -{ - public class UpdateChecker : BaseScript - { - private bool firstTick = true; - public UpdateChecker() - { - Tick += CheckUpdates; - } - private async Task CheckUpdates() - { - if (firstTick) - { - firstTick = false; - Request r = new Request(); - try - { - RequestResponse result = await r.Http("https://vespura.com/vMenu-version.json"); - if (result.status == System.Net.HttpStatusCode.OK) - { - var currentVersion = GetResourceMetadata(GetCurrentResourceName(), "version", 0); - dynamic output = JsonConvert.DeserializeObject(result.content); - string version = output.version.ToString(); - string date = output.date.ToString(); - Debug.WriteLine("\r\n +----------------- [ vMenu ] -----------------+"); - Debug.WriteLine(" | Current version: \t" + currentVersion + " |"); - Debug.WriteLine(" | Latest version: \t" + version + " |"); - Debug.WriteLine(" | Release date: \t" + date + " |"); - Debug.WriteLine(" | |"); - if (currentVersion == version) - { - Debug.WriteLine(" | You are using the latest version! |"); - } - else - { - Debug.WriteLine(" | A new version is available, please update! |"); - Debug.WriteLine(" | >> https://github.com/tomgrobbe/vMenu << |"); - } - - Debug.WriteLine(" +---------------------------------------------+\r\n"); - } - } - catch (Exception e) - { - Debug.WriteLine(e.Message); - } - } - } - } -} diff --git a/vMenuServer/__resource.lua b/vMenuServer/__resource.lua deleted file mode 100644 index ef40d4f2..00000000 --- a/vMenuServer/__resource.lua +++ /dev/null @@ -1,24 +0,0 @@ -resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' - -name 'vMenu' -description 'Server sided trainer for FiveM with custom permissions, using NativeUI.' -author 'Tom Grobbe (aka Vespura)' -version '00.01.14' -url 'https://github.com/TomGrobbe/vMenu' -license 'TBA' - -files { - 'Newtonsoft.Json.xml' -} - -client_scripts { - 'NativeUI.dll', - 'Newtonsoft.Json.dll', - 'vMenuClient.net.dll', -} - -server_scripts { - 'Newtonsoft.Json.dll', - 'vMenuServer.net.dll', -} - diff --git a/vMenuServer/packages.config b/vMenuServer/packages.config deleted file mode 100644 index e4ac9c6d..00000000 --- a/vMenuServer/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/vMenuServer/vMenuServer.csproj b/vMenuServer/vMenuServer.csproj deleted file mode 100644 index 3eed397c..00000000 --- a/vMenuServer/vMenuServer.csproj +++ /dev/null @@ -1,65 +0,0 @@ - - - - - Debug - AnyCPU - {897C1141-8CD6-4609-A692-53DAFF9BCBBE} - Library - Properties - vMenuServer - vMenuServer.net - v4.6.1 - 512 - - - true - full - false - ..\..\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - .\CitizenFX.Core.dll - False - - - ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll - - - - - - - - - - - - - - - - - - - - Always - - - - - copy /Y "D:\Tom Grobbe\Documents\GitHub Repos\vMenu\*" "D:\FXserver\vMenu\resources\vMenu\" - - \ No newline at end of file From a4e4baefe0413acee4ee5a9c4fe9a050dac262d6 Mon Sep 17 00:00:00 2001 From: Tom Grobbe <31419184+TomGrobbe@users.noreply.github.com> Date: Mon, 19 Feb 2018 00:38:26 +0100 Subject: [PATCH 2/8] Fixed a lot of issues, still need to convert quite a bit from master. --- vMenu/CommonFunctions.cs | 137 +++++++------- vMenu/FunctionsController.cs | 61 +++++++ vMenu/MainMenu.cs | 36 +++- vMenu/PlayerOptions.cs | 242 +++++++++++++++++++++++++ vMenu/vMenuClient.csproj | 8 +- vMenuServer/CitizenFX.Core.dll | Bin 0 -> 161792 bytes vMenuServer/EventManager.cs | 19 ++ vMenuServer/HttpHelper.cs | 104 +++++++++++ vMenuServer/Properties/AssemblyInfo.cs | 36 ++++ vMenuServer/UpdateChecker.cs | 60 ++++++ vMenuServer/packages.config | 4 + vMenuServer/vMenuServer.csproj | 62 +++++++ 12 files changed, 691 insertions(+), 78 deletions(-) create mode 100644 vMenu/FunctionsController.cs create mode 100644 vMenu/PlayerOptions.cs create mode 100644 vMenuServer/CitizenFX.Core.dll create mode 100644 vMenuServer/EventManager.cs create mode 100644 vMenuServer/HttpHelper.cs create mode 100644 vMenuServer/Properties/AssemblyInfo.cs create mode 100644 vMenuServer/UpdateChecker.cs create mode 100644 vMenuServer/packages.config create mode 100644 vMenuServer/vMenuServer.csproj diff --git a/vMenu/CommonFunctions.cs b/vMenu/CommonFunctions.cs index c5dfc387..a273fa6a 100644 --- a/vMenu/CommonFunctions.cs +++ b/vMenu/CommonFunctions.cs @@ -8,53 +8,54 @@ namespace vMenuClient { - class CommonFunctions : BaseScript + class CommonFunction { // Variables private Notification Notify = new Notification(); - private int spectatePlayer = -1; - private bool spectating = false; + //private int spectatePlayer = -1; + //private bool spectating = false; /// /// Constructor. /// - public CommonFunctions() - { - Tick += OnTick; - } + //public CommonFunctions() + //{ + // Tick += OnTick; + //} - #region OnTick for spectate handling - /// - /// OnTick runs every game tick. - /// Used here for the spectating feature. - /// - /// - private async Task OnTick() - { - // If the player is not spectating yet, but "spectating" is true, enable it. - if (spectatePlayer != -1 && spectating && NetworkIsPlayerActive(spectatePlayer)) - { - DoScreenFadeOut(200); - await Delay(200); - NetworkSetInSpectatorMode(true, GetPlayerPed(spectatePlayer)); - DoScreenFadeIn(200); - await Delay(200); - spectating = true; - } + //#region OnTick for spectate handling + ///// + ///// OnTick runs every game tick. + ///// Used here for the spectating feature. + ///// + ///// + //private async Task OnTick() + //{ + // // If the player is not spectating yet, but "spectating" is true, enable it. + // if (spectatePlayer != -1 && spectating && NetworkIsPlayerActive(spectatePlayer)) + // { + // DoScreenFadeOut(200); + // await Delay(200); + // NetworkSetInSpectatorMode(true, GetPlayerPed(spectatePlayer)); + // DoScreenFadeIn(200); + // await Delay(200); + // spectating = true; - // Wait until spectating is cancelled. - // Either by the user itself, or if the other player disconencts, or if the current player dies. - while (spectating && spectatePlayer != -1 && NetworkIsPlayerActive(spectatePlayer) && !IsPlayerDead(PlayerId())) - { - await Delay(0); - } - DoScreenFadeOut(200); - await Delay(200); - NetworkSetInSpectatorMode(false, PlayerPedId()); - DoScreenFadeIn(200); - await Delay(200); - } - #endregion + + // // Wait until spectating is cancelled. + // // Either by the user itself, or if the other player disconencts, or if the current player dies. + // while (spectating && spectatePlayer != -1 && NetworkIsPlayerActive(spectatePlayer) && !IsPlayerDead(PlayerId())) + // { + // await Delay(0); + // } + // DoScreenFadeOut(200); + // await Delay(200); + // NetworkSetInSpectatorMode(false, PlayerPedId()); + // DoScreenFadeIn(200); + // await Delay(200); + // } + //} + //#endregion #region GetVehicle from specified player id (if not specified, return the vehicle of the current player) /// /// Get the vehicle from the specified player. If no player specified, then return the vehicle of the current player. @@ -110,7 +111,7 @@ public async void TeleportToPlayerAsync(int playerId, bool inVehicle = false) if (inVehicle) { // Allow the world to load around the player first. - await Delay(5); + //await Delay(5); // Is the other player inside a vehicle? if (IsPedInAnyVehicle(playerPed, false)) @@ -166,35 +167,35 @@ public async void TeleportToPlayerAsync(int playerId, bool inVehicle = false) } } #endregion - #region Spectate function - /// - /// Toggle spectating for the specified player Id. Leave the player ID empty (or -1) to disable spectating. - /// - /// - public void Spectate(int playerId = -1) - { - if (spectating || playerId == -1) - { - spectating = false; - spectatePlayer = -1; - Notify.Info("Stopped spectating.", false, false); - } - else if (spectating && playerId != -1 && NetworkIsPlayerActive(playerId)) - { - spectating = false; - spectatePlayer = -1; - Notify.Info("Switching to player " + GetPlayerName(playerId), false, false); - spectating = true; - spectatePlayer = playerId; - } - else - { - spectatePlayer = playerId; - spectating = true; - Notify.Info("Currently spectating " + GetPlayerName(playerId) + ".", false, false); - } - } - #endregion + //#region Spectate function + ///// + ///// Toggle spectating for the specified player Id. Leave the player ID empty (or -1) to disable spectating. + ///// + ///// + //public void Spectate(int playerId = -1) + //{ + // if (spectating || playerId == -1) + // { + // spectating = false; + // spectatePlayer = -1; + // Notify.Info("Stopped spectating.", false, false); + // } + // else if (spectating && playerId != -1 && NetworkIsPlayerActive(playerId)) + // { + // spectating = false; + // spectatePlayer = -1; + // Notify.Info("Switching to player " + GetPlayerName(playerId), false, false); + // spectating = true; + // spectatePlayer = playerId; + // } + // else + // { + // spectatePlayer = playerId; + // spectating = true; + // Notify.Info("Currently spectating " + GetPlayerName(playerId) + ".", false, false); + // } + //} + //#endregion } diff --git a/vMenu/FunctionsController.cs b/vMenu/FunctionsController.cs new file mode 100644 index 00000000..913c8cf6 --- /dev/null +++ b/vMenu/FunctionsController.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CitizenFX.Core; +using static CitizenFX.Core.Native.API; +using NativeUI; + +namespace vMenuClient +{ + class FunctionsController : BaseScript + { + + public FunctionsController() + { + Tick += OnTick; + } + + private async Task OnTick() + { + // Check if the menu actually exists... we don't want null pointer exceptions or illegal access errors! + if (MainMenu._po != null) + { + // Manage Player God Mode + SetEntityInvincible(PlayerPedId(), MainMenu._po.PlayerGodMode); + + // Manage invisibility. + SetEntityVisible(PlayerPedId(), !MainMenu._po.PlayerInvisible, false); + + // Manage Stamina + if (MainMenu._po.PlayerStamina) + { + ResetPlayerStamina(PlayerId()); + } + + // Manage Super jump. + if (MainMenu._po.PlayerSuperJump) + { + SetSuperJumpThisFrame(PlayerId()); + } + + // Manage PlayerNoRagdoll + SetPedCanRagdoll(PlayerPedId(), MainMenu._po.PlayerNoRagdoll); + SetPedCanRagdollFromPlayerImpact(PlayerPedId(), MainMenu._po.PlayerNoRagdoll); + + // Manage never wanted. + if (MainMenu._po.PlayerNeverWanted && GetPlayerWantedLevel(PlayerId()) > 0) + { + ClearPlayerWantedLevel(PlayerId()); + } + + // Manage player is ignored by everyone. + SetEveryoneIgnorePlayer(PlayerId(), MainMenu._po.PlayerIsIgnored); + + // Manage player frozen. + FreezeEntityPosition(PlayerPedId(), MainMenu._po.PlayerFrozen); + } + } + } +} diff --git a/vMenu/MainMenu.cs b/vMenu/MainMenu.cs index e478e52e..8b156472 100644 --- a/vMenu/MainMenu.cs +++ b/vMenu/MainMenu.cs @@ -6,19 +6,18 @@ using CitizenFX.Core; using static CitizenFX.Core.Native.API; using NativeUI; -using vMenuClient.menus; namespace vMenuClient { - public class MainMenu : BaseScript { // Variables public static MenuPool _mp = new MenuPool(); private bool firstTick = true; - private bool setupComplete = false; + private bool setupComplete = true; public static UIMenu menu; + public static PlayerOptions _po; /// /// Constructor. @@ -39,7 +38,7 @@ private async Task OnTick() { firstTick = false; // Request the data from the server. - TriggerServerEvent("vMenu:GetSettings"); + //TriggerServerEvent("vMenu:GetSettings"); // Wait until the data is received. while (!setupComplete) @@ -53,17 +52,38 @@ private async Task OnTick() ControlDisablingEnabled = false }; - menu.RefreshIndex(); + var playerOptionsBtn = new UIMenuItem("Player Options", "Player Options"); + menu.AddItem(playerOptionsBtn); + _po = new PlayerOptions(); + var playerOptions = _po.GetMenu(); + menu.BindMenuToItem(playerOptions, playerOptionsBtn); + _mp.Add(playerOptions); + // Add the main menu to the menu pool. _mp.Add(menu); // Create all (sub)menus. - var onlinePlayersMenu = new OnlinePlayersMenu(); - var playerOptionsMenu = new PlayerOptionsMenu(); } - // Todo: more stuff + else + { + _mp.ProcessMenus(); + + if (Game.CurrentInputMode == InputMode.MouseAndKeyboard && Game.IsControlJustPressed(0, Control.InteractionMenu)) + { + if (_mp.IsAnyMenuOpen()) + { + _mp.CloseAllMenus(); + } + else + { + menu.Visible = !_mp.IsAnyMenuOpen(); + } + + } + } + } } diff --git a/vMenu/PlayerOptions.cs b/vMenu/PlayerOptions.cs new file mode 100644 index 00000000..97f56ed4 --- /dev/null +++ b/vMenu/PlayerOptions.cs @@ -0,0 +1,242 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CitizenFX.Core; +using static CitizenFX.Core.Native.API; +using NativeUI; + +namespace vMenuClient +{ + public class PlayerOptions + { + // Menu variable, will be defined in CreateMenu() + private UIMenu menu; + private static Notification Notify = new Notification(); + private static Subtitles Subtitle = new Subtitles(); + + // Public variables (getters only), return the private variables. + public bool PlayerGodMode { get; private set; } = false; + public bool PlayerInvisible { get; private set; } = false; + public bool PlayerStamina { get; private set; } = true; + public bool PlayerSuperJump { get; private set; } = false; + public bool PlayerNoRagdoll { get; private set; } = false; + public bool PlayerNeverWanted { get; private set; } = false; + public bool PlayerIsIgnored { get; private set; } = false; + public bool PlayerFrozen { get; private set; } = false; + + /// + /// Create the menu. + /// + private void CreateMenu() + { + // Create the menu. + menu = new UIMenu(GetPlayerName(PlayerId()), "Player Options"); + + // Create all checkboxes. + UIMenuCheckboxItem playerGodModeCheckbox = new UIMenuCheckboxItem("God Mode", PlayerGodMode, "If you turn this on, you won't take any damage."); + UIMenuCheckboxItem invisibleCheckbox = new UIMenuCheckboxItem("Invisibility", PlayerInvisible, "If you turn this on, you will become invisible."); + UIMenuCheckboxItem unlimitedStaminaCheckbox = new UIMenuCheckboxItem("Unlimited Stamina", PlayerStamina, "If you disable this then you won't be able to run for more than 5 seconds. So it's recommended to keep this on at all times."); + UIMenuCheckboxItem fastRunCheckbox = new UIMenuCheckboxItem("Fast Running", false, "Super Snail! I'm fast as f*ck boi!!!"); + UIMenuCheckboxItem fastSwimCheckbox = new UIMenuCheckboxItem("Fast Swimming", false, "Super Sail 2.0! Swim like a real snail!"); + UIMenuCheckboxItem superJumpCheckbox = new UIMenuCheckboxItem("Super Jump", PlayerSuperJump, "Super Snail 3.0! You can't beat a snail's jumping skills!"); + UIMenuCheckboxItem noRagdollCheckbox = new UIMenuCheckboxItem("No Ragdoll", PlayerNoRagdoll, "Don't fall over."); + UIMenuCheckboxItem neverWantedCheckbox = new UIMenuCheckboxItem("Never Wanted", PlayerNeverWanted, "Nobody has time for annoying cops! Bribe them or deal with it."); + UIMenuCheckboxItem everyoneIgnoresPlayerCheckbox = new UIMenuCheckboxItem("Everyone Ignores You", PlayerIsIgnored, "Annoying hillbillies trying to kill you? Turn this off and the Snail will make them shit their pants!"); + UIMenuCheckboxItem playerFrozenCheckbox = new UIMenuCheckboxItem("Freeze Yourself", PlayerFrozen, "Why would you do this...?"); + + // Wanted level options + List wantedLevelList = new List { "No Cops", 1, 2, 3, 4 }; + UIMenuListItem setWantedLevel = new UIMenuListItem("Set Wanted Level", wantedLevelList, GetPlayerWantedLevel(PlayerId()), "Set the wanted level by selecting a value, and pressing enter."); + + // Player options + List playerOptionsList = new List { "Heal Player", "Apply Max Armor", "Clean Player", "Dry Player", "Soack Player" }; + UIMenuListItem playerOptions = new UIMenuListItem("Player Options", playerOptionsList, 0, "Select an option and press enter to execute it."); + + // Actions + List playerActionsList = new List { "Commit Suicide", "Drive To Waypoint", "Drive Wander" }; + UIMenuListItem playerActions = new UIMenuListItem("Player Actions", playerActionsList, 0, "Select an action and press enter to run it, use the cancel button below to stop the driving actions."); + UIMenuItem cancelActions = new UIMenuItem("Cancel Player Actions", "Click this to cancel any of the driving player actions from the list above."); + + // Scenarios (list can be found in the PedScenarios class) + UIMenuListItem playerScenarios = new UIMenuListItem("Scenarios", PedScenarios.Scenarios, 0, "Select a scenario and hit enter to start it. Press it again to cancel it. Selecting another scenario and hitting enter will override the current scenario. Pressing enter again will then stop the scenario."); + + // Add all checkboxes to the menu. + menu.AddItem(playerGodModeCheckbox); + menu.AddItem(invisibleCheckbox); + menu.AddItem(unlimitedStaminaCheckbox); + menu.AddItem(fastRunCheckbox); + menu.AddItem(fastSwimCheckbox); + menu.AddItem(superJumpCheckbox); + menu.AddItem(noRagdollCheckbox); + menu.AddItem(neverWantedCheckbox); + menu.AddItem(setWantedLevel); + menu.AddItem(everyoneIgnoresPlayerCheckbox); + menu.AddItem(playerOptions); + menu.AddItem(playerActions); + menu.AddItem(playerFrozenCheckbox); + menu.AddItem(playerScenarios); + + // Handle all checkbox change events. + menu.OnCheckboxChange += (sender, item, _checked) => + { + // God Mode toggled. + if (item == playerGodModeCheckbox) + { + PlayerGodMode = _checked; + } + // Invisibility toggled. + else if (item == invisibleCheckbox) + { + PlayerInvisible = _checked; + } + // Unlimited Stamina toggled. + else if (item == unlimitedStaminaCheckbox) + { + PlayerStamina = _checked; + } + // Fast run toggled. + else if (item == fastRunCheckbox) + { + SetRunSprintMultiplierForPlayer(PlayerId(), (_checked ? 1.49f : 1f)); + } + // Fast swim toggled. + else if (item == fastSwimCheckbox) + { + SetSwimMultiplierForPlayer(PlayerId(), (_checked ? 1.49f : 1f)); + } + // Super jump toggled. + else if (item == superJumpCheckbox) + { + PlayerSuperJump = _checked; + } + // No ragdoll toggled. + else if (item == noRagdollCheckbox) + { + PlayerNoRagdoll = _checked; + } + // Never wanted toggled. + else if (item == neverWantedCheckbox) + { + PlayerNeverWanted = _checked; + } + // Everyone ignores player toggled. + else if (item == everyoneIgnoresPlayerCheckbox) + { + PlayerIsIgnored = _checked; + } + // Freeze player toggled. + else if (item == playerFrozenCheckbox) + { + PlayerFrozen = _checked; + } + }; + + #region When lists are selected, handle the functions here. + menu.OnListSelect += (sender, listItem, index) => + { + // Set wanted Level + if (listItem == setWantedLevel) + { + SetPlayerWantedLevel(PlayerId(), index, false); + SetPlayerWantedLevelNow(PlayerId(), false); + } + + // Player options (healing, cleaning, armor, dry/wet, etc) + else if (listItem == playerOptions) + { + switch (index) + { + case 0: + SetEntityHealth(PlayerPedId(), GetEntityMaxHealth(PlayerPedId())); + Subtitle.Success("Player Healed Successfully."); + break; + case 1: + SetPedArmour(PlayerPedId(), GetPlayerMaxArmour(PlayerId())); + Subtitle.Success("Max Armor Applied Successfully."); + break; + case 2: + ClearPedBloodDamage(PlayerPedId()); + Subtitle.Success("Player Successfully Cleaned."); + break; + case 3: + ClearPedWetness(PlayerPedId()); + Subtitle.Success("Player Successfully Dried."); + break; + case 4: + SetPedWetnessHeight(PlayerPedId(), 2f); + SetPedWetnessEnabledThisFrame(PlayerPedId()); + Subtitle.Success("Player Successfully Soacked."); + break; + default: + break; + } + } + + // Player actions (suicide, driving tasks, etc) + else if (listItem == playerActions) + { + switch (index) + { + case 0: + SetEntityHealth(PlayerPedId(), 0); + Notify.Success("You killed yourself!"); + break; + case 1: + // Todo create drive to wp task. + break; + case 2: + break; + // Todo create drive wander task. + default: + break; + } + } + + //// Player Scenarios + //else if (listItem == playerScenarios) + //{ + // // If they are currently in a scenario, and they select the same scenario, then cancel it. + // if (IsPlayingScenario == index) + // { + // IsPlayingScenario = -1; + // } + // // Otherwise, start a new scenario. + // else + // { + // // If the player can start a scenario. + // if (CanPlayScenarios()) + // { + // // check if they are starting a new scenario for the first time. + // if (IsPlayingScenario == -1) + // { + // // Clear the tasks (any scenarios). + // ClearPedTasks(PlayerPedId()); + // // Start the new scenario. + // TaskStartScenarioInPlace(PlayerPedId(), PedScenarios.ScenarioNames[PedScenarios.Scenarios[IsPlayingScenario]], 0, true); + // } + // IsPlayingScenario = index; + // } + // else + // { + // Notify.Alert("You can only start a scenario if you're standing still, and you're not inside any vehicle."); + // } + // } + //} + }; + #endregion + + } + + public UIMenu GetMenu() + { + if (menu == null) + { + CreateMenu(); + } + return menu; + } + + } +} diff --git a/vMenu/vMenuClient.csproj b/vMenu/vMenuClient.csproj index b28282f3..823327f9 100644 --- a/vMenu/vMenuClient.csproj +++ b/vMenu/vMenuClient.csproj @@ -52,15 +52,19 @@ + - - + + + + + \ No newline at end of file diff --git a/vMenuServer/CitizenFX.Core.dll b/vMenuServer/CitizenFX.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..4146a622a46f231cb37739acac864d437512a83b GIT binary patch literal 161792 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 responseDictionary; + + public RequestInternal() + { + responseDictionary = new Dictionary>(); + EventHandlers["__cfx_internal:httpResponse"] += new Action(Response); + Exports.Add("HttpRequest", new Func>>(Http)); + } + + public void Response(int token, int status, string text, dynamic header) + { + Dictionary response = new Dictionary(); + response["headers"] = header; + response["status"] = status; + response["content"] = text; + responseDictionary[token] = response; + } + + public async Task> Http(string url, string method, string data, dynamic headers) + { + RequestDataInternal requestData = new RequestDataInternal(); + requestData.url = url; + requestData.method = method; + requestData.data = data; + requestData.headers = headers; + string json = JsonConvert.SerializeObject(requestData); + int token = API.PerformHttpRequestInternal(json, json.Length); + while (!responseDictionary.ContainsKey(token)) + { + await Delay(0); + } + Dictionary res = responseDictionary[token]; + responseDictionary.Remove(token); + return res; + } + } + + public class Request : BaseScript + { + public Request() {} + + public async Task Http(string url, string method = "GET", string data = "", Dictionary headers = null) + { + headers = (headers == null) ? new Dictionary() : headers; + return ParseRequestResponseInternal( + await Exports[API.GetCurrentResourceName()].HttpRequest(url, method, data, headers) + ); + } + + private WebHeaderCollection ParseHeadersInternal(dynamic headerDyn) + { + WebHeaderCollection headers = new WebHeaderCollection(); + IDictionary headerDict = (IDictionary) headerDyn; + foreach(KeyValuePair entry in headerDict) + { + headers.Add(entry.Key, entry.Value.ToString()); + } + return headers; + } + + private HttpStatusCode ParseStatusInternal(int status) + { + return (HttpStatusCode)Enum.ToObject(typeof(HttpStatusCode), status); + } + + private RequestResponse ParseRequestResponseInternal(IDictionary rr) + { + RequestResponse result = new RequestResponse(); + result.status = ParseStatusInternal(rr["status"]); + result.headers = ParseHeadersInternal(rr["headers"]); + result.content = rr["content"]; + return result; + } + + } + +} diff --git a/vMenuServer/Properties/AssemblyInfo.cs b/vMenuServer/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..0634ae8f --- /dev/null +++ b/vMenuServer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("vMenuServer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("vMenuServer")] +[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("897c1141-8cd6-4609-a692-53daff9bcbbe")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/vMenuServer/UpdateChecker.cs b/vMenuServer/UpdateChecker.cs new file mode 100644 index 00000000..d8e7a073 --- /dev/null +++ b/vMenuServer/UpdateChecker.cs @@ -0,0 +1,60 @@ +using GHMatti.Http; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CitizenFX.Core; +using static CitizenFX.Core.Native.API; +using Newtonsoft.Json; + +namespace vMenuServer +{ + public class UpdateChecker : BaseScript + { + private bool firstTick = true; + public UpdateChecker() + { + Tick += CheckUpdates; + } + private async Task CheckUpdates() + { + if (firstTick) + { + firstTick = false; + Request r = new Request(); + try + { + RequestResponse result = await r.Http("https://vespura.com/vMenu-version.json"); + if (result.status == System.Net.HttpStatusCode.OK) + { + var currentVersion = GetResourceMetadata(GetCurrentResourceName(), "version", 0); + dynamic output = JsonConvert.DeserializeObject(result.content); + string version = output.version.ToString(); + string date = output.date.ToString(); + Debug.WriteLine("\r\n +----------------- [ vMenu ] -----------------+"); + Debug.WriteLine(" | Current version: \t" + currentVersion + " |"); + Debug.WriteLine(" | Latest version: \t" + version + " |"); + Debug.WriteLine(" | Release date: \t" + date + " |"); + Debug.WriteLine(" | |"); + if (currentVersion == version) + { + Debug.WriteLine(" | You are using the latest version! |"); + } + else + { + Debug.WriteLine(" | A new version is available, please update! |"); + Debug.WriteLine(" | >> https://github.com/tomgrobbe/vMenu << |"); + } + + Debug.WriteLine(" +---------------------------------------------+\r\n"); + } + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } + } + } + } +} diff --git a/vMenuServer/packages.config b/vMenuServer/packages.config new file mode 100644 index 00000000..77c4932b --- /dev/null +++ b/vMenuServer/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/vMenuServer/vMenuServer.csproj b/vMenuServer/vMenuServer.csproj new file mode 100644 index 00000000..7a47c977 --- /dev/null +++ b/vMenuServer/vMenuServer.csproj @@ -0,0 +1,62 @@ + + + + + Debug + AnyCPU + {897C1141-8CD6-4609-A692-53DAFF9BCBBE} + Library + Properties + vMenuServer + vMenuServer.net + v4.6.1 + 512 + + + true + full + false + ..\..\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + .\CitizenFX.Core.dll + False + + + ..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + + + copy /Y "D:\Tom Grobbe\Documents\GitHub Repos\vMenu\*" "D:\FXserver\vMenu\resources\vMenu\" + + \ No newline at end of file From d3cb3782034abf70e724af4b36d2a1301792b49e Mon Sep 17 00:00:00 2001 From: Tom Grobbe <31419184+TomGrobbe@users.noreply.github.com> Date: Mon, 19 Feb 2018 00:42:44 +0100 Subject: [PATCH 3/8] Soon --- docs/INFO.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/INFO.md diff --git a/docs/INFO.md b/docs/INFO.md new file mode 100644 index 00000000..7972878c --- /dev/null +++ b/docs/INFO.md @@ -0,0 +1 @@ +# Soon™ \ No newline at end of file From ff307c27e47a4dc6b7c17b5074e77144fd07e6fe Mon Sep 17 00:00:00 2001 From: Tom Grobbe <31419184+TomGrobbe@users.noreply.github.com> Date: Mon, 19 Feb 2018 16:09:05 +0100 Subject: [PATCH 4/8] Fixed/added server/client events. Added online players menu. Fixed bugs and changed styles of all menus. Disabled the retarded native ui control disabling. Still need to add custom controls disabler in the MainMenu.cs OnTick. --- vMenu/CommonFunctions.cs | 154 ++++++++++++----------- vMenu/EventManager.cs | 30 +++++ vMenu/MainMenu.cs | 87 ++++++++++--- vMenu/menus/OnlinePlayers.cs | 192 +++++++++++++++++++++++++++++ vMenu/{ => menus}/PlayerOptions.cs | 9 +- vMenu/vMenuClient.csproj | 4 +- vMenuServer/EventManager.cs | 12 ++ 7 files changed, 400 insertions(+), 88 deletions(-) create mode 100644 vMenu/EventManager.cs create mode 100644 vMenu/menus/OnlinePlayers.cs rename vMenu/{ => menus}/PlayerOptions.cs (97%) diff --git a/vMenu/CommonFunctions.cs b/vMenu/CommonFunctions.cs index a273fa6a..eb70dd38 100644 --- a/vMenu/CommonFunctions.cs +++ b/vMenu/CommonFunctions.cs @@ -8,54 +8,55 @@ namespace vMenuClient { - class CommonFunction + class CommonFunctions : BaseScript { // Variables private Notification Notify = new Notification(); - //private int spectatePlayer = -1; - //private bool spectating = false; + private int spectatePlayer = -1; + private bool spectating = false; /// /// Constructor. /// - //public CommonFunctions() - //{ - // Tick += OnTick; - //} - - //#region OnTick for spectate handling - ///// - ///// OnTick runs every game tick. - ///// Used here for the spectating feature. - ///// - ///// - //private async Task OnTick() - //{ - // // If the player is not spectating yet, but "spectating" is true, enable it. - // if (spectatePlayer != -1 && spectating && NetworkIsPlayerActive(spectatePlayer)) - // { - // DoScreenFadeOut(200); - // await Delay(200); - // NetworkSetInSpectatorMode(true, GetPlayerPed(spectatePlayer)); - // DoScreenFadeIn(200); - // await Delay(200); - // spectating = true; - - - // // Wait until spectating is cancelled. - // // Either by the user itself, or if the other player disconencts, or if the current player dies. - // while (spectating && spectatePlayer != -1 && NetworkIsPlayerActive(spectatePlayer) && !IsPlayerDead(PlayerId())) - // { - // await Delay(0); - // } - // DoScreenFadeOut(200); - // await Delay(200); - // NetworkSetInSpectatorMode(false, PlayerPedId()); - // DoScreenFadeIn(200); - // await Delay(200); - // } - //} - //#endregion + public CommonFunctions() + { + Tick += OnTick; + } + + #region OnTick for spectate handling + /// + /// OnTick runs every game tick. + /// Used here for the spectating feature. + /// + /// + private async Task OnTick() + { + // If the player is not spectating yet, but "spectating" is true, enable it. + if (spectatePlayer != -1 && spectating && NetworkIsPlayerActive(spectatePlayer)) + { + DoScreenFadeOut(200); + await Delay(200); + NetworkSetInSpectatorMode(true, GetPlayerPed(spectatePlayer)); + DoScreenFadeIn(200); + await Delay(200); + spectating = true; + + + // Wait until spectating is cancelled. + // Either by the user itself, or if the other player disconencts, or if the current player dies. + while (spectating && spectatePlayer != -1 && NetworkIsPlayerActive(spectatePlayer) && !IsPlayerDead(PlayerId())) + { + await Delay(0); + } + DoScreenFadeOut(200); + await Delay(200); + NetworkSetInSpectatorMode(false, PlayerPedId()); + DoScreenFadeIn(200); + await Delay(200); + } + } + #endregion + #region GetVehicle from specified player id (if not specified, return the vehicle of the current player) /// /// Get the vehicle from the specified player. If no player specified, then return the vehicle of the current player. @@ -111,7 +112,7 @@ public async void TeleportToPlayerAsync(int playerId, bool inVehicle = false) if (inVehicle) { // Allow the world to load around the player first. - //await Delay(5); + await Delay(5); // Is the other player inside a vehicle? if (IsPedInAnyVehicle(playerPed, false)) @@ -166,36 +167,47 @@ public async void TeleportToPlayerAsync(int playerId, bool inVehicle = false) return; } } + + public void KillPlayer(Player player) + { + TriggerServerEvent("vMenu:KillPlayer", player.Handle); + } + + public void SummonPlayer(Player player) + { + TriggerServerEvent("vMenu:SummonPlayer", player.Handle); + } + #endregion + + #region Spectate function + /// + /// Toggle spectating for the specified player Id. Leave the player ID empty (or -1) to disable spectating. + /// + /// + public void Spectate(int playerId = -1) + { + if (spectating || playerId == -1) + { + spectating = false; + spectatePlayer = -1; + Notify.Info("Stopped spectating.", false, false); + } + else if (spectating && playerId != -1 && NetworkIsPlayerActive(playerId)) + { + spectating = false; + spectatePlayer = -1; + Notify.Info("Switching to player " + GetPlayerName(playerId), false, false); + spectating = true; + spectatePlayer = playerId; + } + else + { + spectatePlayer = playerId; + spectating = true; + Notify.Info("Currently spectating " + GetPlayerName(playerId) + ".", false, false); + } + } #endregion - //#region Spectate function - ///// - ///// Toggle spectating for the specified player Id. Leave the player ID empty (or -1) to disable spectating. - ///// - ///// - //public void Spectate(int playerId = -1) - //{ - // if (spectating || playerId == -1) - // { - // spectating = false; - // spectatePlayer = -1; - // Notify.Info("Stopped spectating.", false, false); - // } - // else if (spectating && playerId != -1 && NetworkIsPlayerActive(playerId)) - // { - // spectating = false; - // spectatePlayer = -1; - // Notify.Info("Switching to player " + GetPlayerName(playerId), false, false); - // spectating = true; - // spectatePlayer = playerId; - // } - // else - // { - // spectatePlayer = playerId; - // spectating = true; - // Notify.Info("Currently spectating " + GetPlayerName(playerId) + ".", false, false); - // } - //} - //#endregion } diff --git a/vMenu/EventManager.cs b/vMenu/EventManager.cs new file mode 100644 index 00000000..c68f607b --- /dev/null +++ b/vMenu/EventManager.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CitizenFX.Core; +using static CitizenFX.Core.Native.API; + +namespace vMenuClient +{ + public class EventManager : BaseScript + { + private static CommonFunctions cf = new CommonFunctions(); + public EventManager() + { + EventHandlers.Add("vMenu:GoToPlayer", new Action(SummonPlayer)); + EventHandlers.Add("vMenu:KillMe", new Action(KillMe)); + } + + private void KillMe() + { + SetEntityHealth(PlayerPedId(), 0); + } + + private void SummonPlayer(int targetPlayer) + { + cf.TeleportToPlayerAsync(GetPlayerFromServerId(targetPlayer)); + } + } +} diff --git a/vMenu/MainMenu.cs b/vMenu/MainMenu.cs index 8b156472..3e673923 100644 --- a/vMenu/MainMenu.cs +++ b/vMenu/MainMenu.cs @@ -13,11 +13,18 @@ public class MainMenu : BaseScript { // Variables public static MenuPool _mp = new MenuPool(); + public static System.Drawing.PointF MenuPosition = new System.Drawing.PointF(CitizenFX.Core.UI.Screen.Resolution.Width - 465f, 45f); + private static Notification Notify = new Notification(); + private static Subtitles Subtitle = new Subtitles(); private bool firstTick = true; private bool setupComplete = true; public static UIMenu menu; public static PlayerOptions _po; + public static OnlinePlayers _op; + + private BarTimerBar bt = new BarTimerBar("Opening Menu"); + private bool debug = false; /// /// Constructor. @@ -41,34 +48,60 @@ private async Task OnTick() //TriggerServerEvent("vMenu:GetSettings"); // Wait until the data is received. - while (!setupComplete) + while (!setupComplete && (GetPlayerName(PlayerId()) == "**Invalid**" || GetPlayerName(PlayerId()) == "** Invalid **")) { await Delay(0); } // Create the main menu. - menu = new UIMenu(GetPlayerName(PlayerId()), "Main Menu") - { - ControlDisablingEnabled = false - }; + menu = new UIMenu(GetPlayerName(PlayerId()), "Main Menu", MenuPosition); + + // Add the main menu to the menu pool. + _mp.Add(menu); + + menu.RefreshIndex(); + menu.ScaleWithSafezone = false; + menu.UpdateScaleform(); + menu.RefreshIndex(); + - var playerOptionsBtn = new UIMenuItem("Player Options", "Player Options"); + // Create all (sub)menus. + + // Add the online players menu. + UIMenuItem onlinePlayersBtn = new UIMenuItem("Online Players", "All currently connected players."); + menu.AddItem(onlinePlayersBtn); + _op = new OnlinePlayers(); + UIMenu onlinePlayers = _op.GetMenu(); + + onlinePlayers.ScaleWithSafezone = false; + onlinePlayers.UpdateScaleform(); + + menu.BindMenuToItem(onlinePlayers, onlinePlayersBtn); + _mp.Add(onlinePlayers); + + // Add the player options menu. + UIMenuItem playerOptionsBtn = new UIMenuItem("Player Options", "Common player options can be accessed here."); menu.AddItem(playerOptionsBtn); _po = new PlayerOptions(); - var playerOptions = _po.GetMenu(); + UIMenu playerOptions = _po.GetMenu(); + playerOptions.ScaleWithSafezone = false; + playerOptions.UpdateScaleform(); + menu.BindMenuToItem(playerOptions, playerOptionsBtn); _mp.Add(playerOptions); + _mp.RefreshIndex(); - // Add the main menu to the menu pool. - _mp.Add(menu); + onlinePlayers.UpdateScaleform(); + playerOptions.UpdateScaleform(); + menu.UpdateScaleform(); - // Create all (sub)menus. + _mp.SetBannerType(new UIResRectangle(new System.Drawing.PointF(0f, 0f), new System.Drawing.SizeF(0f, 0f), System.Drawing.Color.FromArgb(38, 38, 38))); + _mp.ControlDisablingEnabled = false; + _mp.MouseEdgeEnabled = false; } else { - _mp.ProcessMenus(); - if (Game.CurrentInputMode == InputMode.MouseAndKeyboard && Game.IsControlJustPressed(0, Control.InteractionMenu)) { if (_mp.IsAnyMenuOpen()) @@ -79,11 +112,37 @@ private async Task OnTick() { menu.Visible = !_mp.IsAnyMenuOpen(); } - + } + else if (!_mp.IsAnyMenuOpen() && Game.CurrentInputMode == InputMode.GamePad) + { + float timer = 0f; + while (Game.CurrentInputMode == InputMode.GamePad && Game.IsControlPressed(0, Control.InteractionMenu)) + { + timer++; + + if (debug) + { + bt.Draw(0); + float percent = (timer / 60f); + bt.Percentage = percent; + Subtitle.Success(percent.ToString(), 0, true, "Progress:"); + } + + if (timer > 59) + { + menu.Visible = !_mp.IsAnyMenuOpen(); + break; + } + + await Delay(0); + } + } + + _mp.ProcessMenus(); } - + } } diff --git a/vMenu/menus/OnlinePlayers.cs b/vMenu/menus/OnlinePlayers.cs new file mode 100644 index 00000000..fb490bac --- /dev/null +++ b/vMenu/menus/OnlinePlayers.cs @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CitizenFX.Core; +using static CitizenFX.Core.Native.API; +using NativeUI; + +namespace vMenuClient +{ + public class OnlinePlayers + { + // Menu variable, will be defined in CreateMenu() + private UIMenu menu; + private static Notification Notify = new Notification(); + private static Subtitles Subtitle = new Subtitles(); + private CommonFunctions cf = new CommonFunctions(); + + // Public variables (getters only), return the private variables. + //public bool PlayerGodMode { get; private set; } = false; + //public bool PlayerInvisible { get; private set; } = false; + //public bool PlayerStamina { get; private set; } = true; + //public bool PlayerSuperJump { get; private set; } = false; + //public bool PlayerNoRagdoll { get; private set; } = false; + //public bool PlayerNeverWanted { get; private set; } = false; + //public bool PlayerIsIgnored { get; private set; } = false; + //public bool PlayerFrozen { get; private set; } = false; + + + /// + /// Creates the menu. + /// + private void CreateMenu() + { + // Create the menu. + menu = new UIMenu(GetPlayerName(PlayerId()), "Online Players", MainMenu.MenuPosition); + UpdatePlayerlist(); + } + + public void UpdatePlayerlist() + { + + if (menu.MenuItems.Count > 0) + { + menu.MenuItems.Clear(); + } + + PlayerList pl = new PlayerList(); + + foreach (Player p in pl) + { + UIMenuItem playerItem = new UIMenuItem(p.Name, "[" + (p.Handle < 10 ? "0" : "") + p.Handle + "] " + p.Name + " (Server ID: " + p.ServerId + ")"); + menu.AddItem(playerItem); + + menu.OnItemSelect += (sender, item, index) => + { + if (item == playerItem) + { + // Create the player object. + Player player = new Player(int.Parse(item.Description.Substring(1, 1).ToString())); + + // Create the menu for the player. + UIMenu PlayerMenu = new UIMenu(player.Name, "[" + (player.Handle < 10 ? "0" : "") + player.Handle + "] " + player.Name + " (Server ID: " + player.ServerId + ")", MainMenu.MenuPosition) + { + ScaleWithSafezone = false + }; + + PlayerMenu.SetBannerType(new UIResRectangle(new System.Drawing.PointF(0f, 0f), new System.Drawing.SizeF(0f, 0f), System.Drawing.Color.FromArgb(38, 38, 38))); + PlayerMenu.ControlDisablingEnabled = false; + PlayerMenu.MouseEdgeEnabled = false; + + // Create all player options buttons. + UIMenuItem teleportBtn = new UIMenuItem("Teleport to Player", "Teleport to this player."); + UIMenuItem teleportInVehBtn = new UIMenuItem("Teleport into Vehicle", "Telepor into the player's vehicle."); + UIMenuItem setWaypointBtn = new UIMenuItem("Set waypoint", "Set a waypoint to this player."); + UIMenuItem spectateBtn = new UIMenuItem("Spectate Player", "Spectate this player."); + UIMenuItem summonBtn = new UIMenuItem("Summon Player", "Teleport the player in front of you."); + UIMenuItem killBtn = new UIMenuItem("Kill Player", "Kill the other player!"); + UIMenuItem kickPlayerBtn = new UIMenuItem("Kick Player", "Kick the player from the server."); + kickPlayerBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); + + // Add all buttons to the player options submenu. + PlayerMenu.AddItem(teleportBtn); + PlayerMenu.AddItem(teleportInVehBtn); + PlayerMenu.AddItem(setWaypointBtn); + PlayerMenu.AddItem(spectateBtn); + PlayerMenu.AddItem(summonBtn); + PlayerMenu.AddItem(killBtn); + PlayerMenu.AddItem(kickPlayerBtn); + + // Add the player menu to the menu pool. + MainMenu._mp.Add(PlayerMenu); + + // Set the menu invisible. + menu.Visible = false; + // Set the player menu visible. + PlayerMenu.Visible = true; + + + // If a button is pressed in the player's options menu. + PlayerMenu.OnItemSelect += (sender2, item2, index2) => + { + // Teleport button is pressed. + if (item2 == teleportBtn) + { + cf.TeleportToPlayerAsync(player.Handle, false); + } + // Teleport in vehicle button is pressed. + else if (item2 == teleportInVehBtn) + { + cf.TeleportToPlayerAsync(player.Handle, true); + } + // Set waypoint button is pressed. + else if (item2 == setWaypointBtn) + { + World.WaypointPosition = GetEntityCoords(GetPlayerPed(player.Handle), true); + Notify.Info("A new waypoint has been set to " + player.Name, false, false); + } + // Spectate player button is pressed. + else if (item2 == spectateBtn) + { + if (player.Handle == PlayerId()) + { + Notify.Error("You can ~h~not ~w~spectate yourself!"); + } + else + { + //cf.Spectate(playerIndex); + Notify.Error("This feature is not implemented yet!", true, false); + } + } + // Summon player button is pressed. + else if (item2 == summonBtn) + { + cf.SummonPlayer(player); + } + // Kill player button is pressed. + else if (item2 == killBtn) + { + cf.KillPlayer(player); + } + // Kick player button is pressed. + else if (item2 == kickPlayerBtn) + { + //TriggerServerEvent("vMenu:KickPlayer", GetPlayerServerId(playerIndex)); + + Notify.Error("Todo: trigger server event using another class."); + PlayerMenu.Visible = false; + + UpdatePlayerlist(); + + menu.RefreshIndex(); + + menu.Visible = true; + } + }; + + PlayerMenu.OnMenuClose += (sender3) => + { + PlayerMenu.Visible = false; + menu.Visible = true; + }; + } + }; + }; + + + //MainMenu._mp.Add(menu); + + } + + /// + /// Checks if the menu exists, if not then it creates it first. + /// Then returns the menu. + /// + /// The Online Players Menu + public UIMenu GetMenu() + { + if (menu == null) + { + CreateMenu(); + return menu; + } + else + { + UpdatePlayerlist(); + return menu; + } + } + } +} diff --git a/vMenu/PlayerOptions.cs b/vMenu/menus/PlayerOptions.cs similarity index 97% rename from vMenu/PlayerOptions.cs rename to vMenu/menus/PlayerOptions.cs index 97f56ed4..ab854e2b 100644 --- a/vMenu/PlayerOptions.cs +++ b/vMenu/menus/PlayerOptions.cs @@ -27,12 +27,12 @@ public class PlayerOptions public bool PlayerFrozen { get; private set; } = false; /// - /// Create the menu. + /// Creates the menu. /// private void CreateMenu() { // Create the menu. - menu = new UIMenu(GetPlayerName(PlayerId()), "Player Options"); + menu = new UIMenu(GetPlayerName(PlayerId()), "Player Options", MainMenu.MenuPosition); // Create all checkboxes. UIMenuCheckboxItem playerGodModeCheckbox = new UIMenuCheckboxItem("God Mode", PlayerGodMode, "If you turn this on, you won't take any damage."); @@ -229,6 +229,11 @@ private void CreateMenu() } + /// + /// Checks if the menu exists, if not then it creates it first. + /// Then returns the menu. + /// + /// The Player Options Menu public UIMenu GetMenu() { if (menu == null) diff --git a/vMenu/vMenuClient.csproj b/vMenu/vMenuClient.csproj index 823327f9..320580ce 100644 --- a/vMenu/vMenuClient.csproj +++ b/vMenu/vMenuClient.csproj @@ -52,11 +52,13 @@ + + - + diff --git a/vMenuServer/EventManager.cs b/vMenuServer/EventManager.cs index f684d6df..f086ef91 100644 --- a/vMenuServer/EventManager.cs +++ b/vMenuServer/EventManager.cs @@ -14,6 +14,18 @@ public class EventManager : BaseScript public EventManager() { UpdateChecker uc = new UpdateChecker(); + EventHandlers.Add("vMenu:SummonPlayer", new Action(SummonPlayer)); + EventHandlers.Add("vMenu:KillPlayer", new Action(KillPlayer)); + } + + private void KillPlayer([FromSource] Player source, [FromSource] Player target) + { + TriggerClientEvent(player: target, eventName: "vMenu:KillMe"); + } + + private void SummonPlayer([FromSource] Player source, [FromSource]Player target) + { + TriggerClientEvent(player: target, eventName: "vMenu:GoToPlayer", args: source.Handle); } } } From 905f43bf0055655988712c743246c719889a9078 Mon Sep 17 00:00:00 2001 From: Tom Grobbe <31419184+TomGrobbe@users.noreply.github.com> Date: Mon, 19 Feb 2018 16:46:48 +0100 Subject: [PATCH 5/8] Adding vehicle options --- vMenu/FunctionsController.cs | 23 +++++++++++++++++++++-- vMenu/MainMenu.cs | 1 + vMenu/menus/VehicleOptions.cs | 22 ++++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 vMenu/menus/VehicleOptions.cs diff --git a/vMenu/FunctionsController.cs b/vMenu/FunctionsController.cs index 913c8cf6..64b81550 100644 --- a/vMenu/FunctionsController.cs +++ b/vMenu/FunctionsController.cs @@ -11,7 +11,7 @@ namespace vMenuClient { class FunctionsController : BaseScript { - + CommonFunctions cf = new CommonFunctions(); public FunctionsController() { Tick += OnTick; @@ -19,7 +19,7 @@ public FunctionsController() private async Task OnTick() { - // Check if the menu actually exists... we don't want null pointer exceptions or illegal access errors! + // Player options. Only run player options if the player options menu has actually been created. if (MainMenu._po != null) { // Manage Player God Mode @@ -56,6 +56,25 @@ private async Task OnTick() // Manage player frozen. FreezeEntityPosition(PlayerPedId(), MainMenu._po.PlayerFrozen); } + + // Vehicle options. Only run vehicle options if the vehicle options menu has actually been created. + if (MainMenu._vo != null) + { + if (DoesEntityExist(cf.GetVehicle())) + { + Vehicle vehicle = new Vehicle(cf.GetVehicle()); + + if (MainMenu._vo.VehicleGodMode) + { + + } + else + { + + } + } + + } } } } diff --git a/vMenu/MainMenu.cs b/vMenu/MainMenu.cs index 3e673923..ff1f67cf 100644 --- a/vMenu/MainMenu.cs +++ b/vMenu/MainMenu.cs @@ -22,6 +22,7 @@ public class MainMenu : BaseScript public static UIMenu menu; public static PlayerOptions _po; public static OnlinePlayers _op; + public static VehicleOptions _vo; private BarTimerBar bt = new BarTimerBar("Opening Menu"); private bool debug = false; diff --git a/vMenu/menus/VehicleOptions.cs b/vMenu/menus/VehicleOptions.cs new file mode 100644 index 00000000..cbdfeac3 --- /dev/null +++ b/vMenu/menus/VehicleOptions.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CitizenFX.Core; +using static CitizenFX.Core.Native.API; +using NativeUI; + +namespace vMenuClient +{ + class VehicleOptions + { + // Menu variable, will be defined in CreateMenu() + private UIMenu menu; + private static Notification Notify = new Notification(); + private static Subtitles Subtitle = new Subtitles(); + + // Public variables (getters only), return the private variables. + public bool VehicleGodMode { get; private set; } = false; + } +} From d959d171a33a4f9bc2b86d6719750782829449cc Mon Sep 17 00:00:00 2001 From: Tom Grobbe <31419184+TomGrobbe@users.noreply.github.com> Date: Mon, 19 Feb 2018 18:54:00 +0100 Subject: [PATCH 6/8] Check description for more info. - More vehicle options. - Added vehicle options menu to main menu. - Global new custom (streamed) sprite for the banner/menu header was added. - Removed old commented variables from online players menu. - Fixed safezone scaling for some menu's. - Formatted all files. --- vMenu/FunctionsController.cs | 27 ++++++++++++------ vMenu/MainMenu.cs | 30 ++++++++++++-------- vMenu/menus/OnlinePlayers.cs | 26 +++++++----------- vMenu/menus/PlayerOptions.cs | 6 +++- vMenu/menus/VehicleOptions.cs | 44 +++++++++++++++++++++++++++++- vMenu/vMenuClient.csproj | 5 ++-- vMenuServer/HttpHelper.cs | 10 +++---- vMenuServer/UpdateChecker.cs | 2 +- vMenuServer/stream/menubanner.ytd | Bin 0 -> 7981 bytes vMenuServer/vMenuServer.csproj | 10 ++++++- 10 files changed, 113 insertions(+), 47 deletions(-) create mode 100644 vMenuServer/stream/menubanner.ytd diff --git a/vMenu/FunctionsController.cs b/vMenu/FunctionsController.cs index 64b81550..9d8ba996 100644 --- a/vMenu/FunctionsController.cs +++ b/vMenu/FunctionsController.cs @@ -62,18 +62,29 @@ private async Task OnTick() { if (DoesEntityExist(cf.GetVehicle())) { + // Vehicle. Vehicle vehicle = new Vehicle(cf.GetVehicle()); - if (MainMenu._vo.VehicleGodMode) - { - - } - else - { + // God mode + var god = MainMenu._vo.VehicleGodMode; + vehicle.CanBeVisiblyDamaged = !god; + vehicle.CanEngineDegrade = !god; + vehicle.CanTiresBurst = !god; + vehicle.CanWheelsBreak = !god; + vehicle.IsAxlesStrong = god; + vehicle.IsBulletProof = god; + vehicle.IsCollisionProof = god; + vehicle.IsExplosionProof = god; + vehicle.IsFireProof = god; + vehicle.IsInvincible = god; + vehicle.IsMeleeProof = god; + } - } + if (MainMenu._vo.VehicleEngineAlwaysOn && DoesEntityExist(cf.GetVehicle(last: true)) && !DoesEntityExist(cf.GetVehicle(last: false))) + { + SetVehicleEngineOn(cf.GetVehicle(last: true), true, true, true); } - + } } } diff --git a/vMenu/MainMenu.cs b/vMenu/MainMenu.cs index ff1f67cf..b205bb6b 100644 --- a/vMenu/MainMenu.cs +++ b/vMenu/MainMenu.cs @@ -26,6 +26,7 @@ public class MainMenu : BaseScript private BarTimerBar bt = new BarTimerBar("Opening Menu"); private bool debug = false; + public static Sprite BannerSprite { get; private set; } = new Sprite("menubanner", "menu_header", new System.Drawing.PointF(0f, 0f), new System.Drawing.SizeF(0f, 0f)); /// /// Constructor. @@ -62,8 +63,6 @@ private async Task OnTick() menu.RefreshIndex(); menu.ScaleWithSafezone = false; - menu.UpdateScaleform(); - menu.RefreshIndex(); // Create all (sub)menus. @@ -73,32 +72,39 @@ private async Task OnTick() menu.AddItem(onlinePlayersBtn); _op = new OnlinePlayers(); UIMenu onlinePlayers = _op.GetMenu(); - - onlinePlayers.ScaleWithSafezone = false; - onlinePlayers.UpdateScaleform(); - menu.BindMenuToItem(onlinePlayers, onlinePlayersBtn); _mp.Add(onlinePlayers); + menu.UpdateScaleform(); // Add the player options menu. UIMenuItem playerOptionsBtn = new UIMenuItem("Player Options", "Common player options can be accessed here."); menu.AddItem(playerOptionsBtn); _po = new PlayerOptions(); UIMenu playerOptions = _po.GetMenu(); - playerOptions.ScaleWithSafezone = false; - playerOptions.UpdateScaleform(); - menu.BindMenuToItem(playerOptions, playerOptionsBtn); _mp.Add(playerOptions); - _mp.RefreshIndex(); + // Add the vehicle options Menu. + UIMenuItem vehicleOptionsBtn = new UIMenuItem("Vehicle Options", "Here you can change common vehicle options, as well as tune & style your vehicle."); + menu.AddItem(vehicleOptionsBtn); + _vo = new VehicleOptions(); + UIMenu vehicleOptions = _vo.GetMenu(); + menu.BindMenuToItem(vehicleOptions, vehicleOptionsBtn); + _mp.Add(vehicleOptions); + + + // Refresh everything. + _mp.RefreshIndex(); onlinePlayers.UpdateScaleform(); playerOptions.UpdateScaleform(); menu.UpdateScaleform(); - _mp.SetBannerType(new UIResRectangle(new System.Drawing.PointF(0f, 0f), new System.Drawing.SizeF(0f, 0f), System.Drawing.Color.FromArgb(38, 38, 38))); + // Set the banner globally. + _mp.SetBannerType(BannerSprite); + // Globally disable the native ui controls disabling. _mp.ControlDisablingEnabled = false; + // Globally disable the "mouse edge" feature. _mp.MouseEdgeEnabled = false; } else @@ -129,7 +135,7 @@ private async Task OnTick() bt.Percentage = percent; Subtitle.Success(percent.ToString(), 0, true, "Progress:"); } - + if (timer > 59) { menu.Visible = !_mp.IsAnyMenuOpen(); diff --git a/vMenu/menus/OnlinePlayers.cs b/vMenu/menus/OnlinePlayers.cs index fb490bac..4f65114d 100644 --- a/vMenu/menus/OnlinePlayers.cs +++ b/vMenu/menus/OnlinePlayers.cs @@ -17,16 +17,6 @@ public class OnlinePlayers private static Subtitles Subtitle = new Subtitles(); private CommonFunctions cf = new CommonFunctions(); - // Public variables (getters only), return the private variables. - //public bool PlayerGodMode { get; private set; } = false; - //public bool PlayerInvisible { get; private set; } = false; - //public bool PlayerStamina { get; private set; } = true; - //public bool PlayerSuperJump { get; private set; } = false; - //public bool PlayerNoRagdoll { get; private set; } = false; - //public bool PlayerNeverWanted { get; private set; } = false; - //public bool PlayerIsIgnored { get; private set; } = false; - //public bool PlayerFrozen { get; private set; } = false; - /// /// Creates the menu. @@ -34,13 +24,17 @@ public class OnlinePlayers private void CreateMenu() { // Create the menu. - menu = new UIMenu(GetPlayerName(PlayerId()), "Online Players", MainMenu.MenuPosition); + menu = new UIMenu(GetPlayerName(PlayerId()), "Online Players", MainMenu.MenuPosition) + { + ScaleWithSafezone = false, + MouseEdgeEnabled = false + }; UpdatePlayerlist(); } public void UpdatePlayerlist() { - + if (menu.MenuItems.Count > 0) { menu.MenuItems.Clear(); @@ -66,7 +60,7 @@ public void UpdatePlayerlist() ScaleWithSafezone = false }; - PlayerMenu.SetBannerType(new UIResRectangle(new System.Drawing.PointF(0f, 0f), new System.Drawing.SizeF(0f, 0f), System.Drawing.Color.FromArgb(38, 38, 38))); + PlayerMenu.SetBannerType(MainMenu.BannerSprite); PlayerMenu.ControlDisablingEnabled = false; PlayerMenu.MouseEdgeEnabled = false; @@ -88,7 +82,7 @@ public void UpdatePlayerlist() PlayerMenu.AddItem(summonBtn); PlayerMenu.AddItem(killBtn); PlayerMenu.AddItem(kickPlayerBtn); - + // Add the player menu to the menu pool. MainMenu._mp.Add(PlayerMenu); @@ -164,8 +158,8 @@ public void UpdatePlayerlist() } }; }; - - + + //MainMenu._mp.Add(menu); } diff --git a/vMenu/menus/PlayerOptions.cs b/vMenu/menus/PlayerOptions.cs index ab854e2b..c7c2bee7 100644 --- a/vMenu/menus/PlayerOptions.cs +++ b/vMenu/menus/PlayerOptions.cs @@ -32,7 +32,11 @@ public class PlayerOptions private void CreateMenu() { // Create the menu. - menu = new UIMenu(GetPlayerName(PlayerId()), "Player Options", MainMenu.MenuPosition); + menu = new UIMenu(GetPlayerName(PlayerId()), "Player Options", MainMenu.MenuPosition) + { + ScaleWithSafezone = false, + MouseEdgeEnabled = false + }; // Create all checkboxes. UIMenuCheckboxItem playerGodModeCheckbox = new UIMenuCheckboxItem("God Mode", PlayerGodMode, "If you turn this on, you won't take any damage."); diff --git a/vMenu/menus/VehicleOptions.cs b/vMenu/menus/VehicleOptions.cs index cbdfeac3..912b071d 100644 --- a/vMenu/menus/VehicleOptions.cs +++ b/vMenu/menus/VehicleOptions.cs @@ -9,7 +9,7 @@ namespace vMenuClient { - class VehicleOptions + public class VehicleOptions { // Menu variable, will be defined in CreateMenu() private UIMenu menu; @@ -18,5 +18,47 @@ class VehicleOptions // Public variables (getters only), return the private variables. public bool VehicleGodMode { get; private set; } = false; + public bool VehicleEngineAlwaysOn { get; private set; } = false; + public bool VehicleNoSiren { get; private set; } = false; + public bool VehicleNoBikeHelemet { get; private set; } = false; + + private void CreateMenu() + { + // Create the menu. + menu = new UIMenu(GetPlayerName(PlayerId()), "Vehicle Options", MainMenu.MenuPosition) + { + ScaleWithSafezone = false, + MouseEdgeEnabled = false + }; + + // Create Checkboxes. + UIMenuCheckboxItem vehicleGod = new UIMenuCheckboxItem("God Mode", VehicleGodMode, "Disables any type of visual or physical damage to your vehicle."); + UIMenuCheckboxItem vehicleEngineAO = new UIMenuCheckboxItem("Engine Always On", VehicleEngineAlwaysOn, "Keeps your vehicle engine on when you exit your vehicle."); + UIMenuCheckboxItem vehicleNoSiren = new UIMenuCheckboxItem("Disable Siren", VehicleNoSiren, "Disables your vehicle's siren. Only works if your vehicle actually has a siren."); + UIMenuCheckboxItem vehicleNoBikeHelmet = new UIMenuCheckboxItem("No Bike Helmet", VehicleNoBikeHelemet, "No longer auto-equip a helmet when getting on a bike or quad."); + + // Create buttons. + UIMenuItem fixVehicle = new UIMenuItem("Repair Vehicle", "Repair any visual and physical damage present on your vehicle."); + UIMenuItem cleanVehicle = new UIMenuItem("Repair Vehicle", "Repair any visual and physical damage present on your vehicle."); + UIMenuItem setLicensePlateText = new UIMenuItem("Set License Plate Text", "Enter a custom license plate for your vehicle."); + + // Create lists. + var dirtlevel = new List {"Clean", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; + UIMenuListItem setDirtLevel = new UIMenuListItem("Set Dirt Level", dirtlevel, 0, "Select how much dirt should be visible on your vehicle. This won't freeze the dirt level, it will only set it once."); + var licensePlates = new List { GetLabelText("CMOD_PLA_1"), GetLabelText("CMOD_PLA_2"), GetLabelText("CMOD_PLA_3"), GetLabelText("CMOD_PLA_4"), "North Yankton" }; + UIMenuListItem setLicensePlateType = new UIMenuListItem("License Plate Type", licensePlates, 0, "Select a license plate type and press enter to apply it to your vehicle."); + + menu.AddItem(setLicensePlateType); + + } + + public UIMenu GetMenu() + { + if (menu == null) + { + CreateMenu(); + } + return menu; + } } } diff --git a/vMenu/vMenuClient.csproj b/vMenu/vMenuClient.csproj index 320580ce..1ca9c892 100644 --- a/vMenu/vMenuClient.csproj +++ b/vMenu/vMenuClient.csproj @@ -56,6 +56,7 @@ + @@ -66,7 +67,7 @@ - - + copy /Y "D:\Tom Grobbe\Documents\GitHub Repos\vMenu\NativeUI.dll" "D:\FXserver\vMenu\resources\vMenu\" +copy /Y "D:\Tom Grobbe\Documents\GitHub Repos\vMenu\vMenuClient.net.dll" "D:\FXserver\vMenu\resources\vMenu\" \ No newline at end of file diff --git a/vMenuServer/HttpHelper.cs b/vMenuServer/HttpHelper.cs index 58294389..cf2f69a6 100644 --- a/vMenuServer/HttpHelper.cs +++ b/vMenuServer/HttpHelper.cs @@ -64,7 +64,7 @@ public async Task> Http(string url, string method, s public class Request : BaseScript { - public Request() {} + public Request() { } public async Task Http(string url, string method = "GET", string data = "", Dictionary headers = null) { @@ -73,12 +73,12 @@ public async Task Http(string url, string method = "GET", strin await Exports[API.GetCurrentResourceName()].HttpRequest(url, method, data, headers) ); } - + private WebHeaderCollection ParseHeadersInternal(dynamic headerDyn) { WebHeaderCollection headers = new WebHeaderCollection(); - IDictionary headerDict = (IDictionary) headerDyn; - foreach(KeyValuePair entry in headerDict) + IDictionary headerDict = (IDictionary)headerDyn; + foreach (KeyValuePair entry in headerDict) { headers.Add(entry.Key, entry.Value.ToString()); } @@ -92,7 +92,7 @@ private HttpStatusCode ParseStatusInternal(int status) private RequestResponse ParseRequestResponseInternal(IDictionary rr) { - RequestResponse result = new RequestResponse(); + RequestResponse result = new RequestResponse(); result.status = ParseStatusInternal(rr["status"]); result.headers = ParseHeadersInternal(rr["headers"]); result.content = rr["content"]; diff --git a/vMenuServer/UpdateChecker.cs b/vMenuServer/UpdateChecker.cs index d8e7a073..7096bd4e 100644 --- a/vMenuServer/UpdateChecker.cs +++ b/vMenuServer/UpdateChecker.cs @@ -46,7 +46,7 @@ private async Task CheckUpdates() Debug.WriteLine(" | A new version is available, please update! |"); Debug.WriteLine(" | >> https://github.com/tomgrobbe/vMenu << |"); } - + Debug.WriteLine(" +---------------------------------------------+\r\n"); } } diff --git a/vMenuServer/stream/menubanner.ytd b/vMenuServer/stream/menubanner.ytd new file mode 100644 index 0000000000000000000000000000000000000000..eb52c214a2183f69ecebda903089e134a670b43f GIT binary patch literal 7981 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 literal 0 HcmV?d00001 diff --git a/vMenuServer/vMenuServer.csproj b/vMenuServer/vMenuServer.csproj index 7a47c977..dd4bd183 100644 --- a/vMenuServer/vMenuServer.csproj +++ b/vMenuServer/vMenuServer.csproj @@ -54,9 +54,17 @@ + + Always + stream + - copy /Y "D:\Tom Grobbe\Documents\GitHub Repos\vMenu\*" "D:\FXserver\vMenu\resources\vMenu\" + copy /Y "D:\Tom Grobbe\Documents\GitHub Repos\vMenu\Newtonsoft.Json.dll" "D:\FXserver\vMenu\resources\vMenu\" +copy /Y "D:\Tom Grobbe\Documents\GitHub Repos\vMenu\Newtonsoft.Json.xml" "D:\FXserver\vMenu\resources\vMenu\" +copy /Y "D:\Tom Grobbe\Documents\GitHub Repos\vMenu\vMenuServer.net.dll" "D:\FXserver\vMenu\resources\vMenu\" +copy /Y "D:\Tom Grobbe\Documents\GitHub Repos\vMenu\stream\menubanner.ytd" "D:\FXserver\vMenu\resources\vMenu\stream\" + \ No newline at end of file From 00d8543dcaee5a1c93ef88050d3641809710d5c7 Mon Sep 17 00:00:00 2001 From: Tom Grobbe <31419184+TomGrobbe@users.noreply.github.com> Date: Mon, 19 Feb 2018 19:01:40 +0100 Subject: [PATCH 7/8] Added a default/backup color for the menu in case the sprite fails to load. --- vMenu/MainMenu.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vMenu/MainMenu.cs b/vMenu/MainMenu.cs index b205bb6b..24a92446 100644 --- a/vMenu/MainMenu.cs +++ b/vMenu/MainMenu.cs @@ -26,7 +26,7 @@ public class MainMenu : BaseScript private BarTimerBar bt = new BarTimerBar("Opening Menu"); private bool debug = false; - public static Sprite BannerSprite { get; private set; } = new Sprite("menubanner", "menu_header", new System.Drawing.PointF(0f, 0f), new System.Drawing.SizeF(0f, 0f)); + public static Sprite BannerSprite { get; private set; } = new Sprite("menubanner", "menu_header", new System.Drawing.PointF(0f, 0f), new System.Drawing.SizeF(0f, 0f), 0f, UnknownColors.DarkGray); /// /// Constructor. From a4b908a4af411886e9ad9c2fe9f7791c1b0593c6 Mon Sep 17 00:00:00 2001 From: Tom Grobbe <31419184+TomGrobbe@users.noreply.github.com> Date: Mon, 19 Feb 2018 19:53:15 +0100 Subject: [PATCH 8/8] Added all vehicle options (not functional yet) --- vMenu/menus/VehicleOptions.cs | 60 ++++++++++++++++++++++++++++++++-- vMenuServer/vMenuServer.csproj | 2 +- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/vMenu/menus/VehicleOptions.cs b/vMenu/menus/VehicleOptions.cs index 912b071d..98cd2e2f 100644 --- a/vMenu/menus/VehicleOptions.cs +++ b/vMenu/menus/VehicleOptions.cs @@ -21,6 +21,9 @@ public class VehicleOptions public bool VehicleEngineAlwaysOn { get; private set; } = false; public bool VehicleNoSiren { get; private set; } = false; public bool VehicleNoBikeHelemet { get; private set; } = false; + public bool VehicleFrozen { get; private set; } = false; + public bool VehicleTorqueMultiplier { get; private set; } = false; + public bool VehiclePowerMultiplier { get; private set; } = false; private void CreateMenu() { @@ -36,19 +39,70 @@ private void CreateMenu() UIMenuCheckboxItem vehicleEngineAO = new UIMenuCheckboxItem("Engine Always On", VehicleEngineAlwaysOn, "Keeps your vehicle engine on when you exit your vehicle."); UIMenuCheckboxItem vehicleNoSiren = new UIMenuCheckboxItem("Disable Siren", VehicleNoSiren, "Disables your vehicle's siren. Only works if your vehicle actually has a siren."); UIMenuCheckboxItem vehicleNoBikeHelmet = new UIMenuCheckboxItem("No Bike Helmet", VehicleNoBikeHelemet, "No longer auto-equip a helmet when getting on a bike or quad."); + UIMenuCheckboxItem vehicleFreeze = new UIMenuCheckboxItem("Freeze Vehicle", VehicleFrozen, "No longer auto-equip a helmet when getting on a bike or quad."); + UIMenuCheckboxItem torqueEnabled = new UIMenuCheckboxItem("Enable Torque Multiplier", VehicleTorqueMultiplier, "Enables the torque multiplier selected from the list below."); + UIMenuCheckboxItem powerEnabled = new UIMenuCheckboxItem("Enable Power Multiplier", VehiclePowerMultiplier, "Enables the power multiplier selected from the list below."); // Create buttons. UIMenuItem fixVehicle = new UIMenuItem("Repair Vehicle", "Repair any visual and physical damage present on your vehicle."); UIMenuItem cleanVehicle = new UIMenuItem("Repair Vehicle", "Repair any visual and physical damage present on your vehicle."); UIMenuItem setLicensePlateText = new UIMenuItem("Set License Plate Text", "Enter a custom license plate for your vehicle."); + UIMenuItem modMenuBtn = new UIMenuItem("Mod Menu", "Tune and customize your vehicle here."); + UIMenuItem doorsMenuBtn = new UIMenuItem("Vehicle Doors", "Open, close, remove and restore vehicle doors here."); + UIMenuItem windowsMenuBtn = new UIMenuItem("Vehicle Windows", "Roll your windows up/down or remove/restore your vehicle windows here."); + UIMenuItem componentsMenuBtn = new UIMenuItem("Vehicle Extras", "Add/remove vehicle components/extras."); + UIMenuItem liveriesMenuBtn = new UIMenuItem("Vehicle Liveries", "Style your vehicle with fancy liveries!"); + UIMenuItem colorsMenuBtn = new UIMenuItem("Vehicle Colors", "Style your vehicle even further by giving it some ~g~Snailsome ~s~colors!"); + UIMenuItem deleteBtn = new UIMenuItem("~r~Delete Vehicle", "Delete your vehicle, this ~r~can NOT be undone~s~!"); + deleteBtn.SetRightBadge(UIMenuItem.BadgeStyle.Alert); + UIMenuItem flipVehicle = new UIMenuItem("Flip Vehicle", "Sets your current vehicle on all 4 wheels."); + UIMenuItem vehicleAlarm = new UIMenuItem("Toggle Vehicle Alarm", "Starts/stops your vehicle's alarm."); + UIMenuItem cycleSeats = new UIMenuItem("Cycle Through Vehicle Seats", "Cycle through the available vehicle seats."); // Create lists. - var dirtlevel = new List {"Clean", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; + var dirtlevel = new List { "Clean", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; UIMenuListItem setDirtLevel = new UIMenuListItem("Set Dirt Level", dirtlevel, 0, "Select how much dirt should be visible on your vehicle. This won't freeze the dirt level, it will only set it once."); - var licensePlates = new List { GetLabelText("CMOD_PLA_1"), GetLabelText("CMOD_PLA_2"), GetLabelText("CMOD_PLA_3"), GetLabelText("CMOD_PLA_4"), "North Yankton" }; + var licensePlates = new List { GetLabelText("CMOD_PLA_0"), GetLabelText("CMOD_PLA_1"), GetLabelText("CMOD_PLA_2"), GetLabelText("CMOD_PLA_3"), GetLabelText("CMOD_PLA_4"), "North Yankton" }; UIMenuListItem setLicensePlateType = new UIMenuListItem("License Plate Type", licensePlates, 0, "Select a license plate type and press enter to apply it to your vehicle."); + var torqueMultiplierList = new List { 1 }; + UIMenuListItem torqueMultiplier = new UIMenuListItem("Engine Torque Multiplier", torqueMultiplierList, 0, "Select the engine torque multiplier."); + var engineMultiplierList = new List { 1 }; + UIMenuListItem powerMultiplier = new UIMenuListItem("Engine Power Multiplier", engineMultiplierList, 0, "Select the engine power multiplier."); - menu.AddItem(setLicensePlateType); + // Submenu's + UIMenu vehicleModMenu = new UIMenu("Mod Menu", "Vehicle Mods"); + UIMenu vehicleDoorsMenu = new UIMenu("Vehicle Doors", "Vehicle Doors Management"); + UIMenu vehicleWindowsMenu = new UIMenu("Vehicle Windows", "Vehicle Windows Management"); + UIMenu vehicleComponents = new UIMenu("Vehicle Extras", "Vehicle Extras/Components"); + UIMenu vehicleLiveries = new UIMenu("Vehicle Liveries", "Vehicle Liveries."); + UIMenu vehicleColors = new UIMenu("Vehicle Colors", "Vehicle Colors"); + + + // Add everything to the menu. + menu.AddItem(vehicleGod); // GOD MODE + menu.AddItem(fixVehicle); // REPAIR VEHICLE + menu.AddItem(cleanVehicle); // CLEAN VEHICLE + menu.AddItem(setDirtLevel); // SET DIRT LEVEL + menu.AddItem(setLicensePlateText); // SET LICENSE PLATE TEXT + menu.AddItem(setLicensePlateType); // SET LICENSE PLATE TYPE + menu.AddItem(modMenuBtn); // MOD MENU + menu.AddItem(colorsMenuBtn); // COLORS MENU + menu.AddItem(liveriesMenuBtn); // LIVERIES MENU + menu.AddItem(componentsMenuBtn); // COMPONENTS MENU + menu.AddItem(doorsMenuBtn); // DOORS MENU + menu.AddItem(windowsMenuBtn); // WINDOWS MENU + menu.AddItem(deleteBtn); // DELETE VEHICLE + menu.AddItem(vehicleFreeze); // FREEZE VEHICLE + menu.AddItem(torqueEnabled); // TORQUE ENABLED + menu.AddItem(torqueMultiplier); // TORQUE LIST + menu.AddItem(powerEnabled); // POWER ENABLED + menu.AddItem(powerMultiplier); // POWER LIST + menu.AddItem(flipVehicle); // FLIP VEHICLE + menu.AddItem(vehicleAlarm); // TOGGLE VEHICLE ALARM + menu.AddItem(cycleSeats); // CYCLE THROUGH VEHICLE SEATS + menu.AddItem(vehicleEngineAO); // LEAVE ENGINE RUNNING + menu.AddItem(vehicleNoSiren); // DISABLE SIREN + menu.AddItem(vehicleNoBikeHelmet); // DISABLE BIKE HELMET } diff --git a/vMenuServer/vMenuServer.csproj b/vMenuServer/vMenuServer.csproj index dd4bd183..32d262e9 100644 --- a/vMenuServer/vMenuServer.csproj +++ b/vMenuServer/vMenuServer.csproj @@ -55,7 +55,7 @@ - Always + PreserveNewest stream