350 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			350 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| ---
 | |
| --- @author Dylan MALANDAIN
 | |
| --- @version 2.0.0
 | |
| --- @since 2020
 | |
| ---
 | |
| --- RageUI Is Advanced UI Libs in LUA for make beautiful interface like RockStar GAME.
 | |
| ---
 | |
| ---
 | |
| --- Commercial Info.
 | |
| --- Any use for commercial purposes is strictly prohibited and will be punished.
 | |
| ---
 | |
| --- @see RageUI
 | |
| ---
 | |
| 
 | |
| RageUI.LastControl = false
 | |
| 
 | |
| local ControlActions = {
 | |
|     'Left',
 | |
|     'Right',
 | |
|     'Select',
 | |
|     'Click',
 | |
| }
 | |
| 
 | |
| ---GoUp
 | |
| ---@param Options number
 | |
| ---@return nil
 | |
| ---@public
 | |
| function RageUI.GoUp(Options)
 | |
|     local CurrentMenu = RageUI.CurrentMenu;
 | |
|     if CurrentMenu ~= nil then
 | |
|         Options = CurrentMenu.Options
 | |
|         if CurrentMenu() then
 | |
|             if (Options ~= 0) then
 | |
|                 if Options > CurrentMenu.Pagination.Total then
 | |
|                     if CurrentMenu.Index <= CurrentMenu.Pagination.Minimum then
 | |
|                         if CurrentMenu.Index == 1 then
 | |
|                             CurrentMenu.Pagination.Minimum = Options - (CurrentMenu.Pagination.Total - 1)
 | |
|                             CurrentMenu.Pagination.Maximum = Options
 | |
|                             CurrentMenu.Index = Options
 | |
|                         else
 | |
|                             CurrentMenu.Pagination.Minimum = (CurrentMenu.Pagination.Minimum - 1)
 | |
|                             CurrentMenu.Pagination.Maximum = (CurrentMenu.Pagination.Maximum - 1)
 | |
|                             CurrentMenu.Index = CurrentMenu.Index - 1
 | |
|                         end
 | |
|                     else
 | |
|                         CurrentMenu.Index = CurrentMenu.Index - 1
 | |
|                     end
 | |
|                 else
 | |
|                     if CurrentMenu.Index == 1 then
 | |
|                         CurrentMenu.Pagination.Minimum = Options - (CurrentMenu.Pagination.Total - 1)
 | |
|                         CurrentMenu.Pagination.Maximum = Options
 | |
|                         CurrentMenu.Index = Options
 | |
|                     else
 | |
|                         CurrentMenu.Index = CurrentMenu.Index - 1
 | |
|                     end
 | |
|                 end
 | |
| 
 | |
|                 local Audio = RageUI.Settings.Audio
 | |
|                 RageUI.PlaySound(Audio[Audio.Use].UpDown.audioName, Audio[Audio.Use].UpDown.audioRef)
 | |
|                 RageUI.LastControl = true
 | |
|                 if (CurrentMenu.onIndexChange ~= nil) then
 | |
|                     Citizen.CreateThread(function()
 | |
|                         CurrentMenu.onIndexChange(CurrentMenu.Index)
 | |
|                     end)
 | |
|                 end
 | |
|             else
 | |
|                 local Audio = RageUI.Settings.Audio
 | |
|                 RageUI.PlaySound(Audio[Audio.Use].Error.audioName, Audio[Audio.Use].Error.audioRef)
 | |
|             end
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| ---GoDown
 | |
| ---@param Options number
 | |
| ---@return nil
 | |
| ---@public
 | |
| function RageUI.GoDown(Options)
 | |
|     local CurrentMenu = RageUI.CurrentMenu;
 | |
|     if CurrentMenu ~= nil then
 | |
|         Options = CurrentMenu.Options
 | |
|         if CurrentMenu() then
 | |
|             if (Options ~= 0) then
 | |
|                 if Options > CurrentMenu.Pagination.Total then
 | |
|                     if CurrentMenu.Index >= CurrentMenu.Pagination.Maximum then
 | |
