I welcome you CFX community!
Today I present to you the barber shop system! This system provides accessibility for frameworks (ESX, Standalone), huge editing capabilities using a configuration file, and a unique design. I’m sure you and your players will love it!
This system includes a nice user interface, a convenient configuration file, the ability to configure the entire resource and clear functionality.
Demonstration of the system:
Example of a configuration file:
Configuration files
--/*
-- ██████╗░██╗░░░██╗██████╗░███████╗██╗░░░██╗███████╗░██████╗████████╗███╗░░██╗██╗██╗░░██╗
-- ██╔══██╗██║░░░██║██╔══██╗██╔════╝██║░░░██║██╔════╝██╔════╝╚══██╔══╝████╗░██║██║██║░██╔╝
-- ██████╦╝██║░░░██║██████╔╝█████╗░░╚██╗░██╔╝█████╗░░╚█████╗░░░░██║░░░██╔██╗██║██║█████═╝░
-- ██╔══██╗██║░░░██║██╔══██╗██╔══╝░░░╚████╔╝░██╔══╝░░░╚═══██╗░░░██║░░░██║╚████║██║██╔═██╗░
-- ██████╦╝╚██████╔╝██║░░██║███████╗░░╚██╔╝░░███████╗██████╔╝░░░██║░░░██║░╚███║██║██║░╚██╗
-- ╚═════╝░░╚═════╝░╚═╝░░╚═╝╚══════╝░░░╚═╝░░░╚══════╝╚═════╝░░░░╚═╝░░░╚═╝░░╚══╝╚═╝╚═╝░░╚═╝*/
Config = {}
--If ESX = false, then Standalone will turn on
--Are you using ESX?
Config.UseESX = true
--Enable this if ESX throws an error: Used the getSharedObject Event, this event no longer exists!
Config.UseESX_lib = true
--Are you using Standalone?
Config.UseStandalone = false
--Debug mode
Config.debug = false
Config.useCommandNameOpenMenu = false
Config.commandNameOpenMenu = 'barber'
--The ability to embed your own exports to hide the hud
Config.useHudOffOnEvents = true
function hudOnEvent()
DisplayRadar(true)
--exports.Burevestnik_hud:Burevestnik_hud_on() -- Uncomment if you use Burevestnik_HUD system (https://burevestnik.tebex.io/package/5371893)
end
function hudOffEvent()
DisplayRadar(false)
--exports.Burevestnik_hud:Burevestnik_hud_off() -- Uncomment if you use Burevestnik_HUD system (https://burevestnik.tebex.io/package/5371893)
end
--Interaction Button
Config.BarbershopOpenButton = 38
-- If true, the custom interaction menus are activated. Pay attention to the customInteractionButtonOpen and customInteractionButtonClose functions.
Config.UseCustomInteractionButton = false
Config.BurevestnikInteractionButton = "E"
Config.BurevestnikInteractionButtonText = "Press to interact"
-- The function of opening a custom interaction menu.
function customInteractionButtonOpen()
--exports.Burevestnik_interaction_button:bur_nui_InteractionButton_open(Config.BurevestnikInteractionButton, Config.BurevestnikInteractionButtonText) -- Uncomment if you use Burevestnik Interaction Button (https://forum.cfx.re/t/free-standalone-interaction-button/4860169)
end
-- The function of closing the custom interaction menu.
function customInteractionButtonClose()
--exports.Burevestnik_interaction_button:bur_nui_InteractionButton_close() -- Uncomment if you use Burevestnik Interaction Button (https://forum.cfx.re/t/free-standalone-interaction-button/4860169)
end
function notification(source, text)
local _source = source
TriggerClientEvent('esx:showNotification', _source, text)
end
function notificationInteraction(str)
SetTextComponentFormat("STRING")
AddTextComponentString(str)
DisplayHelpTextFromStringLabel(0, 0, false, -1)
end
--The fov value for the camera
Config.cameraFov = 25.0
--The price for changing barbers
Config.price = 100
--Opening the menu with animation of sitting on a chair.
--If true, it will check if the chair is occupied by another player and if it is occupied, you will have to wait until it becomes free.
--If false, the menu will open immediately without animations and checking for occupied chairs.
Config.chairsOpenEvent = true
--Insert your own events getting and saving a character
function gettingAndSavingCharacter(playerAppearance, playerBarbers)
if Config.UseESX then
for featureName, featureValue in pairs(playerBarbers) do
TriggerEvent('skinchanger:change', featureName, featureValue)
end
TriggerEvent('skinchanger:getSkin', function(skin)
TriggerServerEvent('esx_skin:save', skin)
end)
end
end
--Skin reset function
function resetCharacter()
if Config.UseESX then
ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin)
TriggerEvent('skinchanger:loadSkin', skin)
end)
end
end
Config.Barbershop = {
{
interactionDistance = 2.0, --Distance for interaction with the store
useBlip = true, --The ability to use blip on the map for this ped.
blipID = 71, --Blip ID.
blipScale = 0.7, --Blip scale.
blipColor = 17, --Blip color.
blipText = "Barber shop", --Blip text.
UseMarkers = false, --Do you want to use a marker ?
MarkerType = 1, --Marker type
MarkerSizeX = 0.5, --Marker size X
MarkerSizeY = 0.5, --Marker size Y
MarkerSizeZ = 0.5, --Marker size Z
MarkerColourR = 122, --Marker colour R
MarkerColourG = 195, --Marker colour G
MarkerColourB = 254, --Marker colour B
MarkerColourA = 20, --Marker colour A
locations = { --Barbershop locations
vector3(136.8, -1708.4, 28.3),
vector3(-1282.6, -1116.8, 6.0),
vector3(1931.5, 3729.7, 31.8),
vector3(1212.8, -472.9, 65.2),
vector3(-32.9, -152.3, 56.1),
vector3(-278.1, 6228.5, 30.7),
vector3(-821.1483, -185.8494, 37.5689),
},
},
}
Config.BarbershopChairPositionList = {
--Davis
{pos = vector4(137.77, -1710.67, 28.51, 229.93), status = false, walkTime = 4000},
{pos = vector4(138.72, -1709.58, 28.54, 232.26), status = false, walkTime = 4000},
{pos = vector4(139.66, -1708.47, 28.54, 222.14 ), status = false, walkTime = 4000},
--Vespucci
{pos = vector4(-1284.29, -1119.58, 6.32, 189.06), status = false, walkTime = 4000},
{pos = vector4(-1282.83, -1119.58, 6.3, 182.93), status = false, walkTime = 4000},
{pos = vector4(-1281.32, -1119.56, 6.34, 180.99), status = false, walkTime = 4000},
--Sandy
{pos = vector4(1934.5, 3730.15, 32.17, 300.59), status = false, walkTime = 4000},
{pos = vector4(1933.72, 3731.43, 32.21, 302.9), status = false, walkTime = 4000},
{pos = vector4(1933.02, 3732.7, 32.17, 295.57), status = false, walkTime = 4000},
--Mirror
{pos = vector4(1210.33, -474.67, 65.53, 163.11), status = false, walkTime = 4000},
{pos = vector4(1211.72, -475.02, 65.55, 166.5), status = false, walkTime = 4000},
{pos = vector4(1213.18, -475.36, 65.63, 160.01), status = false, walkTime = 4000},
--Havick
{pos = vector4(-34.67, -150.17, 56.44, 70.0), status = false, walkTime = 4000},
{pos = vector4(-35.18, -151.61, 56.43, 80.81), status = false, walkTime = 4000},
{pos = vector4(-35.7, -152.98, 56.42, 77.67), status = false, walkTime = 4000},
--Paleto
{pos = vector4(-280.99, 6227.58, 31.02, 133.88), status = false, walkTime = 4000},
{pos = vector4(-279.91, 6226.51, 31.01, 137.31), status = false, walkTime = 4000},
{pos = vector4(-278.88, 6225.48, 31.01, 131.52), status = false, walkTime = 4000},
--Rockford
{pos = vector4(-818.21, -183.57, 36.8, 27.48), status = false, walkTime = 6000},
{pos = vector4(-816.46, -182.55, 36.8, 27.48), status = false, walkTime = 6000},
{pos = vector4(-814.69, -181.53, 36.8, 33.27), status = false, walkTime = 6000},
{pos = vector4(-812.97, -180.6, 36.85, 33.07), status = false, walkTime = 6000}
}
Config.maxMinValue = {
--Hairstyle
['barberElementMaxMinValue1'] = 0,
['barberElementMaxMinValue2'] = 78,
--HairstyleColor
['barberElementMaxMinValue3'] = 0,
['barberElementMaxMinValue4'] = 45,
--Beard
['barberElementMaxMinValue5'] = -1,
['barberElementMaxMinValue6'] = 47,
--BeardColor
['barberElementMaxMinValue7'] = 0,
['barberElementMaxMinValue8'] = 45,
--Eyebrows
['barberElementMaxMinValue9'] = 0,
['barberElementMaxMinValue10'] = 33,
--EyebrowsColor
['barberElementMaxMinValue11'] = 0,
['barberElementMaxMinValue12'] = 45,
--Makeup
['barberElementMaxMinValue13'] = 0,
['barberElementMaxMinValue14'] = 94,
--MakeupColor
['barberElementMaxMinValue15'] = 0,
['barberElementMaxMinValue16'] = 64,
--Blush
['barberElementMaxMinValue17'] = 0,
['barberElementMaxMinValue18'] = 32,
--BlushColor
['barberElementMaxMinValue19'] = 0,
['barberElementMaxMinValue20'] = 64,
--Lipstick
['barberElementMaxMinValue21'] = -1,
['barberElementMaxMinValue22'] = 9,
--LipstickColor
['barberElementMaxMinValue23'] = 0,
['barberElementMaxMinValue24'] = 64,
--HairstyleColor2
['barberElementMaxMinValue25'] = 0,
['barberElementMaxMinValue26'] = 5,
}
--Translation config
Config.Translation = {
['menu'] = 'Press ~INPUT_CONTEXT~ to ~g~interact',
['nomoney'] = '~r~You do not have enough Money!',
['noseats'] = '~y~All barbers are busy now. Please wait!',
['debugText1'] = 'The chair is free:',
['debugText2'] = 'The chair is taken:',
['debugText3'] = 'Chair #',
['debugText4'] = '~r~Taken',
['debugText5'] = '~g~Free',
['translationText1'] = 'Barber shop ㅤ burevestnik.tebex.io',
['translationText2'] = 'Hairstyle #',
['translationText3'] = 'Hairstyle color #',
['translationText4'] = 'Beard #',
['translationText5'] = 'Beard color #',
['translationText6'] = 'Eyebrows #',
['translationText7'] = 'Less',
['translationText8'] = 'Greater',
['translationText9'] = 'Eyebrows color #',
['translationText10'] = 'Makeup #',
['translationText11'] = 'Makeup color #',
['translationText12'] = 'Blush #',
['translationText13'] = 'Blush color #',
['translationText14'] = 'Lipstick #',
['translationText15'] = 'Lipstick color #',
['translationText16'] = 'Hairstyle color shade #',
['translationText17'] = 'Purchase | Price: $'..Config.price,
['translationText18'] = 'RMB',
['translationText19'] = 'Hold key to look around',
['translationText20'] = 'ESC',
['translationText21'] = 'Exit barber shop',
}
--Exports
--exports.Burevestnik_barbershop:bur_open_barbershop() --Exporting the opening of a barbershop (Client)
Optimization (The script consumes):
0.01 ms in a quiet state.
0.02 ms in an active state.
What does this system include:
- This system works on all versions of ESX, as well as STANDALONE!
- Beautiful user interface!
- Support for our free Interaction Button resource!
- The ability to enable blips on the map!
- The ability to enable markers!
- The ability to sit on chairs!
- Synchronization between players!
- The ability to install new places of interaction!
- Incredibly customizable configuration file!
- More than 7 prepared places for interaction and 22 chairs!
- You can completely change the user interface at will!
- Exports are available!
- Of course support, I’m ready to help you!
TOP SALES
You may also be interested in my other resources:
Code accessible | Open source: Yes \ Escrow: No - Available only: config, ui |
Subscription based | No |
Lines (approximately) | ~1500 |
Requirements | Standalone: No \ ESX: skinchanger |
Support | Yes |