ESX.Modules['skin'] = {} local self = ESX.Modules['skin'] self.lastSkin = nil self.playerLoaded = false self.cam = nil self.isCameraActive = false self.firstSpawn = true self.zoomOffset = 0.0 self.camOffset = 0.0 self.heading = 90.0 self.OpenMenu = function(submitCb, cancelCb, restrict) local playerPed = PlayerPedId() TriggerEvent('skinchanger:getSkin', function(skin) self.lastSkin = skin end) TriggerEvent('skinchanger:getData', function(components, maxVals) local elements = {} local _components = {} -- Restrict menu if restrict == nil then for i=1, #components, 1 do _components[i] = components[i] end else for i=1, #components, 1 do local found = false for j=1, #restrict, 1 do if components[i].name == restrict[j] then found = true end end if found then table.insert(_components, components[i]) end end end -- Insert elements for i=1, #_components, 1 do local value = _components[i].value local componentId = _components[i].componentId if componentId == 0 then value = GetPedPropIndex(playerPed, _components[i].componentId) end local data = { label = _components[i].label, name = _components[i].name, value = value, min = _components[i].min, textureof = _components[i].textureof, zoomOffset= _components[i].zoomOffset, camOffset = _components[i].camOffset, type = 'slider' } for k,v in pairs(maxVals) do if k == _components[i].name then data.max = v break end end table.insert(elements, data) end self.CreateSkinCam() self.zoomOffset = _components[1].zoomOffset self.camOffset = _components[1].camOffset ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'skin', { title = _U('skin_menu'), align = 'top-left', elements = elements }, function(data, menu) TriggerEvent('skinchanger:getSkin', function(skin) self.lastSkin = skin end) submitCb(data, menu) DeleteSkinCam() end, function(data, menu) menu.close() self.DeleteSkinCam() TriggerEvent('skinchanger:loadSkin', lastSkin) if cancelCb ~= nil then cancelCb(data, menu) end end, function(data, menu) local skin, components, maxVals TriggerEvent('skinchanger:getSkin', function(getSkin) skin = getSkin end) zoomOffset = data.current.zoomOffset camOffset = data.current.camOffset if skin[data.current.name] ~= data.current.value then -- Change skin element TriggerEvent('skinchanger:change', data.current.name, data.current.value) -- Update max values TriggerEvent('skinchanger:getData', function(comp, max) components, maxVals = comp, max end) local newData = {} for i=1, #elements, 1 do newData = {} newData.max = maxVals[elements[i].name] if elements[i].textureof ~= nil and data.current.name == elements[i].textureof then newData.value = 0 end menu.update({name = elements[i].name}, newData) end menu.refresh() end end, function(data, menu) DeleteSkinCam() end) end) end self.CreateSkinCam = function() if not DoesCamExist(cam) then self.cam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true) end SetCamActive(cam, true) RenderScriptCams(true, true, 500, true, true) self.isCameraActive = true SetCamRot(cam, 0.0, 0.0, 270.0, true) SetEntityHeading(playerPed, 90.0) end self.DeleteSkinCam = function() self.isCameraActive = false SetCamActive(cam, false) RenderScriptCams(false, true, 500, true, true) cam = nil end self.OpenSaveableMenu = function(submitCb, cancelCb, restrict) TriggerEvent('skinchanger:getSkin', function(skin) lastSkin = skin end) self.OpenMenu(function(data, menu) menu.close() DeleteSkinCam() TriggerEvent('skinchanger:getSkin', function(skin) TriggerServerEvent('esx_skin:save', skin) if submitCb ~= nil then submitCb(data, menu) end end) end, cancelCb, restrict) end