|                         if CurrentMenu.Index == Options then
 | |
|                             CurrentMenu.Pagination.Minimum = 1
 | |
|                             CurrentMenu.Pagination.Maximum = CurrentMenu.Pagination.Total
 | |
|                             CurrentMenu.Index = 1
 | |
|                         else
 | |
|                             CurrentMenu.Pagination.Maximum = (CurrentMenu.Pagination.Maximum + 1)
 | |
|                             CurrentMenu.Pagination.Minimum = CurrentMenu.Pagination.Maximum - (CurrentMenu.Pagination.Total - 1)
 | |
|                             CurrentMenu.Index = CurrentMenu.Index + 1
 | |
|                         end
 | |
|                     else
 | |
|                         CurrentMenu.Index = CurrentMenu.Index + 1
 | |
|                     end
 | |
|                 else
 | |
|                     if CurrentMenu.Index == Options then
 | |
|                         CurrentMenu.Pagination.Minimum = 1
 | |
|                         CurrentMenu.Pagination.Maximum = CurrentMenu.Pagination.Total
 | |
|                         CurrentMenu.Index = 1
 | |
|                     else
 | |
|                         CurrentMenu.Index = CurrentMenu.Index + 1
 | |
|                     end
 | |
|                 end
 | |
|                 local Audio = RageUI.Settings.Audio
 | |
|                 RageUI.PlaySound(Audio[Audio.Use].UpDown.audioName, Audio[Audio.Use].UpDown.audioRef)
 | |
|                 RageUI.LastControl = false
 | |
|                 if (CurrentMenu.onIndexChange ~= nil) then
 | |
|                     Citizen.CreateThread(function()
 | |
|                         CurrentMenu.onIndexChange(CurrentMenu.Index)
 | |
|                     end)
 | |
|                 end
 | |
|             else
 | |
|                 local Audio = RageUI.Settings.Audio
 | |
|                 RageUI.PlaySound(Audio[Audio.Use].Error.audioName, Audio[Audio.Use].Error.audioRef)
 | |
|             end
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| function RageUI.GoActionControl(Controls, Action)
 | |
|     if Controls[Action or 'Left'].Enabled then
 | |
|         for Index = 1, #Controls[Action or 'Left'].Keys do
 | |
|             if not Controls[Action or 'Left'].Pressed then
 | |
|                 if IsDisabledControlJustPressed(Controls[Action or 'Left'].Keys[Index][1], Controls[Action or 'Left'].Keys[Index][2]) then
 | |
|                     Controls[Action or 'Left'].Pressed = true
 | |
|                     Citizen.CreateThread(function()
 | |
|                         Controls[Action or 'Left'].Active = true
 | |
|                         Citizen.Wait(0.01)
 | |
|                         Controls[Action or 'Left'].Active = false
 | |
|                         Citizen.Wait(175)
 | |
|                         while Controls[Action or 'Left'].Enabled and IsDisabledControlPressed(Controls[Action or 'Left'].Keys[Index][1], Controls[Action or 'Left'].Keys[Index][2]) do
 | |
|                             Controls[Action or 'Left'].Active = true
 | |
|                             Citizen.Wait(1)
 | |
|                             Controls[Action or 'Left'].Active = false
 | |
|                             Citizen.Wait(124)
 | |
|                         end
 | |
|                         Controls[Action or 'Left'].Pressed = false
 | |
|                         if (Action ~= ControlActions[5]) then
 | |
|                             Citizen.Wait(10)
 | |
|                         end
 | |
|                     end)
 | |
|                     break
 | |
|                 end
 | |
|             end
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| function RageUI.GoActionControlSlider(Controls, Action)
 | |
|     if Controls[Action].Enabled then
 | |
|         for Index = 1, #Controls[Action].Keys do
 | |
|             if not Controls[Action].Pressed then
 | |
|                 if IsDisabledControlJustPressed(Controls[Action].Keys[Index][1], Controls[Action].Keys[Index][2]) then
 | |
|                     Controls[Action].Pressed = true
 | |
