Initial commit

This commit is contained in:
Jacob
2021-12-03 01:05:09 +00:00
commit c1add166a1
3511 changed files with 463300 additions and 0 deletions
+100
View File
@@ -0,0 +1,100 @@
ketchup = false
dish = "Banana"
quantity = 1
_menuPool = MenuPool.New()
mainMenu = UIMenu.New("Native UI", "~b~NATIVEUI SHOWCASE")
_menuPool:Add(mainMenu)
function ShowNotification(text)
SetNotificationTextEntry("STRING")
AddTextComponentString(text)
DrawNotification(false, false)
end
function AddMenuKetchup(menu)
local newitem = UIMenuCheckboxItem.New("Add ketchup?", ketchup, "Do you wish to add ketchup?")
menu:AddItem(newitem)
menu.OnCheckboxChange = function(sender, item, checked_)
if item == newitem then
ketchup = checked_
ShowNotification("~r~Ketchup status: ~b~"..tostring(ketchup))
end
end
end
function AddMenuFoods(menu)
local foods = {
"Banana",
"Apple",
"Pizza",
"Quartilicious",
"Steak",
0xF00D,
}
local newitem = UIMenuListItem.New("Food", foods, 1)
menu:AddItem(newitem)
menu.OnListChange = function(sender, item, index)
if item == newitem then
dish = item:IndexToItem(index)
ShowNotification("Preparing ~b~" .. dish .. "~w~...")
end
end
end
function AddMenuFoodCount(menu)
local amount = {}
for i = 1, 100 do amount[i] = i end
local newitem = UIMenuSliderItem.New("Quantity", amount, 1, false)
menu:AddItem(newitem)
menu.OnSliderChange = function(sender, item, index)
if item == newitem then
quantity = item:IndexToItem(index)
ShowNotification("Preparing ~r~" .. quantity .. " ~b~" .. dish .. "(s)~w~...")
end
end
end
function AddMenuCook(menu)
local newitem = UIMenuItem.New("Cook!", "Cook the dish with the appropriate ingredients and ketchup.")
newitem:SetLeftBadge(BadgeStyle.Star)
newitem:SetRightBadge(BadgeStyle.Tick)
menu:AddItem(newitem)
menu.OnItemSelect = function(sender, item, index)
if item == newitem then
local string = "You have ordered ~r~" .. quantity .. " ~b~"..dish.."(s)~w~ ~r~with~w~ ketchup."
if not ketchup then
string = "You have ordered ~r~" .. quantity .. " ~b~"..dish.."(s)~w~ ~r~without~w~ ketchup."
end
ShowNotification(string)
end
end
menu.OnIndexChange = function(sender, index)
if sender.Items[index] == newitem then
newitem:SetLeftBadge(BadgeStyle.None)
end
end
end
function AddMenuAnotherMenu(menu)
local submenu = _menuPool:AddSubMenu(menu, "Another Menu")
for i = 1, 20, 1 do
submenu:AddItem(UIMenuItem.New("PageFiller", "Sample description that takes more than one line. Moreso, it takes way more than two lines since it's so long. Wow, check out this length!"))
end
end
AddMenuKetchup(mainMenu)
AddMenuFoods(mainMenu)
AddMenuFoodCount(mainMenu)
AddMenuCook(mainMenu)
AddMenuAnotherMenu(mainMenu)
_menuPool:RefreshIndex()
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
_menuPool:ProcessMenus()
if IsControlJustPressed(1, 51) then
mainMenu:Visible(not mainMenu:Visible())
end
end
end)
+193
View File
@@ -0,0 +1,193 @@
MenuPool = setmetatable({}, MenuPool)
MenuPool.__index = MenuPool
function MenuPool.New()
local _MenuPool = {
Menus = {}
}
return setmetatable(_MenuPool, MenuPool)
end
function MenuPool:AddSubMenu(Menu, Text, Description, KeepPosition, KeepBanner)
if Menu() == "UIMenu" then
local Item = UIMenuItem.New(tostring(Text), Description or "")
Menu:AddItem(Item)
local SubMenu
if KeepPosition then
SubMenu = UIMenu.New(Menu.Title:Text(), Text, Menu.Position.X, Menu.Position.Y)
else
SubMenu = UIMenu.New(Menu.Title:Text(), Text)
end
if KeepBanner then
if Menu.Logo ~= nil then
SubMenu.Logo = Menu.Logo
else
SubMenu.Logo = nil
SubMenu.Banner = Menu.Banner
end
end
self:Add(SubMenu)
Menu:BindMenuToItem(SubMenu, Item)
return SubMenu
end
end
function MenuPool:Add(Menu)
if Menu() == "UIMenu" then
table.insert(self.Menus, Menu)
end
end
function MenuPool:MouseEdgeEnabled(bool)
if bool ~= nil then
for _, Menu in pairs(self.Menus) do
Menu.Settings.MouseEdgeEnabled = tobool(bool)
end
end
end
function MenuPool:ControlDisablingEnabled(bool)
if bool ~= nil then
for _, Menu in pairs(self.Menus) do
Menu.Settings.ControlDisablingEnabled = tobool(bool)
end
end
end
function MenuPool:ResetCursorOnOpen(bool)
if bool ~= nil then
for _, Menu in pairs(self.Menus) do
Menu.Settings.ResetCursorOnOpen = tobool(bool)
end
end
end
function MenuPool:MultilineFormats(bool)
if bool ~= nil then
for _, Menu in pairs(self.Menus) do
Menu.Settings.MultilineFormats = tobool(bool)
end
end
end
function MenuPool:Audio(Attribute, Setting)
if Attribute ~= nil and Setting ~= nil then
for _, Menu in pairs(self.Menus) do
if Menu.Settings.Audio[Attribute] then
Menu.Settings.Audio[Attribute] = Setting
end
end
end
end
function MenuPool:WidthOffset(offset)
if tonumber(offset) then
for _, Menu in pairs(self.Menus) do
Menu:SetMenuWidthOffset(tonumber(offset))
end
end
end
function MenuPool:CounterPreText(str)
if str ~= nil then
for _, Menu in pairs(self.Menus) do
Menu.PageCounter.PreText = tostring(str)
end
end
end
function MenuPool:DisableInstructionalButtons(bool)
if bool ~= nil then
for _, Menu in pairs(self.Menus) do
Menu.Settings.InstructionalButtons = tobool(bool)
end
end
end
function MenuPool:MouseControlsEnabled(bool)
if bool ~= nil then
for _, Menu in pairs(self.Menus) do
Menu.Settings.MouseControlsEnabled = tobool(bool)
end
end
end
function MenuPool:RefreshIndex()
for _, Menu in pairs(self.Menus) do
Menu:RefreshIndex()
end
end
function MenuPool:ProcessMenus()
self:ProcessControl()
self:ProcessMouse()
self:Draw()
end
function MenuPool:ProcessControl()
for _, Menu in pairs(self.Menus) do
if Menu:Visible() then
Menu:ProcessControl()
end
end
end
function MenuPool:ProcessMouse()
for _, Menu in pairs(self.Menus) do
if Menu:Visible() then
Menu:ProcessMouse()
end
end
end
function MenuPool:Draw()
for _, Menu in pairs(self.Menus) do
if Menu:Visible() then
Menu:Draw()
end
end
end
function MenuPool:IsAnyMenuOpen()
local open = false
for _, Menu in pairs(self.Menus) do
if Menu:Visible() then
open = true
break
end
end
return open
end
function MenuPool:CloseAllMenus()
for _, Menu in pairs(self.Menus) do
if Menu:Visible() then
Menu:Visible(false)
Menu.OnMenuClosed(Menu)
end
end
end
function MenuPool:SetBannerSprite(Sprite)
if Sprite() == "Sprite" then
for _, Menu in pairs(self.Menus) do
Menu:SetBannerSprite(Sprite)
end
end
end
function MenuPool:SetBannerRectangle(Rectangle)
if Rectangle() == "Rectangle" then
for _, Menu in pairs(self.Menus) do
Menu:SetBannerRectangle(Rectangle)
end
end
end
function MenuPool:TotalItemsPerPage(Value)
if tonumber(Value) then
for _, Menu in pairs(self.Menus) do
Menu.Pagination.Total = Value - 1
end
end
end
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+191
View File
@@ -0,0 +1,191 @@
function GetResolution()
local W, H = GetActiveScreenResolution()
if (W/H) > 3.5 then
return GetScreenResolution()
else
return W, H
end
end
function FormatXWYH(Value, Value2)
return Value/1920, Value2/1080
end
function math.round(num, numDecimalPlaces)
return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num))
end
function tobool(input)
if input == "true" or tonumber(input) == 1 or input == true then
return true
else
return false
end
end
function string.split(inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={} ; i=1
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
t[i] = str
i = i + 1
end
return t
end
function string.starts(String, Start)
return string.sub(String, 1, string.len(Start)) == Start
end
function IsMouseInBounds(X, Y, Width, Height)
local MX, MY = math.round(GetControlNormal(0, 239) * 1920), math.round(GetControlNormal(0, 240) * 1080)
MX, MY = FormatXWYH(MX, MY)
X, Y = FormatXWYH(X, Y)
Width, Height = FormatXWYH(Width, Height)
return (MX >= X and MX <= X + Width) and (MY > Y and MY < Y + Height)
end
function GetSafeZoneBounds()
local SafeSize = GetSafeZoneSize()
SafeSize = math.round(SafeSize, 2)
SafeSize = (SafeSize * 100) - 90
SafeSize = 10 - SafeSize
local W, H = 1920, 1080
return {X = math.round(SafeSize * ((W/H) * 5.4)), Y = math.round(SafeSize * 5.4)}
end
function Controller()
return not IsInputDisabled(2)
end
--[[
function UIMenu:ProcessMouse()
if not self._Visible or self.JustOpened or #self.Items == 0 or tobool(Controller()) or not self.Settings.MouseControlsEnabled then
EnableControlAction(0, 2, true)
EnableControlAction(0, 1, true)
EnableControlAction(0, 25, true)
EnableControlAction(0, 24, true)
if self.Dirty then
for _, Item in pairs(self.Items) do
if Item:Hovered() then
Item:Hovered(false)
end
end
end
return
end
local SafeZone = GetSafeZoneBounds()
local Limit = #self.Items - 1
local Counter = 0
ShowCursorThisFrame()
if #self.Items > self.Pagination.Total + 1 then
Limit = self.Pagination.Max
end
if IsMouseInBounds(0, 0, 30, 1080) and self.Settings.MouseEdgeEnabled then
SetGameplayCamRelativeHeading(GetGameplayCamRelativeHeading() + 5)
SetCursorSprite(6)
elseif IsMouseInBounds(GetScreenResolutionMaintainRatio().Width - 30, 0, 30, 1080) and self.Settings.MouseEdgeEnabled then
SetGameplayCamRelativeHeading(GetGameplayCamRelativeHeading() - 5)
SetCursorSprite(7)
elseif self.Settings.MouseEdgeEnabled then
SetCursorSprite(1)
end
for i = self.Pagination.Min + 1, Limit, 1 do
local X, Y = self.Position.X, self.Position.Y + 144 - 37 + self.Subtitle.ExtraY + (Counter * 38)
local Width, Height = 431 + self.WidthOffset, 38
local Item = self.Items[i]
local Type, SubType = Item()
DrawRectangle(X, Y, Width, Height, 255, 0, 0, 150)
if SubType == "UIMenuListItem" or SubType == "UIMenuSliderItem" then
DrawRectangle(Item.LeftArrow.X, Item.LeftArrow.Y, Item.LeftArrow.Width, Item.LeftArrow.Height, 0, 255, 0, 150)
DrawRectangle(Item.RightArrow.X, Item.RightArrow.Y, Item.RightArrow.Width, Item.RightArrow.Height, 0, 255, 0, 150)
end
if IsMouseInBounds(X, Y, Width, Height) then
Item:Hovered(true)
if IsDisabledControlJustPressed(0, 24) then
if Item:Selected() and Item:Enabled() then
if SubType == "UIMenuListItem" then
if IsMouseInBounds(Item.LeftArrow.X, Item.LeftArrow.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then
self:GoLeft()
elseif not IsMouseInBounds(Item.RightArrow.X, Item.RightArrow.Y, Item.RightArrow.Width, Item.RightArrow.Height) then
self:SelectItem()
end
if IsMouseInBounds(Item.RightArrow.X, Item.RightArrow.Y, Item.RightArrow.Width, Item.RightArrow.Height) then
self:GoRight()
elseif not IsMouseInBounds(Item.LeftArrow.X, Item.LeftArrow.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then
self:SelectItem()
end
elseif SubType == "UIMenuSliderItem" then
if IsMouseInBounds(Item.LeftArrow.X, Item.LeftArrow.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then
self:GoLeft()
elseif not IsMouseInBounds(Item.RightArrow.X, Item.RightArrow.Y, Item.RightArrow.Width, Item.RightArrow.Height) then
self:SelectItem()
end
if IsMouseInBounds(Item.RightArrow.X, Item.RightArrow.Y, Item.RightArrow.Width, Item.RightArrow.Height) then
self:GoRight()
elseif not IsMouseInBounds(Item.LeftArrow.X, Item.LeftArrow.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then
self:SelectItem()
end
else
self:SelectItem()
end
elseif not Item:Selected() then
self:CurrentSelection(i-1)
PlaySoundFrontend(-1, self.Settings.Audio.Error, self.Settings.Audio.Library, true)
self.OnIndexChange(self, self:CurrentSelection())
self.ReDraw = true
elseif not Item:Enabled() and Item:Selected() then
PlaySoundFrontend(-1, self.Settings.Audio.Error, self.Settings.Audio.Library, true)
end
end
else
Item:Hovered(false)
end
Counter = Counter + 1
end
local ExtraX, ExtraY = self.Position.X, 144 + 38 * (self.Pagination.Total + 1) + self.Position.Y - 37 + self.Subtitle.ExtraY
if #self.Items <= self.Pagination.Total + 1 then return end
if IsMouseInBounds(ExtraX, ExtraY, 431 + self.WidthOffset, 18) then
self.Extra.Up:Colour(30, 30, 30, 255)
if IsDisabledControlJustPressed(0, 24) then
if #self.Items > self.Pagination.Total + 1 then
self:GoUpOverflow()
else
self:GoUp()
end
end
else
self.Extra.Up:Colour(0, 0, 0, 200)
end
if IsMouseInBounds(ExtraX, ExtraY + 18, 431 + self.WidthOffset, 18) then
self.Extra.Down:Colour(30, 30, 30, 255)
if IsDisabledControlJustReleased(0, 24) then
if #self.Items > self.Pagination.Total + 1 then
self:GoDownOverflow()
else
self:GoDown()
end
end
else
self.Extra.Down:Colour(0, 0, 0, 200)
end
end
--]]
+32
View File
@@ -0,0 +1,32 @@
resource_manifest_version '05cfa83c-a124-4cfa-a768-c24a5811d8f9'
--[[
--All items unpacked
client_scripts {
"Utils.lua",
"elements/UIResRectangle.lua",
"elements/UIResText.lua",
"elements/Sprite.lua",
"elements/StringMeasurer.lua",
"elements/Badge.lua",
"elements/Colours.lua",
"items/UIMenuItem.lua",
"items/UIMenuCheckboxItem.lua",
"items/UIMenuListItem.lua",
"items/UIMenuSliderItem.lua",
"items/UIMenuColouredItem.lua",
"items/UIMenuprogressItem.lua",
"windows/UIMenuHeritageWindow.lua",
"panels/UIMenuGridPanel.lua",
"panels/UIMenuColourPanel.lua",
"panels/UIMenuPercentagePanel.lua",
"UIMenu.lua",
"MenuPool.lua",
"MenuExample.lua",
}
--All items packed
--]]
client_script "NativeUI.lua"
+211
View File
@@ -0,0 +1,211 @@
BadgeStyle = {
None = 0,
BronzeMedal = 1,
GoldMedal = 2,
SilverMedal = 3,
Alert = 4,
Crown = 5,
Ammo = 6,
Armour = 7,
Barber = 8,
Clothes = 9,
Franklin = 10,
Bike = 11,
Car = 12,
Gun = 13,
Heart = 14,
Makeup = 15,
Mask = 16,
Michael = 17,
Star = 18,
Tattoo = 19,
Trevor = 20,
Lock = 21,
Tick = 22
}
BadgeTexture = {
[0] = function()
return ""
end,
[1] = function()
return "mp_medal_bronze"
end,
[2] = function()
return "mp_medal_gold"
end,
[3] = function()
return "medal_silver"
end,
[4] = function()
return "mp_alerttriangle"
end,
[5] = function()
return "mp_hostcrown"
end,
[6] = function(Selected)
if Selected then
return "shop_ammo_icon_b"
else
return "shop_ammo_icon_a"
end
end,
[7] = function(Selected)
if Selected then
return "shop_armour_icon_b"
else
return "shop_armour_icon_a"
end
end,
[8] = function(Selected)
if Selected then
return "shop_barber_icon_b"
else
return "shop_barber_icon_a"
end
end,
[9] = function(Selected)
if Selected then
return "shop_clothing_icon_b"
else
return "shop_clothing_icon_a"
end
end,
[10] = function(Selected)
if Selected then
return "shop_franklin_icon_b"
else
return "shop_franklin_icon_a"
end
end,
[11] = function(Selected)
if Selected then
return "shop_garage_bike_icon_b"
else
return "shop_garage_bike_icon_a"
end
end,
[12] = function(Selected)
if Selected then
return "shop_garage_icon_b"
else
return "shop_garage_icon_a"
end
end,
[13] = function(Selected)
if Selected then
return "shop_gunclub_icon_b"
else
return "shop_gunclub_icon_a"
end
end,
[14] = function(Selected)
if Selected then
return "shop_health_icon_b"
else
return "shop_health_icon_a"
end
end,
[15] = function(Selected)
if Selected then
return "shop_makeup_icon_b"
else
return "shop_makeup_icon_a"
end
end,
[16] = function(Selected)
if Selected then
return "shop_mask_icon_b"
else
return "shop_mask_icon_a"
end
end,
[17] = function(Selected)
if Selected then
return "shop_michael_icon_b"
else
return "shop_michael_icon_a"
end
end,
[18] = function()
return "shop_new_star"
end,
[19] = function(Selected)
if Selected then
return "shop_tattoos_icon_b"
else
return "shop_tattoos_icon_a"
end
end,
[20] = function(Selected)
if Selected then
return "shop_trevor_icon_b"
else
return "shop_trevor_icon_a"
end
end,
[21] = function()
return "shop_lock"
end,
[22] = function()
return "shop_tick_icon"
end,
}
BadgeDictionary = {
[0] = function(Selected)
if Selected then
return "commonmenu"
else
return "commonmenu"
end
end,
}
BadgeColour = {
[5] = function(Selected)
if Selected then
return 0, 0, 0, 255
else
return 255, 255, 255, 255
end
end,
[21] = function(Selected)
if Selected then
return 0, 0, 0, 255
else
return 255, 255, 255, 255
end
end,
[22] = function(Selected)
if Selected then
return 0, 0, 0, 255
else
return 255, 255, 255, 255
end
end,
}
function GetBadgeTexture(Badge, Selected)
if BadgeTexture[Badge] then
return BadgeTexture[Badge](Selected)
else
return ""
end
end
function GetBadgeDictionary(Badge, Selected)
if BadgeDictionary[Badge] then
return BadgeDictionary[Badge](Selected)
else
return "commonmenu"
end
end
function GetBadgeColour(Badge, Selected)
if BadgeColour[Badge] then
return BadgeColour[Badge](Selected)
else
return 255, 255, 255, 255
end
end
+218
View File
@@ -0,0 +1,218 @@
Colours = {
PureWhite = {255, 255, 255, 255},
White = {240, 240, 240, 255},
Black = {0, 0, 0, 255},
Grey = {155, 155, 155, 255},
GreyLight = {205, 205, 205, 255},
GreyDark = {77, 77, 77, 255},
Red = {224, 50, 50, 255},
RedLight = {240, 153, 153, 255},
RedDark = {112, 25, 25, 255},
Blue = {93, 182, 229, 255},
BlueLight = {174, 219, 242, 255},
BlueDark = {47, 92, 115, 255},
Yellow = {240, 200, 80, 255},
YellowLight = {254, 235, 169, 255},
YellowDark = {126, 107, 41, 255},
Orange = {255, 133, 85, 255},
OrangeLight = {255, 194, 170, 255},
OrangeDark = {127, 66, 42, 255},
Green = {114, 204, 114, 255},
GreenLight = {185, 230, 185, 255},
GreenDark = {57, 102, 57, 255},
Purple = {132, 102, 226, 255},
PurpleLight = {192, 179, 239, 255},
PurpleDark = {67, 57, 111, 255},
Pink = {203, 54, 148, 255},
RadarHealth = {53, 154, 71, 255},
RadarArmour = {93, 182, 229, 255},
RadarDamage = {235, 36, 39, 255},
NetPlayer1 = {194, 80, 80, 255},
NetPlayer2 = {156, 110, 175, 255},
NetPlayer3 = {255, 123, 196, 255},
NetPlayer4 = {247, 159, 123, 255},
NetPlayer5 = {178, 144, 132, 255},
NetPlayer6 = {141, 206, 167, 255},
NetPlayer7 = {113, 169, 175, 255},
NetPlayer8 = {211, 209, 231, 255},
NetPlayer9 = {144, 127, 153, 255},
NetPlayer10 = {106, 196, 191, 255},
NetPlayer11 = {214, 196, 153, 255},
NetPlayer12 = {234, 142, 80, 255},
NetPlayer13 = {152, 203, 234, 255},
NetPlayer14 = {178, 98, 135, 255},
NetPlayer15 = {144, 142, 122, 255},
NetPlayer16 = {166, 117, 94, 255},
NetPlayer17 = {175, 168, 168, 255},
NetPlayer18 = {232, 142, 155, 255},
NetPlayer19 = {187, 214, 91, 255},
NetPlayer20 = {12, 123, 86, 255},
NetPlayer21 = {123, 196, 255, 255},
NetPlayer22 = {171, 60, 230, 255},
NetPlayer23 = {206, 169, 13, 255},
NetPlayer24 = {71, 99, 173, 255},
NetPlayer25 = {42, 166, 185, 255},
NetPlayer26 = {186, 157, 125, 255},
NetPlayer27 = {201, 225, 255, 255},
NetPlayer28 = {240, 240, 150, 255},
NetPlayer29 = {237, 140, 161, 255},
NetPlayer30 = {249, 138, 138, 255},
NetPlayer31 = {252, 239, 166, 255},
NetPlayer32 = {240, 240, 240, 255},
SimpleBlipDefault = {159, 201, 166, 255},
MenuBlue = {140, 140, 140, 255},
MenuGreyLight = {140, 140, 140, 255},
MenuBlueExtraDark = {40, 40, 40, 255},
MenuYellow = {240, 160, 0, 255},
MenuYellowDark = {240, 160, 0, 255},
MenuGreen = {240, 160, 0, 255},
MenuGrey = {140, 140, 140, 255},
MenuGreyDark = {60, 60, 60, 255},
MenuHighlight = {30, 30, 30, 255},
MenuStandard = {140, 140, 140, 255},
MenuDimmed = {75, 75, 75, 255},
MenuExtraDimmed = {50, 50, 50, 255},
BriefTitle = {95, 95, 95, 255},
MidGreyMp = {100, 100, 100, 255},
NetPlayer1Dark = {93, 39, 39, 255},
NetPlayer2Dark = {77, 55, 89, 255},
NetPlayer3Dark = {124, 62, 99, 255},
NetPlayer4Dark = {120, 80, 80, 255},
NetPlayer5Dark = {87, 72, 66, 255},
NetPlayer6Dark = {74, 103, 83, 255},
NetPlayer7Dark = {60, 85, 88, 255},
NetPlayer8Dark = {105, 105, 64, 255},
NetPlayer9Dark = {72, 63, 76, 255},
NetPlayer10Dark = {53, 98, 95, 255},
NetPlayer11Dark = {107, 98, 76, 255},
NetPlayer12Dark = {117, 71, 40, 255},
NetPlayer13Dark = {76, 101, 117, 255},
NetPlayer14Dark = {65, 35, 47, 255},
NetPlayer15Dark = {72, 71, 61, 255},
NetPlayer16Dark = {85, 58, 47, 255},
NetPlayer17Dark = {87, 84, 84, 255},
NetPlayer18Dark = {116, 71, 77, 255},
NetPlayer19Dark = {93, 107, 45, 255},
NetPlayer20Dark = {6, 61, 43, 255},
NetPlayer21Dark = {61, 98, 127, 255},
NetPlayer22Dark = {85, 30, 115, 255},
NetPlayer23Dark = {103, 84, 6, 255},
NetPlayer24Dark = {35, 49, 86, 255},
NetPlayer25Dark = {21, 83, 92, 255},
NetPlayer26Dark = {93, 98, 62, 255},
NetPlayer27Dark = {100, 112, 127, 255},
NetPlayer28Dark = {120, 120, 75, 255},
NetPlayer29Dark = {152, 76, 93, 255},
NetPlayer30Dark = {124, 69, 69, 255},
NetPlayer31Dark = {10, 43, 50, 255},
NetPlayer32Dark = {95, 95, 10, 255},
Bronze = {180, 130, 97, 255},
Silver = {150, 153, 161, 255},
Gold = {214, 181, 99, 255},
Platinum = {166, 221, 190, 255},
Gang1 = {29, 100, 153, 255},
Gang2 = {214, 116, 15, 255},
Gang3 = {135, 125, 142, 255},
Gang4 = {229, 119, 185, 255},
SameCrew = {252, 239, 166, 255},
Freemode = {45, 110, 185, 255},
PauseBg = {0, 0, 0, 255},
Friendly = {93, 182, 229, 255},
Enemy = {194, 80, 80, 255},
Location = {240, 200, 80, 255},
Pickup = {114, 204, 114, 255},
PauseSingleplayer = {114, 204, 114, 255},
FreemodeDark = {22, 55, 92, 255},
InactiveMission = {154, 154, 154, 255},
Damage = {194, 80, 80, 255},
PinkLight = {252, 115, 201, 255},
PmMitemHighlight = {252, 177, 49, 255},
ScriptVariable = {0, 0, 0, 255},
Yoga = {109, 247, 204, 255},
Tennis = {241, 101, 34, 255},
Golf = {214, 189, 97, 255},
ShootingRange = {112, 25, 25, 255},
FlightSchool = {47, 92, 115, 255},
NorthBlue = {93, 182, 229, 255},
SocialClub = {234, 153, 28, 255},
PlatformBlue = {11, 55, 123, 255},
PlatformGreen = {146, 200, 62, 255},
PlatformGrey = {234, 153, 28, 255},
FacebookBlue = {66, 89, 148, 255},
IngameBg = {0, 0, 0, 255},
Darts = {114, 204, 114, 255},
Waypoint = {164, 76, 242, 255},
Michael = {101, 180, 212, 255},
Franklin = {171, 237, 171, 255},
Trevor = {255, 163, 87, 255},
GolfP1 = {240, 240, 240, 255},
GolfP2 = {235, 239, 30, 255},
GolfP3 = {255, 149, 14, 255},
GolfP4 = {246, 60, 161, 255},
WaypointLight = {210, 166, 249, 255},
WaypointDark = {82, 38, 121, 255},
PanelLight = {0, 0, 0, 255},
MichaelDark = {72, 103, 116, 255},
FranklinDark = {85, 118, 85, 255},
TrevorDark = {127, 81, 43, 255},
ObjectiveRoute = {240, 200, 80, 255},
PausemapTint = {0, 0, 0, 255},
PauseDeselect = {100, 100, 100, 255},
PmWeaponsPurchasable = {45, 110, 185, 255},
PmWeaponsLocked = {240, 240, 240, 255},
ScreenBg = {0, 0, 0, 255},
Chop = {224, 50, 50, 255},
PausemapTintHalf = {0, 0, 0, 255},
NorthBlueOfficial = {0, 71, 133, 255},
ScriptVariable2 = {0, 0, 0, 255},
H = {33, 118, 37, 255},
HDark = {37, 102, 40, 255},
T = {234, 153, 28, 255},
TDark = {225, 140, 8, 255},
HShard = {20, 40, 0, 255},
ControllerMichael = {48, 255, 255, 255},
ControllerFranklin = {48, 255, 0, 255},
ControllerTrevor = {176, 80, 0, 255},
ControllerChop = {127, 0, 0, 255},
VideoEditorVideo = {53, 166, 224, 255},
VideoEditorAudio = {162, 79, 157, 255},
VideoEditorText = {104, 192, 141, 255},
HbBlue = {29, 100, 153, 255},
HbYellow = {234, 153, 28, 255},
VideoEditorScore = {240, 160, 1, 255},
VideoEditorAudioFadeout = {59, 34, 57, 255},
VideoEditorTextFadeout = {41, 68, 53, 255},
VideoEditorScoreFadeout = {82, 58, 10, 255},
HeistBackground = {37, 102, 40, 255},
VideoEditorAmbient = {240, 200, 80, 255},
VideoEditorAmbientFadeout = {80, 70, 34, 255},
Gb = {255, 133, 85, 255},
G = {255, 194, 170, 255},
B = {255, 133, 85, 255},
LowFlow = {240, 200, 80, 255},
LowFlowDark = {126, 107, 41, 255},
G1 = {247, 159, 123, 255},
G2 = {226, 134, 187, 255},
G3 = {239, 238, 151, 255},
G4 = {113, 169, 175, 255},
G5 = {160, 140, 193, 255},
G6 = {141, 206, 167, 255},
G7 = {181, 214, 234, 255},
G8 = {178, 144, 132, 255},
G9 = {0, 132, 114, 255},
G10 = {216, 85, 117, 255},
G11 = {30, 100, 152, 255},
G12 = {43, 181, 117, 255},
G13 = {233, 141, 79, 255},
G14 = {137, 210, 215, 255},
G15 = {134, 125, 141, 255},
Adversary = {109, 34, 33, 255},
DegenRed = {255, 0, 0, 255},
DegenYellow = {255, 255, 0, 255},
DegenGreen = {0, 255, 0, 255},
DegenCyan = {0, 255, 255, 255},
DegenBlue = {0, 0, 255, 255},
DegenMagenta = {255, 0, 255, 255},
Stunt1 = {38, 136, 234, 255},
Stunt2 = {224, 50, 50, 255},
}
+67
View File
@@ -0,0 +1,67 @@
Sprite = setmetatable({}, Sprite)
Sprite.__index = Sprite
Sprite.__call = function() return "Sprite" end
function Sprite.New(TxtDictionary, TxtName, X, Y, Width, Height, Heading, R, G, B, A)
local _Sprite = {
TxtDictionary = tostring(TxtDictionary),
TxtName = tostring(TxtName),
X = tonumber(X) or 0,
Y = tonumber(Y) or 0,
Width = tonumber(Width) or 0,
Height = tonumber(Height) or 0,
Heading = tonumber(Heading) or 0,
_Colour = {R = tonumber(R) or 255, G = tonumber(G) or 255, B = tonumber(B) or 255, A = tonumber(A) or 255},
}
return setmetatable(_Sprite, Sprite)
end
function Sprite:Position(X, Y)
if tonumber(X) and tonumber(Y) then
self.X = tonumber(X)
self.Y = tonumber(Y)
else
return {X = self.X, Y = self.Y}
end
end
function Sprite:Size(Width, Height)
if tonumber(Width) and tonumber(Width) then
self.Width = tonumber(Width)
self.Height = tonumber(Height)
else
return {Width = self.Width, Height = self.Height}
end
end
function Sprite:Colour(R, G, B, A)
if tonumber(R) or tonumber(G) or tonumber(B) or tonumber(A) then
self._Colour.R = tonumber(R) or 255
self._Colour.B = tonumber(B) or 255
self._Colour.G = tonumber(G) or 255
self._Colour.A = tonumber(A) or 255
else
return self._Colour
end
end
function Sprite:Draw()
if not HasStreamedTextureDictLoaded(self.TxtDictionary) then
RequestStreamedTextureDict(self.TxtDictionary, true)
end
local Position = self:Position()
local Size = self:Size()
Size.Width, Size.Height = FormatXWYH(Size.Width, Size.Height)
Position.X, Position.Y = FormatXWYH(Position.X, Position.Y)
DrawSprite(self.TxtDictionary, self.TxtName, Position.X + Size.Width * 0.5, Position.Y + Size.Height * 0.5, Size.Width, Size.Height, self.Heading, self._Colour.R, self._Colour.G, self._Colour.B, self._Colour.A)
end
function DrawTexture(TxtDictionary, TxtName, X, Y, Width, Height, Heading, R, G, B, A)
if not HasStreamedTextureDictLoaded(tostring(TxtDictionary) or "") then
RequestStreamedTextureDict(tostring(TxtDictionary) or "", true)
end
X, Y, Width, Height = X or 0, Y or 0, Width or 0, Height or 0
X, Y = FormatXWYH(X, Y)
Width, Height = FormatXWYH(Width, Height)
DrawSprite(tostring(TxtDictionary) or "", tostring(TxtName) or "", X + Width * 0.5, Y + Height * 0.5, Width, Height, tonumber(Heading) or 0, tonumber(R) or 255, tonumber(G) or 255, tonumber(B) or 255, tonumber(A) or 255)
end
@@ -0,0 +1,105 @@
CharacterMap = {
[' '] = 6,
['!'] = 6,
['"'] = 6,
['#'] = 11,
['$'] = 10,
['%'] = 17,
['&'] = 13,
['\\'] = 4,
['('] = 6,
[')'] = 6,
['*'] = 7,
['+'] = 10,
[','] = 4,
['-'] = 6,
['.'] = 4,
['/'] = 7,
['0'] = 12,
['1'] = 7,
['2'] = 11,
['3'] = 11,
['4'] = 11,
['5'] = 11,
['6'] = 12,
['7'] = 10,
['8'] = 11,
['9'] = 11,
[':'] = 5,
[';'] = 4,
['<'] = 9,
['='] = 9,
['>'] = 9,
['?'] = 10,
['@'] = 15,
['A'] = 12,
['B'] = 13,
['C'] = 14,
['D'] = 14,
['E'] = 12,
['F'] = 12,
['G'] = 15,
['H'] = 14,
['I'] = 5,
['J'] = 11,
['K'] = 13,
['L'] = 11,
['M'] = 16,
['N'] = 14,
['O'] = 16,
['P'] = 12,
['Q'] = 15,
['R'] = 13,
['S'] = 12,
['T'] = 11,
['U'] = 13,
['V'] = 12,
['W'] = 18,
['X'] = 11,
['Y'] = 11,
['Z'] = 12,
['['] = 6,
[']'] = 6,
['^'] = 9,
['_'] = 18,
['`'] = 8,
['a'] = 11,
['b'] = 12,
['c'] = 11,
['d'] = 12,
['e'] = 12,
['f'] = 5,
['g'] = 13,
['h'] = 11,
['i'] = 4,
['j'] = 4,
['k'] = 10,
['l'] = 4,
['m'] = 18,
['n'] = 11,
['o'] = 12,
['p'] = 12,
['q'] = 12,
['r'] = 7,
['s'] = 9,
['t'] = 5,
['u'] = 11,
['v'] = 10,
['w'] = 14,
['x'] = 9,
['y'] = 10,
['z'] = 9,
['{'] = 6,
['|'] = 3,
['}'] = 6,
}
function MeasureString(str)
local output = 0
for i = 1, GetCharacterCount(str), 1 do
if CharacterMap[string.sub(str, i, i)] then
output = output + CharacterMap[string.sub(str, i, i)] + 1
end
end
return output
end
@@ -0,0 +1,58 @@
UIResRectangle = setmetatable({}, UIResRectangle)
UIResRectangle.__index = UIResRectangle
UIResRectangle.__call = function() return "Rectangle" end
function UIResRectangle.New(X, Y, Width, Height, R, G, B, A)
local _UIResRectangle = {
X = tonumber(X) or 0,
Y = tonumber(Y) or 0,
Width = tonumber(Width) or 0,
Height = tonumber(Height) or 0,
_Colour = {R = tonumber(R) or 255, G = tonumber(G) or 255, B = tonumber(B) or 255, A = tonumber(A) or 255},
}
return setmetatable(_UIResRectangle, UIResRectangle)
end
function UIResRectangle:Position(X, Y)
if tonumber(X) and tonumber(Y) then
self.X = tonumber(X)
self.Y = tonumber(Y)
else
return {X = self.X, Y = self.Y}
end
end
function UIResRectangle:Size(Width, Height)
if tonumber(Width) and tonumber(Height) then
self.Width = tonumber(Width)
self.Height = tonumber(Height)
else
return {Width = self.Width, Height = self.Height}
end
end
function UIResRectangle:Colour(R, G, B, A)
if tonumber(R) or tonumber(G) or tonumber(B) or tonumber(A) then
self._Colour.R = tonumber(R) or 255
self._Colour.B = tonumber(B) or 255
self._Colour.G = tonumber(G) or 255
self._Colour.A = tonumber(A) or 255
else
return self._Colour
end
end
function UIResRectangle:Draw()
local Position = self:Position()
local Size = self:Size()
Size.Width, Size.Height = FormatXWYH(Size.Width, Size.Height)
Position.X, Position.Y = FormatXWYH(Position.X, Position.Y)
DrawRect(Position.X + Size.Width * 0.5, Position.Y + Size.Height * 0.5, Size.Width, Size.Height, self._Colour.R, self._Colour.G, self._Colour.B, self._Colour.A)
end
function DrawRectangle(X, Y, Width, Height, R, G, B, A)
X, Y, Width, Height = X or 0, Y or 0, Width or 0, Height or 0
X, Y = FormatXWYH(X, Y)
Width, Height = FormatXWYH(Width, Height)
DrawRect(X + Width * 0.5, Y + Height * 0.5, Width, Height, tonumber(R) or 255, tonumber(G) or 255, tonumber(B) or 255, tonumber(A) or 255)
end
+199
View File
@@ -0,0 +1,199 @@
UIResText = setmetatable({}, UIResText)
UIResText.__index = UIResText
UIResText.__call = function() return "Text" end
function GetCharacterCount(str)
local characters = 0
for c in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do
local a = c:byte(1, -1)
if a ~= nil then
characters = characters + 1
end
end
return characters
end
function GetByteCount(str)
local bytes = 0
for c in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do
local a,b,c,d = c:byte(1, -1)
if a ~= nil then
bytes = bytes + 1
end
if b ~= nil then
bytes = bytes + 1
end
if c ~= nil then
bytes = bytes + 1
end
if d ~= nil then
bytes = bytes + 1
end
end
return bytes
end
function AddLongStringForAscii(str)
local maxbytelength = 99
for i = 0, GetCharacterCount(str), 99 do
AddTextComponentSubstringPlayerName(string.sub(str, i, math.min(maxbytelength, GetCharacterCount(str) - i))) --needs changed
end
end
function AddLongStringForUtf8(str)
local maxbytelength = 99
local bytecount = GetByteCount(str)
if bytecount < maxbytelength then
AddTextComponentSubstringPlayerName(str)
return
end
local startIndex = 0
for i = 0, GetCharacterCount(str), 1 do
local length = i - startIndex
if GetByteCount(string.sub(str, startIndex, length)) > maxbytelength then
AddTextComponentSubstringPlayerName(string.sub(str, startIndex, length - 1))
i = i - 1
startIndex = startIndex + (length - 1)
end
end
AddTextComponentSubstringPlayerName(string.sub(str, startIndex, GetCharacterCount(str) - startIndex))
end
function AddLongString(str)
local bytecount = GetByteCount(str)
if bytecount == GetCharacterCount(str) then
AddLongStringForAscii(str)
else
AddLongStringForUtf8(str)
end
end
function MeasureStringWidthNoConvert(str, font, scale)
BeginTextCommandWidth("STRING")
AddLongString(str)
SetTextFont(font or 0)
SetTextScale(1.0, scale or 0)
return EndTextCommandGetWidth(true)
end
function MeasureStringWidth(str, font, scale)
return MeasureStringWidthNoConvert(str, font, scale) * 1920
end
function UIResText.New(Text, X, Y, Scale, R, G, B, A, Font, Alignment, DropShadow, Outline, WordWrap)
local _UIResText = {
_Text = tostring(Text) or "",
X = tonumber(X) or 0,
Y = tonumber(Y) or 0,
Scale = tonumber(Scale) or 0,
_Colour = {R = tonumber(R) or 255, G = tonumber(G) or 255, B = tonumber(B) or 255, A = tonumber(A) or 255},
Font = tonumber(Font) or 0,
Alignment = Alignment or nil,
DropShadow = Dropshadow or nil,
Outline = Outline or nil,
WordWrap = tonumber(WordWrap) or 0,
}
return setmetatable(_UIResText, UIResText)
end
function UIResText:Position(X, Y)
if tonumber(X) and tonumber(Y) then
self.X = tonumber(X)
self.Y = tonumber(Y)
else
return {X = self.X, Y = self.Y}
end
end
function UIResText:Colour(R, G, B, A)
if tonumber(R) and tonumber(G) and tonumber(B) and tonumber(A) then
self._Colour.R = tonumber(R)
self._Colour.B = tonumber(B)
self._Colour.G = tonumber(G)
self._Colour.A = tonumber(A)
else
return self._Colour
end
end
function UIResText:Text(Text)
if tostring(Text) and Text ~= nil then
self._Text = tostring(Text)
else
return self._Text
end
end
function UIResText:Draw()
local Position = self:Position()
Position.X, Position.Y = FormatXWYH(Position.X, Position.Y)
SetTextFont(self.Font)
SetTextScale(1.0, self.Scale)
SetTextColour(self._Colour.R, self._Colour.G, self._Colour.B, self._Colour.A)
if self.DropShadow then
SetTextDropShadow()
end
if self.Outline then
SetTextOutline()
end
if self.Alignment ~= nil then
if self.Alignment == 1 or self.Alignment == "Center" or self.Alignment == "Centre" then
SetTextCentre(true)
elseif self.Alignment == 2 or self.Alignment == "Right" then
SetTextRightJustify(true)
SetTextWrap(0, Position.X)
end
end
if tonumber(self.WordWrap) then
if tonumber(self.WordWrap) ~= 0 then
SetTextWrap(Position.X, Position.X + (tonumber(self.WordWrap) / Resolution.Width))
end
end
BeginTextCommandDisplayText("STRING")
AddLongString(self._Text)
EndTextCommandDisplayText(Position.X, Position.Y)
end
function RenderText(Text, X, Y, Font, Scale, R, G, B, A, Alignment, DropShadow, Outline, WordWrap)
Text = tostring(Text)
X, Y = FormatXWYH(X, Y)
SetTextFont(Font or 0)
SetTextScale(1.0, Scale or 0)
SetTextColour(R or 255, G or 255, B or 255, A or 255)
if DropShadow then
SetTextDropShadow()
end
if Outline then
SetTextOutline()
end
if Alignment ~= nil then
if Alignment == 1 or Alignment == "Center" or Alignment == "Centre" then
SetTextCentre(true)
elseif Alignment == 2 or Alignment == "Right" then
SetTextRightJustify(true)
SetTextWrap(0, X)
end
end
if tonumber(WordWrap) then
if tonumber(WordWrap) ~= 0 then
WordWrap, _ = FormatXWYH(WordWrap, 0)
SetTextWrap(WordWrap, X - WordWrap)
end
end
BeginTextCommandDisplayText("STRING")
AddLongString(Text)
EndTextCommandDisplayText(X, Y)
end
@@ -0,0 +1,112 @@
UIMenuCheckboxItem = setmetatable({}, UIMenuCheckboxItem)
UIMenuCheckboxItem.__index = UIMenuCheckboxItem
UIMenuCheckboxItem.__call = function() return "UIMenuItem", "UIMenuCheckboxItem" end
function UIMenuCheckboxItem.New(Text, Check, Description)
local _UIMenuCheckboxItem = {
Base = UIMenuItem.New(Text or "", Description or ""),
CheckedSprite = Sprite.New("commonmenu", "shop_box_blank", 410, 95, 50, 50),
Checked = tobool(Check),
CheckboxEvent = function(menu, item, checked) end,
}
return setmetatable(_UIMenuCheckboxItem, UIMenuCheckboxItem)
end
function UIMenuCheckboxItem:SetParentMenu(Menu)
if Menu() == "UIMenu" then
self.Base.ParentMenu = Menu
else
return self.Base.ParentMenu
end
end
function UIMenuCheckboxItem:Position(Y)
if tonumber(Y) then
self.Base:Position(Y)
self.CheckedSprite:Position(380 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 138 + self.Base._Offset.Y)
end
end
function UIMenuCheckboxItem:Selected(bool)
if bool ~= nil then
self.Base._Selected = tobool(bool)
else
return self.Base._Selected
end
end
function UIMenuCheckboxItem:Hovered(bool)
if bool ~= nil then
self.Base._Hovered = tobool(bool)
else
return self.Base._Hovered
end
end
function UIMenuCheckboxItem:Enabled(bool)
if bool ~= nil then
self.Base._Enabled = tobool(bool)
else
return self.Base._Enabled
end
end
function UIMenuCheckboxItem:Description(str)
if tostring(str) and str ~= nil then
self.Base._Description = tostring(str)
else
return self.Base._Description
end
end
function UIMenuCheckboxItem:Offset(X, Y)
if tonumber(X) or tonumber(Y) then
if tonumber(X) then
self.Base._Offset.X = tonumber(X)
end
if tonumber(Y) then
self.Base._Offset.Y = tonumber(Y)
end
else
return self.Base._Offset
end
end
function UIMenuCheckboxItem:Text(Text)
if tostring(Text) and Text ~= nil then
self.Base.Text:Text(tostring(Text))
else
return self.Base.Text:Text()
end
end
function UIMenuCheckboxItem:SetLeftBadge()
error("This item does not support badges")
end
function UIMenuCheckboxItem:SetRightBadge()
error("This item does not support badges")
end
function UIMenuCheckboxItem:RightLabel()
error("This item does not support a right label")
end
function UIMenuCheckboxItem:Draw()
self.Base:Draw()
self.CheckedSprite:Position(380 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.CheckedSprite.Y)
if self.Base:Selected() then
if self.Checked then
self.CheckedSprite.TxtName = "shop_box_tickb"
else
self.CheckedSprite.TxtName = "shop_box_blankb"
end
else
if self.Checked then
self.CheckedSprite.TxtName = "shop_box_tick"
else
self.CheckedSprite.TxtName = "shop_box_blank"
end
end
self.CheckedSprite:Draw()
end
@@ -0,0 +1,117 @@
UIMenuColouredItem = setmetatable({}, UIMenuColouredItem)
UIMenuColouredItem.__index = UIMenuColouredItem
UIMenuColouredItem.__call = function() return "UIMenuItem", "UIMenuColouredItem" end
function UIMenuColouredItem.New(Text, Description, MainColour, HighlightColour)
if type(Colour) ~= "table" then Colour = {R = 0, G = 0, B = 0, A = 255} end
if type(HighlightColour) ~= "table" then Colour = {R = 255, G = 255, B = 255, A = 255} end
local _UIMenuColouredItem = {
Base = UIMenuItem.New(Text or "", Description or ""),
Rectangle = UIResRectangle.New(0, 0, 431, 38, MainColour.R, MainColour.G, MainColour.B, MainColour.A),
MainColour = MainColour,
HighlightColour = HighlightColour,
Activated = function(menu, item) end,
}
_UIMenuColouredItem.Base.SelectedSprite:Colour(HighlightColour.R, HighlightColour.G, HighlightColour.B, HighlightColour.A)
return setmetatable(_UIMenuColouredItem, UIMenuColouredItem)
end
function UIMenuColouredItem:SetParentMenu(Menu)
if Menu() == "UIMenu" then
self.Base.ParentMenu = Menu
else
return self.Base.ParentMenu
end
end
function UIMenuColouredItem:Position(Y)
if tonumber(Y) then
self.Base:Position(Y)
self.Rectangle:Position(self.Base._Offset.X, Y + 144 + self.Base._Offset.Y)
end
end
function UIMenuColouredItem:Selected(bool)
if bool ~= nil then
self.Base._Selected = tobool(bool)
else
return self.Base._Selected
end
end
function UIMenuColouredItem:Hovered(bool)
if bool ~= nil then
self.Base._Hovered = tobool(bool)
else
return self.Base._Hovered
end
end
function UIMenuColouredItem:Enabled(bool)
if bool ~= nil then
self.Base._Enabled = tobool(bool)
else
return self.Base._Enabled
end
end
function UIMenuColouredItem:Description(str)
if tostring(str) and str ~= nil then
self.Base._Description = tostring(str)
else
return self.Base._Description
end
end
function UIMenuColouredItem:Offset(X, Y)
if tonumber(X) or tonumber(Y) then
if tonumber(X) then
self.Base._Offset.X = tonumber(X)
end
if tonumber(Y) then
self.Base._Offset.Y = tonumber(Y)
end
else
return self.Base._Offset
end
end
function UIMenuColouredItem:Text(Text)
if tostring(Text) and Text ~= nil then
self.Base.Text:Text(tostring(Text))
else
return self.Base.Text:Text()
end
end
function UIMenuColouredItem:RightLabel(Text, MainColour, HighlightColour)
if tostring(Text) and Text ~= nil then
if type(MainColour) == "table" then
self.Base.Label.MainColour = MainColour
end
if type(HighlightColour) == "table" then
self.Base.Label.HighlightColour = HighlightColour
end
self.Base.Label.Text:Text(tostring(Text))
else
return self.Base.Label.Text:Text()
end
end
function UIMenuColouredItem:SetLeftBadge(Badge)
if tonumber(Badge) then
self.Base.LeftBadge.Badge = tonumber(Badge)
end
end
function UIMenuColouredItem:SetRightBadge(Badge)
if tonumber(Badge) then
self.Base.RightBadge.Badge = tonumber(Badge)
end
end
function UIMenuColouredItem:Draw()
self.Rectangle:Size(431 + self.ParentMenu.WidthOffset, self.Rectangle.Height)
self.Rectangle:Draw()
self.Base:Draw()
end
+212
View File
@@ -0,0 +1,212 @@
UIMenuItem = setmetatable({}, UIMenuItem)
UIMenuItem.__index = UIMenuItem
UIMenuItem.__call = function() return "UIMenuItem", "UIMenuItem" end
function UIMenuItem.New(Text, Description)
_UIMenuItem = {
Rectangle = UIResRectangle.New(0, 0, 431, 38, 255, 255, 255, 20),
Text = UIResText.New(tostring(Text) or "", 8, 0, 0.33, 245, 245, 245, 255, 0),
_Description = tostring(Description) or "";
SelectedSprite = Sprite.New("commonmenu", "gradient_nav", 0, 0, 431, 38),
LeftBadge = { Sprite = Sprite.New("commonmenu", "", 0, 0, 40, 40), Badge = 0},
RightBadge = { Sprite = Sprite.New("commonmenu", "", 0, 0, 40, 40), Badge = 0},
Label = {
Text = UIResText.New("", 0, 0, 0.35, 245, 245, 245, 255, 0, "Right"),
MainColour = {R = 255, G = 255, B = 255, A = 255},
HighlightColour = {R = 0, G = 0, B = 0, A = 255},
},
_Selected = false,
_Hovered = false,
_Enabled = true,
_Offset = {X = 0, Y = 0},
ParentMenu = nil,
Panels = {},
Activated = function(menu, item) end,
ActivatedPanel = function(menu, item, panel, panelvalue) end,
}
return setmetatable(_UIMenuItem, UIMenuItem)
end
function UIMenuItem:SetParentMenu(Menu)
if Menu ~= nil and Menu() == "UIMenu" then
self.ParentMenu = Menu
else
return self.ParentMenu
end
end
function UIMenuItem:Selected(bool)
if bool ~= nil then
self._Selected = tobool(bool)
else
return self._Selected
end
end
function UIMenuItem:Hovered(bool)
if bool ~= nil then
self._Hovered = tobool(bool)
else
return self._Hovered
end
end
function UIMenuItem:Enabled(bool)
if bool ~= nil then
self._Enabled = tobool(bool)
else
return self._Enabled
end
end
function UIMenuItem:Description(str)
if tostring(str) and str ~= nil then
self._Description = tostring(str)
else
return self._Description
end
end
function UIMenuItem:Offset(X, Y)
if tonumber(X) or tonumber(Y) then
if tonumber(X) then
self._Offset.X = tonumber(X)
end
if tonumber(Y) then
self._Offset.Y = tonumber(Y)
end
else
return self._Offset
end
end
function UIMenuItem:Position(Y)
if tonumber(Y) then
self.Rectangle:Position(self._Offset.X, Y + 144 + self._Offset.Y)
self.SelectedSprite:Position(0 + self._Offset.X, Y + 144 + self._Offset.Y)
self.Text:Position(8 + self._Offset.X, Y + 147 + self._Offset.Y)
self.LeftBadge.Sprite:Position(0 + self._Offset.X, Y + 142 + self._Offset.Y)
self.RightBadge.Sprite:Position(385 + self._Offset.X, Y + 142 + self._Offset.Y)
self.Label.Text:Position(420 + self._Offset.X, Y + 148 + self._Offset.Y)
end
end
function UIMenuItem:RightLabel(Text, MainColour, HighlightColour)
if tostring(Text) and Text ~= nil then
if type(MainColour) == "table" then
self.Label.MainColour = MainColour
end
if type(HighlightColour) == "table" then
self.Label.HighlightColour = HighlightColour
end
self.Label.Text:Text(tostring(Text))
else
return self.Label.Text:Text()
end
end
function UIMenuItem:SetLeftBadge(Badge)
if tonumber(Badge) then
self.LeftBadge.Badge = tonumber(Badge)
end
end
function UIMenuItem:SetRightBadge(Badge)
if tonumber(Badge) then
self.RightBadge.Badge = tonumber(Badge)
end
end
function UIMenuItem:Text(Text)
if tostring(Text) and Text ~= nil then
self.Text:Text(tostring(Text))
else
return self.Text:Text()
end
end
function UIMenuItem:AddPanel(Panel)
if Panel() == "UIMenuPanel" then
table.insert(self.Panels, Panel)
Panel:SetParentItem(self)
end
end
function UIMenuItem:RemovePanelAt(Index)
if tonumber(Index) then
if self.Panels[Index] then
table.remove(self.Panels, tonumber(Index))
end
end
end
function UIMenuItem:FindPanelIndex(Panel)
if Panel() == "UIMenuPanel" then
for Index = 1, #self.Panels do
if self.Panels[Index] == Panel then
return Index
end
end
end
return nil
end
function UIMenuItem:FindPanelItem()
for Index = #self.Items, 1, -1 do
if self.Items[Index].Panel then
return Index
end
end
return nil
end
function UIMenuItem:Draw()
self.Rectangle:Size(431 + self.ParentMenu.WidthOffset, self.Rectangle.Height)
self.SelectedSprite:Size(431 + self.ParentMenu.WidthOffset, self.SelectedSprite.Height)
if self._Hovered and not self._Selected then
self.Rectangle:Draw()
end
if self._Selected then
self.SelectedSprite:Draw()
end
if self._Enabled then
if self._Selected then
self.Text:Colour(0, 0, 0, 255)
self.Label.Text:Colour(self.Label.HighlightColour.R, self.Label.HighlightColour.G, self.Label.HighlightColour.B, self.Label.HighlightColour.A)
else
self.Text:Colour(245, 245, 245, 255)
self.Label.Text:Colour(self.Label.MainColour.R, self.Label.MainColour.G, self.Label.MainColour.B, self.Label.MainColour.A)
end
else
self.Text:Colour(163, 159, 148, 255)
self.Label.Text:Colour(163, 159, 148, 255)
end
if self.LeftBadge.Badge == BadgeStyle.None then
self.Text:Position(8 + self._Offset.X, self.Text.Y)
else
self.Text:Position(35 + self._Offset.X, self.Text.Y)
self.LeftBadge.Sprite.TxtDictionary = GetBadgeDictionary(self.LeftBadge.Badge, self._Selected)
self.LeftBadge.Sprite.TxtName = GetBadgeTexture(self.LeftBadge.Badge, self._Selected)
self.LeftBadge.Sprite:Colour(GetBadgeColour(self.LeftBadge.Badge, self._Selected))
self.LeftBadge.Sprite:Draw()
end
if self.RightBadge.Badge ~= BadgeStyle.None then
self.RightBadge.Sprite:Position(385 + self._Offset.X + self.ParentMenu.WidthOffset, self.RightBadge.Sprite.Y)
self.RightBadge.Sprite.TxtDictionary = GetBadgeDictionary(self.RightBadge.Badge, self._Selected)
self.RightBadge.Sprite.TxtName = GetBadgeTexture(self.RightBadge.Badge, self._Selected)
self.RightBadge.Sprite:Colour(GetBadgeColour(self.RightBadge.Badge, self._Selected))
self.RightBadge.Sprite:Draw()
end
if self.Label.Text:Text() ~= "" and string.len(self.Label.Text:Text()) > 0 then
self.Label.Text:Position(420 + self._Offset.X + self.ParentMenu.WidthOffset, self.Label.Text.Y)
self.Label.Text:Draw()
end
self.Text:Draw()
end
+206
View File
@@ -0,0 +1,206 @@
UIMenuListItem = setmetatable({}, UIMenuListItem)
UIMenuListItem.__index = UIMenuListItem
UIMenuListItem.__call = function() return "UIMenuItem", "UIMenuListItem" end
function UIMenuListItem.New(Text, Items, Index, Description)
if type(Items) ~= "table" then Items = {} end
if Index == 0 then Index = 1 end
local _UIMenuListItem = {
Base = UIMenuItem.New(Text or "", Description or ""),
Items = Items,
LeftArrow = Sprite.New("commonmenu", "arrowleft", 110, 105, 30, 30),
RightArrow = Sprite.New("commonmenu", "arrowright", 280, 105, 30, 30),
ItemText = UIResText.New("", 290, 104, 0.35, 255, 255, 255, 255, 0, "Right"),
_Index = tonumber(Index) or 1,
Panels = {},
OnListChanged = function(menu, item, newindex) end,
OnListSelected = function(menu, item, newindex) end,
}
return setmetatable(_UIMenuListItem, UIMenuListItem)
end
function UIMenuListItem:SetParentMenu(Menu)
if Menu ~= nil and Menu() == "UIMenu" then
self.Base.ParentMenu = Menu
else
return self.Base.ParentMenu
end
end
function UIMenuListItem:Position(Y)
if tonumber(Y) then
self.LeftArrow:Position(300 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 147 + Y + self.Base._Offset.Y)
self.RightArrow:Position(400 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 147 + Y + self.Base._Offset.Y)
self.ItemText:Position(300 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 147 + Y + self.Base._Offset.Y)
self.Base:Position(Y)
end
end
function UIMenuListItem:Selected(bool)
if bool ~= nil then
self.Base._Selected = tobool(bool)
else
return self.Base._Selected
end
end
function UIMenuListItem:Hovered(bool)
if bool ~= nil then
self.Base._Hovered = tobool(bool)
else
return self.Base._Hovered
end
end
function UIMenuListItem:Enabled(bool)
if bool ~= nil then
self.Base._Enabled = tobool(bool)
else
return self.Base._Enabled
end
end
function UIMenuListItem:Description(str)
if tostring(str) and str ~= nil then
self.Base._Description = tostring(str)
else
return self.Base._Description
end
end
function UIMenuListItem:Offset(X, Y)
if tonumber(X) or tonumber(Y) then
if tonumber(X) then
self.Base._Offset.X = tonumber(X)
end
if tonumber(Y) then
self.Base._Offset.Y = tonumber(Y)
end
else
return self.Base._Offset
end
end
function UIMenuListItem:Text(Text)
if tostring(Text) and Text ~= nil then
self.Base.Text:Text(tostring(Text))
else
return self.Base.Text:Text()
end
end
function UIMenuListItem:Index(Index)
if tonumber(Index) then
if tonumber(Index) > #self.Items then
self._Index = 1
elseif tonumber(Index) < 1 then
self._Index = #self.Items
else
self._Index = tonumber(Index)
end
else
return self._Index
end
end
function UIMenuListItem:ItemToIndex(Item)
for i = 1, #self.Items do
if type(Item) == type(self.Items[i]) and Item == self.Items[i] then
return i
elseif type(self.Items[i]) == "table" and (type(Item) == type(self.Items[i].Name) or type(Item) == type(self.Items[i].Value)) and (Item == self.Items[i].Name or Item == self.Items[i].Value) then
return i
end
end
end
function UIMenuListItem:IndexToItem(Index)
if tonumber(Index) then
if tonumber(Index) == 0 then Index = 1 end
if self.Items[tonumber(Index)] then
return self.Items[tonumber(Index)]
end
end
end
function UIMenuListItem:SetLeftBadge()
error("This item does not support badges")
end
function UIMenuListItem:SetRightBadge()
error("This item does not support badges")
end
function UIMenuListItem:RightLabel()
error("This item does not support a right label")
end
function UIMenuListItem:AddPanel(Panel)
if Panel() == "UIMenuPanel" then
table.insert(self.Panels, Panel)
Panel:SetParentItem(self)
end
end
function UIMenuListItem:RemovePanelAt(Index)
if tonumber(Index) then
if self.Panels[Index] then
table.remove(self.Panels, tonumber(Index))
end
end
end
function UIMenuListItem:FindPanelIndex(Panel)
if Panel() == "UIMenuPanel" then
for Index = 1, #self.Panels do
if self.Panels[Index] == Panel then
return Index
end
end
end
return nil
end
function UIMenuListItem:FindPanelItem()
for Index = #self.Items, 1, -1 do
if self.Items[Index].Panel then
return Index
end
end
return nil
end
function UIMenuListItem:Draw()
self.Base:Draw()
if self:Enabled() then
if self:Selected() then
self.ItemText:Colour(0, 0, 0, 255)
self.LeftArrow:Colour(0, 0, 0, 255)
self.RightArrow:Colour(0, 0, 0, 255)
else
self.ItemText:Colour(245, 245, 245, 255)
self.LeftArrow:Colour(245, 245, 245, 255)
self.RightArrow:Colour(245, 245, 245, 255)
end
else
self.ItemText:Colour(163, 159, 148, 255)
self.LeftArrow:Colour(163, 159, 148, 255)
self.RightArrow:Colour(163, 159, 148, 255)
end
local Text = (type(self.Items[self._Index]) == "table") and tostring(self.Items[self._Index].Name) or tostring(self.Items[self._Index])
local Offset = MeasureStringWidth(Text, 0, 0.35)
self.ItemText:Text(Text)
self.LeftArrow:Position(378 - Offset + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.LeftArrow.Y)
if self:Selected() then
self.LeftArrow:Draw()
self.RightArrow:Draw()
self.ItemText:Position(403 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.ItemText.Y)
else
self.ItemText:Position(418 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.ItemText.Y)
end
self.ItemText:Draw()
end
@@ -0,0 +1,176 @@
UIMenuProgressItem = setmetatable({}, UIMenuProgressItem)
UIMenuProgressItem.__index = UIMenuProgressItem
UIMenuProgressItem.__call = function() return "UIMenuItem", "UIMenuProgressItem" end
function UIMenuProgressItem.New(Text, Items, Index, Description, Counter)
if type(Items) ~= "table" then Items = {} end
if Index == 0 then Index = 1 end
local _UIMenuProgressItem = {
Base = UIMenuItem.New(Text or "", Description or ""),
Data = {
Items = Items,
Counter = tobool(Counter),
Max = 407.5,
Index = tonumber(Index) or 1,
},
Background = UIResRectangle.New(0, 0, 415, 20),
Bar = UIResRectangle.New(0, 0, 407.5, 12.5),
OnProgressChanged = function(menu, item, newindex) end,
OnProgressSelected = function(menu, item, newindex) end,
}
_UIMenuProgressItem.Base.Rectangle.Height = 60
_UIMenuProgressItem.Base.SelectedSprite.Height = 60
if _UIMenuProgressItem.Data.Counter then
_UIMenuProgressItem.Base:RightLabel(_UIMenuProgressItem.Data.Index.."/"..#_UIMenuProgressItem.Data.Items)
else
_UIMenuProgressItem.Base:RightLabel((type(_UIMenuProgressItem.Data.Items[_UIMenuProgressItem.Data.Index]) == "table") and tostring(_UIMenuProgressItem.Data.Items[_UIMenuProgressItem.Data.Index].Name) or tostring(_UIMenuProgressItem.Data.Items[_UIMenuProgressItem.Data.Index]))
end
_UIMenuProgressItem.Bar.Width = _UIMenuProgressItem.Data.Index/#_UIMenuProgressItem.Data.Items * _UIMenuProgressItem.Data.Max
return setmetatable(_UIMenuProgressItem, UIMenuProgressItem)
end
function UIMenuProgressItem:SetParentMenu(Menu)
if Menu() == "UIMenu" then
self.Base.ParentMenu = Menu
else
return self.Base.ParentMenu
end
end
function UIMenuProgressItem:Position(Y)
if tonumber(Y) then
self.Base:Position(Y)
self.Background:Position(8 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 177 + Y + self.Base._Offset.Y)
self.Bar:Position(11.75 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 180.75 + Y + self.Base._Offset.Y)
end
end
function UIMenuProgressItem:Selected(bool)
if bool ~= nil then
self.Base._Selected = tobool(bool)
else
return self.Base._Selected
end
end
function UIMenuProgressItem:Hovered(bool)
if bool ~= nil then
self.Base._Hovered = tobool(bool)
else
return self.Base._Hovered
end
end
function UIMenuProgressItem:Enabled(bool)
if bool ~= nil then
self.Base._Enabled = tobool(bool)
else
return self.Base._Enabled
end
end
function UIMenuProgressItem:Description(str)
if tostring(str) and str ~= nil then
self.Base._Description = tostring(str)
else
return self.Base._Description
end
end
function UIMenuProgressItem:Offset(X, Y)
if tonumber(X) or tonumber(Y) then
if tonumber(X) then
self.Base._Offset.X = tonumber(X)
end
if tonumber(Y) then
self.Base._Offset.Y = tonumber(Y)
end
else
return self.Base._Offset
end
end
function UIMenuProgressItem:Text(Text)
if tostring(Text) and Text ~= nil then
self.Base.Text:Text(tostring(Text))
else
return self.Base.Text:Text()
end
end
function UIMenuProgressItem:Index(Index)
if tonumber(Index) then
if tonumber(Index) > #self.Data.Items then
self.Data.Index = 1
elseif tonumber(Index) < 1 then
self.Data.Index = #self.Data.Items
else
self.Data.Index = tonumber(Index)
end
if self.Data.Counter then
self.Base:RightLabel(self.Data.Index.."/"..#self.Data.Items)
else
self.Base:RightLabel((type(self.Data.Items[self.Data.Index]) == "table") and tostring(self.Data.Items[self.Data.Index].Name) or tostring(self.Data.Items[self.Data.Index]))
end
self.Bar.Width = self.Data.Index/#self.Data.Items * self.Data.Max
else
return self.Data.Index
end
end
function UIMenuProgressItem:ItemToIndex(Item)
for i = 1, #self.Data.Items do
if type(Item) == type(self.Data.Items[i]) and Item == self.Data.Items[i] then
return i
elseif type(self.Data.Items[i]) == "table" and (type(Item) == type(self.Data.Items[i].Name) or type(Item) == type(self.Data.Items[i].Value)) and (Item == self.Data.Items[i].Name or Item == self.Data.Items[i].Value) then
return i
end
end
end
function UIMenuProgressItem:IndexToItem(Index)
if tonumber(Index) then
if tonumber(Index) == 0 then Index = 1 end
if self.Data.Items[tonumber(Index)] then
return self.Data.Items[tonumber(Index)]
end
end
end
function UIMenuProgressItem:SetLeftBadge()
error("This item does not support badges")
end
function UIMenuProgressItem:SetRightBadge()
error("This item does not support badges")
end
function UIMenuProgressItem:RightLabel()
error("This item does not support a right label")
end
function UIMenuProgressItem:CalculateProgress(CursorX)
local Progress = CursorX - self.Bar.X
self:Index(math.round(#self.Data.Items * (((Progress >= 0 and Progress <= self.Data.Max) and Progress or ((Progress < 0) and 0 or self.Data.Max))/self.Data.Max)))
end
function UIMenuProgressItem:Draw()
self.Base:Draw()
if self.Base._Selected then
self.Background:Colour(table.unpack(Colours.Black))
self.Bar:Colour(table.unpack(Colours.White))
else
self.Background:Colour(table.unpack(Colours.White))
self.Bar:Colour(table.unpack(Colours.Black))
end
self.Background:Draw()
self.Bar:Draw()
end
@@ -0,0 +1,169 @@
UIMenuSliderItem = setmetatable({}, UIMenuSliderItem)
UIMenuSliderItem.__index = UIMenuSliderItem
UIMenuSliderItem.__call = function() return "UIMenuItem", "UIMenuSliderItem" end
function UIMenuSliderItem.New(Text, Items, Index, Description, Divider)
if type(Items) ~= "table" then Items = {} end
if Index == 0 then Index = 1 end
local _UIMenuSliderItem = {
Base = UIMenuItem.New(Text or "", Description or ""),
Items = Items,
ShowDivider = tobool(Divider),
LeftArrow = Sprite.New("commonmenutu", "arrowleft", 0, 105, 15, 15),
RightArrow = Sprite.New("commonmenutu", "arrowright", 0, 105, 15, 15),
Background = UIResRectangle.New(0, 0, 150, 9, 4, 32, 57, 255),
Slider = UIResRectangle.New(0, 0, 75, 9, 57, 116, 200, 255),
Divider = UIResRectangle.New(0, 0, 2.5, 20, 245, 245, 245, 255),
_Index = tonumber(Index) or 1,
OnSliderChanged = function(menu, item, newindex) end,
OnSliderSelected = function(menu, item, newindex) end,
}
return setmetatable(_UIMenuSliderItem, UIMenuSliderItem)
end
function UIMenuSliderItem:SetParentMenu(Menu)
if Menu() == "UIMenu" then
self.Base.ParentMenu = Menu
else
return self.Base.ParentMenu
end
end
function UIMenuSliderItem:Position(Y)
if tonumber(Y) then
self.Background:Position(250 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 158.5 + self.Base._Offset.Y)
self.Slider:Position(250 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 158.5 + self.Base._Offset.Y)
self.Divider:Position(323.5 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 153 + self.Base._Offset.Y)
self.LeftArrow:Position(235 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 155.5 + Y + self.Base._Offset.Y)
self.RightArrow:Position(400 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 155.5 + Y + self.Base._Offset.Y)
self.Base:Position(Y)
end
end
function UIMenuSliderItem:Selected(bool)
if bool ~= nil then
self.Base._Selected = tobool(bool)
else
return self.Base._Selected
end
end
function UIMenuSliderItem:Hovered(bool)
if bool ~= nil then
self.Base._Hovered = tobool(bool)
else
return self.Base._Hovered
end
end
function UIMenuSliderItem:Enabled(bool)
if bool ~= nil then
self.Base._Enabled = tobool(bool)
else
return self.Base._Enabled
end
end
function UIMenuSliderItem:Description(str)
if tostring(str) and str ~= nil then
self.Base._Description = tostring(str)
else
return self.Base._Description
end
end
function UIMenuSliderItem:Offset(X, Y)
if tonumber(X) or tonumber(Y) then
if tonumber(X) then
self.Base._Offset.X = tonumber(X)
end
if tonumber(Y) then
self.Base._Offset.Y = tonumber(Y)
end
else
return self.Base._Offset
end
end
function UIMenuSliderItem:Text(Text)
if tostring(Text) and Text ~= nil then
self.Base.Text:Text(tostring(Text))
else
return self.Base.Text:Text()
end
end
function UIMenuSliderItem:Index(Index)
if tonumber(Index) then
if tonumber(Index) > #self.Items then
self._Index = 1
elseif tonumber(Index) < 1 then
self._Index = #self.Items
else
self._Index = tonumber(Index)
end
else
return self._Index
end
end
function UIMenuSliderItem:ItemToIndex(Item)
for i = 1, #self.Items do
if type(Item) == type(self.Items[i]) and Item == self.Items[i] then
return i
end
end
end
function UIMenuSliderItem:IndexToItem(Index)
if tonumber(Index) then
if tonumber(Index) == 0 then Index = 1 end
if self.Items[tonumber(Index)] then
return self.Items[tonumber(Index)]
end
end
end
function UIMenuSliderItem:SetLeftBadge()
error("This item does not support badges")
end
function UIMenuSliderItem:SetRightBadge()
error("This item does not support badges")
end
function UIMenuSliderItem:RightLabel()
error("This item does not support a right label")
end
function UIMenuSliderItem:Draw()
self.Base:Draw()
if self:Enabled() then
if self:Selected() then
self.LeftArrow:Colour(0, 0, 0, 255)
self.RightArrow:Colour(0, 0, 0, 255)
else
self.LeftArrow:Colour(245, 245, 245, 255)
self.RightArrow:Colour(245, 245, 245, 255)
end
else
self.LeftArrow:Colour(163, 159, 148, 255)
self.RightArrow:Colour(163, 159, 148, 255)
end
local Offset = ((self.Background.Width - self.Slider.Width)/(#self.Items - 1)) * (self._Index-1)
self.Slider:Position(250 + self.Base._Offset.X + Offset + self.Base.ParentMenu.WidthOffset, self.Slider.Y)
if self:Selected() then
self.LeftArrow:Draw()
self.RightArrow:Draw()
end
self.Background:Draw()
self.Slider:Draw()
if self.ShowDivider then
self.Divider:Draw()
end
end
@@ -0,0 +1,228 @@
UIMenuColourPanel = setmetatable({}, UIMenuColourPanel)
UIMenuColourPanel.__index = UIMenuColourPanel
UIMenuColourPanel.__call = function() return "UIMenuPanel", "UIMenuColourPanel" end
function UIMenuColourPanel.New(Title, Colours)
_UIMenuColourPanel = {
Data = {
Pagination = {
Min = 1,
Max = 8,
Total = 8,
},
Index = 1000,
Items = Colours,
Title = Title or "Title",
Enabled = true,
Value = 1,
},
Background = Sprite.New("commonmenu", "gradient_bgd", 0, 0, 431, 112),
Bar = {},
LeftArrow = Sprite.New("commonmenu", "arrowleft", 0, 0, 30, 30),
RightArrow = Sprite.New("commonmenu", "arrowright", 0, 0, 30, 30),
SelectedRectangle = UIResRectangle.New(0, 0, 44.5, 8),
Text = UIResText.New(Title.." (1 of "..#Colours..")" or "Title".." (1 of "..#Colours..")", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
ParentItem = nil,
}
for Index = 1, #Colours do
if Index < 10 then
table.insert(_UIMenuColourPanel.Bar, UIResRectangle.New(0, 0, 44.5, 44.5, table.unpack(Colours[Index])))
else
break
end
end
if #_UIMenuColourPanel.Data.Items ~= 0 then
_UIMenuColourPanel.Data.Index = 1000 - (1000 % #_UIMenuColourPanel.Data.Items)
_UIMenuColourPanel.Data.Pagination.Max = _UIMenuColourPanel.Data.Pagination.Total + 1
_UIMenuColourPanel.Data.Pagination.Min = 0
end
return setmetatable(_UIMenuColourPanel, UIMenuColourPanel)
end
function UIMenuColourPanel:SetParentItem(Item) -- required
if Item() == "UIMenuItem" then
self.ParentItem = Item
else
return self.ParentItem
end
end
function UIMenuColourPanel:Enabled(Enabled)
if type(Enabled) == "boolean" then
self.Data.Enabled = Enabled
else
return self.Data.Enabled
end
end
function UIMenuColourPanel:Position(Y) -- required
if tonumber(Y) then
local ParentOffsetX, ParentOffsetWidth = self.ParentItem:Offset().X, self.ParentItem:SetParentMenu().WidthOffset
self.Background:Position(ParentOffsetX, Y)
for Index = 1, #self.Bar do
self.Bar[Index]:Position(15 + (44.5 * (Index - 1)) + ParentOffsetX + (ParentOffsetWidth/2), 55 + Y)
end
self.SelectedRectangle:Position(15 + (44.5 * ((self:CurrentSelection() - self.Data.Pagination.Min) - 1)) + ParentOffsetX + (ParentOffsetWidth/2), 47 + Y)
self.LeftArrow:Position(7.5 + ParentOffsetX + (ParentOffsetWidth/2), 15 + Y)
self.RightArrow:Position(393.5 + ParentOffsetX + (ParentOffsetWidth/2), 15 + Y)
self.Text:Position(215.5 + ParentOffsetX + (ParentOffsetWidth/2), 15 + Y)
end
end
function UIMenuColourPanel:CurrentSelection(value, PreventUpdate)
if tonumber(value) then
if #self.Data.Items == 0 then
self.Data.Index = 0
end
self.Data.Index = 1000000 - (1000000 % #self.Data.Items) + tonumber(value)
if self:CurrentSelection() > self.Data.Pagination.Max then
self.Data.Pagination.Min = self:CurrentSelection() - (self.Data.Pagination.Total + 1)
self.Data.Pagination.Max = self:CurrentSelection()
elseif self:CurrentSelection() < self.Data.Pagination.Min then
self.Data.Pagination.Min = self:CurrentSelection() - 1
self.Data.Pagination.Max = self:CurrentSelection() + (self.Data.Pagination.Total + 1)
end
self:UpdateSelection(PreventUpdate)
else
if #self.Data.Items == 0 then
return 1
else
if self.Data.Index % #self.Data.Items == 0 then
return 1
else
return self.Data.Index % #self.Data.Items + 1
end
end
end
end
function UIMenuColourPanel:UpdateParent(Colour)
local _, ParentType = self.ParentItem()
if ParentType == "UIMenuListItem" then
local PanelItemIndex = self.ParentItem:FindPanelItem()
local PanelIndex = self.ParentItem:FindPanelIndex(self)
if PanelItemIndex then
self.ParentItem.Items[PanelItemIndex].Value[PanelIndex] = Colour
self.ParentItem:Index(PanelItemIndex)
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
else
for Index = 1, #self.ParentItem.Items do
if type(self.ParentItem.Items[Index]) == "table" then
if not self.ParentItem.Items[Index].Panels then self.ParentItem.Items[Index].Panels = {} end
self.ParentItem.Items[Index].Panels[PanelIndex] = Colour
else
self.ParentItem.Items[Index] = {Name = tostring(self.ParentItem.Items[Index]), Value = self.ParentItem.Items[Index], Panels = {[PanelIndex] = Colour}}
end
end
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
end
elseif ParentType == "UIMenuItem" then
self.ParentItem.ActivatedPanel(self.ParentItem.ParentMenu, self.ParentItem, self, Colour)
end
end
function UIMenuColourPanel:UpdateSelection(PreventUpdate)
local CurrentSelection = self:CurrentSelection()
if not PreventUpdate then
self:UpdateParent(CurrentSelection)
end
self.SelectedRectangle:Position(15 + (44.5 * ((CurrentSelection - self.Data.Pagination.Min) - 1)) + self.ParentItem:Offset().X, self.SelectedRectangle.Y)
for Index = 1, 9 do
self.Bar[Index]:Colour(table.unpack(self.Data.Items[self.Data.Pagination.Min + Index]))
end
self.Text:Text(self.Data.Title.." ("..CurrentSelection.." of "..#self.Data.Items..")")
end
function UIMenuColourPanel:Functions()
local SafeZone = {X = 0, Y = 0}
if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then
SafeZone = GetSafeZoneBounds()
end
if IsMouseInBounds(self.LeftArrow.X + SafeZone.X, self.LeftArrow.Y + SafeZone.Y, self.LeftArrow.Width, self.LeftArrow.Height) then
if IsDisabledControlJustPressed(0, 24) then
if #self.Data.Items > self.Data.Pagination.Total + 1 then
if self:CurrentSelection() <= self.Data.Pagination.Min + 1 then
if self:CurrentSelection() == 1 then
self.Data.Pagination.Min = #self.Data.Items - (self.Data.Pagination.Total + 1)
self.Data.Pagination.Max = #self.Data.Items
self.Data.Index = 1000 - (1000 % #self.Data.Items)
self.Data.Index = self.Data.Index + (#self.Data.Items - 1)
self:UpdateSelection()
else
self.Data.Pagination.Min = self.Data.Pagination.Min - 1
self.Data.Pagination.Max = self.Data.Pagination.Max - 1
self.Data.Index = self.Data.Index - 1
self:UpdateSelection()
end
else
self.Data.Index = self.Data.Index - 1
self:UpdateSelection()
end
else
self.Data.Index = self.Data.Index - 1
self:UpdateSelection()
end
end
end
if IsMouseInBounds(self.RightArrow.X + SafeZone.X, self.RightArrow.Y + SafeZone.Y, self.RightArrow.Width, self.RightArrow.Height) then
if IsDisabledControlJustPressed(0, 24) then
if #self.Data.Items > self.Data.Pagination.Total + 1 then
if self:CurrentSelection() >= self.Data.Pagination.Max then
if self:CurrentSelection() == #self.Data.Items then
self.Data.Pagination.Min = 0
self.Data.Pagination.Max = self.Data.Pagination.Total + 1
self.Data.Index = 1000 - (1000 % #self.Data.Items)
self:UpdateSelection()
else
self.Data.Pagination.Max = self.Data.Pagination.Max + 1
self.Data.Pagination.Min = self.Data.Pagination.Max - (self.Data.Pagination.Total + 1)
self.Data.Index = self.Data.Index + 1
self:UpdateSelection()
end
else
self.Data.Index = self.Data.Index + 1
self:UpdateSelection()
end
else
self.Data.Index = self.Data.Index + 1
self:UpdateSelection()
end
end
end
for Index = 1, #self.Bar do
if IsMouseInBounds(self.Bar[Index].X + SafeZone.X, self.Bar[Index].Y + SafeZone.Y, self.Bar[Index].Width, self.Bar[Index].Height) then
if IsDisabledControlJustPressed(0, 24) then
self:CurrentSelection(self.Data.Pagination.Min + Index - 1)
end
end
end
end
function UIMenuColourPanel:Draw() -- required
if self.Data.Enabled then
self.Background:Size(431 + self.ParentItem:SetParentMenu().WidthOffset, 112)
self.Background:Draw()
self.LeftArrow:Draw()
self.RightArrow:Draw()
self.Text:Draw()
self.SelectedRectangle:Draw()
for Index = 1, #self.Bar do
self.Bar[Index]:Draw()
end
self:Functions()
end
end
@@ -0,0 +1,145 @@
UIMenuGridPanel = setmetatable({}, UIMenuGridPanel)
UIMenuGridPanel.__index = UIMenuGridPanel
UIMenuGridPanel.__call = function() return "UIMenuPanel", "UIMenuGridPanel" end
function UIMenuGridPanel.New(TopText, LeftText, RightText, BottomText)
_UIMenuGridPanel = {
Data = {
Enabled = true,
},
Background = Sprite.New("commonmenu", "gradient_bgd", 0, 0, 431, 275),
Grid = Sprite.New("pause_menu_pages_char_mom_dad", "nose_grid", 0, 0, 200, 200, 0),
Circle = Sprite.New("mpinventory","in_world_circle", 0, 0, 20, 20, 0),
Audio = {Slider = "CONTINUOUS_SLIDER", Library = "HUD_FRONTEND_DEFAULT_SOUNDSET", Id = nil},
ParentItem = nil,
Text = {
Top = UIResText.New(TopText or "Top", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
Left = UIResText.New(LeftText or "Left", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
Right = UIResText.New(RightText or "Right", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
Bottom = UIResText.New(BottomText or "Bottom", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
},
}
return setmetatable(_UIMenuGridPanel, UIMenuGridPanel)
end
function UIMenuGridPanel:SetParentItem(Item) -- required
if Item() == "UIMenuItem" then
self.ParentItem = Item
else
return self.ParentItem
end
end
function UIMenuGridPanel:Enabled(Enabled)
if type(Enabled) == "boolean" then
self.Data.Enabled = Enabled
else
return self.Data.Enabled
end
end
function UIMenuGridPanel:CirclePosition(X, Y)
if tonumber(X) and tonumber(Y) then
self.Circle.X = (self.Grid.X + 20) + ((self.Grid.Width - 40) * ((X >= 0.0 and X <= 1.0) and X or 0.0)) - (self.Circle.Width/2)
self.Circle.Y = (self.Grid.Y + 20) + ((self.Grid.Height - 40) * ((Y >= 0.0 and Y <= 1.0) and Y or 0.0)) - (self.Circle.Height/2)
else
return math.round((self.Circle.X - (self.Grid.X + 20) + (self.Circle.Width/2))/(self.Grid.Width - 40), 2), math.round((self.Circle.Y - (self.Grid.Y + 20) + (self.Circle.Height/2))/(self.Grid.Height - 40), 2)
end
end
function UIMenuGridPanel:Position(Y) -- required
if tonumber(Y) then
local ParentOffsetX, ParentOffsetWidth = self.ParentItem:Offset().X, self.ParentItem:SetParentMenu().WidthOffset
self.Background:Position(ParentOffsetX, Y)
self.Grid:Position(ParentOffsetX + 115.5 + (ParentOffsetWidth/2), 37.5 + Y)
self.Text.Top:Position(ParentOffsetX + 215.5 + (ParentOffsetWidth/2), 5 + Y)
self.Text.Left:Position(ParentOffsetX + 57.75 + (ParentOffsetWidth/2), 120 + Y)
self.Text.Right:Position(ParentOffsetX + 373.25 + (ParentOffsetWidth/2), 120 + Y)
self.Text.Bottom:Position(ParentOffsetX + 215.5 + (ParentOffsetWidth/2), 240 + Y)
if not self.CircleLocked then
self.CircleLocked = true
self:CirclePosition(0.5, 0.5)
end
end
end
function UIMenuGridPanel:UpdateParent(X, Y)
local _, ParentType = self.ParentItem()
self.Data.Value = {X = X, Y = Y}
if ParentType == "UIMenuListItem" then
local PanelItemIndex = self.ParentItem:FindPanelItem()
if PanelItemIndex then
self.ParentItem.Items[PanelItemIndex].Value[self.ParentItem:FindPanelIndex(self)] = {X = X, Y = Y}
self.ParentItem:Index(PanelItemIndex)
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
else
local PanelIndex = self.ParentItem:FindPanelIndex(self)
for Index = 1, #self.ParentItem.Items do
if type(self.ParentItem.Items[Index]) == "table" then
if not self.ParentItem.Items[Index].Panels then self.ParentItem.Items[Index].Panels = {} end
self.ParentItem.Items[Index].Panels[PanelIndex] = {X = X, Y = Y}
else
self.ParentItem.Items[Index] = {Name = tostring(self.ParentItem.Items[Index]), Value = self.ParentItem.Items[Index], Panels = {[PanelIndex] = {X = X, Y = Y}}}
end
end
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
end
elseif ParentType == "UIMenuItem" then
self.ParentItem.ActivatedPanel(self.ParentItem.ParentMenu, self.ParentItem, self, {X = X, Y = Y})
end
end
function UIMenuGridPanel:Functions()
local SafeZone = {X = 0, Y = 0}
if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then
SafeZone = GetSafeZoneBounds()
end
if IsMouseInBounds(self.Grid.X + 20 + SafeZone.X, self.Grid.Y + 20 + SafeZone.Y, self.Grid.Width - 40, self.Grid.Height - 40) then
if IsDisabledControlJustPressed(0, 24) then
if not self.Pressed then
self.Pressed = true
Citizen.CreateThread(function()
self.Audio.Id = GetSoundId()
PlaySoundFrontend(self.Audio.Id, self.Audio.Slider, self.Audio.Library, 1)
while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.Grid.X + 20 + SafeZone.X, self.Grid.Y + 20 + SafeZone.Y, self.Grid.Width - 40, self.Grid.Height - 40) do
Citizen.Wait(0)
local CursorX, CursorY = math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X - (self.Circle.Width/2), math.round(GetControlNormal(0, 240) * 1080) - SafeZone.Y - (self.Circle.Height/2)
self.Circle:Position(((CursorX > (self.Grid.X + 10 + self.Grid.Width - 40)) and (self.Grid.X + 10 + self.Grid.Width - 40) or ((CursorX < (self.Grid.X + 20 - (self.Circle.Width/2))) and (self.Grid.X + 20 - (self.Circle.Width/2)) or CursorX)), ((CursorY > (self.Grid.Y + 10 + self.Grid.Height - 40)) and (self.Grid.Y + 10 + self.Grid.Height - 40) or ((CursorY < (self.Grid.Y + 20 - (self.Circle.Height/2))) and (self.Grid.Y + 20 - (self.Circle.Height/2)) or CursorY)))
end
StopSound(self.Audio.Id)
ReleaseSoundId(self.Audio.Id)
self.Pressed = false
end)
Citizen.CreateThread(function()
while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.Grid.X + 20 + SafeZone.X, self.Grid.Y + 20 + SafeZone.Y, self.Grid.Width - 40, self.Grid.Height - 40) do
Citizen.Wait(75)
local ResultX, ResultY = math.round((self.Circle.X - (self.Grid.X + 20) + (self.Circle.Width/2))/(self.Grid.Width - 40), 2), math.round((self.Circle.Y - (self.Grid.Y + 20) + (self.Circle.Height/2))/(self.Grid.Height - 40), 2)
self:UpdateParent((((ResultX >= 0.0 and ResultX <= 1.0) and ResultX or ((ResultX <= 0) and 0.0) or 1.0) * 2) - 1, (((ResultY >= 0.0 and ResultY <= 1.0) and ResultY or ((ResultY <= 0) and 0.0) or 1.0) * 2) - 1)
end
end)
end
end
end
end
function UIMenuGridPanel:Draw() -- required
if self.Data.Enabled then
self.Background:Size(431 + self.ParentItem:SetParentMenu().WidthOffset, 275)
self.Background:Draw()
self.Grid:Draw()
self.Circle:Draw()
self.Text.Top:Draw()
self.Text.Left:Draw()
self.Text.Right:Draw()
self.Text.Bottom:Draw()
self:Functions()
end
end
@@ -0,0 +1,141 @@
UIMenuPercentagePanel = setmetatable({}, UIMenuPercentagePanel)
UIMenuPercentagePanel.__index = UIMenuPercentagePanel
UIMenuPercentagePanel.__call = function() return "UIMenuPanel", "UIMenuPercentagePanel" end
function UIMenuPercentagePanel.New(MinText, MaxText)
_UIMenuPercentagePanel = {
Data = {
Enabled = true,
},
Background = Sprite.New("commonmenu", "gradient_bgd", 0, 0, 431, 76),
ActiveBar = UIResRectangle.New(0, 0, 413, 10, 245, 245, 245, 255),
BackgroundBar = UIResRectangle.New(0, 0, 413, 10, 87, 87, 87, 255),
Text = {
Min = UIResText.New(MinText or "0%", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
Max = UIResText.New("100%", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
Title = UIResText.New(MaxText or "Opacity", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"),
},
Audio = {Slider = "CONTINUOUS_SLIDER", Library = "HUD_FRONTEND_DEFAULT_SOUNDSET", Id = nil},
ParentItem = nil,
}
return setmetatable(_UIMenuPercentagePanel, UIMenuPercentagePanel)
end
function UIMenuPercentagePanel:SetParentItem(Item) -- required
if Item() == "UIMenuItem" then
self.ParentItem = Item
else
return self.ParentItem
end
end
function UIMenuPercentagePanel:Enabled(Enabled)
if type(Enabled) == "boolean" then
self.Data.Enabled = Enabled
else
return self.Data.Enabled
end
end
function UIMenuPercentagePanel:Position(Y) -- required
if tonumber(Y) then
local ParentOffsetX, ParentOffsetWidth = self.ParentItem:Offset().X, self.ParentItem:SetParentMenu().WidthOffset
self.Background:Position(ParentOffsetX, Y)
self.ActiveBar:Position(ParentOffsetX + (ParentOffsetWidth/2) + 9, 50 + Y)
self.BackgroundBar:Position(ParentOffsetX + (ParentOffsetWidth/2) + 9, 50 + Y)
self.Text.Min:Position(ParentOffsetX + (ParentOffsetWidth/2) + 25, 15 + Y)
self.Text.Max:Position(ParentOffsetX + (ParentOffsetWidth/2) + 398, 15 + Y)
self.Text.Title:Position(ParentOffsetX + (ParentOffsetWidth/2) + 215.5, 15 + Y)
end
end
function UIMenuPercentagePanel:Percentage(Value)
if tonumber(Value) then
local Percent = ((Value < 0.0) and 0.0) or ((Value > 1.0) and 1.0 or Value)
self.ActiveBar:Size(self.BackgroundBar.Width * Percent, self.ActiveBar.Height)
else
local SafeZone = {X = 0, Y = 0}
if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then
SafeZone = GetSafeZoneBounds()
end
local Progress = (math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X) - self.ActiveBar.X
return math.round(((Progress >= 0 and Progress <= 413) and Progress or ((Progress < 0) and 0 or 413))/self.BackgroundBar.Width, 2)
end
end
function UIMenuPercentagePanel:UpdateParent(Percentage)
local _, ParentType = self.ParentItem()
if ParentType == "UIMenuListItem" then
local PanelItemIndex = self.ParentItem:FindPanelItem()
if PanelItemIndex then
self.ParentItem.Items[PanelItemIndex].Value[self.ParentItem:FindPanelIndex(self)] = Percentage
self.ParentItem:Index(PanelItemIndex)
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
else
local PanelIndex = self.ParentItem:FindPanelIndex(self)
for Index = 1, #self.ParentItem.Items do
if type(self.ParentItem.Items[Index]) == "table" then
if not self.ParentItem.Items[Index].Panels then self.ParentItem.Items[Index].Panels = {} end
self.ParentItem.Items[Index].Panels[PanelIndex] = Percentage
else
self.ParentItem.Items[Index] = {Name = tostring(self.ParentItem.Items[Index]), Value = self.ParentItem.Items[Index], Panels = {[PanelIndex] = Percentage}}
end
end
self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index)
end
elseif ParentType == "UIMenuItem" then
self.ParentItem.ActivatedPanel(self.ParentItem.ParentMenu, self.ParentItem, self, Percentage)
end
end
function UIMenuPercentagePanel:Functions()
local SafeZone = {X = 0, Y = 0}
if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then
SafeZone = GetSafeZoneBounds()
end
if IsMouseInBounds(self.BackgroundBar.X + SafeZone.X, self.BackgroundBar.Y - 4 + SafeZone.Y, self.BackgroundBar.Width, self.BackgroundBar.Height + 8) then
if IsDisabledControlJustPressed(0, 24) then
if not self.Pressed then
self.Pressed = true
Citizen.CreateThread(function()
self.Audio.Id = GetSoundId()
PlaySoundFrontend(self.Audio.Id, self.Audio.Slider, self.Audio.Library, 1)
while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.BackgroundBar.X + SafeZone.X, self.BackgroundBar.Y - 4 + SafeZone.Y, self.BackgroundBar.Width, self.BackgroundBar.Height + 8) do
Citizen.Wait(0)
local Progress = (math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X) - self.ActiveBar.X
self.ActiveBar:Size(((Progress >= 0 and Progress <= 413) and Progress or ((Progress < 0) and 0 or 413)), self.ActiveBar.Height)
end
StopSound(self.Audio.Id)
ReleaseSoundId(self.Audio.Id)
self.Pressed = false
end)
Citizen.CreateThread(function()
while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.BackgroundBar.X + SafeZone.X, self.BackgroundBar.Y - 4 + SafeZone.Y, self.BackgroundBar.Width, self.BackgroundBar.Height + 8) do
Citizen.Wait(75)
local Progress = (math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X) - self.ActiveBar.X
self:UpdateParent(math.round(((Progress >= 0 and Progress <= 413) and Progress or ((Progress < 0) and 0 or 413))/self.BackgroundBar.Width, 2))
end
end)
end
end
end
end
function UIMenuPercentagePanel:Draw() -- required
if self.Data.Enabled then
self.Background:Size(431 + self.ParentItem:SetParentMenu().WidthOffset, 76)
self.Background:Draw()
self.BackgroundBar:Draw()
self.ActiveBar:Draw()
self.Text.Min:Draw()
self.Text.Max:Draw()
self.Text.Title:Draw()
self:Functions()
end
end
@@ -0,0 +1,69 @@
UIMenuHeritageWindow = setmetatable({}, UIMenuHeritageWindow)
UIMenuHeritageWindow.__index = UIMenuHeritageWindow
UIMenuHeritageWindow.__call = function() return "UIMenuWindow", "UIMenuHeritageWindow" end
function UIMenuHeritageWindow.New(Mum, Dad)
if not tonumber(Mum) then Mum = 0 end
if not (Mum >= 0 and Mum <= 21) then Mum = 0 end
if not tonumber(Dad) then Dad = 0 end
if not (Dad >= 0 and Dad <= 23) then Dad = 0 end
_UIMenuHeritageWindow = {
Background = Sprite.New("pause_menu_pages_char_mom_dad", "mumdadbg", 0, 0, 431, 228), -- Background is required, must be a sprite or a rectangle.
MumSprite = Sprite.New("char_creator_portraits", ((Mum < 21) and "female_"..Mum or "special_female_"..(tonumber(string.sub(Mum, 2, 2)) - 1)), 0, 0, 228, 228),
DadSprite = Sprite.New("char_creator_portraits", ((Dad < 21) and "male_"..Dad or "special_male_"..(tonumber(string.sub(Dad, 2, 2)) - 1)), 0, 0, 228, 228),
Mum = Mum,
Dad = Dad,
_Offset = {X = 0, Y = 0}, -- required
ParentMenu = nil, -- required
}
return setmetatable(_UIMenuHeritageWindow, UIMenuHeritageWindow)
end
function UIMenuHeritageWindow:SetParentMenu(Menu) -- required
if Menu() == "UIMenu" then
self.ParentMenu = Menu
else
return self.ParentMenu
end
end
function UIMenuHeritageWindow:Offset(X, Y) -- required
if tonumber(X) or tonumber(Y) then
if tonumber(X) then
self._Offset.X = tonumber(X)
end
if tonumber(Y) then
self._Offset.Y = tonumber(Y)
end
else
return self._Offset
end
end
function UIMenuHeritageWindow:Position(Y) -- required
if tonumber(Y) then
self.Background:Position(self._Offset.X, 144 + Y + self._Offset.Y)
self.MumSprite:Position(self._Offset.X + (self.ParentMenu.WidthOffset/2) + 25, 144 + Y + self._Offset.Y)
self.DadSprite:Position(self._Offset.X + (self.ParentMenu.WidthOffset/2) + 195, 144 + Y + self._Offset.Y)
end
end
function UIMenuHeritageWindow:Index(Mum, Dad)
if not tonumber(Mum) then Mum = self.Mum end
if not (Mum >= 0 and Mum <= 21) then Mum = self.Mum end
if not tonumber(Dad) then Dad = self.Dad end
if not (Dad >= 0 and Dad <= 23) then Dad = self.Dad end
self.Mum = Mum
self.Dad = Dad
self.MumSprite.TxtName = ((self.Mum < 21) and "female_"..self.Mum or "special_female_"..(tonumber(string.sub(Mum, 2, 2)) - 1))
self.DadSprite.TxtName = ((self.Dad < 21) and "male_"..self.Dad or "special_male_"..(tonumber(string.sub(Dad, 2, 2)) - 1))
end
function UIMenuHeritageWindow:Draw() -- required
self.Background:Size(431 + self.ParentMenu.WidthOffset, 228)
self.Background:Draw()
self.DadSprite:Draw()
self.MumSprite:Draw()
end