|                     Citizen.CreateThread(function()
 | |
|                         Controls[Action].Active = true
 | |
|                         Citizen.Wait(1)
 | |
|                         Controls[Action].Active = false
 | |
|                         while Controls[Action].Enabled and IsDisabledControlPressed(Controls[Action].Keys[Index][1], Controls[Action].Keys[Index][2]) do
 | |
|                             Controls[Action].Active = true
 | |
|                             Citizen.Wait(1)
 | |
|                             Controls[Action].Active = false
 | |
|                         end
 | |
|                         Controls[Action].Pressed = false
 | |
|                     end)
 | |
|                     break
 | |
|                 end
 | |
|             end
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| ---Controls
 | |
| ---@return nil
 | |
| ---@public
 | |
| function RageUI.Controls()
 | |
|     local CurrentMenu = RageUI.CurrentMenu;
 | |
|     if CurrentMenu ~= nil then
 | |
|         if CurrentMenu() then
 | |
|             if CurrentMenu.Open then
 | |
| 
 | |
|                 local Controls = CurrentMenu.Controls;
 | |
|                 ---@type number
 | |
|                 local Options = CurrentMenu.Options
 | |
|                 RageUI.Options = CurrentMenu.Options
 | |
|                 if CurrentMenu.EnableMouse then
 | |
|                     DisableAllControlActions(2)
 | |
|                 end
 | |
| 
 | |
|                 if not IsInputDisabled(2) then
 | |
|                     for Index = 1, #Controls.Enabled.Controller do
 | |
|                         EnableControlAction(Controls.Enabled.Controller[Index][1], Controls.Enabled.Controller[Index][2], true)
 | |
|                     end
 | |
|                 else
 | |
|                     for Index = 1, #Controls.Enabled.Keyboard do
 | |
|                         EnableControlAction(Controls.Enabled.Keyboard[Index][1], Controls.Enabled.Keyboard[Index][2], true)
 | |
|                     end
 | |
|                 end
 | |
| 
 | |
|                 if Controls.Up.Enabled then
 | |
|                     for Index = 1, #Controls.Up.Keys do
 | |
|                         if not Controls.Up.Pressed then
 | |
|                             if IsDisabledControlJustPressed(Controls.Up.Keys[Index][1], Controls.Up.Keys[Index][2]) then
 | |
|                                 Controls.Up.Pressed = true
 | |
|                                 Citizen.CreateThread(function()
 | |
|                                     RageUI.GoUp(Options)
 | |
|                                     Citizen.Wait(175)
 | |
|                                     while Controls.Up.Enabled and IsDisabledControlPressed(Controls.Up.Keys[Index][1], Controls.Up.Keys[Index][2]) do
 | |
|                                         RageUI.GoUp(Options)
 | |
|                                         Citizen.Wait(50)
 | |
|                                     end
 | |
|                                     Controls.Up.Pressed = false
 | |
|                                 end)
 | |
|                                 break
 | |
|                             end
 | |
|                         end
 | |
|                     end
 | |
|                 end
 | |
| 
 | |
|                 if Controls.Down.Enabled then
 | |
|                     for Index = 1, #Controls.Down.Keys do
 | |
|                         if not Controls.Down.Pressed then
 | |
|                             if IsDisabledControlJustPressed(Controls.Down.Keys[Index][1], Controls.Down.Keys[Index][2]) then
 | |
|                                 Controls.Down.Pressed = true
 | |
|                                 Citizen.CreateThread(function()
 | |
|                                     RageUI.GoDown(Options)
 | |
|                                     Citizen.Wait(175)
 | |
|                                     while Controls.Down.Enabled and IsDisabledControlPressed(Controls.Down.Keys[Index][1], Controls.Down.Keys[Index][2]) do
 | |
|                                         RageUI.GoDown(Options)
 | |
|                                         Citizen.Wait(50)
 | |
|                                     end
 | |
|                                     Controls.Down.Pressed = false
 | |
|                                 end)
 | |
|                                 break
 | |
|                             end
 | |
|                         end
 | |
|                     end
 | |
|                 end
 | |
| 
 | |
|                 for i = 1, #ControlActions do
 | |
|                     RageUI.GoActionControl(Controls, ControlActions[i])
 | |
|                 end
 | |
| 
 | |
|                 RageUI.GoActionControlSlider(Controls, 'SliderLeft')
 | |
|                 RageUI.GoActionControlSlider(Controls, 'SliderRight')
 | |
| 
 | |
|                 if Controls.Back.Enabled then
 | |
|                     for Index = 1, #Controls.Back.Keys do
 | |
|                         if not Controls.Back.Pressed then
 | |
|                             if IsDisabledControlJustPressed(Controls.Back.Keys[Index][1], Controls.Back.Keys[Index][2]) then
 | |
|                                 Controls.Back.Pressed = true
 | |
|                                 Citizen.Wait(10)
 | |
|                                 break
 | |
|                             end
 | |
|                         end
 | |
|                     end
 | |
|                 end
 | |
| 
 | |
|             end
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| ---Navigation
 | |
| ---@return nil
 | |
| ---@public
 | |
| function RageUI.Navigation()
 | |
|     local CurrentMenu = RageUI.CurrentMenu;
 | |
|     if CurrentMenu ~= nil then
 | |
|         if CurrentMenu() and (CurrentMenu.Display.Navigation) then
 | |
|             if CurrentMenu.EnableMouse then
 | |
|                 SetMouseCursorActiveThisFrame()
 | |
|             end
 | |
|             if RageUI.Options > CurrentMenu.Pagination.Total then
 | |
| 
 | |
|                 ---@type boolean
 | |
|                 local UpHovered = false
 | |
| 
 | |
|                 ---@type boolean
 | |
|                 local DownHovered = false
 | |
| 
 | |
|                 if not CurrentMenu.SafeZoneSize then
 | |
|                     CurrentMenu.SafeZoneSize = { X = 0, Y = 0 }
 | |
| 
 | |
|                     if CurrentMenu.Safezone then
 | |
|                         CurrentMenu.SafeZoneSize = RageUI.GetSafeZoneBounds()
 | |
| 
 | |
|                         SetScriptGfxAlign(76, 84)
 | |
|                         SetScriptGfxAlignParams(0, 0, 0, 0)
 | |
|                     end
 | |
|                 end
 | |
| 
 | |
|                 if CurrentMenu.EnableMouse then
 | |
|                     UpHovered = RageUI.IsMouseInBounds(CurrentMenu.X + CurrentMenu.SafeZoneSize.X, CurrentMenu.Y + CurrentMenu.SafeZoneSize.Y + CurrentMenu.SubtitleHeight + RageUI.ItemOffset, RageUI.Settings.Items.Navigation.Rectangle.Width + CurrentMenu.WidthOffset, RageUI.Settings.Items.Navigation.Rectangle.Height)
 | |
|                     DownHovered = RageUI.IsMouseInBounds(CurrentMenu.X + CurrentMenu.SafeZoneSize.X, CurrentMenu.Y + RageUI.Settings.Items.Navigation.Rectangle.Height + CurrentMenu.SafeZoneSize.Y + CurrentMenu.SubtitleHeight + RageUI.ItemOffset, RageUI.Settings.Items.Navigation.Rectangle.Width + CurrentMenu.WidthOffset, RageUI.Settings.Items.Navigation.Rectangle.Height)
 | |
| 
 | |
|                     if CurrentMenu.Controls.Click.Active then
 | |
|                         if UpHovered then
 | |
|                             RageUI.GoUp(RageUI.Options)
 | |
|                         elseif DownHovered then
 | |
|                             RageUI.GoDown(RageUI.Options)
 | |
|                         end
 | |
|                     end
 | |
| 
 | |
|                     if UpHovered then
 | |
|                         RenderRectangle(CurrentMenu.X, CurrentMenu.Y + CurrentMenu.SubtitleHeight + RageUI.ItemOffset, RageUI.Settings.Items.Navigation.Rectangle.Width + CurrentMenu.WidthOffset, RageUI.Settings.Items.Navigation.Rectangle.Height, 30, 30, 30, 255)
 | |
|                     else
 | |
|                         RenderRectangle(CurrentMenu.X, CurrentMenu.Y + CurrentMenu.SubtitleHeight + RageUI.ItemOffset, RageUI.Settings.Items.Navigation.Rectangle.Width + CurrentMenu.WidthOffset, RageUI.Settings.Items.Navigation.Rectangle.Height, 0, 0, 0, 200)
 | |
|                     end
 | |
| 
 | |
|                     if DownHovered then
 | |
|                         RenderRectangle(CurrentMenu.X, CurrentMenu.Y + RageUI.Settings.Items.Navigation.Rectangle.Height + CurrentMenu.SubtitleHeight + RageUI.ItemOffset, RageUI.Settings.Items.Navigation.Rectangle.Width + CurrentMenu.WidthOffset, RageUI.Settings.Items.Navigation.Rectangle.Height, 30, 30, 30, 255)
 | |
|                     else
 | |
|                         RenderRectangle(CurrentMenu.X, CurrentMenu.Y + RageUI.Settings.Items.Navigation.Rectangle.Height + CurrentMenu.SubtitleHeight + RageUI.ItemOffset, RageUI.Settings.Items.Navigation.Rectangle.Width + CurrentMenu.WidthOffset, RageUI.Settings.Items.Navigation.Rectangle.Height, 0, 0, 0, 200)
 | |
|                     end
 | |
|                 else
 | |
|                     RenderRectangle(CurrentMenu.X, CurrentMenu.Y + CurrentMenu.SubtitleHeight + RageUI.ItemOffset + RageUI.Settings.Items.Navigation.Rectangle.Y, RageUI.Settings.Items.Navigation.Rectangle.Width + CurrentMenu.WidthOffset, RageUI.Settings.Items.Navigation.Rectangle.Height, 0, 0, 0, 200)
 | |
|                     RenderRectangle(CurrentMenu.X, CurrentMenu.Y + RageUI.Settings.Items.Navigation.Rectangle.Height + CurrentMenu.SubtitleHeight + RageUI.ItemOffset + RageUI.Settings.Items.Navigation.Rectangle.Y, RageUI.Settings.Items.Navigation.Rectangle.Width + CurrentMenu.WidthOffset, RageUI.Settings.Items.Navigation.Rectangle.Height, 0, 0, 0, 200)
 | |
|                 end
 | |
|                 RenderSprite(RageUI.Settings.Items.Navigation.Arrows.Dictionary, RageUI.Settings.Items.Navigation.Arrows.Texture, CurrentMenu.X + RageUI.Settings.Items.Navigation.Arrows.X + (CurrentMenu.WidthOffset / 2), CurrentMenu.Y + RageUI.Settings.Items.Navigation.Arrows.Y + CurrentMenu.SubtitleHeight + RageUI.ItemOffset, RageUI.Settings.Items.Navigation.Arrows.Width, RageUI.Settings.Items.Navigation.Arrows.Height)
 | |
|                 RageUI.ItemOffset = RageUI.ItemOffset + (RageUI.Settings.Items.Navigation.Rectangle.Height * 2)
 | |
|             end
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| ---GoBack
 | |
| ---@return nil
 | |
| ---@public
 | |
| function RageUI.GoBack()
 | |
|     local CurrentMenu = RageUI.CurrentMenu
 | |
|     if CurrentMenu ~= nil then
 | |
|         local Audio = RageUI.Settings.Audio
 | |
|         RageUI.PlaySound(Audio[Audio.Use].Back.audioName, Audio[Audio.Use].Back.audioRef)
 | |
|         if CurrentMenu.Parent ~= nil then
 | |
|             if CurrentMenu.Parent() then
 | |
|                 RageUI.NextMenu = CurrentMenu.Parent
 | |
|             else
 | |
|                 RageUI.NextMenu = nil
 | |
|                 RageUI.Visible(CurrentMenu, false)
 | |
|             end
 | |
|         else
 | |
|             RageUI.NextMenu = nil
 | |
|             RageUI.Visible(CurrentMenu, false)
 | |
|         end
 | |
|     end
 | |
| end
 | 
